From 2db53bca61a7c417a7728d6e729a9df3e716f00e Mon Sep 17 00:00:00 2001 From: Rob Pearce Date: Thu, 22 Sep 2011 02:00:16 +0000 Subject: [PATCH] - [+] when throwin gn aobject, warn if you have no LOF (just like spells) - [+] allow dodge/catch of thrown object when there is no thrower (ie. arrow traps) - [+] simplify monster spellcasting - [+] don't use any mp - [+] select power based on monster hit dice only - [+] monsters should cast spells less often - use f_castchance, default of 15% chance - [+] TEST - [+] you keep your own mpdice when polymorphing into a mosnter - [+] fxied: throw a tranq dart, then: - [+] The cockatrice loses consciousness. The cockatrice falls asleep. - [+] bug: can't operate a fridge on the ground cause it's too heavy to lift - [+] monsters generated on dark levels should always have seeindark 3-4 - [+] vending machines not working... fixed. - [+] in getchoicestr: - [+] if !showall, and if it shows a longdesc, then you hit backspace, longdesc should be cleared. - [+] show completion in a different colour - [+] bug: sometimes we seem to have map->room[x], but no cells with cell->room->id == thatid!! - [+] stop vaults from overlapping. - [+] taking too long to walk down levels - enforce max number of monster free turns - [+] inept weapon penalty should be slightly higher - [+] bad feeling check is too easy. - [+] skeletons should have f_noinjuries - [+] shouldn't check for slipping on things while swimming - [+] tweak how traps + perception skill impact search checks - [+] bug: sometimes we have no player start position. - [+] if the vault creation fails, restart map generation. - [+] only give study scroll ability at high spellcasting skill - [+] typo: ring (1 charges left) * [+] god effects when you die: - [+] pea soup should work in the cell in FRONT of you. - [+] bug: ring of control seems to work when you _weild_ it!! - [+] non-lethal weapons - [+] sword of mercy (at <1hp, ko) - [+] tranq dart - [+] add sleeptypes - [+] change all refernces to f_asleep->val[1] (now an enum) - [+] change "stirs in its slumber" if unconscious - [+] change all 'fallasleep' calls - [+] attacking a ko'd enemy with merciful weapon should do nothing. - [+] ai shouldn't target ko'd enemies - [+] ai should stop targetting people once they're dead/ko'd - [+] bashing damage should sometimes just knock unconscious instead of killing? - [+] if their hp would be >= -3, and onein(2) - [+] different body part names? "metal frame" instead of "body" - [+] implement F_BPNAME, v0=enum bodypart, text = name - [+] getbodypartname() needs a lf argument. - [+] once i add this, also make animals have "front legs" instead of "arms", "paws" rather than "hands" etc. - [+] fix calls to getbodypartname to pass in lf or null - [+] cyborg mods: - [+] can't wear most armour? - [+] need f_noarmouron - we HAVE this bp, but can't put armour on it. - [+] large rust damage from water - [+] if you have a bad feeling about an object, mark it as "[bad]" - [+] f_knownbad - [+] killing should anger the god of mercy --- ai.c | 49 ++++-- attack.c | 315 ++++++++++++++++++++++------------ data.c | 213 +++++++++++++++++------ data/hiscores.db | Bin 6144 -> 6144 bytes defs.h | 37 +++- flag.c | 1 + god.c | 22 ++- god.h | 1 + io.c | 154 +++++++++++------ io.h | 2 +- lf.c | 428 +++++++++++++++++++++++++++++++++-------------- lf.h | 5 +- map.c | 188 ++++++++++++++------- map.h | 3 +- move.c | 9 +- objects.c | 53 ++++-- objects.h | 1 + spell.c | 103 +++++++----- text.c | 2 + 19 files changed, 1112 insertions(+), 474 deletions(-) diff --git a/ai.c b/ai.c index 098ec79..b35fa4d 100644 --- a/ai.c +++ b/ai.c @@ -571,6 +571,8 @@ int aimovetolf(lifeform_t *lf, lifeform_t *target, int wantattack) { if (attackok) { objecttype_t *st; + flag_t *f; + int spellchance = 0; // drink boost potions if (!useitemwithflag(lf, F_AIBOOSTITEM)) { return B_FALSE; @@ -579,7 +581,17 @@ int aimovetolf(lifeform_t *lf, lifeform_t *target, int wantattack) { // try spells first. // can we attack with spells (ie. ones which target the victim)? // if target is adjacent, we will normally just attack rather than try a spell. - spell = aigetattackspell(lf, target); + + // random chance of casting a spell + f = lfhasflag(lf, F_CASTCHANCE); + if (f) spellchance = f->val[0]; + else spellchance = 15; + + if (pctchance(spellchance)) { + spell = aigetattackspell(lf, target); + } else { + spell = OT_NONE; + } st = findot(spell); if ( (spell != OT_NONE) && // found a valid spell/ability to use ((dist != 1) || // there is distance between us and target @@ -1237,20 +1249,27 @@ void aiturn(lifeform_t *lf) { // do we already have a target we are attacking? if (target) { if (db) dblog(".oO { i have a target: lfid %d (%s). }", target->id, target->race->name); - // aquatic grabbers will try to drag their prey into the water - if (lfhasflagval(lf, F_GRABBING, target->id, NA, NA, NULL) && isaquatic(lf) ) { - if ( hasobwithflag(lf->cell->obpile, F_DEEPWATER) && - !hasobwithflag(target->cell->obpile, F_DEEPWATER)) { - // move away! - if (!moveawayfrom(lf, target->cell, DT_ORTH, B_FALSE, B_TRUE)) { - return; + + // target dead or unconscious? + if (isdead(target) || isunconscious(target)) { + if (db) dblog(".oO { my target is dead/ko'd }", target->id, target->race->name); + loseaitargets(lf); + } else { + // aquatic grabbers will try to drag their prey into the water + if (lfhasflagval(lf, F_GRABBING, target->id, NA, NA, NULL) && isaquatic(lf) ) { + if ( hasobwithflag(lf->cell->obpile, F_DEEPWATER) && + !hasobwithflag(target->cell->obpile, F_DEEPWATER)) { + // move away! + if (!moveawayfrom(lf, target->cell, DT_ORTH, B_FALSE, B_TRUE)) { + return; + } } } - } - // try to move towards them. - if (!aimovetolf(lf, target, B_TRUE)) { - // success - return; + // try to move towards them. + if (!aimovetolf(lf, target, B_TRUE)) { + // success + return; + } } } @@ -1375,7 +1394,7 @@ void aiturn(lifeform_t *lf) { lifeform_t *who; if (lf->los[n] != lf->cell) { who = lf->los[n]->lf; - if (who && cansee(lf, who)) { + if (who && !isdead(who) && !isunconscious(who) && cansee(lf, who)) { if (lfhasflagval(lf, F_HATESRACE, who->race->id, NA, NA, NULL) || lfhasflagval(lf, F_HATESRACE, who->race->baseid, NA, NA, NULL) ) { if (db) dblog(".oO { found a hated target - lfid %d (%s) ! }",who->id, who->race->name); @@ -1391,7 +1410,7 @@ void aiturn(lifeform_t *lf) { if (lf->los[n] != lf->cell) { lifeform_t *who; who = lf->los[n]->lf; - if (who && cansee(lf, who)) { + if (who && cansee(lf, who) && !isdead(who) && !isunconscious(who)) { if (areenemies(lf, who)) { if (db) dblog(".oO { found an enemy target - lfid %d (%s) ! }",who->id, who->race->name); newtarget = who; diff --git a/attack.c b/attack.c index ef2315a..eeee04e 100644 --- a/attack.c +++ b/attack.c @@ -172,6 +172,8 @@ int attackcell(lifeform_t *lf, cell_t *c, int force) { int attackedfriend = B_FALSE; int attackedpeaceful = B_FALSE; + stoprunning(lf); + // anyone there? if so just attack. if (c->lf) { if (!force && isplayer(lf) && !areenemies(lf,c->lf) && (getraceclass(c->lf) != RC_PLANT)) { @@ -462,7 +464,7 @@ int attackcell(lifeform_t *lf, cell_t *c, int force) { } // god effects... - if (attacktype == AT_LF) { + if ((attacktype == AT_LF) && isplayer(lf)) { if (attackedfriend) { angergodmaybe(R_GODMERCY, 100); angergodmaybe(R_GODPURITY, 100); @@ -587,6 +589,22 @@ int attacklf(lifeform_t *lf, lifeform_t *victim, object_t *wep, flag_t *damflag) } } + if (wep && lfhasflagval(victim, F_ASLEEP, NA, ST_KO, NA, NULL)) { + f = hasflag(wep->flags, F_MERCIFUL); + if (f) { + if (isplayer(lf)) { + msg("^wYour %s refuses to attack %s!", noprefix(wepname), victimname); + if (!f->known) f->known = B_TRUE; + } else if (cansee(player, lf)) { + msg("^w%s%s %s refuses to attack %s!", attackername, getpossessive(attackername), + noprefix(wepname), victimname); + if (!f->known) f->known = B_TRUE; + } + taketime(lf, getattackspeed(lf)); + return B_FALSE; + } + } + getflags(lf->flags, retflag, &nretflags, F_NONCORPOREAL, F_NONE); for (i = 0; i < nretflags; i++) { @@ -613,10 +631,10 @@ int attacklf(lifeform_t *lf, lifeform_t *victim, object_t *wep, flag_t *damflag) critpos = getrandomcorebp(victim); // replace victicname to include body part if ((lf == victim) && !isplayer(lf)) { - snprintf(victimbpname, BUFLEN, "its %s", getbodypartname(critpos)); + snprintf(victimbpname, BUFLEN, "its %s", getbodypartname(victim, critpos)); } else { getlfname(victim, buf); - snprintf(victimbpname, BUFLEN, "%s%s %s", buf, getpossessive(buf), getbodypartname(critpos)); + snprintf(victimbpname, BUFLEN, "%s%s %s", buf, getpossessive(buf), getbodypartname(victim, critpos)); } } else { strcpy(victimbpname, ""); @@ -751,7 +769,6 @@ int attacklf(lifeform_t *lf, lifeform_t *victim, object_t *wep, flag_t *damflag) dam[0] *= 2; } - // bonus for knowledge about the other lf's race? applied LAST. slev = getlorelevel(lf, victim->race->raceclass->id); if (slev == PR_INEPT) { @@ -907,7 +924,7 @@ int attacklf(lifeform_t *lf, lifeform_t *victim, object_t *wep, flag_t *damflag) strcpy(extradambuf, ""); if (dam[i] == 0) { - if (getlorelevel(lf, victim->race->raceclass->id) >= PR_ADEPT) { + if (getlorelevel(lf, victim->race->raceclass->id)) { //strcpy(extradambuf, " but do no damage"); strcpy(extradambuf, " ineffectually"); } @@ -1040,7 +1057,7 @@ int attacklf(lifeform_t *lf, lifeform_t *victim, object_t *wep, flag_t *damflag) // other effects if (!isdead(victim) && !blocked) { // special weapon effects, as long as you're not doing a heavy blow - if (!lfhasflag(lf, F_HEAVYBLOW)) { + if (!lfhasflag(lf, F_HEAVYBLOW) && dam[0]) { wepeffects(wep->flags, victim->cell, damflag, dam[0]); } if (isunarmed) { @@ -1106,7 +1123,9 @@ int attacklf(lifeform_t *lf, lifeform_t *victim, object_t *wep, flag_t *damflag) } // confer flags from attacker? - wepeffects(lf->flags, victim->cell, damflag, dam[0]); + if (dam[0]) { + wepeffects(lf->flags, victim->cell, damflag, dam[0]); + } // special lifeform-based effects if ((lf->race->id == R_COCKATRICE) && dam[0]) { @@ -1135,7 +1154,10 @@ int attacklf(lifeform_t *lf, lifeform_t *victim, object_t *wep, flag_t *damflag) } } - fightback(victim, lf); + // if victim can still move... + if (hasfreeaction(victim)) { + fightback(victim, lf); + } } // end if !isdead(victim) // retaliation happens even if victim died @@ -1371,7 +1393,7 @@ int attackob(lifeform_t *lf, object_t *o, object_t *wep, flag_t *damflag) { } // end foreach damtype // special weapon effects, as long as you're not doing a heavy blow - if (!lfhasflag(lf, F_HEAVYBLOW)) { + if (!lfhasflag(lf, F_HEAVYBLOW) && dam[0]) { wepeffects(wep->flags, obloc, damflag, dam[0]); } @@ -1393,8 +1415,8 @@ int attackob(lifeform_t *lf, object_t *o, object_t *wep, flag_t *damflag) { void criticalhit(lifeform_t *lf, lifeform_t *victim, enum BODYPART hitpos, enum DAMTYPE damtype) { - object_t *o; - char lfname[BUFLEN],victimname[BUFLEN]; + object_t *o,*armour; + char lfname[BUFLEN],victimname[BUFLEN],obname[BUFLEN]; // replace some dam types if (damtype == DT_UNARMED) damtype = DT_BASH; if (damtype == DT_BITE) damtype = DT_SLASH; @@ -1410,51 +1432,117 @@ void criticalhit(lifeform_t *lf, lifeform_t *victim, enum BODYPART hitpos, enum switch (rnd(1,2)) { case 1: fall(victim, lf, B_TRUE); break; case 2: - if (cansee(player, lf) || cansee(player, victim)) { - getlfname(lf, lfname); - getlfname(victim, victimname); - setfacing(victim, getrandomdirexcept(DT_COMPASS, victim->facing)); - msg("%s%s blow spins %s around!", lfname, getpossessive(lfname),victimname); + if (lf) { + if (cansee(player, lf) || cansee(player, victim)) { + getlfname(lf, lfname); + getlfname(victim, victimname); + setfacing(victim, getrandomdirexcept(DT_COMPASS, victim->facing)); + msg("%s%s blow spins %s around!", lfname, getpossessive(lfname),victimname); + } + } else { + if (isplayer(victim) || cansee(player, victim)) { + getlfname(victim, victimname); + setfacing(victim, getrandomdirexcept(DT_COMPASS, victim->facing)); + msg("%s is spun around!", victimname); + } } break; } } - if (!getarmour(victim, BP_BODY)) injure(victim, BP_BODY, damtype); + if ((armour = getarmour(victim, BP_BODY)) != NULL) { + getobname(armour, obname, armour->amt); + if (isplayer(victim)) { + msg("Your %s protects you.", noprefix(obname)); + } else if (cansee(player, victim)) { + msg("%s%s %s protects it.", victimname, getpossessive(victimname), noprefix(obname)); + } + } else { + injure(victim, BP_BODY, damtype); + } break; case BP_HEAD: if (pctchance(80)) fall(victim, lf, B_TRUE); - stun(victim, 1); + stun(victim, 2); + // chance of your helmet falling off o = getarmour(victim, BP_HEAD); if (o) { - if (isplayer(victim)) { - char buf[BUFLEN]; - getobname(o, buf, o->amt); - msg("Your %s falls off!", noprefix(buf)); - } else if (cansee(player, victim)) { - char buf[BUFLEN], lfname[BUFLEN]; - getobname(o, buf, o->amt); - getlfname(victim, lfname); - msg("%s%s %s falls off!", lfname, getpossessive(lfname), noprefix(buf)); + if (onein(2)) { + if (isplayer(victim)) { + char buf[BUFLEN]; + getobname(o, buf, o->amt); + msg("Your %s falls off!", noprefix(buf)); + } else if (cansee(player, victim)) { + char buf[BUFLEN], lfname[BUFLEN]; + getobname(o, buf, o->amt); + getlfname(victim, lfname); + msg("%s%s %s falls off!", lfname, getpossessive(lfname), noprefix(buf)); + } + moveob(o, victim->cell->obpile, o->amt); + } else { + if (isplayer(victim)) { + msg("Your %s protects you.", noprefix(obname)); + } else if (cansee(player, victim)) { + msg("%s%s %s protects it.", victimname, getpossessive(victimname), noprefix(obname)); + } } - moveob(o, victim->cell->obpile, o->amt); } else { injure(victim, BP_HEAD, damtype); } break; case BP_HANDS: - if (!getarmour(victim, BP_HANDS)) injure(victim, BP_HANDS, damtype); - // drop your weapon! - o = getweapon(victim); - if (o) drop(o, ALL); - break; + if ((armour = getarmour(victim, BP_HANDS)) != NULL) { + getobname(armour, obname, armour->amt); + if (isplayer(victim)) { + msg("Your %s protects you.", noprefix(obname)); + } else if (cansee(player, victim)) { + msg("%s%s %s protects it.", victimname, getpossessive(victimname), noprefix(obname)); + } + } else { + injure(victim, BP_HANDS, damtype); + } + + if (onein(2)) { + // drop your weapon! + o = getweapon(victim); + if (o) drop(o, ALL); + break; + } case BP_LEGS: if (pctchance(70)) fall(victim, lf, B_TRUE); - if (!getarmour(victim, BP_LEGS)) injure(victim, BP_LEGS, damtype); + if ((armour = getarmour(victim, BP_LEGS)) != NULL) { + getobname(armour, obname, armour->amt); + if (isplayer(victim)) { + msg("Your %s protects you.", noprefix(obname)); + } else if (cansee(player, victim)) { + msg("%s%s %s protects it.", victimname, getpossessive(victimname), noprefix(obname)); + } + } else { + injure(victim, BP_LEGS, damtype); + } break; } } else if (damtype == DT_SLASH) { - if (!getarmour(victim, hitpos)) injure(victim, hitpos, damtype); + if ((armour = getarmour(victim, hitpos)) != NULL) { + getobname(armour, obname, armour->amt); + if (isplayer(victim)) { + msg("Your %s protects you.", noprefix(obname)); + } else if (cansee(player, victim)) { + msg("%s%s %s protects it.", victimname, getpossessive(victimname), noprefix(obname)); + } + } else { + injure(victim, hitpos, damtype); + } + } else if (damtype == DT_EXPLOSIVE) { + if ((armour = getarmour(victim, hitpos)) != NULL) { + int min,max; + max = getobmaxhp(o); + min = max / 2; + limit(&min, 1, NA); + takedamage(armour, rnd(min,max), DT_EXPLOSIVE); + } else { + injure(victim, hitpos, damtype); + } } if (lf) { @@ -1581,16 +1669,18 @@ char *getattackverb(lifeform_t *lf, object_t *wep, enum DAMTYPE damtype, int dam } else if (damtype == DT_BASH) { if (pct <= 5) { return "whack"; - } else if (pct <= 20) { + } else if (pct <= 15) { if (onein(2)) { return "hit"; } else { return "bash"; } - } else if (pct <= 30) { + } else if (pct <= 25) { return "pummel"; - } else { + } else if (pct <= 35) { return "slam"; + } else { + return "clobber"; } } else if (damtype == DT_BITE) { if (lf && (ownersize <= SZ_SMALL)) { @@ -1807,6 +1897,10 @@ char *getkillverb(lifeform_t *victim, object_t *wep, enum DAMTYPE damtype, int d float pct; pct = (int)(((float) dam / (float) maxhp) * 100.0); + if (wep && hasflag(wep->flags, F_MERCIFUL)) { + return "knock out"; + } + if (victim->race->id == R_DANCINGWEAPON) { return "defeat"; } @@ -1876,6 +1970,11 @@ char *getkillverb(lifeform_t *victim, object_t *wep, enum DAMTYPE damtype, int d // can't "kill" the undead return "destroy"; } + + // never use 'kill' for bashing since you might just knock them out + if (damtype == DT_BASH) { + return "clobber"; + } return "kill"; } @@ -2324,94 +2423,88 @@ void wepeffects(flagpile_t *fp, cell_t *where, flag_t *damflag, int dam) { f->known = B_TRUE; } else if ((f->id == F_HITCONFER) && victim ) { // only works if we did damage - if (dam) { - enum FLAG fid; - int howlong; - flag_t *valflag = NULL; + enum FLAG fid; + int howlong; + flag_t *valflag = NULL; - fid = f->val[0]; - // the f_poisoned flag stacks, others don't. - if (!lfhasflag(victim, fid) || (fid == F_POISONED)) { - int passedcheck = B_FALSE; - // do they get a saving throw? - if (f->val[1] != NA) { - int scdiff; - if (f->val[2] == NA) { - scdiff = 20; // default - } else { - scdiff = f->val[2]; - } - if (skillcheck(victim, f->val[1], scdiff, 0)) { - passedcheck = B_TRUE; - } + fid = f->val[0]; + // the f_poisoned flag stacks, others don't. + if (!lfhasflag(victim, fid) || (fid == F_POISONED)) { + int passedcheck = B_FALSE; + // do they get a saving throw? + if (f->val[1] != NA) { + int scdiff; + if (f->val[2] == NA) { + scdiff = 20; // default + } else { + scdiff = f->val[2]; } + if (skillcheck(victim, f->val[1], scdiff, 0)) { + passedcheck = B_TRUE; + } + } - if (!passedcheck) { - - howlong = gethitconferlifetime(f->text, NULL, NULL); + if (!passedcheck) { + + howlong = gethitconferlifetime(f->text, NULL, NULL); - // get conferred flag values - valflag = hasflag(f->pile, F_HITCONFERVALS); + // get conferred flag values + valflag = hasflag(f->pile, F_HITCONFERVALS); - if (fid == F_POISONED) { - // need to fill in the name of what poisoned us - char frombuf[BUFLEN]; - enum POISONTYPE ptype; - int ppower; - if (wep) { - if (owner) { - char lfname[BUFLEN]; - char wepname[BUFLEN]; - getlfnamea(owner, lfname); - getobname(wep, wepname, 1); - // ie. "a goblin's poisoned short sword" - snprintf(frombuf, BUFLEN, "%s%s %s",lfname,getpossessive(lfname), wepname); - } else { - char wepname[BUFLEN]; - getobname(wep, wepname, 1); - // ie "a poisoned short sword" - snprintf(frombuf, BUFLEN, "%s", wepname); - } + if (fid == F_POISONED) { + // need to fill in the name of what poisoned us + char frombuf[BUFLEN]; + enum POISONTYPE ptype; + int ppower; + if (wep) { + if (owner) { + char lfname[BUFLEN]; + char wepname[BUFLEN]; + getlfnamea(owner, lfname); + getobname(wep, wepname, 1); + // ie. "a goblin's poisoned short sword" + snprintf(frombuf, BUFLEN, "%s%s %s",lfname,getpossessive(lfname), wepname); } else { - strcpy(frombuf, "something unknown"); + char wepname[BUFLEN]; + getobname(wep, wepname, 1); + // ie "a poisoned short sword" + snprintf(frombuf, BUFLEN, "%s", wepname); } + } else { + strcpy(frombuf, "something unknown"); + } - if (valflag) { - ptype = valflag->val[0]; - if (valflag->val[1] == NA) { - ppower = 1; - } else { - ppower = valflag->val[1]; - } - } else { - // should never happen. - ptype = P_VENOM; + if (valflag) { + ptype = valflag->val[0]; + if (valflag->val[1] == NA) { ppower = 1; + } else { + ppower = valflag->val[1]; } - - poison(victim, howlong, ptype, ppower, frombuf); } else { - flag_t *conferredflag; - conferredflag = addtempflag(victim->flags, fid, NA, NA, NA, NULL, howlong); - // flag values - if (valflag) { - conferredflag->val[0] = valflag->val[0]; - conferredflag->val[1] = valflag->val[1]; - conferredflag->val[2] = valflag->val[2]; - free(conferredflag->text); - conferredflag->text = strdup(valflag->text); - } + // should never happen. + ptype = P_VENOM; + ppower = 1; } - } // end if passedcheck - } // end (if victim doesn't already have the flag) - // was this from a poisoned weapon? if so the poison vanishes - if ((f->val[0] == F_POISONED) && (f->lifetime == FROMOBMOD)) { - killflag(f); - if (owner && isplayer(owner)) { - addflag(owner->flags, F_USEDPOISON, B_TRUE, NA, NA, NULL); + poison(victim, howlong, ptype, ppower, frombuf); + } else { + // flag values + if (valflag) { + addtempflag(victim->flags, fid, valflag->val[0], valflag->val[1], valflag->val[2], valflag->text, howlong); + } else { + addtempflag(victim->flags, fid, NA, NA, NA, NULL, howlong); + } } + } // end if passedcheck + } // end (if victim doesn't already have the flag) + + // was this from a poisoned weapon? if so the poison vanishes + if ((f->val[0] == F_POISONED) && (f->lifetime == FROMOBMOD)) { + killflag(f); + if (owner && isplayer(owner)) { + addflag(owner->flags, F_USEDPOISON, B_TRUE, NA, NA, NULL); } } } // end if (fid == hitconfer) diff --git a/data.c b/data.c index 04a41cf..c9c6890 100644 --- a/data.c +++ b/data.c @@ -161,6 +161,7 @@ void initjobs(void) { // stat mods // initial objects addflag(lastjob->flags, F_STARTOB, 100, NA, NA, "2 bananas"); + addflag(lastjob->flags, F_STARTOB, 100, NA, NA, "short sword"); addflag(lastjob->flags, F_STARTOB, 100, NA, NA, "leather armour"); addflag(lastjob->flags, F_STARTOB, 100, NA, NA, "10 gold coins"); addflag(lastjob->flags, F_STARTOB, 100, NA, NA, "3 potions of healing"); @@ -178,7 +179,6 @@ void initjobs(void) { addflag(lastjob->flags, F_CANLEARN, i, NA, NA, NULL); } // abilities - addflag(lastjob->flags, F_SELECTWEAPON, B_TRUE, NA, NA, NULL); addflag(lastjob->flags, F_MPDICE, 1, NA, NA, NULL); addflag(lastjob->flags, F_HIRABLE, B_TRUE, NA, NA, NULL); @@ -268,6 +268,7 @@ void initjobs(void) { addflag(lastjob->flags, F_STARTSKILL, SK_CARTOGRAPHY, PR_ADEPT, NA, NULL); addflag(lastjob->flags, F_STARTSKILL, SK_PERCEPTION, PR_NOVICE, NA, NULL); addflag(lastjob->flags, F_STARTSKILL, SK_SPEECH, PR_ADEPT, NA, NULL); + addflag(lastjob->flags, F_STARTSKILL, SK_SS_NATURE, PR_NOVICE, NA, NULL); // learnable skills addflag(lastjob->flags, F_CANLEARN, SK_COOKING, NA, NA, NULL); addflag(lastjob->flags, F_CANLEARN, SK_LISTEN, NA, NA, NULL); @@ -607,6 +608,7 @@ void initjobs(void) { f = addflag(lastjob->flags, F_CANCAST, OT_S_TELEKINESIS, NA, NA, NULL); addcondition(f, FC_IFMONSTER, 33); f = addflag(lastjob->flags, F_CANCAST, OT_S_HASTE, NA, NA, NULL); addcondition(f, FC_IFMONSTER, 20); f = addflag(lastjob->flags, F_CANCAST, OT_S_HEALING, NA, NA, NULL); addcondition(f, FC_IFMONSTER, 20); + addflag(lastjob->flags, F_CASTCHANCE, 30, NA, NA, NULL); // non-player jobs addjob(J_SHOPKEEPER, "Shopkeeper"); @@ -742,14 +744,16 @@ void initobjects(void) { // weapons addbrand(BR_BALANCE, "of balance", BP_WEAPON); addflag_real(lastbrand->flags, F_BALANCE, B_TRUE, NA, NA, NULL, PERMENANT, B_UNKNOWN, -1); + addbrand(BR_IMPACT, "of impact", BP_WEAPON); // TODO: make thisonly go ont obashing weapons + addflag_real(lastbrand->flags, F_HEAVYBLOW, B_TRUE, NA, NA, NULL, PERMENANT, B_UNKNOWN, -1); + addbrand(BR_MERCY, "of mercy", BP_WEAPON); + addflag_real(lastbrand->flags, F_MERCIFUL, B_TRUE, NA, NA, NULL, PERMENANT, B_UNKNOWN, -1); addbrand(BR_PYROMANIA, "of pyromania", BP_WEAPON); addflag_real(lastbrand->flags, F_FLAMESTRIKE, B_TRUE, NA, NA, NULL, PERMENANT, B_UNKNOWN, -1); addbrand(BR_REVENGE, "of revenge", BP_WEAPON); addflag_real(lastbrand->flags, F_REVENGE, B_TRUE, NA, NA, NULL, PERMENANT, B_UNKNOWN, -1); addbrand(BR_SHARPNESS, "of sharpness", BP_WEAPON); addflag_real(lastbrand->flags, F_ARMOURPIERCE, B_TRUE, NA, NA, NULL, PERMENANT, B_UNKNOWN, -1); - addbrand(BR_IMPACT, "of impact", BP_WEAPON); // TODO: make thisonly go ont obashing weapons - addflag_real(lastbrand->flags, F_HEAVYBLOW, B_TRUE, NA, NA, NULL, PERMENANT, B_UNKNOWN, -1); // feet addbrand(BR_LEVITATION, "of hovering", BP_FEET); @@ -3077,7 +3081,7 @@ void initobjects(void) { addflag(lastot->flags, F_CHARGELOWMSG, B_TRUE, NA, NA, "flickers"); addflag(lastot->flags, F_CHARGEOUTMSG, B_TRUE, NA, NA, "goes out"); - addot(OT_FRIDGE, "refrigerator", "An insulated household appliance, made for storing food.", MT_METAL, 80, OC_TOOLS, SZ_HUMAN); + addot(OT_FRIDGE, "refrigerator", "An insulated household appliance, made for storing food.", MT_METAL, 120, OC_TOOLS, SZ_HUMAN); addflag(lastot->flags, F_RARITY, H_ALL, 100, RR_COMMON, NULL); addflag(lastot->flags, F_GLYPH, C_WHITE, NA, NA, "]"); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); @@ -3542,7 +3546,7 @@ void initobjects(void) { addflag(lastot->flags, F_NOPICKUP, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_DIECONVERTTEXT, NA, NA, NA, "evaporates"); addflag(lastot->flags, F_DIECONVERT, NA, NA, NA, "puddle of acid"); - addflag(lastot->flags, F_OBHP, 4, 4, NA, NULL); + addflag(lastot->flags, F_OBHP, 10, 10, NA, NULL); addflag(lastot->flags, F_OBHPDRAIN, 1, NA, NA, NULL); addflag(lastot->flags, F_NOOBDAMTEXT, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_DAMAGABLE, B_TRUE, NA, NA, NULL); @@ -3556,7 +3560,7 @@ void initobjects(void) { addflag(lastot->flags, F_GLYPH, NA, NA, NA, "~"); addflag(lastot->flags, F_NOPICKUP, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_OBDIETEXT, NA, NA, NA, "evaporates"); - addflag(lastot->flags, F_OBHP, 4, 4, NA, NULL); + addflag(lastot->flags, F_OBHP, 5, 5, NA, NULL); addflag(lastot->flags, F_OBHPDRAIN, 1, NA, NA, NULL); addflag(lastot->flags, F_NOOBDAMTEXT, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_DAMAGABLE, B_TRUE, NA, NA, NULL); @@ -3570,7 +3574,7 @@ void initobjects(void) { addflag(lastot->flags, F_GLYPH, NA, NA, NA, ","); addflag(lastot->flags, F_NOPICKUP, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_OBDIETEXT, NA, NA, NA, "evaporates"); - addflag(lastot->flags, F_OBHP, 2, 2, NA, NULL); + addflag(lastot->flags, F_OBHP, 3, 3, NA, NULL); addflag(lastot->flags, F_OBHPDRAIN, 1, NA, NA, NULL); addflag(lastot->flags, F_NOOBDAMTEXT, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_DAMAGABLE, B_TRUE, NA, NA, NULL); @@ -4350,7 +4354,7 @@ void initobjects(void) { addot(OT_RING_SIGHT, "ring of sight", "Allows the caster to see the invisible, and in the dark.", MT_METAL, 0.1, OC_RING, SZ_MINI); addflag(lastot->flags, F_RARITY, H_ALL, 75, NA, ""); addflag(lastot->flags, F_EQUIPCONFER, F_SEEINVIS, NA, NA, NULL); - addflag(lastot->flags, F_EQUIPCONFER, F_SEEINDARK, 2, NA, NULL); + addflag(lastot->flags, F_EQUIPCONFER, F_SEEINDARK, 3, NA, NULL); addflag(lastot->flags, F_EQUIPCONFER, F_VISRANGEMOD, 1, NA, NULL); addot(OT_RING_MANA, "ring of mana", "Increases the wearer's MP pool.", MT_METAL, 0.1, OC_RING, SZ_MINI); addflag(lastot->flags, F_RARITY, H_ALL, 75, NA, ""); @@ -4533,22 +4537,31 @@ void initobjects(void) { addot(OT_DART, "dart", "A small, sharp projectile weapon.", MT_WOOD, 0.5, OC_MISSILE, SZ_SMALL); addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, ""); addflag(lastot->flags, F_THROWMISSILE, B_TRUE, NA, NA, ""); - addflag(lastot->flags, F_MISSILEDAM, 2, NA, NA, ""); + addflag(lastot->flags, F_MISSILEDAM, 1, NA, NA, ""); addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, NA, ""); addflag(lastot->flags, F_NUMAPPEAR, 1, 3, NA, ""); addflag(lastot->flags, F_CANHAVEOBMOD, OM_POISONED, 17, NA, NULL); addflag(lastot->flags, F_RODSHAPED, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_CANBEDIFFMAT, MT_SILVER, 15, NA, NULL); - addot(OT_NANODART, "nanodart", "A metal dart with a laser-sharpened point.", MT_METAL, 0.5, OC_MISSILE, SZ_TINY); + addot(OT_DARTNANO, "nanodart", "A metal dart with a nanofibre point. Capable of piercing most armour.", MT_METAL, 0.5, OC_MISSILE, SZ_TINY); addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, ""); addflag(lastot->flags, F_THROWMISSILE, B_TRUE, NA, NA, ""); - addflag(lastot->flags, F_MISSILEDAM, 2, NA, NA, ""); + addflag(lastot->flags, F_MISSILEDAM, 1, NA, NA, ""); addflag(lastot->flags, F_ARMOURPIERCE, B_TRUE, NA, NA, ""); addflag(lastot->flags, F_RARITY, H_DUNGEON, 67, NA, ""); addflag(lastot->flags, F_NUMAPPEAR, 1, 10, NA, ""); addflag(lastot->flags, F_CANHAVEOBMOD, OM_POISONED, 17, NA, NULL); + addot(OT_DARTTRANQ, "tranquiliser dart", "A metal dart coated with a strong sleep-inducing serum.", MT_METAL, 0.5, OC_MISSILE, SZ_TINY); + addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, NULL); + addflag(lastot->flags, F_THROWMISSILE, B_TRUE, NA, NA, NULL); + addflag(lastot->flags, F_MISSILEDAM, 0, NA, NA, NULL); + addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, NA, NULL); + addflag(lastot->flags, F_NUMAPPEAR, 1, 4, NA, NULL); + addflag(lastot->flags, F_HITCONFER, F_ASLEEP, SC_CON, 27, "20-30"); + addflag(lastot->flags, F_HITCONFERVALS, B_TRUE, ST_ASLEEP, NA, NULL); + addot(OT_NEEDLE, "needle", "A tiny pointed needle.", MT_METAL, 0.02, OC_MISSILE, SZ_TINY); addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, ""); addflag(lastot->flags, F_THROWMISSILE, B_TRUE, NA, NA, ""); @@ -4618,7 +4631,6 @@ void initobjects(void) { addot(OT_BATTLEAXE, "battleaxe", "An large axe specifically designed for combat.", MT_METAL, 8, OC_WEAPON, SZ_MEDIUM); addflag(lastot->flags, F_RARITY, H_DUNGEON, 70, NA, NULL); addflag(lastot->flags, F_DAM, DT_CHOP, NA, NA, "1d8+1"); - addflag(lastot->flags, F_TWOHANDED, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_ACCURACY, 80, NA, NA, NULL); addflag(lastot->flags, F_USESSKILL, SK_AXES, NA, NA, NULL); addflag(lastot->flags, F_ATTREQ, A_STR, 13, NA, NULL); @@ -5196,6 +5208,9 @@ void initrace(void) { addflag(lastrace->flags, F_DTVULN, DT_ELECTRIC, NA, NA, NULL); // other special stuff addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 3, NA, "screechs^a screech"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_HANDS, NA, NA, "talons"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_RIGHTFINGER, NA, NA, "right claw"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_LEFTFINGER, NA, NA, "left claw"); addflag(lastrace->flags, F_RARITY, H_DUNGEON, 60, NA, NULL); addflag(lastrace->flags, F_RARITY, H_FOREST, 75, NA, NULL); addflag(lastrace->flags, F_VARLEVEL, NA, NA, NA, NULL); @@ -5207,25 +5222,39 @@ void initrace(void) { addflag(lastrace->flags, F_HUMANOID, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_FLEEONHPPCT, 50, NA, NA, NULL); - addrace(R_CYBORG, "cyborg", 150, 'R', C_GREY, MT_METAL, RC_HUMANOID); + addrace(R_CYBORG, "cyborg", 150, 'R', C_GREY, MT_FLESH, RC_HUMANOID); // stats addflag(lastrace->flags, F_PLAYABLE, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_STR, AT_GTAVERAGE, NA, NULL); - addflag(lastrace->flags, F_STARTATT, A_DEX, AT_GTAVERAGE, NA, NULL); + addflag(lastrace->flags, F_STARTATT, A_DEX, AT_LOW, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_IQ, AT_GTAVERAGE, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_CON, AT_GTAVERAGE, NA, NULL); - addflag(lastrace->flags, F_STARTATT, A_WIS, AT_LTAVERAGE, NA, NULL); + addflag(lastrace->flags, F_STARTATT, A_WIS, AT_LOW, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_CHA, AT_VLOW, NA, NULL); // bonuses addflag(lastrace->flags, F_EXTRAINFO, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_STARTSKILL, SK_TECHUSAGE, PR_ADEPT, NA, NULL); // penalties addflag(lastrace->flags, F_DTVULN, DT_COLD, NA, NA, NULL); - addflag(lastrace->flags, F_DTVULN, DT_WATER, NA, NA, NULL); + addflag(lastrace->flags, F_DTVULN, DT_WATER, NA, NA, "2d6"); addflag(lastrace->flags, F_DTVULN, DT_ELECTRIC, NA, NA, NULL); addflag(lastrace->flags, F_NOSPELLS, B_TRUE, NA, NA, NULL); + addflag(lastrace->flags, F_NOARMOURON, BP_BODY, NA, NA, NULL); + addflag(lastrace->flags, F_NOARMOURON, BP_LEGS, NA, NA, NULL); + addflag(lastrace->flags, F_NOARMOURON, BP_HANDS, NA, NA, NULL); + addflag(lastrace->flags, F_NOARMOURON, BP_FEET, NA, NA, NULL); + addflag(lastrace->flags, F_NOARMOURON, BP_RIGHTFINGER, NA, NA, NULL); + addflag(lastrace->flags, F_NOARMOURON, BP_LEFTFINGER, NA, NA, NULL); // other special stuff addflag(lastrace->flags, F_BLOODOB, NA, NA, NA, "puddle of oil"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_EARS, NA, NA, "audio inputs"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_EYES, NA, NA, "video inputs"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_BODY, NA, NA, "metal frame"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_LEGS, NA, NA, "stabilisers"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_HANDS, NA, NA, "robotic hands"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_FEET, NA, NA, "lower propulsion units"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_RIGHTFINGER, NA, NA, "right sensor"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_LEFTFINGER, NA, NA, "left sensor"); addflag(lastrace->flags, F_RARITY, H_DUNGEON, 60, NA, NULL); addflag(lastrace->flags, F_RARITY, H_FOREST, 75, NA, NULL); addflag(lastrace->flags, F_VARLEVEL, NA, NA, NA, NULL); @@ -5273,8 +5302,6 @@ void initrace(void) { addflag(lastrace->flags, F_SIZE, SZ_HUMAN, NA, NA, NULL); addflag(lastrace->flags, F_HITDICE, NA, NA, NA, "1d4+3"); addflag(lastrace->flags, F_MOVESPEED, SP_NORMAL, NA, NA, NULL); - addflag(lastrace->flags, F_SEEINDARK, 2, NA, NA, NULL); - addflag(lastrace->flags, F_MEDITATES, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_ACTIONSPEED, SP_NORMAL, NA, NA, NULL); addflag(lastrace->flags, F_HASATTACK, OT_FISTS, NA, NA, "1d2"); addflag(lastrace->flags, F_STARTOB, 80, NA, NA, "1-50 gold coins"); @@ -5290,6 +5317,10 @@ void initrace(void) { addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 3, NA, "shouts^a shout"); addflag(lastrace->flags, F_HUMANOID, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_FLEEONHPPCT, 50, NA, NA, NULL); + // bonuses + addflag(lastrace->flags, F_SEEINDARK, 2, NA, NA, NULL); + addflag(lastrace->flags, F_MEDITATES, B_TRUE, NA, NA, NULL); + // human monsters... addrace(R_BANDITLDR, "bandit leader", 75, '@', C_GREY, MT_FLESH, RC_HUMANOID); @@ -5572,10 +5603,12 @@ void initrace(void) { addflag(lastrace->flags, F_HITDICE, NA, NA, NA, "50d4"); addflag(lastrace->flags, F_UNIQUE, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_HASATTACK, OT_FISTS, NA, NA, "1d2"); + addflag(lastrace->flags, F_STARTOB, 100, NA, NA, "blessed longsword of mercy"); addflag(lastrace->flags, F_STARTOB, 100, NA, NA, "10 blessed vials of ambrosia"); addflag(lastrace->flags, F_STARTOB, 100, NA, NA, "2 rings of regeneration"); addflag(lastrace->flags, F_STARTSKILL, SK_FIRSTAID, PR_MASTER, NA, NULL); addflag(lastrace->flags, F_STARTSKILL, SK_PERCEPTION, PR_MASTER, NA, NULL); + addflag(lastrace->flags, F_STARTSKILL, SK_LONGBLADES, PR_ADEPT, NA, NULL); addflag(lastrace->flags, F_SPELLCASTTEXT, NA, NA, NA, "raises her hand"); // god abilities addflag(lastrace->flags, F_GODOF, B_FEMALE, NA, NA, "Mercy"); @@ -5631,6 +5664,8 @@ void initrace(void) { addflag(lastrace->flags, F_STARTSKILL, SK_PERCEPTION, PR_EXPERT, NA, NULL); addflag(lastrace->flags, F_SILENTMOVE, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_MORALE, 30, NA, NA, NULL); + addflag(lastrace->flags, F_BODYPARTNAME, BP_EYES, NA, NA, "eyestalks"); + addflag(lastrace->flags, F_CASTCHANCE, 30, NA, NA, NULL); addrace(R_BUGBEAR, "bugbear", 120, 'G', C_BROWN, MT_FLESH, RC_HUMANOID); addflag(lastrace->flags, F_HOSTILE, B_TRUE, NA, NA, NULL); @@ -5654,6 +5689,9 @@ void initrace(void) { addflag(lastrace->flags, F_STARTSKILL, SK_PERCEPTION, PR_ADEPT, NA, NULL); addflag(lastrace->flags, F_MINIONS, 50, 1, 3, "goblin"); addflag(lastrace->flags, F_MINIONS, 20, 1, 3, "goblin warrior"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_HANDS, NA, NA, "claws"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_RIGHTFINGER, NA, NA, "right foreclaw"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_LEFTFINGER, NA, NA, "left foreclaw"); addrace(R_COCKATRICE, "cockatrice", 5, 'c', C_YELLOW, MT_FLESH, RC_MAGIC); addflag(lastrace->flags, F_STARTATT, A_DEX, AT_VHIGH, NA, NULL); @@ -5701,6 +5739,7 @@ void initrace(void) { addflag(lastrace->flags, F_NOBODYPART, BP_LEFTFINGER, NA, NA, NULL); addflag(lastrace->flags, F_CANWILL, OT_A_CRUSH, NA, NA, "dam:1d6;"); addflag(lastrace->flags, F_CANWILL, OT_A_CHARGE, NA, NA, "range:5;"); + addflag(lastrace->flags, F_CASTCHANCE, 70, NA, NA, NULL); addrace(R_DARKMANTLE, "darkmantle", 70, 'U', C_BLUE, MT_FLESH, RC_MAGIC); addflag(lastrace->flags, F_ALIGNMENT, AL_EVIL, NA, NA, NULL); @@ -5748,8 +5787,6 @@ void initrace(void) { addflag(lastrace->flags, F_MOVESPEED, SP_SLOW, NA, NA, NULL); addflag(lastrace->flags, F_SPELLSPEED, SP_VERYSLOW, NA, NA, NULL); addflag(lastrace->flags, F_ACTIONSPEED, SP_NORMAL, NA, NA, ""); - addflag(lastrace->flags, F_MPDICE, 0, 25, NA, NULL); - addflag(lastrace->flags, F_MPREGEN, 12, NA, NA, NULL); addflag(lastrace->flags, F_CANCAST, OT_S_DISPERSAL, NA, NA, NULL); addflag(lastrace->flags, F_CANCAST, OT_S_GRAVBOOST, NA, NA, NULL); addflag(lastrace->flags, F_CASTTYPE, CT_GAZE, NA, NA, NULL); @@ -5764,6 +5801,7 @@ void initrace(void) { addflag(lastrace->flags, F_STARTSKILL, SK_PERCEPTION, PR_ADEPT, NA, NULL); addflag(lastrace->flags, F_NOISETEXT, N_FLY, 1, NA, "^flapping wings"); addflag(lastrace->flags, F_MORALE, 30, NA, NA, NULL); + addflag(lastrace->flags, F_CASTCHANCE, 30, NA, NA, NULL); addrace(R_GIANTHILL, "hill giant", 160, 'H', C_GREY, MT_FLESH, RC_HUMANOID); addflag(lastrace->flags, F_ALIGNMENT, AL_EVIL, NA, NA, NULL); @@ -5854,8 +5892,6 @@ void initrace(void) { addflag(lastrace->flags, F_STARTATT, A_DEX, AT_GTAVERAGE, NA, NULL); addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 4, NA, "bellows^a bellow"); addflag(lastrace->flags, F_FLEEONHPPCT, 50, NA, NA, NULL); - addflag(lastrace->flags, F_MPDICE, 0, 9, NA, NULL); - addflag(lastrace->flags, F_MPREGEN, 1, NA, NA, NULL); addflag(lastrace->flags, F_DTRESIST, DT_FIRE, NA, NA, NULL); addflag(lastrace->flags, F_CANCAST, OT_S_FIREDART, NA, NA, NULL); addflag(lastrace->flags, F_CANCAST, OT_S_FLAMEPILLAR, NA, NA, NULL); @@ -5922,6 +5958,9 @@ void initrace(void) { addflag(lastrace->flags, F_PACKATTACK, 3, NA, 2, NULL); addflag(lastrace->flags, F_HUMANOID, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_STARTSKILL, SK_PERCEPTION, PR_ADEPT, NA, NULL); + addflag(lastrace->flags, F_BODYPARTNAME, BP_HANDS, NA, NA, "claws"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_RIGHTFINGER, NA, NA, "right foreclaw"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_LEFTFINGER, NA, NA, "left foreclaw"); addrace(R_GNOLLHM, "gnoll huntmaster", 130, 'h', C_BROWN, MT_FLESH, RC_HUMANOID); lastrace->baseid = R_GNOLL; @@ -5952,6 +5991,9 @@ void initrace(void) { addflag(lastrace->flags, F_MINIONS, 75, 1, 2, "gnoll"); addflag(lastrace->flags, F_HUMANOID, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_STARTSKILL, SK_PERCEPTION, PR_SKILLED, NA, NULL); + addflag(lastrace->flags, F_BODYPARTNAME, BP_HANDS, NA, NA, "claws"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_RIGHTFINGER, NA, NA, "right foreclaw"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_LEFTFINGER, NA, NA, "left foreclaw"); addrace(R_GNOLLMR, "gnoll marauder", 130, 'h', C_BROWN, MT_FLESH, RC_HUMANOID); lastrace->baseid = R_GNOLL; @@ -5981,6 +6023,9 @@ void initrace(void) { addflag(lastrace->flags, F_MINIONS, 75, 1, 2, "gnoll"); addflag(lastrace->flags, F_HUMANOID, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_STARTSKILL, SK_PERCEPTION, PR_ADEPT, NA, NULL); + addflag(lastrace->flags, F_BODYPARTNAME, BP_HANDS, NA, NA, "claws"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_RIGHTFINGER, NA, NA, "right foreclaw"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_LEFTFINGER, NA, NA, "left foreclaw"); addrace(R_GOBLIN, "goblin", 20, 'g', C_BROWN, MT_FLESH, RC_HUMANOID); addflag(lastrace->flags, F_ALIGNMENT, AL_EVIL, NA, NA, NULL); @@ -6093,14 +6138,13 @@ void initrace(void) { addflag(lastrace->flags, F_SEEINDARK, 5, NA, NA, NULL); addflag(lastrace->flags, F_DODGES, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_PACKATTACK, 2, DT_SLASH, 3, NULL); - addflag(lastrace->flags, F_MPDICE, 0, 10, NA, NULL); - addflag(lastrace->flags, F_MPREGEN, 3, NA, NA, NULL); addflag(lastrace->flags, F_CANCAST, OT_S_BLINDNESS, NA, NA, NULL); addflag(lastrace->flags, F_CANCAST, OT_S_PAIN, NA, NA, NULL); addflag(lastrace->flags, F_STARTSKILL, SK_SPELLCASTING, PR_ADEPT, NA, NULL); addflag(lastrace->flags, F_STARTSKILL, SK_PERCEPTION, PR_BEGINNER, NA, NULL); addflag(lastrace->flags, F_HUMANOID, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_MINIONS, 90, 1, 2, "goblin"); + addflag(lastrace->flags, F_CASTCHANCE, 30, NA, NA, NULL); addrace(R_HOBGOBLIN, "hobgoblin", 90, 'g', C_GREEN, MT_FLESH, RC_HUMANOID); addflag(lastrace->flags, F_ALIGNMENT, AL_EVIL, NA, NA, NULL); @@ -6109,7 +6153,7 @@ void initrace(void) { addflag(lastrace->flags, F_RARITY, H_FOREST, 73, NA, NULL); addflag(lastrace->flags, F_NUMAPPEAR, 1, 2, NA, NULL); addflag(lastrace->flags, F_SIZE, SZ_HUMAN, NA, NA, NULL); - addflag(lastrace->flags, F_HITDICE, NA, NA, NA, "2d4+3"); + addflag(lastrace->flags, F_HITDICE, NA, NA, NA, "3d4+3"); addflag(lastrace->flags, F_ARMOURRATING, 8, NA, NA, NULL); addflag(lastrace->flags, F_EVASION, 10, NA, NA, NULL); addflag(lastrace->flags, F_MOVESPEED, SP_NORMAL, NA, NA, NULL); @@ -6180,7 +6224,7 @@ void initrace(void) { addflag(lastrace->flags, F_EVASION, 5, NA, NA, NULL); addflag(lastrace->flags, F_MOVESPEED, SP_NORMAL, NA, NA, NULL); addflag(lastrace->flags, F_ACTIONSPEED, SP_NORMAL, NA, NA, ""); - addflag(lastrace->flags, F_HASATTACK, OT_CLAWS, NA, NA, "1d3"); + addflag(lastrace->flags, F_HASATTACK, OT_CLAWS, NA, NA, "1d3-1"); addflag(lastrace->flags, F_STARTATT, A_STR, AT_LTAVERAGE, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_IQ, AT_LTAVERAGE, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_DEX, AT_HIGH, NA, NULL); @@ -6209,8 +6253,8 @@ void initrace(void) { addflag(lastrace->flags, F_STARTATT, A_STR, AT_HIGH, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_IQ, AT_LOW, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_DEX, AT_AVERAGE, NA, NULL); - addflag(lastrace->flags, F_HASATTACK, OT_FISTS, NA, NA, "1d2"); - addflag(lastrace->flags, F_HASATTACK, OT_TAIL, NA, NA, "1d3"); + addflag(lastrace->flags, F_HASATTACK, OT_FISTS, NA, NA, "1d4"); + addflag(lastrace->flags, F_HASATTACK, OT_TAIL, NA, NA, "1d6"); addflag(lastrace->flags, F_STARTOB, 50, NA, NA, "club"); addflag(lastrace->flags, F_STARTOB, 50, NA, NA, "buckler"); addflag(lastrace->flags, F_STARTOB, 50, NA, NA, "1-10 gold coins"); @@ -6268,10 +6312,12 @@ void initrace(void) { addflag(lastrace->flags, F_STARTSKILL, SK_PERCEPTION, PR_EXPERT, NA, NULL); addflag(lastrace->flags, F_CANWILL, OT_A_GRAB, NA, NA, NULL); addflag(lastrace->flags, F_CANWILL, OT_A_CHARGE, NA, NA, "range:5;"); + addflag(lastrace->flags, F_CASTCHANCE, 40, NA, NA, NULL); addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 3, NA, "roars^a roar"); addflag(lastrace->flags, F_SEEINDARK, 5, NA, NA, NULL); addflag(lastrace->flags, F_MORALE, 20, NA, NA, NULL); addflag(lastrace->flags, F_HUMANOID, B_TRUE, NA, NA, NULL); + addflag(lastrace->flags, F_NOARMOURON, BP_HEAD, NA, NA, NULL); addrace(R_OGRE, "ogre", 160, 'O', C_BROWN, MT_FLESH, RC_HUMANOID); @@ -6496,8 +6542,6 @@ void initrace(void) { addflag(lastrace->flags, F_MOVESPEED, SP_NORMAL, NA, NA, NULL); addflag(lastrace->flags, F_SPELLSPEED, SP_NORMAL, NA, NA, NULL); addflag(lastrace->flags, F_ACTIONSPEED, SP_NORMAL, NA, NA, ""); - addflag(lastrace->flags, F_MPDICE, 0, 4, NA, NULL); - addflag(lastrace->flags, F_MPREGEN, 4, NA, NA, NULL); addflag(lastrace->flags, F_CANCAST, OT_S_TELEKINESIS, NA, NA, NULL); addflag(lastrace->flags, F_SPELLCASTTEXT, NA, NA, B_APPENDYOU, "gestures"); addflag(lastrace->flags, F_NOBODYPART, BP_WEAPON, NA, NA, NULL); @@ -6511,6 +6555,7 @@ void initrace(void) { addflag(lastrace->flags, F_STARTSKILL, SK_PERCEPTION, PR_ADEPT, NA, NULL); addflag(lastrace->flags, F_MORALE, 30, NA, NA, NULL); addflag(lastrace->flags, F_XPMULTIPLY, 2, NA, NA, NULL); + addflag(lastrace->flags, F_CASTCHANCE, 30, NA, NA, NULL); addrace(R_SATYR, "satyr", 80, 'h', C_GREEN, MT_FLESH, RC_HUMANOID); addflag(lastrace->flags, F_ALIGNMENT, AL_EVIL, NA, NA, NULL); @@ -6532,8 +6577,6 @@ void initrace(void) { addflag(lastrace->flags, F_SPELLCASTTEXT, NA, NA, NA, "plays its pipes"); addflag(lastrace->flags, F_RESISTMAG, 10, NA, NA, NULL); addflag(lastrace->flags, F_HUMANOID, B_TRUE, NA, NA, NULL); - addflag(lastrace->flags, F_MPDICE, 0, 16, NA, NULL); - addflag(lastrace->flags, F_MPREGEN, 8, NA, NA, NULL); addflag(lastrace->flags, F_NEEDOBFORSPELLS, OT_PANPIPES, NA, NA, NULL); addflag(lastrace->flags, F_CANCAST, OT_S_CHARM, NA, NA, NULL); addflag(lastrace->flags, F_CANCAST, OT_S_SLEEP, NA, NA, NULL); @@ -6544,6 +6587,7 @@ void initrace(void) { addflag(lastrace->flags, F_CANWILL, OT_A_HIDE, NA, NA, NULL); addflag(lastrace->flags, F_STARTHIDDENPCT, 60, NA, NA, NULL); addflag(lastrace->flags, F_STARTSKILL, SK_PERCEPTION, PR_SKILLED, NA, NULL); + addflag(lastrace->flags, F_CASTCHANCE, 30, NA, NA, NULL); addrace(R_SHADOWCAT, "shadowcat", 5, 'f', C_BLUE, MT_FLESH, RC_MAGIC); addflag(lastrace->flags, F_ALIGNMENT, AL_EVIL, NA, NA, NULL); @@ -6561,6 +6605,9 @@ void initrace(void) { addflag(lastrace->flags, F_CANSEETHROUGHMAT, MT_GAS, NA, NA, NULL); addflag(lastrace->flags, F_AUTOCREATEOB, 1, NA, NA, "cloud of smoke"); addflag(lastrace->flags, F_MORALE, 30, NA, NA, NULL); + addflag(lastrace->flags, F_BODYPARTNAME, BP_HANDS, NA, NA, "paws"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_RIGHTFINGER, NA, NA, "right foreclaw"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_LEFTFINGER, NA, NA, "left foreclaw"); addrace(R_OOZEGREY, "grey ooze", 10, 'j', C_GREY, MT_SLIME, RC_SLIME); addflag(lastrace->flags, F_CORPSETYPE, NA, NA, NA, "pool of slime"); @@ -6571,6 +6618,7 @@ void initrace(void) { addflag(lastrace->flags, F_MOVESPEED, SP_VERYSLOW, NA, NA, NULL); addflag(lastrace->flags, F_ACTIONSPEED, SP_NORMAL, NA, NA, ""); addflag(lastrace->flags, F_STARTATT, A_IQ, IQ_MINDLESS, NA, NULL); + addflag(lastrace->flags, F_NOINJURIES, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_NOBODYPART, BP_WEAPON, NA, NA, NULL); addflag(lastrace->flags, F_NOBODYPART, BP_SECWEAPON, NA, NA, NULL); addflag(lastrace->flags, F_NOBODYPART, BP_RIGHTFINGER, NA, NA, NULL); @@ -6602,8 +6650,6 @@ void initrace(void) { addflag(lastrace->flags, F_FLYING, B_TRUE, NA, NA, ""); addflag(lastrace->flags, F_MOVESPEED, SP_NORMAL, NA, NA, NULL); addflag(lastrace->flags, F_ACTIONSPEED, SP_NORMAL, NA, NA, ""); - addflag(lastrace->flags, F_MPDICE, 0, 4, NA, NULL); - addflag(lastrace->flags, F_MPREGEN, 1, NA, NA, NULL); addflag(lastrace->flags, F_CANCAST, OT_S_FIREDART, NA, NA, NULL); addflag(lastrace->flags, F_SPELLCASTTEXT, NA, NA, B_APPENDYOU, "gestures"); addflag(lastrace->flags, F_HASATTACK, OT_CLAWS, NA, NA, "1d3"); @@ -6615,6 +6661,7 @@ void initrace(void) { addflag(lastrace->flags, F_STARTSKILL, SK_PERCEPTION, PR_BEGINNER, NA, NULL); addflag(lastrace->flags, F_HUMANOID, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_MORALE, 30, NA, NA, NULL); + addflag(lastrace->flags, F_CASTCHANCE, 30, NA, NA, NULL); addrace(R_SPRITEICE, "ice sprite", 5, 'n', C_WHITE, MT_ICE, RC_MAGIC); addflag(lastrace->flags, F_CORPSETYPE, NA, NA, NA, "sheet of ice"); @@ -6628,8 +6675,6 @@ void initrace(void) { addflag(lastrace->flags, F_FLYING, B_TRUE, NA, NA, ""); addflag(lastrace->flags, F_MOVESPEED, SP_NORMAL, NA, NA, NULL); addflag(lastrace->flags, F_ACTIONSPEED, SP_NORMAL, NA, NA, ""); - addflag(lastrace->flags, F_MPDICE, 4, 2, NA, NULL); - addflag(lastrace->flags, F_MPREGEN, 1, NA, NA, NULL); addflag(lastrace->flags, F_CANCAST, OT_S_FROSTBITE, NA, NA, NULL); addflag(lastrace->flags, F_CANCAST, OT_S_FREEZEOB, NA, NA, NULL); addflag(lastrace->flags, F_CANCAST, OT_S_ICICLE, NA, NA, NULL); @@ -6641,6 +6686,7 @@ void initrace(void) { addflag(lastrace->flags, F_STARTSKILL, SK_PERCEPTION, PR_BEGINNER, NA, NULL); addflag(lastrace->flags, F_HUMANOID, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_MORALE, 30, NA, NA, NULL); + addflag(lastrace->flags, F_CASTCHANCE, 30, NA, NA, NULL); addrace(R_TROLL, "troll", 100, 't', C_GREEN, MT_FLESH, RC_HUMANOID); @@ -6660,6 +6706,9 @@ void initrace(void) { addflag(lastrace->flags, F_HUMANOID, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_MORALE, 30, NA, NA, NULL); addflag(lastrace->flags, F_STARTSKILL, SK_PERCEPTION, PR_BEGINNER, NA, NULL); + addflag(lastrace->flags, F_BODYPARTNAME, BP_HANDS, NA, NA, "claws"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_RIGHTFINGER, NA, NA, "right foreclaw"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_LEFTFINGER, NA, NA, "left foreclaw"); addrace(R_XAT, "xat", 2, 'x', C_BROWN, MT_FLESH, RC_ANIMAL); @@ -6676,6 +6725,9 @@ void initrace(void) { addflag(lastrace->flags, F_NOBODYPART, BP_SECWEAPON, NA, NA, NULL); addflag(lastrace->flags, F_NOBODYPART, BP_HANDS, NA, NA, NULL); addflag(lastrace->flags, F_HASATTACK, OT_TEETH, NA, NA, "1d3"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_HANDS, NA, NA, "claws"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_RIGHTFINGER, NA, NA, "right foreclaw"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_LEFTFINGER, NA, NA, "left foreclaw"); // fish addrace(R_CRAB, "giant crab", 250, ';', C_ORANGE, MT_FLESH, RC_AQUATIC); @@ -6691,13 +6743,16 @@ void initrace(void) { addflag(lastrace->flags, F_HASATTACK, OT_CLAWS, NA, NA, "2d4"); addflag(lastrace->flags, F_NOBODYPART, BP_WEAPON, NA, NA, NULL); addflag(lastrace->flags, F_NOBODYPART, BP_SECWEAPON, NA, NA, NULL); - addflag(lastrace->flags, F_NOBODYPART, BP_HANDS, NA, NA, NULL); addflag(lastrace->flags, F_NOBODYPART, BP_WAIST, NA, NA, NULL); addflag(lastrace->flags, F_NOBODYPART, BP_LEGS, NA, NA, NULL); - addflag(lastrace->flags, F_NOBODYPART, BP_FEET, NA, NA, NULL); - addflag(lastrace->flags, F_NOBODYPART, BP_RIGHTFINGER, NA, NA, NULL); - addflag(lastrace->flags, F_NOBODYPART, BP_LEFTFINGER, NA, NA, NULL); addflag(lastrace->flags, F_CANWILL, OT_A_GRAB, NA, NA, NULL); + addflag(lastrace->flags, F_BODYPARTNAME, BP_HANDS, NA, NA, "pincers"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_RIGHTFINGER, NA, NA, "right foreclaw"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_LEFTFINGER, NA, NA, "left foreclaw"); + addflag(lastrace->flags, F_NOARMOURON, BP_RIGHTFINGER, NA, NA, NULL); + addflag(lastrace->flags, F_NOARMOURON, BP_LEFTFINGER, NA, NA, NULL); + addflag(lastrace->flags, F_NOARMOURON, BP_HANDS, NA, NA, NULL); + addflag(lastrace->flags, F_NOARMOURON, BP_FEET, NA, NA, NULL); addrace(R_PIRANHA, "piranha", 0.5, ';', C_GREEN, MT_FLESH, RC_AQUATIC); addflag(lastrace->flags, F_NEEDSWATER, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_HOSTILE, B_TRUE, NA, NA, NULL); @@ -6921,6 +6976,9 @@ void initrace(void) { addflag(lastrace->flags, F_CANWILL, OT_A_GRAB, NA, NA, NULL); addflag(lastrace->flags, F_CANWILL, OT_A_CRUSH, NA, NA, "dam:2d4;"); addflag(lastrace->flags, F_MINIONS, 25, 1, 2, "bear cub"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_HANDS, NA, NA, "paws"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_RIGHTFINGER, NA, NA, "right foreclaw"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_LEFTFINGER, NA, NA, "left foreclaw"); addrace(R_BEARGRIZZLY, "grizzly bear", 200, 'q', C_YELLOW, MT_FLESH, RC_ANIMAL); lastrace->baseid = R_BEAR; addflag(lastrace->flags, F_HOSTILE, B_TRUE, NA, NA, NULL); @@ -6946,6 +7004,9 @@ void initrace(void) { addflag(lastrace->flags, F_CRITKNOCKDOWN, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_BLEEDABIL, OT_A_RAGE, NA, NA, NULL); addflag(lastrace->flags, F_MINIONS, 25, 1, 2, "bear cub"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_HANDS, NA, NA, "paws"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_RIGHTFINGER, NA, NA, "right foreclaw"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_LEFTFINGER, NA, NA, "left foreclaw"); addrace(R_BEARCUB, "bear cub", 60, 'q', C_BROWN, MT_FLESH, RC_ANIMAL); lastrace->baseid = R_BEAR; addflag(lastrace->flags, F_HOSTILE, B_TRUE, NA, NA, NULL); @@ -6966,6 +7027,9 @@ void initrace(void) { addflag(lastrace->flags, F_SEEINDARK, 4, NA, NA, NULL); addflag(lastrace->flags, F_CRITKNOCKDOWN, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_FLEEONHPPCT, 50, NA, NA, ""); + addflag(lastrace->flags, F_BODYPARTNAME, BP_HANDS, NA, NA, "paws"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_RIGHTFINGER, NA, NA, "right foreclaw"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_LEFTFINGER, NA, NA, "left foreclaw"); addrace(R_ANT, "giant ant", 20, 'a', C_BROWN, MT_FLESH, RC_ANIMAL); lastrace->baseid = R_ANT; addflag(lastrace->flags, F_HOSTILE, B_TRUE, NA, NA, NULL); @@ -7068,7 +7132,6 @@ void initrace(void) { addflag(lastrace->flags, F_NOBODYPART, BP_WEAPON, NA, NA, NULL); addflag(lastrace->flags, F_NOBODYPART, BP_SECWEAPON, NA, NA, NULL); addflag(lastrace->flags, F_NOBODYPART, BP_SHOULDERS, NA, NA, NULL); - addflag(lastrace->flags, F_NOBODYPART, BP_HANDS, NA, NA, NULL); addflag(lastrace->flags, F_NOSPELLS, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_WANTSOBFLAG, F_EDIBLE, NA, NA, NULL); addflag(lastrace->flags, F_SEEINDARK, 6, NA, NA, NULL); @@ -7076,6 +7139,9 @@ void initrace(void) { addflag(lastrace->flags, F_NOISETEXT, N_FRUSTRATED, 3, NA, "growls^growling"); addflag(lastrace->flags, F_NOISETEXT, N_LOWHP, 2, NA, "whines in pain^whining"); addflag(lastrace->flags, F_FLEEONHPPCT, 60, NA, NA, ""); + addflag(lastrace->flags, F_BODYPARTNAME, BP_HANDS, NA, NA, "paws"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_RIGHTFINGER, NA, NA, "right foreclaw"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_LEFTFINGER, NA, NA, "left foreclaw"); addrace(R_DOGBLINK, "blink dog", 35, 'd', C_BLUE, MT_FLESH, RC_ANIMAL); addflag(lastrace->flags, F_ALIGNMENT, AL_GOOD, NA, NA, NULL); addflag(lastrace->flags, F_HOSTILE, B_TRUE, NA, NA, NULL); @@ -7092,7 +7158,6 @@ void initrace(void) { addflag(lastrace->flags, F_NOBODYPART, BP_WEAPON, NA, NA, NULL); addflag(lastrace->flags, F_NOBODYPART, BP_SECWEAPON, NA, NA, NULL); addflag(lastrace->flags, F_NOBODYPART, BP_SHOULDERS, NA, NA, NULL); - addflag(lastrace->flags, F_NOBODYPART, BP_HANDS, NA, NA, NULL); addflag(lastrace->flags, F_NOSPELLS, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_WANTSOBFLAG, F_EDIBLE, NA, NA, NULL); addflag(lastrace->flags, F_VEGETARIAN, B_TRUE, NA, NA, NULL); @@ -7102,6 +7167,9 @@ void initrace(void) { addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 3, NA, "barks^barking"); addflag(lastrace->flags, F_NOISETEXT, N_FRUSTRATED, 3, NA, "growls^growling"); addflag(lastrace->flags, F_NOISETEXT, N_LOWHP, 2, NA, "whines in pain^whining"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_HANDS, NA, NA, "paws"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_RIGHTFINGER, NA, NA, "right foreclaw"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_LEFTFINGER, NA, NA, "left foreclaw"); addrace(R_DOGDEATH, "death hound", 40, 'd', C_MAGENTA, MT_FLESH, RC_ANIMAL); addflag(lastrace->flags, F_ALIGNMENT, AL_EVIL, NA, NA, NULL); addflag(lastrace->flags, F_NUMAPPEAR, 2, 6, NA, ""); @@ -7121,7 +7189,6 @@ void initrace(void) { addflag(lastrace->flags, F_NOBODYPART, BP_WEAPON, NA, NA, NULL); addflag(lastrace->flags, F_NOBODYPART, BP_SECWEAPON, NA, NA, NULL); addflag(lastrace->flags, F_NOBODYPART, BP_SHOULDERS, NA, NA, NULL); - addflag(lastrace->flags, F_NOBODYPART, BP_HANDS, NA, NA, NULL); addflag(lastrace->flags, F_NOSPELLS, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_ENHANCESMELL, 6, NA, NA, NULL); addflag(lastrace->flags, F_SEEINDARK, 5, NA, NA, NULL); @@ -7131,6 +7198,9 @@ void initrace(void) { addflag(lastrace->flags, F_HITCONFER, F_POISONED, SC_POISON, 24, "10-15"); addflag(lastrace->flags, F_HITCONFERVALS, P_VENOM, 1, NA, NULL); addflag(lastrace->flags, F_CRITKNOCKDOWN, B_TRUE, NA, NA, NULL); + addflag(lastrace->flags, F_BODYPARTNAME, BP_HANDS, NA, NA, "paws"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_RIGHTFINGER, NA, NA, "right foreclaw"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_LEFTFINGER, NA, NA, "left foreclaw"); addrace(R_DOGWAR, "war hound", 40, 'd', C_BROWN, MT_FLESH, RC_ANIMAL); addflag(lastrace->flags, F_HOSTILE, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_NUMAPPEAR, 1, 4, NA, ""); @@ -7147,7 +7217,6 @@ void initrace(void) { addflag(lastrace->flags, F_NOBODYPART, BP_WEAPON, NA, NA, NULL); addflag(lastrace->flags, F_NOBODYPART, BP_SECWEAPON, NA, NA, NULL); addflag(lastrace->flags, F_NOBODYPART, BP_SHOULDERS, NA, NA, NULL); - addflag(lastrace->flags, F_NOBODYPART, BP_HANDS, NA, NA, NULL); addflag(lastrace->flags, F_ENHANCESMELL, 6, NA, NA, NULL); addflag(lastrace->flags, F_NOSPELLS, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_WANTSOBFLAG, F_EDIBLE, NA, NA, NULL); @@ -7155,6 +7224,9 @@ void initrace(void) { addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 3, NA, "barks^barking"); addflag(lastrace->flags, F_NOISETEXT, N_FRUSTRATED, 2, NA, "growls^growling"); addflag(lastrace->flags, F_NOISETEXT, N_LOWHP, 2, NA, "whines in pain^whining"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_HANDS, NA, NA, "paws"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_RIGHTFINGER, NA, NA, "right foreclaw"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_LEFTFINGER, NA, NA, "left foreclaw"); addrace(R_HAWKYOUNG, "young hawk", 1, 'A', C_GREY, MT_FLESH, RC_ANIMAL); // 'A' for Avian lastrace->baseid = R_HAWK; @@ -7290,6 +7362,7 @@ void initrace(void) { addflag(lastrace->flags, F_SILENTMOVE, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_CANWILL, OT_A_CHARGE, NA, NA, "range:4;"); addflag(lastrace->flags, F_CANWILL, OT_A_SUCKBLOOD, NA, NA, "dam:0d1+4;"); + addflag(lastrace->flags, F_CASTCHANCE, 60, NA, NA, NULL); addflag(lastrace->flags, F_ENHANCESMELL, 5, NA, NA, NULL); addrace(R_NEWT, "giant newt", 4, ':', C_BROWN, MT_FLESH, RC_ANIMAL); addflag(lastrace->flags, F_RARITY, H_DUNGEON, 100, NA, NULL); @@ -7300,6 +7373,9 @@ void initrace(void) { addflag(lastrace->flags, F_SIZE, SZ_SMALL, NA, NA, NULL); addflag(lastrace->flags, F_MOVESPEED, SP_NORMAL, NA, NA, NULL); addflag(lastrace->flags, F_ACTIONSPEED, SP_NORMAL, NA, NA, ""); + addflag(lastrace->flags, F_HASATTACK, OT_CLAWS, NA, NA, "1d2-1"); + addflag(lastrace->flags, F_HASATTACK, OT_TEETH, NA, NA, "1d2-1"); + addflag(lastrace->flags, F_MAXATTACKS, 1, 1, NA, NULL); addflag(lastrace->flags, F_FLEEONDAM, B_TRUE, NA, NA, ""); addflag(lastrace->flags, F_NOBODYPART, BP_WEAPON, NA, NA, NULL); addflag(lastrace->flags, F_NOBODYPART, BP_SECWEAPON, NA, NA, NULL); @@ -7346,6 +7422,9 @@ void initrace(void) { addflag(lastrace->flags, F_WANTSOBFLAG, F_EDIBLE, B_COVETS, NA, NULL); addflag(lastrace->flags, F_SEEINDARK, 4, NA, NA, NULL); addflag(lastrace->flags, F_DTVULN, DT_POISONGAS, NA, NA, NULL); + addflag(lastrace->flags, F_BODYPARTNAME, BP_HANDS, NA, NA, "claws"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_RIGHTFINGER, NA, NA, "right foreclaw"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_LEFTFINGER, NA, NA, "left foreclaw"); addrace(R_SNAKE, "brown snake", 3, 's', C_BROWN, MT_FLESH, RC_ANIMAL); addflag(lastrace->flags, F_RARITY, H_DUNGEON, 85, NA, ""); addflag(lastrace->flags, F_RARITY, H_FOREST, 85, NA, ""); @@ -7414,6 +7493,7 @@ void initrace(void) { addflag(lastrace->flags, F_NOISETEXT, N_WALK, 1, NA, "^hissing"); addflag(lastrace->flags, F_DEAF, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_CANWILL, OT_A_CHARGE, 2, 2, NULL); + addflag(lastrace->flags, F_CASTCHANCE, 60, NA, NA, NULL); addflag(lastrace->flags, F_TREMORSENSE, 10, NA, NA, NULL); addrace(R_SNAKECOBRABLACK, "black cobra", 3, 's', C_BLUE, MT_FLESH, RC_ANIMAL); addflag(lastrace->flags, F_RARITY, H_DUNGEON, 78, NA, ""); @@ -7532,6 +7612,7 @@ void initrace(void) { addflag(lastrace->flags, F_NOBODYPART, BP_HANDS, NA, NA, NULL); addflag(lastrace->flags, F_SPELLCASTTEXT, NA, NA, NA, NULL); // don't announce spellcasting addflag(lastrace->flags, F_CANWILL, OT_S_WEB, 3, 3, "pw:1;range:4;"); + addflag(lastrace->flags, F_CASTCHANCE, 60, NA, NA, NULL); addflag(lastrace->flags, F_NOSPELLS, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_DTVULN, DT_LIGHT, NA, NA, NULL); addflag(lastrace->flags, F_SEEINDARK, UNLIMITED, NA, NA, NULL); @@ -7539,6 +7620,8 @@ void initrace(void) { addflag(lastrace->flags, F_POISONOUS, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_HOMEOB, NA, NA, NA, "web"); addflag(lastrace->flags, F_HOMELEVOB, NA, NA, NA, "1-10 webs"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_HEAD, NA, NA, "cephalothorax"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_BODY, NA, NA, "abdomen"); addrace(R_SPIDERFUNNELWEB, "giant funnelweb", 5, 'S', C_MAGENTA, MT_FLESH, RC_ANIMAL); lastrace->baseid = R_SPIDER; addflag(lastrace->flags, F_RARITY, H_DUNGEON, 63, NA, ""); @@ -7558,6 +7641,7 @@ void initrace(void) { addflag(lastrace->flags, F_NOBODYPART, BP_HANDS, NA, NA, NULL); addflag(lastrace->flags, F_SPELLCASTTEXT, NA, NA, NA, NULL); // don't announce spellcasting addflag(lastrace->flags, F_CANWILL, OT_S_WEB, 3, 3, "pw:5;range:2;"); + addflag(lastrace->flags, F_CASTCHANCE, 60, NA, NA, NULL); addflag(lastrace->flags, F_NOSPELLS, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_DTVULN, DT_LIGHT, NA, NA, NULL); addflag(lastrace->flags, F_SEEINDARK, UNLIMITED, NA, NA, NULL); @@ -7565,6 +7649,8 @@ void initrace(void) { addflag(lastrace->flags, F_POISONOUS, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_HOMEOB, NA, NA, NA, "web"); addflag(lastrace->flags, F_HOMELEVOB, NA, NA, NA, "20-30 webs"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_HEAD, NA, NA, "cephalothorax"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_BODY, NA, NA, "abdomen"); addrace(R_SPIDERREDBACK, "giant redback", 5, 'S', C_RED, MT_FLESH, RC_ANIMAL); lastrace->baseid = R_SPIDER; addflag(lastrace->flags, F_RARITY, H_DUNGEON, 78, NA, ""); @@ -7584,6 +7670,7 @@ void initrace(void) { addflag(lastrace->flags, F_NOBODYPART, BP_HANDS, NA, NA, NULL); addflag(lastrace->flags, F_SPELLCASTTEXT, NA, NA, NA, NULL); // don't announce spellcasting addflag(lastrace->flags, F_CANWILL, OT_S_WEB, 3, 3, "pw:7;range:3;"); + addflag(lastrace->flags, F_CASTCHANCE, 60, NA, NA, NULL); addflag(lastrace->flags, F_NOSPELLS, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_DTVULN, DT_LIGHT, NA, NA, NULL); addflag(lastrace->flags, F_SEEINDARK, UNLIMITED, NA, NA, NULL); @@ -7591,6 +7678,8 @@ void initrace(void) { addflag(lastrace->flags, F_POISONOUS, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_HOMEOB, NA, NA, NA, "web"); addflag(lastrace->flags, F_HOMELEVOB, NA, NA, NA, "10-20 webs"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_HEAD, NA, NA, "cephalothorax"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_BODY, NA, NA, "abdomen"); addrace(R_WOLFYOUNG, "young wolf", 10, 'd', C_GREY, MT_FLESH, RC_ANIMAL); addflag(lastrace->flags, F_HOSTILE, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_IQ, IQ_ANIMAL, NA, NULL); @@ -7616,6 +7705,9 @@ void initrace(void) { addflag(lastrace->flags, F_NOISETEXT, N_LOWHP, 2, NA, "whines in pain^whining"); addflag(lastrace->flags, F_NOISETEXT, N_FRUSTRATED, 3, NA, "growls^growling"); addflag(lastrace->flags, F_FLEEONHPPCT, 75, NA, NA, ""); + addflag(lastrace->flags, F_BODYPARTNAME, BP_HANDS, NA, NA, "paws"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_RIGHTFINGER, NA, NA, "right foreclaw"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_LEFTFINGER, NA, NA, "left foreclaw"); addrace(R_WOLF, "wolf", 25, 'd', C_GREY, MT_FLESH, RC_ANIMAL); addflag(lastrace->flags, F_STARTATT, A_CON, AT_VHIGH, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_IQ, IQ_ANIMAL, NA, NULL); @@ -7641,6 +7733,9 @@ void initrace(void) { addflag(lastrace->flags, F_NOISETEXT, N_LOWHP, 2, NA, "whines in pain^whining"); addflag(lastrace->flags, F_NOISETEXT, N_FRUSTRATED, 3, NA, "growls^growling"); addflag(lastrace->flags, F_FLEEONHPPCT, 50, NA, NA, ""); + addflag(lastrace->flags, F_BODYPARTNAME, BP_HANDS, NA, NA, "paws"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_RIGHTFINGER, NA, NA, "right foreclaw"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_LEFTFINGER, NA, NA, "left foreclaw"); // insects addrace(R_BUTTERFLY, "butterfly", 0.01, 'i', C_YELLOW, MT_FLESH, RC_ANIMAL); @@ -7733,6 +7828,9 @@ void initrace(void) { addflag(lastrace->flags, F_SEEINDARK, 3, NA, NA, NULL); addflag(lastrace->flags, F_DEAF, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_CANWILL, OT_A_SUCKBLOOD, NA, NA, "dam:1d4;"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_HANDS, NA, NA, "claws"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_RIGHTFINGER, NA, NA, "right foreclaw"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_LEFTFINGER, NA, NA, "left foreclaw"); addrace(R_CENTIPEDE, "giant centipede", 3, 'w', C_GREEN, MT_FLESH, RC_INSECT); addflag(lastrace->flags, F_RARITY, H_DUNGEON, 80, NA, ""); @@ -7894,12 +7992,27 @@ void initrace(void) { addflag(lastrace->flags, F_MOVESPEED, SP_SLOW, NA, NA, NULL); addflag(lastrace->flags, F_ACTIONSPEED, SP_NORMAL, NA, NA, ""); addflag(lastrace->flags, F_HASATTACK, OT_TEETH, NA, NA, "1d5"); + addflag(lastrace->flags, F_NOINJURIES, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_STARTOBDT, 50, DT_CHOP, NA, NULL); - addflag(lastrace->flags, F_STARTOB, 25, DT_CHOP, NA, "buckler"); + addflag(lastrace->flags, F_STARTOB, 25, NA, NA, "buckler"); addflag(lastrace->flags, F_DTVULN, DT_BASH, NA, NA, NULL); + addflag(lastrace->flags, F_DTRESIST, DT_SLASH, NA, NA, NULL); + addflag(lastrace->flags, F_DTIMMUNE, DT_PIERCE, NA, NA, NULL); addflag(lastrace->flags, F_HUMANOID, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_DEAF, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_MORALE, 30, NA, NA, NULL); + addflag(lastrace->flags, F_NOBODYPART, BP_EARS, NA, NA, NULL); + addflag(lastrace->flags, F_BODYPARTNAME, BP_WEAPON, NA, NA, "right metacarpals"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_SECWEAPON, NA, NA, "left metacarpals"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_BODY, NA, NA, "ribs"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_HEAD, NA, NA, "skull"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_SHOULDERS, NA, NA, "scapulas"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_HANDS, NA, NA, "carpals"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_WAIST, NA, NA, "coccyx"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_LEGS, NA, NA, "fibulas"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_FEET, NA, NA, "tarsals"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_RIGHTFINGER, NA, NA, "right phalange"); + addflag(lastrace->flags, F_BODYPARTNAME, BP_LEFTFINGER, NA, NA, "left phalange"); addrace(R_GHAST, "ghast", 50, 'Z', C_MAGENTA, MT_FLESH, RC_UNDEAD); addflag(lastrace->flags, F_ALIGNMENT, AL_EVIL, NA, NA, NULL); @@ -7921,6 +8034,7 @@ void initrace(void) { addflag(lastrace->flags, F_SEEINDARK, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_DEAF, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_MORALE, 30, NA, NA, NULL); + addflag(lastrace->flags, F_BODYPARTNAME, BP_HANDS, NA, NA, "claws"); addrace(R_GHOST, "ghost", 50, 'p', C_BLUE, MT_MAGIC, RC_UNDEAD); // p for sPirit addflag(lastrace->flags, F_ALIGNMENT, AL_EVIL, NA, NA, NULL); @@ -7934,6 +8048,7 @@ void initrace(void) { addflag(lastrace->flags, F_HITDICE, NA, NA, NA, "4d4+2"); addflag(lastrace->flags, F_MOVESPEED, SP_SLOW, NA, NA, NULL); addflag(lastrace->flags, F_ACTIONSPEED, SP_NORMAL, NA, NA, ""); + addflag(lastrace->flags, F_NOINJURIES, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_NONCORPOREAL, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_SEEINDARK, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_XRAYVIS, 3, NA, NA, NULL); @@ -7964,6 +8079,7 @@ void initrace(void) { addflag(lastrace->flags, F_DEAF, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_SEEINDARK, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_MORALE, 30, NA, NA, NULL); + addflag(lastrace->flags, F_BODYPARTNAME, BP_HANDS, NA, NA, "claws"); addrace(R_VAMPIRE, "vampire", 75, 'V', C_BLUE, MT_FLESH, RC_UNDEAD); addflag(lastrace->flags, F_ALIGNMENT, AL_EVIL, NA, NA, NULL); @@ -7993,11 +8109,11 @@ void initrace(void) { addflag(lastrace->flags, F_HASATTACK, OT_CLAWS, NA, NA, "1d6+4"); addflag(lastrace->flags, F_HASATTACK, OT_TEETH, NA, NA, "1d4+3"); addflag(lastrace->flags, F_FLYING, B_TRUE, NA, NA, ""); - addflag(lastrace->flags, F_RETAINHPMPONPOLY, B_TRUE, NA, NA, ""); addflag(lastrace->flags, F_CANWILL, OT_S_CHARM, 3, 3, "pw:6;"); addflag(lastrace->flags, F_CANWILL, OT_A_CHARGE, 5, 5, "range:3;"); addflag(lastrace->flags, F_CANWILL, OT_S_STUN, 5, 5, "pw:1;"); addflag(lastrace->flags, F_CANWILL, OT_S_POLYMORPH, 3, 3, "pw:1;race:vampire bat;"); + addflag(lastrace->flags, F_CASTCHANCE, 40, NA, NA, NULL); addflag(lastrace->flags, F_DETECTOBS, 10, OT_COFFIN, NA, NULL); addflag(lastrace->flags, F_CORPSETYPE, NA, NA, NA, "pile of ash"); addflag(lastrace->flags, F_SPELLCASTTEXT, NA, NA, NA, "gestures"); @@ -8030,6 +8146,7 @@ void initrace(void) { addflag(lastrace->flags, F_NOBODYPART, BP_LEGS, NA, NA, NULL); addflag(lastrace->flags, F_NOBODYPART, BP_FEET, NA, NA, NULL); addflag(lastrace->flags, F_NOSPELLS, B_TRUE, NA, NA, NULL); + addflag(lastrace->flags, F_NOINJURIES, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_TREMORSENSE, 4, NA, NA, NULL); addflag(lastrace->flags, F_DTIMMUNE, DT_ALL, NA, NA, NULL); addflag(lastrace->flags, F_SILENTMOVE, B_TRUE, NA, NA, NULL); @@ -8054,6 +8171,7 @@ void initrace(void) { addflag(lastrace->flags, F_NOBODYPART, BP_LEGS, NA, NA, NULL); addflag(lastrace->flags, F_NOBODYPART, BP_FEET, NA, NA, NULL); addflag(lastrace->flags, F_NOSPELLS, B_TRUE, NA, NA, NULL); + addflag(lastrace->flags, F_NOINJURIES, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_NODEATHANNOUNCE, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_TREMORSENSE, 10, NA, NA, NULL); addflag(lastrace->flags, F_SILENTMOVE, B_TRUE, NA, NA, NULL); @@ -8079,6 +8197,7 @@ void initrace(void) { addflag(lastrace->flags, F_NOBODYPART, BP_LEGS, NA, NA, NULL); addflag(lastrace->flags, F_NOBODYPART, BP_FEET, NA, NA, NULL); addflag(lastrace->flags, F_NOSPELLS, B_TRUE, NA, NA, NULL); + addflag(lastrace->flags, F_NOINJURIES, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_NODEATHANNOUNCE, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_TREMORSENSE, 10, NA, NA, NULL); addflag(lastrace->flags, F_SILENTMOVE, B_TRUE, NA, NA, NULL); @@ -8237,7 +8356,7 @@ void initskills(void) { addskilldesc(SK_SPEECH, PR_EXPERT, "^gShop item prices are reduced by 25%.^n", B_FALSE); addskilldesc(SK_SPEECH, PR_MASTER, "^gShop item prices are reduced by 30%.^n", B_FALSE); addskill(SK_SPELLCASTING, "Sorcery", "Increases the power of spells from all schools except Allomancy, Nature and Psionics.", 50); - addskilldesc(SK_SPELLCASTING, PR_NOVICE, "^gYou gain the 'study scrolls' ability.^n", B_FALSE); + addskilldesc(SK_SPELLCASTING, PR_SKILLED, "^gYou gain the 'study scrolls' ability.^n", B_FALSE); addskill(SK_PERCEPTION, "Perception", "Your ability to notice hidden details, from simple footprints to sinister traps.", 50); addskilldesc(SK_PERCEPTION, PR_INEPT, "- At higher levels this skill will also let you obscure your own tracks.", B_TRUE); addskilldesc(SK_PERCEPTION, PR_NOVICE, "^gYou can now see footprints.^n", B_TRUE); diff --git a/data/hiscores.db b/data/hiscores.db index b745cf05a39ff0955eaae087a119d34ef4ebc52c..70377f306699a76b0824c4c67f1be4cd0d0901d4 100644 GIT binary patch delta 405 zcmZoLXfT){&6u=N<^?;m8Pli9>>TlY%mU2Z%xuhzOn;cZGkw}vSjVKy!py*E1|m#B zgb9c+1`$Re!Vp9lY!>By&mqRir0OqTVs3EH$sBv}m#vJKtmlJ{D0EL$ESScVuOg1=+>r5k?srfYlg# bqN$PR&}l83