X-Git-Url: https://plomlompom.com/repos/?a=blobdiff_plain;f=src%2Fserver%2Fthings.h;h=365e308b4c4cb8da0ab67bca087c92ef92694171;hb=3dedf6344c941891491773d1cc5d647aa664b218;hp=889374a80d5e3fabc36647459f145902f66fdbf2;hpb=1452d43c6d7c89219cda91362da53ac8e4acb887;p=plomrogue diff --git a/src/server/things.h b/src/server/things.h index 889374a..365e308 100644 --- a/src/server/things.h +++ b/src/server/things.h @@ -1,35 +1,44 @@ /* src/server/things.h * - * Structs for things and their type definitions, and routines to initialize - * these and load and save them from/to files. + * Structs for things and their type and action definitions, and routines to + * initialize these. */ #ifndef THINGS_H #define THINGS_H -#include /* uint8_t */ +#include /* uint8_t, int16_t */ #include "../common/yx_uint8.h" /* yx_uint8 structs */ struct Thing { - struct Thing * next; /* pointer to next one in things chain */ - struct Thing * owns; /* chain of things owned / in inventory */ - struct yx_uint8 pos; /* coordinate on map */ - uint8_t * fov_map; /* map of the thing's field of view */ - uint8_t id; /* individual thing's unique identifier */ - uint8_t type; /* ID of appropriate thing definition */ - uint8_t lifepoints; /* 0: thing is inanimate; >0: hitpoints */ - uint8_t command; /* thing's current action; 0 if none */ - uint8_t arg; /* optional field for .command argument */ - uint8_t progress; /* turns already passed to realize .command */ + struct Thing * next; + uint8_t id; /* individual thing's unique identifier */ + struct Thing * owns; /* chain of things owned / in inventory */ + struct ThingInMemory * t_mem; /* chain of things remembered */ + struct yx_uint8 pos; /* coordinate on map */ + char * fov_map; /* thing's FOV map; 'v':visible, 'H':hidden */ + char * mem_map; /* map knowledge of thing by FOV and memory */ + uint8_t type; /* ID of appropriate thing definition */ + uint8_t lifepoints; /* 0: thing is inanimate; >0: hitpoints */ + uint8_t command; /* thing's current action; 0 if none */ + uint8_t arg; /* optional field for .command argument */ + uint8_t progress; /* turns already passed to realize .command */ +}; + +struct ThingInMemory +{ + struct ThingInMemory * next; + struct yx_uint8 pos; /* position on memorized */ + uint8_t type; /* thing type identifier */ }; struct ThingType { - uint8_t id; /* thing type identifier / sets .type */ struct ThingType * next; + uint8_t id; /* thing type identifier / sets .type */ char char_on_map; /* thing symbol to appear on map */ char * name; /* string to describe thing in game log */ uint8_t corpse_id; /* type to change thing into upon destruction */ @@ -38,37 +47,69 @@ struct ThingType uint8_t start_n; /* how many of these does the map start with? */ }; +struct ThingAction +{ + struct ThingAction * next; + uint8_t id; /* identifies action in Thing.command; therefore must be >0 */ + void (* func) (struct Thing *); /* function called after .effort turns */ + char * name; /* human-readable identifier */ + uint8_t effort; /* how many turns the action takes */ +}; -/* Return thing of "id" in chain at "ptr", search inventories too if "deep". */ -extern struct Thing * get_thing(struct Thing * ptr, uint8_t id, uint8_t deep); -/* Free thing types chain starting at "tt_start". */ -extern void free_thing_types(struct ThingType * tt_start); +/* Add thing action of "id" to world.thing_actions, with .name defaulting to + * s[S_CMD_WAIT], .func to actor_wait() and .effort to 1. If "id" is not >= 1 + * and <= UINT8_MAX, use lowest unused id. Return thing action. + */ +extern struct ThingAction * add_thing_action(uint8_t id); -/* Add thing of "id" and "type" to map on random passable position (positions - * which contain an actor are not deemed passable) if "find_pos", else on y=0, - * x=0. If "id" is >= 0 and <= UINT8_MAX, use lowest unused id. Return thing. +/* Add thing type of "id" to world.thing_types, with .corpse_id defaulting to + * the new thing type's .id, .name to "(none)" and the remaining values to 0. If + * "id" is not >= 0 and <= UINT8_MAX, use lowest unused id. Return thing type. */ -extern struct Thing * add_thing(int16_t id, uint8_t type, uint8_t find_pos); +extern struct ThingType * add_thing_type(int16_t id); -/* Add thing(s) ("n": how many?) of "type" to map on random position(s). New - * animate things are never placed in the same square with other animate ones. +/* Add thing of "id" and "type" on position of "y"/x" to world.things. If "id" + * is not >= 0 and <= UINT8_MAX, use lowest unused id. Return thing. */ -extern void add_things(uint8_t type, uint8_t n); +extern struct Thing * add_thing(int16_t id, uint8_t type, uint8_t y, uint8_t x); -/* Free things in things chain starting at "t_start. */ -extern void free_things(struct Thing * t_start); +/* Add to thing memory of "t" thing of type id "type" and position "y"/"x". */ +extern void add_thing_to_memory_map(struct Thing * t, uint8_t type, + uint8_t y, uint8_t x); -/* Move thing of "id" from "source" inventory to "target" inventory. */ -extern void own_thing(struct Thing ** target, struct Thing ** source, - uint8_t id); +/* Free ThingAction/ThingType/Thing chain starting at "ta"/"tt"/"t". */ +extern void free_thing_actions(struct ThingAction * ta); +extern void free_thing_types(struct ThingType * tt); +extern void free_things(struct Thing * t); -/* Get pointer to the Thing struct that represents the player. */ +/* Return pointer to ThingAction/ThingType of "id", or NULL if none found. */ +extern struct ThingAction * get_thing_action(uint8_t id); +extern struct ThingType * get_thing_type(uint8_t id); + +/* Return world.thing_actions ThingAction.id for "name" or 0 if none found. */ +extern uint8_t get_thing_action_id_by_name(char * name); + +/* Return thing of "id" in chain at "ptr", search inventories too if "deep". + * Return NULL if nothing found. + */ +extern struct Thing * get_thing(struct Thing * ptr, uint8_t id, uint8_t deep); + +/* Get pointer to the non-owend Thing struct that represents the player, or NULL + * if none found. + */ extern struct Thing * get_player(); -/* Get pointer to the thing type of identifier "def_id". */ -extern struct ThingType * get_thing_type(uint8_t id); +/* Add thing(s) ("n": how many?) of "type" to map on random passable + * position(s). New animate things are never placed in the same square with + * other animate ones. + */ +extern void add_things(uint8_t type, uint8_t n); + +/* Move thing of "id" from "source" inventory to "target" inventory. */ +extern void own_thing(struct Thing ** target, struct Thing ** source, + uint8_t id); /* Move not only "t" to "pos", but also all things owned by it. */ extern void set_thing_position(struct Thing * t, struct yx_uint8 pos);