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 | |
| 15 | private int age=time(); |
| 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"; |
| 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. |
| 76 | public 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? |
| 95 | public 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. |
| 103 | static 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 | |
| 111 | static 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 | |
| 139 | public 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. |
| 171 | nomask 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 | |
| 182 | nomask int QueryPlantId() |
| 183 | { |
| 184 | return plantId; |
| 185 | } |
| 186 | |
| 187 | nomask string QueryCloner() |
| 188 | { |
| 189 | return cloner; |
| 190 | } |
| 191 | |
| 192 | nomask int QueryDried() |
| 193 | { |
| 194 | return (age == DRIED_PLANT); |
| 195 | } |