#ifndef JNR_ENEMY_H #define JNR_ENEMY_H #include "engine/entity.h" #include "engine/camera.h" #include "engine/tilemap.h" /* ── Grunt enemy ───────────────────────────────────── */ /* A ground-patrolling enemy that walks back and forth */ #define GRUNT_WIDTH 12 #define GRUNT_HEIGHT 16 #define GRUNT_SPEED 40.0f /* horizontal walk speed (px/s) */ #define GRUNT_HEALTH 2 typedef struct GruntData { float patrol_dir; /* 1.0 or -1.0 */ float death_timer; /* countdown after dying */ } GruntData; void grunt_register(EntityManager *em); Entity *grunt_spawn(EntityManager *em, Vec2 pos); /* ── Flyer enemy ───────────────────────────────────── */ /* A flying enemy that bobs up and down, moves toward */ /* the player when in range */ #define FLYER_WIDTH 14 #define FLYER_HEIGHT 12 #define FLYER_SPEED 50.0f /* horizontal chase speed (px/s) */ #define FLYER_BOB_AMP 20.0f /* vertical bob amplitude */ #define FLYER_BOB_SPD 2.5f /* bob frequency (radians/s) */ #define FLYER_HEALTH 1 #define FLYER_DETECT 120.0f /* detection range (px) */ #define FLYER_SHOOT_CD 2.0f /* seconds between shots */ typedef struct FlyerData { float bob_timer; /* for sine wave bobbing */ float base_y; /* original y position */ float death_timer; float shoot_timer; /* cooldown for shooting */ } FlyerData; void flyer_register(EntityManager *em); Entity *flyer_spawn(EntityManager *em, Vec2 pos); #endif /* JNR_ENEMY_H */