public void SelectEnemyMove() { List <MoveData> selectableMovesList = new List <MoveData>(); List <MoveData> strongMovesList = new List <MoveData>(); MoveData[] selectable; MoveData[] strong; foreach (MoveData move in enemyMon.learnedMoves) { if (move != null) { selectableMovesList.Add(move); } } foreach (MoveData move in selectableMovesList) { if (playerMon.GetEffectiveness(move.moveType) > 0) { strongMovesList.Add(move); } } selectable = selectableMovesList.ToArray(); strong = strongMovesList.ToArray(); if (strong.Length > 0) { enemyMon.selectedMove = strong[Random.Range(0, strong.Length)]; } else { enemyMon.selectedMove = selectable[Random.Range(0, selectable.Length)]; } }
void ResolveNonDamagingAttack(MoveData move, MonBattleData attacker, MonBattleData defender) { Effectiveness effectiveness; if (attacker == playerMon) { playerModel.GetComponent <Animator>().SetTrigger("Attack"); } else { enemyModel.GetComponent <Animator>().SetTrigger("Attack"); } effectiveness = defender.GetEffectiveness(move.moveType); if (effectiveness != Effectiveness.immune && CheckIfHit(move, attacker, defender)) { if (move.causesStatus != StatusEffect.none) { ResolveStatus(move, defender); } if (move.statToChange != MonStat.none) { if (move.affectSelf) { ResolveStatChange(move, attacker); } else { ResolveStatChange(move, defender); } } if (defender == playerMon) { playerModel.GetComponent <Animator>().SetTrigger("Damage"); } else { enemyModel.GetComponent <Animator>().SetTrigger("Damage"); } UpdateHPBar(defender); UpdateHPBar(attacker); } else { battleDialogue.AddToMessages("It had no effect..."); } }
private int CalculateDamageModifier(MoveData move, MonBattleData attacker, MonBattleData defender, bool criticalHit) { float modifier; int rand = 100; // Random number that gives some variance in damage float stab = 1f; // Stands for Same Type Attack Bonus, applies a modifier if the move used is the same type as the user float burn = 1f; // Weakens physical moves if the user is burned float effect = 1f; // Type effectiveness float critical = 1f; rand = Random.Range(85, 101); stab = 1f; if (attacker.primaryType == move.moveType) { stab = 1.5f; } else if (attacker.secondaryType != null) { if (attacker.secondaryType == move.moveType) { stab = 1.5f; } } if (move.physSpec == PhysSpec.Physical && attacker.hasStatus == StatusEffect.Burn) { burn = 0.5f; } else { burn = 1.0f; } if (criticalHit) { critical = 2f; } effect = GetEffectivenessModifier(defender.GetEffectiveness(move.moveType)); modifier = rand * stab * effect * burn * critical; return(Mathf.FloorToInt(modifier)); }
void ResolveDamagingAttack(MoveData move, MonBattleData attacker, MonBattleData defender) { bool crit; Effectiveness effectiveness; int damage; if (attacker == playerMon) { playerModel.GetComponent <Animator>().SetTrigger("Attack"); } else { enemyModel.GetComponent <Animator>().SetTrigger("Attack"); } if (CheckIfHit(move, attacker, defender)) { crit = CheckIfCrit(move); effectiveness = defender.GetEffectiveness(move.moveType); damage = CalculateDamage(move, attacker, defender, crit); if (crit) { battleDialogue.AddToMessages("A critical hit!"); } if (effectiveness == Effectiveness.resist2x || effectiveness == Effectiveness.resist4x) { battleDialogue.AddToMessages("It's not very effective..."); } else if (effectiveness == Effectiveness.weak2x || effectiveness == Effectiveness.weak4x) { battleDialogue.AddToMessages("It's super effective!!!"); } if (effectiveness == Effectiveness.immune) { battleDialogue.AddToMessages("It had no effect..."); } defender.TakeDamage(damage); if (defender == playerMon) { playerModel.GetComponent <Animator>().SetTrigger("Damage"); } else { enemyModel.GetComponent <Animator>().SetTrigger("Damage"); } if (move.causesStatus != StatusEffect.none) { ResolveStatus(move, defender); } if (move.statToChange != MonStat.none) { if (move.affectSelf) { ResolveStatChange(move, attacker); } else { ResolveStatChange(move, defender); } } UpdateHPBar(defender); UpdateHPBar(attacker); } else { battleDialogue.AddToMessages("But it missed!"); } }