Added public files
Roughly added all public files. Probably missed some, though.
diff --git a/std/shells/goblin.c b/std/shells/goblin.c
new file mode 100644
index 0000000..ed694b3
--- /dev/null
+++ b/std/shells/goblin.c
@@ -0,0 +1,213 @@
+/*
+ * Goblin-Rassenshell
+ * [/std/shells/goblin.c]
+ * (c) 2007 nibel@mg.mud.de
+ *
+ * Werte von Ark abgesegnet am 11.12.2007
+ */
+
+#pragma strong_types,save_types
+
+#include <attributes.h>
+#include <health.h>
+#include <new_skills.h>
+#include <properties.h>
+#include <wizlevels.h>
+#include <defuel.h>
+#include <moving.h>
+
+inherit "/std/player/base.c";
+
+static varargs int GoblinCmdWaaagh(string arg);
+
+public void create() {
+ mixed res;
+ base::create();
+
+ SetDefaultHome("/d/wald/kessa/waaagh/room/starthut/hut[" +
+ getuid(this_object()) +"]");
+ SetDefaultPrayRoom("/d/wald/nibel/lichtung/room/lichtung_45");
+
+ SetProp(P_AVERAGE_SIZE, 80);
+ SetProp(P_AVERAGE_WEIGHT, 32000);
+ SetProp(P_MATERIAL_KNOWLEDGE, ([MATGROUP_EATABLE:20, MATGROUP_DRUG:40,
+ MATGROUP_PRECIOUS_METAL:25, MATGROUP_JEWEL:25]));
+
+ SetProp(P_BODY, 15);
+ SetProp(P_ATTRIBUTES_OFFSETS, ([A_STR:0, A_INT:1, A_DEX:2, A_CON:2]));
+ SetProp(P_RESISTANCE_STRENGTHS, ([DT_FIRE:-0.15, DT_LIGHTNING:-0.15,
+ DT_SOUND:0.1, DT_HOLY:0.1, DT_AIR:0.1, DT_ACID:0.1]));
+ SetProp(P_MAGIC_RESISTANCE_OFFSET, ([MT_ANGRIFF:600, MT_ILLUSION:500,
+ MT_VERWANDLUNG:-300, MT_HELLSICHT:-750, MT_BEHERRSCHUNG:250]));
+ SetProp(P_SKILL_ATTRIBUTE_OFFSETS, ([SA_ENEMY_SAVE:103, SA_DAMAGE:107]));
+
+ SetProp(P_SP_DELAY, HEAL_DELAY + 2);
+ SetProp(P_HP_DELAY, HEAL_DELAY - 1);
+ SetProp(P_ALCOHOL_DELAY, ALCOHOL_DELAY - 1);
+
+ switch(QueryProp(P_SHELL_VERSION)) {
+ case 0:
+ if(!QueryProp(P_SIZE)) // Maennlein und Weiblein sind gleich "gross"
+ SetProp(P_SIZE, 75 + random(11));
+ if(QueryProp(P_WEIGHT) == 75000) // Dito Gewicht
+ SetProp(P_WEIGHT, (QueryProp(P_SIZE) * 390) +
+ random(QueryProp(P_SIZE) * 10));
+ SetProp(P_MATERIAL,([MAT_MISC_LIVING:100]));
+
+ Set(P_SIZE, SAVE, F_MODE_AS);
+ Set(P_WEIGHT, SAVE, F_MODE_AS);
+ Set(P_MATERIAL, SAVE, F_MODE_AS);
+
+ if(!pointerp(res = QueryProp(P_HANDS)) || sizeof(res) < 3)
+ res = ({" mit kleinen Faeustchen", 30, ({ DT_BLUDGEON })});
+ SetProp(P_HANDS, res);
+
+ if(!IS_SEER(this_object())) {
+ SetProp(P_MSGIN, "flitzt herein");
+ SetProp(P_MSGOUT, "flitzt");
+ }
+ SetProp(P_SHELL_VERSION, 1);
+ case 1:
+ // /std/player/base setzt ja schon P_WEIGHT...
+ if(QueryProp(P_WEIGHT) == 75000) {
+ SetProp(P_WEIGHT, (QueryProp(P_SIZE) * 390) +
+ random(QueryProp(P_SIZE) * 10));
+ }
+ SetProp(P_SHELL_VERSION, 2);
+ default: break;
+ }
+
+ SetProp(P_MAX_FOOD, 110);
+ SetProp(P_MAX_DRINK, 80);
+ SetProp(P_MAX_ALCOHOL, 125);
+ SetProp(P_DEFUEL_LIMIT_FOOD, 60);
+ SetProp(P_DEFUEL_LIMIT_DRINK, 60);
+ SetProp(P_DEFUEL_TIME_FOOD, 400);
+ SetProp(P_DEFUEL_TIME_DRINK, 360);
+ SetProp(P_DEFUEL_AMOUNT_FOOD, 0.5);
+ SetProp(P_DEFUEL_AMOUNT_DRINK, 0.4);
+}
+
+static void FinalSetup() {
+ object o;
+ if(QueryProp(P_LEVEL) > 5 || present("\nibel:waldlichtungskarte",
+ this_object())) return;
+ if(!catch(o = clone_object("/d/wald/nibel/lichtung/obj/karte")))
+ o->move(this_object(), M_NOCHECK);
+}
+
+public int QueryAllowSelect() { return 1; }
+
+public string _query_race() { return "Goblin"; }
+public string _query_real_race() { return "Goblin"; }
+
+public string _query_racedescr() {
+ return break_string("Goblins sind winzige, gruenhaeutige Wesen, sogar "
+ "noch kleiner als Hobbits. An ihren zu dick geratenen Koepfchen "
+ "befinden sich lange, selten reglose, Ohren und eine grosse, krumme "
+ "Nase. Ihre kleine Statur sollte jedoch nicht taeuschen, denn ihre "
+ "fehlende Kraft machen sie mit Geschwindigkeit, Praezision und nicht "
+ "zuletzt ihrer unbestrittenen Ruchlosigkeit alleweil wett. Obwohl "
+ "fuer sie Pluendern, lautes Herumbruellen und die gemeinsten Streiche "
+ "spielen zum Alltag gehoert, wuerde sie niemand als boesartig "
+ "bezeichnen. Denn Goblins sind vieles, aber sicherlich nicht die "
+ "intelligentesten Kreaturen. Durch ihren zaehen Willen und die dicke, "
+ "lederne Haut sind sie aussergewoehnlich widerstandsfaehig, und, "
+ "sofern funkelnde Beute winkt, fuer jedes Abenteuer zu haben.", 78);
+}
+
+public string *_query_racestring() {
+ if(QueryProp(P_GENDER) == FEMALE)
+ return ({"Goblinfrau", "Goblinfrau", "Goblinfrau", "Goblinfrau"});
+ return ({"Goblin", "Goblins", "Goblin", "Goblin"});
+}
+
+public string _query_default_guild() {return "abenteurer";}
+
+public string _query_visible_guild() {
+ switch(lower_case(QueryProp(P_GUILD))) {
+ case "abenteurer": return "abentoira";
+ case "wipfellaeufer": return "wiffelloifa";
+ case "chaos": return "kaos";
+ case "zauberer": return "zaubara";
+ case "bierschuettler": return "biaschuettla";
+ case "katzenkrieger": return "kaznkriega";
+ case "tanjian": return "tanschan";
+ case "klerus": return "klerikae";
+ case "dunkelelfen": return "dunklelfn";
+ case "kaempfer": return "kaempfa";
+ case "karate": return "karatae";
+ case "werwoelfe": return "weawoelf";
+ case "magus": return "magia";
+ case "urukhai": return "urugai";
+ }
+ return QueryProp(P_GUILD);
+}
+
+public mixed RaceDefault(string arg) {
+ if(!arg) return 0;
+ switch(arg) {
+ case P_HANDS:
+ return ({" mit kleinen Faeustchen", 30, ({ DT_BLUDGEON })});
+ case P_BODY:
+ return 15;
+ }
+ return base::RaceDefault(arg);
+}
+
+static mixed _query_localcmds() {
+ return ({({"waaagh", "GoblinCmdWaaagh", 0, 0})}) +
+ base::_query_localcmds();
+}
+
+// "knuddel alle" ist deutlich teurer also who cares :-)
+static varargs int GoblinCmdWaaagh(string arg) {
+ object *obs;
+ string s, w;
+
+ if(!objectp(environment())) return 0;
+ obs = filter(all_inventory(environment()) - ({this_object()}), #'living);
+ obs = obs - filter_objects(obs, "QueryProp", P_INVIS);
+ // levelabhaengige Anzahl aaaaaaa's
+ w = "W"+ sprintf("%'a'"+ (QueryProp(P_LEVEL) / 10 + 3) +"s", "aaa") +"gh!";
+
+ foreach(object o : obs)
+ {
+ string str=(break_string(Name(WER) +" ballt die Faeustchen und "
+ "kreischt laut: "+ w +"\n"
+ + capitalize(o->QueryDu(WER)) + " zuckst erschrocken zusammen.",
+ 78, 0, BS_LEAVE_MY_LFS));
+
+ int res=o->ReceiveMsg(str,MT_LISTEN,MA_EMOTE,0,this_object());
+ if (res<0)
+ {
+ obs-=({o}); // unten nicht mehr mit anzeigen.
+ if (res==MSG_SENSE_BLOCK)
+ ReceiveMsg(o->Name(WER) +" kann Dich nicht hoeren.",
+ MT_NOTIFICATION|MSG_DONT_IGNORE|MSG_DONT_STORE,
+ MA_EMOTE,0,this_object());
+ else
+ ReceiveMsg(o->Name(WER) +" ignoriert Dich oder diesen Befehl.",
+ MT_NOTIFICATION|MSG_DONT_IGNORE|MSG_DONT_STORE,
+ MA_EMOTE,0,this_object());
+ }
+ }
+ int anzahl=sizeof(obs);
+ if(!anzahl)
+ {
+ ReceiveMsg("Du ballst die Faeustchen und kreischst laut: "
+ + w, MT_NOTIFICATION|MSG_DONT_IGNORE,MA_EMOTE,0,this_object());
+ }
+ else
+ {
+ s = CountUp(map_objects(obs, "name", WER));
+ ReceiveMsg(break_string("Du ballst die Faeustchen und kreischst laut: "
+ + w +"\n"+ capitalize(s) +" zuck"
+ +(anzahl > 1 ? "en" : "t") +" erschrocken zusammen.",
+ 78, 0, BS_LEAVE_MY_LFS),
+ MT_NOTIFICATION|MSG_DONT_STORE|MSG_DONT_IGNORE,
+ MA_EMOTE,0,this_object());
+ }
+ return 1;
+}
+