#include "Enemies.h" #include "WorldManager.h" #define EnemySpeed 0.001 void TestAI(void * Enemy, AIEvent Event, float interval) { #pragma unused (Event) VEnemy * e; VWorld * w; Vector Angle; e = (VEnemy *) Enemy; w = (VWorld *) e->Data; SubtractVector(&w->Camera.Position, &e->Object.Position, &Angle); NormalizeVector(&Angle); Angle.x *= PYRAMIDROTSPEED / interval; Angle.y *= PYRAMIDROTSPEED / interval; Angle.z *= PYRAMIDROTSPEED / interval; AddVector(&e->Object.Front, &Angle, &e->Object.Front); NormalizeVector(&e->Object.Front); CrossProduct(&e->Object.Front, &e->Object.Right, &e->Object.Up); CrossProduct(&e->Object.Up, &e->Object.Front, &e->Object.Right); NormalizeVector(&e->Object.Right); NormalizeVector(&e->Object.Up); if(fabs( ((e->Object.Position.x - w->Camera.Position.x) * (e->Object.Position.x - w->Camera.Position.x) + (e->Object.Position.y - w->Camera.Position.y) * (e->Object.Position.y - w->Camera.Position.y) + (e->Object.Position.z - w->Camera.Position.z) * (e->Object.Position.z - w->Camera.Position.z)) > PYRAMIDRANGE)) { Angle = e->Object.Front; NormalizeVector(&Angle); Angle.x *= PYRAMIDMOVESPEED / interval; Angle.y *= PYRAMIDMOVESPEED / interval; Angle.z *= PYRAMIDMOVESPEED / interval; AddVector(&e->Object.Position, &Angle, &e->Object.Position); } else { e->Idle += interval; if(e->Idle > PYRAMIDSHOOTSPEED) { VWeapon * theWeapon; VObjectWrapper * theWObject; e->Idle = 0; theWeapon = (VWeapon *) NewPtr(sizeof(VWeapon)); if (theWeapon != NULL) { InitWeapon(theWeapon, WEAPONTYPEBULLET); AllocateWObject(&theWObject); theWObject->Type = VWEAPON; theWObject->w = theWeapon; theWObject->next = w->Objects; if (w->Objects != NULL) w->Objects->previous = theWObject; w->Objects = theWObject; StartWeapon(theWeapon, &e->Object.Position, NULL, &e->Object.Front, &e->Object.Up, 0.0); theWeapon->Speed = BULLETSPEED / 2; } } } } void InitEnemy(VEnemy * e, EnemyAIModule aiMod, void * Data) { e->Callback = aiMod; e->Data = Data; e->Idle = 0; e->next = NULL; e->taggedForRemoval = false; InitObject(&e->Object); BuildEnemyModel(&e->Object.Model); CalculateRadius(&e->Object); e->Object.Front.z = -1; e->Object.Position.z = -10; e->Object.Position.x = -2; e->Object.Position.y = -2; } void CleanUpEnemy(VEnemy * e) { CleanUpObject(&e->Object); } void DrawEnemy(VEnemy * e) { DrawObject(&e->Object); } void RunEnemy(VEnemy * e, float interval) { e->Callback(e, blah, interval); }