Neue ChangeState(): zum Beschreibungswechsel

Kraeuter bekommen ein reset(), welches am Ende der
Lebensdauer ChangeState() aufruft, damit die
Beschreibungen aktualisiert werden koennen (aber nur
einmal).
Ebenso wird ChangeState() von DryPlant() gerufen.
ChangeState() setzt auch den neuen Zustand.
Nutzung vom state statt Berechnung nach Zeitstempeln
in short().

Change-Id: Ief1cbdd3a73b0360c708717978b33ffdac8bcf19
diff --git a/std/items/kraeuter/kraut.c b/std/items/kraeuter/kraut.c
index e43bfb8..a89de09 100644
--- a/std/items/kraeuter/kraut.c
+++ b/std/items/kraeuter/kraut.c
@@ -40,11 +40,13 @@
     return;
   }
   ::create();
- 
+
   Set(P_QUALITY, function int () { return quality; }, F_QUERY_METHOD);
   SetProp(P_WEIGHT, 120);
   SetProp(P_VALUE, 70);
   SetProp(P_MATERIAL, MAT_MISC_PLANT);
+  // Zeitpunkt des Verfaulens
+  set_next_reset(FRESH_TIME + PLANT_LIFETIME);
 }
 
 protected void create_super()
@@ -52,6 +54,39 @@
   set_next_reset(-1);
 }
 
+// wird gerufen, wenn sich der Zustand des Krautes (frisch, getrocknet,
+// verfault) aendert. Kann genutzt werden, um die Beschreibung des Krautes zu
+// aendern.
+protected void ChangeState(int newstate)
+{
+  state = newstate;
+  // Vorlaeufig muessen erbende Kraeuter die Beschreibung aendern.
+  // Mittelfristig soll es dieses Objekt aber machen.
+}
+
+void reset()
+{
+  // wenn getrocknet oder schon verfault, wurden die Beschreibungen bereits
+  // dabei geaendert und dieses reset() muss nix machen.
+  if ( state == PLANT_DRIED || state == PLANT_EXPIRED )
+      return;
+  // Ist es (frisch) verfault?
+  else if (object_time() + FRESH_TIME + PLANT_LIFETIME < time())
+  {
+    // ja, Zustand aendern
+    ChangeState(PLANT_EXPIRED);
+  }
+  else
+  {
+    // noch frisch genug -> keine Aenderung.
+    // Evtl. hat jemand am Reset rumgespielt oder ein Krautautor benutzt den
+    // reset auch fuer andere Zwecke... Nix machen, aber sicherstellen, dass
+    // der naechste Reset spaetestens am Ende der Lebensdauer passiert...
+    set_next_reset(min(object_time() + FRESH_TIME + PLANT_LIFETIME,
+                       query_next_reset()));
+  }
+}
+
 public string short()
 {
   string str=QueryProp(P_SHORT);
@@ -61,7 +96,7 @@
       return str+" (unwirksam).\n";
   else if (state==PLANT_DRIED)
      return str+" (getrocknet).\n";
-  else if (object_time() + FRESH_TIME + PLANT_LIFETIME < time())
+  else if (state==PLANT_EXPIRED)
      return str+" (verfault).\n";
   return str+".\n";
 }
@@ -160,7 +195,7 @@
     return;
   }
   // Kraut als getrocknet kennzeichnen.
-  state=PLANT_DRIED;
+  ChangeState(PLANT_DRIED);
   quality = qual;
 }