| // MorgenGrauen MUDlib |
| // |
| // player/description.c -- player description handling |
| // |
| // $Id: description.c 8755 2014-04-26 13:13:40Z Zesstra $ |
| #pragma strong_types |
| #pragma save_types |
| #pragma range_check |
| #pragma no_clone |
| #pragma pedantic |
| |
| inherit "/std/living/description"; |
| |
| #include <thing/language.h> |
| #include <player/description.h> |
| #include <living/clothing.h> |
| #include <properties.h> |
| #include <wizlevels.h> |
| #include <defines.h> |
| #include <combat.h> |
| #include <sys_debug.h> |
| |
| #define NEED_PROTOTYPES |
| #include <player/command.h> |
| |
| protected void create() |
| { |
| ::create(); |
| Set(P_NAME, NOSETMETHOD, F_SET_METHOD); |
| Set(P_PRESAY, SAVE, F_MODE_AS); |
| Set(P_TITLE, SAVE, F_MODE_AS); |
| Set(P_EXTRA_LOOK, SAVE, F_MODE_AS); |
| Set(P_GENDER, SAVE, F_MODE_AS); |
| Set(P_SIZE, SAVE, F_MODE_AS); |
| Set(P_INFO, NOSETMETHOD, F_SET_METHOD); |
| // Avatar-URIs speichern. Ausserdem hat an denen keiner rumzufummeln. |
| Set(P_AVATAR_URI, SAVE|SECURED, F_MODE_AS); |
| } |
| |
| string _query_info() |
| { |
| string info; |
| info = Query(P_INFO); |
| if(!info)info==""; |
| info = (string)query_wiz_level(this_object()); |
| if(IS_GOD(this_object())) |
| return info+" [Gott]\n"; |
| if(IS_ARCH(this_object())) |
| return info+" [Erzmagier]\n"; |
| if(IS_ELDER(this_object())) |
| return info+" [Weiser]\n"; |
| if(IS_LORD(this_object())) |
| return info+" [Regionschef]\n"; |
| if(IS_SPECIAL(this_object())) |
| return info+" [Special]\n"; |
| if(IS_DOMAINMEMBER(this_object())) |
| return info+" [Regionsmitarbeiter]\n"; |
| if(IS_WIZARD(this_object())) |
| return info+" [Magier]\n"; |
| if(IS_LEARNER(this_object())) |
| return info+" [Magieranwaerter]\n"; |
| info = QueryProp(P_LEVEL); |
| if(IS_SEER(this_object())) |
| return info+" [Seher]\n"; |
| return info+" [Spieler]\n"; |
| } |
| |
| int _query_size() { |
| if (QueryProp(P_FROG)) |
| return 20; |
| return Query(P_SIZE); |
| } |
| |
| // short() -- get the short description of a player |
| string short() |
| { |
| string answer; |
| string title; |
| |
| if(QueryProp(P_INVIS)) |
| if(interactive(previous_object()) && IS_LEARNING(previous_object())) |
| return "("+QueryProp(P_NAME)+") \n"; |
| else |
| return 0; |
| |
| if(QueryProp(P_GHOST)) |
| { |
| if (QueryProp(P_FROG)) |
| return "Der Geist eines kleinen Frosches namens "+QueryProp(P_NAME)+ |
| ".\n"; |
| else |
| return "Der Geist von "+QueryProp(P_NAME)+".\n"; |
| } |
| |
| if (QueryProp(P_FROG)) |
| return "Ein kleiner Frosch namens "+QueryProp(P_NAME)+".\n"; |
| |
| answer = QueryProp(P_PRESAY) + QueryProp(P_NAME); |
| if (QueryProp(P_ARTICLE)) answer=QueryArticle(0,0)+answer; |
| if((title=QueryProp(P_TITLE)) && title != "") answer += " " + title; |
| if(!interactive(ME)) answer += " (netztot)"; |
| return answer+".\n"; |
| } |
| |
| private string andlist(object *arr) { |
| string *tmp; |
| if(!pointerp(arr)) return ""; |
| if(sizeof(tmp = map_objects(arr, "name", WEN))) |
| return(CountUp(tmp)); |
| return ""; |
| } |
| |
| // gibt fuer nicht-Invis-Objekte den Namen zurueck |
| private string get_vis_name(object ob) { |
| if (ob->QueryProp(P_INVIS)) |
| return 0; |
| return (ob->name(WEN)); |
| } |
| |
| varargs string long() |
| { |
| string exl, descr, tmp, size_descr; |
| object ob; |
| mixed trans, w, a, r; |
| int per; |
| string fill, fill2; |
| /* fuer groessenvergleich */ |
| string comparesize, pers1, pers2; |
| int relation; |
| |
| per=1000*QueryProp(P_SIZE)/QueryProp(P_AVERAGE_SIZE); |
| switch(per) |
| { |
| case 0..800: size_descr="ziemlich winzig"; break; |
| case 801..850: size_descr="eher winzig"; break; |
| case 851..900: size_descr="recht klein"; break; |
| case 901..950: size_descr="eher klein"; break; |
| case 951..1050: size_descr="mittelgross"; break; |
| case 1051..1100: size_descr="relativ gross"; break; |
| case 1101..1150: size_descr="ziemlich gross"; break; |
| case 1151..1200: size_descr="sehr gross"; break; |
| default: size_descr="riesig"; break; |
| } |
| #define RassenString() ((QueryProp(P_FROG) ? "en Frosch" :\ |
| (!QueryProp(P_GENDER)?" ":QueryProp(P_GENDER)==2?"e ":"en ")+\ |
| (pointerp(QueryProp(P_RACESTRING))?\ |
| QueryProp(P_RACESTRING)[WEN]:QueryProp(P_RACE)))) |
| fill2=fill=0; |
| if (QueryProp(P_AVERAGE_SIZE)<170) |
| { |
| if (per<950) |
| fill="selbst fuer ein"+RassenString()+" "; |
| else |
| if (per>1050) |
| fill2=", wenn auch nur fuer ein"+RassenString(); |
| } |
| else |
| { |
| if (QueryProp(P_AVERAGE_SIZE)>170) |
| if (per>1050) |
| fill="sogar fuer ein"+RassenString()+" "; |
| else |
| if (per<950) |
| fill2=", wenn auch nur fuer ein"+RassenString(); |
| } |
| if (!fill&&!fill2) fill="fuer ein"+RassenString()+" "; |
| descr = "Das ist "+name(WER,1)+". "+capitalize(QueryPronoun())+" ist "+ |
| (fill||"")+size_descr+(fill2||"")+".\n"; |
| |
| if(this_player()) { |
| /* groessenvergleich_anfang (NEU) */ |
| pers1 = QueryPronoun(WER); |
| pers2 = QueryPronoun(WEM); |
| |
| // || falls TP keine Groesse gesetzt hat... Warum auch immer... |
| relation = (QueryProp(P_SIZE)*100) / |
| (this_player()->QueryProp(P_SIZE) || 1); |
| switch (relation) |
| { |
| case 0 .. 25 : comparesize = "Damit gibt "+pers1+" einen guten" |
| " Fusschemel fuer Dich ab"; |
| break; |
| case 26 .. 50 : comparesize = "Damit reicht "+pers1+" Dir nicht mal bis" |
| " zur Huefte"; |
| break; |
| case 51 .. 75 : comparesize = "Damit kannst Du "+pers2+" locker auf den" |
| " Kopf spucken"; |
| break; |
| case 76 .. 90 : comparesize = "Damit ist "+pers1+" einen Kopf kleiner" |
| " als Du"; |
| break; |
| case 91 .. 110 : comparesize = "Damit hat "+pers1+" etwa Deine Groesse"; |
| break; |
| case 111 .. 120 : comparesize = "Damit ist "+pers1+" einen Kopf groesser" |
| " als Du"; |
| break; |
| case 121 .. 150 : comparesize = "Damit holst Du Dir einen steifen Nacken," |
| " wenn Du "+pers2+" in die Augen siehst"; |
| break; |
| case 151 .. 200 : comparesize = "Damit versperrt "+pers1+" Dir absolut" |
| " die Sicht"; |
| break; |
| case 201 .. 300 : comparesize = "Damit waere jeder Schlag von Dir ein" |
| " Tiefschlag"; |
| break; |
| default : comparesize = "Damit kannst Du "+pers2+" bequem zwischen" |
| " den Beinen durchlaufen"; |
| break; |
| } |
| |
| descr+=comparesize+".\n"; |
| /* groessenvergleich_ende (NEU) */ |
| } |
| |
| if(QueryProp(P_GHOST)) return descr; |
| |
| trans = QueryProp(P_TRANSPARENT); SetProp(P_TRANSPARENT, 0); |
| descr += ::long(); SetProp(P_TRANSPARENT, trans); |
| |
| // Waffen, Ruestungen/Kleidung und Sonstiges ermitteln |
| w = ({QueryProp(P_WEAPON), QueryProp(P_PARRY_WEAPON)}) - ({0}); |
| a = QueryProp(P_ARMOURS) + QueryProp(P_CLOTHING) - ({0}); |
| r = all_inventory(ME) - w - a; //Rest logischerweise |
| |
| // rest noch nach sichbarkeit von ausserhalb des SPielers filtern. |
| r=map(r,function string (object ob) { |
| if(sizeof(all_inventory(ob)) || ob->QueryProp(P_LIGHT) || |
| ob->QueryProp(P_LIGHTED) || ob->QueryProp(P_SHOW_INV)) |
| return(get_vis_name(ob)); |
| return(0); } ) - ({0}); |
| |
| // Invis-Objekte ausfiltern und Namen ermitteln, anschliessend sind in w, a |
| // und r je ein Array von Strings |
| w = map(w, #'get_vis_name) - ({0}); |
| a = map(a, #'get_vis_name) - ({0}); |
| |
| return descr + |
| (QueryProp(P_TRANSPARENT) ? |
| break_string(capitalize(name(WER, 1))+" hat " |
| +(sizeof(a)?CountUp(a):"keine Ruestung")+" an" |
| +(sizeof(r)?", ":" und ") |
| +(sizeof(w)?CountUp(w):"keine Waffe")+" gezueckt" |
| +(sizeof(r)?" und traegt "+CountUp(r):"")+".", 78): ""); |
| } |
| |
| |
| // **** local property methods |
| static mixed _query_presay() |
| { |
| string presay; |
| if((presay = Query(P_PRESAY)) && (presay != "")) return presay + " "; |
| return ""; |
| } |
| |
| static string _query_name() |
| { |
| return capitalize(Query(P_NAME) || "NoName"); |
| } |
| // **** |
| |
| // Local commands |
| static mixed _query_localcmds() { |
| return |
| ({ |
| ({"avatar","set_avataruri",0,0}), |
| }); |
| } |
| |
| int set_avataruri(string arg) { |
| arg = _unparsed_args(0); |
| if (!arg || !sizeof(arg)) { |
| string uri = QueryProp(P_AVATAR_URI); |
| if (stringp(uri)) |
| tell_object(ME, |
| "Aktuelle Avatar-URI: " + uri + "\n"); |
| else |
| tell_object(ME, "Du hast keine Avatar-URI eingestellt.\n"); |
| } |
| else if (arg == "keine") { |
| SetProp(P_AVATAR_URI, 0); |
| tell_object(ME, "Deine Avatar-URI wurde geloescht.\n"); |
| } |
| else if (sizeof(arg) > 512) |
| tell_object(ME, "Deine neue Avatar-URI ist zu lang!\n"); |
| else { |
| SetProp(P_AVATAR_URI, arg); |
| tell_object(ME, |
| "Aktuelle Avatar-URI: " + arg + "\n"); |
| } |
| return 1; |
| } |
| |