X-Git-Url: https://plomlompom.com/repos/?a=blobdiff_plain;f=src%2Fserver%2Fthings.h;h=494d1a5aade2461d07c723e9f10ab53c68abc0f5;hb=3fb2cb493ae564f8b14ddb4143b6c1f5bf16f16a;hp=4c21c451f6d3730ae5c2eecded046daa4173431b;hpb=3cb6ed6453b22eba62f7c9186790813b0abebeb9;p=plomrogue diff --git a/src/server/things.h b/src/server/things.h index 4c21c45..494d1a5 100644 --- a/src/server/things.h +++ b/src/server/things.h @@ -1,4 +1,8 @@ /* src/server/things.h + * + * This file is part of PlomRogue. PlomRogue is licensed under the GPL version 3 + * or any later version. For details on its copyright, license, and warranties, + * see the file NOTICE in the root directory of the PlomRogue source package. * * Structs for things and their type and action definitions, and routines to * initialize these. @@ -7,36 +11,48 @@ #ifndef THINGS_H #define THINGS_H -#include /* uint8_t, int16_t */ -#include "../common/yx_uint8.h" /* yx_uint8 structs */ +#include /* uint8_t, int16_t, uint16_t */ +#include "../common/yx_uint8.h" /* yx_uint8 */ struct Thing { struct Thing * next; - uint8_t id; /* individual thing's unique identifier */ - struct Thing * owns; /* chain of things owned / in inventory */ - struct yx_uint8 pos; /* coordinate on map */ - char * fov_map; /* map of the thing's field of view */ - 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 */ + 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 */ + char * mem_depth_map; /* map of map memory up-to-dateness */ + int16_t satiation; /* negative: hungry; positive: over-fed */ + 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 { 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 */ - uint8_t lifepoints; /* default start value for thing's .lifepoints */ - uint8_t consumable; /* can be eaten if !0, for so much hitpoint win */ - uint8_t start_n; /* how many of these does the map start with? */ + 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 */ + uint16_t stomach; /* if >0, defines onset & chance of hunger suffering */ + uint8_t corpse_id; /* type to change thing into upon destruction */ + uint8_t lifepoints; /* default start value for thing's .lifepoints */ + uint8_t consumable; /* can be eaten if !0, for so much hitpoint win */ + uint8_t start_n; /* how many of these does the map start with? */ + uint8_t proliferate; /* if >0: inverse of chance to proliferate */ }; struct ThingAction @@ -63,14 +79,22 @@ extern struct ThingAction * add_thing_action(uint8_t id); extern struct ThingType * add_thing_type(int16_t id); /* 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. + * is not >= 0 and <= UINT8_MAX, use lowest unused id. Build .fov_map if + * world.exists is non-zero. Return thing. */ extern struct Thing * add_thing(int16_t id, uint8_t type, uint8_t y, uint8_t x); -/* Free ThingAction/ThingType/Thing * chain starting at "ta"/"tt"/"t". */ +/* 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); + +/* Free ThingAction / ThingType / Thing / ThingInMemory chain starting at "ta" / + * "tt" / "t" / "tm". + */ extern void free_thing_actions(struct ThingAction * ta); extern void free_thing_types(struct ThingType * tt); extern void free_things(struct Thing * t); +extern void free_things_in_memory(struct ThingInMemory * tm); /* Return pointer to ThingAction/ThingType of "id", or NULL if none found. */ extern struct ThingAction * get_thing_action(uint8_t id); @@ -89,6 +113,12 @@ extern struct Thing * get_thing(struct Thing * ptr, uint8_t id, uint8_t deep); */ extern struct Thing * get_player(); +/* Try to create "t" offspring on random passable neighbor cell if available + * (and, if "t" is of animate thing type, not inhabited by animate thing) and + * "t"'s type's .proliferation is >0, with a chance of 1/.proliferation. + */ +extern void try_thing_proliferation(struct Thing * t); + /* 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.