Example #1
0
        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);
            }
        }