int Battle::getDamage(Pokemon& attacking, Pokemon& defending, Move& move) { // get the pokemon's level int level = attacking.getLevel(); // get the relavent values for attack and defense int attackStat; int defenseStat; if(move.getCategory() == PHYSICAL) { attackStat = attacking.getAttack().getModValue(); defenseStat = defending.getDefense().getModValue(); } else { attackStat = attacking.getSpecialAttack().getModValue(); defenseStat = defending.getSpecialDefense().getModValue(); } // get the moves power double attackPower = move.getPower(); // get the stab double STAB = 1.0; if(attacking.getTypeOne() == move.getType() or attacking.getTypeTwo() == move.getType()) { STAB = 1.5; } // get the type multiplier double typeMult = Type::getMultiplier(move.getType(), defending.getTypeOne(), defending.getTypeTwo()); // get the random number 85-100 double randomNumber = (rand() % 16) + 85; // do the calculation double damage = ((((2.0 * level / 5.0 + 2.0) * attackStat * attackPower / defenseStat) / 50.0) + 2.0) * STAB * typeMult * randomNumber / 100.0; // print debug messages println_debug("Damage for " << attacking.getNickname() << " attacking " << defending.getNickname() << " with " << move.getName()); println_debug("Level = " << level); println_debug("attackStat = " << attackStat); println_debug("attackPower = " << attackPower); println_debug("defenseStat = " << defenseStat); println_debug("STAB = " << STAB); println_debug("type = " << typeMult); println_debug("random = " << randomNumber); println_debug("Damage calculated = " << damage); println_debug(""); // round damage return roundDamage(damage); }