world.h (6628B)
1 #ifndef PH_ENGINE_WORLD_H 2 #define PH_ENGINE_WORLD_H 3 4 #include <stddef.h> 5 6 #define PH_CONFIG_API_VERSION 17 7 8 enum { 9 PH_MAP_MAGIC = 0x50484d50, 10 PH_MAP_VERSION = 3, 11 PH_AREA_NAME_MAX = 64, 12 PH_TILE_SIZE = 16, 13 PH_MAX_ENTITY_TYPES = 32, 14 PH_MAX_ITEM_TYPES = 64, 15 PH_MAX_ENTITIES = 128, 16 PH_MAX_GROUND_ITEMS = 128, 17 PH_MAX_WORLD_EVENTS = 64, 18 PH_NOTICE_SIZE = 96, 19 PH_ANIMATION_FRAMES = 4, 20 }; 21 22 #define PH_TILE_CENTER(tile) ((float)((tile) * PH_TILE_SIZE + PH_TILE_SIZE / 2)) 23 24 typedef enum { 25 PH_EQUIP_NONE, 26 PH_EQUIP_WEAPON, 27 PH_EQUIP_ARMOR, 28 PH_EQUIP_CHARM, 29 PH_EQUIP_COUNT, 30 } PhEquipSlot; 31 32 typedef enum { 33 PH_ITEM_USE_NONE, 34 PH_ITEM_USE_HEAL, 35 PH_ITEM_USE_RESTORE_MP, 36 } PhItemUse; 37 38 typedef enum { 39 PH_WORLD_EVENT_NONE, 40 PH_WORLD_EVENT_MOVE, 41 PH_WORLD_EVENT_INTERACT, 42 PH_WORLD_EVENT_ITEM_PICKUP, 43 PH_WORLD_EVENT_ITEM_DROP, 44 PH_WORLD_EVENT_BUY, 45 PH_WORLD_EVENT_SELL, 46 } PhWorldEventKind; 47 48 typedef enum { 49 PH_ENTITY_PLAYER = 1, 50 PH_ENTITY_MONSTER, 51 PH_ENTITY_NPC, 52 } PhEntityKind; 53 54 enum { 55 PH_SPRITE_DOWN, 56 PH_SPRITE_UP, 57 PH_SPRITE_SIDE, 58 PH_SPRITE_DIRECTIONS, 59 }; 60 61 typedef struct { 62 float x; 63 float y; 64 } PhVec2; 65 66 typedef struct { 67 PhWorldEventKind kind; 68 PhVec2 pos; 69 int entity_index; 70 } PhWorldEvent; 71 72 typedef struct { 73 int max_hp; 74 int max_mp; 75 int strength; 76 int defense; 77 int magic; 78 int magic_defense; 79 int agility; 80 int luck; 81 int evasion; 82 int accuracy; 83 } PhStats; 84 85 typedef struct { 86 int hp; 87 int mp; 88 } PhVitals; 89 90 typedef struct { 91 PhVec2 target; 92 float credit; 93 float animation_distance; 94 int facing_x; 95 int facing_y; 96 int moving; 97 } PhEntityMotion; 98 99 typedef struct { 100 PhVec2 home; 101 PhVec2 last_seen; 102 int territory_radius; 103 int chase_turns; 104 } PhEntityBehavior; 105 106 typedef struct { 107 int value; 108 int turns; 109 } PhTimedEffect; 110 111 typedef struct { 112 int xp; 113 int item_id; 114 int amount; 115 } PhReward; 116 117 typedef struct { 118 char text[PH_NOTICE_SIZE]; 119 float seconds; 120 } PhNotice; 121 122 typedef struct { 123 unsigned char symbol; 124 int blocks_movement; 125 int asset_id; 126 int sprite_tile_x; 127 int sprite_tile_y; 128 int background_asset_id; 129 int background_sprite_tile_x; 130 int background_sprite_tile_y; 131 int autotile; 132 int autotile_width; 133 int autotile_height; 134 const char *interaction_notice; 135 } PhTileDef; 136 137 enum { 138 PH_TILE_AUTOTILE_NONE, 139 PH_TILE_AUTOTILE_3X3, 140 PH_TILE_AUTOTILE_FIXED, 141 }; 142 143 typedef struct { 144 int id; 145 const char *name; 146 PhStats stats; 147 int move_speed; 148 int vision; 149 int aggressive; 150 int starting_gold; 151 int interaction_id; 152 PhReward reward; 153 int asset_id; 154 int sprite_tiles[PH_SPRITE_DIRECTIONS][PH_ANIMATION_FRAMES][2]; 155 int animation_frames; 156 int blocks_movement; 157 PhEntityKind kind; 158 } PhEntityDef; 159 160 typedef struct { 161 int id; 162 const char *name; 163 const char *description; 164 int buy_value; 165 int sell_value; 166 PhStats bonuses; 167 PhEquipSlot equip_slot; 168 PhItemUse use; 169 int use_power; 170 int asset_id; 171 int sprite_tile_x; 172 int sprite_tile_y; 173 } PhItemDef; 174 175 typedef struct { 176 const PhEntityDef *entities; 177 const PhItemDef *items; 178 int entity_count; 179 int item_count; 180 } PhWorldCatalog; 181 182 typedef struct { 183 int type_id; 184 int area_id; 185 PhVec2 pos; 186 PhEntityMotion motion; 187 PhEntityBehavior behavior; 188 PhVitals vitals; 189 int xp; 190 int gold; 191 PhTimedEffect accuracy; 192 int equipment[PH_EQUIP_COUNT]; 193 int active; 194 } PhEntity; 195 196 typedef struct { 197 int item_id; 198 int area_id; 199 PhVec2 pos; 200 int amount; 201 int active; 202 } PhGroundItem; 203 204 typedef struct { 205 int area_id; 206 PhEntity *entities; 207 PhGroundItem *ground_items; 208 int entity_count; 209 int ground_item_count; 210 } PhAreaState; 211 212 typedef struct { 213 unsigned char symbol; 214 int tile_x; 215 int tile_y; 216 } PhAreaMarker; 217 218 typedef struct { 219 const char *name; 220 int width; 221 int height; 222 unsigned char *tiles; 223 PhAreaMarker *markers; 224 int marker_count; 225 int owns_tiles; 226 const PhTileDef *tile_defs; 227 int tile_def_count; 228 } PhArea; 229 230 typedef struct { 231 PhArea area; 232 PhWorldCatalog content; 233 PhEntity entities[PH_MAX_ENTITIES]; 234 PhGroundItem ground_items[PH_MAX_GROUND_ITEMS]; 235 int player_index; 236 int area_id; 237 int entity_count; 238 int ground_item_count; 239 int inventory[PH_MAX_ITEM_TYPES]; 240 PhAreaState *area_states; 241 int area_state_capacity; 242 int initialized_area_count; 243 int encounter_index; 244 int combat_active; 245 int interaction_id; 246 unsigned int rng_state; 247 PhNotice notice; 248 PhWorldEvent events[PH_MAX_WORLD_EVENTS]; 249 int event_head; 250 int event_count; 251 /* Diagnostic only: rejected events since initialization; not persisted. */ 252 unsigned int event_dropped; 253 } PhWorld; 254 255 typedef struct { 256 int move_x; 257 int move_y; 258 int interact; 259 } PhInput; 260 261 int ph_area_load(PhArea *area, const char *path); 262 void ph_area_free(PhArea *area); 263 void ph_world_destroy(PhWorld *world); 264 265 int ph_world_init(PhWorld *world, PhArea area, int area_id, 266 PhWorldCatalog content); 267 void ph_world_enter_area(PhWorld *world, PhArea area, int area_id, 268 PhVec2 player_pos); 269 int ph_world_spawn_entity(PhWorld *world, int type_id, PhVec2 pos, 270 int territory_radius, int area_id); 271 int ph_world_drop_item(PhWorld *world, int item_id, PhVec2 pos, int amount, 272 int area_id); 273 void ph_world_set_player(PhWorld *world, int entity_index); 274 int ph_world_equip_item(PhWorld *world, int entity_index, int item_id); 275 int ph_world_equip_inventory_item(PhWorld *world, int entity_index, int item_id); 276 int ph_world_use_inventory_item(PhWorld *world, int entity_index, int item_id); 277 int ph_world_drop_inventory_item(PhWorld *world, int entity_index, int item_id); 278 int ph_world_emit_event(PhWorld *world, PhWorldEventKind kind, PhVec2 pos, 279 int entity_index); 280 int ph_world_take_event(PhWorld *world, PhWorldEvent *event); 281 int ph_world_buy_item(PhWorld *world, int entity_index, int item_id); 282 int ph_world_sell_item(PhWorld *world, int entity_index, int item_id); 283 int ph_world_physical_attack(PhWorld *world, int attacker_index, int target_index); 284 int ph_world_magic_attack(PhWorld *world, int attacker_index, int target_index, 285 int mp_cost, int power); 286 int ph_world_apply_accuracy_penalty(PhWorld *world, int entity_index, 287 int percent, int turns); 288 void ph_world_advance_effects(PhWorld *world, int entity_index); 289 int ph_world_finish_encounter(PhWorld *world, int enemy_index); 290 void ph_world_tick(PhWorld *world, PhInput input, float dt); 291 292 const PhEntity *ph_world_player(const PhWorld *world); 293 const PhEntityDef *ph_world_entity_def(const PhWorld *world, int type_id); 294 const PhItemDef *ph_world_item_def(const PhWorld *world, int item_id); 295 int ph_world_item_amount(const PhWorld *world, int item_id); 296 PhStats ph_world_entity_stats(const PhWorld *world, const PhEntity *entity); 297 int ph_entity_animation_frame(const PhEntityDef *def, const PhEntity *entity); 298 const PhTileDef *ph_area_tile_def(const PhArea *area, int tx, int ty); 299 int ph_area_tile_blocked(const PhArea *area, int tx, int ty); 300 301 #endif