blob: 95c73f607707b6de68251880de48c21fe9d51a05 [file] [log] [blame]
#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 <combat.h>
#include <defines.h>
#include <defuel.h>
/*
* Orks:
* Orks sind eigentlich boese und blutruenstig, was auch oft genug zum
* Vorschein tritt :) Wenn ein Ork zu heftig forscht, quengelt er rum
* und weigert sich, bis er nicht wieder ein bisschen Blut verspritzt
* hat,
*/
#define F_MAX 500
#define F_DEG 3
#define NO_EXAMINE ({ \
"Du knurrst: Ich will Blut, keine Bluemchen.", \
"Du grummelst: Bin ich ein Forscher, oder was?" \
})
static int f_cnt, f_deg;
int
QueryFCnt() {
return f_cnt;
}
int
SetFCnt(int fc) {
if(fc > -1 && fc < F_MAX)
f_cnt = fc;
return f_cnt;
}
int
QueryFDeg() {
return f_deg;
}
void
create() {
if (!clonep() || object_name(this_object()) == __FILE__[0..<3]) {
set_next_reset(-1);
return;
}
mixed res;
base::create();
f_cnt=0;
f_deg=F_DEG;
SetDefaultHome("/d/vland/morgoth/room/city/rathalle");
SetDefaultPrayRoom("/d/vland/morgoth/room/city/c0606");
SetProp(P_ATTRIBUTES_OFFSETS,([A_STR:3,A_INT:-1,A_CON:2]));
/* Kleine aeh grosse Muskelpakete */
SetProp(P_SKILL_ATTRIBUTE_OFFSETS,([SA_DAMAGE:110]));
SetProp(P_AVERAGE_SIZE,195);
SetProp(P_AVERAGE_WEIGHT,125000); // ziemlich schwer, viele Muskeln
SetProp(P_MATERIAL_KNOWLEDGE,([MATGROUP_DEAD:60,
MATGROUP_BIO:40,
MATGROUP_ELEMENTAL: 20,
MAT_BLOOD:100]));
SetProp(P_CHANNELS, QueryProp(P_CHANNELS) + ({"Uruk-Hai"}));
SetProp(P_RESISTANCE_STRENGTHS,
([
DT_FIRE : -0.2,
DT_HOLY :0.3,
DT_UNHOLY : -0.2,
DT_ACID : 0.2 ]));
SetProp(P_MAX_FOOD,110);
SetProp(P_MAX_DRINK,110);
SetProp(P_MAX_ALCOHOL,150);
SetProp(P_DEFUEL_LIMIT_FOOD,50);
SetProp(P_DEFUEL_LIMIT_DRINK,70);
SetProp(P_DEFUEL_TIME_FOOD,300);
SetProp(P_DEFUEL_TIME_DRINK,400);
SetProp(P_DEFUEL_AMOUNT_FOOD,0.4);
SetProp(P_DEFUEL_AMOUNT_DRINK,0.35);
/* SP regenerieren sie nich ganz so schnell, dafuer sind sie
* ein bischen schneller bei Gift und Futter */
SetProp(P_SP_DELAY,HEAL_DELAY+1);
SetProp(P_POISON_DELAY,POISON_DELAY-1);
SetProp(P_FOOD_DELAY,FOOD_DELAY-1);
SetProp(P_MAGIC_RESISTANCE_OFFSET,
([ MT_ANGRIFF : 500,
MT_ILLUSION : -250,
MT_BEHERRSCHUNG : -250,
MT_VERWANDLUNG : 500 ]));
if(!(res=QueryProp(P_HANDS)) || !pointerp(res) || (sizeof(res)<3))
res=({" mit starken Haenden",35,({DT_BLUDGEON, DT_RIP}) });
SetProp(P_HANDS,res);
/* Orks haben dicke Haut */
SetProp(P_BODY,20);
/* Groesse wird nur einmal gesetzt */
if(!QueryProp(P_SIZE)){
SetProp(P_SIZE,180+random(31));
Set(P_SIZE,SAVE,F_MODE_AS);
}
/* Dito Gewicht */
if(!QueryProp(P_WEIGHT) || (QueryProp(P_WEIGHT) == 75000)){
SetProp(P_WEIGHT,100000+random(25001)+random(25001));
Set(P_WEIGHT,SAVE,F_MODE_AS);
}
}
string
_query_race() {
return "Ork";
}
string
_query_real_race() {
return "Ork";
}
string
_query_racedescr() {
return break_string("Ein Ork. Die brutale Macht des Boesen. Ein "
"erbitterter Kaempfer, ohne Furcht vor dem Tod. So stellst Du "
"Dir einen Ork vor.\nDiese Orks sehen vielleicht ausserlich so "
"aus: Eine dicke und dunkle, lederartige Haut, die sicher "
"einiges an Schlaegen abhaelt. Lange Eckzaehne, die sicher boese "
"Wunden reissen koennen.\nDu spuerst, dass diese Orks hier ein "
"wenig anders sind. Ihren Drang nach dem Blut ihrer Feinde scheinen "
"sie recht gut unter Kontrolle zu haben, die meiste Zeit zumindest. "
"Sie sind in der Lage, friedlich zwischen den anderen Rassen zu "
"wandeln. Dennoch sind vor allem die Uruk-Hai Orks als Gegner nicht "
"zu unterschaetzen, sollte es doch einmal zu einem Kampf kommen.",
78,0,BS_LEAVE_MY_LFS);
}
int
QueryAllowSelect() {
return 1;
}
string
*_query_racestring() {
if (QueryProp(P_GENDER)==FEMALE)
return ({"Orkin","Orkin","Orkin","Orkin"});
return ({"Ork","Orkes","Ork","Ork"});
}
string
_query_default_guild(){
return "urukhai";
}
mixed
RaceDefault(string arg) {
if (!arg)
return 0;
switch(arg) {
case P_HANDS :
return ({" mit starken Haenden",35,({DT_BLUDGEON,DT_RIP}) });
case P_BODY :
return 25;
}
return base::RaceDefault(arg);
}
protected void heart_beat() {
::heart_beat();
if(f_cnt > 0 && !--f_deg) {
f_cnt--;
f_deg=F_DEG;
}
}
void
Attack(object enemy) {
if(f_cnt > 0)
f_cnt--;
return ::Attack(enemy);
}
varargs int
_examine(string str, int mode) {
if(++f_cnt > F_MAX) {
tell_object(this_object(),break_string(NO_EXAMINE[random(sizeof(NO_EXAMINE))],78));
return 1;
}
return ::_examine(str,mode);
}