using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.Xna.Framework; using VBXSE; using System.IO; namespace SnakeRPG { public static partial class Main { enum TitleScreenMode { Selecting, NewGame, Continue } const float LOGO_OFFSET = 168; const int TITLE_OPTIONS_CENTER = 496; const int TITLE_OPTIONS_SPACING = 76; const float TITLE_READY = 3f; public static bool onTitleScreen = true; static float titleScreenTimer = 0f; static Sprite titleScreenSprite = null; static List titleScreenOptions = new List(); static Sprite titleScreenPointer = null; static int titleScreenFirstOptionY = 0; static int titleScreenCurrentChoice = 0; static TitleScreenMode titleScreenMode = TitleScreenMode.Selecting; static void TitleScreenInit() { titleScreenSprite = SpriteEngine.CreateMultiSprite(new string[] { "title0", "title1", "title2" }, 0, Convert.ToInt32(LOGO_OFFSET), 1f); titleScreenSprite.depth = -50000f; Audio.Start("startofalegend"); titleScreenPointer = SpriteEngine.CreateSprite("pointer"); titleScreenPointer.depth = -52000f; titleScreenPointer.enabled = false; titleScreenFirstOptionY = TITLE_OPTIONS_CENTER - TITLE_OPTIONS_SPACING / 2; for (int i = 0; i < 2; i++) { string text = "NEW GAME"; if (i == 1) text = "CONTINUE"; GText toAdd = SpriteEngine.CreateGText(text, 0, titleScreenFirstOptionY + TITLE_OPTIONS_SPACING * i); toAdd.scale = 2f; toAdd.depth = -51000f; toAdd.SetX(640 - (SpriteEngine.spriteFont.MeasureString(toAdd.text).X)); toAdd.enabled = false; titleScreenOptions.Add(toAdd); } if (File.Exists("save1.dat")) titleScreenCurrentChoice = 1; if (File.Exists("save2.dat")) titleScreenCurrentChoice = 1; if (File.Exists("save3.dat")) titleScreenCurrentChoice = 1; } static void TitleScreenUpdate(float milliseconds) { float seconds = milliseconds / 1000f; titleScreenTimer += seconds; if (titleScreenTimer > 0.75f) titleScreenSprite.currentImage = 1; if (titleScreenTimer > 1.0f) titleScreenSprite.currentImage = 2; //Between 1.5 and 2.5, it should rise slowly float diff = titleScreenTimer - 1.5f; if (diff < 0) diff = 0; if (diff > 1) diff = 1; titleScreenSprite.SetY(LOGO_OFFSET - diff * LOGO_OFFSET); if (titleScreenTimer > TITLE_READY) { for (int i = 0; i < titleScreenOptions.Count; i++) { titleScreenOptions[i].enabled = true; } titleScreenPointer.enabled = true; } int x = 392; if (titleScreenMode != TitleScreenMode.Selecting) x = 300; titleScreenPointer.SetPosition(x, titleScreenFirstOptionY + titleScreenCurrentChoice * TITLE_OPTIONS_SPACING); } static void TitleScreenDestroy() { for (int i = 0; i < titleScreenOptions.Count; i++) { SpriteEngine.EraseGObject(titleScreenOptions[i]); } titleScreenOptions.Clear(); SpriteEngine.EraseGObject(titleScreenSprite); SpriteEngine.EraseGObject(titleScreenPointer); titleScreenSprite = null; titleScreenPointer = null; onTitleScreen = false; } static void TitleScreenMoveSelect(int direction) { if (titleScreenTimer < TITLE_READY) return; if (titleScreenCurrentChoice + direction < titleScreenOptions.Count && titleScreenCurrentChoice + direction > -1) { titleScreenCurrentChoice += direction; Audio.Play("cursor"); } } static void TitleScreenConfirm() { if (titleScreenTimer < TITLE_READY) return; if (titleScreenMode == TitleScreenMode.Selecting) { if (titleScreenCurrentChoice == 0) titleScreenMode = TitleScreenMode.NewGame; else titleScreenMode = TitleScreenMode.Continue; Audio.Play("select"); //Erase new game/continue for (int i = 0; i < titleScreenOptions.Count; i++) { SpriteEngine.EraseGObject(titleScreenOptions[i]); } titleScreenOptions.Clear(); //Add file 1/file 2/file 3 titleScreenFirstOptionY = TITLE_OPTIONS_CENTER - TITLE_OPTIONS_SPACING; for (int i = 0; i < 3; i++) { string text = "FILE " + (i + 1) + ": "; string filename = "save" + (i + 1) + ".dat"; if (!File.Exists(filename)) text += "EMPTY"; else { try { FileStream fs = new FileStream(filename, FileMode.Open); BinaryReader br = new BinaryReader(fs); fs.Seek(0x09, SeekOrigin.Begin); int version = br.ReadInt32(); if (version > VERSION) text += ""; else { fs.Seek(0x0D, SeekOrigin.Begin); int level = br.ReadInt32(); text += "LEVEL " + level; } br.Close(); fs.Close(); } catch (Exception) { text += ""; } } GText toAdd = SpriteEngine.CreateGText(text, 0, titleScreenFirstOptionY + TITLE_OPTIONS_SPACING * i); toAdd.scale = 2f; toAdd.depth = -51000f; toAdd.SetX(640 - (SpriteEngine.spriteFont.MeasureString(toAdd.text).X)); toAdd.enabled = false; titleScreenOptions.Add(toAdd); } titleScreenCurrentChoice = 0; } else { Audio.Play("select"); saveFile = "save" + (titleScreenCurrentChoice + 1) + ".dat"; saveBackup = "save" + (titleScreenCurrentChoice + 1) + ".bak"; StartGame(); if (titleScreenMode == TitleScreenMode.Continue) Load(); TitleScreenDestroy(); } } } }