3 * This file is part of PlomRogue. PlomRogue is licensed under the GPL version 3
4 * or any later version. For details on its copyright, license, and warranties,
5 * see the file NOTICE in the root directory of the PlomRogue source package.
7 * Structs for things and their type and action definitions, and routines to
14 #include <stdint.h> /* uint8_t, int16_t */
15 #include "../common/yx_uint8.h" /* yx_uint8 */
22 uint8_t id; /* individual thing's unique identifier */
23 struct Thing * owns; /* chain of things owned / in inventory */
24 struct ThingInMemory * t_mem; /* chain of things remembered */
25 struct yx_uint8 pos; /* coordinate on map */
26 char * fov_map; /* thing's FOV map; 'v':visible, 'H':hidden */
27 char * mem_map; /* map knowledge of thing by FOV and memory */
28 uint8_t type; /* ID of appropriate thing definition */
29 uint8_t lifepoints; /* 0: thing is inanimate; >0: hitpoints */
30 uint8_t command; /* thing's current action; 0 if none */
31 uint8_t arg; /* optional field for .command argument */
32 uint8_t progress; /* turns already passed to realize .command */
37 struct ThingInMemory * next;
38 struct yx_uint8 pos; /* position on memorized */
39 uint8_t type; /* thing type identifier */
44 struct ThingType * next;
45 uint8_t id; /* thing type identifier / sets .type */
46 char char_on_map; /* thing symbol to appear on map */
47 char * name; /* string to describe thing in game log */
48 uint8_t corpse_id; /* type to change thing into upon destruction */
49 uint8_t lifepoints; /* default start value for thing's .lifepoints */
50 uint8_t consumable; /* can be eaten if !0, for so much hitpoint win */
51 uint8_t start_n; /* how many of these does the map start with? */
56 struct ThingAction * next;
57 uint8_t id; /* identifies action in Thing.command; therefore must be >0 */
58 void (* func) (struct Thing *); /* function called after .effort turns */
59 char * name; /* human-readable identifier */
60 uint8_t effort; /* how many turns the action takes */
65 /* Add thing action of "id" to world.thing_actions, with .name defaulting to
66 * s[S_CMD_WAIT], .func to actor_wait() and .effort to 1. If "id" is not >= 1
67 * and <= UINT8_MAX, use lowest unused id. Return thing action.
69 extern struct ThingAction * add_thing_action(uint8_t id);
71 /* Add thing type of "id" to world.thing_types, with .corpse_id defaulting to
72 * the new thing type's .id, .name to "(none)" and the remaining values to 0. If
73 * "id" is not >= 0 and <= UINT8_MAX, use lowest unused id. Return thing type.
75 extern struct ThingType * add_thing_type(int16_t id);
77 /* Add thing of "id" and "type" on position of "y"/x" to world.things. If "id"
78 * is not >= 0 and <= UINT8_MAX, use lowest unused id. Return thing.
80 extern struct Thing * add_thing(int16_t id, uint8_t type, uint8_t y, uint8_t x);
82 /* Add to thing memory of "t" thing of type id "type" and position "y"/"x". */
83 extern void add_thing_to_memory_map(struct Thing * t, uint8_t type,
84 uint8_t y, uint8_t x);
86 /* Free ThingAction / ThingType / Thing / ThingInMemory chain starting at "ta" /
89 extern void free_thing_actions(struct ThingAction * ta);
90 extern void free_thing_types(struct ThingType * tt);
91 extern void free_things(struct Thing * t);
92 extern void free_things_in_memory(struct ThingInMemory * tm);
94 /* Return pointer to ThingAction/ThingType of "id", or NULL if none found. */
95 extern struct ThingAction * get_thing_action(uint8_t id);
96 extern struct ThingType * get_thing_type(uint8_t id);
98 /* Return world.thing_actions ThingAction.id for "name" or 0 if none found. */
99 extern uint8_t get_thing_action_id_by_name(char * name);
101 /* Return thing of "id" in chain at "ptr", search inventories too if "deep".
102 * Return NULL if nothing found.
104 extern struct Thing * get_thing(struct Thing * ptr, uint8_t id, uint8_t deep);
106 /* Get pointer to the non-owend Thing struct that represents the player, or NULL
109 extern struct Thing * get_player();
111 /* Add thing(s) ("n": how many?) of "type" to map on random passable
112 * position(s). New animate things are never placed in the same square with
113 * other animate ones.
115 extern void add_things(uint8_t type, uint8_t n);
117 /* Move thing of "id" from "source" inventory to "target" inventory. */
118 extern void own_thing(struct Thing ** target, struct Thing ** source,
121 /* Move not only "t" to "pos", but also all things owned by it. */
122 extern void set_thing_position(struct Thing * t, struct yx_uint8 pos);