home · contact · privacy
Server: Add regeneration of lifepoints on positive satiation values.
authorChristian Heller <c.heller@plomlompom.de>
Sun, 15 Feb 2015 04:37:03 +0000 (05:37 +0100)
committerChristian Heller <c.heller@plomlompom.de>
Sun, 15 Feb 2015 04:37:03 +0000 (05:37 +0100)
SERVER_COMMANDS
src/server/run.c
src/server/thing_actions.c
src/server/thing_actions.h

index 3036c0478471262732bcc93a1ddfbc4fc46f665e..90877ba56802c42a6fcc03f0766943aab58914f9 100644 (file)
@@ -166,7 +166,10 @@ T_LIFEPOINTS [0 to 255]
 Set selected thing's lifepoints to argument.
 
 T_SATIATION [-32768 to 32767]
-Set selected thing's satiation score. 
+Set selected thing's satiation score. If above zero, and thing's lifepoints are
+below its thing type's initial lifepoints, there is a 1/32 chance each turn of
+waiting action that the thing's lifepoints will rise. For values affecting the
+thing's lifepoints negatively, see note on TT_LIFEPOINTS.
 
 T_CARRIES [0 to 255]
 Add thing of ID in argument to inventory of selected thing, if said thing is
@@ -203,8 +206,8 @@ Set selected thing type's initial lifepoints value to argument. Things of 0
 lifepoints are considered inanimate, otherwise animate. This value also sets the
 degree to which the selected type's things suffer from under- or over-satiation:
 If 0, not at all. Else, it defines a stomach size value of 32767 divided by it.
-Each turn a thing of the given tpe may then suffer a lifepoint decrement to the
-change of the rounded down quotient of its satiation score's absolute value by
+Each turn a thing of the given type may then suffer a lifepoint decrement to the
+chance of the rounded down quotient of its satiation score's absolute value by
 its stomach size value, then again divided by the latter. (This means that the
 change is always zero when the absolute value of the satiation score is lower
 than the stomach size value.)
index 212a37e16d62d6adb9a957b0cb11aa1136769e41..11735d02c8c8ea93c19c025f5dfe3bb5d4827b75 100644 (file)
@@ -30,7 +30,7 @@
 #include "god_commands.h" /* parse_god_command_(1|2|3)arg() */
 #include "hardcoded_strings.h" /* s */
 #include "io.h" /* io_round(), save_world() */
-#include "thing_actions.h" /* hunger() */
+#include "thing_actions.h" /* hunger(), try_healing() */
 #include "things.h" /* Thing, ThingType, ThingInMemory, get_player(),
                      * get_thing_action_id_by_name(), try_thing_proliferation()
                      */
@@ -335,6 +335,7 @@ static void turn_over()
                     }
                     ai(thing);
                 }
+                try_healing(thing);
                 thing->progress++;
                 struct ThingAction * ta = get_thing_action(thing->command);
                 if (thing->progress == ta->effort)
index dea23323bcf6b7a9f2b43974b5af180720d55faa..2a682c277356f0e4deae6b8bef0ba08a5f936ab3 100644 (file)
@@ -330,6 +330,34 @@ extern void actor_use(struct Thing * t)
 
 
 
+extern void try_healing(struct Thing * t)
+{
+    struct ThingType * tt = get_thing_type(t->type);
+    if (   t->satiation > 0 && t->lifepoints < tt->lifepoints
+        && 0 == (rrand() % 31)
+        && get_thing_action_id_by_name(s[S_CMD_WAIT]) == t->command)
+    {
+        t->lifepoints++;
+        t->satiation = t->satiation - 32;
+        if (get_player() == t)
+        {
+            update_log("You heal.");
+        }
+        else
+        {
+            char * msg_part = " heals.";
+            uint8_t len = strlen(tt->name) + strlen(msg_part) + 1;
+            char * msg = try_malloc(len, __func__);
+            int test = sprintf(msg, "%s%s", tt->name, msg_part);
+            exit_trouble(test < 0, __func__, s[S_FCN_SPRINTF]);
+            update_log(msg);
+            free(msg);
+        }
+    }
+}
+
+
+
 extern void hunger(struct Thing * t)
 {
     if (t->satiation > INT16_MIN)
index ebdd871f02724159368ab56f982b9560eeede0c7..97ab3cca20641b5106c96a1f144a028ebd11c603 100644 (file)
@@ -38,6 +38,12 @@ extern void actor_pick(struct Thing * t);
  */
 extern void actor_use(struct Thing * t);
 
+/* Increment "t"'s lifepoints to a 1/32 chance if its .satiation is positive,
+ * its lifepoints are below "t"'s type's .lifepoints, and "t"'s .command is the
+ * ID of the waiting action. On success, also decrement .satiation by by 32.
+ */
+extern void try_healing(struct Thing * t);
+
 /* Decrement "t"'s satiation and trigger a chance (dependent on over-/under-
  * satiation value) of lifepoint decrement.
  */