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