blob: 87adfb37e4c5bf711ee98e4e420c4983e6de040d [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
Zesstraf9997f02018-07-30 21:01:25 +020015private int state;
MG Mud User88f12472016-06-24 23:31:02 +020016// 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";
Zesstraf9997f02018-07-30 21:01:25 +020063 else if (state==DRIED_PLANT)
MG Mud User88f12472016-06-24 23:31:02 +020064 return str+" (getrocknet).\n";
Zesstraf9997f02018-07-30 21:01:25 +020065 else if (object_time() + FRESH_TIME + PLANT_LIFETIME < time())
MG Mud User88f12472016-06-24 23:31:02 +020066 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?
Zesstraf9997f02018-07-30 21:01:25 +020080 // Dann keine (weitere) Reduktion.
81 if ( state == DRIED_PLANT || object_time() + FRESH_TIME > time())
MG Mud User88f12472016-06-24 23:31:02 +020082 factor = 100;
83 // >30 Stunden nach dem Pfluecken ist das Kraut verschimmelt.
Zesstraf9997f02018-07-30 21:01:25 +020084 else if ( object_time() + FRESH_TIME + PLANT_LIFETIME < time() )
MG Mud User88f12472016-06-24 23:31:02 +020085 // Zeit zwischen 6 und 30 Stunden nach dem Pfluecken in 99 gleichmaessige
86 // Abschnitte unterteilen. 24 h sind 86400 s, 86400/99 = 873.
87 else
Zesstraf9997f02018-07-30 21:01:25 +020088 factor=(time() - object_time() - FRESH_TIME)/873;
MG Mud User88f12472016-06-24 23:31:02 +020089
90 return QueryProp(P_QUALITY)*factor/100;
91}
92
93// Wie lange (in Sekunden) ist das Kraut noch haltbar?
94public int TimeToLive()
95{
Zesstraf9997f02018-07-30 21:01:25 +020096 if ( state == DRIED_PLANT )
MG Mud User88f12472016-06-24 23:31:02 +020097 return __INT_MAX__;
Zesstra06169d12018-07-30 20:50:07 +020098 return object_time() + FRESH_TIME + PLANT_LIFETIME - time();
MG Mud User88f12472016-06-24 23:31:02 +020099}
100
101//TODO: vielleicht etwas zufall? Sonst Kraeuterqualitaet hieran ermittelbar.
102static int _query_value()
103{
104 int val = Query(P_VALUE,F_VALUE)*PlantQuality()/100;
105 if (plantId<=0 || val = 0)
106 return 0;
107 return val-val%10;
108}
109
110static string _query_nosell()
111{
Zesstraf9997f02018-07-30 21:01:25 +0200112 if (state != DRIED_PLANT)
MG Mud User88f12472016-06-24 23:31:02 +0200113 return "Mit ungetrockneten Kraeutern handele ich nicht. Die verderben "
114 "immer so schnell im Lager, und dann werde ich sie nicht wieder los.";
115 return 0;
116}
117
118// Mit DryPlant() wird die Pflanze getrocknet. Als Argument wird der Prozent-
119// wert uebergeben, auf den die Qualitaet sinken soll. Als Ausgangswert
120// dieser Berechnung wird der Rueckgabewert von PlantQuality() verwendet.
121// Hintergrund: Die Qualitaet des Krauts sinkt im ungetrockneten Zustand
122// ueber einen Zeitraum von 24 h kontinuierlich von 100 auf 1 ab, sobald
123// es aelter als 6 Stunden ist. Danach ist es verschimmelt, was aber seiner
124// verbleibenden "Wirkung" keinen Abbruch tut.
125// Es wird die zum Zeitpunkt des Trocknungsvorganges gueltige Qualitaet
126// also sozusagen "eingefroren" und entsprechend dem Rueckgabewert von
127// PlantQuality() heruntergerechnet.
128
129// Diese Funktion kann natuerlich auch ueberschrieben werden, wenn bestimmte
130// Kraeuter erst durch trocknen in der Qualitaet steigen.
131
132// TODO: Ist das Argument "qual" dabei prozentual aufzufassen, oder
133// soll nur ein noch zu bestimmender Festwert abgezogen werden?
134// Arathorn: Es bleibt jetzt erstmal prozentual.
135
136#define DRYING_ALLOWED ({PLANTMASTER, "/items/kraeuter/trockner"})
137
138public void DryPlant(int qual)
139{
140 // Keine mehrfache Trocknung zulassen.
Zesstraf9997f02018-07-30 21:01:25 +0200141 if ( state == DRIED_PLANT )
MG Mud User88f12472016-06-24 23:31:02 +0200142 return;
Zesstraf9997f02018-07-30 21:01:25 +0200143
MG Mud User88f12472016-06-24 23:31:02 +0200144 // Nur bestimmte Objekte duerfen Trocknungen ausloesen.
145 if ( member(DRYING_ALLOWED, load_name(previous_object())) == -1 )
146 return;
147
148 // Qualitaet auf 100 deckeln.
149 if ( qual>100 )
150 qual = 100;
Zesstraf9997f02018-07-30 21:01:25 +0200151
MG Mud User88f12472016-06-24 23:31:02 +0200152 // Qualitaet mittels PlantQuality() runterskalieren.
153 qual = PlantQuality()*qual/100;
Zesstraf9997f02018-07-30 21:01:25 +0200154
MG Mud User88f12472016-06-24 23:31:02 +0200155 if ( qual < 1 ) {
156 if(objectp(this_player()))
157 tell_object(this_player(),
158 Name(WER,1)+" zerfaellt in unzaehlige feine Kruemel.\n");
159 remove();
160 return;
161 }
162 // Kraut als getrocknet kennzeichnen.
Zesstraf9997f02018-07-30 21:01:25 +0200163 state=DRIED_PLANT;
MG Mud User88f12472016-06-24 23:31:02 +0200164 quality = qual;
165}
166
167/* Funktionen zum Initialisieren der Pflanze */
168// Der Kraeutermaster prueft den Clone auf Gueltigkeit. Eine einmal gesetzte
169// ID kann auf diesem Weg nicht mehr geaendert werden.
170nomask int SetPlantId(int new_id)
171{
172 if (plantId != 0)
173 return -1;
174 cloner=0;
MG Mud User88f12472016-06-24 23:31:02 +0200175 if (catch(cloner=call_other(PLANTMASTER, "CheckPlant", new_id)) || !cloner)
176 new_id = -1;
177 return (plantId=new_id);
178}
179
180nomask int QueryPlantId()
181{
182 return plantId;
183}
184
185nomask string QueryCloner()
186{
187 return cloner;
188}
189
Zesstraf9997f02018-07-30 21:01:25 +0200190nomask int QueryDried()
MG Mud User88f12472016-06-24 23:31:02 +0200191{
Zesstraf9997f02018-07-30 21:01:25 +0200192 return (state == DRIED_PLANT);
MG Mud User88f12472016-06-24 23:31:02 +0200193}