#ifndef JNR_HAZARDS_H #define JNR_HAZARDS_H #include "engine/entity.h" #include "engine/camera.h" #include "engine/tilemap.h" /* ═══════════════════════════════════════════════════ * TURRET — Wall/floor-mounted gun that shoots at * the player when in range, on a cooldown timer. * ═══════════════════════════════════════════════════ */ #define TURRET_WIDTH 14 #define TURRET_HEIGHT 16 #define TURRET_DETECT_RANGE 160.0f /* detection radius in px */ #define TURRET_SHOOT_CD 2.0f /* seconds between shots */ #define TURRET_HEALTH 3 typedef struct TurretData { float shoot_timer; /* countdown to next shot */ float fire_flash; /* visual: time remaining on flash */ } TurretData; void turret_register(EntityManager *em); Entity *turret_spawn(EntityManager *em, Vec2 pos); /* ═══════════════════════════════════════════════════ * MOVING PLATFORM — Travels back and forth along a * horizontal or vertical path. Player rides on top. * ═══════════════════════════════════════════════════ */ #define MPLAT_WIDTH 16 #define MPLAT_HEIGHT 16 #define MPLAT_SPEED 40.0f /* pixels per second */ #define MPLAT_RANGE 80.0f /* total travel distance in px */ typedef struct MovingPlatData { Vec2 origin; /* center of travel path */ Vec2 direction; /* (1,0) horizontal / (0,1) vert*/ float range; /* half-distance of travel */ float phase; /* current sine phase (radians) */ } MovingPlatData; void mplat_register(EntityManager *em); Entity *mplat_spawn(EntityManager *em, Vec2 pos); /* Spawn with explicit direction: dir (1,0) = horizontal, (0,1) = vertical */ Entity *mplat_spawn_dir(EntityManager *em, Vec2 pos, Vec2 dir); /* ═══════════════════════════════════════════════════ * FLAME VENT — Floor-mounted grate that periodically * bursts blue flames upward. Damages on contact * when flames are active. * ═══════════════════════════════════════════════════ */ #define FLAME_WIDTH 16 #define FLAME_HEIGHT 16 #define FLAME_ON_TIME 1.5f /* seconds flames are active */ #define FLAME_OFF_TIME 2.0f /* seconds between bursts */ #define FLAME_DAMAGE 1 typedef struct FlameVentData { float timer; /* counts down in current phase */ bool active; /* true = flames on */ float warn_time; /* brief flicker before igniting*/ } FlameVentData; void flame_vent_register(EntityManager *em); Entity *flame_vent_spawn(EntityManager *em, Vec2 pos); /* ═══════════════════════════════════════════════════ * FORCE FIELD — Energy barrier that toggles on/off * on a timer. Blocks movement and damages when * active, passable when off. * ═══════════════════════════════════════════════════ */ #define FFIELD_WIDTH 16 #define FFIELD_HEIGHT 16 #define FFIELD_ON_TIME 3.0f /* seconds barrier is active */ #define FFIELD_OFF_TIME 2.0f /* seconds barrier is off */ #define FFIELD_DAMAGE 1 typedef struct ForceFieldData { float timer; /* counts down in current phase */ bool active; /* true = barrier is on */ } ForceFieldData; void force_field_register(EntityManager *em); Entity *force_field_spawn(EntityManager *em, Vec2 pos); /* ═══════════════════════════════════════════════════ * ASTEROID — Falls from the sky, damages the player * on contact, explodes on hitting the ground, then * respawns at its original position after a delay. * ═══════════════════════════════════════════════════ */ #define ASTEROID_WIDTH 14 #define ASTEROID_HEIGHT 14 #define ASTEROID_FALL_SPEED 200.0f /* base fall speed (px/s) */ #define ASTEROID_ACCEL 350.0f /* fall acceleration (px/s^2) */ #define ASTEROID_DRIFT_MAX 60.0f /* max horizontal drift (px/s) */ #define ASTEROID_DAMAGE 1 #define ASTEROID_RESPAWN 6.0f /* seconds before respawning */ typedef struct AsteroidData { Vec2 spawn_pos; /* original position (for reset)*/ float fall_speed; /* current fall velocity */ float drift_x; /* horizontal velocity (px/s) */ float respawn_timer; /* countdown while inactive */ bool falling; /* true = falling, false = wait */ float trail_timer; /* particle trail interval */ float start_delay; /* initial delay before first fall */ } AsteroidData; void asteroid_register(EntityManager *em); Entity *asteroid_spawn(EntityManager *em, Vec2 pos); #endif /* JNR_HAZARDS_H */