float Pokemon::attacking(Pokemon& p, Attack a) { float stab = 1.0f; if (type == a.getType()) stab = 1.5f; float effectiveness = 1.0f; if ((a.getType() == Constants::FLYING && p.type == Constants::FIGHTING) || (a.getType() == Constants::FIGHTING && p.type == Constants::ROCK) || (a.getType() == Constants::ROCK && p.type == Constants::FLYING)) effectiveness = 2.0f; if ((a.getType() == Constants::FLYING && p.type == Constants::ROCK) || (a.getType() == Constants::ROCK && p.type == Constants::FIGHTING) || (a.getType() == Constants::FIGHTING && p.type == Constants::FLYING)) effectiveness = 0.5f; float random = 85 + rand() % (100 + 1 - 85); p.currentHP -= (int)(0.01f * random * stab * effectiveness * ((0.2 * Lv + 1) * attack * a.getPower() / 25 / p.defence + 2)); if (p.currentHP <= 0) { updateHP(); p.updateHP(); effectiveness = -1.0f; } return effectiveness; }
void Player::onCollision(PowerUp& powerup) { switch (powerup.getType()) { // timed bonus case PowerUp::DOUBLE_SHOT: if (bonus_[T_DOUBLESHOT] == 0) m_weapon.setMultiply(2); bonus_[T_TRISHOT] = 0; bonus_[T_DOUBLESHOT] += TIMED_BONUS_DURATION; m_panel.activeAttackPowerUp(bonus_[T_DOUBLESHOT], powerup.getType()); break; case PowerUp::TRIPLE_SHOT: if (bonus_[T_TRISHOT] == 0) m_weapon.setMultiply(3); bonus_[T_DOUBLESHOT] = 0; bonus_[T_TRISHOT] += TIMED_BONUS_DURATION; m_panel.activeAttackPowerUp(bonus_[T_TRISHOT], powerup.getType()); break; case PowerUp::SPEED: if (bonus_[T_SPEED] == 0) { m_speed *= BONUS_SPEED_FACTOR; m_smoke_emitter.createParticles(120); } bonus_[T_SPEED] += TIMED_BONUS_DURATION; m_panel.activeSpeedPowerUp(bonus_[T_SPEED]); break; // immediate bonus case PowerUp::REPAIR: if (getHP() < m_max_hp) m_panel.setHP(updateHP(1)); break; case PowerUp::FULL_REPAIR: setHP(m_max_hp); m_panel.setHP(m_max_hp); m_powerup_emitter.setPosition(getCenter()); m_powerup_emitter.createParticles(50); break; case PowerUp::SHIELD: if (m_shield < m_max_shield) setShield(m_shield + 1); break; case PowerUp::FULL_SHIELD: setShield(m_max_shield); m_panel.setShield(m_max_shield); m_powerup_emitter.setPosition(getCenter()); m_powerup_emitter.createParticles(50); break; case PowerUp::ICECUBE: if (m_icecubes < MAX_ICECUBES) m_panel.setIcecubes(++m_icecubes); break; case PowerUp::MISSILE: if (m_missiles < MAX_MISSILES) m_panel.setMissiles(++m_missiles); break; default: break; } powerup.kill(); MessageSystem::write(powerup.getDescription(), powerup.getPosition()); SoundSystem::playSound("power-up.ogg"); }