#include "Weapons.h" #include "WorldManager.h" #include "ObjectWrapper.h" void InitWeapon(VWeapon * w, int type) { w->Type = type; w->InitialPos.x = 0.0; w->InitialPos.y = 0.0; w->InitialPos.z = 0.0; w->Target = w->InitialPos; w->taggedForRemoval = 0; w->next = NULL; InitObject(&w->Object); switch (type) { case WEAPONTYPEBULLET: BuildBulletModel(&w->Object.Model); w->Speed = BULLETSPEED; w->MaxDistance = MAXBULLETDISTANCE; break; case WEAPONTYPEROCKET: BuildRocketModel(&w->Object.Model); w->Speed = ROCKETSPEED; w->MaxDistance = MAXROCKETDISTANCE; break; } CalculateRadius(&w->Object); } void CleanUpWeapon(VWeapon * w) { CleanUpObject(&w->Object); } void StartWeapon(VWeapon * w, Vector * startPos, Vector * target, Vector * forward, Vector * up, float speedAdjustment) { w->InitialPos = *startPos; w->Object.Position = *startPos; if (target != NULL) w->Target = *target; w->Object.Front = *forward; w->Object.Up = *up; CrossProduct(&w->Object.Up, &w->Object.Front, &w->Object.Right); NormalizeVector(&w->Object.Right); w->Speed += speedAdjustment; /* Start at the near clipping plane */ w->Object.Position.x += (w->Object.Front.x * 1.0); w->Object.Position.y += (w->Object.Front.y * 1.0); w->Object.Position.z += (w->Object.Front.z * 1.0); } void RunWeapon(VWeapon * w, float interval, void * TheWorld) { VWorld * world; VObject * Object; VObjectWrapper * ObjectList; world = (VWorld *) TheWorld; ObjectList = world->Objects; w->Target = w->Object.Front; for (; ObjectList != NULL; ObjectList = ObjectList->next) { if (ObjectList->Type != VENEMY && ObjectList->Type != VOBJECT) continue; WObjectObject(ObjectList, &Object); if (Object != NULL) w->Target = Object->Position; break; } ObjectList = world->Objects; switch (w->Type) { case WEAPONTYPEBULLET: break; case WEAPONTYPEROCKET: if (w->Target.x != w->Object.Front.x && w->Target.y != w->Object.Front.y && w->Target.z != w->Object.Front.z) { Vector intendedAngle; SubtractVector(&w->Target, &w->Object.Position, &intendedAngle); NormalizeVector(&intendedAngle); intendedAngle.x *= (ROCKETROTATERATE / interval); intendedAngle.y *= (ROCKETROTATERATE / interval); intendedAngle.z *= (ROCKETROTATERATE / interval); w->Object.Front.x += intendedAngle.x; w->Object.Front.y += intendedAngle.y; w->Object.Front.z += intendedAngle.z; NormalizeVector(&w->Object.Front); CrossProduct(&w->Object.Front, &w->Object.Right, &w->Object.Up); CrossProduct(&w->Object.Up, &w->Object.Front, &w->Object.Right); NormalizeVector(&w->Object.Right); NormalizeVector(&w->Object.Up); } if (w->Speed < MAXROCKETSPEED) { w->Speed += ROCKETACCELERATION; if (w->Speed > MAXROCKETSPEED) w->Speed = MAXROCKETSPEED; } else if (w->Speed > MAXROCKETSPEED) { w->Speed -= ROCKETACCELERATION; if (w->Speed < MAXROCKETSPEED) w->Speed = MAXROCKETSPEED; } break; } w->Object.Position.x += ((w->Object.Front.x / interval) * w->Speed); w->Object.Position.y += ((w->Object.Front.y / interval) * w->Speed); w->Object.Position.z += ((w->Object.Front.z / interval) * w->Speed); for (; ObjectList != NULL; ObjectList = ObjectList->next) { if (ObjectList->Type != VENEMY && ObjectList->Type != VOBJECT) continue; WObjectObject(ObjectList, &Object); if (Object != NULL && fabs(((w->Object.Position.x - Object->Position.x) * (w->Object.Position.x - Object->Position.x)) + ((w->Object.Position.y - Object->Position.y) * (w->Object.Position.y - Object->Position.y)) + ((w->Object.Position.z - Object->Position.z) * (w->Object.Position.z - Object->Position.z))) <= (w->Object.Radius + Object->Radius)) { ObjectList->taggedForRemoval = true; ObjectList->exploded = true; w->taggedForRemoval = true; break; } } if ((((w->Object.Position.x - w->InitialPos.x) * (w->Object.Position.x - w->InitialPos.x)) + ((w->Object.Position.y - w->InitialPos.y) * (w->Object.Position.y - w->InitialPos.y)) + ((w->Object.Position.z - w->InitialPos.z) * (w->Object.Position.z - w->InitialPos.z))) > w->MaxDistance) { w->taggedForRemoval = true; } } void DrawWeapon(VWeapon * w) { DrawObject(&w->Object); }