- [+] make zombies eat flesh.

- [+] warn before eating your own kind if it will anger your god, and
      you wisdom is high.
- [+] make disease way worse if you eat your own race's corpse!
- [+] CRASH when i try to cook firebug corpse
* [+] bones files:
- [+] when your leg is bleeding, don't lose hp for ATTACKING, only for
      MOVING.
- [+] bug: issue with skill display if you learn higher than your max
      level by reading a book!
    - [+] in this case, reading the book should fail.
- [+] when you start worshipping felix, allow you to learn lockpicking
      & thievery to full level!
- [+] infinite loop when an ashkari enters rage while already eating.
- [+] felix prayer should always unlock all nearby doors
- [+] if you add f_calwill xxx, v1=112312 v2=NA, make v2 = v1.
    - [+] that way we can confer it!
- [+] say "this is xxx!" after wearing a new amulet.
- [+] fork / knife should make you eat faster.
- [+] double the hp of most armour again
AMULETS
- [+] add new bodypart = neck
- [+] object hiddennames
    * [+] nouns
    * [+] adjectives
- [+] flight  (canwill fly)
- [+] enhance spell power
- [+] victimization (makes everything hostile) (no auto id)
- [+] blinking
- [+] anger (canwill rage)
- [+] vs poison (poison immune)
- [+] vs magic (magic resistance)
- [+] common
    - [+] feather fall (dt_fall dmg = 0)
        - [+] don't "slam into the ground", just "float gently to the
              ground"
    - [+] of amplification (boost listening skillchecks, allow you to
          listen at stairs)
    - [+] peaceful sleep (don't get woken up by sound, cursed)
    - [+] chef's amulet(lower metabolism) 
    - [+] thief's amulet (lockpicking)
This commit is contained in:
Rob Pearce 2012-03-05 10:31:21 +00:00
parent 2b77aa200e
commit 69cd41a714
23 changed files with 1080 additions and 314 deletions

View File

@ -647,7 +647,7 @@ int attacklf(lifeform_t *lf, lifeform_t *victim, object_t *wep, flag_t *damflag)
isunarmed = B_TRUE; isunarmed = B_TRUE;
} }
moveeffects(lf); moveeffects(lf, B_FALSE);
if (isdead(lf)) { if (isdead(lf)) {
return B_TRUE; return B_TRUE;
@ -1273,46 +1273,6 @@ int attacklf(lifeform_t *lf, lifeform_t *victim, object_t *wep, flag_t *damflag)
} }
} }
f = lfhasflag(lf, F_QUICKBITE);
if (f) {
if (islowhp(victim)) {
int dam;
char lfname[BUFLEN];
dam = rolldie(f->val[0], f->val[1]) + f->val[2];
real_getlfname(lf, lfname, B_FALSE, B_FALSE);
if (isplayer(victim) || cansee(player, victim)) {
msg("^%c%s bites %s!", isplayer(victim) ? 'b' : 'n', lfname, victimname);
}
losehp_real(victim, dam, DT_BITE, lf, lfname, B_FALSE, NULL, B_FALSE, NULL, B_TRUE);
}
}
f = lfhasflag(lf, F_PACKATTACK);
if (f) {
int dir;
cell_t *c;
int nmatched = 0;
char lfname[BUFLEN];
getlfname(lf, lfname);
// count adjacent allies of name xx
for (dir = DC_N; dir <= DC_NW; dir++) {
c = getcellindir(victim->cell, dir);
if (c && c->lf) {
if (c->lf->race->baseid == lf->race->baseid) {
nmatched++;
}
}
}
if (nmatched >= f->val[2]) {
char damstring[BUFLEN];
snprintf(damstring, BUFLEN, "%s pack", lfname);
if (isplayer(victim) || cansee(player, victim)) {
msg("^%c%s pack attacks %s!", isplayer(victim) ? 'b' : 'c', lfname, victimname);
}
losehp_real(victim, f->val[0], f->val[1], lf, damstring, B_TRUE, NULL, B_FALSE, NULL, B_TRUE);
}
}
// critical hit effects // critical hit effects
if (critical && damtypecausescriteffects(damtype[0])) { if (critical && damtypecausescriteffects(damtype[0])) {
criticalhit(lf, victim, critpos, dam[0], damtype[0]); criticalhit(lf, victim, critpos, dam[0], damtype[0]);
@ -1490,7 +1450,7 @@ int attackob(lifeform_t *lf, object_t *o, object_t *wep, flag_t *damflag) {
//int aidb = B_TRUE; //int aidb = B_TRUE;
int maxhp; int maxhp;
moveeffects(lf); moveeffects(lf, B_FALSE);
if (isdead(lf)) return B_TRUE; if (isdead(lf)) return B_TRUE;
// get names // get names
@ -1653,7 +1613,7 @@ int attackwall(lifeform_t *lf, cell_t *c, object_t *wep, flag_t *damflag) {
int i; int i;
int maxhp; int maxhp;
moveeffects(lf); moveeffects(lf, B_FALSE);
if (isdead(lf)) return B_TRUE; if (isdead(lf)) return B_TRUE;
maxhp = c->type->hp; maxhp = c->type->hp;
@ -2687,7 +2647,7 @@ void wepeffects(flagpile_t *fp, cell_t *where, flag_t *damflag, int dam) {
ppower = 1; ppower = 1;
} }
poison(victim, howlong, ptype, ppower, frombuf); poison(victim, howlong, ptype, ppower, frombuf, owner ? owner->race->id : R_NONE);
} else { } else {
// flag values // flag values
if (valflag) { if (valflag) {

186
data.c
View File

@ -33,6 +33,8 @@ extern hiddennamewithcol_t gemtype[];
extern char *ringadjective[]; extern char *ringadjective[];
extern char *techadjective[]; extern char *techadjective[];
extern char *technoun[]; extern char *technoun[];
extern char *amuletadjective[];
extern char *amuletnoun[];
extern objecttype_t *lastot; extern objecttype_t *lastot;
@ -1063,6 +1065,15 @@ void initobjects(void) {
} }
} }
for (n = 0; strlen(amuletnoun[n]); n++) {
// add it with all known adjectives
for (i = 0; strlen(ringadjective[i]) ; i++) {
char buf2[BUFLEN];
snprintf(buf2, BUFLEN, "%s %s",amuletadjective[i], amuletnoun[n]);
addhiddenname(OC_AMULET, buf2);
}
}
for (n = 0; strlen(technoun[n]); n++) { for (n = 0; strlen(technoun[n]); n++) {
// add it without an adjective // add it without an adjective
addhiddenname(OC_TECH, technoun[n]); addhiddenname(OC_TECH, technoun[n]);
@ -1088,8 +1099,23 @@ void initobjects(void) {
addflag_real(lastobmod->flags, F_HEADLESS, B_TRUE, NA, NA, NULL, PERMENANT, B_KNOWN, -1); addflag_real(lastobmod->flags, F_HEADLESS, B_TRUE, NA, NA, NULL, PERMENANT, B_KNOWN, -1);
addobmod(OM_MASTERWORK,"masterwork"); addobmod(OM_MASTERWORK,"masterwork");
addflag_real(lastobmod->flags, F_MASTERWORK, B_TRUE, NA, NA, NULL, PERMENANT, B_KNOWN, -1); addflag_real(lastobmod->flags, F_MASTERWORK, B_TRUE, NA, NA, NULL, PERMENANT, B_KNOWN, -1);
addomprefix(OM_MASTERWORK, "reinforced");
addomprefix(OM_MASTERWORK, "studded");
addomprefix(OM_MASTERWORK, "sturdy");
addomprefix(OM_MASTERWORK, "tailored");
addobmod(OM_SHODDY,"shoddy"); addobmod(OM_SHODDY,"shoddy");
addflag_real(lastobmod->flags, F_SHODDY, B_TRUE, NA, NA, NULL, PERMENANT, B_KNOWN, -1); addflag_real(lastobmod->flags, F_SHODDY, B_TRUE, NA, NA, NULL, PERMENANT, B_KNOWN, -1);
addomprefix(OM_SHODDY, "blunted");
addomprefix(OM_SHODDY, "chipped");
addomprefix(OM_SHODDY, "cracked");
addomprefix(OM_SHODDY, "crumbling");
addomprefix(OM_SHODDY, "dented");
addomprefix(OM_SHODDY, "frayed");
addomprefix(OM_SHODDY, "notched");
addomprefix(OM_SHODDY, "rusted");
addomprefix(OM_SHODDY, "rotted");
addomprefix(OM_SHODDY, "splintered");
addomprefix(OM_SHODDY, "torn");
addobmod(OM_POISONED,"poisoned"); addobmod(OM_POISONED,"poisoned");
addflag_real(lastobmod->flags, F_HITCONFER, F_POISONED, SC_POISON, 40, "15-30", PERMENANT, B_KNOWN, -1); addflag_real(lastobmod->flags, F_HITCONFER, F_POISONED, SC_POISON, 40, "15-30", PERMENANT, B_KNOWN, -1);
addflag_real(lastobmod->flags, F_HITCONFERVALS, P_VENOM, 1, NA, NULL, PERMENANT, B_KNOWN, -1); addflag_real(lastobmod->flags, F_HITCONFERVALS, P_VENOM, 1, NA, NULL, PERMENANT, B_KNOWN, -1);
@ -1355,6 +1381,11 @@ void initobjects(void) {
addflag(lastobjectclass->flags, F_HASHIDDENNAME, B_TRUE, NA, NA, NULL); addflag(lastobjectclass->flags, F_HASHIDDENNAME, B_TRUE, NA, NA, NULL);
addflag(lastobjectclass->flags, F_GOESON, BP_RIGHTFINGER, NA, NA, NULL); addflag(lastobjectclass->flags, F_GOESON, BP_RIGHTFINGER, NA, NA, NULL);
addflag(lastobjectclass->flags, F_GOESON, BP_LEFTFINGER, NA, NA, NULL); addflag(lastobjectclass->flags, F_GOESON, BP_LEFTFINGER, NA, NA, NULL);
addoc(OC_AMULET, "Amulets", "Items of jewellery worn around the neck, usually on a short metallic chain.", '"', C_GREY, RR_VERYRARE);
addocnoun(lastobjectclass, "amulet");
addflag(lastobjectclass->flags, F_RARITY, H_SEWER, NA, RR_UNCOMMON, NULL);
addflag(lastobjectclass->flags, F_HASHIDDENNAME, B_TRUE, NA, NA, NULL);
addflag(lastobjectclass->flags, F_GOESON, BP_NECK, NA, NA, NULL);
addoc(OC_WEAPON, "Weapons", "An instrument used for the purpose of causing harm or death.", ')', C_GREY, RR_COMMON); addoc(OC_WEAPON, "Weapons", "An instrument used for the purpose of causing harm or death.", ')', C_GREY, RR_COMMON);
addocnoun(lastobjectclass, "weapon"); addocnoun(lastobjectclass, "weapon");
addflag(lastobjectclass->flags, F_DAMAGABLE, B_TRUE, NA, NA, NULL); addflag(lastobjectclass->flags, F_DAMAGABLE, B_TRUE, NA, NA, NULL);
@ -5699,7 +5730,7 @@ void initobjects(void) {
addflag(lastot->flags, F_ARMOURRATING, 3, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 3, NA, NA, NULL);
addflag(lastot->flags, F_EQUIPCONFER, F_ARMOURPENALTY, 5, 5, NULL); addflag(lastot->flags, F_EQUIPCONFER, F_ARMOURPENALTY, 5, 5, NULL);
addflag(lastot->flags, F_EQUIPCONFER, F_DTRESIST, DT_COLD, NA, NULL); addflag(lastot->flags, F_EQUIPCONFER, F_DTRESIST, DT_COLD, NA, NULL);
addflag(lastot->flags, F_OBHP, 10, 10, NA, NULL); addflag(lastot->flags, F_OBHP, 20, 20, NA, NULL);
addflag(lastot->flags, F_ATTREQ, A_STR, 15, NA, NULL); addflag(lastot->flags, F_ATTREQ, A_STR, 15, NA, NULL);
addflag(lastot->flags, F_CRITPROTECTION, 80, NA, NA, NULL); addflag(lastot->flags, F_CRITPROTECTION, 80, NA, NA, NULL);
@ -5709,7 +5740,7 @@ void initobjects(void) {
addflag(lastot->flags, F_MULTISIZE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_MULTISIZE, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_GOESON, BP_BODY, NA, NA, NULL); addflag(lastot->flags, F_GOESON, BP_BODY, NA, NA, NULL);
addflag(lastot->flags, F_ARMOURRATING, 0, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 0, NA, NA, NULL);
addflag(lastot->flags, F_OBHP, 10, 10, NA, NULL); addflag(lastot->flags, F_OBHP, 20, 20, NA, NULL);
addflag(lastot->flags, F_DTRESIST, DT_FIRE, NA, NA, NULL); addflag(lastot->flags, F_DTRESIST, DT_FIRE, NA, NA, NULL);
addflag(lastot->flags, F_EQUIPCONFER, F_DTRESIST, DT_FIRE, NA, NULL); addflag(lastot->flags, F_EQUIPCONFER, F_DTRESIST, DT_FIRE, NA, NULL);
addflag(lastot->flags, F_CRITPROTECTION, 33, NA, NA, NULL); addflag(lastot->flags, F_CRITPROTECTION, 33, NA, NA, NULL);
@ -5722,7 +5753,7 @@ void initobjects(void) {
addflag(lastot->flags, F_MULTISIZE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_MULTISIZE, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_GOESON, BP_BODY, NA, NA, NULL); addflag(lastot->flags, F_GOESON, BP_BODY, NA, NA, NULL);
addflag(lastot->flags, F_ARMOURRATING, 0, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 0, NA, NA, NULL);
addflag(lastot->flags, F_OBHP, 10, 10, NA, NULL); addflag(lastot->flags, F_OBHP, 20, 20, NA, NULL);
addflag(lastot->flags, F_ATTREQ, A_AGI, 15, NA, NULL); addflag(lastot->flags, F_ATTREQ, A_AGI, 15, NA, NULL);
addflag(lastot->flags, F_CRITPROTECTION, 33, NA, NA, NULL); addflag(lastot->flags, F_CRITPROTECTION, 33, NA, NA, NULL);
@ -5735,7 +5766,7 @@ void initobjects(void) {
addflag(lastot->flags, F_ARMOURRATING, 5, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 5, NA, NA, NULL);
addflag(lastot->flags, F_EQUIPCONFER, F_DTIMMUNE, DT_FIRE, NA, NULL); addflag(lastot->flags, F_EQUIPCONFER, F_DTIMMUNE, DT_FIRE, NA, NULL);
addflag(lastot->flags, F_DTIMMUNE, DT_FIRE, NA, NA, NULL); addflag(lastot->flags, F_DTIMMUNE, DT_FIRE, NA, NA, NULL);
addflag(lastot->flags, F_OBHP, 20, 20, NA, NULL); addflag(lastot->flags, F_OBHP, 40, 40, NA, NULL);
addflag(lastot->flags, F_ATTREQ, A_STR, 15, NA, NULL); addflag(lastot->flags, F_ATTREQ, A_STR, 15, NA, NULL);
addflag(lastot->flags, F_CRITPROTECTION, 80, NA, NA, NULL); addflag(lastot->flags, F_CRITPROTECTION, 80, NA, NA, NULL);
addflag(lastot->flags, F_STARTBLESSED, B_CURSED, NA, NA, NULL); addflag(lastot->flags, F_STARTBLESSED, B_CURSED, NA, NA, NULL);
@ -5745,7 +5776,7 @@ void initobjects(void) {
addflag(lastot->flags, F_GOESON, BP_BODY, NA, NA, NULL); addflag(lastot->flags, F_GOESON, BP_BODY, NA, NA, NULL);
addflag(lastot->flags, F_ARMOURRATING, 4, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 4, NA, NA, NULL);
addflag(lastot->flags, F_EQUIPCONFER, F_ARMOURPENALTY, 10, 10, NULL); addflag(lastot->flags, F_EQUIPCONFER, F_ARMOURPENALTY, 10, 10, NULL);
addflag(lastot->flags, F_OBHP, 20, 20, NA, NULL); addflag(lastot->flags, F_OBHP, 40, 40, NA, NULL);
addflag(lastot->flags, F_ATTREQ, A_STR, 15, NA, NULL); addflag(lastot->flags, F_ATTREQ, A_STR, 15, NA, NULL);
addflag(lastot->flags, F_CRITPROTECTION, 95, NA, NA, NULL); addflag(lastot->flags, F_CRITPROTECTION, 95, NA, NA, NULL);
addot(OT_ARMOURRING, "suit of ring mail", "Body armour formed by a series of metallic rings sewn to a leather foundation.", MT_METAL, 15, OC_ARMOUR, SZ_MEDIUM); addot(OT_ARMOURRING, "suit of ring mail", "Body armour formed by a series of metallic rings sewn to a leather foundation.", MT_METAL, 15, OC_ARMOUR, SZ_MEDIUM);
@ -5755,7 +5786,7 @@ void initobjects(void) {
addflag(lastot->flags, F_ARMOURRATING, 6, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 6, NA, NA, NULL);
addflag(lastot->flags, F_EQUIPCONFER, F_ARMOURPENALTY, 20, 20, NULL); addflag(lastot->flags, F_EQUIPCONFER, F_ARMOURPENALTY, 20, 20, NULL);
addflag(lastot->flags, F_ATTREQ, A_STR, 35, NA, NULL); addflag(lastot->flags, F_ATTREQ, A_STR, 35, NA, NULL);
addflag(lastot->flags, F_OBHP, 30, 30, NA, NULL); addflag(lastot->flags, F_OBHP, 60, 60, NA, NULL);
addflag(lastot->flags, F_CRITPROTECTION, 100, NA, NA, NULL); addflag(lastot->flags, F_CRITPROTECTION, 100, NA, NA, NULL);
addot(OT_ARMOURSCALE, "suit of scale armour", "Body armour consisting of many small scales attached to leather.", MT_METAL, 20, OC_ARMOUR, SZ_MEDIUM); addot(OT_ARMOURSCALE, "suit of scale armour", "Body armour consisting of many small scales attached to leather.", MT_METAL, 20, OC_ARMOUR, SZ_MEDIUM);
addflag(lastot->flags, F_RARITY, H_ALL, 100, RR_UNCOMMON, NULL); addflag(lastot->flags, F_RARITY, H_ALL, 100, RR_UNCOMMON, NULL);
@ -5764,7 +5795,7 @@ void initobjects(void) {
addflag(lastot->flags, F_ARMOURRATING, 10, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 10, NA, NA, NULL);
addflag(lastot->flags, F_EQUIPCONFER, F_ARMOURPENALTY, 30, 30, NULL); addflag(lastot->flags, F_EQUIPCONFER, F_ARMOURPENALTY, 30, 30, NULL);
addflag(lastot->flags, F_ATTREQ, A_STR, 45, NA, NULL); addflag(lastot->flags, F_ATTREQ, A_STR, 45, NA, NULL);
addflag(lastot->flags, F_OBHP, 35, 35, NA, NULL); addflag(lastot->flags, F_OBHP, 70, 70, NA, NULL);
addflag(lastot->flags, F_CRITPROTECTION, 100, NA, NA, NULL); addflag(lastot->flags, F_CRITPROTECTION, 100, NA, NA, NULL);
addot(OT_ARMOURCHAIN, "suit of chainmail", "Heavy body armour consisting of tightly meshed metal rings.", MT_METAL, 25, OC_ARMOUR, SZ_MEDIUM); addot(OT_ARMOURCHAIN, "suit of chainmail", "Heavy body armour consisting of tightly meshed metal rings.", MT_METAL, 25, OC_ARMOUR, SZ_MEDIUM);
addflag(lastot->flags, F_RARITY, H_ALL, 100, RR_UNCOMMON, NULL); addflag(lastot->flags, F_RARITY, H_ALL, 100, RR_UNCOMMON, NULL);
@ -5773,7 +5804,7 @@ void initobjects(void) {
addflag(lastot->flags, F_ARMOURRATING, 15, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 15, NA, NA, NULL);
addflag(lastot->flags, F_EQUIPCONFER, F_ARMOURPENALTY, 40, 40, NULL); addflag(lastot->flags, F_EQUIPCONFER, F_ARMOURPENALTY, 40, 40, NULL);
addflag(lastot->flags, F_ATTREQ, A_STR, 45, NA, NULL); addflag(lastot->flags, F_ATTREQ, A_STR, 45, NA, NULL);
addflag(lastot->flags, F_OBHP, 45, 45, NA, NULL); addflag(lastot->flags, F_OBHP, 90, 90, NA, NULL);
addflag(lastot->flags, F_CRITPROTECTION, 100, NA, NA, NULL); addflag(lastot->flags, F_CRITPROTECTION, 100, NA, NA, NULL);
addot(OT_ARMOURSPLINT, "suit of splint mail", "Heavy armour, consisting of strips of metal attached to a leather backing.", MT_METAL, 35, OC_ARMOUR, SZ_MEDIUM); addot(OT_ARMOURSPLINT, "suit of splint mail", "Heavy armour, consisting of strips of metal attached to a leather backing.", MT_METAL, 35, OC_ARMOUR, SZ_MEDIUM);
addflag(lastot->flags, F_RARITY, H_ALL, 100, RR_UNCOMMON, NULL); addflag(lastot->flags, F_RARITY, H_ALL, 100, RR_UNCOMMON, NULL);
@ -5782,7 +5813,7 @@ void initobjects(void) {
addflag(lastot->flags, F_ARMOURRATING, 20, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 20, NA, NA, NULL);
addflag(lastot->flags, F_EQUIPCONFER, F_ARMOURPENALTY, 50, 50, NULL); addflag(lastot->flags, F_EQUIPCONFER, F_ARMOURPENALTY, 50, 50, NULL);
addflag(lastot->flags, F_ATTREQ, A_STR, 55, NA, NULL); addflag(lastot->flags, F_ATTREQ, A_STR, 55, NA, NULL);
addflag(lastot->flags, F_OBHP, 50, 50, NA, NULL); addflag(lastot->flags, F_OBHP, 100, 100, NA, NULL);
addflag(lastot->flags, F_CRITPROTECTION, 100, NA, NA, NULL); addflag(lastot->flags, F_CRITPROTECTION, 100, NA, NA, NULL);
addot(OT_ARMOURPLATE, "suit of plate mail", "Heavy armour with embedded metal plates.", MT_METAL, 40, OC_ARMOUR, SZ_MEDIUM); addot(OT_ARMOURPLATE, "suit of plate mail", "Heavy armour with embedded metal plates.", MT_METAL, 40, OC_ARMOUR, SZ_MEDIUM);
addflag(lastot->flags, F_RARITY, H_ALL, 90, RR_RARE, NULL); addflag(lastot->flags, F_RARITY, H_ALL, 90, RR_RARE, NULL);
@ -5791,7 +5822,7 @@ void initobjects(void) {
addflag(lastot->flags, F_ARMOURRATING, 25, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 25, NA, NA, NULL);
addflag(lastot->flags, F_EQUIPCONFER, F_ARMOURPENALTY, 60, 60, NULL); addflag(lastot->flags, F_EQUIPCONFER, F_ARMOURPENALTY, 60, 60, NULL);
addflag(lastot->flags, F_ATTREQ, A_STR, 65, NA, NULL); addflag(lastot->flags, F_ATTREQ, A_STR, 65, NA, NULL);
addflag(lastot->flags, F_OBHP, 60, 60, NA, NULL); addflag(lastot->flags, F_OBHP, 120, 120, NA, NULL);
addflag(lastot->flags, F_CRITPROTECTION, 100, NA, NA, NULL); addflag(lastot->flags, F_CRITPROTECTION, 100, NA, NA, NULL);
addot(OT_FLAKJACKET, "flak jacket", "Heavy metal body armour. Designed to stop a bullet, but ineffective against melee attacks.", MT_METAL, 30, OC_ARMOUR, SZ_MEDIUM); addot(OT_FLAKJACKET, "flak jacket", "Heavy metal body armour. Designed to stop a bullet, but ineffective against melee attacks.", MT_METAL, 30, OC_ARMOUR, SZ_MEDIUM);
@ -5801,7 +5832,7 @@ void initobjects(void) {
addflag(lastot->flags, F_ARMOURRATING, 2, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 2, NA, NA, NULL);
addflag(lastot->flags, F_EQUIPCONFER, F_ARMOURPENALTY, 10, 10, NULL); addflag(lastot->flags, F_EQUIPCONFER, F_ARMOURPENALTY, 10, 10, NULL);
addflag(lastot->flags, F_ATTREQ, A_STR, 50, NA, NULL); addflag(lastot->flags, F_ATTREQ, A_STR, 50, NA, NULL);
addflag(lastot->flags, F_OBHP, 3, 3, NA, NULL); addflag(lastot->flags, F_OBHP, 30, 30, NA, NULL);
addflag(lastot->flags, F_CRITPROTECTION, 100, NA, NA, NULL); addflag(lastot->flags, F_CRITPROTECTION, 100, NA, NA, NULL);
addot(OT_OVERALLS, "pair of overalls", "Well-made, brightly coloured workman overalls.", MT_CLOTH, 1, OC_ARMOUR, SZ_MEDIUM); addot(OT_OVERALLS, "pair of overalls", "Well-made, brightly coloured workman overalls.", MT_CLOTH, 1, OC_ARMOUR, SZ_MEDIUM);
addflag(lastot->flags, F_RARITY, H_ALL, 100, RR_COMMON, NULL); addflag(lastot->flags, F_RARITY, H_ALL, 100, RR_COMMON, NULL);
@ -5809,7 +5840,7 @@ void initobjects(void) {
addflag(lastot->flags, F_MULTISIZE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_MULTISIZE, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_ARMOURRATING, 2, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 2, NA, NA, NULL);
addflag(lastot->flags, F_ATTREQ, A_AGI, 35, NA, NULL); addflag(lastot->flags, F_ATTREQ, A_AGI, 35, NA, NULL);
addflag(lastot->flags, F_OBHP, 10, 10, NA, NULL); addflag(lastot->flags, F_OBHP, 20, 20, NA, NULL);
addflag(lastot->flags, F_CRITPROTECTION, 85, NA, NA, NULL); addflag(lastot->flags, F_CRITPROTECTION, 85, NA, NA, NULL);
addot(OT_SILKSHIRT, "silk shirt", "A lightweight, comfortable white silk shirt.", MT_SILK, 0.5, OC_ARMOUR, SZ_MEDIUM); addot(OT_SILKSHIRT, "silk shirt", "A lightweight, comfortable white silk shirt.", MT_SILK, 0.5, OC_ARMOUR, SZ_MEDIUM);
addflag(lastot->flags, F_RARITY, H_ALL, 100, RR_COMMON, NULL); addflag(lastot->flags, F_RARITY, H_ALL, 100, RR_COMMON, NULL);
@ -5817,7 +5848,7 @@ void initobjects(void) {
addflag(lastot->flags, F_MULTISIZE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_MULTISIZE, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_GOESON, BP_BODY, NA, NA, NULL); addflag(lastot->flags, F_GOESON, BP_BODY, NA, NA, NULL);
addflag(lastot->flags, F_ARMOURRATING, 0, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 0, NA, NA, NULL);
addflag(lastot->flags, F_OBHP, 5, 5, NA, NULL); addflag(lastot->flags, F_OBHP, 10, 10, NA, NULL);
addflag(lastot->flags, F_ATTREQ, A_AGI, 15, NA, NULL); addflag(lastot->flags, F_ATTREQ, A_AGI, 15, NA, NULL);
addflag(lastot->flags, F_CRITPROTECTION, 50, NA, NA, NULL); addflag(lastot->flags, F_CRITPROTECTION, 50, NA, NA, NULL);
addot(OT_ROBE, "robe", "A plain robe.", MT_CLOTH, 4, OC_ARMOUR, SZ_MEDIUM); addot(OT_ROBE, "robe", "A plain robe.", MT_CLOTH, 4, OC_ARMOUR, SZ_MEDIUM);
@ -5825,14 +5856,14 @@ void initobjects(void) {
addflag(lastot->flags, F_MULTISIZE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_MULTISIZE, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_GOESON, BP_BODY, NA, NA, NULL); addflag(lastot->flags, F_GOESON, BP_BODY, NA, NA, NULL);
addflag(lastot->flags, F_ARMOURRATING, 1, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 1, NA, NA, NULL);
addflag(lastot->flags, F_OBHP, 10, 10, NA, NULL); addflag(lastot->flags, F_OBHP, 20, 20, NA, NULL);
addflag(lastot->flags, F_CRITPROTECTION, 70, NA, NA, NULL); addflag(lastot->flags, F_CRITPROTECTION, 70, NA, NA, NULL);
addot(OT_VELVETROBE, "velvet robe", "A luxurious velvet robe.", MT_CLOTH, 4, OC_ARMOUR, SZ_MEDIUM); addot(OT_VELVETROBE, "velvet robe", "A luxurious velvet robe.", MT_CLOTH, 4, OC_ARMOUR, SZ_MEDIUM);
addflag(lastot->flags, F_RARITY, H_ALL, 90, RR_UNCOMMON, NULL); addflag(lastot->flags, F_RARITY, H_ALL, 90, RR_UNCOMMON, NULL);
addflag(lastot->flags, F_MULTISIZE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_MULTISIZE, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_GOESON, BP_BODY, NA, NA, NULL); addflag(lastot->flags, F_GOESON, BP_BODY, NA, NA, NULL);
addflag(lastot->flags, F_ARMOURRATING, 1, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 1, NA, NA, NULL);
addflag(lastot->flags, F_OBHP, 10, 10, NA, NULL); addflag(lastot->flags, F_OBHP, 20, 20, NA, NULL);
addflag(lastot->flags, F_CRITPROTECTION, 75, NA, NA, NULL); addflag(lastot->flags, F_CRITPROTECTION, 75, NA, NA, NULL);
addflag(lastot->flags, F_BRANDCHANCE, 20, NA, NA, NULL); addflag(lastot->flags, F_BRANDCHANCE, 20, NA, NA, NULL);
@ -5844,7 +5875,7 @@ void initobjects(void) {
addflag(lastot->flags, F_MULTISIZE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_MULTISIZE, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_GOESON, BP_SHOULDERS, NA, NA, NULL); addflag(lastot->flags, F_GOESON, BP_SHOULDERS, NA, NA, NULL);
addflag(lastot->flags, F_ARMOURRATING, 1, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 1, NA, NA, NULL);
addflag(lastot->flags, F_OBHP, 20, 20, NA, NULL); addflag(lastot->flags, F_OBHP, 30, 30, NA, NULL);
addflag(lastot->flags, F_WATERPROOF, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_WATERPROOF, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_HELPSREST, 2, NA, NA, NULL); addflag(lastot->flags, F_HELPSREST, 2, NA, NA, NULL);
addot(OT_CLOAKFUR, "fur cloak", "A warm and lightweight fur cloak, great for winter camping trips.", MT_FLESH, 3, OC_ARMOUR, SZ_MEDIUM); addot(OT_CLOAKFUR, "fur cloak", "A warm and lightweight fur cloak, great for winter camping trips.", MT_FLESH, 3, OC_ARMOUR, SZ_MEDIUM);
@ -5852,7 +5883,7 @@ void initobjects(void) {
addflag(lastot->flags, F_MULTISIZE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_MULTISIZE, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_GOESON, BP_SHOULDERS, NA, NA, NULL); addflag(lastot->flags, F_GOESON, BP_SHOULDERS, NA, NA, NULL);
addflag(lastot->flags, F_ARMOURRATING, 0, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 0, NA, NA, NULL);
addflag(lastot->flags, F_OBHP, 15, 15, NA, NULL); addflag(lastot->flags, F_OBHP, 20, 20, NA, NULL);
addflag(lastot->flags, F_EQUIPCONFER, F_DTRESIST, DT_COLD, NA, NULL); addflag(lastot->flags, F_EQUIPCONFER, F_DTRESIST, DT_COLD, NA, NULL);
addflag(lastot->flags, F_HELPSREST, 5, NA, NA, NULL); addflag(lastot->flags, F_HELPSREST, 5, NA, NA, NULL);
addot(OT_APRON, "apron", "A sturdy rubber apron, designed to protect against stains.", MT_RUBBER, 2, OC_ARMOUR, SZ_MEDIUM); addot(OT_APRON, "apron", "A sturdy rubber apron, designed to protect against stains.", MT_RUBBER, 2, OC_ARMOUR, SZ_MEDIUM);
@ -5868,7 +5899,7 @@ void initobjects(void) {
addflag(lastot->flags, F_RARITY, H_ALL, 100, RR_COMMON, NULL); addflag(lastot->flags, F_RARITY, H_ALL, 100, RR_COMMON, NULL);
addflag(lastot->flags, F_GOESON, BP_WAIST, NA, NA, NULL); addflag(lastot->flags, F_GOESON, BP_WAIST, NA, NA, NULL);
addflag(lastot->flags, F_ATTREQ, A_AGI, 15, NA, NULL); addflag(lastot->flags, F_ATTREQ, A_AGI, 15, NA, NULL);
addflag(lastot->flags, F_OBHP, 2, 2, NA, NULL); addflag(lastot->flags, F_OBHP, 20, 20, NA, NULL);
// armour - legs // armour - legs
addot(OT_CLOTHTROUSERS, "pair of cloth trousers", "A rough pair of cloth trousers.", MT_CLOTH, 2, OC_ARMOUR, SZ_MEDIUM); addot(OT_CLOTHTROUSERS, "pair of cloth trousers", "A rough pair of cloth trousers.", MT_CLOTH, 2, OC_ARMOUR, SZ_MEDIUM);
addflag(lastot->flags, F_MULTISIZE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_MULTISIZE, B_TRUE, NA, NA, NULL);
@ -5879,13 +5910,13 @@ void initobjects(void) {
addflag(lastot->flags, F_OBHP, 15, 15, NA, NULL); addflag(lastot->flags, F_OBHP, 15, 15, NA, NULL);
addflag(lastot->flags, F_ATTREQ, A_AGI, 15, NA, NULL); addflag(lastot->flags, F_ATTREQ, A_AGI, 15, NA, NULL);
addflag(lastot->flags, F_CRITPROTECTION, 60, NA, NA, NULL); addflag(lastot->flags, F_CRITPROTECTION, 60, NA, NA, NULL);
addot(OT_RIDINGTROUSERS, "pair of riding trousers", "A fitted pair of leather trousers.", MT_LEATHER, 2, OC_ARMOUR, SZ_MEDIUM); addot(OT_RIDINGTROUSERS, "pair of riding trousers", "A tight pair of durable leather trousers.", MT_LEATHER, 2, OC_ARMOUR, SZ_MEDIUM);
addflag(lastot->flags, F_MULTISIZE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_MULTISIZE, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_RARITY, H_ALL, 100, RR_COMMON, NULL); addflag(lastot->flags, F_RARITY, H_ALL, 100, RR_COMMON, NULL);
addflag(lastot->flags, F_RARITY, H_FOREST, 100, RR_COMMON, NULL); addflag(lastot->flags, F_RARITY, H_FOREST, 100, RR_COMMON, NULL);
addflag(lastot->flags, F_GOESON, BP_LEGS, NA, NA, NULL); addflag(lastot->flags, F_GOESON, BP_LEGS, NA, NA, NULL);
addflag(lastot->flags, F_ARMOURRATING, 2, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 2, NA, NA, NULL);
addflag(lastot->flags, F_OBHP, 20, 20, NA, NULL); addflag(lastot->flags, F_OBHP, 30, 30, NA, NULL);
addflag(lastot->flags, F_ATTREQ, A_AGI, 15, NA, NULL); addflag(lastot->flags, F_ATTREQ, A_AGI, 15, NA, NULL);
addflag(lastot->flags, F_CRITPROTECTION, 75, NA, NA, NULL); addflag(lastot->flags, F_CRITPROTECTION, 75, NA, NA, NULL);
addot(OT_COMBATPANTS, "pair of combat pants", "An lightly-armoured pair of camoflauged trousers.", MT_CLOTH, 2, OC_ARMOUR, SZ_MEDIUM); addot(OT_COMBATPANTS, "pair of combat pants", "An lightly-armoured pair of camoflauged trousers.", MT_CLOTH, 2, OC_ARMOUR, SZ_MEDIUM);
@ -5893,7 +5924,7 @@ void initobjects(void) {
addflag(lastot->flags, F_GOESON, BP_LEGS, NA, NA, NULL); addflag(lastot->flags, F_GOESON, BP_LEGS, NA, NA, NULL);
addflag(lastot->flags, F_MULTISIZE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_MULTISIZE, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_ARMOURRATING, 3, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 3, NA, NA, NULL);
addflag(lastot->flags, F_OBHP, 15, 15, NA, NULL); addflag(lastot->flags, F_OBHP, 50, 50, NA, NULL);
addflag(lastot->flags, F_ATTREQ, A_AGI, 15, NA, NULL); addflag(lastot->flags, F_ATTREQ, A_AGI, 15, NA, NULL);
addflag(lastot->flags, F_CRITPROTECTION, 90, NA, NA, NULL); addflag(lastot->flags, F_CRITPROTECTION, 90, NA, NA, NULL);
addot(OT_GREAVES, "set of greaves", "A set of heavy metal greaves.", MT_METAL, 4, OC_ARMOUR, SZ_MEDIUM); addot(OT_GREAVES, "set of greaves", "A set of heavy metal greaves.", MT_METAL, 4, OC_ARMOUR, SZ_MEDIUM);
@ -5901,7 +5932,7 @@ void initobjects(void) {
addflag(lastot->flags, F_GOESON, BP_LEGS, NA, NA, NULL); addflag(lastot->flags, F_GOESON, BP_LEGS, NA, NA, NULL);
addflag(lastot->flags, F_MULTISIZE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_MULTISIZE, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_ARMOURRATING, 4, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 4, NA, NA, NULL);
addflag(lastot->flags, F_OBHP, 25, 25, NA, NULL); addflag(lastot->flags, F_OBHP, 60, 60, NA, NULL);
addflag(lastot->flags, F_EQUIPCONFER, F_ARMOURPENALTY, 15, 15, NULL); addflag(lastot->flags, F_EQUIPCONFER, F_ARMOURPENALTY, 15, 15, NULL);
addflag(lastot->flags, F_ATTREQ, A_STR, 45, NA, NULL); addflag(lastot->flags, F_ATTREQ, A_STR, 45, NA, NULL);
addflag(lastot->flags, F_ATTREQ, A_AGI, 15, NA, NULL); addflag(lastot->flags, F_ATTREQ, A_AGI, 15, NA, NULL);
@ -5913,7 +5944,7 @@ void initobjects(void) {
addflag(lastot->flags, F_RARITY, H_FOREST, 100, RR_COMMON, NULL); addflag(lastot->flags, F_RARITY, H_FOREST, 100, RR_COMMON, NULL);
addflag(lastot->flags, F_GOESON, BP_FEET, NA, NA, NULL); addflag(lastot->flags, F_GOESON, BP_FEET, NA, NA, NULL);
addflag(lastot->flags, F_ARMOURRATING, 0, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 0, NA, NA, NULL);
addflag(lastot->flags, F_OBHP, 1, 1, NA, NULL); addflag(lastot->flags, F_OBHP, 10, 10, NA, NULL);
addflag(lastot->flags, F_CRITPROTECTION, 30, NA, NA, NULL); addflag(lastot->flags, F_CRITPROTECTION, 30, NA, NA, NULL);
addot(OT_SHOESLEATHER, "pair of leather shoes", "Cheap and rather uncomfortable leather shoes.", MT_LEATHER, 2, OC_ARMOUR, SZ_SMALL); addot(OT_SHOESLEATHER, "pair of leather shoes", "Cheap and rather uncomfortable leather shoes.", MT_LEATHER, 2, OC_ARMOUR, SZ_SMALL);
addflag(lastot->flags, F_RARITY, H_ALL, 100, RR_COMMON, NULL); addflag(lastot->flags, F_RARITY, H_ALL, 100, RR_COMMON, NULL);
@ -5921,7 +5952,7 @@ void initobjects(void) {
addflag(lastot->flags, F_MULTISIZE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_MULTISIZE, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_GOESON, BP_FEET, NA, NA, NULL); addflag(lastot->flags, F_GOESON, BP_FEET, NA, NA, NULL);
addflag(lastot->flags, F_ARMOURRATING, 1, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 1, NA, NA, NULL);
addflag(lastot->flags, F_OBHP, 10, 10, NA, NULL); addflag(lastot->flags, F_OBHP, 15, 15, NA, NULL);
addflag(lastot->flags, F_ATTREQ, A_AGI, 35, NA, NULL); addflag(lastot->flags, F_ATTREQ, A_AGI, 35, NA, NULL);
addflag(lastot->flags, F_CRITPROTECTION, 85, NA, NA, NULL); addflag(lastot->flags, F_CRITPROTECTION, 85, NA, NA, NULL);
addot(OT_BOOTSRUBBER, "pair of rubber boots", "A waterproof (but somewhat cumbersome) pair of rubber boots.", MT_RUBBER, 6, OC_ARMOUR, SZ_SMALL); addot(OT_BOOTSRUBBER, "pair of rubber boots", "A waterproof (but somewhat cumbersome) pair of rubber boots.", MT_RUBBER, 6, OC_ARMOUR, SZ_SMALL);
@ -5930,7 +5961,7 @@ void initobjects(void) {
addflag(lastot->flags, F_GOESON, BP_FEET, NA, NA, NULL); addflag(lastot->flags, F_GOESON, BP_FEET, NA, NA, NULL);
addflag(lastot->flags, F_ARMOURRATING, 1, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 1, NA, NA, NULL);
addflag(lastot->flags, F_EQUIPCONFER, F_ARMOURPENALTY, 0, 5, NULL); addflag(lastot->flags, F_EQUIPCONFER, F_ARMOURPENALTY, 0, 5, NULL);
addflag(lastot->flags, F_OBHP, 15, 15, NA, NULL); addflag(lastot->flags, F_OBHP, 30, 30, NA, NULL);
addflag(lastot->flags, F_EQUIPCONFER, F_DTRESIST, DT_ELECTRIC, NA, NULL); addflag(lastot->flags, F_EQUIPCONFER, F_DTRESIST, DT_ELECTRIC, NA, NULL);
addflag(lastot->flags, F_ATTREQ, A_AGI, 15, NA, NULL); addflag(lastot->flags, F_ATTREQ, A_AGI, 15, NA, NULL);
addflag(lastot->flags, F_CRITPROTECTION, 95, NA, NA, NULL); addflag(lastot->flags, F_CRITPROTECTION, 95, NA, NA, NULL);
@ -5939,7 +5970,7 @@ void initobjects(void) {
addflag(lastot->flags, F_GOESON, BP_FEET, NA, NA, NULL); addflag(lastot->flags, F_GOESON, BP_FEET, NA, NA, NULL);
addflag(lastot->flags, F_MULTISIZE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_MULTISIZE, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_ARMOURRATING, 2, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 2, NA, NA, NULL);
addflag(lastot->flags, F_OBHP, 20, 20, NA, NULL); addflag(lastot->flags, F_OBHP, 30, 30, NA, NULL);
addflag(lastot->flags, F_EQUIPCONFER, F_STABILITY, NA, NA, NULL); addflag(lastot->flags, F_EQUIPCONFER, F_STABILITY, NA, NA, NULL);
addflag(lastot->flags, F_ATTREQ, A_AGI, 35, NA, NULL); addflag(lastot->flags, F_ATTREQ, A_AGI, 35, NA, NULL);
addflag(lastot->flags, F_CRITPROTECTION, 90, NA, NA, NULL); addflag(lastot->flags, F_CRITPROTECTION, 90, NA, NA, NULL);
@ -5949,7 +5980,7 @@ void initobjects(void) {
addflag(lastot->flags, F_MULTISIZE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_MULTISIZE, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_GOESON, BP_FEET, NA, NA, NULL); addflag(lastot->flags, F_GOESON, BP_FEET, NA, NA, NULL);
addflag(lastot->flags, F_ARMOURRATING, 2, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 2, NA, NA, NULL);
addflag(lastot->flags, F_OBHP, 20, 20, NA, NULL); addflag(lastot->flags, F_OBHP, 30, 30, NA, NULL);
addflag(lastot->flags, F_ATTREQ, A_AGI, 35, NA, NULL); addflag(lastot->flags, F_ATTREQ, A_AGI, 35, NA, NULL);
addflag(lastot->flags, F_CRITPROTECTION, 90, NA, NA, NULL); addflag(lastot->flags, F_CRITPROTECTION, 90, NA, NA, NULL);
addot(OT_BOOTSMETAL, "pair of metal boots", "A strong pair of metal boots.", MT_METAL, 5, OC_ARMOUR, SZ_SMALL); addot(OT_BOOTSMETAL, "pair of metal boots", "A strong pair of metal boots.", MT_METAL, 5, OC_ARMOUR, SZ_SMALL);
@ -5958,7 +5989,7 @@ void initobjects(void) {
addflag(lastot->flags, F_MULTISIZE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_MULTISIZE, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_GOESON, BP_FEET, NA, NA, NULL); addflag(lastot->flags, F_GOESON, BP_FEET, NA, NA, NULL);
addflag(lastot->flags, F_ARMOURRATING, 2, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 2, NA, NA, NULL);
addflag(lastot->flags, F_OBHP, 20, 20, NA, NULL); addflag(lastot->flags, F_OBHP, 40, 40, NA, NULL);
addflag(lastot->flags, F_ATTREQ, A_AGI, 35, NA, NULL); addflag(lastot->flags, F_ATTREQ, A_AGI, 35, NA, NULL);
addflag(lastot->flags, F_CRITPROTECTION, 100, NA, NA, NULL); addflag(lastot->flags, F_CRITPROTECTION, 100, NA, NA, NULL);
// armour - gloves // armour - gloves
@ -5968,7 +5999,7 @@ void initobjects(void) {
addflag(lastot->flags, F_MULTISIZE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_MULTISIZE, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_GOESON, BP_HANDS, NA, NA, NULL); addflag(lastot->flags, F_GOESON, BP_HANDS, NA, NA, NULL);
addflag(lastot->flags, F_ARMOURRATING, 0, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 0, NA, NA, NULL);
addflag(lastot->flags, F_OBHP, 10, 10, NA, NULL); addflag(lastot->flags, F_OBHP, 20, 20, NA, NULL);
addflag(lastot->flags, F_ATTREQ, A_AGI, 15, NA, NULL); addflag(lastot->flags, F_ATTREQ, A_AGI, 15, NA, NULL);
addflag(lastot->flags, F_CRITPROTECTION, 70, NA, NA, NULL); addflag(lastot->flags, F_CRITPROTECTION, 70, NA, NA, NULL);
addot(OT_GLOVESLEATHER, "pair of leather gloves", "A pair of coarse leather gloves.", MT_LEATHER, 0.25, OC_ARMOUR, SZ_SMALL); addot(OT_GLOVESLEATHER, "pair of leather gloves", "A pair of coarse leather gloves.", MT_LEATHER, 0.25, OC_ARMOUR, SZ_SMALL);
@ -5976,7 +6007,7 @@ void initobjects(void) {
addflag(lastot->flags, F_GOESON, BP_HANDS, NA, NA, NULL); addflag(lastot->flags, F_GOESON, BP_HANDS, NA, NA, NULL);
addflag(lastot->flags, F_MULTISIZE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_MULTISIZE, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_ARMOURRATING, 1, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 1, NA, NA, NULL);
addflag(lastot->flags, F_OBHP, 20, 20, NA, NULL); addflag(lastot->flags, F_OBHP, 30, 30, NA, NULL);
addflag(lastot->flags, F_ATTREQ, A_AGI, 15, NA, NULL); addflag(lastot->flags, F_ATTREQ, A_AGI, 15, NA, NULL);
addflag(lastot->flags, F_CRITPROTECTION, 90, NA, NA, NULL); addflag(lastot->flags, F_CRITPROTECTION, 90, NA, NA, NULL);
addot(OT_GAUNTLETS, "pair of gauntlets", "A durable pair of metal gauntlets.", MT_METAL, 2, OC_ARMOUR, SZ_SMALL); addot(OT_GAUNTLETS, "pair of gauntlets", "A durable pair of metal gauntlets.", MT_METAL, 2, OC_ARMOUR, SZ_SMALL);
@ -5985,7 +6016,7 @@ void initobjects(void) {
addflag(lastot->flags, F_MULTISIZE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_MULTISIZE, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_ARMOURRATING, 2, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 2, NA, NA, NULL);
addflag(lastot->flags, F_EQUIPCONFER, F_ARMOURPENALTY, 10, 5, NULL); addflag(lastot->flags, F_EQUIPCONFER, F_ARMOURPENALTY, 10, 5, NULL);
addflag(lastot->flags, F_OBHP, 20, 20, NA, NULL); addflag(lastot->flags, F_OBHP, 40, 40, NA, NULL);
addflag(lastot->flags, F_ATTREQ, A_AGI, 15, NA, NULL); addflag(lastot->flags, F_ATTREQ, A_AGI, 15, NA, NULL);
addflag(lastot->flags, F_CRITPROTECTION, 100, NA, NA, NULL); addflag(lastot->flags, F_CRITPROTECTION, 100, NA, NA, NULL);
// armour - head // armour - head
@ -6008,7 +6039,7 @@ void initobjects(void) {
addflag(lastot->flags, F_MULTISIZE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_MULTISIZE, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_GOESON, BP_HEAD, NA, NA, NULL); addflag(lastot->flags, F_GOESON, BP_HEAD, NA, NA, NULL);
addflag(lastot->flags, F_ARMOURRATING, 0, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 0, NA, NA, NULL);
addflag(lastot->flags, F_OBHP, 5, 5, NA, NULL); addflag(lastot->flags, F_OBHP, 10, 10, NA, NULL);
addflag(lastot->flags, F_NOQUALITY, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_NOQUALITY, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_EQUIPCONFER, F_ANONYMOUS, NA, NA, NULL); addflag(lastot->flags, F_EQUIPCONFER, F_ANONYMOUS, NA, NA, NULL);
addot(OT_CAP, "cap", "Close-fitting headwear with a short shade visor at the front.", MT_CLOTH, 1, OC_ARMOUR, SZ_SMALL); addot(OT_CAP, "cap", "Close-fitting headwear with a short shade visor at the front.", MT_CLOTH, 1, OC_ARMOUR, SZ_SMALL);
@ -6026,12 +6057,12 @@ void initobjects(void) {
addflag(lastot->flags, F_ARMOURRATING, 1, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 1, NA, NA, NULL);
addflag(lastot->flags, F_OBHP, 5, 5, NA, NULL); addflag(lastot->flags, F_OBHP, 5, 5, NA, NULL);
addflag(lastot->flags, F_NOQUALITY, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_NOQUALITY, B_TRUE, NA, NA, NULL);
addot(OT_GASMASK, "gas mask", "A full face mask which protects the wearer from toxic gasses.", MT_METAL, 3.5, OC_ARMOUR, SZ_SMALL); addot(OT_GASMASK, "gas mask", "A full face mask which protects the wearer from toxic gasses.", MT_RUBBER, 3.5, OC_ARMOUR, SZ_SMALL);
addflag(lastot->flags, F_RARITY, H_ALL, 75, RR_UNCOMMON, NULL); addflag(lastot->flags, F_RARITY, H_ALL, 75, RR_UNCOMMON, NULL);
addflag(lastot->flags, F_GOESON, BP_HEAD, NA, NA, NULL); addflag(lastot->flags, F_GOESON, BP_HEAD, NA, NA, NULL);
addflag(lastot->flags, F_ARMOURRATING, 2, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 2, NA, NA, NULL);
addflag(lastot->flags, F_ACCURACYMOD, -10, NA, NA, NULL); addflag(lastot->flags, F_ACCURACYMOD, -10, NA, NA, NULL);
addflag(lastot->flags, F_OBHP, 15, 15, NA, NULL); addflag(lastot->flags, F_OBHP, 30, 30, NA, NULL);
addflag(lastot->flags, F_EQUIPCONFER, F_DTIMMUNE, DT_POISONGAS, NA, NULL); addflag(lastot->flags, F_EQUIPCONFER, F_DTIMMUNE, DT_POISONGAS, NA, NULL);
addflag(lastot->flags, F_EQUIPCONFER, F_VISRANGEMOD, -2, NA, NULL); addflag(lastot->flags, F_EQUIPCONFER, F_VISRANGEMOD, -2, NA, NULL);
addflag(lastot->flags, F_NOQUALITY, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_NOQUALITY, B_TRUE, NA, NA, NULL);
@ -6040,7 +6071,7 @@ void initobjects(void) {
addflag(lastot->flags, F_RARITY, H_ALL, 100, RR_COMMON, NULL); addflag(lastot->flags, F_RARITY, H_ALL, 100, RR_COMMON, NULL);
addflag(lastot->flags, F_GOESON, BP_HEAD, NA, NA, NULL); addflag(lastot->flags, F_GOESON, BP_HEAD, NA, NA, NULL);
addflag(lastot->flags, F_ARMOURRATING, 3, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 3, NA, NA, NULL);
addflag(lastot->flags, F_OBHP, 20, 20, NA, NULL); addflag(lastot->flags, F_OBHP, 40, 40, NA, NULL);
addflag(lastot->flags, F_CRITPROTECTION, 100, NA, NA, NULL); addflag(lastot->flags, F_CRITPROTECTION, 100, NA, NA, NULL);
addot(OT_HELMFOOTBALL, "football helmet", "A metal helmet with a grill in front of the face.", MT_METAL, 1, OC_ARMOUR, SZ_SMALL); addot(OT_HELMFOOTBALL, "football helmet", "A metal helmet with a grill in front of the face.", MT_METAL, 1, OC_ARMOUR, SZ_SMALL);
addflag(lastot->flags, F_RARITY, H_ALL, 100, RR_COMMON, NULL); addflag(lastot->flags, F_RARITY, H_ALL, 100, RR_COMMON, NULL);
@ -6048,14 +6079,14 @@ void initobjects(void) {
addflag(lastot->flags, F_MULTISIZE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_MULTISIZE, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_ARMOURRATING, 2, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 2, NA, NA, NULL);
addflag(lastot->flags, F_ACCURACYMOD, -10, NA, NA, NULL); addflag(lastot->flags, F_ACCURACYMOD, -10, NA, NA, NULL);
addflag(lastot->flags, F_OBHP, 20, 20, NA, NULL); addflag(lastot->flags, F_OBHP, 40, 40, NA, NULL);
addflag(lastot->flags, F_EQUIPCONFER, F_VISRANGEMOD, -1, NA, NULL); addflag(lastot->flags, F_EQUIPCONFER, F_VISRANGEMOD, -1, NA, NULL);
addflag(lastot->flags, F_CRITPROTECTION, 100, NA, NA, NULL); addflag(lastot->flags, F_CRITPROTECTION, 100, NA, NA, NULL);
addot(OT_GOLDCROWN, "golden crown", "A heavy gold crown, encrusted with jewels.", MT_GOLD, 5, OC_ARMOUR, SZ_SMALL); addot(OT_GOLDCROWN, "golden crown", "A heavy gold crown, encrusted with jewels.", MT_GOLD, 5, OC_ARMOUR, SZ_SMALL);
addflag(lastot->flags, F_RARITY, H_ALL, 25, RR_RARE, NULL); addflag(lastot->flags, F_RARITY, H_ALL, 25, RR_RARE, NULL);
addflag(lastot->flags, F_GOESON, BP_HEAD, NA, NA, NULL); addflag(lastot->flags, F_GOESON, BP_HEAD, NA, NA, NULL);
addflag(lastot->flags, F_ARMOURRATING, 1, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 1, NA, NA, NULL);
addflag(lastot->flags, F_OBHP, 10, 10, NA, NULL); addflag(lastot->flags, F_OBHP, 30, 30, NA, NULL);
addflag(lastot->flags, F_CRITPROTECTION, 33, NA, NA, NULL); addflag(lastot->flags, F_CRITPROTECTION, 33, NA, NA, NULL);
addflag(lastot->flags, F_BRANDCHANCE, 30, NA, NA, NULL); addflag(lastot->flags, F_BRANDCHANCE, 30, NA, NA, NULL);
addot(OT_HELMBONE, "bone helmet", "Scary-looking helmet made from the bones of an animal (?).", MT_BONE, 1, OC_ARMOUR, SZ_SMALL); addot(OT_HELMBONE, "bone helmet", "Scary-looking helmet made from the bones of an animal (?).", MT_BONE, 1, OC_ARMOUR, SZ_SMALL);
@ -6063,14 +6094,14 @@ void initobjects(void) {
addflag(lastot->flags, F_RARITY, H_FOREST, 100, RR_UNCOMMON, NULL); addflag(lastot->flags, F_RARITY, H_FOREST, 100, RR_UNCOMMON, NULL);
addflag(lastot->flags, F_GOESON, BP_HEAD, NA, NA, NULL); addflag(lastot->flags, F_GOESON, BP_HEAD, NA, NA, NULL);
addflag(lastot->flags, F_ARMOURRATING, 2, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 2, NA, NA, NULL);
addflag(lastot->flags, F_OBHP, 15, 15, NA, NULL); addflag(lastot->flags, F_OBHP, 30, 30, NA, NULL);
addflag(lastot->flags, F_SCARY, 4, NA, NA, NULL); addflag(lastot->flags, F_SCARY, 4, NA, NA, NULL);
addflag(lastot->flags, F_CRITPROTECTION, 100, NA, NA, NULL); addflag(lastot->flags, F_CRITPROTECTION, 100, NA, NA, NULL);
addot(OT_POINTYHAT, "wizard hat", "A foot-long brimmed conical hat, inscribed with strange symbols.", MT_CLOTH, 1, OC_ARMOUR, SZ_SMALL); addot(OT_POINTYHAT, "wizard hat", "A foot-long brimmed conical hat, inscribed with strange symbols.", MT_CLOTH, 1, OC_ARMOUR, SZ_SMALL);
addflag(lastot->flags, F_RARITY, H_ALL, 100, RR_UNCOMMON, NULL); addflag(lastot->flags, F_RARITY, H_ALL, 100, RR_UNCOMMON, NULL);
addflag(lastot->flags, F_GOESON, BP_HEAD, NA, NA, NULL); addflag(lastot->flags, F_GOESON, BP_HEAD, NA, NA, NULL);
addflag(lastot->flags, F_ARMOURRATING, 1, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 1, NA, NA, NULL);
addflag(lastot->flags, F_OBHP, 10, 10, NA, NULL); addflag(lastot->flags, F_OBHP, 15, 15, NA, NULL);
addflag(lastot->flags, F_NOQUALITY, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_NOQUALITY, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_HASHIDDENNAME, B_TRUE, NA, NA, "pointy hat"); addflag(lastot->flags, F_HASHIDDENNAME, B_TRUE, NA, NA, "pointy hat");
addflag(lastot->flags, F_CRITPROTECTION, 100, NA, NA, NULL); addflag(lastot->flags, F_CRITPROTECTION, 100, NA, NA, NULL);
@ -6080,7 +6111,7 @@ void initobjects(void) {
addot(OT_EARPLUGS, "set of earplugs", "A pair of cloth plugs designed to give the wearer a peaceful night's sleep. ", MT_CLOTH, 0.01, OC_ARMOUR, SZ_SMALL); addot(OT_EARPLUGS, "set of earplugs", "A pair of cloth plugs designed to give the wearer a peaceful night's sleep. ", MT_CLOTH, 0.01, OC_ARMOUR, SZ_SMALL);
addflag(lastot->flags, F_RARITY, H_ALL, 100, RR_UNCOMMON, NULL); addflag(lastot->flags, F_RARITY, H_ALL, 100, RR_UNCOMMON, NULL);
addflag(lastot->flags, F_GOESON, BP_EARS, NA, NA, NULL); addflag(lastot->flags, F_GOESON, BP_EARS, NA, NA, NULL);
addflag(lastot->flags, F_OBHP, 1, 1, NA, NULL); addflag(lastot->flags, F_OBHP, 5, 5, NA, NULL);
addflag(lastot->flags, F_EQUIPCONFER, F_DEAF, NA, NA, NULL); addflag(lastot->flags, F_EQUIPCONFER, F_DEAF, NA, NA, NULL);
addflag(lastot->flags, F_NOQUALITY, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_NOQUALITY, B_TRUE, NA, NA, NULL);
@ -6090,7 +6121,7 @@ void initobjects(void) {
addflag(lastot->flags, F_RARITY, H_FOREST, 100, RR_COMMON, NULL); addflag(lastot->flags, F_RARITY, H_FOREST, 100, RR_COMMON, NULL);
addflag(lastot->flags, F_GOESON, BP_EYES, NA, NA, NULL); addflag(lastot->flags, F_GOESON, BP_EYES, NA, NA, NULL);
addflag(lastot->flags, F_ARMOURRATING, 0, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 0, NA, NA, NULL);
addflag(lastot->flags, F_OBHP, 10, 10, NA, NULL); addflag(lastot->flags, F_OBHP, 20, 20, NA, NULL);
addflag(lastot->flags, F_NOQUALITY, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_NOQUALITY, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_CRITPROTECTION, 100, NA, NA, NULL); addflag(lastot->flags, F_CRITPROTECTION, 100, NA, NA, NULL);
killflagsofid(lastot->flags, F_ENCHANTABLE); killflagsofid(lastot->flags, F_ENCHANTABLE);
@ -6099,7 +6130,7 @@ void initobjects(void) {
addflag(lastot->flags, F_RARITY, H_FOREST, 100, RR_COMMON, NULL); addflag(lastot->flags, F_RARITY, H_FOREST, 100, RR_COMMON, NULL);
addflag(lastot->flags, F_GOESON, BP_EYES, NA, NA, NULL); addflag(lastot->flags, F_GOESON, BP_EYES, NA, NA, NULL);
addflag(lastot->flags, F_ARMOURRATING, 0, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 0, NA, NA, NULL);
addflag(lastot->flags, F_OBHP, 5, 5, NA, NULL); addflag(lastot->flags, F_OBHP, 15, 15, NA, NULL);
addflag(lastot->flags, F_EQUIPCONFER, F_VISRANGEMOD, 1, NA, NULL); addflag(lastot->flags, F_EQUIPCONFER, F_VISRANGEMOD, 1, NA, NULL);
addflag(lastot->flags, F_NOQUALITY, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_NOQUALITY, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_CRITPROTECTION, 100, NA, NA, NULL); addflag(lastot->flags, F_CRITPROTECTION, 100, NA, NA, NULL);
@ -6109,7 +6140,7 @@ void initobjects(void) {
addflag(lastot->flags, F_RARITY, H_FOREST, 100, RR_COMMON, NULL); addflag(lastot->flags, F_RARITY, H_FOREST, 100, RR_COMMON, NULL);
addflag(lastot->flags, F_GOESON, BP_EYES, NA, NA, NULL); addflag(lastot->flags, F_GOESON, BP_EYES, NA, NA, NULL);
addflag(lastot->flags, F_ARMOURRATING, 0, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 0, NA, NA, NULL);
addflag(lastot->flags, F_OBHP, 10, 10, NA, NULL); addflag(lastot->flags, F_OBHP, 15, 15, NA, NULL);
addflag(lastot->flags, F_EQUIPCONFER, F_VISRANGEMOD, -1, NA, NULL); addflag(lastot->flags, F_EQUIPCONFER, F_VISRANGEMOD, -1, NA, NULL);
addflag(lastot->flags, F_EQUIPCONFER, F_NIGHTVISRANGEMOD, -1, NA, NULL); addflag(lastot->flags, F_EQUIPCONFER, F_NIGHTVISRANGEMOD, -1, NA, NULL);
addflag(lastot->flags, F_TINTED, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_TINTED, B_TRUE, NA, NA, NULL);
@ -6168,6 +6199,56 @@ void initobjects(void) {
addflag(lastot->flags, F_OBHP, 50, 50, NA, NULL); addflag(lastot->flags, F_OBHP, 50, 50, NA, NULL);
addflag(lastot->flags, F_CRITPROTECTION, 100, NA, NA, NULL); addflag(lastot->flags, F_CRITPROTECTION, 100, NA, NA, NULL);
// amulets
addot(OT_AMU_ANGER, "amulet of anger", "Allows its wearer to enter a state of bezerk rage at will.", MT_METAL, 0.3, OC_AMULET, SZ_TINY);
addflag(lastot->flags, F_RARITY, H_ALL, NA, RR_UNCOMMON, NULL);
addflag(lastot->flags, F_EQUIPCONFER, F_CANWILL, OT_A_RAGE, NA, NULL);
addflag(lastot->flags, F_VALUE, 600, NA, NA, NULL);
addot(OT_AMU_CHEF, "chef's amulet", "Greatly lowers its wearers' metabolism.", MT_METAL, 0.3, OC_AMULET, SZ_TINY);
addflag(lastot->flags, F_RARITY, H_ALL, NA, RR_UNCOMMON, NULL);
addflag(lastot->flags, F_EQUIPCONFER, F_SLOWMETAB, 3, NA, NULL);
addflag(lastot->flags, F_VALUE, 300, NA, NA, NULL);
addot(OT_AMU_ESCAPE, "amulet of escape", "Grants its wearer the ability to teleport short distances.", MT_METAL, 0.3, OC_AMULET, SZ_TINY);
addflag(lastot->flags, F_RARITY, H_ALL, NA, RR_UNCOMMON, NULL);
addflag(lastot->flags, F_EQUIPCONFER, F_CANWILL, OT_S_BLINK, NA, "pw:6;");
addflag(lastot->flags, F_VALUE, 600, NA, NA, NULL);
addot(OT_AMU_FALLING, "amulet of feather fall", "Limits the effects of gravity on its wearer, rendering them immune to fall damage.", MT_METAL, 0.3, OC_AMULET, SZ_TINY);
addflag(lastot->flags, F_RARITY, H_ALL, NA, RR_COMMON, NULL);
addflag(lastot->flags, F_EQUIPCONFER, F_DTIMMUNE, DT_FALL, NA, NULL);
addflag(lastot->flags, F_VALUE, 300, NA, NA, NULL);
addot(OT_AMU_FLIGHT, "amulet of flight", "Grants its wearer the ability to fly.", MT_METAL, 0.3, OC_AMULET, SZ_TINY);
addflag(lastot->flags, F_RARITY, H_ALL, NA, RR_RARE, NULL);
addflag(lastot->flags, F_EQUIPCONFER, F_CANWILL, OT_S_FLIGHT, NA, NULL);
addflag(lastot->flags, F_VALUE, 900, NA, NA, NULL);
addot(OT_AMU_LISTEN, "amulet of amplification", "Greatly enhances the wearer's sense of hearing.", MT_METAL, 0.3, OC_AMULET, SZ_TINY);
addflag(lastot->flags, F_RARITY, H_ALL, NA, RR_UNCOMMON, NULL);
addflag(lastot->flags, F_EQUIPCONFER, F_DTVULN, DT_SONIC, NA, NULL);
addflag(lastot->flags, F_VALUE, 300, NA, NA, NULL);
addot(OT_AMU_SLEEP, "amulet of peaceful slumber", "Blocks out all sound while the wearer sleeps.", MT_METAL, 0.3, OC_AMULET, SZ_TINY);
addflag(lastot->flags, F_RARITY, H_ALL, NA, RR_UNCOMMON, NULL);
addflag(lastot->flags, F_STARTBLESSED, B_CURSED, NA, NA, NULL);
addflag(lastot->flags, F_VALUE, 300, NA, NA, NULL);
addot(OT_AMU_SPELLBOOST, "archmage's amulet", "Greatly increases the power of the wearer's spells.", MT_METAL, 0.3, OC_AMULET, SZ_TINY);
addflag(lastot->flags, F_RARITY, H_ALL, NA, RR_RARE, "");
addflag(lastot->flags, F_VALUE, 900, NA, NA, NULL);
addflag(lastot->flags, F_EQUIPCONFER, F_MAGICBOOST, 5, NA, NULL);
addot(OT_AMU_THIEF, "thief's amulet", "Crafted by a master thief, it allows its wearer the uncanny ability to pick almost any lock.", MT_METAL, 0.3, OC_AMULET, SZ_TINY);
addflag(lastot->flags, F_RARITY, H_ALL, NA, RR_UNCOMMON, NULL);
addflag(lastot->flags, F_EQUIPCONFER, F_CANWILL, OT_A_PICKLOCK, NA, NULL);
addflag(lastot->flags, F_VALUE, 300, NA, NA, NULL);
addot(OT_AMU_VICTIM, "amulet of victimisation", "Causes all creatures who view the wearer to become hostile and agressive.", MT_METAL, 0.3, OC_AMULET, SZ_TINY);
addflag(lastot->flags, F_RARITY, H_ALL, NA, RR_RARE, NULL);
addflag(lastot->flags, F_VALUE, 900, NA, NA, NULL);
addot(OT_AMU_VSMAGIC, "amulet versus magic", "Confers a moderate level of magic resistance upon its wearer.", MT_METAL, 0.3, OC_AMULET, SZ_TINY);
addflag(lastot->flags, F_RARITY, H_ALL, NA, RR_UNCOMMON, NULL);
addflag(lastot->flags, F_EQUIPCONFER, F_RESISTMAG, 66, NA, NULL);
addflag(lastot->flags, F_VALUE, 600, NA, NA, NULL);
addot(OT_AMU_VSPOISON, "amulet versus poison", "Protects its wearer from all forms of poison.", MT_METAL, 0.3, OC_AMULET, SZ_TINY);
addflag(lastot->flags, F_RARITY, H_ALL, NA, RR_UNCOMMON, NULL);
addflag(lastot->flags, F_EQUIPCONFER, F_DTIMMUNE, DT_POISON, NA, NULL);
addflag(lastot->flags, F_VALUE, 600, NA, NA, NULL);
// rings // rings
addot(OT_RING_EDUCATION, "ring of education", "Boosts earned XP and Skill points.", MT_METAL, 0.1, OC_RING, SZ_MINI); addot(OT_RING_EDUCATION, "ring of education", "Boosts earned XP and Skill points.", MT_METAL, 0.1, OC_RING, SZ_MINI);
addflag(lastot->flags, F_RARITY, H_ALL, 75, RR_UNCOMMON, ""); addflag(lastot->flags, F_RARITY, H_ALL, 75, RR_UNCOMMON, "");
@ -6256,9 +6337,9 @@ void initobjects(void) {
addflag(lastot->flags, F_RARITY, H_ALL, 75, RR_UNCOMMON, ""); addflag(lastot->flags, F_RARITY, H_ALL, 75, RR_UNCOMMON, "");
addflag(lastot->flags, F_EQUIPCONFER, F_REGENERATES, 1, NA, NULL); addflag(lastot->flags, F_EQUIPCONFER, F_REGENERATES, 1, NA, NULL);
addflag(lastot->flags, F_VALUE, 350, NA, NA, NULL); addflag(lastot->flags, F_VALUE, 350, NA, NA, NULL);
addot(OT_RING_RESISTMAG, "ring of magic resistance", "Renders the wearer immune to most magical effects.", MT_METAL, 0.1, OC_RING, SZ_MINI); addot(OT_RING_RESISTMAG, "ring of magic resistance", "Confers a minor level of magical immunity to the wearer.", MT_METAL, 0.1, OC_RING, SZ_MINI);
addflag(lastot->flags, F_RARITY, H_ALL, 75, RR_UNCOMMON, ""); addflag(lastot->flags, F_RARITY, H_ALL, 75, RR_UNCOMMON, "");
addflag(lastot->flags, F_EQUIPCONFER, F_RESISTMAG, 5, NA, NULL); addflag(lastot->flags, F_EQUIPCONFER, F_RESISTMAG, 33, NA, NULL);
addflag(lastot->flags, F_VALUE, 350, NA, NA, NULL); addflag(lastot->flags, F_VALUE, 350, NA, NA, NULL);
addot(OT_RING_MEDITATION, "ring of meditation", "Allows the wearer to rest by entering a state of meditation.", MT_METAL, 0.1, OC_RING, SZ_MINI); addot(OT_RING_MEDITATION, "ring of meditation", "Allows the wearer to rest by entering a state of meditation.", MT_METAL, 0.1, OC_RING, SZ_MINI);
addflag(lastot->flags, F_RARITY, H_ALL, 75, RR_UNCOMMON, ""); addflag(lastot->flags, F_RARITY, H_ALL, 75, RR_UNCOMMON, "");
@ -6269,7 +6350,7 @@ void initobjects(void) {
addflag(lastot->flags, F_CHARGES, 1, 3, NA, NULL); // always starts with just 1 charge addflag(lastot->flags, F_CHARGES, 1, 3, NA, NULL); // always starts with just 1 charge
addflag(lastot->flags, F_VALUE, 400, NA, NA, NULL); addflag(lastot->flags, F_VALUE, 400, NA, NA, NULL);
addflag(lastot->flags, F_REPLENISHABLE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_REPLENISHABLE, B_TRUE, NA, NA, NULL);
addot(OT_RING_MPBOOST, "ring of arcane power", "Increases the power of the wearer's spells.", MT_METAL, 0.1, OC_RING, SZ_MINI); addot(OT_RING_SPELLBOOST, "ring of arcane power", "Increases the power of the wearer's spells.", MT_METAL, 0.1, OC_RING, SZ_MINI);
addflag(lastot->flags, F_RARITY, H_ALL, 75, RR_UNCOMMON, ""); addflag(lastot->flags, F_RARITY, H_ALL, 75, RR_UNCOMMON, "");
addflag(lastot->flags, F_VALUE, 250, NA, NA, NULL); addflag(lastot->flags, F_VALUE, 250, NA, NA, NULL);
addflag(lastot->flags, F_EQUIPCONFER, F_MAGICBOOST, 1, NA, NULL); addflag(lastot->flags, F_EQUIPCONFER, F_MAGICBOOST, 1, NA, NULL);
@ -8788,7 +8869,6 @@ void initrace(void) {
addflag(lastrace->flags, F_WANTSBETTERWEP, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_WANTSBETTERWEP, B_TRUE, NA, NA, NULL);
addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 3, NA, "shouts^a shout"); addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 3, NA, "shouts^a shout");
addflag(lastrace->flags, F_SEEINDARK, 2, NA, NA, NULL); addflag(lastrace->flags, F_SEEINDARK, 2, NA, NA, NULL);
addflag(lastrace->flags, F_PACKATTACK, 3, NA, 2, NULL);
addflag(lastrace->flags, F_HUMANOID, B_TRUE, NA, NA, 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_STARTSKILL, SK_PERCEPTION, PR_ADEPT, NA, NULL);
addflag(lastrace->flags, F_NOCTURNAL, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_NOCTURNAL, B_TRUE, NA, NA, NULL);
@ -8827,7 +8907,6 @@ void initrace(void) {
addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 3, NA, "shouts^a shout"); addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 3, NA, "shouts^a shout");
addflag(lastrace->flags, F_SEEINDARK, 3, NA, NA, NULL); addflag(lastrace->flags, F_SEEINDARK, 3, NA, NA, NULL);
addflag(lastrace->flags, F_DODGES, B_TRUE, 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_HUMANOID, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_HUMANOID, B_TRUE, NA, NA, NULL);
addflag(lastrace->flags, F_STARTSKILL, SK_PERCEPTION, PR_NOVICE, NA, NULL); addflag(lastrace->flags, F_STARTSKILL, SK_PERCEPTION, PR_NOVICE, NA, NULL);
addflag(lastrace->flags, F_NOCTURNAL, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_NOCTURNAL, B_TRUE, NA, NA, NULL);
@ -8870,7 +8949,6 @@ void initrace(void) {
addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 3, NA, "shouts^a shout"); addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 3, NA, "shouts^a shout");
addflag(lastrace->flags, F_SEEINDARK, 2, NA, NA, NULL); addflag(lastrace->flags, F_SEEINDARK, 2, NA, NA, NULL);
addflag(lastrace->flags, F_DODGES, B_TRUE, 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_HUMANOID, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_HUMANOID, B_TRUE, NA, NA, NULL);
addflag(lastrace->flags, F_STARTSKILL, SK_PERCEPTION, PR_NOVICE, NA, NULL); addflag(lastrace->flags, F_STARTSKILL, SK_PERCEPTION, PR_NOVICE, NA, NULL);
addflag(lastrace->flags, F_STARTSKILL, SK_SWIMMING, PR_MASTER, NA, NULL); addflag(lastrace->flags, F_STARTSKILL, SK_SWIMMING, PR_MASTER, NA, NULL);
@ -8908,7 +8986,6 @@ void initrace(void) {
addflag(lastrace->flags, F_STABILITY, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_STABILITY, B_TRUE, NA, NA, NULL);
addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 3, NA, "shouts^a shout"); addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 3, NA, "shouts^a shout");
addflag(lastrace->flags, F_DODGES, B_TRUE, 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_HUMANOID, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_HUMANOID, B_TRUE, NA, NA, NULL);
addflag(lastrace->flags, F_STARTSKILL, SK_PERCEPTION, PR_NOVICE, NA, NULL); addflag(lastrace->flags, F_STARTSKILL, SK_PERCEPTION, PR_NOVICE, NA, NULL);
addflag(lastrace->flags, F_STARTSKILL, SK_STEALTH, PR_EXPERT, NA, NULL); addflag(lastrace->flags, F_STARTSKILL, SK_STEALTH, PR_EXPERT, NA, NULL);
@ -8943,7 +9020,6 @@ void initrace(void) {
addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 3, NA, "shouts^a shout"); addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 3, NA, "shouts^a shout");
addflag(lastrace->flags, F_SEEINDARK, 3, NA, NA, NULL); addflag(lastrace->flags, F_SEEINDARK, 3, NA, NA, NULL);
addflag(lastrace->flags, F_DODGES, B_TRUE, 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_MINIONS, 90, 1, 2, "goblin"); addflag(lastrace->flags, F_MINIONS, 90, 1, 2, "goblin");
addflag(lastrace->flags, F_HUMANOID, B_TRUE, NA, NA, NULL); 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_STARTSKILL, SK_PERCEPTION, PR_SKILLED, NA, NULL);
@ -8976,7 +9052,6 @@ void initrace(void) {
addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 3, NA, "shouts^a shout"); addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 3, NA, "shouts^a shout");
addflag(lastrace->flags, F_SEEINDARK, 5, NA, NA, NULL); addflag(lastrace->flags, F_SEEINDARK, 5, NA, NA, NULL);
addflag(lastrace->flags, F_DODGES, B_TRUE, 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_MINIONS, 70, 1, 2, "goblin"); addflag(lastrace->flags, F_MINIONS, 70, 1, 2, "goblin");
addflag(lastrace->flags, F_CANWILL, OT_A_HIDE, NA, NA, NULL); addflag(lastrace->flags, F_CANWILL, OT_A_HIDE, NA, NA, NULL);
addflag(lastrace->flags, F_STARTHIDDENPCT, 75, NA, NA, NULL); addflag(lastrace->flags, F_STARTHIDDENPCT, 75, NA, NA, NULL);
@ -9009,7 +9084,6 @@ void initrace(void) {
addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 3, NA, "shouts^a shout"); addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 3, NA, "shouts^a shout");
addflag(lastrace->flags, F_SEEINDARK, 5, NA, NA, NULL); addflag(lastrace->flags, F_SEEINDARK, 5, NA, NA, NULL);
addflag(lastrace->flags, F_DODGES, B_TRUE, 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_CANCAST, OT_S_BLINDNESS, 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_CANCAST, OT_S_PAIN, NA, NA, NULL);
addflag(lastrace->flags, F_RNDSPELLCOUNT, 2, NA, NA, NULL); addflag(lastrace->flags, F_RNDSPELLCOUNT, 2, NA, NA, NULL);
@ -9048,7 +9122,6 @@ void initrace(void) {
addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 3, NA, "shouts^a shout"); addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 3, NA, "shouts^a shout");
addflag(lastrace->flags, F_SEEINDARK, 4, NA, NA, NULL); addflag(lastrace->flags, F_SEEINDARK, 4, NA, NA, NULL);
addflag(lastrace->flags, F_DODGES, B_TRUE, 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_MINIONS, 90, 4, 6, "goblin"); addflag(lastrace->flags, F_MINIONS, 90, 4, 6, "goblin");
addflag(lastrace->flags, F_HUMANOID, B_TRUE, NA, NA, NULL); 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_STARTSKILL, SK_PERCEPTION, PR_SKILLED, NA, NULL);
@ -9618,6 +9691,7 @@ void initrace(void) {
addflag(lastrace->flags, F_HASATTACK, OT_TEETH, 3, NA, NULL); addflag(lastrace->flags, F_HASATTACK, OT_TEETH, 3, NA, NULL);
addflag(lastrace->flags, F_MAXATTACKS, 3, 3, NA, NULL); addflag(lastrace->flags, F_MAXATTACKS, 3, 3, NA, NULL);
addflag(lastrace->flags, F_CANWILL, OT_A_SWOOP, NA, NA, NULL); addflag(lastrace->flags, F_CANWILL, OT_A_SWOOP, NA, NA, NULL);
addflag(lastrace->flags, F_CANCAST, OT_S_SMITEEVIL, NA, NA, "pw:8;");
addflag(lastrace->flags, F_SWOOPRANGE, 4, NA, NA, NULL); addflag(lastrace->flags, F_SWOOPRANGE, 4, NA, NA, NULL);
addflag(lastrace->flags, F_NOISETEXT, N_LOWHP, 4, NA, "screams in pain^screams of pain"); addflag(lastrace->flags, F_NOISETEXT, N_LOWHP, 4, NA, "screams in pain^screams of pain");
addflag(lastrace->flags, F_RESISTMAG, 5, NA, NA, NULL); addflag(lastrace->flags, F_RESISTMAG, 5, NA, NA, NULL);
@ -12331,6 +12405,8 @@ void initrace(void) {
addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 3, NA, "growls^a growl"); addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 3, NA, "growls^a growl");
addflag(lastrace->flags, F_DEAF, 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_MORALE, 30, NA, NA, NULL);
addflag(lastrace->flags, F_CANEATRAW, B_TRUE, NA, NA, NULL);
addflag(lastrace->flags, F_WANTSOBFLAG, F_EDIBLE, B_COVETS, NA, NULL);
addrace(R_SKELETON, "skeleton", 20, 'Z', C_GREY, MT_BONE, RC_UNDEAD, "A walking set of bones, animated through the use of necromancy. Due to their lack of soft flesh, they have little to fear from edged weapons."); addrace(R_SKELETON, "skeleton", 20, 'Z', C_GREY, MT_BONE, RC_UNDEAD, "A walking set of bones, animated through the use of necromancy. Due to their lack of soft flesh, they have little to fear from edged weapons.");
setbodytype(lastrace, BT_HUMANOID); setbodytype(lastrace, BT_HUMANOID);
@ -12427,7 +12503,7 @@ void initrace(void) {
addflag(lastrace->flags, F_MORALE, 30, NA, NA, NULL); addflag(lastrace->flags, F_MORALE, 30, NA, NA, NULL);
addflag(lastrace->flags, F_EATCONFER, F_DTRESIST, DT_COLD, NA, "15"); addflag(lastrace->flags, F_EATCONFER, F_DTRESIST, DT_COLD, NA, "15");
addrace(R_GHAST, "ghast", 50, 'Z', C_MAGENTA, MT_FLESH, RC_UNDEAD, "A more slender and ghost-like form of ghoul. Ghasts are cunning and deadly, and possess a paralyzing touch."); addrace(R_GHAST, "ghast", 50, 'Z', C_BOLDGREEN, MT_FLESH, RC_UNDEAD, "A more slender and ghost-like form of ghoul. Ghasts are cunning and deadly, and possess a paralyzing touch.");
setbodytype(lastrace, BT_HUMANOID); setbodytype(lastrace, BT_HUMANOID);
setbodypartname(lastrace, BP_HANDS, "claws"); setbodypartname(lastrace, BP_HANDS, "claws");
addflag(lastrace->flags, F_ALIGNMENT, AL_EVIL, NA, NA, NULL); addflag(lastrace->flags, F_ALIGNMENT, AL_EVIL, NA, NA, NULL);

Binary file not shown.

57
defs.h
View File

@ -346,6 +346,7 @@ enum SHOPACTION {
#define DATADIR "data" #define DATADIR "data"
#define SAVEDIR "data" #define SAVEDIR "data"
#define VAULTDIR "data/vaults" #define VAULTDIR "data/vaults"
#define BONESDIR "data/bones"
// rank, score, name, job, killer // rank, score, name, job, killer
#define HISCOREFORMAT "%-4s%-7s%-10s%-23s" #define HISCOREFORMAT "%-4s%-7s%-10s%-23s"
@ -856,6 +857,7 @@ enum DAMTYPE {
enum OBCLASS { enum OBCLASS {
OC_NONE, OC_NONE,
OC_ABILITY, OC_ABILITY,
OC_AMULET,
OC_ARMOUR, OC_ARMOUR,
OC_BOOK, OC_BOOK,
OC_BUILDING, OC_BUILDING,
@ -1876,6 +1878,19 @@ enum OBTYPE {
OT_SHIELDHIDE, OT_SHIELDHIDE,
OT_SHIELDLARGE, OT_SHIELDLARGE,
OT_SHIELDTOWER, OT_SHIELDTOWER,
// amulets
OT_AMU_ANGER,
OT_AMU_CHEF,
OT_AMU_ESCAPE,
OT_AMU_FALLING,
OT_AMU_FLIGHT,
OT_AMU_LISTEN,
OT_AMU_SLEEP,
OT_AMU_SPELLBOOST,
OT_AMU_THIEF,
OT_AMU_VICTIM,
OT_AMU_VSMAGIC,
OT_AMU_VSPOISON,
// rings // rings
OT_RING_ENDURANCE, OT_RING_ENDURANCE,
OT_RING_GREED, OT_RING_GREED,
@ -1894,7 +1909,7 @@ enum OBTYPE {
OT_RING_MANA, OT_RING_MANA,
OT_RING_MEDITATION, OT_RING_MEDITATION,
OT_RING_MIRACLES, OT_RING_MIRACLES,
OT_RING_MPBOOST, OT_RING_SPELLBOOST,
OT_RING_MPREGEN, OT_RING_MPREGEN,
OT_RING_NOINJURY, OT_RING_NOINJURY,
OT_RING_PROTFIRE, OT_RING_PROTFIRE,
@ -2039,21 +2054,22 @@ enum BODYPART {
BP_EARS = 2, BP_EARS = 2,
BP_EYES = 3, BP_EYES = 3,
BP_HEAD = 4, // <- core bodypart BP_HEAD = 4, // <- core bodypart
BP_SHOULDERS = 5, BP_NECK = 5,
BP_BODY = 6, // <- core bodypart BP_SHOULDERS = 6,
BP_HANDS = 7, // <- core bodypart BP_BODY = 7, // <- core bodypart
BP_WAIST = 8, BP_HANDS = 8, // <- core bodypart
BP_LEGS = 9, // <- core bodypart BP_WAIST = 9,
BP_FEET = 10, BP_LEGS = 10, // <- core bodypart
BP_RIGHTFINGER = 11, BP_FEET = 11,
BP_LEFTFINGER = 12, BP_RIGHTFINGER = 12,
BP_LEFTFINGER = 13,
// others... // others...
BP_BACKLEGS = 13, BP_BACKLEGS = 14,
BP_FRONTLEGS = 14, BP_FRONTLEGS = 15,
BP_WINGS = 15, // <- core bodypart BP_WINGS = 16, // <- core bodypart
BP_TAIL = 16, // <- core bodypart BP_TAIL = 17, // <- core bodypart
}; };
#define MAXBODYPARTS (17) #define MAXBODYPARTS (18)
// depth on a human // depth on a human
@ -2983,7 +2999,8 @@ enum FLAG {
F_SACRIFICEOBCLASS, // v0 = can sacrifice obclass v0 to this god F_SACRIFICEOBCLASS, // v0 = can sacrifice obclass v0 to this god
F_SACRIFICEOBBLESSED, // v0 = can sacrifice obs with ->blessed=v0 and blessknown! F_SACRIFICEOBBLESSED, // v0 = can sacrifice obs with ->blessed=v0 and blessknown!
F_NAME, // text = lf's name F_NAME, // text = lf's name. ie. lfname = "Fred"
F_NAMED, // text = lf's name. ie. lfname = "xat named Fred"
F_XPMOD, // add/subtract this much from calculated xpval F_XPMOD, // add/subtract this much from calculated xpval
F_BLOODOB, // text = type of object to drop for blood F_BLOODOB, // text = type of object to drop for blood
F_UNSUMMONOB, // text = type of object to drop when this creature F_UNSUMMONOB, // text = type of object to drop when this creature
@ -3029,9 +3046,6 @@ enum FLAG {
F_POISONCORPSE, // lf's corpse will be poisonous F_POISONCORPSE, // lf's corpse will be poisonous
F_AUTOCREATEOB, // produces obtype 'text' wherever it walks, v0=radius F_AUTOCREATEOB, // produces obtype 'text' wherever it walks, v0=radius
// (only if ob of that type not already there) // (only if ob of that type not already there)
F_PACKATTACK, // deal v0 extra damage of type v1 if there are
// v2 or more monsters of the same baseid
// next to the attacker
F_PHALANX, // gain v0 AR if v2 or more adj monsters matching f->text F_PHALANX, // gain v0 AR if v2 or more adj monsters matching f->text
F_MORALE, // gain +v0 in morale checks. F_MORALE, // gain +v0 in morale checks.
F_SPOTTED, // you have spotted hiding lf id v0. you lsoe this if they F_SPOTTED, // you have spotted hiding lf id v0. you lsoe this if they
@ -3121,6 +3135,8 @@ enum FLAG {
F_FASTACTMOVE, // modifier for action and move speed F_FASTACTMOVE, // modifier for action and move speed
F_POISONED, // has poisoning. v0 = poison type, F_POISONED, // has poisoning. v0 = poison type,
// v1 = power // v1 = power
// v2 = if you ate a corpse, this records its race
// otherwise, NA.
// text = what from.eg'a bad egg' // text = what from.eg'a bad egg'
F_FREEZINGTOUCH,// next thing touched turns to ice! F_FREEZINGTOUCH,// next thing touched turns to ice!
// v1 = power // v1 = power
@ -3135,8 +3151,6 @@ enum FLAG {
F_INVISIBLE, // lifeform is invisible F_INVISIBLE, // lifeform is invisible
F_INVULNERABLE,// immune to most damage F_INVULNERABLE,// immune to most damage
// this can apply to objects too! // this can apply to objects too!
F_QUICKBITE, // deals v0 d d1 + d2 damage when you hit a bleeding victim
// (bypasses armour)
F_GRAVBOOSTED,// cannot walk or throw stuff F_GRAVBOOSTED,// cannot walk or throw stuff
F_GRAVLESSENED,// knockback maeks you go further, can jump further F_GRAVLESSENED,// knockback maeks you go further, can jump further
// your current load is reduce by v0 * 15kg. // your current load is reduce by v0 * 15kg.
@ -4250,9 +4264,12 @@ typedef struct brand_s {
struct brand_s *next, *prev; struct brand_s *next, *prev;
} brand_t; } brand_t;
#define MAXOMPREFIXES 20
typedef struct obmod_s { typedef struct obmod_s {
enum OBMOD id; enum OBMOD id;
char *prefix; char *prefix;
char *altprefix[MAXOMPREFIXES];
int naltprefix;
flagpile_t *flags; flagpile_t *flags;
struct obmod_s *next, *prev; struct obmod_s *next, *prev;
} obmod_t; } obmod_t;

View File

@ -6,3 +6,7 @@ in lf.c:
update getbodypartname update getbodypartname
update getbodypartequipname update getbodypartequipname
update getbodyparthitchance update getbodyparthitchance
update canreachbp()
update bodyparts of BT_HUMANOID etc. to include it, if required.

9
flag.c
View File

@ -89,6 +89,15 @@ flag_t *addflag_real(flagpile_t *fp, enum FLAG id, int val1, int val2, int val3,
val3 = RR_COMMON; val3 = RR_COMMON;
} }
// special case which lets us confer f_canwill. (with conferred flags, we can't
// supply val[2]).
if (id == F_CANWILL) {
if ((val3 == NA) && (val2 > 0)) {
val2 = val3;
}
}
// auto-increment order for EXTRADESC flag // auto-increment order for EXTRADESC flag
if ((id == F_EXTRADESC) && (val1 == NA)) { if ((id == F_EXTRADESC) && (val1 == NA)) {
flag_t *retflag[MAXCANDIDATES]; flag_t *retflag[MAXCANDIDATES];

50
god.c
View File

@ -1681,6 +1681,7 @@ int prayto(lifeform_t *lf, lifeform_t *god) {
int piety,i,x,y; int piety,i,x,y;
char assisttext[BUFLEN]; char assisttext[BUFLEN];
enum PIETYLEV plev; enum PIETYLEV plev;
int newgod;
taketime(lf, getactspeed(lf)); taketime(lf, getactspeed(lf));
@ -1703,6 +1704,7 @@ int prayto(lifeform_t *lf, lifeform_t *god) {
// ie. player is expected to follow the god's rules. // ie. player is expected to follow the god's rules.
if (!hasflag(god->flags, F_PRAYEDTO)) { if (!hasflag(god->flags, F_PRAYEDTO)) {
addflag(god->flags, F_PRAYEDTO, B_TRUE, NA, NA, NULL); addflag(god->flags, F_PRAYEDTO, B_TRUE, NA, NA, NULL);
newgod = B_TRUE;
} }
if (godisangry(god->race->id)) { if (godisangry(god->race->id)) {
@ -2127,6 +2129,22 @@ int prayto(lifeform_t *lf, lifeform_t *god) {
object_t *possob[MAXPILEOBS]; object_t *possob[MAXPILEOBS];
int npossob,i,first; int npossob,i,first;
object_t *o; object_t *o;
// unlock doors
first = B_TRUE;
for (i = 0; i < player->nlos; i++) {
cell_t *c;
object_t *o;
c = player->los[i];
for (o = c->obpile->first ; o ; o = o->next) {
if (killflagsofid(o->flags, F_LOCKED) || killflagsofid(o->flags, F_SECRET)) {
if (first) {
msg("\"Access granted!\"");
first = B_FALSE;
}
noise(c, NULL, NC_OTHER, SV_TALK, "the click of a lock.", NULL);
}
}
}
// uncurse one equipped ob // uncurse one equipped ob
if (uncurse_one_equipped(lf, "\"Curses, schmurses!\"")){ if (uncurse_one_equipped(lf, "\"Curses, schmurses!\"")){
@ -2140,24 +2158,6 @@ int prayto(lifeform_t *lf, lifeform_t *god) {
msg("\"Allow me to reveal your surroundings...\""); msg("\"Allow me to reveal your surroundings...\"");
dospelleffects(god, OT_S_MAPPING, 5, lf, NULL, lf->cell, B_UNCURSED, NULL, B_TRUE); dospelleffects(god, OT_S_MAPPING, 5, lf, NULL, lf->cell, B_UNCURSED, NULL, B_TRUE);
dospelleffects(god, OT_S_REVEALHIDDEN, 10, lf, NULL, lf->cell, B_UNCURSED, NULL, B_TRUE); dospelleffects(god, OT_S_REVEALHIDDEN, 10, lf, NULL, lf->cell, B_UNCURSED, NULL, B_TRUE);
// unlock doors
first = B_TRUE;
for (i = 0; i < player->nlos; i++) {
cell_t *c;
object_t *o;
c = player->los[i];
if (c != player->cell) {
o = hascloseddoor(c);
if (o && hasflag(o->flags, F_LOCKED)) {
if (first) {
msg("\"Access granted!\"");
first = B_FALSE;
}
killflagsofid(o->flags, F_LOCKED);
noise(c, NULL, NC_OTHER, SV_TALK, "the click of a lock.", NULL);
}
}
}
break; break;
case 2: // identify objects case 2: // identify objects
npossob = 0; npossob = 0;
@ -2411,6 +2411,20 @@ int prayto(lifeform_t *lf, lifeform_t *god) {
break; break;
} }
// new god effects
if (newgod) {
switch (god->race->id) {
case R_GODTHIEVES:
makelearnable(lf, SK_THIEVERY);
makelearnable(lf, SK_LOCKPICKING);
break;
default:
break;
}
}
if (god->race->id == R_GODNATURE) { if (god->race->id == R_GODNATURE) {
addob(lf->cell->obpile, "flower"); addob(lf->cell->obpile, "flower");
if (haslos(player, lf->cell)) { if (haslos(player, lf->cell)) {

2
io.c
View File

@ -7013,10 +7013,8 @@ char *makedesc_race(enum RACE rid, char *retbuf, int showextra, int forplayersel
case F_MEDITATES: if (lorelev >= PR_ADEPT) sprintf(buf, "Meditates to retain awareness while sleeping."); break; case F_MEDITATES: if (lorelev >= PR_ADEPT) sprintf(buf, "Meditates to retain awareness while sleeping."); break;
case F_MPMOD: if (f->val[0] > 0) sprintf(buf, "+%d Mana", f->val[0]); break; case F_MPMOD: if (f->val[0] > 0) sprintf(buf, "+%d Mana", f->val[0]); break;
case F_NOSLEEP: if (lorelev >= PR_BEGINNER) sprintf(buf, "Does not sleep"); break; case F_NOSLEEP: if (lorelev >= PR_BEGINNER) sprintf(buf, "Does not sleep"); break;
case F_PACKATTACK: if (lorelev >= PR_ADEPT) sprintf(buf, "Deals extra damage when in a pack."); break;
case F_PHALANX: if (lorelev >= PR_ADEPT) sprintf(buf, "Gains extra defence when in a pack."); break; case F_PHALANX: if (lorelev >= PR_ADEPT) sprintf(buf, "Gains extra defence when in a pack."); break;
case F_PHOTOMEM: sprintf(buf, "Photographic memory"); break; case F_PHOTOMEM: sprintf(buf, "Photographic memory"); break;
case F_QUICKBITE: if (lorelev >= PR_ADEPT) sprintf(buf, "Can bite wounded enemies for extra damage"); break;
case F_REGENERATES: if (lorelev >= PR_BEGINNER) sprintf(buf, "Automatically regenerates health."); break; case F_REGENERATES: if (lorelev >= PR_BEGINNER) sprintf(buf, "Automatically regenerates health."); break;
case F_RESISTMAG: if (lorelev >= PR_BEGINNER) sprintf(buf, "Magic-resistant"); break; case F_RESISTMAG: if (lorelev >= PR_BEGINNER) sprintf(buf, "Magic-resistant"); break;
case F_SEEINDARK: if (lorelev >= PR_BEGINNER) sprintf(buf, "Darkvision (range %d)", f->val[0]); break; case F_SEEINDARK: if (lorelev >= PR_BEGINNER) sprintf(buf, "Darkvision (range %d)", f->val[0]); break;

437
lf.c
View File

@ -16,6 +16,7 @@
#include "move.h" #include "move.h"
#include "nexus.h" #include "nexus.h"
#include "objects.h" #include "objects.h"
#include "save.h"
#include "shops.h" #include "shops.h"
#include "spell.h" #include "spell.h"
#include "text.h" #include "text.h"
@ -732,8 +733,11 @@ int candrink(lifeform_t *lf, object_t *o) {
// if false, returns why you can't eat it in 'reason' // if false, returns why you can't eat it in 'reason'
int caneat(lifeform_t *lf, object_t *o) { int caneat(lifeform_t *lf, object_t *o) {
// undead won't eat // undead will only eat fleshy corpses
if (getraceclass(lf) == RC_UNDEAD) { if (getraceclass(lf) == RC_UNDEAD) {
if (hasflag(o->flags, F_CORPSEOF) && (o->material->id == MT_FLESH)) {
return B_TRUE;
}
reason = E_UNDEAD; reason = E_UNDEAD;
return B_FALSE; return B_FALSE;
} }
@ -761,15 +765,17 @@ int caneat(lifeform_t *lf, object_t *o) {
if (f) { if (f) {
race_t *r; race_t *r;
r = findrace(f->val[0]); r = findrace(f->val[0]);
// same race? // same race? let the player do so.
if ((r->id == lf->race->id) || (r->baseid == lf->race->baseid)) { if (!isplayer(lf)) {
enum RACECLASS rc; if ((r->id == lf->race->id) || (r->baseid == lf->race->baseid)) {
rc = getraceclass(lf); enum RACECLASS rc;
// race which doens't eat its own? rc = getraceclass(lf);
if ((rc == RC_ANIMAL) || (rc == RC_HUMANOID)) { // race which doens't eat its own?
// no cannibulism! if ((rc == RC_ANIMAL) || (rc == RC_HUMANOID)) {
reason = E_NOCANNIBUL; // no cannibulism!
return B_FALSE; reason = E_NOCANNIBUL;
return B_FALSE;
}
} }
} }
} }
@ -1109,6 +1115,7 @@ int canreachbp(lifeform_t *lf, lifeform_t *victim, enum BODYPART bp) {
case BP_EYES: case BP_EYES:
case BP_HEAD: case BP_HEAD:
case BP_EARS: case BP_EARS:
case BP_NECK:
case BP_SHOULDERS: case BP_SHOULDERS:
if (howmuchsmaller >= 1) { if (howmuchsmaller >= 1) {
return B_FALSE; return B_FALSE;
@ -2473,7 +2480,6 @@ void die(lifeform_t *lf) {
char buf[BUFLEN]; char buf[BUFLEN];
flag_t *f; flag_t *f;
int killedgod = B_FALSE; int killedgod = B_FALSE;
cell_t *where;
//int dropobs = B_TRUE; //int dropobs = B_TRUE;
int vaporised = B_FALSE, i; int vaporised = B_FALSE, i;
int dropobs = B_TRUE; int dropobs = B_TRUE;
@ -2483,6 +2489,17 @@ void die(lifeform_t *lf) {
int nretflags; int nretflags;
cell_t *corpsecell; cell_t *corpsecell;
lifeform_t *killer = NULL; lifeform_t *killer = NULL;
int dobonesfile = B_FALSE;
char reanimateas[BUFLEN];
cell_t *where;
int thisisplayer = B_FALSE;
strcpy(reanimateas, "");
where = lf->cell;
thisisplayer = isplayer(lf);
if (lf->lastdamlf != -1) { if (lf->lastdamlf != -1) {
killer = findlf(lf->cell->map, lf->lastdamlf); killer = findlf(lf->cell->map, lf->lastdamlf);
@ -2497,7 +2514,7 @@ void die(lifeform_t *lf) {
} }
// died after entering a new level without a chance to move? // died after entering a new level without a chance to move?
if (isplayer(lf) && lfhasflag(lf, F_JUSTENTERED) && godprayedto(R_GODMERCY)) { if (thisisplayer && lfhasflag(lf, F_JUSTENTERED) && godprayedto(R_GODMERCY)) {
godsay(R_GODMERCY, B_TRUE, "Well, that seems unfair..."); more(); godsay(R_GODMERCY, B_TRUE, "Well, that seems unfair..."); more();
// return to full health // return to full health
lf->hp = lf->maxhp; lf->hp = lf->maxhp;
@ -2520,7 +2537,7 @@ void die(lifeform_t *lf) {
} }
// put out fires // put out fires
extinguishlf(lf); extinguishlf(lf);
if (isplayer(lf)) { if (thisisplayer) {
statdirty = B_TRUE; statdirty = B_TRUE;
} }
return; return;
@ -2542,7 +2559,7 @@ void die(lifeform_t *lf) {
} }
if (!willbecomeghost) { if (!willbecomeghost) {
if (isplayer(lf) && hasjob(lf, J_GOD)) { if (thisisplayer && hasjob(lf, J_GOD)) {
char ch; char ch;
msg("^BYou are about to die..."); more(); msg("^BYou are about to die..."); more();
ch = askchar("Die", "yn", "n", B_TRUE, B_FALSE); ch = askchar("Die", "yn", "n", B_TRUE, B_FALSE);
@ -2566,7 +2583,7 @@ void die(lifeform_t *lf) {
// convert into a gas cloud! // convert into a gas cloud!
dospelleffects(NULL, OT_S_GASEOUSFORM, 10, lf, NULL, lf->cell, B_UNCURSED, NULL, B_TRUE); dospelleffects(NULL, OT_S_GASEOUSFORM, 10, lf, NULL, lf->cell, B_UNCURSED, NULL, B_TRUE);
// ai will now look for our coffin // ai will now look for our coffin
if (isplayer(lf)) { if (thisisplayer) {
msg("^GYou feel the presence of a nearby coffin..."); msg("^GYou feel the presence of a nearby coffin...");
} else { } else {
addflag(lf->flags, F_WANTS, OT_COFFIN, B_COVETS, NA, NULL); addflag(lf->flags, F_WANTS, OT_COFFIN, B_COVETS, NA, NULL);
@ -2596,7 +2613,7 @@ void die(lifeform_t *lf) {
lf->maxhp = ratio * lf->maxhp; lf->maxhp = ratio * lf->maxhp;
limit(&(lf->hp), 1, lf->maxhp); limit(&(lf->hp), 1, lf->maxhp);
} }
if (isplayer(lf)) statdirty = B_TRUE; if (thisisplayer) statdirty = B_TRUE;
/* /*
// ... but you're still dead // ... but you're still dead
lf->hp = 0; lf->hp = 0;
@ -2609,7 +2626,7 @@ void die(lifeform_t *lf) {
lf->alive = B_FALSE; lf->alive = B_FALSE;
} }
if (isplayer(lf)) { if (thisisplayer) {
lifeform_t *god; lifeform_t *god;
// force screen redraw so you see your hp = 0 // force screen redraw so you see your hp = 0
drawscreen(); drawscreen();
@ -2631,8 +2648,8 @@ void die(lifeform_t *lf) {
godsay(god->race->id, B_TRUE, "Rest in peace, brave warrior."); more(); godsay(god->race->id, B_TRUE, "Rest in peace, brave warrior."); more();
break; break;
case R_GODDEATH: case R_GODDEATH:
godsay(god->race->id, B_TRUE, "Come to me, my servant..."); more(); godsay(god->race->id, B_TRUE, "Arise, my servant..."); more(); break;
msg("Bony claws rise up and drag your corpse underground."); more(); break; // you will rise as a monster.
case R_GODLIFE: case R_GODLIFE:
msg("Your spirit ascends to the heavens."); more(); break; msg("Your spirit ascends to the heavens."); more(); break;
case R_GODTHIEVES: // lose all gold / gems case R_GODTHIEVES: // lose all gold / gems
@ -2771,7 +2788,7 @@ void die(lifeform_t *lf) {
} }
// drop/kill all objects // drop/kill all objects
if (corpsecell && (willbecomeghost || !isplayer(lf))) { if (corpsecell && (willbecomeghost || !thisisplayer)) {
while (lf->pack->first) { while (lf->pack->first) {
if (vaporised || !dropobs) { if (vaporised || !dropobs) {
killob(lf->pack->first); killob(lf->pack->first);
@ -2913,6 +2930,25 @@ void die(lifeform_t *lf) {
changeflagtext(f, lf->lastdam); changeflagtext(f, lf->lastdam);
} }
} }
// For bones files:
if (thisisplayer) {
char pname[BUFLEN];
getplayername(pname);
addflag(corpse->flags, F_NAMED, NA, NA, NA, pname);
if (streq(lf->killverb, "Eaten")) {
// this will cause the player's corpse description
// to show up as "partially eaten". used for
// bones files.
f = hasflag(corpse->flags, F_EDIBLE);
if (f) {
f->val[2] = f->val[1] / 2;
}
}
}
if (hasflag(corpse->flags, F_HEADLESS)) { if (hasflag(corpse->flags, F_HEADLESS)) {
object_t *headob; object_t *headob;
char headname[BUFLEN]; char headname[BUFLEN];
@ -2955,7 +2991,7 @@ void die(lifeform_t *lf) {
} // end if corpsecell } // end if corpsecell
// player killed last monster? // player killed last monster?
if (killer && isplayer(killer) && !isplayer(lf)) { if (killer && isplayer(killer) && !thisisplayer) {
lifeform_t *l; lifeform_t *l;
int battledone = B_TRUE; int battledone = B_TRUE;
for (l = lf->cell->map->lf ; l ; l = l->next) { for (l = lf->cell->map->lf ; l ; l = l->next) {
@ -2990,14 +3026,138 @@ void die(lifeform_t *lf) {
addflag(lf->flags, F_MYCORPSE, NA, NA, NA, cid); addflag(lf->flags, F_MYCORPSE, NA, NA, NA, cid);
} }
} else { } else {
where = lf->cell; // Will the dead lf get reanimated up as a monster ?
if (lf->controller != C_PLAYER) { //
// kill lifeform if (!vaporised) {
flag_t *retflag[MAXCANDIDATES];
int nretflags,i;
// killed by a vampire = vampire.
if (killer) {
switch (killer->race->id) {
case R_VAMPIRE: sprintf(reanimateas, "vampire"); break;
default: break;
}
}
// died by eating your own race = ghoul.
// died by eating a vampire corpse = vampire.
if (!strlen(reanimateas)) {
getflags(lf->flags, retflag, &nretflags, F_POISONED, F_NONE);
for (i = 0; i < nretflags; i++) {
if (retflag[i]->val[2] == R_VAMPIRE) {
sprintf(reanimateas, "vampire");
} else if (retflag[i]->val[2] == lf->race->baseid) {
sprintf(reanimateas, "ghoul");
}
}
}
// hecta-worshippers get reanimated.
if (!strlen(reanimateas) && thisisplayer && godprayedto(R_GODDEATH)) {
switch (rnd(1,2)) {
case 1:
sprintf(reanimateas, "zombie");
break;
case 2:
sprintf(reanimateas, "skeleton");
break;
}
}
// announce
if (strlen(reanimateas)) {
if (thisisplayer || cansee(player, lf)) {
char lfname[BUFLEN];
getlfname(lf, lfname);
msg("^%c%s%s corpse rises up as %s %s!^n",
C_MAGENTA,
lfname, getpossessive(lfname),
needan(reanimateas) ? "an" : "a", reanimateas);
}
}
}
// now kill the lifeform.
//if (lf->controller != C_PLAYER) {
if (!thisisplayer) {
// actually kill the lifeform
killlf(lf); killlf(lf);
assert(where->lf == NULL); assert(where->lf == NULL);
} }
} }
// IMPORTANT: DO NOT REFERENCE lf->xxxx AFTER THIS POINT
// UNLESS WE ARE _SURE_ IT IS THE PLAYER (ie. thisisplayer = true)
// Note that if we reanimate, the new monster will appear in an
// ADJACENT cell. this solves the problem that we can't actually
// kill() the player's lf because we need to see their objects to
// show their final possessions.
if (strlen(reanimateas)) {
cell_t *c = NULL;
// announce, then add on " named playername", if required.
if (lf && isplayer(lf)) {
char pname[BUFLEN];
getplayername(pname);
strcat(reanimateas, " named ");
strcat(reanimateas, pname);
}
if (where->lf) {
c = getrandomadjcell(where, WE_WALKABLE, B_ALLOWEXPAND);
} else {
c = where;
}
if (c) {
// remove the corpse...
if (corpse) killob(corpse);
// add the reanimated monster
addmonster(c, R_SPECIFIED, reanimateas, B_FALSE, 1, B_FALSE, NULL);
}
}
// Write out a bones file? A bones file might be written if:
// - the player died in a ROOM.
// AND
// - the player died in a major dungeon branch, which wasn't the realm of gods
if (thisisplayer && (where->room) &&
(where->map->region->rtype->majorbranch) &&
(where->map->region->rtype->id != RG_HEAVEN)) {
// If all of the above are true, the below will trigger a bones file:
// Player reanimating as some kind of monster
// Being killed by stoning
// Random chance
//
if (strlen(reanimateas)) {
dobonesfile = B_TRUE;
} else if (corpse && (corpse->type->id == OT_STATUE)) {
dobonesfile = B_TRUE;
} else if (onein(4)) {
dobonesfile = B_TRUE;
}
if (hasjob(lf, J_GOD)) {
char ch;
char ques[BUFLEN];
sprintf(ques, "Bones file dump = %s. Override?", dobonesfile ? "true" : "false");
ch = askchar(ques, "yn", "n", B_TRUE, B_FALSE);
if (ch == 'y') {
ch = askchar("Dump bones file?", "yn", "n", B_TRUE, B_FALSE);
if (ch == 'y') {
dobonesfile = B_TRUE;
} else {
dobonesfile = B_FALSE;
}
}
}
}
if (dobonesfile) {
savebones(where->map, where->room);
}
if (needredraw) { if (needredraw) {
drawscreen(); drawscreen();
} }
@ -3502,6 +3662,9 @@ int eat(lifeform_t *lf, object_t *o) {
enum HUNGER hlev,posthlev; enum HUNGER hlev,posthlev;
int stopeating = B_FALSE; int stopeating = B_FALSE;
int rawmeat = B_FALSE; int rawmeat = B_FALSE;
race_t *corpserace = NULL;
flag_t *cf;
if (lfhasflag(lf, F_RAGE)) { if (lfhasflag(lf, F_RAGE)) {
if (isplayer(lf)) msg("You are too enraged to eat!"); if (isplayer(lf)) msg("You are too enraged to eat!");
@ -3560,6 +3723,13 @@ int eat(lifeform_t *lf, object_t *o) {
getobname(o, obname, 1); getobname(o, obname, 1);
getlfname(lf, lfname); getlfname(lf, lfname);
// is this a corpse?
cf = hasflag(o->flags, F_CORPSEOF);
if (cf) {
corpserace = findrace(cf->val[0]);
}
// get total nutrition // get total nutrition
nutrition = getnutrition(o); nutrition = getnutrition(o);
@ -3593,10 +3763,10 @@ int eat(lifeform_t *lf, object_t *o) {
// uncooked meat? // uncooked meat?
if (iscorpse(o) && isplayer(lf)) { if (iscorpse(o) && isplayer(lf)) {
int ch;
char ques[BUFLEN];
if (!hasflag(o->flags, F_PREPARED) && !lfhasflag(lf, F_CANEATRAW)) { if (!hasflag(o->flags, F_PREPARED) && !lfhasflag(lf, F_CANEATRAW)) {
if (!lfhasflag(lf, F_EATING) && getskill(lf, SK_COOKING)) { if (!lfhasflag(lf, F_EATING) && getskill(lf, SK_COOKING)) {
int ch;
char ques[BUFLEN];
more(); more();
sprintf(ques,"Really eat %s raw?",obname); sprintf(ques,"Really eat %s raw?",obname);
ch = askchar(ques,"yn","y", B_TRUE, B_FALSE); ch = askchar(ques,"yn","y", B_TRUE, B_FALSE);
@ -3608,6 +3778,18 @@ int eat(lifeform_t *lf, object_t *o) {
if (nutrition > (HUNGERCONST/3)) nutrition = (HUNGERCONST/3); if (nutrition > (HUNGERCONST/3)) nutrition = (HUNGERCONST/3);
rawmeat = B_TRUE; rawmeat = B_TRUE;
} }
// cannibulism ?
if (corpserace->id == lf->race->baseid) {
if (getattrbracket(getattr(lf, A_WIS), A_WIS, NULL) >= AT_AVERAGE) {
more();
sprintf(ques,"Really eat your own race?");
ch = askchar(ques,"yn","y", B_TRUE, B_FALSE);
if (ch != 'y') {
return B_TRUE;
}
}
}
} }
if (touch(lf, o)) { if (touch(lf, o)) {
@ -3705,6 +3887,8 @@ int eat(lifeform_t *lf, object_t *o) {
if (isrotting(o)) { if (isrotting(o)) {
char dambuf[BUFLEN]; char dambuf[BUFLEN];
enum POISONTYPE ptid; enum POISONTYPE ptid;
int ppower = 1;
// lose hp // lose hp
if (isplayer(lf)) { if (isplayer(lf)) {
msg("^BThat %s was bad!", drinking ? "liquid" : "food"); msg("^BThat %s was bad!", drinking ? "liquid" : "food");
@ -3720,41 +3904,42 @@ int eat(lifeform_t *lf, object_t *o) {
} else { } else {
ptid = P_FOOD; ptid = P_FOOD;
} }
poison(lf, rnd(20,40), ptid, 1, dambuf); // cannibulism ?
if (corpserace->id == lf->race->baseid) {
ppower = 3;
}
poison(lf, rnd(20,40), ptid, ppower, dambuf, cf ? cf->val[0] : R_NONE);
} else if (!drinking) { } else if (!drinking) {
char dambuf[BUFLEN];
snprintf(dambuf, BUFLEN, "a bad %s",noprefix(obname));
// raw meat? // raw meat?
if (israwmeat(o) && !lfhasflag(lf, F_CANEATRAW)) { if (corpserace && israwmeat(o) && !lfhasflag(lf, F_CANEATRAW)) {
flag_t *cf; int checkdiff;
race_t *corpserace = NULL; enum POISONTYPE ptid;
cf = hasflag(o->flags, F_CORPSEOF); int timemin,timemax;
if (cf) { int ppower = 1;
corpserace = findrace(cf->val[0]); char dambuf[BUFLEN];
} snprintf(dambuf, BUFLEN, "a bad %s",noprefix(obname));
if (corpserace) { if (hasflag(corpserace->flags, F_AVIAN)) {
int checkdiff; checkdiff = 30;
enum POISONTYPE ptid; ptid = P_FOODBAD;
int timemin,timemax; timemin = 30;
if (hasflag(corpserace->flags, F_AVIAN)) { timemax = 50;
checkdiff = 30; } else {
ptid = P_FOODBAD; checkdiff = 20;
timemin = 30; if (onein(3)) {
timemax = 50; ptid = P_FOOD;
} else { } else {
checkdiff = 20; ptid = P_MIGRAINE;
if (onein(3)) {
ptid = P_FOOD;
} else {
ptid = P_MIGRAINE;
}
timemin = 20;
timemax = 40;
}
if (!skillcheck(lf, SC_POISON, checkdiff, 0)) {
poison(lf, rnd(timemin,timemax), ptid, 1, dambuf);
} }
timemin = 20;
timemax = 40;
}
// cannibulism ?
if (corpserace->id == lf->race->baseid) {
ppower = 3;
}
if (!skillcheck(lf, SC_POISON, checkdiff, 0)) {
poison(lf, rnd(timemin,timemax), ptid, ppower, dambuf, corpserace ? corpserace->id : R_NONE);
} }
} }
} }
@ -3873,7 +4058,7 @@ int eat(lifeform_t *lf, object_t *o) {
addtempflag(lf->flags, F_SEEINDARK, 3, NA, NA, NULL, rnd(20,40)); addtempflag(lf->flags, F_SEEINDARK, 3, NA, NA, NULL, rnd(20,40));
} else if (o->type->id == OT_POISONSAC) { } else if (o->type->id == OT_POISONSAC) {
// very bad! // very bad!
poison(lf, rnd(10,20), P_VENOM, 4, "eating a venom sac"); poison(lf, rnd(10,20), P_VENOM, 4, "eating a venom sac", R_NONE);
} }
if (isplayer(lf)) makeknown(o->type->id); if (isplayer(lf)) makeknown(o->type->id);
@ -3899,6 +4084,18 @@ int eat(lifeform_t *lf, object_t *o) {
if (o->pile->owner != lf) { if (o->pile->owner != lf) {
amt += SPEED_PICKUP; amt += SPEED_PICKUP;
} }
// humanoids can use knives and forks to eat faster.
if (getraceclass(lf) == RC_HUMANOID) {
int pct = 100;
if (hasob(lf->pack, OT_FORK)) {
pct -= 25;
}
if (hasob(lf->pack, OT_KNIFE) || hasob(lf->pack, OT_STEAKKNIFE)) {
pct -= 25;
}
amt = pctof(pct, amt);
}
limit(&amt, SP_ULTRAFAST, NA);
taketime(lf, amt); taketime(lf, amt);
// special cases even if not fully eaten // special cases even if not fully eaten
@ -3918,12 +4115,19 @@ int eat(lifeform_t *lf, object_t *o) {
} }
// god effects
if (isplayer(lf)) {
// eating your pet is very bad! // eating your pet is very bad!
if (isplayer(lf) && hasflagval(o->flags, F_PETOF, player->id, NA, NA, NULL)) { if (hasflagval(o->flags, F_PETOF, player->id, NA, NA, NULL)) {
angergodmaybe(R_GODPURITY, 150, GA_EAT); angergodmaybe(R_GODPURITY, 150, GA_EAT);
stopeating = B_TRUE; stopeating = B_TRUE;
}
// cannibulism ?
if (corpserace && (corpserace->id == lf->race->baseid)) {
angergodmaybe(R_GODPURITY, 150, GA_EAT);
angergodmaybe(R_GODNATURE, 100, GA_EAT);
stopeating = B_TRUE;
}
} }
if (lfhasflagval(lf, F_FATALFOOD, o->type->id, NA, NA, NULL)) { if (lfhasflagval(lf, F_FATALFOOD, o->type->id, NA, NA, NULL)) {
@ -6400,6 +6604,7 @@ int getbodyparthitchance(enum BODYPART bp) {
case BP_EARS: case BP_EARS:
case BP_RIGHTFINGER: case BP_RIGHTFINGER:
case BP_LEFTFINGER: case BP_LEFTFINGER:
case BP_NECK:
break; break;
} }
return 0; // ie rings, ears, weapon return 0; // ie rings, ears, weapon
@ -6436,6 +6641,8 @@ char *getbodypartname(lifeform_t *lf, enum BODYPART bp) {
return "eyes"; return "eyes";
case BP_HEAD: case BP_HEAD:
return "head"; return "head";
case BP_NECK:
return "neck";
case BP_BODY: case BP_BODY:
return "body"; return "body";
case BP_SHOULDERS: case BP_SHOULDERS:
@ -6480,6 +6687,7 @@ char *getbodypartequipname(enum BODYPART bp) {
case BP_SHOULDERS: case BP_SHOULDERS:
return "over"; return "over";
case BP_WAIST: case BP_WAIST:
case BP_NECK:
return "around"; return "around";
} }
return "unknown"; return "unknown";
@ -7835,7 +8043,14 @@ char *real_getlfname(lifeform_t *lf, char *buf, int usevis, int showall) {
} else { } else {
strcpy(the, "the "); strcpy(the, "the ");
} }
strcpy(lname, lf->race->name); f = lfhasflag(lf, F_NAMED);
if (f) { // ie. "the xat named blah"
strcpy(lname, lf->race->name);
strcat(lname, " named ");
strcat(lname, f->text);
} else { // ie. "the xat"
strcpy(lname, lf->race->name);
}
} }
// construct description string // construct description string
@ -9598,7 +9813,7 @@ void giveobflags(lifeform_t *lf, object_t *o, enum FLAG whattype) {
} }
// if all conferred flags now known, object is known // if all conferred flags now known, object is known
if (flagsfound && (flagsknown == flagsfound)) { if (flagsfound && (flagsknown == flagsfound) && !isknown(o)) {
int willmakeknown = B_FALSE; int willmakeknown = B_FALSE;
if (isplayer(lf) || cansee(player, lf)) { if (isplayer(lf) || cansee(player, lf)) {
willmakeknown = B_TRUE; willmakeknown = B_TRUE;
@ -9610,6 +9825,11 @@ void giveobflags(lifeform_t *lf, object_t *o, enum FLAG whattype) {
if (hasflag(o->flags, F_IDWHENUSED)) { if (hasflag(o->flags, F_IDWHENUSED)) {
identify(o); identify(o);
} }
if (isplayer(lf)) {
char buf[BUFLEN];
getobname(o, buf, o->amt);
msgnocap("%s %s!", (o->amt == 1) ? "This is" : "These are", buf);
}
} }
} }
} }
@ -11593,6 +11813,9 @@ int isdeaf(lifeform_t *lf) {
if (lfhasflag(lf, F_DEAF)) return B_TRUE; if (lfhasflag(lf, F_DEAF)) return B_TRUE;
if (isresting(lf) && lfhasflag(lf, F_RESTINGINMOTEL)) return B_TRUE; if (isresting(lf) && lfhasflag(lf, F_RESTINGINMOTEL)) return B_TRUE;
if (lfhasflagval(lf, F_INJURY, IJ_EARSRINGING, NA, NA, NULL)) return B_TRUE; if (lfhasflagval(lf, F_INJURY, IJ_EARSRINGING, NA, NA, NULL)) return B_TRUE;
if (hasequippedobid(lf->pack, OT_AMU_SLEEP) && isasleep(lf)) return B_TRUE;
return B_FALSE; return B_FALSE;
} }
@ -13814,6 +14037,8 @@ int losehp_real(lifeform_t *lf, int amt, enum DAMTYPE damtype, lifeform_t *froml
setlastdam(lf, buf); setlastdam(lf, buf);
if (fromlf && willeatlf(fromlf, lf)) { if (fromlf && willeatlf(fromlf, lf)) {
// this string is special - die() checks for this to see whether
// to add "partially eaten" to the corpse.
setkillverb(lf, "Eaten"); setkillverb(lf, "Eaten");
} else { } else {
switch (damtype) { switch (damtype) {
@ -13853,7 +14078,7 @@ void losehpeffects(lifeform_t *lf, int dam, enum DAMTYPE damtype, lifeform_t *fr
} }
// catch a cold? // catch a cold?
if (!skillcheck(lf, SC_CON, (dam/2) + getexposedlimbs(lf), 0)) { if (!skillcheck(lf, SC_CON, (dam/2) + getexposedlimbs(lf), 0)) {
poison(lf, 20+(dam*3), P_COLD, 0, "the cold"); poison(lf, 20+(dam*3), P_COLD, 0, "the cold", fromlf ? fromlf->race->id : R_NONE);
} }
// cold will heal bruised limbs // cold will heal bruised limbs
getflags(lf->flags, retflag, &nretflags, F_INJURY, F_NONE); getflags(lf->flags, retflag, &nretflags, F_INJURY, F_NONE);
@ -13892,7 +14117,7 @@ void losehpeffects(lifeform_t *lf, int dam, enum DAMTYPE damtype, lifeform_t *fr
} else if (damtype == DT_POISONGAS) { } else if (damtype == DT_POISONGAS) {
if (dam > 0) { if (dam > 0) {
if (!skillcheck(lf, SC_POISON, 35, 0)) { // HARD. if (!skillcheck(lf, SC_POISON, 35, 0)) { // HARD.
poison(lf, rnd(20,40), P_GAS, 2, "poison gas"); poison(lf, rnd(20,40), P_GAS, 2, "poison gas", fromlf ? fromlf->race->id : R_NONE);
} }
} }
} }
@ -14045,6 +14270,38 @@ void makefriendly(lifeform_t *who, int howlong) {
} }
// make lf be able to learn the given skill
// returns TRUE if we did something.
int makelearnable(lifeform_t *lf, enum SKILL skid) {
flag_t *f,*learnable;
int changed = B_FALSE;
f = hasflagval(lf->flags, F_NOSKILL, skid[i], NA, NA, NULL);
if (f) {
killflag(f);
}
learnable = lfhasflagval(lf, F_CANLEARN, skid[i], NA, NA, NULL);
if (learnable) {
if (learnable->val[1] != NA) {
// able to learn thievery, but limitted
learnable->val[1] = NA;
changed = B_TRUE;
}
} else if (!getskill(lf, SK_THIEVERY)) {
// don't have the skill, not learnable
addflag(lf->flags, F_CANLEARN, skid[i], NA, NA, NULL);
changed = B_TRUE;
}
if (changed) {
if (isplayer(lf)) {
skill_t *sk;
sk = findskill(skid);
msg("^GYou are now capable of learning the %s skill.^n",sk->name);
}
return B_TRUE;
}
return B_FALSE;
}
int makenauseated(lifeform_t *lf, int amt, int howlong) { int makenauseated(lifeform_t *lf, int amt, int howlong) {
flag_t *f; flag_t *f;
@ -15055,14 +15312,17 @@ int pickup(lifeform_t *lf, object_t *what, int howmany, int fromground, int want
return B_FALSE; return B_FALSE;
} }
void poison(lifeform_t *lf, int howlong, enum POISONTYPE ptype, int power, char *fromwhat) { void poison(lifeform_t *lf, int howlong, enum POISONTYPE ptype, int power, char *fromwhat, enum RACE srcraceid) {
flag_t *f; flag_t *f;
int found = B_FALSE,i; int found = B_FALSE,i;
enum POISONSEVERITY psev; enum POISONSEVERITY psev;
flag_t *retflag[MAXCANDIDATES]; flag_t *retflag[MAXCANDIDATES];
int nretflags; int nretflags;
race_t *srcrace;
poisontype_t *pt; poisontype_t *pt;
pt = findpoisontype(ptype); pt = findpoisontype(ptype);
srcrace = findrace(srcraceid);
// are you immune to disease/poison? // are you immune to disease/poison?
psev = pt->severity; psev = pt->severity;
@ -15097,6 +15357,10 @@ void poison(lifeform_t *lf, int howlong, enum POISONTYPE ptype, int power, char
(f->lifetime > 0) ) { (f->lifetime > 0) ) {
// extend duration // extend duration
f->lifetime += howlong; f->lifetime += howlong;
// if applicable, remember what race you got it from
if (srcrace) {
f->val[2] = srcrace->id;
}
// announce - announceflaggain won't be called // announce - announceflaggain won't be called
// since this isn't a new flag. // since this isn't a new flag.
if (isplayer(lf)) { if (isplayer(lf)) {
@ -15112,7 +15376,7 @@ void poison(lifeform_t *lf, int howlong, enum POISONTYPE ptype, int power, char
} }
if (!found) { if (!found) {
addtempflag(lf->flags, F_POISONED, ptype, power, NA, fromwhat, howlong); addtempflag(lf->flags, F_POISONED, ptype, power, srcrace ? srcrace->id : NA, fromwhat, howlong);
// also apply specific poison effect // also apply specific poison effect
switch (ptype) { switch (ptype) {
@ -16490,6 +16754,7 @@ void setbodytype(race_t *r, enum BODYTYPE bt) {
addbodypart(r, BP_EYES, NULL); addbodypart(r, BP_EYES, NULL);
addbodypart(r, BP_EARS, NULL); addbodypart(r, BP_EARS, NULL);
addbodypart(r, BP_HEAD, NULL); addbodypart(r, BP_HEAD, NULL);
addbodypart(r, BP_NECK, NULL);
addbodypart(r, BP_BODY, NULL); addbodypart(r, BP_BODY, NULL);
addbodypart(r, BP_LEGS, NULL); addbodypart(r, BP_LEGS, NULL);
addbodypart(r, BP_FEET, "talons"); addbodypart(r, BP_FEET, "talons");
@ -16504,6 +16769,7 @@ void setbodytype(race_t *r, enum BODYTYPE bt) {
addbodypart(r, BP_EYES, NULL); addbodypart(r, BP_EYES, NULL);
addbodypart(r, BP_EARS, NULL); addbodypart(r, BP_EARS, NULL);
addbodypart(r, BP_HEAD, NULL); addbodypart(r, BP_HEAD, NULL);
addbodypart(r, BP_NECK, NULL);
addbodypart(r, BP_BODY, NULL); addbodypart(r, BP_BODY, NULL);
addbodypart(r, BP_BACKLEGS, "back legs"); addbodypart(r, BP_BACKLEGS, "back legs");
addbodypart(r, BP_FRONTLEGS, "front legs"); addbodypart(r, BP_FRONTLEGS, "front legs");
@ -17217,6 +17483,10 @@ int real_skillcheck(lifeform_t *lf, enum CHECKTYPE ct, int diff, int mod, int *r
if (lfhasflag(lf, F_STABILITY) || !hasbp(lf, BP_FEET)) { if (lfhasflag(lf, F_STABILITY) || !hasbp(lf, BP_FEET)) {
othermod += 10; othermod += 10;
} }
} else if (ct == SC_LISTEN) {
if (hasequippedobid(lf->pack, OT_AMU_LISTEN)) {
othermod += 20;
}
} else if (ct == SC_MORALE) { } else if (ct == SC_MORALE) {
othermod += (getstatmod(lf, A_WIS) / 30); // ie. -1 to 1 othermod += (getstatmod(lf, A_WIS) / 30); // ie. -1 to 1
} else if (ct == SC_OPENLOCKS) { } else if (ct == SC_OPENLOCKS) {
@ -17227,6 +17497,10 @@ int real_skillcheck(lifeform_t *lf, enum CHECKTYPE ct, int diff, int mod, int *r
} else { } else {
othermod += (5 * slev); othermod += (5 * slev);
} }
if (hasequippedobid(lf->pack, OT_AMU_THIEF)) {
othermod += 25;
}
} else if (ct == SC_POISON) { } else if (ct == SC_POISON) {
// auto pass if we are immune // auto pass if we are immune
if (isimmuneto(lf->flags, DT_POISON, B_FALSE)) { if (isimmuneto(lf->flags, DT_POISON, B_FALSE)) {
@ -18747,12 +19021,13 @@ int stone(lifeform_t *lf) {
getlfname(lf, lfname); getlfname(lf, lfname);
snprintf(statname, BUFLEN, "statue of a %s", lf->race->name);
addob(lf->cell->obpile, statname);
// kill lifeform // kill lifeform
addflag(lf->flags, F_NODEATHANNOUNCE, B_TRUE, NA, NA, NULL); addflag(lf->flags, F_NODEATHANNOUNCE, B_TRUE, NA, NA, NULL);
addflag(lf->flags, F_NOCORPSE, B_TRUE, NA, NA, NULL); snprintf(statname, BUFLEN, "statue of a %s", lf->race->name);
killflagsofid(lf->flags, F_CORPSETYPE);
addflag(lf->flags, F_CORPSETYPE, B_TRUE, NA, NA, statname);
if (cansee(player, lf)) { if (cansee(player, lf)) {
msg("^%c%s %s to stone!", getlfcol(lf, CC_VBAD), lfname, isplayer(lf) ? "turn" : "turns"); msg("^%c%s %s to stone!", getlfcol(lf, CC_VBAD), lfname, isplayer(lf) ? "turn" : "turns");
@ -19941,9 +20216,17 @@ int usestairs(lifeform_t *lf, object_t *o, int onpurpose, int climb) {
} else { } else {
int howfar; int howfar;
if (isplayer(lf)) { if (isplayer(lf)) {
msg("^bYou slam into the ground!"); if (isimmuneto(lf->flags, DT_FALL, B_FALSE)) {
msg("You land gently on the ground.");
} else {
msg("^bYou slam into the ground!");
}
} else if (cansee(player, lf)){ } else if (cansee(player, lf)){
msg("^%c%s slams into the ground!", getlfcol(lf, CC_BAD), lfname); if (isimmuneto(lf->flags, DT_FALL, B_FALSE)) {
msg("%s lands gently on the ground.", lfname);
} else {
msg("^%c%s slams into the ground!", getlfcol(lf, CC_BAD), lfname);
}
} }
// how far did you fall? // how far did you fall?
sumflags(lf->flags, F_FALLDISTANCE, &howfar, NULL, NULL); sumflags(lf->flags, F_FALLDISTANCE, &howfar, NULL, NULL);
@ -20472,7 +20755,7 @@ int rest(lifeform_t *lf, int onpurpose) {
// pass a skill check to regain hp // pass a skill check to regain hp
if (skillcheck(lf, SC_CON, difficulty, getskill(lf, SK_FIRSTAID))) { if (skillcheck(lf, SC_CON, difficulty, getskill(lf, SK_FIRSTAID))) {
gainhp(lf, hpheal); gainhp(lf, hpheal);
if (isplayer(lf)) { if (isplayer(lf) && godprayedto(R_GODLIFE)) {
pleasegodmaybe(R_GODLIFE, 1); pleasegodmaybe(R_GODLIFE, 1);
} }
practice(lf, SK_FIRSTAID, 1); practice(lf, SK_FIRSTAID, 1);
@ -21313,6 +21596,8 @@ int willburden(lifeform_t *lf, object_t *o, int howmany) {
int willeatlf(lifeform_t *eater, lifeform_t *eatee) { int willeatlf(lifeform_t *eater, lifeform_t *eatee) {
if (isplayer(eater)) return B_FALSE; if (isplayer(eater)) return B_FALSE;
if (eater == eatee) return B_FALSE; // no self-cannibulism!
// doesn't want to eat // doesn't want to eat
if (!lfhasflagval(eater, F_WANTSOBFLAG, F_EDIBLE, NA, NA, NULL)) { if (!lfhasflagval(eater, F_WANTSOBFLAG, F_EDIBLE, NA, NA, NULL)) {
return B_FALSE; return B_FALSE;

3
lf.h
View File

@ -364,6 +364,7 @@ int losehp_real(lifeform_t *lf, int amt, enum DAMTYPE damtype, lifeform_t *froml
void losehpeffects(lifeform_t *lf, int dam, enum DAMTYPE damtype, lifeform_t *fromlf, object_t *fromob, int retaliate, int ko, int *waskod, int prelowhp); void losehpeffects(lifeform_t *lf, int dam, enum DAMTYPE damtype, lifeform_t *fromlf, object_t *fromob, int retaliate, int ko, int *waskod, int prelowhp);
void losemp(lifeform_t *lf, int amt); void losemp(lifeform_t *lf, int amt);
void makefriendly(lifeform_t *lf, int howlong); void makefriendly(lifeform_t *lf, int howlong);
int makelearnable(lifeform_t *lf, enum SKILL skid);
int makenauseated(lifeform_t *lf, int amt, int howlong); int makenauseated(lifeform_t *lf, int amt, int howlong);
void makenoise(lifeform_t *lf, enum NOISETYPE nid); void makenoise(lifeform_t *lf, enum NOISETYPE nid);
void makepeaceful(lifeform_t *lf, lifeform_t *causedby); void makepeaceful(lifeform_t *lf, lifeform_t *causedby);
@ -385,7 +386,7 @@ enum NOISECLASS noisetypetoclass(enum NOISETYPE nt);
void outfitlf(lifeform_t *lf); void outfitlf(lifeform_t *lf);
void petify(lifeform_t *lf, lifeform_t *owner); void petify(lifeform_t *lf, lifeform_t *owner);
int pickup(lifeform_t *lf, object_t *what, int howmany, int fromground, int antannounce); int pickup(lifeform_t *lf, object_t *what, int howmany, int fromground, int antannounce);
void poison(lifeform_t *lf, int howlong, enum POISONTYPE ptype, int power, char *fromwhat); void poison(lifeform_t *lf, int howlong, enum POISONTYPE ptype, int power, char *fromwhat, enum RACE srcraceid);
int poisoncausesvomit(enum POISONTYPE ptype); int poisoncausesvomit(enum POISONTYPE ptype);
int poisonthreatenslife(lifeform_t *lf, flag_t *f); int poisonthreatenslife(lifeform_t *lf, flag_t *f);
void practice(lifeform_t *lf, enum SKILL skid, int amt); void practice(lifeform_t *lf, enum SKILL skid, int amt);

112
map.c
View File

@ -14,6 +14,7 @@
#include "lf.h" #include "lf.h"
#include "map.h" #include "map.h"
#include "objects.h" #include "objects.h"
#include "save.h"
#include "text.h" #include "text.h"
#include "vault.h" #include "vault.h"
@ -187,7 +188,7 @@ map_t *addmap(void) {
// when monsters are made during level generation, autogen will be true. otherwise false; // when monsters are made during level generation, autogen will be true. otherwise false;
// if "rid" RR_SPECIFIED, parse racename to get the race. // if "rid" RR_SPECIFIED, parse racename to get the race.
// otherwise just use the given race. // otherwise just use the given race.
lifeform_t *addmonster(cell_t *c, enum RACE rid, char *racename, int jobok, int amt, int autogen, int *nadded) { lifeform_t *addmonster(cell_t *c, enum RACE rid, char *racename, int randomjobok, int amt, int autogen, int *nadded) {
lifeform_t *lf = NULL; lifeform_t *lf = NULL;
race_t *r; race_t *r;
int db = B_FALSE; int db = B_FALSE;
@ -271,7 +272,7 @@ lifeform_t *addmonster(cell_t *c, enum RACE rid, char *racename, int jobok, int
lf->born = B_FALSE; lf->born = B_FALSE;
if (wantjob == J_NONE) { if (wantjob == J_NONE) {
if (jobok) { if (randomjobok) {
int nretflags,i; int nretflags,i;
flag_t *retflag[MAXCANDIDATES]; flag_t *retflag[MAXCANDIDATES];
getflags(lf->flags, retflag, &nretflags, F_STARTJOB, F_NONE); getflags(lf->flags, retflag, &nretflags, F_STARTJOB, F_NONE);
@ -370,26 +371,29 @@ lifeform_t *addmonster(cell_t *c, enum RACE rid, char *racename, int jobok, int
// NOTE: because the initial maps (world, heaven, dungeon lev1) are created BEFORE the player, // NOTE: because the initial maps (world, heaven, dungeon lev1) are created BEFORE the player,
// monsters on these maps will not have their hostility adjusted! // monsters on these maps will not have their hostility adjusted!
if (gamemode == GM_GAMESTARTED) { if (gamemode == GM_GAMESTARTED) {
// adjust hostility based on player's alignment if (hasequippedobid(player->pack, OT_AMU_VICTIM)) {
switch (getalignment(player)) { // everything is hostile.
case AL_GOOD: if (!lfhasflag(lf, F_HOSTILE)) addflag(lf->flags, F_HOSTILE, B_TRUE, NA, NA, NULL);
if (getalignment(lf) == AL_GOOD) { } else {
killflagsofid(lf->flags, F_HOSTILE); // adjust hostility based on player's alignment
} else if (getalignment(lf) == AL_EVIL) { switch (getalignment(player)) {
if (!lfhasflag(lf, F_HOSTILE)) { case AL_GOOD:
addflag(lf->flags, F_HOSTILE, B_TRUE, NA, NA, NULL); if (getalignment(lf) == AL_GOOD) {
killflagsofid(lf->flags, F_HOSTILE);
} else if (getalignment(lf) == AL_EVIL) {
if (!lfhasflag(lf, F_HOSTILE)) addflag(lf->flags, F_HOSTILE, B_TRUE, NA, NA, NULL);
} }
} break;
break; case AL_EVIL:
case AL_EVIL: if (getalignment(lf) == AL_GOOD) {
if (getalignment(lf) == AL_GOOD) { if (!lfhasflag(lf, F_HOSTILE)) {
if (!lfhasflag(lf, F_HOSTILE)) { addflag(lf->flags, F_HOSTILE, B_TRUE, NA, NA, NULL);
addflag(lf->flags, F_HOSTILE, B_TRUE, NA, NA, NULL); }
} }
} break;
break; default:
default: break;
break; }
} }
} }
@ -496,6 +500,8 @@ lifeform_t *addmonster(cell_t *c, enum RACE rid, char *racename, int jobok, int
//if (gamemode == GM_GAMESTARTED) checkallflags(player->cell->map); // debugging //if (gamemode == GM_GAMESTARTED) checkallflags(player->cell->map); // debugging
/*
// XXX: temporarily disbled due to slow light code
if (db) dbtime("giving torches"); if (db) dbtime("giving torches");
// humanoids on dark levels which can't see will probably have some // humanoids on dark levels which can't see will probably have some
// kind of light producing device // kind of light producing device
@ -522,6 +528,7 @@ lifeform_t *addmonster(cell_t *c, enum RACE rid, char *racename, int jobok, int
} }
} }
} }
*/
//if (gamemode == GM_GAMESTARTED) checkallflags(player->cell->map); // debugging //if (gamemode == GM_GAMESTARTED) checkallflags(player->cell->map); // debugging
//if (gamemode == GM_GAMESTARTED) checkallflags(player->cell->map); // debugging //if (gamemode == GM_GAMESTARTED) checkallflags(player->cell->map); // debugging
@ -4113,6 +4120,15 @@ int createvault(map_t *map, int roomid, vault_t *v, int *retw, int *reth, int *r
linkexits(map, roomid); linkexits(map, roomid);
} }
// remove bones vault files after creation.
if (hasflagval(v->flags, F_VAULTTAG, NA, NA, NA, "bones")) {
removevaultfile(v->filename);
// also mark it as invalid, otherwise we might try
// to create it again, in which case the second call
// to removevaultfile() will fail.
v->valid = B_FALSE;
}
return B_FALSE; return B_FALSE;
} }
@ -7225,12 +7241,30 @@ int orthdir(int compassdir) {
enum RACE parserace(char *name, flagpile_t *wantflags, enum JOB *wantjob, enum SUBJOB *wantsubjob) { enum RACE parserace(char *name, flagpile_t *wantflags, enum JOB *wantjob, enum SUBJOB *wantsubjob) {
int donesomething; int donesomething;
char *p; char *p,*suff;
job_t *j; job_t *j;
char named[BUFLEN];
char *localname;
char *namestart;
// get params // get params
donesomething = B_TRUE; donesomething = B_TRUE;
p = name;
// take a local copy so we can strip suffixes off it
if (strstarts(name, "the ")) {
namestart = name + strlen("the ");
} else if (strstarts(name, "an ")) {
namestart = name + strlen("an ");
} else if (strstarts(name, "a ")) {
namestart = name + strlen("a ");
} else {
namestart = name;
}
localname = strdup(namestart);
p = localname;
while (donesomething) { while (donesomething) {
donesomething = B_FALSE; donesomething = B_FALSE;
if (strstarts(p, "sleeping ")) { if (strstarts(p, "sleeping ")) {
@ -7240,13 +7274,35 @@ enum RACE parserace(char *name, flagpile_t *wantflags, enum JOB *wantjob, enum S
} }
} }
// try removing suffixes for "named xxx"
strcpy(named, "");
suff = strends(localname, " named ");
if (suff) {
char *suffp;
char *p2;
// extract the name
p2 = named;
suffp = suff + strlen(" named ");
while (*suffp && (*suffp != ' ')) {
*p2 = *suffp;
suffp++;
p2++;
}
*p2 = '\0'; // nul-terminate name
*suff = '\0'; // strip off suffix from main string
}
if (strlen(named)) {
if (wantflags) addflag(wantflags, F_NAMED, NA, NA, NA, named);
donesomething = B_TRUE;
}
// try removing suffixes for jobs // try removing suffixes for jobs
for (j = firstjob ; j ; j = j->next) { for (j = firstjob ; j ; j = j->next) {
char *ep; char *ep;
char jobname[BUFLEN]; char jobname[BUFLEN];
snprintf(jobname, BUFLEN, " %s", j->name); snprintf(jobname, BUFLEN, " %s", j->name);
jobname[1] = tolower(jobname[1]); jobname[1] = tolower(jobname[1]);
ep = strends(name, jobname); ep = strends(localname, jobname);
if (ep) { if (ep) {
// got it // got it
if (wantjob) *wantjob = j->id; if (wantjob) *wantjob = j->id;
@ -7260,28 +7316,28 @@ enum RACE parserace(char *name, flagpile_t *wantflags, enum JOB *wantjob, enum S
int foundsubjob = B_FALSE; int foundsubjob = B_FALSE;
// search for subjob names // search for subjob names
char *ep; char *ep;
ep = strends(name, "Skymage"); ep = strends(localname, "Skymage");
if (ep && !foundsubjob) { if (ep && !foundsubjob) {
if (wantjob) *wantjob = J_WIZARD; if (wantjob) *wantjob = J_WIZARD;
if (wantsubjob) *wantsubjob = SJ_AIRMAGE; if (wantsubjob) *wantsubjob = SJ_AIRMAGE;
*ep = '\0'; *ep = '\0';
foundsubjob = B_TRUE; foundsubjob = B_TRUE;
} }
ep = strends(name, "Icemage"); ep = strends(localname, "Icemage");
if (ep && !foundsubjob) { if (ep && !foundsubjob) {
if (wantjob) *wantjob = J_WIZARD; if (wantjob) *wantjob = J_WIZARD;
if (wantsubjob) *wantsubjob = SJ_ICEMAGE; if (wantsubjob) *wantsubjob = SJ_ICEMAGE;
*ep = '\0'; *ep = '\0';
foundsubjob = B_TRUE; foundsubjob = B_TRUE;
} }
ep = strends(name, "Firemage"); ep = strends(localname, "Firemage");
if (ep && !foundsubjob) { if (ep && !foundsubjob) {
if (wantjob) *wantjob = J_WIZARD; if (wantjob) *wantjob = J_WIZARD;
if (wantsubjob) *wantsubjob = SJ_FIREMAGE; if (wantsubjob) *wantsubjob = SJ_FIREMAGE;
*ep = '\0'; *ep = '\0';
foundsubjob = B_TRUE; foundsubjob = B_TRUE;
} }
ep = strends(name, "Necromancer"); ep = strends(localname, "Necromancer");
if (ep && !foundsubjob) { if (ep && !foundsubjob) {
if (wantjob) *wantjob = J_WIZARD; if (wantjob) *wantjob = J_WIZARD;
if (wantsubjob) *wantsubjob = SJ_NECROMANCER; if (wantsubjob) *wantsubjob = SJ_NECROMANCER;
@ -7291,6 +7347,8 @@ enum RACE parserace(char *name, flagpile_t *wantflags, enum JOB *wantjob, enum S
} }
free(localname);
// now get raceid // now get raceid
if (streq(p, "random")) { if (streq(p, "random")) {
return R_RANDOM; return R_RANDOM;

2
map.h
View File

@ -4,7 +4,7 @@ cell_t *addcell(map_t *map, int x, int y);
habitat_t *addhabitat(enum HABITAT id, char *name, enum CELLTYPE emptycell, enum CELLTYPE solidcell, int thingchance, int obchance, int vaultchance, int maxvisrange, enum OBTYPE upstairtype, enum OBTYPE downstairtype); habitat_t *addhabitat(enum HABITAT id, char *name, enum CELLTYPE emptycell, enum CELLTYPE solidcell, int thingchance, int obchance, int vaultchance, int maxvisrange, enum OBTYPE upstairtype, enum OBTYPE downstairtype);
void addhomeobs(lifeform_t *lf); void addhomeobs(lifeform_t *lf);
map_t *addmap(void); map_t *addmap(void);
lifeform_t *addmonster(cell_t *c, enum RACE rid, char *racename, int jobok, int amt, int autogen, int *nadded); lifeform_t *addmonster(cell_t *c, enum RACE rid, char *racename, int randomjobok, int amt, int autogen, int *nadded);
object_t *addrandomob(cell_t *c); object_t *addrandomob(cell_t *c);
int addrandomthing(cell_t *c, int obchance, int *nadded); int addrandomthing(cell_t *c, int obchance, int *nadded);
region_t *addregion(enum REGIONTYPE rtype, region_t *parent, int outlineid, int depthmod, int createdby); region_t *addregion(enum REGIONTYPE rtype, region_t *parent, int outlineid, int depthmod, int createdby);

51
move.c
View File

@ -1046,34 +1046,37 @@ int moveclear(lifeform_t *lf, int dir, enum ERROR *error) {
} }
// effects which happen after player moves. // effects which happen _after_ player moves or attacks.
// IMPORTANT: don't modify lf's flagpile during this code! // IMPORTANT: don't modify lf's flagpile during this code!
// particularly don't remove flags... // particularly don't remove flags...
// returns TRUE if we displayed a message // returns TRUE if we displayed a message
int moveeffects(lifeform_t *lf) { int moveeffects(lifeform_t *lf, int moved) {
flag_t *f; flag_t *f;
int didmsg = B_FALSE; int didmsg = B_FALSE;
if (lfhasflagval(lf, F_INJURY, IJ_HAMSTRUNG, NA, NA, NULL)) { // effects which only happen if you actually moved (not attacked)
if (!skillcheck(lf, SC_FALL, 18, 0)) { if (moved) {
if (lfhasflagval(lf, F_INJURY, IJ_HAMSTRUNG, NA, NA, NULL)) {
if (!skillcheck(lf, SC_FALL, 18, 0)) {
fall(lf, NULL, B_TRUE);
if (isplayer(lf)) didmsg = B_TRUE;
}
}
if (onein(10) && lfhasflagval(lf, F_INJURY, IJ_TAILLACERATED, NA, NA, NULL)) {
fall(lf, NULL, B_TRUE); fall(lf, NULL, B_TRUE);
if (isplayer(lf)) didmsg = B_TRUE; if (isplayer(lf)) didmsg = B_TRUE;
} }
}
if (onein(10) && lfhasflagval(lf, F_INJURY, IJ_TAILLACERATED, NA, NA, NULL)) {
fall(lf, NULL, B_TRUE);
if (isplayer(lf)) didmsg = B_TRUE;
}
if (isbleeding(lf)) { if (isbleeding(lf)) {
if (hasbleedinginjury(lf, BP_LEGS)) { if (hasbleedinginjury(lf, BP_LEGS)) {
if (!bleedfrom(lf, BP_LEGS, B_FALSE)) { if (!bleedfrom(lf, BP_LEGS, B_FALSE)) {
if (isplayer(lf)) msg("^BYou bleed!"); if (isplayer(lf)) msg("^BYou bleed!");
losehp(lf, 1, DT_DIRECT, NULL, "blood loss"); losehp(lf, 1, DT_DIRECT, NULL, "blood loss");
} }
} else { } else {
if (rnd(1,2) == 1) { if (rnd(1,2) == 1) {
bleed(lf, B_FALSE); bleed(lf, B_FALSE);
}
} }
} }
} }
@ -1137,6 +1140,7 @@ int movelf(lifeform_t *lf, cell_t *newcell) {
//vault_t *v; //vault_t *v;
flag_t *retflag[MAXCANDIDATES]; flag_t *retflag[MAXCANDIDATES];
int nretflags,i; int nretflags,i;
int autoangry = B_FALSE;
assert(newcell); assert(newcell);
@ -1259,7 +1263,7 @@ int movelf(lifeform_t *lf, cell_t *newcell) {
needredraw = B_TRUE; needredraw = B_TRUE;
} }
didmsg = moveeffects(lf); didmsg = moveeffects(lf, B_TRUE);
if (lfhasflag(lf, F_HIDING) && (getskill(lf, SK_STEALTH) < PR_BEGINNER)) { if (lfhasflag(lf, F_HIDING) && (getskill(lf, SK_STEALTH) < PR_BEGINNER)) {
killflagsofid(lf->flags, F_HIDING); killflagsofid(lf->flags, F_HIDING);
@ -1454,6 +1458,11 @@ int movelf(lifeform_t *lf, cell_t *newcell) {
} }
} }
// amulet of victimisation?
if (hasequippedobid(lf->pack, OT_AMU_VICTIM)) {
autoangry = B_TRUE;
}
// does anyone else see you? // does anyone else see you?
for (l = newcell->map->lf ; l ; l = l->next) { for (l = newcell->map->lf ; l ; l = l->next) {
if (l != lf) { if (l != lf) {
@ -1461,6 +1470,10 @@ int movelf(lifeform_t *lf, cell_t *newcell) {
if (cansee(l, lf)) { if (cansee(l, lf)) {
int dointerrupt = B_FALSE; int dointerrupt = B_FALSE;
if (autoangry && !isplayer(l) && !lfhasflag(l, F_HOSTILE)) {
addflag(l->flags, F_HOSTILE, B_TRUE, NA, NA, NULL);
}
// much larger creatures moving will cause our los to be recalculated // much larger creatures moving will cause our los to be recalculated
if (getlfsize(lf) - getlfsize(l) >= 2) { if (getlfsize(lf) - getlfsize(l) >= 2) {
setlosdirty(l); setlosdirty(l);

2
move.h
View File

@ -16,7 +16,7 @@ int knockback(lifeform_t *lf, int dir, int howfar, lifeform_t *pusher, int fallc
int makeorthogonal(int dir); int makeorthogonal(int dir);
int moveawayfrom(lifeform_t *lf, cell_t *dst, int dirtype, int keepinlof, int strafe); int moveawayfrom(lifeform_t *lf, cell_t *dst, int dirtype, int keepinlof, int strafe);
int moveclear(lifeform_t *lf, int dir, enum ERROR *error); int moveclear(lifeform_t *lf, int dir, enum ERROR *error);
int moveeffects(lifeform_t *lf); int moveeffects(lifeform_t *lf, int moved);
int movelf(lifeform_t *lf, cell_t *newcell); int movelf(lifeform_t *lf, cell_t *newcell);
int movelfsoutofway(cell_t *newcell); int movelfsoutofway(cell_t *newcell);
int moveto(lifeform_t *lf, cell_t *newcell, int onpurpose, int dontclearmsg); int moveto(lifeform_t *lf, cell_t *newcell, int onpurpose, int dontclearmsg);

View File

@ -824,8 +824,12 @@ void donextturn(map_t *map) {
o = findobidinmap(who->cell->map, atol(f->text)); o = findobidinmap(who->cell->map, atol(f->text));
} }
if (o && caneat(who, o) && (getoblocation(o) == who->cell)) { if (o && caneat(who, o) && (getoblocation(o) == who->cell)) {
eat(who,o); if (eat(who,o)) {
donormalmove = B_FALSE; // failed
killflag(f);
} else {
donormalmove = B_FALSE;
}
} else { } else {
killflag(f); killflag(f);
} }

165
objects.c
View File

@ -80,6 +80,7 @@ enum OBCLASS sortorder[] = {
OC_WAND, OC_WAND,
OC_FOOD, OC_FOOD,
OC_CORPSE, OC_CORPSE,
OC_AMULET,
OC_RING, OC_RING,
OC_TECH, OC_TECH,
OC_TOOLS, OC_TOOLS,
@ -227,6 +228,27 @@ char *ringadjective[] = {
"", "",
}; };
char *amuletadjective[] = {
"chipped",
"dusty",
"grotesque",
"lurid",
"mysterious",
"polished",
"twisted",
"",
};
char *amuletnoun[] = {
"charm",
"locket",
"medallion",
"necklace",
"pendant",
"talisman",
"",
};
long nextoid = 0; long nextoid = 0;
brand_t *addbrand(enum BRAND id, char *suffix, enum BODYPART bp, enum BLESSTYPE blessed, int blesschance) { brand_t *addbrand(enum BRAND id, char *suffix, enum BODYPART bp, enum BLESSTYPE blessed, int blesschance) {
@ -454,11 +476,13 @@ object_t *addobject(obpile_t *where, char *name, int canstack, int wantlinkholes
int wantblessed = B_UNCURSED; int wantblessed = B_UNCURSED;
race_t *corpserace = NULL; race_t *corpserace = NULL;
int dorandombrand = B_FALSE; int dorandombrand = B_FALSE;
char wantnamed[BUFLEN];
brand_t *wantbrand = NULL; brand_t *wantbrand = NULL;
brand_t *br; brand_t *br;
obmod_t *om; obmod_t *om;
obmod_t *wantom[MAXOBMODS]; obmod_t *wantom[MAXOBMODS];
int wanthot = B_FALSE; int wanthot = B_FALSE;
int wanthppct = 100;
regionthing_t *wantregionthing = NULL; regionthing_t *wantregionthing = NULL;
int bonus = 0; int bonus = 0;
int nom = 0; int nom = 0;
@ -492,6 +516,8 @@ object_t *addobject(obpile_t *where, char *name, int canstack, int wantlinkholes
nadded = 0; nadded = 0;
nretobs = 0; nretobs = 0;
strcpy(wantnamed, "");
if ((gamemode == GM_GAMESTARTED) && where->where) { if ((gamemode == GM_GAMESTARTED) && where->where) {
assert(!where->where->type->solid); assert(!where->where->type->solid);
} }
@ -510,13 +536,42 @@ object_t *addobject(obpile_t *where, char *name, int canstack, int wantlinkholes
} }
} else { } else {
char *bonusstart,*p2; char *bonusstart,*p2;
char *namestart;
int bonussign = 1; int bonussign = 1;
localname = strdup(name);
if (strstarts(name, "the ")) {
namestart = name + strlen("the ");
} else if (strstarts(name, "an ")) {
namestart = name + strlen("an ");
} else if (strstarts(name, "a ")) {
namestart = name + strlen("a ");
} else {
namestart = name;
}
localname = strdup(namestart);
if (db) { if (db) {
dblog("DB: called addobject() for %s, canstack = %d",localname, canstack); dblog("DB: called addobject() for %s, canstack = %d",localname, canstack);
} }
// check if we want a name. if so, remember it and strip off the suffix.
p2 = strstr(localname, " named ");
if (p2) {
char *wantp;
char *copyfrom;
copyfrom = p2 + strlen(" named ");
wantp = wantnamed;
while (*copyfrom && (*copyfrom != ' ')) {
*wantp = *copyfrom;
copyfrom++;
wantp++;
}
*wantp = '\0';
// now strip the suffix
*p2 = '\0';
}
// check for premods. eg. "flaming xxx" "frozen xxx" etc // check for premods. eg. "flaming xxx" "frozen xxx" etc
for (om = firstobmod ; om ; om = om->next) { for (om = firstobmod ; om ; om = om->next) {
if (db) dblog("DB: checking for '%s' in '%s'",om->prefix, localname); if (db) dblog("DB: checking for '%s' in '%s'",om->prefix, localname);
@ -526,6 +581,18 @@ object_t *addobject(obpile_t *where, char *name, int canstack, int wantlinkholes
wantom[nom] = om; wantom[nom] = om;
nom++; nom++;
} else {
// check altprefixes.
int i;
for (i = 0; i < om->naltprefix; i++) {
if (strstr(localname, om->altprefix[i])) {
localname = strrep(localname, om->altprefix[i], "", NULL);
if (db) dblog("DB: found obmod altprefix '%s'",om->altprefix[i]);
wantom[nom] = om;
nom++;
break;
}
}
} }
} }
@ -642,6 +709,27 @@ object_t *addobject(obpile_t *where, char *name, int canstack, int wantlinkholes
wanthot = B_TRUE; wanthot = B_TRUE;
p += strlen("red-hot "); p += strlen("red-hot ");
donesomething = B_TRUE; donesomething = B_TRUE;
// condition flags
} else if (strstarts(p, "battered ")) {
wanthppct = 75;
canstack = B_FALSE;
p += strlen("battered ");
donesomething = B_TRUE;
} else if (strstarts(p, "damaged ")) {
wanthppct = 50;
canstack = B_FALSE;
p += strlen("damaged ");
donesomething = B_TRUE;
} else if (strstarts(p, "very damaged ")) {
wanthppct = 25;
canstack = B_FALSE;
p += strlen("very damaged ");
donesomething = B_TRUE;
} else if (strstarts(p, "critically damaged ")) {
wanthppct = 10;
canstack = B_FALSE;
p += strlen("critically damaged ");
donesomething = B_TRUE;
// armour flags // armour flags
} else if (strstarts(p, "gargantuan ")) { } else if (strstarts(p, "gargantuan ")) {
wantarmsize = SZ_ENORMOUS; wantarmsize = SZ_ENORMOUS;
@ -747,6 +835,7 @@ object_t *addobject(obpile_t *where, char *name, int canstack, int wantlinkholes
if (onein(4)) dorandombrand = B_TRUE; if (onein(4)) dorandombrand = B_TRUE;
p += strlen("excellent "); p += strlen("excellent ");
donesomething = B_TRUE; donesomething = B_TRUE;
// object names
// brands // brands
} else if (strstarts(p, "branded ")) { } else if (strstarts(p, "branded ")) {
dorandombrand = B_TRUE; dorandombrand = B_TRUE;
@ -1233,6 +1322,18 @@ object_t *addobject(obpile_t *where, char *name, int canstack, int wantlinkholes
changemat(o, wantdiffmat); changemat(o, wantdiffmat);
} }
if (strlen(wantnamed)) {
addflag(o->flags, F_NAMED, NA, NA, NA, wantnamed);
}
if (wanthppct != 100) {
f = hasflag(o->flags, F_OBHP);
if (f) {
f->val[0] = pctof(wanthppct, f->val[1]);
limit(&(f->val[0]), 1, f->val[1]);
}
}
// extra chance of bone items being cursed // extra chance of bone items being cursed
if (o->type->material->id == MT_BONE) { if (o->type->material->id == MT_BONE) {
if (pctchance(15)) { if (pctchance(15)) {
@ -1970,6 +2071,7 @@ obmod_t *addobmod(enum OBMOD id, char *prefix) {
a->id = id; a->id = id;
snprintf(buf, BUFLEN, "%s ",prefix); snprintf(buf, BUFLEN, "%s ",prefix);
a->prefix = strdup(buf); a->prefix = strdup(buf);
a->naltprefix = 0;
a->flags = addflagpile(NULL, NULL); a->flags = addflagpile(NULL, NULL);
@ -1993,6 +2095,18 @@ obpile_t *addobpile(lifeform_t *owner, cell_t *where, object_t *parentob) {
return op; return op;
} }
void addomprefix(enum OBMOD id, char *altprefix) {
char buf[BUFLEN];
obmod_t *om;
om = findobmod(id);
assert(om);
assert(om->naltprefix < MAXOMPREFIXES);
snprintf(buf, BUFLEN, "%s ",altprefix);
om->altprefix[om->naltprefix] = strdup(buf);
om->naltprefix++;
}
void addobsinradius(cell_t *centre, int radius, int dirtype, char *name, int allowdupes) { void addobsinradius(cell_t *centre, int radius, int dirtype, char *name, int allowdupes) {
cell_t *cell[MAXCANDIDATES],*c; cell_t *cell[MAXCANDIDATES],*c;
int ncells,i; int ncells,i;
@ -5311,6 +5425,13 @@ char *real_getobname(object_t *o, char *buf, int count, int wantpremods, int wan
} }
} }
// show NAMED
f = hasflag(o->flags, F_NAMED);
if (f) {
strcat(localbuf, " named ");
strcat(localbuf, f->text);
}
// append inscription // append inscription
if (o->inscription) { if (o->inscription) {
strcat(localbuf, " {"); strcat(localbuf, " {");
@ -8212,6 +8333,14 @@ int obfits(object_t *o, obpile_t *op) {
return B_TRUE; return B_TRUE;
} }
int obgoesinbones(object_t *o) {
flag_t *retflag[MAXCANDIDATES];
int nretflags = 0;
getflags(o->flags, retflag, &nretflags, F_CLIMBABLE, F_TRAIL, F_UNIQUE, F_NONE);
if (nretflags) return B_FALSE;
return B_TRUE;
}
enum DAMTYPE oblastdamtype(object_t *o) { enum DAMTYPE oblastdamtype(object_t *o) {
flag_t *f; flag_t *f;
f = hasflag(o->flags, F_LASTDAMTYPE); f = hasflag(o->flags, F_LASTDAMTYPE);
@ -8435,11 +8564,13 @@ int obsfallthrough(cell_t *c, object_t *pit) {
} }
// fall through! // fall through!
if (haslos(player, c)) { if (gamemode == GM_GAMESTARTED) {
// player can see the top of the hole if (haslos(player, c)) {
getobname(oo,obname, oo->amt); // player can see the top of the hole
msg("%s %s%s through %s.", obname, verb, OBS1(oo), getobname(oo,obname, oo->amt);
downholename); msg("%s %s%s through %s.", obname, verb, OBS1(oo),
downholename);
}
} }
nfallen++; nfallen++;
@ -8452,10 +8583,12 @@ int obsfallthrough(cell_t *c, object_t *pit) {
oo = moveob(oo, belowcell->obpile, oo->amt); oo = moveob(oo, belowcell->obpile, oo->amt);
if (haslos(player, belowcell)) { if (gamemode == GM_GAMESTARTED) {
// player can see the bottom of the hole if (haslos(player, belowcell)) {
getobname(oo,obname, oo->amt); // player can see the bottom of the hole
msg("%s %s%s through %s.", obname, verb, OBS1(oo), upholename); getobname(oo,obname, oo->amt);
msg("%s %s%s through %s.", obname, verb, OBS1(oo), upholename);
}
} }
// does the object hit anyone? // does the object hit anyone?
@ -8464,7 +8597,7 @@ int obsfallthrough(cell_t *c, object_t *pit) {
char dambuf[BUFLEN]; char dambuf[BUFLEN];
lf = belowcell->lf; lf = belowcell->lf;
if (canseebelowlf) { if ((gamemode == GM_GAMESTARTED) && canseebelowlf) {
char lfname[BUFLEN]; char lfname[BUFLEN];
getobname(oo,obname, oo->amt); getobname(oo,obname, oo->amt);
getlfname(lf, lfname); getlfname(lf, lfname);
@ -10253,7 +10386,7 @@ void potioneffects(lifeform_t *lf, enum OBTYPE oid, object_t *o, enum BLESSTYPE
} }
break; break;
case OT_POT_POISON: case OT_POT_POISON:
poison(lf, rnd(10,20), P_FOOD, 1, "a potion of poison"); poison(lf, rnd(10,20), P_FOOD, 1, "a potion of poison", R_NONE);
break; break;
case OT_POT_POLYMORPH: case OT_POT_POLYMORPH:
if (potblessed == B_BLESSED) { if (potblessed == B_BLESSED) {
@ -11006,7 +11139,11 @@ int readsomething(lifeform_t *lf, object_t *o) {
// manuals // manuals
f = hasflag(o->flags, F_MANUALOF); f = hasflag(o->flags, F_MANUALOF);
if (f) { if (f) {
giveskill(lf, f->val[0]); if (ismaxedskill(lf, f->val[0])) {
if (isplayer(lf)) msg("This manual is too advanced for you.");
} else {
giveskill(lf, f->val[0]);
}
} }
if (isplayer(lf)) { if (isplayer(lf)) {
msg("The book crumbles to dust."); msg("The book crumbles to dust.");
@ -13346,7 +13483,7 @@ void trapeffects(object_t *trapob, enum OBTYPE oid, cell_t *c) {
} }
} }
if (!avoided) { if (!avoided) {
poison(lf, rnd(10,20), P_VENOM, 1, "a needle trap"); poison(lf, rnd(10,20), P_VENOM, 1, "a needle trap", R_NONE);
} }
} else { } else {
if (haslos(player, c)) { if (haslos(player, c)) {

View File

@ -15,6 +15,7 @@ object_t *addobject(obpile_t *where, char *name, int canstack, int wantlinkholes
int addobburst(cell_t *where, int range, int dirtype, char *name, lifeform_t *fromlf, enum LOFTYPE needlof); int addobburst(cell_t *where, int range, int dirtype, char *name, lifeform_t *fromlf, enum LOFTYPE needlof);
obmod_t *addobmod(enum OBMOD id, char *prefix); obmod_t *addobmod(enum OBMOD id, char *prefix);
obpile_t *addobpile(lifeform_t *owner, cell_t *where, object_t *parentob); obpile_t *addobpile(lifeform_t *owner, cell_t *where, object_t *parentob);
void addomprefix(enum OBMOD id, char *altprefix);
void addobsinradius(cell_t *centre, int radius, int dirtype, char *name, int allowdupes); void addobsinradius(cell_t *centre, int radius, int dirtype, char *name, int allowdupes);
objecttype_t *addot(enum OBTYPE id, char *name, char *description, int material, float weight, int obclassid, enum LFSIZE size); objecttype_t *addot(enum OBTYPE id, char *name, char *description, int material, float weight, int obclassid, enum LFSIZE size);
recipe_t *addrecipe(enum OBTYPE result, ...); recipe_t *addrecipe(enum OBTYPE result, ...);
@ -243,6 +244,7 @@ void obaction(object_t *o, char *text);
object_t *obexists(enum OBTYPE obid); object_t *obexists(enum OBTYPE obid);
void obdie(object_t *o); void obdie(object_t *o);
int obfits(object_t *o, obpile_t *op); int obfits(object_t *o, obpile_t *op);
int obgoesinbones(object_t *o);
enum DAMTYPE oblastdamtype(object_t *o); enum DAMTYPE oblastdamtype(object_t *o);
int brandappliesto(brand_t *om, objecttype_t *ot); int brandappliesto(brand_t *om, objecttype_t *ot);
int obmatchescondition(object_t *o, long opts); int obmatchescondition(object_t *o, long opts);

165
save.c
View File

@ -1,4 +1,5 @@
#include <assert.h> #include <assert.h>
#include <ctype.h>
#include <dirent.h> #include <dirent.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
@ -767,6 +768,141 @@ int loadworlddata(FILE *f) {
return B_FALSE; return B_FALSE;
} }
int removevaultfile(char *filename) {
if (unlink(filename)) {
msg("ERROR: Could not unlink bones file after creation ('%s')", filename);
dblog("ERROR: Could not unlink bones file after creation ('%s')", filename);
return B_TRUE;
}
return B_FALSE;
}
// dynamically create a temporary vault file based on the given room.
int savebones(map_t *m, room_t *r) {
cell_t *c;
int x,y;
FILE *f;
char filename[BUFLEN];
DIR *dp;
struct dirent *ep;
int maxid = 0, bonesid;
celltype_t *ct;
char ch;
char nextch = 'a';
celltype_t *legendct[MAXCANDIDATES];
char legendch[MAXCANDIDATES];
int nlegends = 0,n;
// get list of existing bones files
dp = opendir(BONESDIR);
if (dp != NULL) {
while ((ep = readdir(dp)) != NULL) {
char thisname[BUFLEN];
char *p;
strcpy(thisname, ep->d_name);
p = strstr(thisname, "bones");
if (p) {
char numbuf[BUFLEN];
char *np;
int thisid;
p += 5;
for (np = numbuf; isdigit(*p); p++, np++) {
*np = *p;
}
*np = '\0';
thisid = atoi(numbuf);
if (thisid > maxid) maxid = thisid;
}
}
closedir(dp);
}
bonesid = maxid + 1;
snprintf(filename, BUFLEN, "%s/bones%d.vlt",BONESDIR, bonesid);
f = fopen(filename, "wt");
if (!f) {
msg("Could not write bones file '%s'!", filename);
return B_TRUE;
}
fprintf(f, "@id:bones%d\n", bonesid);
fprintf(f, "@map\n");
for (y = r->y1; y <= r->y2; y++) {
for (x = r->x1; x <= r->x2; x++) {
c = getcellat(m, x, y);
// do we already ahve a legend entry for this celltype?
ct = NULL;
ch = '\0';
for (n = 0; n < nlegends; n++ ){
if (legendct[n] == c->type) {
ch = legendch[n];
break;
}
}
if (ch == '\0') {
ch = nextch;
legendct[nlegends] = c->type;
legendch[nlegends] = ch;
nlegends++;
if (nextch == 'z') nextch = 'A';
else if (nextch == 'Z') nextch = '0';
else nextch++;
}
// wall
fprintf(f, "%c", ch);
}
fprintf(f, "\n");
}
fprintf(f, "@end\n");
fprintf(f, "@legend\n");
for (n = 0; n < nlegends; n++){
fprintf(f, "%c:cell:%s\n",legendch[n], legendct[n]->name);
}
fprintf(f, "@end\n");
fprintf(f, "@flags\n");
// contents...
for (y = r->y1; y <= r->y2; y++) {
for (x = r->x1; x <= r->x2; x++) {
c = getcellat(m, x, y);
if (c) {
object_t *o;
int relx,rely;
relx = x - r->x1;
rely = y - r->y1;
if (c->lf) {
if (isplayer(c->lf)) {
// the lf's objects will appear in the bones file
for (o = c->lf->pack->first; o ; o = o->next) {
saveobtobones(o, f, relx, rely);
}
} else {
// the lf will appear in the bones file
char lfname[BUFLEN];
real_getlfname(c->lf, lfname, B_FALSE, B_TRUE);
fprintf(f, "at(%d,%d) lf:%s\n", relx,rely, lfname);
}
}
for (o = c->obpile->first ; o ; o = o->next) {
saveobtobones(o, f, relx, rely);
}
}
}
}
// other flags.
fprintf(f, "tag:bones\n");
fprintf(f, "maintainedge\n");
fprintf(f, "rarity:frequent\n");
fprintf(f, "goesin:%s\n", m->habitat->name);
fprintf(f, "dlevmin:%d\n", m->depth);
fprintf(f, "dlevmax:%d\n", m->depth);
fprintf(f, "@end\n");
fclose(f);
return B_FALSE;
}
int saveflagpile(FILE *f, flagpile_t *fp) { int saveflagpile(FILE *f, flagpile_t *fp) {
flag_t *fl; flag_t *fl;
fprintf(f, "flags:\n"); fprintf(f, "flags:\n");
@ -1018,6 +1154,35 @@ int saveob(FILE *f, object_t *o) {
return B_FALSE; return B_FALSE;
} }
int saveobtobones(object_t *o, FILE *f, int x, int y) {
char obname[BUFLEN];
if (!obgoesinbones(o)) return B_TRUE;
// modify the object?
if (hasflagval(o->flags, F_OBHPDRAIN, NA, DT_DECAY, NA, NULL)) {
// food will decay by the time someone else finds it.
return B_TRUE;
}
if (isweapon(o) || isarmour(o)) {
// weapons/armour might degrade in quality
if (hasflag(o->flags, F_MASTERWORK)) {
// masterwork -> normal
killflagsofid(o->flags, F_MASTERWORK);
} else {
if (onein(3)) {
applyobmod(o, findobmod(OM_SHODDY));
}
if (onein(3) && ismetal(o->material->id)) {
addflag(o->flags, F_RUSTED, R_RUSTY, NA, NA, NULL);
}
}
}
getobnametrue(o, obname, o->amt);
fprintf(f, "at(%d,%d) ob:%s\n", x,y, obname);
return B_FALSE;
}
int saveregions(FILE *f) { int saveregions(FILE *f) {
int i; int i;
regionoutline_t *ro; regionoutline_t *ro;

3
save.h
View File

@ -9,12 +9,15 @@ int loadob(FILE *f, obpile_t *op, long *id);
int loadregions(FILE *f); int loadregions(FILE *f);
int loadsavegame(void); int loadsavegame(void);
int loadworlddata(FILE *f); int loadworlddata(FILE *f);
int removevaultfile(char *filename);
int savebones(map_t *m, room_t *r);
int saveflagpile(FILE *f, flagpile_t *fp); int saveflagpile(FILE *f, flagpile_t *fp);
int saveknowledge(FILE *f); int saveknowledge(FILE *f);
int savelf(FILE *f, lifeform_t *l); int savelf(FILE *f, lifeform_t *l);
int savegame(void); int savegame(void);
int savemap(FILE *f, map_t *m); int savemap(FILE *f, map_t *m);
int saveob(FILE *f, object_t *o); int saveob(FILE *f, object_t *o);
int saveobtobones(object_t *o, FILE *f, int x, int y);
int saveregions(FILE *f); int saveregions(FILE *f);
int saveworlddata(FILE *f); int saveworlddata(FILE *f);
int showhiscores(lifeform_t *lf, int min, int max); int showhiscores(lifeform_t *lf, int min, int max);

13
spell.c
View File

@ -231,7 +231,8 @@ int abilityeffects(lifeform_t *user, enum OBTYPE abilid, cell_t *targcell, lifef
getobname(stairs, obname, 1); getobname(stairs, obname, 1);
sprintf(buf, "How will you check %s", obname); sprintf(buf, "How will you check %s", obname);
initprompt(&prompt, buf); initprompt(&prompt, buf);
if ((getskill(user, SK_LISTEN) >= PR_ADEPT) && !isdeaf(user)) { if ( ((getskill(user, SK_LISTEN) >= PR_ADEPT) && !isdeaf(user)) ||
hasequippedobid(user->pack, OT_AMU_THIEF)) {
addchoice(&prompt, 'l', "Listen for sounds", NULL, NULL, NULL); addchoice(&prompt, 'l', "Listen for sounds", NULL, NULL, NULL);
} }
if ((getskill(user, SK_PERCEPTION)) && !isblind(user)) { if ((getskill(user, SK_PERCEPTION)) && !isblind(user)) {
@ -612,8 +613,9 @@ int abilityeffects(lifeform_t *user, enum OBTYPE abilid, cell_t *targcell, lifef
} }
if (corpse) { if (corpse) {
getobname(corpse, obname, o->amt);
if (isimmuneto(corpse->flags, DT_FIRE, B_FALSE)) { if (isimmuneto(corpse->flags, DT_FIRE, B_FALSE)) {
msg("You attempt to cook %s, but it won't heat up."); msg("You attempt to cook %s, but it won't heat up.", obname);
cooktime += getactspeed(user); cooktime += getactspeed(user);
ncooked++; ncooked++;
} else { } else {
@ -4407,7 +4409,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
} }
} else { } else {
if (haslos(player, targcell)) { if (haslos(player, targcell)) {
msg("A bolt of electricity shoots out of the air!"); msg("A bolt of electricity arcs out of the air!");
} }
} }
@ -7764,7 +7766,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
msg("A glob of venom hits %s.",lfname); msg("A glob of venom hits %s.",lfname);
} }
if (!isimmuneto(target->flags, DT_POISON, B_FALSE)) { if (!isimmuneto(target->flags, DT_POISON, B_FALSE)) {
poison(target, power*3, P_VENOM, (power/4)+1, "a glob of venom"); poison(target, power*3, P_VENOM, (power/4)+1, "a glob of venom", caster ? caster->race->id : R_NONE);
} }
} }
} }
@ -12274,6 +12276,9 @@ int getworkablematerials(lifeform_t *lf, enum SKILL skid , enum MATERIAL *repair
repairablemats[*nmats] = MT_LEATHER; repairablemats[*nmats] = MT_LEATHER;
cutoffpct[*nmats] = cutoff; cutoffpct[*nmats] = cutoff;
(*nmats)++; (*nmats)++;
repairablemats[*nmats] = MT_FLESH;
cutoffpct[*nmats] = cutoff;
(*nmats)++;
nworkable += 2; nworkable += 2;
} }
} }

5
text.c
View File

@ -1111,7 +1111,7 @@ char *getkillverb(lifeform_t *victim, object_t *wep, enum DAMTYPE damtype, int d
int canbehead = B_TRUE; int canbehead = B_TRUE;
if (wep) { if (wep) {
sk = getobskill(wep->flags); sk = getobskill(wep->flags);
if (sk->id == SK_SHORTBLADES) { if (sk && (sk->id == SK_SHORTBLADES)) {
// short blades can't behead/bisect. // short blades can't behead/bisect.
canbehead = B_FALSE; canbehead = B_FALSE;
} }
@ -1203,6 +1203,9 @@ char *getinjurydesc(enum BODYPART where, enum DAMTYPE dt) {
return ""; return "";
} }
// IMPORTANT:
// all strings returned here must also be defined as an obmod altprefix!
//
char *getobmodprefix(object_t *o, obmod_t *om) { char *getobmodprefix(object_t *o, obmod_t *om) {
// masterwork/shoddy doors have names based on material. // masterwork/shoddy doors have names based on material.
if (isdoor(o, NULL)) { if (isdoor(o, NULL)) {

68
vault.c
View File

@ -1498,6 +1498,7 @@ void killvault(vault_t *v) {
if (!v) return; if (!v) return;
if (v->id) free(v->id); if (v->id) free(v->id);
if (v->filename) free(v->filename);
while (v->legend) { while (v->legend) {
killlegend(v->legend); killlegend(v->legend);
} }
@ -1524,19 +1525,19 @@ void killvault(vault_t *v) {
} }
} }
vault_t *loadvault(char *filename) { vault_t *loadvault(char *dir, char *filename) {
FILE *f; FILE *f;
vault_t *v; vault_t *v;
char line[BUFLEN]; char line[BUFLEN];
char fullname[BUFLEN]; char fullname[BUFLEN];
int goterrors = B_FALSE; int goterrors = B_FALSE;
snprintf(fullname, BUFLEN, "%s/%s", VAULTDIR, filename); snprintf(fullname, BUFLEN, "%s/%s", dir, filename);
dblog("Loading vault file '%s'", fullname); dblog("Loading vault file '%s'", fullname);
f = fopen(fullname,"rt"); f = fopen(fullname,"rt");
if (!f) { if (!f) {
dblog("error opening vault file '%s'", fullname); dblog("error opening vault file '%s/%s'", dir,fullname);
return NULL; return NULL;
} }
@ -1545,7 +1546,7 @@ vault_t *loadvault(char *filename) {
dblog("error allocating new vault"); dblog("error allocating new vault");
return NULL; return NULL;
} }
v->filename = strdup(filename); asprintf(&v->filename, "%s/%s",dir,filename);
v->state = VS_NOID; v->state = VS_NOID;
@ -1576,34 +1577,45 @@ vault_t *loadvault(char *filename) {
} }
void loadvaults(void) { void loadvaults(void) {
int nvaults = 0; char *vaultdir[2];
DIR *dir; int i;
struct dirent *ent;
// //
dir = opendir(VAULTDIR); vaultdir[0] = strdup(VAULTDIR);
if (!dir) { vaultdir[1] = strdup(BONESDIR);
dblog("Could not open vault directory '%s'",VAULTDIR); for (i = 0; i < 2; i++) {
return; int nvaults = 0;
} DIR *dir;
nvaults = 0; struct dirent *ent;
while ((ent = readdir(dir)) != NULL) { dir = opendir(vaultdir[i]);
char *p; if (!dir) {
// ie. start of 4 char prefix dblog("Could not open vault directory '%s'",vaultdir[i]);
p = ent->d_name + strlen(ent->d_name) - 4; return;
if (!strcmp(p, ".vlt") ) { }
if (loadvault(ent->d_name)) { nvaults = 0;
nvaults++; while ((ent = readdir(dir)) != NULL) {
} else { char *p;
dblog("Errors found in vaultfile %s - loading cancelled.",ent->d_name); // ie. start of 4 char prefix
p = ent->d_name + strlen(ent->d_name) - 4;
if (!strcmp(p, ".vlt") ) {
if (loadvault(vaultdir[i], ent->d_name)) {
nvaults++;
} else {
dblog("Errors found in vaultfile %s - loading cancelled.",ent->d_name);
}
} }
} }
closedir(dir);
if (nvaults) {
dblog("Successfully loaded %d %s definition%s.", nvaults,
(i == 0) ? "fixed vault" : "bones vault",
(nvaults == 1) ? "" : "s");
} else {
dblog("No (valid) vault definitions found.", nvaults);
}
} }
closedir(dir); free(vaultdir[0]);
if (nvaults) { free(vaultdir[1]);
dblog("Successfully loaded %d vault definition%s.", nvaults,(nvaults == 1) ? "" : "s");
} else {
dblog("No (valid) vault definitions found.", nvaults);
}
// debugging // debugging
//dumpvault("jimbos_lair", 0); //dumpvault("jimbos_lair", 0);

View File

@ -23,7 +23,7 @@ char getvaultchar(vault_t *v, int x, int y, int rotation, int *map0offset);
vault_t *getvaulttype(map_t *m); vault_t *getvaulttype(map_t *m);
int handleline(vault_t *v, char *line); int handleline(vault_t *v, char *line);
void killvault(vault_t *v); void killvault(vault_t *v);
vault_t *loadvault(char *filename); vault_t *loadvault(char *dir, char *filename);
void loadvaults(void); void loadvaults(void);
void rotatecoords(int *x, int *y, vault_t *v, int rotation, int *retoffset); void rotatecoords(int *x, int *y, vault_t *v, int rotation, int *retoffset);
int vaultthingok(enum VAULTTHING vt, char *what); int vaultthingok(enum VAULTTHING vt, char *what);