Пример #1
0
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;
}
Пример #2
0
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");
}