MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 1 | // (c) September 2000 by Padreic (Padreic@mg.mud.de) |
| 2 | |
| 3 | #pragma strong_types, save_types, rtt_checks |
| 4 | |
| 5 | inherit "/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 User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 13 | |
Zesstra | f9997f0 | 2018-07-30 21:01:25 +0200 | [diff] [blame] | 14 | private int state; |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 15 | // enthaelt die Nummer des Krauts |
| 16 | private int plantId; |
| 17 | // enthaelt den Pfad des clonenden Objekts |
| 18 | private string cloner; |
| 19 | // Qualitaet des Krautes. |
| 20 | private 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. |
| 28 | void customizeMe(string file) |
| 29 | { |
| 30 | if (stringp(file)) |
| 31 | file=explode(file, "/")[<1]; |
| 32 | KRAEUTERVC->CustomizeObject(file); |
| 33 | } |
| 34 | |
| 35 | protected void create() |
| 36 | { |
| 37 | if (object_name(this_object()) == __FILE__[0..<3]) |
| 38 | { |
| 39 | set_next_reset(-1); |
| 40 | return; |
| 41 | } |
| 42 | ::create(); |
Zesstra | bdf8be2 | 2018-07-30 21:31:21 +0200 | [diff] [blame^] | 43 | |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 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); |
Zesstra | bdf8be2 | 2018-07-30 21:31:21 +0200 | [diff] [blame^] | 48 | // Zeitpunkt des Verfaulens |
| 49 | set_next_reset(FRESH_TIME + PLANT_LIFETIME); |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 50 | } |
| 51 | |
| 52 | protected void create_super() |
| 53 | { |
| 54 | set_next_reset(-1); |
| 55 | } |
| 56 | |
Zesstra | bdf8be2 | 2018-07-30 21:31:21 +0200 | [diff] [blame^] | 57 | // wird gerufen, wenn sich der Zustand des Krautes (frisch, getrocknet, |
| 58 | // verfault) aendert. Kann genutzt werden, um die Beschreibung des Krautes zu |
| 59 | // aendern. |
| 60 | protected 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 | |
| 67 | void 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 User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 90 | public 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"; |
Zesstra | e46e7ee | 2018-07-30 21:13:53 +0200 | [diff] [blame] | 97 | else if (state==PLANT_DRIED) |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 98 | return str+" (getrocknet).\n"; |
Zesstra | bdf8be2 | 2018-07-30 21:31:21 +0200 | [diff] [blame^] | 99 | else if (state==PLANT_EXPIRED) |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 100 | 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. |
| 110 | public int PlantQuality() |
| 111 | { |
| 112 | int factor; |
| 113 | // schon getrocknet oder nicht aelter als 6 h? |
Zesstra | f9997f0 | 2018-07-30 21:01:25 +0200 | [diff] [blame] | 114 | // Dann keine (weitere) Reduktion. |
Zesstra | e46e7ee | 2018-07-30 21:13:53 +0200 | [diff] [blame] | 115 | if ( state == PLANT_DRIED || object_time() + FRESH_TIME > time()) |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 116 | factor = 100; |
| 117 | // >30 Stunden nach dem Pfluecken ist das Kraut verschimmelt. |
Zesstra | f9997f0 | 2018-07-30 21:01:25 +0200 | [diff] [blame] | 118 | else if ( object_time() + FRESH_TIME + PLANT_LIFETIME < time() ) |
Zesstra | e46e7ee | 2018-07-30 21:13:53 +0200 | [diff] [blame] | 119 | factor = 1; //TODO -> 0 |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 120 | // 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 |
Zesstra | f9997f0 | 2018-07-30 21:01:25 +0200 | [diff] [blame] | 123 | factor=(time() - object_time() - FRESH_TIME)/873; |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 124 | |
| 125 | return QueryProp(P_QUALITY)*factor/100; |
| 126 | } |
| 127 | |
| 128 | // Wie lange (in Sekunden) ist das Kraut noch haltbar? |
| 129 | public int TimeToLive() |
| 130 | { |
Zesstra | e46e7ee | 2018-07-30 21:13:53 +0200 | [diff] [blame] | 131 | if ( state == PLANT_DRIED ) |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 132 | return __INT_MAX__; |
Zesstra | 06169d1 | 2018-07-30 20:50:07 +0200 | [diff] [blame] | 133 | return object_time() + FRESH_TIME + PLANT_LIFETIME - time(); |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 134 | } |
| 135 | |
| 136 | //TODO: vielleicht etwas zufall? Sonst Kraeuterqualitaet hieran ermittelbar. |
| 137 | static 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 | |
| 145 | static string _query_nosell() |
| 146 | { |
Zesstra | e46e7ee | 2018-07-30 21:13:53 +0200 | [diff] [blame] | 147 | if (state != PLANT_DRIED) |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 148 | 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 |
| 157 | // ueber einen Zeitraum von 24 h kontinuierlich von 100 auf 1 ab, sobald |
| 158 | // 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 | |
| 173 | public void DryPlant(int qual) |
| 174 | { |
| 175 | // Keine mehrfache Trocknung zulassen. |
Zesstra | e46e7ee | 2018-07-30 21:13:53 +0200 | [diff] [blame] | 176 | if ( state == PLANT_DRIED ) |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 177 | return; |
Zesstra | f9997f0 | 2018-07-30 21:01:25 +0200 | [diff] [blame] | 178 | |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 179 | // 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; |
Zesstra | f9997f0 | 2018-07-30 21:01:25 +0200 | [diff] [blame] | 186 | |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 187 | // Qualitaet mittels PlantQuality() runterskalieren. |
| 188 | qual = PlantQuality()*qual/100; |
Zesstra | f9997f0 | 2018-07-30 21:01:25 +0200 | [diff] [blame] | 189 | |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 190 | 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. |
Zesstra | bdf8be2 | 2018-07-30 21:31:21 +0200 | [diff] [blame^] | 198 | ChangeState(PLANT_DRIED); |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 199 | 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. |
| 205 | nomask int SetPlantId(int new_id) |
| 206 | { |
| 207 | if (plantId != 0) |
| 208 | return -1; |
| 209 | cloner=0; |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 210 | if (catch(cloner=call_other(PLANTMASTER, "CheckPlant", new_id)) || !cloner) |
| 211 | new_id = -1; |
| 212 | return (plantId=new_id); |
| 213 | } |
| 214 | |
| 215 | nomask int QueryPlantId() |
| 216 | { |
| 217 | return plantId; |
| 218 | } |
| 219 | |
| 220 | nomask string QueryCloner() |
| 221 | { |
| 222 | return cloner; |
| 223 | } |
| 224 | |
Zesstra | f9997f0 | 2018-07-30 21:01:25 +0200 | [diff] [blame] | 225 | nomask int QueryDried() |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 226 | { |
Zesstra | e46e7ee | 2018-07-30 21:13:53 +0200 | [diff] [blame] | 227 | return (state == PLANT_DRIED); |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 228 | } |