blob: e43bfb8fd96152393cac17986312c638e6cfab37 [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();
43
44 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);
48}
49
50protected void create_super()
51{
52 set_next_reset(-1);
53}
54
55public string short()
56{
57 string str=QueryProp(P_SHORT);
58 if (!stringp(str))
59 return 0;
60 if (plantId==-1)
61 return str+" (unwirksam).\n";
Zesstrae46e7ee2018-07-30 21:13:53 +020062 else if (state==PLANT_DRIED)
MG Mud User88f12472016-06-24 23:31:02 +020063 return str+" (getrocknet).\n";
Zesstraf9997f02018-07-30 21:01:25 +020064 else if (object_time() + FRESH_TIME + PLANT_LIFETIME < time())
MG Mud User88f12472016-06-24 23:31:02 +020065 return str+" (verfault).\n";
66 return str+".\n";
67}
68
69// Liefert einen Skalierungsfaktor zurueck, der mit dem aktuellen Wert von
70// P_QUALITY verrechnet wird. Rueckgabewerte:
71// Pflanze getrocknet oder nicht aelter als 6 h : 100
72// Pflanze aelter als 6, aber juenger als 30 h : 99...1
73// Pflanze aelter als 30 h: 0.
74// DryPlant() zerstoert das Kraut, wenn P_QUALITY unter 1 faellt.
75public int PlantQuality()
76{
77 int factor;
78 // schon getrocknet oder nicht aelter als 6 h?
Zesstraf9997f02018-07-30 21:01:25 +020079 // Dann keine (weitere) Reduktion.
Zesstrae46e7ee2018-07-30 21:13:53 +020080 if ( state == PLANT_DRIED || object_time() + FRESH_TIME > time())
MG Mud User88f12472016-06-24 23:31:02 +020081 factor = 100;
82 // >30 Stunden nach dem Pfluecken ist das Kraut verschimmelt.
Zesstraf9997f02018-07-30 21:01:25 +020083 else if ( object_time() + FRESH_TIME + PLANT_LIFETIME < time() )
Zesstrae46e7ee2018-07-30 21:13:53 +020084 factor = 1; //TODO -> 0
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{
Zesstrae46e7ee2018-07-30 21:13:53 +020096 if ( state == PLANT_DRIED )
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{
Zesstrae46e7ee2018-07-30 21:13:53 +0200112 if (state != PLANT_DRIED)
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.
Zesstrae46e7ee2018-07-30 21:13:53 +0200141 if ( state == PLANT_DRIED )
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.
Zesstrae46e7ee2018-07-30 21:13:53 +0200163 state=PLANT_DRIED;
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{
Zesstrae46e7ee2018-07-30 21:13:53 +0200192 return (state == PLANT_DRIED);
MG Mud User88f12472016-06-24 23:31:02 +0200193}