bool plDynaBulletMgr::IHandleShot(plBulletMsg* bull) { hsVector3 up = IRandomUp(bull->Dir()); hsPoint3 pos = bull->From() + bull->Dir() * (bull->Range() * 0.5f); fCutter->SetLength(hsVector3(bull->Radius() * fScale.fX, bull->Radius() * fScale.fY, bull->Range())); fCutter->Set(pos, up, -bull->Dir()); plDynaDecalInfo& info = IGetDecalInfo(uintptr_t(this), GetKey()); if( bull->PartyTime() > 0 ) fPartyTime = bull->PartyTime(); double secs = hsTimer::GetSysSeconds(); if( ICutoutTargets(secs) ) info.fLastTime = secs; return true; }
hsBool plDynaTorpedoMgr::IHandleShot(plBulletMsg* bull) { float partyTime = fPartyTime; plConst(int) kNumShots(3); int i; for( i = 0; i < kNumShots; i++ ) { hsVector3 up = IRandomUp(bull->Dir()); hsVector3 pert = bull->Dir() % up; plConst(float) kMaxPert(1.f); float maxPert = i ? kMaxPert * bull->Radius() : 0; pert *= sRand.RandMinusOneToOne() * maxPert * fScale.fX; pert += up * (sRand.RandMinusOneToOne() * maxPert * fScale.fY); hsPoint3 pos = bull->From() + bull->Dir() * (bull->Range() * 0.5f); pos += pert; float scaleX = bull->Radius() * fScale.fX * fInitUVW.fX; float scaleY = bull->Radius() * fScale.fY * fInitUVW.fY; #if 0 plConst(float) kMinScale(0.5f); if( i ) { scaleX *= sRand.RandRangeF(kMinScale, 1.f); scaleY *= sRand.RandRangeF(kMinScale, 1.f); } #elif 0 float div = 1.f / (1.f + float(i)); scaleX *= div; scaleY *= div; #else plConst(float) kMinScale(0.25f); plConst(float) kMaxScale(0.75f); if( i ) { float scale = sRand.RandRangeF(kMinScale, kMaxScale); scaleX *= scale; scaleY *= scale; } #endif fCutter->SetLength(hsVector3(scaleX, scaleY, bull->Range())); fCutter->Set(pos, up, -bull->Dir()); plDynaDecalInfo& info = IGetDecalInfo(uintptr_t(this), GetKey()); if( bull->PartyTime() > 0 ) fPartyTime = bull->PartyTime(); double secs = hsTimer::GetSysSeconds(); if( ICutoutTargets(secs) ) info.fLastTime = secs; fPartyTime = 0; } fPartyTime = partyTime; return true; }