public static void LossPenalty(GameProgress save) { //remove money save.ActiveTeam.Money = save.ActiveTeam.Money / 2; //remove bag items for (int ii = save.ActiveTeam.GetInvCount() - 1; ii >= 0; ii--) { ItemData entry = DataManager.Instance.GetItem(save.ActiveTeam.GetInv(ii).ID); if (!entry.CannotDrop) { save.ActiveTeam.RemoveFromInv(ii); } } //remove equips foreach (Character player in save.ActiveTeam.Players) { if (player.EquippedItem.ID > -1) { ItemData entry = DataManager.Instance.GetItem(player.EquippedItem.ID); if (!entry.CannotDrop) { player.DequipItem(); } } } }
public List <int> MergeDexTo(GameProgress destProgress) { //monster encounters List <int> newRecruits = new List <int>(); for (int ii = 0; ii < DataManager.Instance.DataIndices[DataManager.DataType.Monster].Count; ii++) { if (Dex[ii] == UnlockState.Completed && destProgress.Dex[ii] != UnlockState.Completed) { MonsterData entry = DataManager.Instance.GetMonster(ii); if (entry.PromoteFrom == -1) { bool isOriginal = false; for (int jj = 0; jj < DataManager.Instance.StartChars.Count; jj++) { if (ii == DataManager.Instance.StartChars[jj]) { isOriginal = true; } } if (!isOriginal) { newRecruits.Add(ii); } } destProgress.Dex[ii] = UnlockState.Completed; } if (Dex[ii] == UnlockState.Discovered && destProgress.Dex[ii] == UnlockState.None) { destProgress.Dex[ii] = UnlockState.Discovered; } } return(newRecruits); }
public AOKMail(SOSMail sos, GameProgress progress, string dateTime, ReplayData replay) { TeamName = sos.TeamName; TeamID = sos.TeamID; Seed = sos.Seed; TurnsTaken = sos.TurnsTaken; RescueSeed = sos.RescueSeed; DateDefeated = sos.DateDefeated; Goal = sos.Goal; DefeatedVersion = sos.DefeatedVersion; OfferedItem = sos.OfferedItem; GoalText = sos.GoalText; TeamProfile = sos.TeamProfile; RescuingTeam = progress.ActiveTeam.Name; RescuingID = progress.UUID; DateRescued = dateTime; List <string> teamNames = new List <string>(); List <MonsterID> teamProfile = new List <MonsterID>(); List <int> teamPersonalities = new List <int>(); foreach (Character chara in progress.ActiveTeam.Players) { teamNames.Add(chara.BaseName); teamProfile.Add(chara.BaseForm); teamPersonalities.Add(chara.Discriminator); } RescuingNames = teamNames.ToArray(); RescuingProfile = teamProfile.ToArray(); RescuingPersonalities = teamPersonalities.ToArray(); RescueReplay = replay; }
public static void SaveMainData(BinaryWriter writer, GameProgress save) { using (MemoryStream classStream = new MemoryStream()) { IFormatter formatter = new BinaryFormatter(); formatter.Serialize(classStream, save); writer.Write(classStream.Position); classStream.WriteTo(writer.BaseStream); } }
public static GameProgress LoadMainData(BinaryReader reader) { long length = reader.ReadInt64(); using (MemoryStream classStream = new MemoryStream(reader.ReadBytes((int)length))) { IFormatter formatter = new BinaryFormatter(); GameProgress outsave = (GameProgress)formatter.Deserialize(classStream); //Had to tweak this around a bit, so I could notify the script engine to load the script save data return(outsave); } }
public SOSMail(GameProgress progress, ZoneLoc goal, LocalText goalText, string dateTime, Version version) { TeamName = progress.ActiveTeam.Name; TeamID = progress.UUID; DateDefeated = dateTime; DefeatedVersion = version; List <MonsterID> teamProfile = new List <MonsterID>(); foreach (Character chara in progress.ActiveTeam.Players) { teamProfile.Add(chara.BaseForm); } TeamProfile = teamProfile.ToArray(); Seed = progress.Rand.FirstSeed; TurnsTaken = progress.TotalTurns; Goal = goal; GoalText = goalText; OfferedItem = new MapItem(); }
public override IEnumerator <YieldInstruction> EndGame(ResultType result, ZoneLoc nextArea, bool display, bool fanfare) { bool recorded = DataManager.Instance.RecordingReplay; //if lose, end the play, display plaque, and go to title if (result != ResultType.Cleared) { if (GameManager.Instance.CurrentScene == GroundScene.Instance) { Location = ZoneManager.Instance.CurrentGround.GetSingleLineName(); } else if (GameManager.Instance.CurrentScene == DungeonScene.Instance) { Location = ZoneManager.Instance.CurrentMap.GetSingleLineName(); } Outcome = result; DataManager.Instance.MsgLog.Clear(); //end the game with a recorded ending string recordFile = DataManager.Instance.EndPlay(this, null); MenuBase.Transparent = false; //save to the main file GameState state = DataManager.Instance.LoadMainGameState(); List <int> newRecruits = new List <int>(); if (state != null) { newRecruits = MergeDexTo(state.Save); DataManager.Instance.SaveGameState(state); } if (recorded && display) { GameProgress ending = DataManager.Instance.GetRecord(Data.DataManager.REPLAY_PATH + recordFile); if (fanfare) { if (result != ResultType.Cleared) { GameManager.Instance.Fanfare("Fanfare/MissionFail"); } else { GameManager.Instance.Fanfare("Fanfare/MissionClear"); } } else { GameManager.Instance.SE("Menu/Skip"); } FinalResultsMenu menu = new FinalResultsMenu(ending); yield return(CoroutineManager.Instance.StartCoroutine(MenuManager.Instance.ProcessMenuCoroutine(menu))); Dictionary <int, List <RecordHeaderData> > scores = RecordHeaderData.LoadHighScores(); yield return(CoroutineManager.Instance.StartCoroutine(MenuManager.Instance.ProcessMenuCoroutine(new ScoreMenu(scores, ZoneManager.Instance.CurrentZoneID, DataManager.REPLAY_PATH + recordFile)))); } if (newRecruits.Count > 0) { yield return(new WaitForFrames(10)); GameManager.Instance.Fanfare("Fanfare/NewArea"); yield return(CoroutineManager.Instance.StartCoroutine(MenuManager.Instance.SetDialogue(Text.FormatKey("DLG_NEW_CHARS")))); } yield return(new WaitForFrames(20)); GameManager.Instance.SceneOutcome = GameManager.Instance.RestartToTitle(); } else { int completedZone = ZoneManager.Instance.CurrentZoneID; MidAdventure = true; ClearDungeonItems(); // if there isn't a next area, end the play, display the plaque, return to title screen //GameManager.Instance.Fanfare("Fanfare/MissionClear"); Location = ZoneManager.Instance.CurrentZone.Name.ToLocal(); Outcome = result; DataManager.Instance.MsgLog.Clear(); //end the game with a recorded ending string recordFile = DataManager.Instance.EndPlay(this, null); MenuBase.Transparent = false; //save to the main file GameState state = DataManager.Instance.LoadMainGameState(); if (state != null) { MergeDexTo(state.Save); state.Save.DungeonUnlocks[completedZone] = UnlockState.Completed; DataManager.Instance.SaveGameState(state); } if (recorded) { GameProgress ending = DataManager.Instance.GetRecord(DataManager.REPLAY_PATH + recordFile); if (fanfare) { if (result != ResultType.Cleared) { GameManager.Instance.Fanfare("Fanfare/MissionFail"); } else { GameManager.Instance.Fanfare("Fanfare/MissionClear"); } } else { GameManager.Instance.SE("Menu/Skip"); } FinalResultsMenu menu = new FinalResultsMenu(ending); yield return(CoroutineManager.Instance.StartCoroutine(MenuManager.Instance.ProcessMenuCoroutine(menu))); Dictionary <int, List <RecordHeaderData> > scores = RecordHeaderData.LoadHighScores(); yield return(CoroutineManager.Instance.StartCoroutine(MenuManager.Instance.ProcessMenuCoroutine(new ScoreMenu(scores, ZoneManager.Instance.CurrentZoneID, DataManager.REPLAY_PATH + recordFile)))); } //ask to transfer if the dungeon records progress, and it is NOT a seeded run. if (state != null && Stakes != DungeonStakes.None && !Seeded) { bool allowTransfer = false; QuestionDialog question = MenuManager.Instance.CreateQuestion(Text.FormatKey("DLG_TRANSFER_ASK"), () => { allowTransfer = true; }, () => { }); yield return(CoroutineManager.Instance.StartCoroutine(MenuManager.Instance.ProcessMenuCoroutine(question))); if (allowTransfer) { MainProgress mainSave = state.Save as MainProgress; //put the new recruits into assembly foreach (Character character in ActiveTeam.Players) { if (!(character.Dead && DataManager.Instance.GetSkin(character.BaseForm.Skin).Challenge)) { mainSave.CharsToStore.Add(new CharData(character)); } } foreach (Character character in ActiveTeam.Assembly) { if (!(character.Dead && DataManager.Instance.GetSkin(character.BaseForm.Skin).Challenge)) { mainSave.CharsToStore.Add(new CharData(character)); } } //put the new items into the storage foreach (InvItem item in ActiveTeam.EnumerateInv()) { mainSave.ItemsToStore.Add(item); } foreach (InvItem item in ActiveTeam.BoxStorage) { mainSave.ItemsToStore.Add(item); } mainSave.StorageToStore = ActiveTeam.Storage; mainSave.MoneyToStore = state.Save.ActiveTeam.Money + state.Save.ActiveTeam.Bank; } DataManager.Instance.SaveGameState(state); if (allowTransfer) { yield return(CoroutineManager.Instance.StartCoroutine(MenuManager.Instance.SetDialogue(Text.FormatKey("DLG_TRANSFER_COMPLETE")))); } } yield return(new WaitForFrames(20)); } }
public override IEnumerator <YieldInstruction> EndGame(ResultType result, ZoneLoc nextArea, bool display, bool fanfare) { Outcome = result; bool recorded = DataManager.Instance.RecordingReplay; string recordFile = null; if (result == ResultType.Rescue) { Location = ZoneManager.Instance.CurrentZone.Name.ToLocal(); DataManager.Instance.MsgLog.Clear(); //end the game with a recorded ending recordFile = DataManager.Instance.EndPlay(this, StartDate); SOSMail sos = Rescue.SOS; string dateRescued = String.Format("{0:yyyy-MM-dd}", DateTime.Now); ReplayData replay = DataManager.Instance.LoadReplay(DataManager.REPLAY_PATH + recordFile, false); AOKMail aok = new AOKMail(sos, DataManager.Instance.Save, dateRescued, replay); GeneratedAOK = DataManager.SaveRescueMail(DataManager.RESCUE_OUT_PATH + DataManager.AOK_PATH, aok, false); string deletePath = DataManager.FindRescueMail(DataManager.RESCUE_IN_PATH + DataManager.SOS_PATH, sos, sos.Extension); if (deletePath != null) { File.Delete(deletePath); } if (nextArea.IsValid()) // if an exit is specified, go to the exit. { NextDest = nextArea; } else { NextDest = new ZoneLoc(1, new SegLoc(-1, 1)); } } else if (result != ResultType.Cleared) { if (GameManager.Instance.CurrentScene == GroundScene.Instance) { Location = ZoneManager.Instance.CurrentGround.GetSingleLineName(); } else if (GameManager.Instance.CurrentScene == DungeonScene.Instance) { Location = ZoneManager.Instance.CurrentMap.GetSingleLineName(); } DataManager.Instance.MsgLog.Clear(); //end the game with a recorded ending recordFile = DataManager.Instance.EndPlay(this, StartDate); if (Outcome != ResultType.Escaped && Stakes == DungeonStakes.Risk) //remove all items { LossPenalty(this); } if (nextArea.IsValid()) // if an exit is specified, go to the exit. { NextDest = nextArea; } else { NextDest = new ZoneLoc(1, new SegLoc(-1, 1)); } } else { int completedZone = ZoneManager.Instance.CurrentZoneID; DungeonUnlocks[completedZone] = UnlockState.Completed; Location = ZoneManager.Instance.CurrentZone.Name.ToLocal(); DataManager.Instance.MsgLog.Clear(); //end the game with a recorded ending recordFile = DataManager.Instance.EndPlay(this, StartDate); if (nextArea.IsValid()) // if an exit is specified, go to the exit. { NextDest = nextArea; } else { NextDest = new ZoneLoc(1, new SegLoc(-1, 1)); } } TotalAdventures++; foreach (Character character in ActiveTeam.Players) { character.Dead = false; character.FullRestore(); } foreach (Character character in ActiveTeam.Assembly) { character.Dead = false; character.FullRestore(); } MidAdventure = false; ClearDungeonItems(); //clear rescue status Rescue = null; //merge back the team if the dungeon was level-limited yield return(CoroutineManager.Instance.StartCoroutine(RestoreLevel())); //save the result to the main file if (Stakes != DungeonStakes.None) { GameState state = DataManager.Instance.LoadMainGameState(); MainProgress mainSave = state.Save as MainProgress; mainSave.MergeDataTo(this); DataManager.Instance.SaveMainGameState(); } else { GameState state = DataManager.Instance.LoadMainGameState(); MainProgress mainSave = state.Save as MainProgress; mainSave.MergeDataTo(mainSave); DataManager.Instance.SetProgress(state.Save); DataManager.Instance.Save.NextDest = NextDest; } MenuBase.Transparent = false; if (recorded && display) { GameProgress ending = DataManager.Instance.GetRecord(DataManager.REPLAY_PATH + recordFile); if (fanfare) { if (result != ResultType.Cleared && result != ResultType.Escaped && result != ResultType.Rescue) { GameManager.Instance.Fanfare("Fanfare/MissionFail"); } else { GameManager.Instance.Fanfare("Fanfare/MissionClear"); } } else { GameManager.Instance.SE("Menu/Skip"); } FinalResultsMenu menu = new FinalResultsMenu(ending); yield return(CoroutineManager.Instance.StartCoroutine(MenuManager.Instance.ProcessMenuCoroutine(menu))); } yield return(new WaitForFrames(20)); }