Files
major_tom/src/game/entity_registry.h
Thomas bb0b9ddce1 Add jetpack fuel pickup and slow base recharge to 30s
Jetpack charges now take 30s to passively recharge (up from 3s),
making fuel management a core gameplay loop. A new fuel canister
powerup (POWERUP_FUEL) restores exactly one charge on pickup.

The existing jetpack powerup remains as the rare full-refill + 15s
boost. Fuel pickups replace most procedural jetpack spawns at higher
spawn rates to compensate for the weaker per-pickup value. Fuel
canisters also appear in corridors and arenas.

Adds orange canister pixel art, editor icon, entity registry entry,
and places fuel pickups throughout moon01.
2026-03-01 18:06:32 +00:00

82 lines
3.5 KiB
C

#ifndef JNR_ENTITY_REGISTRY_H
#define JNR_ENTITY_REGISTRY_H
#include "engine/entity.h"
#include <SDL2/SDL.h>
/* ═══════════════════════════════════════════════════
* Entity Registry
*
* Central table that maps entity type name strings
* to their spawn functions and metadata. Used by:
* - Level loader (to spawn entities from .lvl files)
* - Level editor (to discover available entity types)
*
* When adding a new entity type to the game, add one
* entry here and it will appear in the editor palette
* automatically.
* ═══════════════════════════════════════════════════ */
#define MAX_REGISTRY_ENTRIES 32
/* Spawn function: creates an entity at position, returns it */
typedef Entity *(*EntitySpawnFn)(EntityManager *em, Vec2 pos);
/* ── Editor mini-icon indices ────────────────────── */
/* Shared between the editor (bitmap definitions) and
* the registry (icon field in each entry). Keep in
* sync with s_icon_bitmaps[] in editor.c. */
typedef enum EditorIcon {
ICON_GRUNT = 0, /* spiky enemy */
ICON_FLYER = 1, /* bat / wing */
ICON_TURRET = 2, /* cannon */
ICON_PLATFORM = 3, /* horizontal bar */
ICON_PLATFORM_V = 4, /* vertical bar */
ICON_FLAME = 5, /* fire / flame vent */
ICON_FORCEFIELD = 6, /* electric field */
ICON_HEART = 7, /* health pickup */
ICON_BOLT = 8, /* jetpack / lightning */
ICON_FUEL = 9, /* fuel canister */
ICON_DRONE = 10, /* drone companion */
ICON_GUN = 11, /* weapon pickup */
ICON_ASTEROID = 12, /* rock */
ICON_SPACECRAFT = 13, /* ship */
ICON_COUNT,
ICON_NONE = -1 /* no icon (fallback) */
} EditorIcon;
typedef struct EntityRegEntry {
const char *name; /* .lvl file name, e.g. "grunt" */
const char *display; /* human-readable, e.g. "Grunt" */
EntitySpawnFn spawn_fn; /* function that creates the entity */
SDL_Color color; /* editor palette color for preview */
int width; /* hitbox width (for editor preview) */
int height; /* hitbox height (for editor preview) */
int icon; /* editor mini-icon index (-1 = none) */
} EntityRegEntry;
typedef struct EntityRegistry {
EntityRegEntry entries[MAX_REGISTRY_ENTRIES];
int count;
} EntityRegistry;
/* Global registry instance */
extern EntityRegistry g_entity_registry;
/* Call once at startup to populate the registry.
* Also registers entity behaviors with the given EntityManager. */
void entity_registry_init(EntityManager *em);
/* Populate only the registry table (names, colors, icons) without
* registering entity behaviors. Safe to call without an EntityManager.
* Used by the editor when it starts without a prior level load. */
void entity_registry_populate(void);
/* Look up a registry entry by name (returns NULL if not found) */
const EntityRegEntry *entity_registry_find(const char *name);
/* Spawn an entity by registry name. Returns NULL if name unknown. */
Entity *entity_registry_spawn(EntityManager *em, const char *name, Vec2 pos);
#endif /* JNR_ENTITY_REGISTRY_H */