private void awaitRescue() { //check for an AOK file from file rescue string aokPath = DataManager.FindRescueMail(DataManager.RESCUE_IN_PATH + DataManager.AOK_PATH, DataManager.Instance.Save.Rescue.SOS, DataManager.AOK_EXTENSION); if (aokPath != null) { AOKMail aok = (AOKMail)DataManager.LoadRescueMail(aokPath); SetAOK(aok); //an AOK mail has been found! MenuManager.Instance.AddMenu(MenuManager.Instance.CreateDialogue(() => loadAOK(aokPath, aok), Text.FormatKey("DLG_AWAIT_RESCUE_AOK_FOUND")), true); } else { //if there's no AOK, generate the SOS mail from the save data if (!File.Exists(DataManager.RESCUE_OUT_PATH + DataManager.SOS_PATH + DataManager.Instance.Save.UUID + DataManager.SOS_EXTENSION)) { DataManager.SaveRescueMail(DataManager.RESCUE_OUT_PATH + DataManager.SOS_PATH, DataManager.Instance.Save.Rescue.SOS, true); } List <DialogueChoice> choices = new List <DialogueChoice>(); choices.Add(new DialogueChoice(Text.FormatKey("MENU_RESCUE_GET_HELP"), contactForHelp)); choices.Add(new DialogueChoice(Text.FormatKey("MENU_RESCUE_CONFIGURE_SERVER"), configureServer)); choices.Add(new DialogueChoice(Text.FormatKey("MENU_RESCUE_OFFER_REWARD"), offerReward)); choices.Add(new DialogueChoice(Text.FormatKey("MENU_REST_QUIT"), giveUp)); choices.Add(new DialogueChoice(Text.FormatKey("MENU_CANCEL"), () => { MenuManager.Instance.RemoveMenu(); })); MenuManager.Instance.AddMenu(MenuManager.Instance.CreateMultiQuestion(Text.FormatKey("DLG_AWAIT_RESCUE_ASK"), false, choices, 0, choices.Count - 1), true); } }
private void loadAOK(string aokPath, AOKMail aok) { //cut to black and verify the mail behind the scenes //If the replay succeeds, set the rescue state to true and take them back to the title. //check the AOK mail ReRandom rerand = new ReRandom(aok.Seed); for (int ii = 0; ii < aok.RescueSeed; ii++) { rerand.NextUInt64(); } ulong rolledSeed = rerand.NextUInt64(); if (aok.RescueReplay.States[0].Save.Rand.FirstSeed == rolledSeed) { //when starting, we must persist the AOK data so we know what data to put into the SOS //and the path so we know which path to delete if we fail to verify. //let's store it in this menu //when the replay ends, it will look for this menu and inject the result: pass, or fail testingPath = aokPath; testingMail = aok; TitleScene.TitleMenuSaveState = MenuManager.Instance.SaveMenuState(); MenuManager.Instance.ClearMenus(); GameManager.Instance.SceneOutcome = validateReplay(aok.RescueReplay); } else { File.Delete(aokPath); MenuManager.Instance.AddMenu(MenuManager.Instance.CreateDialogue(MenuManager.Instance.RemoveMenu, Text.FormatKey("DLG_AWAIT_RESCUE_AOK_FAIL")), true); } }
public void AddAOKRemark(int remarkIndex) { AOKMail aok = null; if (DataManager.Instance.Save.GeneratedAOK != null) { aok = DataManager.LoadRescueMail(DataManager.RESCUE_OUT_PATH + DataManager.AOK_PATH + DataManager.Instance.Save.GeneratedAOK) as AOKMail; } if (aok != null) { aok.FinalStatement = remarkIndex; DataManager.SaveRescueMail(DataManager.Instance.Save.GeneratedAOK, aok); } }
public void SetAOK(AOKMail aok) { Title.SetText(Text.FormatKey("MENU_AOK_TITLE")); Portraits = new SpeakerPortrait[aok.RescuingProfile.Length]; for (int ii = 0; ii < aok.RescuingProfile.Length; ii++) { Portraits[ii] = new SpeakerPortrait(aok.RescuingProfile[ii], new EmoteStyle(GraphicsManager.AOKEmotion, true), new Loc(Bounds.X + Bounds.Width / 2 - (GraphicsManager.PortraitSize * aok.RescuingProfile.Length + (aok.RescuingProfile.Length - 1) * 2) / 2 + ii * (GraphicsManager.PortraitSize + 2), Bounds.Y + GraphicsManager.MenuBG.TileHeight + TitledStripMenu.TITLE_OFFSET), false); } Name.SetText(Text.FormatKey("MENU_AOK_TEAM", aok.RescuingTeam)); LastSeen.SetText(Text.FormatKey("MENU_SOS_DATE", aok.DateRescued)); Goal.SetText(Text.FormatKey("MENU_SOS_GOAL", aok.GoalText.ToLocal().Replace('\n', ' '))); Reward.SetText(aok.OfferedItem.Value > 0 ? Text.FormatKey("MENU_SOS_REWARD", aok.OfferedItem.GetDungeonName()) : ""); }
public void SetAOK(AOKMail mail) { if (mail != null) { Name.Text = mail.TeamName; Reward.Text = Text.FormatKey("MENU_SOS_REWARD", mail.OfferedItem.Value > -1 ? mail.OfferedItem.GetDungeonName() : "---"); LastSeen.Text = Text.FormatKey("MENU_SOS_DATE", mail.DateDefeated); Goal.Text = Text.FormatKey("MENU_SOS_GOAL", mail.GoalText.ToLocal().Replace('\n', ' ')); Portraits = new SpeakerPortrait[mail.TeamProfile.Length]; for (int ii = 0; ii < mail.TeamProfile.Length; ii++) { Portraits[ii] = new SpeakerPortrait(mail.TeamProfile[ii], new EmoteStyle(0, true), new Loc(Bounds.End.X - GraphicsManager.MenuBG.TileWidth + (GraphicsManager.PortraitSize + 2) * (ii - mail.TeamProfile.Length), Bounds.Y + GraphicsManager.MenuBG.TileHeight), false); } } else { setError(); } }
public override void Update(InputManager input) { Visible = true; NetworkManager.Instance.Update(); if (NetworkManager.Instance.Status == OnlineStatus.Offline) { //give offline message in a dialogue MenuManager.Instance.RemoveMenu(); if (CurrentState != ExchangeRescueState.Completed) { MenuManager.Instance.AddMenu(MenuManager.Instance.CreateDialogue(NetworkManager.Instance.ExitMsg), false); } } else { if (CurrentState == ExchangeRescueState.Communicating) { //wait for an SOS ActivitySendHelp sendHelp = NetworkManager.Instance.Activity as ActivitySendHelp; if (sendHelp.CurrentState == ExchangeRescueState.SOSReady) { SOSMail sos = sendHelp.OfferedMail; aokPath = DataManager.FindRescueMail(DataManager.RESCUE_OUT_PATH + DataManager.AOK_PATH, sos, DataManager.AOK_EXTENSION); if (aokPath == null) { //no aok found; ask to receive SOS //TODO: check to see if SOS has already been sent //it needs to check if the reward is the same. SetSOS(sendHelp.OfferedMail); CurrentState = ExchangeRescueState.SOSReady; sendHelp.SetReady(CurrentState); QuestionDialog dialog = MenuManager.Instance.CreateQuestion(Text.FormatKey("DLG_RESCUE_RECEIVE_SOS_ASK", sendHelp.TargetInfo.Data.TeamName), () => { CurrentState = ExchangeRescueState.SOSTrading; sendHelp.SetReady(CurrentState); }, () => { //just disconnect MenuManager.Instance.RemoveMenu(); NetworkManager.Instance.Disconnect(); }); MenuManager.Instance.AddMenu(dialog, true); } else { //aok found; ask to send AOK aok = (AOKMail)DataManager.LoadRescueMail(aokPath); SetAOK(aok); CurrentState = ExchangeRescueState.AOKReady; sendHelp.OfferMail(aok); sendHelp.SetReady(CurrentState); } } } else if (CurrentState == ExchangeRescueState.SOSTrading) { //wait for the other party to also be SOSTrading or Completed ActivitySendHelp sendHelp = NetworkManager.Instance.Activity as ActivitySendHelp; if (sendHelp.CurrentState == ExchangeRescueState.SOSTrading || sendHelp.CurrentState == ExchangeRescueState.Completed) { //save the SOS mail DataManager.SaveRescueMail(DataManager.RESCUE_IN_PATH + DataManager.SOS_PATH, sendHelp.OfferedMail, false); MenuManager.Instance.AddMenu(MenuManager.Instance.CreateDialogue(Text.FormatKey("DLG_RESCUE_RECEIVE_SOS", sendHelp.TargetInfo.Data.TeamName)), false); CurrentState = ExchangeRescueState.Completed; sendHelp.SetReady(CurrentState); } //the other possible outcome is that they just disconnect } else if (CurrentState == ExchangeRescueState.AOKReady) { //wait for other party's ready to receive SOS or ready to send AOK ActivitySendHelp sendHelp = NetworkManager.Instance.Activity as ActivitySendHelp; if (sendHelp.CurrentState == ExchangeRescueState.AOKReady) { //ready to receive SOS string baseAskString = (aok.OfferedItem.Value > -1) ? "DLG_RESCUE_SEND_AOK_ASK_REWARD" : "DLG_RESCUE_SEND_AOK_ASK"; QuestionDialog dialog = MenuManager.Instance.CreateQuestion(Text.FormatKey(baseAskString, sendHelp.TargetInfo.Data.TeamName), () => { CurrentState = ExchangeRescueState.AOKTrading; sendHelp.SetReady(CurrentState); }, () => { //just disconnect MenuManager.Instance.RemoveMenu(); NetworkManager.Instance.Disconnect(); }); MenuManager.Instance.AddMenu(dialog, true); } //the other possible outcome is that they just disconnect } else if (CurrentState == ExchangeRescueState.AOKTrading) { //wait for the other party to also be AOKTrading or Completed ActivitySendHelp sendHelp = NetworkManager.Instance.Activity as ActivitySendHelp; if (sendHelp.CurrentState == ExchangeRescueState.AOKTrading || sendHelp.CurrentState == ExchangeRescueState.Completed) { //delete the AOK file File.Delete(aokPath); if (aok.OfferedItem.Value > -1) { if (aok.OfferedItem.IsMoney) { DataManager.Instance.Save.ActiveTeam.Bank += aok.OfferedItem.Value; } else { List <InvItem> itemsToStore = new List <InvItem>(); itemsToStore.Add(aok.OfferedItem.MakeInvItem()); DataManager.Instance.Save.ActiveTeam.StoreItems(itemsToStore); } DataManager.Instance.SaveMainGameState(); MenuManager.Instance.AddMenu(MenuManager.Instance.CreateDialogue(Text.FormatKey("DLG_RESCUE_SEND_AOK", sendHelp.TargetInfo.Data.TeamName), Text.FormatKey("DLG_RESCUE_SEND_AOK_REWARD")), false); } else { MenuManager.Instance.AddMenu(MenuManager.Instance.CreateDialogue(Text.FormatKey("DLG_RESCUE_SEND_AOK", sendHelp.TargetInfo.Data.TeamName)), false); } CurrentState = ExchangeRescueState.Completed; sendHelp.SetReady(CurrentState); } //the other possible outcome is that they just disconnect } else if (CurrentState == ExchangeRescueState.Completed) { ActivitySendHelp sendHelp = NetworkManager.Instance.Activity as ActivitySendHelp; //wait for the other party to also be Completed to leave the transaction if (sendHelp.CurrentState == ExchangeRescueState.Completed) { MenuManager.Instance.RemoveMenu(); NetworkManager.Instance.Disconnect(); } } UpdateStatus(); } }
public void OfferMail(AOKMail mail) { netPacketProcessor.SendNetSerializable(partner, new ExchangeAOKState { State = mail }, DeliveryMethod.ReliableOrdered); }