blob: 45e37fb14660d0fbd65786c21b8bdab5123dbfc3 [file] [log] [blame]
// MorgenGrauen MUDlib
//
// shells/darkelf.c -- Darkelf Shell
//
// $Id: darkelf.c 8675 2014-02-18 20:39:54Z Zesstra $
#pragma strong_types,save_types
inherit "/std/player/base";
#include <properties.h>
#include <attributes.h>
#include <wizlevels.h>
#include <health.h>
#include <new_skills.h>
#include <language.h>
#include <defines.h>
#include <combat.h>
#include <defuel.h>
#include <errord.h>
protected void create()
{
if (!clonep() || object_name(this_object()) == __FILE__[0..<3]) {
set_next_reset(-1);
return;
}
base::create();
SetDefaultHome("/gilden/dunkelelfen");
SetDefaultPrayRoom("/d/unterwelt/cadra/room/town/templemain");
SetProp(P_AVERAGE_SIZE,175);
SetProp(P_AVERAGE_WEIGHT,70000);
SetProp(P_ALIGN, -500);
SetProp(P_SKILL_ATTRIBUTE_OFFSETS,([SA_ENEMY_SAVE:110]));
SetProp(P_ATTRIBUTES_OFFSETS,([A_INT:4,A_DEX:2]));
SetProp(P_MATERIAL_KNOWLEDGE,([MATGROUP_UNHOLY: 100,
MATGROUP_MAGIC: 70,
MATGROUP_DEAD: 50,
MATGROUP_METAL: 30]) );
SetProp(P_RESISTANCE_STRENGTHS,
([ DT_HOLY : 0.25,
DT_UNHOLY : -0.15,
DT_TERROR : -0.05 ]));
SetProp(P_MAX_FOOD,80);
SetProp(P_MAX_DRINK,150);
SetProp(P_MAX_ALCOHOL,70);
SetProp(P_SP_DELAY, HEAL_DELAY-2); // dafuer regeneriert man im freien
SetProp(P_HP_DELAY, HEAL_DELAY-1); // wirklich _nichts_
SetProp(P_FOOD_DELAY,FOOD_DELAY+1);
SetProp(P_DRINK_DELAY,DRINK_DELAY-2);
SetProp(P_ALCOHOL_DELAY,ALCOHOL_DELAY+1);
SetProp(P_MAGIC_RESISTANCE_OFFSET,
([ MT_ILLUSION : 200,
MT_ANGRIFF : 500,
MT_BEHERRSCHUNG: 500,
MT_PSYCHO : 800 ]));
/* Groesse wird nur einmal gesetzt */
if(!QueryProp(P_SIZE)) {
SetProp(P_SIZE,150+random(50));
Set(P_SIZE,SAVE,F_MODE_AS);
}
/* Dito Gewicht */
if(!QueryProp(P_WEIGHT) || (QueryProp(P_WEIGHT) == 75000)){
SetProp(P_WEIGHT,60000+random(20001));
if(QueryProp(P_GENDER)==FEMALE)
SetProp(P_WEIGHT,QueryProp(P_WEIGHT)-5000);
Set(P_WEIGHT,SAVE,F_MODE_AS);
}
SetProp(P_DEFUEL_LIMIT_FOOD,40);
SetProp(P_DEFUEL_LIMIT_DRINK,30);
SetProp(P_DEFUEL_TIME_FOOD,400);
SetProp(P_DEFUEL_TIME_DRINK,250);
SetProp(P_DEFUEL_AMOUNT_FOOD,0.45);
SetProp(P_DEFUEL_AMOUNT_DRINK,0.4);
}
static void FinalSetup()
{
if (!QuerySkill(SK_NIGHTVISION))
ModifySkill(SK_NIGHTVISION, 5000, 0, "ANY");
}
string _query_race()
// nicht static, da sie manchmal auch so aufgerufen wird...
{
return "Dunkelelf";
}
string _query_real_race()
{
return "Dunkelelf";
}
static string _query_racedescr()
{
return
"\
Das Volk der Dunkelelfen lebt in einer grossen Hoehlenstadt gut versteckt\n\
hinter einem Wasserfall. Ueber kaum ein anderes Volk gibt es soviele\n\
Vorurteile wie ueber die Dunkelelfen, und so werden sie von allen misstrauisch\n\
beaeugt oder sogar bekaempft. In diesem Kampf, insbesondere gegen die Elfen,\n\
sind sie voellig auf sich allein gestellt, und so hat sich eine mehr oder\n\
minder autarke Gesellschaft entwickelt. Die Dunkelelfen haben eine eigene\n\
Kultur und eine eigene Goettin, der sie huldigen. Wie auch die Elfen\n\
verfuegen sie ueber ausserordenlich grosse magische Faehigkeiten, auch wenn\n\
sie sich mehr auf die schwarze Seite der Magie spezialisiert haben.\n";
}
// int QueryAllowSelect() { return 0; }
// Aktiviert am 28.07.03, Ark.
int QueryAllowSelect() { return 1; }
string *_query_racestring()
{
if (QueryProp(P_GENDER)==2)
return ({"Dunkelelfe","Dunkelelfe","Dunkelelfe","Dunkelelfe"});
return ({"Dunkelelf","Dunkelelfen","Dunkelelf","Dunkelelf"});
}
static string _query_default_guild()
{
return "dunkelelfen";
}
static int sun_in_room(object room)
{
if (!room) return 0;
closure qp=symbol_function("QueryProp", room);
int lt=funcall(qp, P_LIGHT_TYPE);
// (lt & LT_SUN) ist hier zunaechst _testweise_ drin. Die Rasse wurde
// anders genehmigt. Sollte das im MG ueberhand nehmen und jeder Keller
// nun sonnendurchflutet sein, dann wird das wieder ausgebaut!
// 27.06.04 Padreic
return ( (funcall(qp, P_INT_LIGHT)>0) &&
((lt & LT_SUN) || ((lt==LT_MISC) && !funcall(qp, P_INDOORS))));
}
protected void heart_beat()
{
::heart_beat();
if (sun_in_room(environment()) &&
QueryProp("Dunkelelfen:Outdoor")<random(100) && !QueryProp(P_GHOST)) {
int hp;
hp=QueryProp(P_HP)-1;
SetProp(P_HP, hp);
if (hp<0) {
tell_object(ME,
"Das war wohl zuviel fuer Dich. Das naechste mal solltest Du Dich "
+"wohl besser\ngegen die Sonne schuetzen.\n");
SetProp(P_KILL_NAME,"Zuviel Sonne");
do_damage(999,ME);
SetProp(P_KILL_NAME,0);
}
else tell_object(ME, /* die Info musste irgendwie in eine Zeile */
"Die Sonne scheint gnadenlos auf Dein Haupt und schwaecht Dich.\n");
}
}
static int _query_no_regeneration()
{
if (sun_in_room(environment()))
return NO_REG;
return Query(P_NO_REGENERATION);
}
int StdSkill_Nightvision(object me, string sname, mixed sinfo)
{
int last, light;
if (!sinfo || !environment()) return 0;
if (intp(sinfo)) sinfo=([SI_SKILLABILITY:sinfo]);
if (!mappingp(sinfo)) return 0;
light=(QueryProp(P_PLAYER_LIGHT)<=0 ? -1 : 1);
if (last=sinfo[SI_USR]) { // letztes Lichtlevel != 0
if (light==last) {
if (sinfo[SI_LASTLIGHT]<=time())
return sinfo[SI_SKILLABILITY]+1;
return -1;
}
else {
last=( MAX_ABILITY - sinfo[SI_SKILLABILITY] );
last=(last/1000) + (last%1000 > random(1001) ? 1 : 0);
if (light<0) last/=2; // an Dunkelkeit schneller gewoehnen...
if(!this_interactive() || this_interactive()==this_object())
{
ModifySkill(sname, ([SI_USR: light, SI_LASTLIGHT: time()+last]),
0, sinfo[SI_GUILD]);
}
if (last<=0)
return sinfo[SI_SKILLABILITY]+1;
return -1;
}
}
else { // Startwert...
if(!this_interactive() || this_interactive()==this_object())
{
ModifySkill(sname, ([SI_USR: light, SI_LASTLIGHT: 0]), 0, sinfo[SI_GUILD]);
}
return sinfo[SI_SKILLABILITY]+1;
}
return 0;
}
varargs int CannotSee(int silent)
{
string is_blind;
if ( is_blind = QueryProp( P_BLIND ) ) {
if (!silent) {
if (stringp(is_blind)) write(is_blind);
else write("Du bist blind!\n");
}
return 1;
}
if (environment() && (!IS_LEARNER(ME) || !Query(P_WANTS_TO_LEARN))) {
if (QueryProp(P_GHOST)) {
if (StdSkill_Nightvision(ME, SK_NIGHTVISION, QuerySkill(SK_NIGHTVISION))>0)
return 0;
}
else if (UseSkill(SK_NIGHTVISION)>0) return 0;
if (!silent) {
if (QueryProp(P_PLAYER_LIGHT)<=0)
write("Du kannst nichts sehen, da sich Deine Augen noch nicht an die Dunkelheit\n"
+"gewoehnt haben!\n");
else write("Du bist von dem hellen Licht total geblendet und Du musst Dich erst langsam\n"
+"daran gewoehnen.\n");
}
return 1;
}
return 0;
}
/*
* 2003-11-05, Zook:
*
* Temporaere Funktion, die den Delfen es ermoeglicht, einen
* moeglicherweise falschen Raum (Indoor/Outdoor) zu melden.
*
*/
static int _indoorbug(string key)
{
if (!stringp(key))
key= "";
ERRORD->LogReportedError(
([ F_PROG: "unbekannt",
F_LINE: 0,
F_MSG: "Sonnenfehler: " + key,
F_OBJ: environment(this_object())
])
);
write("Du hast einen fehlerhaften Innen-/Aussen-/Sonnenlichtraum gemeldet.\n");
return 1;
}
static mixed _query_localcmds()
{
return ({ ({"sonnenfehler", "_indoorbug", 0, 0 }) })
+ base::_query_localcmds();
}