MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame^] | 1 | // 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 | |
| 12 | inherit "/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 | |
| 26 | protected 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 | |
| 40 | string _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 | |
| 68 | int _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 |
| 75 | string 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 | |
| 105 | private 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 |
| 114 | private string get_vis_name(object ob) { |
| 115 | if (ob->QueryProp(P_INVIS)) |
| 116 | return 0; |
| 117 | return (ob->name(WEN)); |
| 118 | } |
| 119 | |
| 120 | varargs 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 |
| 248 | static mixed _query_presay() |
| 249 | { |
| 250 | string presay; |
| 251 | if((presay = Query(P_PRESAY)) && (presay != "")) return presay + " "; |
| 252 | return ""; |
| 253 | } |
| 254 | |
| 255 | static string _query_name() |
| 256 | { |
| 257 | return capitalize(Query(P_NAME) || "NoName"); |
| 258 | } |
| 259 | // **** |
| 260 | |
| 261 | // Local commands |
| 262 | static mixed _query_localcmds() { |
| 263 | return |
| 264 | ({ |
| 265 | ({"avatar","set_avataruri",0,0}), |
| 266 | }); |
| 267 | } |
| 268 | |
| 269 | int 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 | |