/* $Id: weapongrenade.cpp,v 1.22.2.1 2006/03/14 14:45:52 chfreund Exp $ */ #include "weapongrenade.hpp" #include "world.hpp" #include "avatar.hpp" #include "stationarygun.hpp" bool WeaponGrenade::reallyShoot( World* world, Avatar* avatar, const StationaryGun* gun ) const { // initialize grenade real power = world->getRandom().getNormedReal(); power *= 2; power += 7; Uint32 type = m_type; // dud? remove any triggering if( world->getRandom().getUint32Between( 0, 10 ) == 0) { type &= ~(Grenade::TIME_TRIGGERED | Grenade::CONTACT_TRIGGERED); } const Uint32 ttl = world->getRandom().getUint32Between( 60, 75 ); Grenade* const grenade = dynamic_cast( world->newObject( GRENADE )); if( gun ) { Vector vel = gun->getRandomizedAimingVector( 2 ); vel *= power; vel *= 2.0; return grenade->initialize( gun->getShootingPoint(), vel, avatar->getPlayer()->getPlayerID(), type, ROUND( 0.25*ttl ), 250, 18 ); } else { Vector vel = avatar->getRandomizedAimingVector( 2 ); vel *= power; vel += avatar->getVel(); return grenade->initialize( avatar->placeBesideCollRect( grenade->getCollRectX() + grenade->getCollRectWidth() - 1, -grenade->getCollRectX(), grenade->getCollRectY() + grenade->getCollRectHeight() - 1, -grenade->getCollRectY() ), vel, avatar->getPlayer()->getPlayerID(), type, ttl, 250, 18 ); } }