#pragma once typedef struct VEnemy VEnemy; typedef enum { AIEventInit, AIEventRun, AIEventCleanUp, AIEventCopyData } AIEvent; typedef void (*EnemyAIModule) (void * , AIEvent, float); typedef struct SmartShooterData SmartShooterData; #include "ObjectManager.h" #include "Vectors.h" #include "PhysicsManager.h" #include "Camera.h" #define ENEMYAVOIDRADIUS (3.0 * 3.0) #define DUMBSHOOTERROTSPEED 0.001 #define DUMBSHOOTERMOVESPEED 0.001 #define DUMBSHOOTERSHOOTRANGE (6.0 * 6.0) #define DUMBSHOOTERSHOOTSPEED 1800.0 #define DUMBSHOOTERACTIVATIONRANGE (40 * 40) #define KAMIKAZEROTSPEED 0.01 #define KAMIKAZEMOVESPEED 0.005 #define KAMIKAZERANGE (40.0 * 40.0) #define SMARTSHOOTERROTSPEED 0.001 #define SMARTSHOOTERMOVESPEED 0.0025 #define SMARTSHOOTERRANGE (20.0 * 20.0) #define SMARTSHOOTERSHOOTSPEED 1400.0 #define SMARTSHOOTERSTATEFLY 0 #define SMARTSHOOTERSTATESHOOT 1 #define SMARTSHOOTERFLYTIME 3000.0 #define SMARTSHOOTERSHOOTTIME 4000.0 #define STATIONARYSHOOTERROTSPEED 0.0004 #define STATIONARYSHOOTERRANGE (40.0 * 40.0) #define STATIONARYSHOOTERSHOOTSPEED 1200.0 struct VEnemy { EnemyAIModule Callback; void * Data; VObject Object; float Idle; struct VEnemy * next; /* Linked List */ Boolean taggedForRemoval; VPhysics Physics; int Shields; }; struct SmartShooterData { int State; float Idle2; Vector Angle; void * Data; }; typedef struct VBoss { struct VBossPart { VObject Object; enum {Live, Shoot, BossMove, None} Functionality; struct VBossPart * next; } * Parts; int Shields; int Level; void * Data; } VBoss; void DumbShooterAI(void * Enemy, AIEvent Event, float interval); void KamikazeAI(void * Enemy, AIEvent Event, float interval); void SmartShooterAI(void * Enemy, AIEvent Event, float interval); void StationaryAI(void * Enemy, AIEvent Event, float interval); void GuardAI(void * Enemy, AIEvent Event, float interval); void InitEnemy(VEnemy * e, void * Data); void SetEnemyAI(VEnemy * e, EnemyAIModule aiMod); void CleanUpEnemy(VEnemy * e); void DrawEnemy(VEnemy * e); void RunEnemy(VEnemy * e, float interval); void HitEnemy(VEnemy * e, int Damage); void CopyEnemy(VEnemy * src, VEnemy * dest); void CleanUpBoss(VBoss * b); void InitBoss(VBoss * b, void * Data); void LoadBoss(VBoss * b, int Level); void RunBoss(VBoss * b); Boolean BossCanMove(VBoss * b); Boolean IsBossAlive(VBoss * b); int NumBossShots(VBoss * b, Vector * Positions); void RemoveBossObject(VBoss * b, VObject * o);