public void execute() { Fi.logs.logMessage("Executing a move command with id " + this.moveId.ToString()); if (attacker.isParalyzed && Fi.random.Next(100) < 25) { Fi.battle.messageObservers(BattleObserverMessage.AttackerisParalyzedCantAttack); return; } //PP calculations fAssert.assert(attacker.moves[moveId] > 0, "Trying to execute a move without PP"); attacker.moves[moveId] -= 1; // -1 to PP //Initial Accuracy calculations MoveData data = Fi.data.getMoveData(moveId); int finalAccuracy = calculateFinalAccuracy(data.accuracy); //Move-nature calculation bool isSpecialMove; if (data.typeId == 1 || data.typeId == 10 || data.typeId == 9) { isSpecialMove = false; //normal, flying, fighting } else { isSpecialMove = true; } //Hit or miss if (Fi.random.Next(255) < finalAccuracy) { int damage; //the move hits...straight from the Pokemon rules /* First, we'll check if the move is pre-processing or post-processing * pre: slash, and karate chop */ if (moveId == 40 || moveId == 51) { Fi.scripts.moves[moveId](attacker, defender); damage = battleCalculations.calculateDamage(attacker, defender, isSpecialMove, moveId); Fi.battle.PhaseDamage = damage; if (damage >= 0) { defender.hp -= damage; if (defender.hp < 0) { defender.hp = 0; } Fi.battle.messageObservers(BattleObserverMessage.DamageDone); } } else { damage = battleCalculations.calculateDamage(attacker, defender, isSpecialMove, moveId); Fi.battle.PhaseDamage = damage; if (damage >= 0) { defender.hp -= damage; if (defender.hp < 0) { defender.hp = 0; } Fi.battle.messageObservers(BattleObserverMessage.DamageDone); } Fi.scripts.moves[moveId](attacker, defender); } if (attacker.isPoisoned) { Fi.battle.PhasePoisonDamage = (int)attacker.maxHp / 16; attacker.hp -= (int)attacker.maxHp / 16; if (attacker.hp < 0) { attacker.hp = 0; } Fi.battle.messageObservers(BattleObserverMessage.AttackerPoisonDamage); } } else { Fi.battle.messageObservers(BattleObserverMessage.MoveMisses); } }