blob: ed694b30ce03e8b0f468af2c7b86b0a410ebe3b7 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001/*
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
19inherit "/std/player/base.c";
20
21static varargs int GoblinCmdWaaagh(string arg);
22
23public 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
91static 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
99public int QueryAllowSelect() { return 1; }
100
101public string _query_race() { return "Goblin"; }
102public string _query_real_race() { return "Goblin"; }
103
104public 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
119public string *_query_racestring() {
120 if(QueryProp(P_GENDER) == FEMALE)
121 return ({"Goblinfrau", "Goblinfrau", "Goblinfrau", "Goblinfrau"});
122 return ({"Goblin", "Goblins", "Goblin", "Goblin"});
123}
124
125public string _query_default_guild() {return "abenteurer";}
126
127public 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
147public 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
158static mixed _query_localcmds() {
159 return ({({"waaagh", "GoblinCmdWaaagh", 0, 0})}) +
160 base::_query_localcmds();
161}
162
163// "knuddel alle" ist deutlich teurer also who cares :-)
164static 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