home · contact · privacy
Add basic food clock (but no consumables yet to re-set it).
[plomrogue] / src / server / things.h
index 365e308b4c4cb8da0ab67bca087c92ef92694171..494d1a5aade2461d07c723e9f10ab53c68abc0f5 100644 (file)
@@ -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,8 +11,8 @@
 #ifndef THINGS_H
 #define THINGS_H
 
-#include <stdint.h> /* uint8_t, int16_t */
-#include "../common/yx_uint8.h" /* yx_uint8 structs */
+#include <stdint.h> /* uint8_t, int16_t, uint16_t */
+#include "../common/yx_uint8.h" /* yx_uint8 */
 
 
 
@@ -21,6 +25,8 @@ struct Thing
     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 */
@@ -38,13 +44,15 @@ struct ThingInMemory
 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
@@ -71,7 +79,8 @@ 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);
 
@@ -79,10 +88,13 @@ extern struct Thing * add_thing(int16_t id, uint8_t type, uint8_t y, uint8_t x);
 extern void add_thing_to_memory_map(struct Thing * t, uint8_t type,
                                     uint8_t y, uint8_t x);
 
-/* Free ThingAction/ThingType/Thing chain starting at "ta"/"tt"/"t". */
+/* 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);
@@ -101,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.