blob: 4209b35df8f97fc9096f5ac4ee265bb249e9db56 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001//Revision 1.1: QueryQuality() added, sollte aber noch verbessert werden!
2/*
3Letzte 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
13inherit "/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
23private string eatmessage;
24string corpseobject = "/items/fishing/graeten";
25static 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
36void SetEatMessage(string str);
37void SetCorpseObject(string str);
38int QueryQuality();
39
40protected 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
59protected void create_super() {
60 set_next_reset(-1);
61}
62
63// Wert des Fisches ist abhaengig vom price_modifier und von P_VALUE
64static 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
87void 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
95void SetEatMessage(string str) {
96 eatmessage=str;
97}
98
99void SetCorpseObject(string str) {
100 corpseobject=str;
101}
102
103int _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
110void 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
120varargs 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
140int _query_fish_age() {
141 return (time()-QueryProp(P_CLONE_TIME));
142}
143
144static 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 ...
191int 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
203void 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}