X-Git-Url: https://plomlompom.com/repos/index.html?a=blobdiff_plain;ds=sidebyside;f=src%2Fserver%2Fthings.h;h=4c21c451f6d3730ae5c2eecded046daa4173431b;hb=3cb6ed6453b22eba62f7c9186790813b0abebeb9;hp=889374a80d5e3fabc36647459f145902f66fdbf2;hpb=1452d43c6d7c89219cda91362da53ac8e4acb887;p=plomrogue
diff --git a/src/server/things.h b/src/server/things.h
index 889374a..4c21c45 100644
--- a/src/server/things.h
+++ b/src/server/things.h
@@ -1,24 +1,25 @@
/* 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 * 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 */
- uint8_t * fov_map; /* map of the thing's field of view */
- uint8_t id; /* individual thing's unique identifier */
+ 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 */
@@ -28,8 +29,8 @@ struct Thing
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 +39,65 @@ 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);
+/* 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);
-/* Move thing of "id" from "source" inventory to "target" inventory. */
-extern void own_thing(struct Thing ** target, struct Thing ** source,
- uint8_t id);
+/* 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);
-/* Get pointer to the Thing struct that represents the player. */
+/* 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);