/* $Id: weaponhook.cpp,v 1.14.4.1 2006/03/14 14:45:52 chfreund Exp $ */ #include "weaponhook.hpp" #include "world.hpp" #include "avatar.hpp" #include "rope.hpp" #include "stationarygun.hpp" bool WeaponHook::reallyShoot( World* world, Avatar* avatar, const StationaryGun* gun ) const { CollidableObject* hitObject; if( gun ) { // place hook 1 Hook* const hook1 = dynamic_cast( world->newObject( HOOK )); Vector offsetVector( -gun->getAimingDY(), gun->getAimingDX() ); offsetVector.normalize(); Vector pos = gun->getShootingPoint(); pos -= offsetVector * 2; Vector vel = gun->getRandomizedAimingVector( 3 ); real velFactor = -world->getRandom().getNormedReal(); velFactor *= 4.0; velFactor += 25.0; vel *= velFactor; vel -= offsetVector * 2; if( hook1->initialize( pos, vel, hitObject ) == false ) return false; // place hook 2 Hook* const hook2 = dynamic_cast( world->newObject( HOOK )); pos = gun->getShootingPoint(); pos -= offsetVector * 2; vel = gun->getRandomizedAimingVector( 3 ); velFactor = -world->getRandom().getNormedReal(); velFactor *= 4.0; velFactor += 25.0; vel *= velFactor; vel -= offsetVector * 2; if( hook2->initialize( pos, vel, hitObject ) == false ) { world->deleteObject( hook1 ); // ok return false; } // create rope Rope* const rope = dynamic_cast( world->newObject( ROPE )); // attach rope to shooting avatar and hook rope->initialize( dynamic_cast( hook1 ), dynamic_cast( hook2 ), avatar->getPlayer()->getPlayerOrTeamID(), 200, avatar->getSkinColor() ); } else { // place hook Hook* const hook = dynamic_cast( world->newObject( HOOK )); Vector vel = avatar->getRandomizedAimingVector( 3 ); real velFactor = -world->getRandom().getNormedReal(); velFactor *= 5.0; velFactor += 28.0; vel *= velFactor; vel += avatar->getVel(); if( hook->initialize( avatar->placeBesideCollRect( hook->getCollRectX() + hook->getCollRectWidth() - 1, -hook->getCollRectX(), hook->getCollRectY() + hook->getCollRectHeight() - 1, -hook->getCollRectY() ), vel, hitObject ) == false ) { if( hitObject == NULL ) return false; // else hook could not be placed but an object was hit directly, so continue } else { // hook could be placed, so set hitObject to hook hitObject = hook; } // create rope Rope* const rope = dynamic_cast( world->newObject( ROPE )); // attach rope to shooting avatar and hitObject rope->initialize( dynamic_cast( avatar ), dynamic_cast( hitObject ), avatar->getPlayer()->getPlayerOrTeamID(), 200, avatar->getSkinColor() ); } return true; }