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. |
| 13 | #define DRIED_PLANT -1 |
| 14 | |
Zesstra | f9997f0 | 2018-07-30 21:01:25 +0200 | [diff] [blame^] | 15 | private int state; |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 16 | // enthaelt die Nummer des Krauts |
| 17 | private int plantId; |
| 18 | // enthaelt den Pfad des clonenden Objekts |
| 19 | private string cloner; |
| 20 | // Qualitaet des Krautes. |
| 21 | private 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. |
| 29 | void customizeMe(string file) |
| 30 | { |
| 31 | if (stringp(file)) |
| 32 | file=explode(file, "/")[<1]; |
| 33 | KRAEUTERVC->CustomizeObject(file); |
| 34 | } |
| 35 | |
| 36 | protected 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 | |
| 51 | protected void create_super() |
| 52 | { |
| 53 | set_next_reset(-1); |
| 54 | } |
| 55 | |
| 56 | public 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"; |
Zesstra | f9997f0 | 2018-07-30 21:01:25 +0200 | [diff] [blame^] | 63 | else if (state==DRIED_PLANT) |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 64 | return str+" (getrocknet).\n"; |
Zesstra | f9997f0 | 2018-07-30 21:01:25 +0200 | [diff] [blame^] | 65 | else if (object_time() + FRESH_TIME + PLANT_LIFETIME < time()) |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 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. |
| 76 | public int PlantQuality() |
| 77 | { |
| 78 | int factor; |
| 79 | // schon getrocknet oder nicht aelter als 6 h? |
Zesstra | f9997f0 | 2018-07-30 21:01:25 +0200 | [diff] [blame^] | 80 | // Dann keine (weitere) Reduktion. |
| 81 | if ( state == DRIED_PLANT || object_time() + FRESH_TIME > time()) |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 82 | factor = 100; |
| 83 | // >30 Stunden nach dem Pfluecken ist das Kraut verschimmelt. |
Zesstra | f9997f0 | 2018-07-30 21:01:25 +0200 | [diff] [blame^] | 84 | else if ( object_time() + FRESH_TIME + PLANT_LIFETIME < time() ) |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 85 | // 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 |
Zesstra | f9997f0 | 2018-07-30 21:01:25 +0200 | [diff] [blame^] | 88 | factor=(time() - object_time() - FRESH_TIME)/873; |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 89 | |
| 90 | return QueryProp(P_QUALITY)*factor/100; |
| 91 | } |
| 92 | |
| 93 | // Wie lange (in Sekunden) ist das Kraut noch haltbar? |
| 94 | public int TimeToLive() |
| 95 | { |
Zesstra | f9997f0 | 2018-07-30 21:01:25 +0200 | [diff] [blame^] | 96 | if ( state == DRIED_PLANT ) |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 97 | return __INT_MAX__; |
Zesstra | 06169d1 | 2018-07-30 20:50:07 +0200 | [diff] [blame] | 98 | return object_time() + FRESH_TIME + PLANT_LIFETIME - time(); |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 99 | } |
| 100 | |
| 101 | //TODO: vielleicht etwas zufall? Sonst Kraeuterqualitaet hieran ermittelbar. |
| 102 | static 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 | |
| 110 | static string _query_nosell() |
| 111 | { |
Zesstra | f9997f0 | 2018-07-30 21:01:25 +0200 | [diff] [blame^] | 112 | if (state != DRIED_PLANT) |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 113 | 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 | |
| 138 | public void DryPlant(int qual) |
| 139 | { |
| 140 | // Keine mehrfache Trocknung zulassen. |
Zesstra | f9997f0 | 2018-07-30 21:01:25 +0200 | [diff] [blame^] | 141 | if ( state == DRIED_PLANT ) |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 142 | return; |
Zesstra | f9997f0 | 2018-07-30 21:01:25 +0200 | [diff] [blame^] | 143 | |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 144 | // 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; |
Zesstra | f9997f0 | 2018-07-30 21:01:25 +0200 | [diff] [blame^] | 151 | |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 152 | // Qualitaet mittels PlantQuality() runterskalieren. |
| 153 | qual = PlantQuality()*qual/100; |
Zesstra | f9997f0 | 2018-07-30 21:01:25 +0200 | [diff] [blame^] | 154 | |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 155 | 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. |
Zesstra | f9997f0 | 2018-07-30 21:01:25 +0200 | [diff] [blame^] | 163 | state=DRIED_PLANT; |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 164 | 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. |
| 170 | nomask int SetPlantId(int new_id) |
| 171 | { |
| 172 | if (plantId != 0) |
| 173 | return -1; |
| 174 | cloner=0; |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 175 | if (catch(cloner=call_other(PLANTMASTER, "CheckPlant", new_id)) || !cloner) |
| 176 | new_id = -1; |
| 177 | return (plantId=new_id); |
| 178 | } |
| 179 | |
| 180 | nomask int QueryPlantId() |
| 181 | { |
| 182 | return plantId; |
| 183 | } |
| 184 | |
| 185 | nomask string QueryCloner() |
| 186 | { |
| 187 | return cloner; |
| 188 | } |
| 189 | |
Zesstra | f9997f0 | 2018-07-30 21:01:25 +0200 | [diff] [blame^] | 190 | nomask int QueryDried() |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 191 | { |
Zesstra | f9997f0 | 2018-07-30 21:01:25 +0200 | [diff] [blame^] | 192 | return (state == DRIED_PLANT); |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 193 | } |