/// <summary> /// /// </summary> /// <param name="parameter">MapPokemonWrapper containing the Pokemon that we're trying to capture</param> /// <param name="mode"></param> /// <param name="suspensionState"></param> /// <returns></returns> public override async Task OnNavigatedToAsync(object parameter, NavigationMode mode, IDictionary <string, object> suspensionState) { if (suspensionState.Any()) { // Recovering the state CurrentPokemon = (MapPokemonWrapper)suspensionState[nameof(CurrentPokemon)]; CurrentEncounter = (EncounterResponse)suspensionState[nameof(CurrentEncounter)]; CurrentCaptureAward = (CaptureAward)suspensionState[nameof(CurrentCaptureAward)]; SelectedCaptureItem = (ItemData)suspensionState[nameof(SelectedCaptureItem)]; } else if (parameter is bool) { // Navigating from game page, so we need to actually load the encounter CurrentPokemon = (MapPokemonWrapper)NavigationHelper.NavigationState[nameof(CurrentPokemon)]; Busy.SetBusy(true, Utils.Resources.Translation.GetString("LoadingEncounter") + Utils.Resources.Pokemon.GetString(CurrentPokemon.PokemonId.ToString())); NavigationHelper.NavigationState.Remove(nameof(CurrentPokemon)); Logger.Write($"Catching {CurrentPokemon.PokemonId}"); CurrentEncounter = await GameClient.EncounterPokemon(CurrentPokemon.EncounterId, CurrentPokemon.SpawnpointId); SelectedCaptureItem = ItemsInventory.First(item => item.ItemId == ItemId.ItemPokeBall); Busy.SetBusy(false); if (CurrentEncounter.Status != EncounterResponse.Types.Status.EncounterSuccess) { // Encounter failed, probably the Pokemon ran away await new MessageDialog("Pokemon ran away, sorry :(").ShowAsyncQueue(); ReturnToGameScreen.Execute(); } } await Task.CompletedTask; }
/// <summary> /// </summary> /// <param name="parameter">MapPokemonWrapper containing the Pokemon that we're trying to capture</param> /// <param name="mode"></param> /// <param name="suspensionState"></param> /// <returns></returns> public override async Task OnNavigatedToAsync(object parameter, NavigationMode mode, IDictionary <string, object> suspensionState) { if (suspensionState.Any()) { // Recovering the state CurrentPokemon = (MapPokemonWrapper)suspensionState[nameof(CurrentPokemon)]; CurrentEncounter = (EncounterResponse)suspensionState[nameof(CurrentEncounter)]; CurrentCaptureAward = (CaptureAward)suspensionState[nameof(CurrentCaptureAward)]; SelectedCaptureItem = (ItemData)suspensionState[nameof(SelectedCaptureItem)]; } else { // Navigating from game page, so we need to actually load the encounter CurrentPokemon = (MapPokemonWrapper)NavigationHelper.NavigationState[nameof(CurrentPokemon)]; Busy.SetBusy(true, string.Format(Resources.CodeResources.GetString("LoadingEncounterText"), Resources.Pokemon.GetString(CurrentPokemon.PokemonId.ToString()))); NavigationHelper.NavigationState.Remove(nameof(CurrentPokemon)); Logger.Write($"Catching {CurrentPokemon.PokemonId}"); CurrentEncounter = await GameClient.EncounterPokemon(CurrentPokemon.EncounterId, CurrentPokemon.SpawnpointId); SelectStartingBall(); Busy.SetBusy(false); if (CurrentEncounter.Status != EncounterResponse.Types.Status.EncounterSuccess) { // Encounter failed, probably the Pokemon ran away await new MessageDialog(Resources.CodeResources.GetString("PokemonRanAwayText")).ShowAsyncQueue(); ReturnToGameScreen.Execute(); } } }
/// <summary> /// Launches the PokeBall for the current encounter, handling the different catch responses /// </summary> /// <returns></returns> private async Task ThrowPokeball(bool hitPokemon) { var caughtPokemonResponse = await GameClient.CatchPokemon(CurrentPokemon.EncounterId, CurrentPokemon.SpawnpointId, SelectedCaptureItem.ItemId, hitPokemon); switch (caughtPokemonResponse.Status) { case CatchPokemonResponse.Types.CatchStatus.CatchError: Logger.Write("CatchError!"); // TODO: what can we do? break; case CatchPokemonResponse.Types.CatchStatus.CatchSuccess: CurrentCaptureAward = caughtPokemonResponse.CaptureAward; Logger.Write($"We caught {CurrentPokemon.PokemonId}"); CatchSuccess?.Invoke(this, null); await GameClient.UpdateInventory(); break; case CatchPokemonResponse.Types.CatchStatus.CatchEscape: Logger.Write($"{CurrentPokemon.PokemonId} escaped"); CatchEscape?.Invoke(this, null); await GameClient.UpdateInventory(); break; case CatchPokemonResponse.Types.CatchStatus.CatchFlee: Logger.Write($"{CurrentPokemon.PokemonId} fleed"); CatchFlee?.Invoke(this, null); await new MessageDialog($"{CurrentPokemon.PokemonId} fleed").ShowAsyncQueue(); await GameClient.UpdateInventory(); ReturnToGameScreen.Execute(); break; case CatchPokemonResponse.Types.CatchStatus.CatchMissed: Logger.Write($"We missed {CurrentPokemon.PokemonId}"); await GameClient.UpdateInventory(); CatchFlee?.Invoke(this, null); break; default: throw new ArgumentOutOfRangeException(); } }
private void AskAndUseLuckyEgg(ItemDataWrapper item) { if (!GameClient.IsXpBoostActive) { var dialog = new PoGoMessageDialog("", string.Format(Resources.CodeResources.GetString("ItemUseQuestionText"), Resources.Items.GetString(item.ItemId.ToString()))); dialog.AcceptText = Resources.CodeResources.GetString("YesText"); dialog.CancelText = Resources.CodeResources.GetString("CancelText"); dialog.CoverBackground = true; dialog.AnimationType = PoGoMessageDialogAnimation.Bottom; dialog.AcceptInvoked += async(sender, e) => { // Send use request var res = await GameClient.UseXpBoost(item.ItemId); switch (res.Result) { case UseItemXpBoostResponse.Types.Result.Success: AppliedItem appliedItem = res.AppliedItems.Item.FirstOrDefault <AppliedItem>(); GameClient.AppliedItems.Add(new AppliedItemWrapper(appliedItem)); ReturnToGameScreen.Execute(); break; case UseItemXpBoostResponse.Types.Result.ErrorXpBoostAlreadyActive: ReturnToGameScreen.Execute(); break; case UseItemXpBoostResponse.Types.Result.ErrorInvalidItemType: case UseItemXpBoostResponse.Types.Result.ErrorLocationUnset: case UseItemXpBoostResponse.Types.Result.ErrorNoItemsRemaining: case UseItemXpBoostResponse.Types.Result.Unset: break; default: throw new ArgumentOutOfRangeException(); } }; dialog.Show(); } }
private void AskAndUseIncense(ItemDataWrapper item) { if (!GameClient.IsIncenseActive) { var dialog = new PoGoMessageDialog("", string.Format(Resources.CodeResources.GetString("ItemUseQuestionText"), Resources.Items.GetString(item.ItemId.ToString()))); dialog.AcceptText = Resources.CodeResources.GetString("YesText"); dialog.CancelText = Resources.CodeResources.GetString("CancelText"); dialog.CoverBackground = true; dialog.AnimationType = PoGoMessageDialogAnimation.Bottom; dialog.AcceptInvoked += async(sender, e) => { //// Send use request var res = await GameClient.UseIncense(item.ItemId); switch (res.Result) { case UseIncenseResponse.Types.Result.Success: GameClient.AppliedItems.Add(new AppliedItemWrapper(res.AppliedIncense)); ReturnToGameScreen.Execute(); break; case UseIncenseResponse.Types.Result.IncenseAlreadyActive: ReturnToGameScreen.Execute(); break; case UseIncenseResponse.Types.Result.LocationUnset: case UseIncenseResponse.Types.Result.NoneInInventory: case UseIncenseResponse.Types.Result.Unknown: break; default: throw new ArgumentOutOfRangeException(); } }; dialog.Show(); } }
/// <summary> /// Encounter logic /// </summary> /// <returns></returns> private async Task HandleEncounter() { if (CurrentPokemon is MapPokemonWrapper) { CurrentEncounter = await GameClient.EncounterPokemon(CurrentPokemon.EncounterId, CurrentPokemon.SpawnpointId); switch (CurrentEncounter.Status) { case EncounterResponse.Types.Status.PokemonInventoryFull: await new MessageDialog(string.Format(Resources.CodeResources.GetString("PokemonInventoryFullText"), Resources.Pokemon.GetString($"{CurrentPokemon.PokemonId}"))).ShowAsyncQueue(); ReturnToGameScreen.Execute(); break; case EncounterResponse.Types.Status.EncounterSuccess: break; case EncounterResponse.Types.Status.EncounterError: case EncounterResponse.Types.Status.EncounterNotFound: case EncounterResponse.Types.Status.EncounterClosed: await new MessageDialog(string.Format(Resources.CodeResources.GetString("PokemonEncounterErrorText"), Resources.Pokemon.GetString($"{CurrentPokemon.PokemonId}"))).ShowAsyncQueue(); ReturnToGameScreen.Execute(); break; case EncounterResponse.Types.Status.EncounterNotInRange: await new MessageDialog(string.Format(Resources.CodeResources.GetString("PokemonEncounterNotInRangeText"), Resources.Pokemon.GetString($"{CurrentPokemon.PokemonId}"))).ShowAsyncQueue(); ReturnToGameScreen.Execute(); break; case EncounterResponse.Types.Status.EncounterPokemonFled: case EncounterResponse.Types.Status.EncounterAlreadyHappened: await new MessageDialog(Resources.CodeResources.GetString("PokemonRanAwayText")).ShowAsyncQueue(); ReturnToGameScreen.Execute(); GameClient.CatchablePokemons.Remove((MapPokemonWrapper)CurrentPokemon); break; default: throw new ArgumentOutOfRangeException(); } } else { CurrentLureEncounter = await GameClient.EncounterLurePokemon(CurrentPokemon.EncounterId, CurrentPokemon.SpawnpointId); CurrentEncounter = new EncounterResponse() { Background = EncounterResponse.Types.Background.Park, WildPokemon = new WildPokemon() { PokemonData = CurrentLureEncounter.PokemonData } }; switch (CurrentLureEncounter.Result) { case DiskEncounterResponse.Types.Result.PokemonInventoryFull: await new MessageDialog(string.Format(Resources.CodeResources.GetString("PokemonInventoryFullText"), Resources.Pokemon.GetString($"{CurrentPokemon.PokemonId}"))).ShowAsyncQueue(); ReturnToGameScreen.Execute(); break; case DiskEncounterResponse.Types.Result.Success: break; case DiskEncounterResponse.Types.Result.Unknown: case DiskEncounterResponse.Types.Result.NotAvailable: await new MessageDialog(string.Format(Resources.CodeResources.GetString("PokemonEncounterErrorText"), Resources.Pokemon.GetString($"{CurrentPokemon.PokemonId}"))).ShowAsyncQueue(); ReturnToGameScreen.Execute(); break; case DiskEncounterResponse.Types.Result.NotInRange: await new MessageDialog(string.Format(Resources.CodeResources.GetString("PokemonEncounterNotInRangeText"), Resources.Pokemon.GetString($"{CurrentPokemon.PokemonId}"))).ShowAsyncQueue(); ReturnToGameScreen.Execute(); break; case DiskEncounterResponse.Types.Result.EncounterAlreadyFinished: await new MessageDialog(Resources.CodeResources.GetString("PokemonRanAwayText")).ShowAsyncQueue(); ReturnToGameScreen.Execute(); break; default: throw new ArgumentOutOfRangeException(); } } PokemonExtraData = GameClient.GetExtraDataForPokemon(CurrentPokemon.PokemonId); SelectedCaptureItem = SelectAvailablePokeBall(); Busy.SetBusy(false); }