private bool KeepBattleGoingWhileBothPlayersHavePokemonLeft() { bool playerWon = false, keepBattleGoing, isChangingToNextAvailablePokemon; while (Player.HasAvailablePokemon() && EnemyTrainer.HasAvailablePokemon()) { keepBattleGoing = false; isChangingToNextAvailablePokemon = false; if (Player.GetCurrentPokemon().HasFainted() && EnemyTrainer.HasAvailablePokemon()) { PromptPlayerToSelectPokemonAfterOwnPokemonFainted(); PlayerAction.PlayerSendsPokemon(Player.GetCurrentPokemon()); isChangingToNextAvailablePokemon = true; } else { ConsoleBattleInfoPokemon.ShowBothPokemonStats(Player.GetCurrentPokemon(), EnemyTrainer.GetCurrentPokemon()); keepBattleGoing = PlayerMove(); } if (keepBattleGoing && !isChangingToNextAvailablePokemon) { if (EnemyTrainer.GetCurrentPokemon().HasFainted() && Player.HasAvailablePokemon()) { if (BattleAux.CannotSendNextAvailablePokemon(isEnemyTrainer: true)) { break; } else { PromptPlayerToSelectPokemonAfterEnemyPokemonFainted(); BattleAux.ShowTrainerSentPokemonMessage(isEnemyTrainer: true); PlayerAction.PlayerSendsPokemon(Player.GetCurrentPokemon()); } } else { EnemyMove(); } } } if (Player.HasAvailablePokemon()) { playerWon = true; } return(playerWon); }
private static void ProcessAttack(IPokemon attackingPokemon, IPokemon targetPokemon, IMove move) { TypeEffect moveEffectOnPokemon = TypeComparer.GetMoveEffectivenessBasedOnPokemonType(move.Type, targetPokemon.Types.FirstOrDefault()); int calculatedDamage = TypeDamageCalculator.CalculateDamage(attackingPokemon, targetPokemon, move, moveEffectOnPokemon); attackingPokemon.UseMove(move); if (move.StatusMoves != null) { BattleAux.ProcessStatusAttack(attackingPokemon, targetPokemon, move); } else { targetPokemon.ReceiveDamage(calculatedDamage); ConsoleBattleInfoPokemon.ShowPokemonReceivedDamage(targetPokemon, calculatedDamage); ConsoleBattleInfoTypes.ShowHowEffectiveTheMoveWas(moveEffectOnPokemon); } }
private void PokemonAttack(IPokemon attackingPokemon, IPokemon targetPokemon, int chosenMove) { IMove move = attackingPokemon.Moves[chosenMove]; if (ConsoleBattleInfoMove.MoveDoesNotHavePowerPointsLeft(move)) { PromptTrainerForPokemonMove(); return; } ConsoleBattleInfoPokemon.ShowPokemonUsedMove(attackingPokemon, move.GetType().Name); if (TypeComparer.PokemonTypeDoesNotMakeContactWithMove(targetPokemon.Types, move)) { ConsoleUtils.ShowMessageAndWaitOneSecond($"It didn't affect {targetPokemon.GetType().Name}!"); } else { ProcessAttack(attackingPokemon, targetPokemon, move); } ConsoleUtils.ClearScreen(); }
private void SwitchCurrentPokemon(int chosenPokemon, bool isChangingAfterOwnPokemonFainted = false) { TrainerPokemon pokemon = Player.PokemonTeam[chosenPokemon]; if (pokemon is null || (pokemon.Current && isChangingAfterOwnPokemonFainted)) { return; } if (pokemon.Fainted) { ConsoleBattleInfoPokemon.ShowChosenPokemonIsNotAvailable(); PlayerMove(); return; } else if (pokemon.Current) { ConsoleBattleInfoPokemon.ShowChosenPokemonIsAlreadyInBattle(); PlayerMove(); return; } BattleAux.ShowDrawbackMessageAndSetChosenPokemonIndexAsCurrent(chosenPokemon); }