blob: 2ce5045c12a79ca0e40c372ad98f1e81e8a93313 [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.
13#define DRIED_PLANT -1
14
15private int age=time();
16// enthaelt die Nummer des Krauts
17private int plantId;
18// enthaelt den Pfad des clonenden Objekts
19private string cloner;
20// Qualitaet des Krautes.
21private int quality=100;
22
23// File kann ein name sein, dessen Eigenschaften der VC konfigurieren sein
24// oder 0, wenn er selber ermitteln soll, was fuer ein File er gerade erzeugt
25// hat.
26// Sprich: real existierende Files auf der Platte muessen da ihren Namen
27// angeben, Standardfall ist aber, dass man 0 angibt und der VC weiss, was er
28// gerade erzeugt hat.
29void customizeMe(string file)
30{
31 if (stringp(file))
32 file=explode(file, "/")[<1];
33 KRAEUTERVC->CustomizeObject(file);
34}
35
36protected void create()
37{
38 if (object_name(this_object()) == __FILE__[0..<3])
39 {
40 set_next_reset(-1);
41 return;
42 }
43 ::create();
44
45 Set(P_QUALITY, function int () { return quality; }, F_QUERY_METHOD);
46 SetProp(P_WEIGHT, 120);
47 SetProp(P_VALUE, 70);
48 SetProp(P_MATERIAL, MAT_MISC_PLANT);
49}
50
51protected void create_super()
52{
53 set_next_reset(-1);
54}
55
56public string short()
57{
58 string str=QueryProp(P_SHORT);
59 if (!stringp(str))
60 return 0;
61 if (plantId==-1)
62 return str+" (unwirksam).\n";
63 else if (age==DRIED_PLANT)
64 return str+" (getrocknet).\n";
65 else if (age+FRESH_TIME+PLANT_LIFETIME<time())
66 return str+" (verfault).\n";
67 return str+".\n";
68}
69
70// Liefert einen Skalierungsfaktor zurueck, der mit dem aktuellen Wert von
71// P_QUALITY verrechnet wird. Rueckgabewerte:
72// Pflanze getrocknet oder nicht aelter als 6 h : 100
73// Pflanze aelter als 6, aber juenger als 30 h : 99...1
74// Pflanze aelter als 30 h: 0.
75// DryPlant() zerstoert das Kraut, wenn P_QUALITY unter 1 faellt.
76public int PlantQuality()
77{
78 int factor;
79 // schon getrocknet oder nicht aelter als 6 h?
80 // Dann keine weitere Reduktion.
81 if ( age == DRIED_PLANT || age+FRESH_TIME > time())
82 factor = 100;
83 // >30 Stunden nach dem Pfluecken ist das Kraut verschimmelt.
84 else if ( age + FRESH_TIME + PLANT_LIFETIME < time() )
85 factor = 1;
86 // Zeit zwischen 6 und 30 Stunden nach dem Pfluecken in 99 gleichmaessige
87 // Abschnitte unterteilen. 24 h sind 86400 s, 86400/99 = 873.
88 else
89 factor=(time()-age-FRESH_TIME)/873;
90
91 return QueryProp(P_QUALITY)*factor/100;
92}
93
94// Wie lange (in Sekunden) ist das Kraut noch haltbar?
95public int TimeToLive()
96{
97 if ( age == DRIED_PLANT )
98 return __INT_MAX__;
99 return age-time()+PLANT_LIFETIME;
100}
101
102//TODO: vielleicht etwas zufall? Sonst Kraeuterqualitaet hieran ermittelbar.
103static int _query_value()
104{
105 int val = Query(P_VALUE,F_VALUE)*PlantQuality()/100;
106 if (plantId<=0 || val = 0)
107 return 0;
108 return val-val%10;
109}
110
111static string _query_nosell()
112{
113 if (age != DRIED_PLANT)
114 return "Mit ungetrockneten Kraeutern handele ich nicht. Die verderben "
115 "immer so schnell im Lager, und dann werde ich sie nicht wieder los.";
116 return 0;
117}
118
119// Mit DryPlant() wird die Pflanze getrocknet. Als Argument wird der Prozent-
120// wert uebergeben, auf den die Qualitaet sinken soll. Als Ausgangswert
121// dieser Berechnung wird der Rueckgabewert von PlantQuality() verwendet.
122// Hintergrund: Die Qualitaet des Krauts sinkt im ungetrockneten Zustand
123// ueber einen Zeitraum von 24 h kontinuierlich von 100 auf 1 ab, sobald
124// es aelter als 6 Stunden ist. Danach ist es verschimmelt, was aber seiner
125// verbleibenden "Wirkung" keinen Abbruch tut.
126// Es wird die zum Zeitpunkt des Trocknungsvorganges gueltige Qualitaet
127// also sozusagen "eingefroren" und entsprechend dem Rueckgabewert von
128// PlantQuality() heruntergerechnet.
129
130// Diese Funktion kann natuerlich auch ueberschrieben werden, wenn bestimmte
131// Kraeuter erst durch trocknen in der Qualitaet steigen.
132
133// TODO: Ist das Argument "qual" dabei prozentual aufzufassen, oder
134// soll nur ein noch zu bestimmender Festwert abgezogen werden?
135// Arathorn: Es bleibt jetzt erstmal prozentual.
136
137#define DRYING_ALLOWED ({PLANTMASTER, "/items/kraeuter/trockner"})
138
139public void DryPlant(int qual)
140{
141 // Keine mehrfache Trocknung zulassen.
142 if ( age == DRIED_PLANT )
143 return;
144
145 // Nur bestimmte Objekte duerfen Trocknungen ausloesen.
146 if ( member(DRYING_ALLOWED, load_name(previous_object())) == -1 )
147 return;
148
149 // Qualitaet auf 100 deckeln.
150 if ( qual>100 )
151 qual = 100;
152
153 // Qualitaet mittels PlantQuality() runterskalieren.
154 qual = PlantQuality()*qual/100;
155
156 if ( qual < 1 ) {
157 if(objectp(this_player()))
158 tell_object(this_player(),
159 Name(WER,1)+" zerfaellt in unzaehlige feine Kruemel.\n");
160 remove();
161 return;
162 }
163 // Kraut als getrocknet kennzeichnen.
164 age=DRIED_PLANT;
165 quality = qual;
166}
167
168/* Funktionen zum Initialisieren der Pflanze */
169// Der Kraeutermaster prueft den Clone auf Gueltigkeit. Eine einmal gesetzte
170// ID kann auf diesem Weg nicht mehr geaendert werden.
171nomask int SetPlantId(int new_id)
172{
173 if (plantId != 0)
174 return -1;
175 cloner=0;
176 age=time();
177 if (catch(cloner=call_other(PLANTMASTER, "CheckPlant", new_id)) || !cloner)
178 new_id = -1;
179 return (plantId=new_id);
180}
181
182nomask int QueryPlantId()
183{
184 return plantId;
185}
186
187nomask string QueryCloner()
188{
189 return cloner;
190}
191
192nomask int QueryDried()
193{
194 return (age == DRIED_PLANT);
195}