blob: 98b8516a60d6364ccb59165da2c3ef02396a32a5 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001// (c) September 2000 by Padreic (Padreic@mg.mud.de)
2
3#pragma strong_types, save_types, rtt_checks
4
5inherit "/std/thing";
6
7#include <properties.h>
8#include <items/kraeuter/kraeuter.h>
9
10#define PLANT_LIFETIME (24*3600)
11#define FRESH_TIME (6*3600)
12// Die plantID wird fuer ungueltig erschaffene Kraeuter auf -1 gesetzt.
MG Mud User88f12472016-06-24 23:31:02 +020013
Zesstraf9997f02018-07-30 21:01:25 +020014private int state;
MG Mud User88f12472016-06-24 23:31:02 +020015// enthaelt die Nummer des Krauts
16private int plantId;
17// enthaelt den Pfad des clonenden Objekts
18private string cloner;
19// Qualitaet des Krautes.
20private int quality=100;
21
22// File kann ein name sein, dessen Eigenschaften der VC konfigurieren sein
23// oder 0, wenn er selber ermitteln soll, was fuer ein File er gerade erzeugt
24// hat.
25// Sprich: real existierende Files auf der Platte muessen da ihren Namen
26// angeben, Standardfall ist aber, dass man 0 angibt und der VC weiss, was er
27// gerade erzeugt hat.
28void customizeMe(string file)
29{
30 if (stringp(file))
31 file=explode(file, "/")[<1];
32 KRAEUTERVC->CustomizeObject(file);
33}
34
35protected void create()
36{
37 if (object_name(this_object()) == __FILE__[0..<3])
38 {
39 set_next_reset(-1);
40 return;
41 }
42 ::create();
Zesstrabdf8be22018-07-30 21:31:21 +020043
MG Mud User88f12472016-06-24 23:31:02 +020044 Set(P_QUALITY, function int () { return quality; }, F_QUERY_METHOD);
45 SetProp(P_WEIGHT, 120);
46 SetProp(P_VALUE, 70);
47 SetProp(P_MATERIAL, MAT_MISC_PLANT);
Zesstrabdf8be22018-07-30 21:31:21 +020048 // Zeitpunkt des Verfaulens
49 set_next_reset(FRESH_TIME + PLANT_LIFETIME);
MG Mud User88f12472016-06-24 23:31:02 +020050}
51
52protected void create_super()
53{
54 set_next_reset(-1);
55}
56
Zesstrabdf8be22018-07-30 21:31:21 +020057// wird gerufen, wenn sich der Zustand des Krautes (frisch, getrocknet,
58// verfault) aendert. Kann genutzt werden, um die Beschreibung des Krautes zu
59// aendern.
60protected void ChangeState(int newstate)
61{
62 state = newstate;
63 // Vorlaeufig muessen erbende Kraeuter die Beschreibung aendern.
64 // Mittelfristig soll es dieses Objekt aber machen.
65}
66
67void reset()
68{
69 // wenn getrocknet oder schon verfault, wurden die Beschreibungen bereits
70 // dabei geaendert und dieses reset() muss nix machen.
71 if ( state == PLANT_DRIED || state == PLANT_EXPIRED )
72 return;
73 // Ist es (frisch) verfault?
74 else if (object_time() + FRESH_TIME + PLANT_LIFETIME < time())
75 {
76 // ja, Zustand aendern
77 ChangeState(PLANT_EXPIRED);
78 }
79 else
80 {
81 // noch frisch genug -> keine Aenderung.
82 // Evtl. hat jemand am Reset rumgespielt oder ein Krautautor benutzt den
83 // reset auch fuer andere Zwecke... Nix machen, aber sicherstellen, dass
84 // der naechste Reset spaetestens am Ende der Lebensdauer passiert...
85 set_next_reset(min(object_time() + FRESH_TIME + PLANT_LIFETIME,
86 query_next_reset()));
87 }
88}
89
MG Mud User88f12472016-06-24 23:31:02 +020090public string short()
91{
92 string str=QueryProp(P_SHORT);
93 if (!stringp(str))
94 return 0;
95 if (plantId==-1)
96 return str+" (unwirksam).\n";
Zesstrae46e7ee2018-07-30 21:13:53 +020097 else if (state==PLANT_DRIED)
MG Mud User88f12472016-06-24 23:31:02 +020098 return str+" (getrocknet).\n";
Zesstrabdf8be22018-07-30 21:31:21 +020099 else if (state==PLANT_EXPIRED)
MG Mud User88f12472016-06-24 23:31:02 +0200100 return str+" (verfault).\n";
101 return str+".\n";
102}
103
104// Liefert einen Skalierungsfaktor zurueck, der mit dem aktuellen Wert von
105// P_QUALITY verrechnet wird. Rueckgabewerte:
106// Pflanze getrocknet oder nicht aelter als 6 h : 100
107// Pflanze aelter als 6, aber juenger als 30 h : 99...1
108// Pflanze aelter als 30 h: 0.
109// DryPlant() zerstoert das Kraut, wenn P_QUALITY unter 1 faellt.
110public int PlantQuality()
111{
112 int factor;
113 // schon getrocknet oder nicht aelter als 6 h?
Zesstraf9997f02018-07-30 21:01:25 +0200114 // Dann keine (weitere) Reduktion.
Zesstrae46e7ee2018-07-30 21:13:53 +0200115 if ( state == PLANT_DRIED || object_time() + FRESH_TIME > time())
MG Mud User88f12472016-06-24 23:31:02 +0200116 factor = 100;
117 // >30 Stunden nach dem Pfluecken ist das Kraut verschimmelt.
Zesstraf9997f02018-07-30 21:01:25 +0200118 else if ( object_time() + FRESH_TIME + PLANT_LIFETIME < time() )
Zesstra29f2a2e2018-07-30 22:05:25 +0200119 factor = 0;
MG Mud User88f12472016-06-24 23:31:02 +0200120 // Zeit zwischen 6 und 30 Stunden nach dem Pfluecken in 99 gleichmaessige
121 // Abschnitte unterteilen. 24 h sind 86400 s, 86400/99 = 873.
122 else
Zesstraf9997f02018-07-30 21:01:25 +0200123 factor=(time() - object_time() - FRESH_TIME)/873;
MG Mud User88f12472016-06-24 23:31:02 +0200124
125 return QueryProp(P_QUALITY)*factor/100;
126}
127
128// Wie lange (in Sekunden) ist das Kraut noch haltbar?
129public int TimeToLive()
130{
Zesstrae46e7ee2018-07-30 21:13:53 +0200131 if ( state == PLANT_DRIED )
MG Mud User88f12472016-06-24 23:31:02 +0200132 return __INT_MAX__;
Zesstra06169d12018-07-30 20:50:07 +0200133 return object_time() + FRESH_TIME + PLANT_LIFETIME - time();
MG Mud User88f12472016-06-24 23:31:02 +0200134}
135
136//TODO: vielleicht etwas zufall? Sonst Kraeuterqualitaet hieran ermittelbar.
137static int _query_value()
138{
139 int val = Query(P_VALUE,F_VALUE)*PlantQuality()/100;
140 if (plantId<=0 || val = 0)
141 return 0;
142 return val-val%10;
143}
144
145static string _query_nosell()
146{
Zesstrae46e7ee2018-07-30 21:13:53 +0200147 if (state != PLANT_DRIED)
MG Mud User88f12472016-06-24 23:31:02 +0200148 return "Mit ungetrockneten Kraeutern handele ich nicht. Die verderben "
149 "immer so schnell im Lager, und dann werde ich sie nicht wieder los.";
150 return 0;
151}
152
153// Mit DryPlant() wird die Pflanze getrocknet. Als Argument wird der Prozent-
154// wert uebergeben, auf den die Qualitaet sinken soll. Als Ausgangswert
155// dieser Berechnung wird der Rueckgabewert von PlantQuality() verwendet.
156// Hintergrund: Die Qualitaet des Krauts sinkt im ungetrockneten Zustand
Zesstra29f2a2e2018-07-30 22:05:25 +0200157// ueber einen Zeitraum von 24 h kontinuierlich von 100 auf 0 ab, sobald
MG Mud User88f12472016-06-24 23:31:02 +0200158// es aelter als 6 Stunden ist. Danach ist es verschimmelt, was aber seiner
159// verbleibenden "Wirkung" keinen Abbruch tut.
160// Es wird die zum Zeitpunkt des Trocknungsvorganges gueltige Qualitaet
161// also sozusagen "eingefroren" und entsprechend dem Rueckgabewert von
162// PlantQuality() heruntergerechnet.
163
164// Diese Funktion kann natuerlich auch ueberschrieben werden, wenn bestimmte
165// Kraeuter erst durch trocknen in der Qualitaet steigen.
166
167// TODO: Ist das Argument "qual" dabei prozentual aufzufassen, oder
168// soll nur ein noch zu bestimmender Festwert abgezogen werden?
169// Arathorn: Es bleibt jetzt erstmal prozentual.
170
171#define DRYING_ALLOWED ({PLANTMASTER, "/items/kraeuter/trockner"})
172
173public void DryPlant(int qual)
174{
175 // Keine mehrfache Trocknung zulassen.
Zesstrae46e7ee2018-07-30 21:13:53 +0200176 if ( state == PLANT_DRIED )
MG Mud User88f12472016-06-24 23:31:02 +0200177 return;
Zesstraf9997f02018-07-30 21:01:25 +0200178
MG Mud User88f12472016-06-24 23:31:02 +0200179 // Nur bestimmte Objekte duerfen Trocknungen ausloesen.
180 if ( member(DRYING_ALLOWED, load_name(previous_object())) == -1 )
181 return;
182
183 // Qualitaet auf 100 deckeln.
184 if ( qual>100 )
185 qual = 100;
Zesstraf9997f02018-07-30 21:01:25 +0200186
MG Mud User88f12472016-06-24 23:31:02 +0200187 // Qualitaet mittels PlantQuality() runterskalieren.
188 qual = PlantQuality()*qual/100;
Zesstraf9997f02018-07-30 21:01:25 +0200189
MG Mud User88f12472016-06-24 23:31:02 +0200190 if ( qual < 1 ) {
191 if(objectp(this_player()))
192 tell_object(this_player(),
193 Name(WER,1)+" zerfaellt in unzaehlige feine Kruemel.\n");
194 remove();
195 return;
196 }
197 // Kraut als getrocknet kennzeichnen.
Zesstrabdf8be22018-07-30 21:31:21 +0200198 ChangeState(PLANT_DRIED);
MG Mud User88f12472016-06-24 23:31:02 +0200199 quality = qual;
200}
201
202/* Funktionen zum Initialisieren der Pflanze */
203// Der Kraeutermaster prueft den Clone auf Gueltigkeit. Eine einmal gesetzte
204// ID kann auf diesem Weg nicht mehr geaendert werden.
205nomask int SetPlantId(int new_id)
206{
207 if (plantId != 0)
208 return -1;
209 cloner=0;
MG Mud User88f12472016-06-24 23:31:02 +0200210 if (catch(cloner=call_other(PLANTMASTER, "CheckPlant", new_id)) || !cloner)
211 new_id = -1;
212 return (plantId=new_id);
213}
214
215nomask int QueryPlantId()
216{
217 return plantId;
218}
219
220nomask string QueryCloner()
221{
222 return cloner;
223}
224
Zesstraf9997f02018-07-30 21:01:25 +0200225nomask int QueryDried()
MG Mud User88f12472016-06-24 23:31:02 +0200226{
Zesstrae46e7ee2018-07-30 21:13:53 +0200227 return (state == PLANT_DRIED);
MG Mud User88f12472016-06-24 23:31:02 +0200228}