#pragma once #include "Weapons.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); break; case WEAPONTYPEROCKET: BuildRocketModel(&w->Object.Model); break; } CalculateRadius(&w->Object); } void CleanUpWeapon(VWeapon * w) { CleanUpObject(&w->Object); } void StartWeapon(VWeapon * w, Vector * startPos, Vector * target, Vector * forward, Vector * up) { 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); /* Start at the near clipping plane */ w->Object.Position.x -= (w->Object.Front.x * 1.5); w->Object.Position.y -= (w->Object.Front.y * 1.5); w->Object.Position.z -= (w->Object.Front.z * 1.5); } void RunWeapon(VWeapon * w, float interval, VObject * ObjectList) { switch (w->Type) { case WEAPONTYPEBULLET: w->Object.Position.x -= ((w->Object.Front.x / interval) / 100.0); w->Object.Position.y -= ((w->Object.Front.y / interval) / 100.0); w->Object.Position.z -= ((w->Object.Front.z / interval) / 100.0); for (; ObjectList != NULL; ObjectList = ObjectList->next) { if (fabs(((w->Object.Position.x - ObjectList->Position.x) * (w->Object.Position.x - ObjectList->Position.x)) + ((w->Object.Position.y - ObjectList->Position.y) * (w->Object.Position.y - ObjectList->Position.y)) + ((w->Object.Position.z - ObjectList->Position.z) * (w->Object.Position.z - ObjectList->Position.z))) <= (w->Object.Radius + ObjectList->Radius)) { ObjectList->taggedForRemoval = 1; w->taggedForRemoval = 1; 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))) > MAXBULLETDISTANCE) { w->taggedForRemoval = 1; } 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->Object.Position, &w->Target, &intendedAngle); NormalizeVector(&intendedAngle); intendedAngle.x *= (ROCKETROTATERATE / interval); intendedAngle.y *= (ROCKETROTATERATE / interval); intendedAngle.z *= (ROCKETROTATERATE / interval); AddVector(&w->Object.Front, &intendedAngle, &w->Object.Front); 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); } w->Object.Position.x -= ((w->Object.Front.x / interval) / 200.0); w->Object.Position.y -= ((w->Object.Front.y / interval) / 200.0); w->Object.Position.z -= ((w->Object.Front.z / interval) / 200.0); for (; ObjectList != NULL; ObjectList = ObjectList->next) { if (fabs(((w->Object.Position.x - ObjectList->Position.x) * (w->Object.Position.x - ObjectList->Position.x)) + ((w->Object.Position.y - ObjectList->Position.y) * (w->Object.Position.y - ObjectList->Position.y)) + ((w->Object.Position.z - ObjectList->Position.z) * (w->Object.Position.z - ObjectList->Position.z))) <= (w->Object.Radius + ObjectList->Radius)) { //ObjectList->taggedForRemoval = 1; w->taggedForRemoval = 1; 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))) > MAXROCKETDISTANCE) { w->taggedForRemoval = 1; } break; } } void DrawWeapon(VWeapon * w) { DrawObject(&w->Object); }