MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame^] | 1 | /* |
| 2 | * Goblin-Rassenshell |
| 3 | * [/std/shells/goblin.c] |
| 4 | * (c) 2007 nibel@mg.mud.de |
| 5 | * |
| 6 | * Werte von Ark abgesegnet am 11.12.2007 |
| 7 | */ |
| 8 | |
| 9 | #pragma strong_types,save_types |
| 10 | |
| 11 | #include <attributes.h> |
| 12 | #include <health.h> |
| 13 | #include <new_skills.h> |
| 14 | #include <properties.h> |
| 15 | #include <wizlevels.h> |
| 16 | #include <defuel.h> |
| 17 | #include <moving.h> |
| 18 | |
| 19 | inherit "/std/player/base.c"; |
| 20 | |
| 21 | static varargs int GoblinCmdWaaagh(string arg); |
| 22 | |
| 23 | public void create() { |
| 24 | mixed res; |
| 25 | base::create(); |
| 26 | |
| 27 | SetDefaultHome("/d/wald/kessa/waaagh/room/starthut/hut[" + |
| 28 | getuid(this_object()) +"]"); |
| 29 | SetDefaultPrayRoom("/d/wald/nibel/lichtung/room/lichtung_45"); |
| 30 | |
| 31 | SetProp(P_AVERAGE_SIZE, 80); |
| 32 | SetProp(P_AVERAGE_WEIGHT, 32000); |
| 33 | SetProp(P_MATERIAL_KNOWLEDGE, ([MATGROUP_EATABLE:20, MATGROUP_DRUG:40, |
| 34 | MATGROUP_PRECIOUS_METAL:25, MATGROUP_JEWEL:25])); |
| 35 | |
| 36 | SetProp(P_BODY, 15); |
| 37 | SetProp(P_ATTRIBUTES_OFFSETS, ([A_STR:0, A_INT:1, A_DEX:2, A_CON:2])); |
| 38 | SetProp(P_RESISTANCE_STRENGTHS, ([DT_FIRE:-0.15, DT_LIGHTNING:-0.15, |
| 39 | DT_SOUND:0.1, DT_HOLY:0.1, DT_AIR:0.1, DT_ACID:0.1])); |
| 40 | SetProp(P_MAGIC_RESISTANCE_OFFSET, ([MT_ANGRIFF:600, MT_ILLUSION:500, |
| 41 | MT_VERWANDLUNG:-300, MT_HELLSICHT:-750, MT_BEHERRSCHUNG:250])); |
| 42 | SetProp(P_SKILL_ATTRIBUTE_OFFSETS, ([SA_ENEMY_SAVE:103, SA_DAMAGE:107])); |
| 43 | |
| 44 | SetProp(P_SP_DELAY, HEAL_DELAY + 2); |
| 45 | SetProp(P_HP_DELAY, HEAL_DELAY - 1); |
| 46 | SetProp(P_ALCOHOL_DELAY, ALCOHOL_DELAY - 1); |
| 47 | |
| 48 | switch(QueryProp(P_SHELL_VERSION)) { |
| 49 | case 0: |
| 50 | if(!QueryProp(P_SIZE)) // Maennlein und Weiblein sind gleich "gross" |
| 51 | SetProp(P_SIZE, 75 + random(11)); |
| 52 | if(QueryProp(P_WEIGHT) == 75000) // Dito Gewicht |
| 53 | SetProp(P_WEIGHT, (QueryProp(P_SIZE) * 390) + |
| 54 | random(QueryProp(P_SIZE) * 10)); |
| 55 | SetProp(P_MATERIAL,([MAT_MISC_LIVING:100])); |
| 56 | |
| 57 | Set(P_SIZE, SAVE, F_MODE_AS); |
| 58 | Set(P_WEIGHT, SAVE, F_MODE_AS); |
| 59 | Set(P_MATERIAL, SAVE, F_MODE_AS); |
| 60 | |
| 61 | if(!pointerp(res = QueryProp(P_HANDS)) || sizeof(res) < 3) |
| 62 | res = ({" mit kleinen Faeustchen", 30, ({ DT_BLUDGEON })}); |
| 63 | SetProp(P_HANDS, res); |
| 64 | |
| 65 | if(!IS_SEER(this_object())) { |
| 66 | SetProp(P_MSGIN, "flitzt herein"); |
| 67 | SetProp(P_MSGOUT, "flitzt"); |
| 68 | } |
| 69 | SetProp(P_SHELL_VERSION, 1); |
| 70 | case 1: |
| 71 | // /std/player/base setzt ja schon P_WEIGHT... |
| 72 | if(QueryProp(P_WEIGHT) == 75000) { |
| 73 | SetProp(P_WEIGHT, (QueryProp(P_SIZE) * 390) + |
| 74 | random(QueryProp(P_SIZE) * 10)); |
| 75 | } |
| 76 | SetProp(P_SHELL_VERSION, 2); |
| 77 | default: break; |
| 78 | } |
| 79 | |
| 80 | SetProp(P_MAX_FOOD, 110); |
| 81 | SetProp(P_MAX_DRINK, 80); |
| 82 | SetProp(P_MAX_ALCOHOL, 125); |
| 83 | SetProp(P_DEFUEL_LIMIT_FOOD, 60); |
| 84 | SetProp(P_DEFUEL_LIMIT_DRINK, 60); |
| 85 | SetProp(P_DEFUEL_TIME_FOOD, 400); |
| 86 | SetProp(P_DEFUEL_TIME_DRINK, 360); |
| 87 | SetProp(P_DEFUEL_AMOUNT_FOOD, 0.5); |
| 88 | SetProp(P_DEFUEL_AMOUNT_DRINK, 0.4); |
| 89 | } |
| 90 | |
| 91 | static void FinalSetup() { |
| 92 | object o; |
| 93 | if(QueryProp(P_LEVEL) > 5 || present("\nibel:waldlichtungskarte", |
| 94 | this_object())) return; |
| 95 | if(!catch(o = clone_object("/d/wald/nibel/lichtung/obj/karte"))) |
| 96 | o->move(this_object(), M_NOCHECK); |
| 97 | } |
| 98 | |
| 99 | public int QueryAllowSelect() { return 1; } |
| 100 | |
| 101 | public string _query_race() { return "Goblin"; } |
| 102 | public string _query_real_race() { return "Goblin"; } |
| 103 | |
| 104 | public string _query_racedescr() { |
| 105 | return break_string("Goblins sind winzige, gruenhaeutige Wesen, sogar " |
| 106 | "noch kleiner als Hobbits. An ihren zu dick geratenen Koepfchen " |
| 107 | "befinden sich lange, selten reglose, Ohren und eine grosse, krumme " |
| 108 | "Nase. Ihre kleine Statur sollte jedoch nicht taeuschen, denn ihre " |
| 109 | "fehlende Kraft machen sie mit Geschwindigkeit, Praezision und nicht " |
| 110 | "zuletzt ihrer unbestrittenen Ruchlosigkeit alleweil wett. Obwohl " |
| 111 | "fuer sie Pluendern, lautes Herumbruellen und die gemeinsten Streiche " |
| 112 | "spielen zum Alltag gehoert, wuerde sie niemand als boesartig " |
| 113 | "bezeichnen. Denn Goblins sind vieles, aber sicherlich nicht die " |
| 114 | "intelligentesten Kreaturen. Durch ihren zaehen Willen und die dicke, " |
| 115 | "lederne Haut sind sie aussergewoehnlich widerstandsfaehig, und, " |
| 116 | "sofern funkelnde Beute winkt, fuer jedes Abenteuer zu haben.", 78); |
| 117 | } |
| 118 | |
| 119 | public string *_query_racestring() { |
| 120 | if(QueryProp(P_GENDER) == FEMALE) |
| 121 | return ({"Goblinfrau", "Goblinfrau", "Goblinfrau", "Goblinfrau"}); |
| 122 | return ({"Goblin", "Goblins", "Goblin", "Goblin"}); |
| 123 | } |
| 124 | |
| 125 | public string _query_default_guild() {return "abenteurer";} |
| 126 | |
| 127 | public string _query_visible_guild() { |
| 128 | switch(lower_case(QueryProp(P_GUILD))) { |
| 129 | case "abenteurer": return "abentoira"; |
| 130 | case "wipfellaeufer": return "wiffelloifa"; |
| 131 | case "chaos": return "kaos"; |
| 132 | case "zauberer": return "zaubara"; |
| 133 | case "bierschuettler": return "biaschuettla"; |
| 134 | case "katzenkrieger": return "kaznkriega"; |
| 135 | case "tanjian": return "tanschan"; |
| 136 | case "klerus": return "klerikae"; |
| 137 | case "dunkelelfen": return "dunklelfn"; |
| 138 | case "kaempfer": return "kaempfa"; |
| 139 | case "karate": return "karatae"; |
| 140 | case "werwoelfe": return "weawoelf"; |
| 141 | case "magus": return "magia"; |
| 142 | case "urukhai": return "urugai"; |
| 143 | } |
| 144 | return QueryProp(P_GUILD); |
| 145 | } |
| 146 | |
| 147 | public mixed RaceDefault(string arg) { |
| 148 | if(!arg) return 0; |
| 149 | switch(arg) { |
| 150 | case P_HANDS: |
| 151 | return ({" mit kleinen Faeustchen", 30, ({ DT_BLUDGEON })}); |
| 152 | case P_BODY: |
| 153 | return 15; |
| 154 | } |
| 155 | return base::RaceDefault(arg); |
| 156 | } |
| 157 | |
| 158 | static mixed _query_localcmds() { |
| 159 | return ({({"waaagh", "GoblinCmdWaaagh", 0, 0})}) + |
| 160 | base::_query_localcmds(); |
| 161 | } |
| 162 | |
| 163 | // "knuddel alle" ist deutlich teurer also who cares :-) |
| 164 | static varargs int GoblinCmdWaaagh(string arg) { |
| 165 | object *obs; |
| 166 | string s, w; |
| 167 | |
| 168 | if(!objectp(environment())) return 0; |
| 169 | obs = filter(all_inventory(environment()) - ({this_object()}), #'living); |
| 170 | obs = obs - filter_objects(obs, "QueryProp", P_INVIS); |
| 171 | // levelabhaengige Anzahl aaaaaaa's |
| 172 | w = "W"+ sprintf("%'a'"+ (QueryProp(P_LEVEL) / 10 + 3) +"s", "aaa") +"gh!"; |
| 173 | |
| 174 | foreach(object o : obs) |
| 175 | { |
| 176 | string str=(break_string(Name(WER) +" ballt die Faeustchen und " |
| 177 | "kreischt laut: "+ w +"\n" |
| 178 | + capitalize(o->QueryDu(WER)) + " zuckst erschrocken zusammen.", |
| 179 | 78, 0, BS_LEAVE_MY_LFS)); |
| 180 | |
| 181 | int res=o->ReceiveMsg(str,MT_LISTEN,MA_EMOTE,0,this_object()); |
| 182 | if (res<0) |
| 183 | { |
| 184 | obs-=({o}); // unten nicht mehr mit anzeigen. |
| 185 | if (res==MSG_SENSE_BLOCK) |
| 186 | ReceiveMsg(o->Name(WER) +" kann Dich nicht hoeren.", |
| 187 | MT_NOTIFICATION|MSG_DONT_IGNORE|MSG_DONT_STORE, |
| 188 | MA_EMOTE,0,this_object()); |
| 189 | else |
| 190 | ReceiveMsg(o->Name(WER) +" ignoriert Dich oder diesen Befehl.", |
| 191 | MT_NOTIFICATION|MSG_DONT_IGNORE|MSG_DONT_STORE, |
| 192 | MA_EMOTE,0,this_object()); |
| 193 | } |
| 194 | } |
| 195 | int anzahl=sizeof(obs); |
| 196 | if(!anzahl) |
| 197 | { |
| 198 | ReceiveMsg("Du ballst die Faeustchen und kreischst laut: " |
| 199 | + w, MT_NOTIFICATION|MSG_DONT_IGNORE,MA_EMOTE,0,this_object()); |
| 200 | } |
| 201 | else |
| 202 | { |
| 203 | s = CountUp(map_objects(obs, "name", WER)); |
| 204 | ReceiveMsg(break_string("Du ballst die Faeustchen und kreischst laut: " |
| 205 | + w +"\n"+ capitalize(s) +" zuck" |
| 206 | +(anzahl > 1 ? "en" : "t") +" erschrocken zusammen.", |
| 207 | 78, 0, BS_LEAVE_MY_LFS), |
| 208 | MT_NOTIFICATION|MSG_DONT_STORE|MSG_DONT_IGNORE, |
| 209 | MA_EMOTE,0,this_object()); |
| 210 | } |
| 211 | return 1; |
| 212 | } |
| 213 | |