public ActivitySendHelp(ServerInfo server, ContactInfo selfInfo, ContactInfo targetInfo) : base(server, selfInfo, targetInfo) { netPacketProcessor.SubscribeNetSerializable <ExchangeSOSState>((state) => OfferedMail = state.State); netPacketProcessor.SubscribeNetSerializable <ExchangeRescueReadyState>((state) => CurrentState = state.State); CurrentState = ExchangeRescueState.Communicating; }
public SendHelpMenu() : base() { yourSummary = new SummaryMenu(Rect.FromPoints(new Loc(Bounds.Start.X, Bounds.End.Y), new Loc(Bounds.End.X, Bounds.End.Y + LINE_SPACE + GraphicsManager.MenuBG.TileHeight * 2))); yourStatus = new MenuText("", new Loc((yourSummary.Bounds.X + yourSummary.Bounds.End.X) / 2, yourSummary.Bounds.Y + GraphicsManager.MenuBG.TileHeight), DirH.None); yourStatus.Color = TextTan; yourSummary.Elements.Add(yourStatus); CurrentState = ExchangeRescueState.Communicating; }
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 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) { //first send the SOS SOSMail mail = DataManager.Instance.Save.Rescue.SOS; CurrentState = ExchangeRescueState.SOSReady; ActivityGetHelp getHelp = NetworkManager.Instance.Activity as ActivityGetHelp; getHelp.OfferMail(mail); getHelp.SetReady(CurrentState); } else if (CurrentState == ExchangeRescueState.SOSReady) { //wait for other party's ready to receive SOS or ready to send AOK ActivityGetHelp getHelp = NetworkManager.Instance.Activity as ActivityGetHelp; if (getHelp.CurrentState == ExchangeRescueState.SOSReady) { //ready to receive SOS DialogueBox dialog = MenuManager.Instance.CreateQuestion(Text.FormatKey("DLG_RESCUE_SEND_SOS_ASK", getHelp.TargetInfo.Data.TeamName), () => { CurrentState = ExchangeRescueState.SOSTrading; getHelp.SetReady(CurrentState); }, () => { //just disconnect MenuManager.Instance.RemoveMenu(); NetworkManager.Instance.Disconnect(); }); MenuManager.Instance.AddMenu(dialog, true); } else if (getHelp.CurrentState == ExchangeRescueState.AOKReady) { //ready to receive AOK SetAOK(getHelp.OfferedMail); CurrentState = ExchangeRescueState.AOKReady; getHelp.SetReady(CurrentState); string baseAskString = (getHelp.OfferedMail.OfferedItem.Value > -1) ? "DLG_RESCUE_GET_AOK_ASK_REWARD" : "DLG_RESCUE_GET_AOK_ASK"; DialogueBox dialog = MenuManager.Instance.CreateQuestion(Text.FormatKey(baseAskString, getHelp.TargetInfo.Data.TeamName), () => { CurrentState = ExchangeRescueState.AOKTrading; getHelp.SetReady(CurrentState); }, () => { //just disconnect MenuManager.Instance.RemoveMenu(); NetworkManager.Instance.Disconnect(); }); MenuManager.Instance.AddMenu(dialog, true); } else if (getHelp.CurrentState == ExchangeRescueState.Completed) { //TODO: signal that an SOS has already been sent //MenuManager.Instance.AddMenu(MenuManager.Instance.CreateDialogue(Text.FormatKey("DLG_RESCUE_SEND_SOS_ALREADY", getHelp.TargetInfo.Data.TeamName)), false); CurrentState = ExchangeRescueState.Completed; getHelp.SetReady(CurrentState); } } else if (CurrentState == ExchangeRescueState.SOSTrading) { //wait for the other party to also be SOSTrading or Completed ActivityGetHelp getHelp = NetworkManager.Instance.Activity as ActivityGetHelp; if (getHelp.CurrentState == ExchangeRescueState.SOSTrading || getHelp.CurrentState == ExchangeRescueState.Completed) { MenuManager.Instance.AddMenu(MenuManager.Instance.CreateDialogue(Text.FormatKey("DLG_RESCUE_SEND_SOS", getHelp.TargetInfo.Data.TeamName)), false); CurrentState = ExchangeRescueState.Completed; getHelp.SetReady(CurrentState); } //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 ActivityGetHelp getHelp = NetworkManager.Instance.Activity as ActivityGetHelp; if (getHelp.CurrentState == ExchangeRescueState.AOKTrading || getHelp.CurrentState == ExchangeRescueState.Completed) { //save the AOK file DataManager.SaveRescueMail(PathMod.NoMod(DataManager.RESCUE_IN_PATH + DataManager.AOK_FOLDER), getHelp.OfferedMail, false); if (getHelp.OfferedMail.OfferedItem.Value > -1) { //deduct your reward and save it to the base file GameState state = DataManager.Instance.LoadMainGameState(); state.Save.Rescue.SOS.OfferedItem = getHelp.OfferedMail.OfferedItem; DataManager.Instance.SaveGameState(state); MenuManager.Instance.AddMenu(MenuManager.Instance.CreateDialogue(Text.FormatKey("DLG_RESCUE_GOT_AOK", getHelp.TargetInfo.Data.TeamName), Text.FormatKey("DLG_RESCUE_GOT_AOK_REWARD")), false); } else { MenuManager.Instance.AddMenu(MenuManager.Instance.CreateDialogue(Text.FormatKey("DLG_RESCUE_GOT_AOK", getHelp.TargetInfo.Data.TeamName)), false); } CurrentState = ExchangeRescueState.Completed; getHelp.SetReady(CurrentState); } //the other possible outcome is that they just disconnect } else if (CurrentState == ExchangeRescueState.Completed) { ActivityGetHelp getHelp = NetworkManager.Instance.Activity as ActivityGetHelp; //wait for the other party to also be Completed to leave the transaction if (getHelp.CurrentState == ExchangeRescueState.Completed) { MenuManager.Instance.RemoveMenu(); NetworkManager.Instance.Disconnect(); } } UpdateStatus(); } }
public void SetReady(ExchangeRescueState state) { netPacketProcessor.SendNetSerializable(partner, new ExchangeRescueReadyState { State = state }, DeliveryMethod.ReliableOrdered); }