Files
major_tom/src/game/projectile.h
2026-02-28 18:03:47 +00:00

76 lines
4.0 KiB
C

#ifndef JNR_PROJECTILE_H
#define JNR_PROJECTILE_H
#include "engine/entity.h"
#include "engine/camera.h"
#include "engine/tilemap.h"
#include "engine/animation.h"
/* ── Projectile behavior flags ─────────────────────── */
#define PROJ_FROM_PLAYER (1 << 0) /* owned by player (vs enemy) */
#define PROJ_IMPACT (1 << 1) /* currently playing impact anim */
#define PROJ_PIERCING (1 << 2) /* passes through enemies */
#define PROJ_BOUNCY (1 << 3) /* bounces off walls */
#define PROJ_GRAVITY (1 << 4) /* affected by gravity */
#define PROJ_HOMING (1 << 5) /* tracks nearest target */
/* ── Projectile definition (weapon type) ───────────── */
/* Describes how a class of projectile behaves. */
/* These are static data - shared by all instances. */
typedef struct ProjectileDef {
const char *name; /* e.g. "plasma", "rocket" */
float speed; /* travel speed (px/s) */
int damage; /* damage per hit */
float lifetime; /* seconds before auto-destroy */
float gravity_scale; /* 0 = no gravity, 1 = full */
int pierce_count; /* 0 = destroy on first hit */
int bounce_count; /* 0 = destroy on wall hit */
float homing_strength;/* 0 = none, higher = tighter turn */
float hitbox_w; /* collision box width */
float hitbox_h; /* collision box height */
uint32_t flags; /* PROJ_* behavior flags */
const AnimDef *anim_fly; /* animation while flying */
const AnimDef *anim_impact; /* animation on hit (NULL = instant) */
} ProjectileDef;
/* ── Per-instance data ─────────────────────────────── */
typedef struct ProjectileData {
const ProjectileDef *def; /* shared definition */
uint32_t proj_flags; /* runtime flags (PROJ_FROM_PLAYER, PROJ_IMPACT) */
float lifetime; /* remaining lifetime */
int pierces_left; /* remaining pierces */
int bounces_left; /* remaining bounces */
} ProjectileData;
/* ── Built-in weapon definitions ───────────────────── */
extern const ProjectileDef WEAPON_PLASMA; /* player default */
extern const ProjectileDef WEAPON_SPREAD; /* 3-way fan */
extern const ProjectileDef WEAPON_LASER; /* fast, piercing */
extern const ProjectileDef WEAPON_ROCKET; /* slow, high damage */
extern const ProjectileDef WEAPON_BOUNCE; /* ricochets off walls */
extern const ProjectileDef WEAPON_ENEMY_FIRE; /* enemy fireball */
/* ── API ───────────────────────────────────────────── */
void projectile_register(EntityManager *em);
/* Spawn a projectile from a definition + direction vector */
Entity *projectile_spawn_def(EntityManager *em, const ProjectileDef *def,
Vec2 pos, Vec2 dir, bool from_player);
/* Convenience: spawn with default player/enemy weapon */
Entity *projectile_spawn_dir(EntityManager *em, Vec2 pos, Vec2 dir, bool from_player);
/* Legacy convenience: horizontal shot */
Entity *projectile_spawn(EntityManager *em, Vec2 pos, bool facing_left, bool from_player);
/* Trigger impact on a projectile (used by collision system) */
void projectile_hit(Entity *proj);
/* Check if a projectile is currently impacting (not collidable) */
bool projectile_is_impacting(const Entity *proj);
/* Check if a projectile belongs to the player */
bool projectile_is_from_player(const Entity *proj);
#endif /* JNR_PROJECTILE_H */