blob: 91980f5df0a7d112102e3b4ee591ce4ea40cc1a9 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001// MorgenGrauen MUDlib
2//
3// player/description.c -- player description handling
4//
5// $Id: description.c 8755 2014-04-26 13:13:40Z Zesstra $
6#pragma strong_types
7#pragma save_types
8#pragma range_check
9#pragma no_clone
MG Mud User88f12472016-06-24 23:31:02 +020010
11inherit "/std/living/description";
12
13#include <thing/language.h>
14#include <player/description.h>
15#include <living/clothing.h>
16#include <properties.h>
17#include <wizlevels.h>
18#include <defines.h>
19#include <combat.h>
20#include <sys_debug.h>
21
22#define NEED_PROTOTYPES
23#include <player/command.h>
24
25protected void create()
26{
27 ::create();
28 Set(P_NAME, NOSETMETHOD, F_SET_METHOD);
29 Set(P_PRESAY, SAVE, F_MODE_AS);
30 Set(P_TITLE, SAVE, F_MODE_AS);
31 Set(P_EXTRA_LOOK, SAVE, F_MODE_AS);
32 Set(P_GENDER, SAVE, F_MODE_AS);
33 Set(P_SIZE, SAVE, F_MODE_AS);
34 Set(P_INFO, NOSETMETHOD, F_SET_METHOD);
35 // Avatar-URIs speichern. Ausserdem hat an denen keiner rumzufummeln.
36 Set(P_AVATAR_URI, SAVE|SECURED, F_MODE_AS);
37}
38
39string _query_info()
40{
Arathorn0c8f90f2019-11-27 19:42:46 +010041 string info = Query(P_INFO, F_VALUE) || "";
42 int wizlvl = query_wiz_level(ME);
MG Mud User88f12472016-06-24 23:31:02 +020043 if(IS_GOD(this_object()))
Arathorn0c8f90f2019-11-27 19:42:46 +010044 return sprintf(info+"Magierstufe %d [Gott]\n", wizlvl);
MG Mud User88f12472016-06-24 23:31:02 +020045 if(IS_ARCH(this_object()))
Arathorn0c8f90f2019-11-27 19:42:46 +010046 return sprintf(info+"Magierstufe %d [Erzmagier]\n", wizlvl);
MG Mud User88f12472016-06-24 23:31:02 +020047 if(IS_ELDER(this_object()))
Arathorn0c8f90f2019-11-27 19:42:46 +010048 return sprintf(info+"Magierstufe %d [Weiser]\n", wizlvl);
MG Mud User88f12472016-06-24 23:31:02 +020049 if(IS_LORD(this_object()))
Arathorn0c8f90f2019-11-27 19:42:46 +010050 return sprintf(info+"Magierstufe %d [Regionsmagier]\n", wizlvl);
MG Mud User88f12472016-06-24 23:31:02 +020051 if(IS_SPECIAL(this_object()))
Arathorn0c8f90f2019-11-27 19:42:46 +010052 return sprintf(info+"Magierstufe %d [Hilfsmagier]\n", wizlvl);
MG Mud User88f12472016-06-24 23:31:02 +020053 if(IS_DOMAINMEMBER(this_object()))
Arathorn0c8f90f2019-11-27 19:42:46 +010054 return sprintf(info+"Magierstufe %d [Regionsmitarbeiter]\n", wizlvl);
MG Mud User88f12472016-06-24 23:31:02 +020055 if(IS_WIZARD(this_object()))
Arathorn0c8f90f2019-11-27 19:42:46 +010056 return sprintf(info+"Magierstufe %d [Magier]\n", wizlvl);
MG Mud User88f12472016-06-24 23:31:02 +020057 if(IS_LEARNER(this_object()))
Arathorn0c8f90f2019-11-27 19:42:46 +010058 return sprintf(info+"Magierstufe %d [Magieranwaerter]\n", wizlvl);
MG Mud User88f12472016-06-24 23:31:02 +020059 if(IS_SEER(this_object()))
Arathorn0c8f90f2019-11-27 19:42:46 +010060 return sprintf(info+"Stufe %d [Seher]\n", QueryProp(P_LEVEL));
61 return sprintf(info+"Stufe %d [Spieler]\n", QueryProp(P_LEVEL));
MG Mud User88f12472016-06-24 23:31:02 +020062}
63
64int _query_size() {
65 if (QueryProp(P_FROG))
66 return 20;
67 return Query(P_SIZE);
68}
69
70// short() -- get the short description of a player
71string short()
72{
73 string answer;
74 string title;
75
76 if(QueryProp(P_INVIS))
77 if(interactive(previous_object()) && IS_LEARNING(previous_object()))
78 return "("+QueryProp(P_NAME)+") \n";
79 else
80 return 0;
81
82 if(QueryProp(P_GHOST))
83 {
84 if (QueryProp(P_FROG))
85 return "Der Geist eines kleinen Frosches namens "+QueryProp(P_NAME)+
86 ".\n";
87 else
88 return "Der Geist von "+QueryProp(P_NAME)+".\n";
89 }
90
91 if (QueryProp(P_FROG))
92 return "Ein kleiner Frosch namens "+QueryProp(P_NAME)+".\n";
93
94 answer = QueryProp(P_PRESAY) + QueryProp(P_NAME);
95 if (QueryProp(P_ARTICLE)) answer=QueryArticle(0,0)+answer;
96 if((title=QueryProp(P_TITLE)) && title != "") answer += " " + title;
97 if(!interactive(ME)) answer += " (netztot)";
98 return answer+".\n";
99}
100
101private string andlist(object *arr) {
102 string *tmp;
103 if(!pointerp(arr)) return "";
104 if(sizeof(tmp = map_objects(arr, "name", WEN)))
105 return(CountUp(tmp));
106 return "";
107}
108
109// gibt fuer nicht-Invis-Objekte den Namen zurueck
110private string get_vis_name(object ob) {
111 if (ob->QueryProp(P_INVIS))
112 return 0;
113 return (ob->name(WEN));
114}
115
116varargs string long()
117{
Arathornb3051452021-05-13 21:13:03 +0200118 string descr, size_descr;
MG Mud User88f12472016-06-24 23:31:02 +0200119 mixed trans, w, a, r;
120 int per;
121 string fill, fill2;
122 /* fuer groessenvergleich */
123 string comparesize, pers1, pers2;
124 int relation;
125
126 per=1000*QueryProp(P_SIZE)/QueryProp(P_AVERAGE_SIZE);
127 switch(per)
128 {
129 case 0..800: size_descr="ziemlich winzig"; break;
130 case 801..850: size_descr="eher winzig"; break;
131 case 851..900: size_descr="recht klein"; break;
132 case 901..950: size_descr="eher klein"; break;
133 case 951..1050: size_descr="mittelgross"; break;
134 case 1051..1100: size_descr="relativ gross"; break;
135 case 1101..1150: size_descr="ziemlich gross"; break;
136 case 1151..1200: size_descr="sehr gross"; break;
137 default: size_descr="riesig"; break;
138 }
139#define RassenString() ((QueryProp(P_FROG) ? "en Frosch" :\
140 (!QueryProp(P_GENDER)?" ":QueryProp(P_GENDER)==2?"e ":"en ")+\
141 (pointerp(QueryProp(P_RACESTRING))?\
142 QueryProp(P_RACESTRING)[WEN]:QueryProp(P_RACE))))
143 fill2=fill=0;
144 if (QueryProp(P_AVERAGE_SIZE)<170)
145 {
146 if (per<950)
147 fill="selbst fuer ein"+RassenString()+" ";
148 else
149 if (per>1050)
150 fill2=", wenn auch nur fuer ein"+RassenString();
151 }
152 else
153 {
154 if (QueryProp(P_AVERAGE_SIZE)>170)
155 if (per>1050)
156 fill="sogar fuer ein"+RassenString()+" ";
157 else
158 if (per<950)
159 fill2=", wenn auch nur fuer ein"+RassenString();
160 }
161 if (!fill&&!fill2) fill="fuer ein"+RassenString()+" ";
162 descr = "Das ist "+name(WER,1)+". "+capitalize(QueryPronoun())+" ist "+
163 (fill||"")+size_descr+(fill2||"")+".\n";
164
165 if(this_player()) {
166 /* groessenvergleich_anfang (NEU) */
167 pers1 = QueryPronoun(WER);
168 pers2 = QueryPronoun(WEM);
169
170 // || falls TP keine Groesse gesetzt hat... Warum auch immer...
171 relation = (QueryProp(P_SIZE)*100) /
172 (this_player()->QueryProp(P_SIZE) || 1);
173 switch (relation)
174 {
175 case 0 .. 25 : comparesize = "Damit gibt "+pers1+" einen guten"
176 " Fusschemel fuer Dich ab";
177 break;
178 case 26 .. 50 : comparesize = "Damit reicht "+pers1+" Dir nicht mal bis"
179 " zur Huefte";
180 break;
181 case 51 .. 75 : comparesize = "Damit kannst Du "+pers2+" locker auf den"
182 " Kopf spucken";
183 break;
184 case 76 .. 90 : comparesize = "Damit ist "+pers1+" einen Kopf kleiner"
185 " als Du";
186 break;
187 case 91 .. 110 : comparesize = "Damit hat "+pers1+" etwa Deine Groesse";
188 break;
189 case 111 .. 120 : comparesize = "Damit ist "+pers1+" einen Kopf groesser"
190 " als Du";
191 break;
192 case 121 .. 150 : comparesize = "Damit holst Du Dir einen steifen Nacken,"
193 " wenn Du "+pers2+" in die Augen siehst";
194 break;
195 case 151 .. 200 : comparesize = "Damit versperrt "+pers1+" Dir absolut"
196 " die Sicht";
197 break;
198 case 201 .. 300 : comparesize = "Damit waere jeder Schlag von Dir ein"
199 " Tiefschlag";
200 break;
201 default : comparesize = "Damit kannst Du "+pers2+" bequem zwischen"
202 " den Beinen durchlaufen";
203 break;
204 }
205
206 descr+=comparesize+".\n";
207 /* groessenvergleich_ende (NEU) */
208 }
209
210 if(QueryProp(P_GHOST)) return descr;
211
212 trans = QueryProp(P_TRANSPARENT); SetProp(P_TRANSPARENT, 0);
213 descr += ::long(); SetProp(P_TRANSPARENT, trans);
214
215 // Waffen, Ruestungen/Kleidung und Sonstiges ermitteln
216 w = ({QueryProp(P_WEAPON), QueryProp(P_PARRY_WEAPON)}) - ({0});
217 a = QueryProp(P_ARMOURS) + QueryProp(P_CLOTHING) - ({0});
218 r = all_inventory(ME) - w - a; //Rest logischerweise
219
220 // rest noch nach sichbarkeit von ausserhalb des SPielers filtern.
221 r=map(r,function string (object ob) {
222 if(sizeof(all_inventory(ob)) || ob->QueryProp(P_LIGHT) ||
223 ob->QueryProp(P_LIGHTED) || ob->QueryProp(P_SHOW_INV))
224 return(get_vis_name(ob));
225 return(0); } ) - ({0});
226
227 // Invis-Objekte ausfiltern und Namen ermitteln, anschliessend sind in w, a
228 // und r je ein Array von Strings
229 w = map(w, #'get_vis_name) - ({0});
230 a = map(a, #'get_vis_name) - ({0});
231
232 return descr +
233 (QueryProp(P_TRANSPARENT) ?
234 break_string(capitalize(name(WER, 1))+" hat "
235 +(sizeof(a)?CountUp(a):"keine Ruestung")+" an"
236 +(sizeof(r)?", ":" und ")
237 +(sizeof(w)?CountUp(w):"keine Waffe")+" gezueckt"
238 +(sizeof(r)?" und traegt "+CountUp(r):"")+".", 78): "");
239}
240
241
242// **** local property methods
243static mixed _query_presay()
244{
245 string presay;
246 if((presay = Query(P_PRESAY)) && (presay != "")) return presay + " ";
247 return "";
248}
249
250static string _query_name()
251{
252 return capitalize(Query(P_NAME) || "NoName");
253}
254// ****
255
256// Local commands
257static mixed _query_localcmds() {
258 return
259 ({
260 ({"avatar","set_avataruri",0,0}),
261 });
262}
263
264int set_avataruri(string arg) {
265 arg = _unparsed_args(0);
266 if (!arg || !sizeof(arg)) {
267 string uri = QueryProp(P_AVATAR_URI);
268 if (stringp(uri))
269 tell_object(ME,
270 "Aktuelle Avatar-URI: " + uri + "\n");
271 else
272 tell_object(ME, "Du hast keine Avatar-URI eingestellt.\n");
273 }
274 else if (arg == "keine") {
275 SetProp(P_AVATAR_URI, 0);
276 tell_object(ME, "Deine Avatar-URI wurde geloescht.\n");
277 }
278 else if (sizeof(arg) > 512)
279 tell_object(ME, "Deine neue Avatar-URI ist zu lang!\n");
280 else {
281 SetProp(P_AVATAR_URI, arg);
282 tell_object(ME,
283 "Aktuelle Avatar-URI: " + arg + "\n");
284 }
285 return 1;
286}
287