MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame^] | 1 | //Revision 1.1: QueryQuality() added, sollte aber noch verbessert werden! |
| 2 | /* |
| 3 | Letzte Aenderung: Vanion, 26.05.02 |
| 4 | - Die Fische haben jetzt wieder einen Wert. Der Preis wird |
| 5 | von einem Master kontrolliert. Je mehr Fisch ein Spieler |
| 6 | angelt, desto billiger wird der Fisch. |
| 7 | - Gross-Kleinschreibung beim essen korrigiert. |
| 8 | */ |
| 9 | |
| 10 | #pragma strong_types, save_types, rtt_checks |
| 11 | #pragma no_clone, no_shadow |
| 12 | |
| 13 | inherit "/std/thing"; |
| 14 | |
| 15 | #include <language.h> |
| 16 | #include <properties.h> |
| 17 | #include <defines.h> |
| 18 | #include <items/fishing/fishing.h> |
| 19 | |
| 20 | #define TP this_player() |
| 21 | #define BS(x) break_string(x, 78) |
| 22 | |
| 23 | private string eatmessage; |
| 24 | string corpseobject = "/items/fishing/graeten"; |
| 25 | static int price_modifier; |
| 26 | |
| 27 | #define DECAYSTART 600 // beginnt nach 10 min zu faulen |
| 28 | #define DECAYSTEP 120 // alle 2 Minuten wird er schlechter |
| 29 | #define MAXQUALITY 4 // nach 4 Decays ist er giftig |
| 30 | #define KILLFACTOR 5 // reduce_hit_points(STEPS*KILLFACTOR) |
| 31 | #define HEALFACTOR 32 // 800 g = 25 LP |
| 32 | #define MAXHEAL 40 // Kein Fisch bringt mehr als 40 LP |
| 33 | #define MINHEAL 0 // oder weniger als 0 |
| 34 | #define FOODHEALFACTOR 3 // LP=LP + 1/3 des Gewichts |
| 35 | |
| 36 | void SetEatMessage(string str); |
| 37 | void SetCorpseObject(string str); |
| 38 | int QueryQuality(); |
| 39 | |
| 40 | protected void create() { |
| 41 | ::create(); |
| 42 | // Reset kurz nach Erreichen des max. Gammelzustands, dann zerstoeren. |
| 43 | set_next_reset(DECAYSTART+(MAXQUALITY+1)*DECAYSTEP); |
| 44 | AddId(({FISCH_ID ,"fisch"})); |
| 45 | SetProp(P_NAME, "Fisch" ); |
| 46 | SetProp(P_GENDER , MALE); |
| 47 | SetProp(P_SHORT, "Ein Fisch" ); |
| 48 | SetProp(P_LONG, "Ein stinknormaler Fisch.\n"); |
| 49 | SetProp(P_MATERIAL, MAT_MISC_FOOD); |
| 50 | SetProp(P_NOBUY,1); |
| 51 | SetProp(P_WEIGHT, 500); |
| 52 | AddCmd("iss&@ID", "eatit", "Was willst Du essen?"); |
| 53 | |
| 54 | // Vanion, 26.05.02: Der Preis wird erst nach dem create() geholt, |
| 55 | // da das Gewicht dann schon gesetzt werden muss. |
| 56 | call_out("GetPriceModifier",0); |
| 57 | } |
| 58 | |
| 59 | protected void create_super() { |
| 60 | set_next_reset(-1); |
| 61 | } |
| 62 | |
| 63 | // Wert des Fisches ist abhaengig vom price_modifier und von P_VALUE |
| 64 | static int _query_value() { |
| 65 | int value; |
| 66 | |
| 67 | // Minimalpreis ist immer 1 Muenze. Damit man ihn loswird. |
| 68 | if(!price_modifier) |
| 69 | return 1; |
| 70 | |
| 71 | value = Query(P_VALUE, F_VALUE); |
| 72 | |
| 73 | if(!value) |
| 74 | return 0; |
| 75 | |
| 76 | return (value*price_modifier)/100 ; |
| 77 | } |
| 78 | |
| 79 | /*Eingebaut von Vanion, 26.05.02 |
| 80 | Die Funktion holt den price_modifier aus dem Fish-Master. |
| 81 | Hierbei wird ein Wert zwischen 0 und 100 zurueckgegeben, der |
| 82 | den Prozentsatz des Wertes von P_VALUE angibt. 50 bedeutet, dass |
| 83 | der Fisch 50% seines Maximalwertes hat. */ |
| 84 | |
| 85 | #define FISHMASTER "p/daemon/fishmaster" |
| 86 | |
| 87 | void GetPriceModifier() { |
| 88 | if (!this_player()) return; |
| 89 | |
| 90 | // Jetzt wird der Preis fuer den Fisch bestimmt. |
| 91 | price_modifier = FISHMASTER->PriceOfFish(TP, ME); |
| 92 | return; |
| 93 | } |
| 94 | |
| 95 | void SetEatMessage(string str) { |
| 96 | eatmessage=str; |
| 97 | } |
| 98 | |
| 99 | void SetCorpseObject(string str) { |
| 100 | corpseobject=str; |
| 101 | } |
| 102 | |
| 103 | int _set_weight(int gramm) { |
| 104 | int tmp = gramm/2 + random(gramm/2); // "nat. Schwankungen" nachbilden |
| 105 | Set(P_WEIGHT, tmp, F_VALUE); |
| 106 | SetProp(P_VALUE, tmp/4); // Im normalen Laden nur 1/4 Gewicht in Muenzen |
| 107 | return tmp; |
| 108 | } |
| 109 | |
| 110 | void init() { |
| 111 | ::init(); |
| 112 | if( QueryProp(P_FISH)&F_REPLACE ) { |
| 113 | if(query_once_interactive(environment(ME))) { |
| 114 | call_out("ReplaceFish",0); |
| 115 | } |
| 116 | } |
| 117 | return; |
| 118 | } |
| 119 | |
| 120 | varargs string long(int mode) { |
| 121 | string pron = capitalize(QueryPronoun(WER)); |
| 122 | string txt = QueryProp(P_LONG); |
| 123 | |
| 124 | switch(QueryQuality()) { |
| 125 | case 4: txt += pron+" ist fangfrisch.\n"; break; |
| 126 | case 3: txt += pron+" ist noch recht frisch.\n"; break; |
| 127 | case 2: txt += pron+" ist schon etwas runzlig.\n"; break; |
| 128 | case 1: txt += pron+" sieht schon recht alt aus.\n"; break; |
| 129 | case 0: txt += pron+" ist nicht mehr geniessbar!\n"; break; |
| 130 | case -1: txt += pron+" ist vergammelt.\n"; break; |
| 131 | default: |
| 132 | txt += (pron+" stinkt widerlich und ist bereits voller Maden!\n"+pron+ |
| 133 | " zerfaellt noch waehrend Du "+QueryPronoun(WEN)+" betrachtest.\n"); |
| 134 | remove(); |
| 135 | break; |
| 136 | } |
| 137 | return(txt); |
| 138 | } |
| 139 | |
| 140 | int _query_fish_age() { |
| 141 | return (time()-QueryProp(P_CLONE_TIME)); |
| 142 | } |
| 143 | |
| 144 | static int eatit(string str) { |
| 145 | string msg_other = TP->Name()+" isst "+name(WEN)+"."; |
| 146 | |
| 147 | if ( !eatmessage ) |
| 148 | eatmessage = "Du isst "+name(WEN,1)+" auf."; |
| 149 | |
| 150 | if ( stringp(corpseobject) ) { |
| 151 | object muell=clone_object(corpseobject); |
| 152 | if ( muell->move(TP, M_GET) != MOVE_OK ) { |
| 153 | muell->move(environment(TP), M_GET); |
| 154 | } |
| 155 | } |
| 156 | |
| 157 | // Heilung berechnen. |
| 158 | // Heilwert runterskalieren mit Qualitaet, wenn das Mindestalter erreicht |
| 159 | // ist, aber nur, wenn der Fisch auch vergammeln kann. |
| 160 | int healing = QueryProp(P_WEIGHT)/HEALFACTOR; |
| 161 | int age = QueryProp(P_FISH_AGE); |
| 162 | if ( age > DECAYSTART && !(QueryProp(P_FISH)&F_NOROTTEN)) { |
| 163 | healing = healing * (QueryQuality()*25)/100; |
| 164 | } |
| 165 | if ( healing > MAXHEAL ) |
| 166 | healing = MAXHEAL; |
| 167 | else if ( healing < MINHEAL ) |
| 168 | healing = MINHEAL; |
| 169 | |
| 170 | if( age > DECAYSTART + MAXQUALITY*DECAYSTEP) { |
| 171 | tell_object(TP, BS(eatmessage + " Dir wird speiuebel, der Fisch war " |
| 172 | "zu alt!")); |
| 173 | tell_room(environment(TP), BS(msg_other + TP->QueryPronoun(WER)+ |
| 174 | " verdreht angeekelt die Augen."), ({TP})); |
| 175 | TP->reduce_hit_points( ((age-DECAYSTART)/DECAYSTEP)*KILLFACTOR ); |
| 176 | remove(); |
| 177 | } |
| 178 | else { |
| 179 | if ( TP->eat_food(healing*FOODHEALFACTOR) ) { |
| 180 | tell_object(TP, BS(eatmessage)); |
| 181 | tell_room(environment(TP), BS(msg_other), ({TP})); |
| 182 | if ( !(QueryProp(P_FISH)&F_NOHEAL) ) |
| 183 | TP->buffer_hp(healing,5); |
| 184 | remove(); |
| 185 | } |
| 186 | } |
| 187 | return 1; |
| 188 | } |
| 189 | |
| 190 | // Qualitaet des Fisches ermitteln. Rueckgabewert: 4, 3, 2, 1, 0, -1 ... |
| 191 | int QueryQuality() { |
| 192 | // Alter in Sekunden ueber der Grenze, ab der der Fisch anfaengt zu gammeln |
| 193 | int age = QueryProp(P_FISH_AGE)-DECAYSTART; |
| 194 | // Wenn die Grenze noch nicht erreicht ist, oder der Fisch generell nicht |
| 195 | // gammelt (F_NOROTTEN), dann ist das Alter 0 und die Qualitaet max. |
| 196 | if ( age<0 || QueryProp(P_FISH) & F_NOROTTEN ) |
| 197 | age = 0; |
| 198 | |
| 199 | // Qualitaet in DECAYSTEP-Stufen reduzieren (60 s pro Gammelstufe) |
| 200 | return MAXQUALITY-(age/DECAYSTEP); |
| 201 | } |
| 202 | |
| 203 | void reset() { |
| 204 | if (clonep(ME)) { |
| 205 | string msg = BS(Name()+" ist vergammelt und zerfaellt.") ; |
| 206 | if ( interactive(environment()) ) { |
| 207 | tell_object(environment(), msg); |
| 208 | } |
| 209 | else if ( environment()->IsRoom() ) { |
| 210 | tell_room(environment(), msg); |
| 211 | } |
| 212 | if ( stringp(corpseobject) ) { |
| 213 | object muell=clone_object(corpseobject); |
| 214 | if ( muell->move(environment(), M_GET) != MOVE_OK ) { |
| 215 | muell->move(environment(environment()), M_GET); |
| 216 | } |
| 217 | } |
| 218 | call_out("remove",0); |
| 219 | return; |
| 220 | } |
| 221 | return ::reset(); |
| 222 | } |