#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); w->Speed = BULLETSPEED; break; case WEAPONTYPEROCKET: BuildRocketModel(&w->Object.Model); w->Speed = ROCKETSPEED; 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.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, VObject * ObjectList, VEnemy * EnemyList) { switch (w->Type) { case WEAPONTYPEBULLET: 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 (; EnemyList != NULL; EnemyList = EnemyList->next) { if (fabs(((w->Object.Position.x - EnemyList->Object.Position.x) * (w->Object.Position.x - EnemyList->Object.Position.x)) + ((w->Object.Position.y - EnemyList->Object.Position.y) * (w->Object.Position.y - EnemyList->Object.Position.y)) + ((w->Object.Position.z - EnemyList->Object.Position.z) * (w->Object.Position.z - EnemyList->Object.Position.z))) <= (w->Object.Radius + EnemyList->Object.Radius)) { EnemyList->Object.taggedForRemoval = 1; w->taggedForRemoval = 1; break; } } 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->Target, &w->Object.Position, &intendedAngle); NormalizeVector(&intendedAngle); intendedAngle.x *= (((ROCKETROTATERATE * w->Speed) / MAXROCKETSPEED) / interval); intendedAngle.y *= (((ROCKETROTATERATE * w->Speed) / MAXROCKETSPEED) / interval); intendedAngle.z *= (((ROCKETROTATERATE * w->Speed) / MAXROCKETSPEED) / 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); } w->Speed += ROCKETACCELERATION; if (w->Speed > MAXROCKETSPEED) w->Speed = MAXROCKETSPEED; 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 (; EnemyList != NULL; EnemyList = EnemyList->next) { if (fabs(((w->Object.Position.x - EnemyList->Object.Position.x) * (w->Object.Position.x - EnemyList->Object.Position.x)) + ((w->Object.Position.y - EnemyList->Object.Position.y) * (w->Object.Position.y - EnemyList->Object.Position.y)) + ((w->Object.Position.z - EnemyList->Object.Position.z) * (w->Object.Position.z - EnemyList->Object.Position.z))) <= (w->Object.Radius + EnemyList->Object.Radius)) { EnemyList->Object.taggedForRemoval = 1; w->taggedForRemoval = 1; break; } } 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); }