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.
82 lines
3.5 KiB
C
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 */
|