- [+] gunpoweder should be unstable - explode on ANY dam.

- [+] mosnter facing being set to -. debug with forced break. fixed.
- [+] fix territorial monster crash.
- [+] CRASH in celldangerous when undead avoiding holy circles.
- [+] alternate text for 'ineffectually'
- [+] need an announce for bjorn's ecstatic ability (ehavy blow)
- [+] whenever you gain a new godbonus, give you a grace period
- [+] change selectweapon so i can specify valid choices
    - [+] have multiple F_SELECTWEAPON flags, v0 = object. (or text?)
    - [+] getflags() then pick from these.
- [+] hwen gunpowder inside a barrel explodes:
    - [+] say "the barrel explodes", since that's what you can see
    - [+] explosion should actually work!!!
- [+] lethargy should drain lots more stamina now that exhaustion
      doesn't prevent attacks
- [+] thrown knifes not doing enough damage.
    - [+] fireat(): dam = throwdam(2) + speed(2)
          dealing 3 damage
    - [+] maybe increase throwdam to 4.
    - [+] check otehr throwmissiles too
This commit is contained in:
Rob Pearce 2012-11-25 19:57:49 +00:00
parent 5b28b3571e
commit d39e7ea7c1
12 changed files with 172 additions and 68 deletions

2
ai.c
View File

@ -2347,7 +2347,7 @@ int aimovetotargetcell(lifeform_t *lf, flag_t *f) {
} }
killflag(f); killflag(f);
} else { } else {
if (!turned) { if (!turned && (c != lf->cell)) {
turntoface(lf, c); turntoface(lf, c);
} }
} }

View File

@ -670,6 +670,10 @@ int attackcell(lifeform_t *lf, cell_t *c, int force) {
attacksdone = maxattacks; attacksdone = maxattacks;
break; break;
} }
// no longer adjacent?
if (!isadjacent(lf->cell, victim->cell) || isdead(victim)) {
break;
}
// vicitm started to flee? // vicitm started to flee?
if (isplayer(lf)) { if (isplayer(lf)) {
if (!fleeflag && isfleeingfrom(victim, lf)) { if (!fleeflag && isfleeingfrom(victim, lf)) {
@ -2047,6 +2051,11 @@ int attackob(lifeform_t *lf, object_t *o, object_t *wep, flag_t *damflag) {
} }
// damstring should never be used... // damstring should never be used...
shatter(oo, B_FALSE, "shattering damage", lf); shatter(oo, B_FALSE, "shattering damage", lf);
} else {
int obdam;
obdam = dam[0] / 2;
limit(&obdam, 1, NA);
takedamage(oo, obdam, DT_BASH, NULL);
} }
} }
} }
@ -3015,6 +3024,7 @@ int rolltohit(lifeform_t *lf, lifeform_t *victim, object_t *wep, int *critical,
int db = B_FALSE; int db = B_FALSE;
char lfname[BUFLEN]; char lfname[BUFLEN];
char vicname[BUFLEN]; char vicname[BUFLEN];
int critpossible = B_TRUE;
if (lfhasflag(lf, F_DEBUG)) db = B_TRUE; if (lfhasflag(lf, F_DEBUG)) db = B_TRUE;
real_getlfname(lf, lfname, NULL, B_SHOWALL, B_CURRACE); real_getlfname(lf, lfname, NULL, B_SHOWALL, B_CURRACE);
@ -3027,6 +3037,12 @@ int rolltohit(lifeform_t *lf, lifeform_t *victim, object_t *wep, int *critical,
if (fumble) *fumble = B_FALSE; if (fumble) *fumble = B_FALSE;
if (missby) *missby = 0; if (missby) *missby = 0;
if (lf && lfhasflag(lf, F_NOGIVECRITS)) {
critpossible = B_FALSE;
} else if (victim && lfhasflag(victim, F_NOTAKECRITS)) {
critpossible = B_FALSE;
}
// anticipate action spell? // anticipate action spell?
if (lfhasflagval(victim, F_ANTICIPATE, lf->id, NA, NA, NULL)) { if (lfhasflagval(victim, F_ANTICIPATE, lf->id, NA, NA, NULL)) {
if (db) dblog("%s: victim has anticipate action - MISS.", lfname); if (db) dblog("%s: victim has anticipate action - MISS.", lfname);
@ -3045,7 +3061,7 @@ int rolltohit(lifeform_t *lf, lifeform_t *victim, object_t *wep, int *critical,
} }
gothit = B_TRUE; gothit = B_TRUE;
if (db) dblog("%s: we have truestrike - HIT.", lfname); if (db) dblog("%s: we have truestrike - HIT.", lfname);
} else if (critical && *critical) { } else if (critical && *critical && critpossible) {
// critical already set = forced critical // critical already set = forced critical
gothit = B_TRUE; gothit = B_TRUE;
if (db) dblog("%s: pre-determined critical - HIT.", lfname); if (db) dblog("%s: pre-determined critical - HIT.", lfname);
@ -3169,14 +3185,7 @@ int rolltohit(lifeform_t *lf, lifeform_t *victim, object_t *wep, int *critical,
} }
// critical chance // critical chance
if (critical && gothit) { if (critical && gothit && critpossible) {
int critpossible = B_TRUE;
if (lf && lfhasflag(lf, F_NOGIVECRITS)) {
critpossible = B_FALSE;
} else if (victim && lfhasflag(victim, F_NOTAKECRITS)) {
critpossible = B_FALSE;
}
if (critpossible) {
if (lfhasflag(lf, F_AIMEDSTRIKE)) { if (lfhasflag(lf, F_AIMEDSTRIKE)) {
*critical = 1; *critical = 1;
} else { } else {
@ -3194,7 +3203,6 @@ int rolltohit(lifeform_t *lf, lifeform_t *victim, object_t *wep, int *critical,
if (critroll <= getcritchance(lf, wep,victim)) *critical = 1; if (critroll <= getcritchance(lf, wep,victim)) *critical = 1;
} }
} }
}
if (fumble && !gothit) { if (fumble && !gothit) {
if (isexhausted(lf) || (baseacc <= 60) || !getweaponskill(lf, wep)) { if (isexhausted(lf) || (baseacc <= 60) || !getweaponskill(lf, wep)) {

39
data.c
View File

@ -1011,7 +1011,10 @@ void initjobs(void) {
// abilities // abilities
addflag(lastjob->flags, F_MPDICE, 1, -1, NA, NULL); addflag(lastjob->flags, F_MPDICE, 1, -1, NA, NULL);
addflag(lastjob->flags, F_MAXHPMOD, 120, NA, NA, NULL); addflag(lastjob->flags, F_MAXHPMOD, 120, NA, NA, NULL);
addflag(lastjob->flags, F_SELECTWEAPON, B_TRUE, NA, NA, NULL); addflag(lastjob->flags, F_SELECTWEAPON, OT_LONGSWORD, NA, NA, NULL);
addflag(lastjob->flags, F_SELECTWEAPON, OT_SHORTSWORD, NA, NA, NULL);
addflag(lastjob->flags, F_SELECTWEAPON, OT_SPEAR, NA, NA, NULL);
addflag(lastjob->flags, F_SELECTWEAPON, OT_MACE, NA, NA, NULL);
addflag(lastjob->flags, F_LEVABIL, 3, OT_A_HEAVYBLOW, NA, NULL); addflag(lastjob->flags, F_LEVABIL, 3, OT_A_HEAVYBLOW, NA, NULL);
addflag(lastjob->flags, F_LEVABIL, 4, OT_A_WARCRY, NA, NULL); addflag(lastjob->flags, F_LEVABIL, 4, OT_A_WARCRY, NA, NULL);
addflag(lastjob->flags, F_LEVABIL, 5, OT_A_CHARGE, NA, NULL); addflag(lastjob->flags, F_LEVABIL, 5, OT_A_CHARGE, NA, NULL);
@ -1123,7 +1126,8 @@ void initjobs(void) {
addflag(lastjob->flags, F_CANLEARN, SK_SS_WILD, PR_ADEPT, NA, NULL); addflag(lastjob->flags, F_CANLEARN, SK_SS_WILD, PR_ADEPT, NA, NULL);
// abilities // abilities
addflag(lastjob->flags, F_MPDICE, 1, 0, NA, NULL); addflag(lastjob->flags, F_MPDICE, 1, 0, NA, NULL);
addflag(lastjob->flags, F_SELECTWEAPON, B_TRUE, NA, NA, NULL); addflag(lastjob->flags, F_SELECTWEAPON, OT_LONGSWORD, NA, NA, NULL);
addflag(lastjob->flags, F_SELECTWEAPON, OT_SHORTSWORD, NA, NA, NULL);
addflag(lastjob->flags, F_HIRABLE, B_TRUE, NA, NA, NULL); addflag(lastjob->flags, F_HIRABLE, B_TRUE, NA, NA, NULL);
addjob(J_PALADIN, "Paladin", "Paladins are holy warriors dedicated to the Goddess of Life. They gain powerful abilities and have access to healing magics, but these powers are dependant upon their goddess' approval. Paladins must take holy vows to only ever use battle equipiment which has first been blessed.", JC_FIGHTERMAGE); addjob(J_PALADIN, "Paladin", "Paladins are holy warriors dedicated to the Goddess of Life. They gain powerful abilities and have access to healing magics, but these powers are dependant upon their goddess' approval. Paladins must take holy vows to only ever use battle equipiment which has first been blessed.", JC_FIGHTERMAGE);
@ -1183,7 +1187,8 @@ void initjobs(void) {
// abilities // abilities
addflag(lastjob->flags, F_MPDICE, 1, -1, NA, NULL); addflag(lastjob->flags, F_MPDICE, 1, -1, NA, NULL);
addflag(lastjob->flags, F_MAXHPMOD, 120, NA, NA, NULL); addflag(lastjob->flags, F_MAXHPMOD, 120, NA, NA, NULL);
addflag(lastjob->flags, F_SELECTWEAPON, B_TRUE, NA, NA, NULL); addflag(lastjob->flags, F_SELECTWEAPON, OT_LONGSWORD, NA, NA, NULL);
addflag(lastjob->flags, F_SELECTWEAPON, OT_FLAIL, NA, NA, NULL);
addflag(lastjob->flags, F_HIRABLE, B_TRUE, NA, NA, NULL); addflag(lastjob->flags, F_HIRABLE, B_TRUE, NA, NA, NULL);
// can permenantly turn undead for 0 power. // can permenantly turn undead for 0 power.
addflag(lastjob->flags, F_CANWILL, OT_S_TURNUNDEAD, NA, NA, NULL); addflag(lastjob->flags, F_CANWILL, OT_S_TURNUNDEAD, NA, NA, NULL);
@ -2974,7 +2979,7 @@ void initobjects(void) {
addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_DAMAGABLE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_DAMAGABLE, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_THROWMISSILE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_THROWMISSILE, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_MISSILEDAM, NA, NA, NA, "1"); addflag(lastot->flags, F_MISSILEDAM, NA, NA, NA, "2");
addot(OT_BRICK, "brick", "A heavy brick.", MT_STONE, 3, OC_ROCK, SZ_TINY); addot(OT_BRICK, "brick", "A heavy brick.", MT_STONE, 3, OC_ROCK, SZ_TINY);
addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, ""); addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, "");
addflag(lastot->flags, F_RARITY, H_DUNGEON, NA, RR_RARE, ""); addflag(lastot->flags, F_RARITY, H_DUNGEON, NA, RR_RARE, "");
@ -2984,7 +2989,7 @@ void initobjects(void) {
addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_DAMAGABLE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_DAMAGABLE, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_THROWMISSILE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_THROWMISSILE, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_MISSILEDAM, NA, NA, NA, "3"); addflag(lastot->flags, F_MISSILEDAM, NA, NA, NA, "4");
// gems // gems
addot(OT_AQUAMARINE, "aquamarine stone", "An aqua-coloured gemstone.", MT_STONE, 0.2, OC_ROCK, SZ_TINY); addot(OT_AQUAMARINE, "aquamarine stone", "An aqua-coloured gemstone.", MT_STONE, 0.2, OC_ROCK, SZ_TINY);
@ -5997,14 +6002,14 @@ void initobjects(void) {
addflag(lastot->flags, F_STARTOBCLASS, 50, OC_FOOD, NA, NULL); addflag(lastot->flags, F_STARTOBCLASS, 50, OC_FOOD, NA, NULL);
addflag(lastot->flags, F_STARTOBCLASS, 50, OC_FOOD, NA, NULL); addflag(lastot->flags, F_STARTOBCLASS, 50, OC_FOOD, NA, NULL);
addot(OT_GUNPOWDER, "pile of gunpowder", "A black metallic powder.", MT_METAL, 0.5, OC_TOOLS, SZ_TINY); addot(OT_GUNPOWDER, "pile of gunpowder", "A black metallic powder. Said to be highly unstable.", MT_METAL, 0.5, OC_TOOLS, SZ_TINY);
addflag(lastot->flags, F_HASHIDDENNAME, B_TRUE, NA, NA, "pile of black powder"); addflag(lastot->flags, F_HASHIDDENNAME, B_TRUE, NA, NA, "pile of black powder");
addflag(lastot->flags, F_GLYPH, NA, ',', NA, NULL); addflag(lastot->flags, F_GLYPH, NA, ',', NA, NULL);
addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_RARITY, H_ALL, 65, NA, NULL); addflag(lastot->flags, F_RARITY, H_ALL, 65, NA, NULL);
addflag(lastot->flags, F_VALUE, 25, NA, NA, NULL); addflag(lastot->flags, F_VALUE, 25, NA, NA, NULL);
addflag(lastot->flags, F_DAMAGABLE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_DAMAGABLE, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_EXPLODEONDAM, DT_FIRE, NA, NA, "8d2"); addflag(lastot->flags, F_EXPLODEONDAM, NA, NA, NA, "8d2");
addflag(lastot->flags, F_DTVULN, DT_FIRE, NA, NA, "2d6"); addflag(lastot->flags, F_DTVULN, DT_FIRE, NA, NA, "2d6");
addflag(lastot->flags, F_FLAMMABLE, 3, NA, NA, NULL); addflag(lastot->flags, F_FLAMMABLE, 3, NA, NA, NULL);
addflag(lastot->flags, F_POWDER, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_POWDER, B_TRUE, NA, NA, NULL);
@ -8635,7 +8640,7 @@ void initobjects(void) {
addot(OT_DART, "dart", "A small, sharp projectile weapon.", MT_WOOD, 0.5, OC_MISSILE, SZ_SMALL); addot(OT_DART, "dart", "A small, sharp projectile weapon.", MT_WOOD, 0.5, OC_MISSILE, SZ_SMALL);
addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, ""); addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, "");
addflag(lastot->flags, F_THROWMISSILE, B_TRUE, NA, NA, ""); addflag(lastot->flags, F_THROWMISSILE, B_TRUE, NA, NA, "");
addflag(lastot->flags, F_MISSILEDAM, NA, NA, NA, "1"); addflag(lastot->flags, F_MISSILEDAM, NA, NA, NA, "2");
addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, NA, ""); addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, NA, "");
addflag(lastot->flags, F_RARITY, H_CAVE, 100, NA, ""); addflag(lastot->flags, F_RARITY, H_CAVE, 100, NA, "");
addflag(lastot->flags, F_NUMAPPEAR, 1, 3, NA, ""); addflag(lastot->flags, F_NUMAPPEAR, 1, 3, NA, "");
@ -8646,7 +8651,7 @@ void initobjects(void) {
addot(OT_KNIFETHROWING, "throwing knife", "A weighted knife, designed to be thrown.", MT_METAL, 1.5, OC_MISSILE, SZ_SMALL); addot(OT_KNIFETHROWING, "throwing knife", "A weighted knife, designed to be thrown.", MT_METAL, 1.5, OC_MISSILE, SZ_SMALL);
addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, ""); addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, "");
addflag(lastot->flags, F_THROWMISSILE, B_TRUE, NA, NA, ""); addflag(lastot->flags, F_THROWMISSILE, B_TRUE, NA, NA, "");
addflag(lastot->flags, F_MISSILEDAM, NA, NA, NA, "2"); addflag(lastot->flags, F_MISSILEDAM, NA, NA, NA, "5");
addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, NA, ""); addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, NA, "");
addflag(lastot->flags, F_RARITY, H_CAVE, 100, NA, ""); addflag(lastot->flags, F_RARITY, H_CAVE, 100, NA, "");
addflag(lastot->flags, F_NUMAPPEAR, 1, 3, NA, ""); addflag(lastot->flags, F_NUMAPPEAR, 1, 3, NA, "");
@ -8655,7 +8660,7 @@ void initobjects(void) {
addot(OT_DARTNANO, "nanodart", "A metal dart with a nanofibre point. Capable of piercing most armour.", MT_METAL, 0.5, OC_MISSILE, SZ_TINY); addot(OT_DARTNANO, "nanodart", "A metal dart with a nanofibre point. Capable of piercing most armour.", MT_METAL, 0.5, OC_MISSILE, SZ_TINY);
addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, ""); addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, "");
addflag(lastot->flags, F_THROWMISSILE, B_TRUE, NA, NA, ""); addflag(lastot->flags, F_THROWMISSILE, B_TRUE, NA, NA, "");
addflag(lastot->flags, F_MISSILEDAM, NA, NA, NA, "2"); addflag(lastot->flags, F_MISSILEDAM, NA, NA, NA, "5");
addflag(lastot->flags, F_ARMOURPIERCE, 10, NA, NA, ""); addflag(lastot->flags, F_ARMOURPIERCE, 10, NA, NA, "");
addflag(lastot->flags, F_RARITY, H_DUNGEON, 67, NA, ""); addflag(lastot->flags, F_RARITY, H_DUNGEON, 67, NA, "");
addflag(lastot->flags, F_RARITY, H_CAVE, 67, NA, ""); addflag(lastot->flags, F_RARITY, H_CAVE, 67, NA, "");
@ -8712,7 +8717,7 @@ void initobjects(void) {
addot(OT_JAVELIN, "javelin", "A long, sharp missile weapon.", MT_METAL, 4, OC_MISSILE, SZ_MEDIUM); addot(OT_JAVELIN, "javelin", "A long, sharp missile weapon.", MT_METAL, 4, OC_MISSILE, SZ_MEDIUM);
addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, ""); addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, "");
addflag(lastot->flags, F_THROWMISSILE, B_TRUE, NA, NA, ""); addflag(lastot->flags, F_THROWMISSILE, B_TRUE, NA, NA, "");
addflag(lastot->flags, F_MISSILEDAM, NA, NA, NA, "3"); addflag(lastot->flags, F_MISSILEDAM, NA, NA, NA, "6");
addflag(lastot->flags, F_RARITY, H_DUNGEON, 90, NA, ""); addflag(lastot->flags, F_RARITY, H_DUNGEON, 90, NA, "");
addflag(lastot->flags, F_RARITY, H_CAVE, 90, NA, ""); addflag(lastot->flags, F_RARITY, H_CAVE, 90, NA, "");
addflag(lastot->flags, F_NUMAPPEAR, 1, 2, NA, ""); addflag(lastot->flags, F_NUMAPPEAR, 1, 2, NA, "");
@ -8721,7 +8726,7 @@ void initobjects(void) {
addot(OT_JAVELINLT, "lightning javelin", "A long, sharp missile weapon which transforms into a bolt of lightning when thrown.", MT_METAL, 4, OC_MISSILE, SZ_MEDIUM); addot(OT_JAVELINLT, "lightning javelin", "A long, sharp missile weapon which transforms into a bolt of lightning when thrown.", MT_METAL, 4, OC_MISSILE, SZ_MEDIUM);
addflag(lastot->flags, F_THROWMISSILE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_THROWMISSILE, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_MISSILEDAM, NA, NA, NA, "3"); addflag(lastot->flags, F_MISSILEDAM, NA, NA, NA, "6");
addflag(lastot->flags, F_RARITY, H_ALL, NA, RR_RARE, NULL); addflag(lastot->flags, F_RARITY, H_ALL, NA, RR_RARE, NULL);
addflag(lastot->flags, F_NUMAPPEAR, 1, 2, NA, NULL); addflag(lastot->flags, F_NUMAPPEAR, 1, 2, NA, NULL);
addflag(lastot->flags, F_OBHP, 5, 5, NA, NULL); addflag(lastot->flags, F_OBHP, 5, 5, NA, NULL);
@ -8735,7 +8740,7 @@ void initobjects(void) {
addflag(lastot->flags, F_RARITY, H_CAVE, 85, NA, ""); addflag(lastot->flags, F_RARITY, H_CAVE, 85, NA, "");
addflag(lastot->flags, F_NUMAPPEAR, 1, 10, NA, ""); addflag(lastot->flags, F_NUMAPPEAR, 1, 10, NA, "");
addflag(lastot->flags, F_DAMAGABLE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_DAMAGABLE, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_MISSILEDAM, NA, NA, NA, "3"); addflag(lastot->flags, F_MISSILEDAM, NA, NA, NA, "4");
addflag(lastot->flags, F_OBHP, 2, 2, NA, NULL); addflag(lastot->flags, F_OBHP, 2, 2, NA, NULL);
addflag(lastot->flags, F_NOOBDIETEXT, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_NOOBDIETEXT, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_CANHAVEOBMOD, OM_POISONED, 17, NA, NULL); addflag(lastot->flags, F_CANHAVEOBMOD, OM_POISONED, 17, NA, NULL);
@ -8746,7 +8751,7 @@ void initobjects(void) {
addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, ""); addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, "");
addflag(lastot->flags, F_RARITY, H_DUNGEON, 80, NA, ""); addflag(lastot->flags, F_RARITY, H_DUNGEON, 80, NA, "");
addflag(lastot->flags, F_RARITY, H_CAVE, 80, NA, ""); addflag(lastot->flags, F_RARITY, H_CAVE, 80, NA, "");
addflag(lastot->flags, F_MISSILEDAM, NA, NA, NA, "4"); addflag(lastot->flags, F_MISSILEDAM, NA, NA, NA, "6");
addflag(lastot->flags, F_NUMAPPEAR, 1, 10, NA, ""); addflag(lastot->flags, F_NUMAPPEAR, 1, 10, NA, "");
addflag(lastot->flags, F_NOOBDIETEXT, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_NOOBDIETEXT, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_CANHAVEOBMOD, OM_POISONED, 17, NA, NULL); addflag(lastot->flags, F_CANHAVEOBMOD, OM_POISONED, 17, NA, NULL);
@ -8761,7 +8766,7 @@ void initobjects(void) {
addflag(lastot->flags, F_DAMAGABLE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_DAMAGABLE, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_MISSILEALWAYSDIES, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_MISSILEALWAYSDIES, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_OBHP, 1, 1, NA, NULL); addflag(lastot->flags, F_OBHP, 1, 1, NA, NULL);
addflag(lastot->flags, F_MISSILEDAM, NA, NA, NA, "4"); addflag(lastot->flags, F_MISSILEDAM, NA, NA, NA, "6");
addflag(lastot->flags, F_NOOBDIETEXT, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_NOOBDIETEXT, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_CANBEDIFFMAT, MT_SILVER, 10, NA, NULL); addflag(lastot->flags, F_CANBEDIFFMAT, MT_SILVER, 10, NA, NULL);
@ -8780,7 +8785,7 @@ void initobjects(void) {
addot(OT_SHURIKEN, "shuriken", "A sharpened star-shaped piece of metal, made for throwing.", MT_METAL, 1, OC_MISSILE, SZ_SMALL); addot(OT_SHURIKEN, "shuriken", "A sharpened star-shaped piece of metal, made for throwing.", MT_METAL, 1, OC_MISSILE, SZ_SMALL);
addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, ""); addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, "");
addflag(lastot->flags, F_THROWMISSILE, B_TRUE, NA, NA, ""); addflag(lastot->flags, F_THROWMISSILE, B_TRUE, NA, NA, "");
addflag(lastot->flags, F_MISSILEDAM, NA, NA, NA, "4"); addflag(lastot->flags, F_MISSILEDAM, NA, NA, NA, "6");
addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, NA, ""); addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, NA, "");
addflag(lastot->flags, F_RARITY, H_CAVE, 100, NA, ""); addflag(lastot->flags, F_RARITY, H_CAVE, 100, NA, "");
addflag(lastot->flags, F_NUMAPPEAR, 1, 3, NA, ""); addflag(lastot->flags, F_NUMAPPEAR, 1, 3, NA, "");
@ -8833,7 +8838,7 @@ void initobjects(void) {
addflag(lastot->flags, F_ARMOURPIERCE, 4, NA, NA, ""); addflag(lastot->flags, F_ARMOURPIERCE, 4, NA, NA, "");
addflag(lastot->flags, F_DAM, DT_CHOP, 7, NA, NULL); addflag(lastot->flags, F_DAM, DT_CHOP, 7, NA, NULL);
addflag(lastot->flags, F_ACCURACY, 70, NA, NA, NULL); addflag(lastot->flags, F_ACCURACY, 70, NA, NA, NULL);
addflag(lastot->flags, F_MISSILEDAM, NA, NA, NA, "5"); addflag(lastot->flags, F_MISSILEDAM, NA, NA, NA, "7");
addflag(lastot->flags, F_THROWMISSILE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_THROWMISSILE, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_USESSKILL, SK_AXES, NA, NA, NULL); addflag(lastot->flags, F_USESSKILL, SK_AXES, NA, NA, NULL);
addflag(lastot->flags, F_ATTREQ, A_STR, 35, 55, "5"); addflag(lastot->flags, F_ATTREQ, A_STR, 35, 55, "5");

Binary file not shown.

7
defs.h
View File

@ -3331,6 +3331,9 @@ enum FLAG {
// can pick what alignment they want to be. // can pick what alignment they want to be.
// text shows the choices ("g", "n" or "e") // text shows the choices ("g", "n" or "e")
F_PIETY, // for god lifeforms - tracks player's piety with them F_PIETY, // for god lifeforms - tracks player's piety with them
F_NOPIETYLOSS, // piety for god v0 cannot be lowered. used
// to give a 'grace period'. NOTE: this flag goes
// on the _player_ ,not the god lfs.
F_AUTOTANGLE, // v0% chance to auto entangle on hit. spellpower=v1 F_AUTOTANGLE, // v0% chance to auto entangle on hit. spellpower=v1
F_PLANTFRIEND, // for player druids - makes plants friendly. F_PLANTFRIEND, // for player druids - makes plants friendly.
F_HOMEMAP, // which map did this lf get created on? F_HOMEMAP, // which map did this lf get created on?
@ -4086,6 +4089,7 @@ enum FLAG {
// for jobs (job flags) // for jobs (job flags)
F_SELECTWEAPON, // this job gets to pick their starting weapon F_SELECTWEAPON, // this job gets to pick their starting weapon
// and obtype v0 is one of the options.
F_NOSELECTWEAPON, // override F_SELECTWEAPON from job F_NOSELECTWEAPON, // override F_SELECTWEAPON from job
F_NOPLAYER, // players can't pick this job F_NOPLAYER, // players can't pick this job
F_HASPET, // this job starts with a pet of race f->text F_HASPET, // this job starts with a pet of race f->text
@ -4923,6 +4927,9 @@ typedef struct lifeform_s {
// set to TRUE after lf has being created // set to TRUE after lf has being created
int born; int born;
// not saved - don't ever recalc this lf's los
int loslock;
// debugging // debugging
int redraws; // # actual screen redraws during this lf's turn. int redraws; // # actual screen redraws during this lf's turn.

35
god.c
View File

@ -946,6 +946,7 @@ void givegodbonus(enum RACE rid, flag_t *bf) {
// increment piety so that it doesn't keep bouncing around the border. // increment piety so that it doesn't keep bouncing around the border.
modpiety(rid, PIETYPRAYLOSS); modpiety(rid, PIETYPRAYLOSS);
addtempflag(player->flags, F_NOPIETYLOSS, rid, NA, NA, NULL,rnd(50,100));
// parse regular rags // parse regular rags
parsegodbonusargs(bf, &bonuslev, &bonusid, &arg, targ); parsegodbonusargs(bf, &bonuslev, &bonusid, &arg, targ);
@ -976,6 +977,8 @@ void givegodbonus(enum RACE rid, flag_t *bf) {
case SC_SEARCH: godsay(rid, B_FALSE, "That which is hidden shall be revealed!"); break; case SC_SEARCH: godsay(rid, B_FALSE, "That which is hidden shall be revealed!"); break;
default: break; default: break;
} }
} else if (arg == F_HEAVYBLOW) {
godsay(rid, B_FALSE, "Foes shall be driven away by your blows!"); break;
} }
} }
break; break;
@ -2032,6 +2035,7 @@ int prayto(lifeform_t *lf, lifeform_t *god) {
char assisttext[BUFLEN]; char assisttext[BUFLEN];
enum PIETYLEV plev; enum PIETYLEV plev;
int newgod; int newgod;
enum ALIGNMENT changealign = AL_NONE;
taketime(lf, getactspeed(lf)); taketime(lf, getactspeed(lf));
@ -2069,6 +2073,30 @@ int prayto(lifeform_t *lf, lifeform_t *god) {
// you get some help... // you get some help...
plev = getpietylev(god->race->id, NULL, NULL); plev = getpietylev(god->race->id, NULL, NULL);
if ((god->race->id == R_GODDEATH) && (getalignment(player) == AL_GOOD)) {
char yn;
godsay(god->race->id, B_TRUE, "You really wish to walk the path of evil, fleshling?");
yn = askchar("Change alignment to Evil?", "yn?", "n", B_TRUE, B_FALSE);
if (yn == 'y') {
godsay(god->race->id, B_FALSE, "So be it, foolish mortal.");
changealign = AL_EVIL;
} else {
godsay(god->race->id, B_FALSE, "Coward!");
return B_FALSE;
}
} else if ((god->race->id == R_GODLIFE) && (getalignment(player) == AL_EVIL)) {
char yn;
godsay(god->race->id, B_TRUE, "Are you sure you wish to forsake your evil ways?");
yn = askchar("Change alignment to Good?", "yn?", "n", B_TRUE, B_FALSE);
if (yn == 'y') {
godsay(god->race->id, B_FALSE, "Be welcome, then!");
changealign = AL_GOOD;
} else {
godsay(god->race->id, B_FALSE, "If you reconsider, pray to me.");
return B_FALSE;
}
}
if (!prayedtoany()) { if (!prayedtoany()) {
// special msg for first time. // special msg for first time.
switch (god->race->id) { switch (god->race->id) {
@ -2141,6 +2169,13 @@ int prayto(lifeform_t *lf, lifeform_t *god) {
} }
godsay(god->race->id, B_TRUE, assisttext); godsay(god->race->id, B_TRUE, assisttext);
if (changealign != AL_NONE) {
setalignment(player, changealign);
msg("^gYour alignment has changed to %s!", getalignmentname(changealign));
more();
}
// at this point, remember that we have now prayed to // at this point, remember that we have now prayed to
// this god. ie. player is expected to follow the god's rules. // this god. ie. player is expected to follow the god's rules.

4
io.c
View File

@ -13371,6 +13371,10 @@ void showlfstats(lifeform_t *lf, int showall) {
mvwprintw(mainwin, y, 0, "%s %s %s resistant to magic.", you(lf), is(lf), adjective); mvwprintw(mainwin, y, 0, "%s %s %s resistant to magic.", you(lf), is(lf), adjective);
y++; y++;
} }
f = hasflag_real(lf->flags, F_FEARLESS, B_TRUE, NULL, FROMRACE);
if (f) {
wrapprint(mainwin, &y, &x, 0, "%s %s immune to the effects of fear.", you(lf), is(lf));
}
f = hasflag_real(lf->flags, F_FASTMETAB, B_TRUE, NULL, FROMRACE); f = hasflag_real(lf->flags, F_FASTMETAB, B_TRUE, NULL, FROMRACE);
if (f) { if (f) {

37
lf.c
View File

@ -325,8 +325,10 @@ long calcscore(lifeform_t *lf) {
// the game. // the game.
if (winner) { if (winner) {
points += getobpoints(o); points += getobpoints(o);
} else { } else if (isknown(o)) {
points += (getobpoints(o)/4); points += (getobpoints(o)/4);
} else {
points += (getobpoints(o)/6);
} }
} }
// donated items etc // donated items etc
@ -12156,12 +12158,21 @@ void givestartobs(lifeform_t *lf, object_t *targob, flagpile_t *fp) {
// handle autoweapon // handle autoweapon
if (lf && hasflag(fp, F_SELECTWEAPON)) { if (lf && hasflag(fp, F_SELECTWEAPON)) {
skill_t *sk; //skill_t *sk;
flag_t *f2; flag_t *f2;
objecttype_t *poss[MAXSKILLS]; objecttype_t *poss[MAXSKILLS];
int nposs = 0, i; int nposs = 0, i;
flag_t *retflag[MAXCANDIDATES];
int nretflags;
getflags(fp, retflag, &nretflags, F_SELECTWEAPON, F_NONE);
for (i = 0; i < nretflags; i++) {
poss[nposs++] = findot(retflag[i]->val[0]);
}
// find all the weapon skills this lf can learn // find all the weapon skills this lf can learn
// and get basic objects of this type // and get basic objects of this type
/*
for (sk = firstskill ; sk ; sk = sk->next) { for (sk = firstskill ; sk ; sk = sk->next) {
if (isweaponskill(sk->id)) { if (isweaponskill(sk->id)) {
if (canlearn(lf, sk->id) || getskill(lf, sk->id)) { if (canlearn(lf, sk->id) || getskill(lf, sk->id)) {
@ -12173,6 +12184,7 @@ void givestartobs(lifeform_t *lf, object_t *targob, flagpile_t *fp) {
} }
} }
} }
*/
if (nposs) { if (nposs) {
objecttype_t *ot = NULL; objecttype_t *ot = NULL;
char ch = 'a'; char ch = 'a';
@ -14708,6 +14720,7 @@ lifeform_t *real_addlf(cell_t *cell, enum RACE rid, int level, int controller) {
a->los = NULL; // will be alloced in precalclos a->los = NULL; // will be alloced in precalclos
//a->losdark = NULL; // will be alloced in precalclos //a->losdark = NULL; // will be alloced in precalclos
a->nlos = 0; a->nlos = 0;
a->loslock = B_FALSE;
//a->nlosdark = 0; //a->nlosdark = 0;
//a->eyeadjustment = 0; //a->eyeadjustment = 0;
@ -18528,6 +18541,8 @@ void precalclos(lifeform_t *lf) {
if (gamemode == GM_CLEANUP) return; if (gamemode == GM_CLEANUP) return;
if (lf->loslock) return;
if (lf->cell->type->id == CT_FAKE) return; if (lf->cell->type->id == CT_FAKE) return;
if (lf->los) { if (lf->los) {
@ -20040,11 +20055,7 @@ int scare(lifeform_t *lf, lifeform_t *scarer, int howlong, int scarerbonus) {
void setalignment(lifeform_t *lf, enum ALIGNMENT al) { void setalignment(lifeform_t *lf, enum ALIGNMENT al) {
flag_t *f; flag_t *f;
if (isplayer(lf)) {
dblog("warning - changing player alignment");
msg("warning - changing player alignment");
more();
}
f = lfhasflag(lf, F_ALIGNMENT); f = lfhasflag(lf, F_ALIGNMENT);
if (f) { if (f) {
f->val[0] = al; f->val[0] = al;
@ -20157,6 +20168,9 @@ void setbodytype(race_t *r, enum BODYTYPE bt) {
} }
int setfacing(lifeform_t *lf, int dir) { int setfacing(lifeform_t *lf, int dir) {
if (dir < 0) {
raise(SIGINT);
}
if (isclimbing(lf)) { // can't change dir while climbing if (isclimbing(lf)) { // can't change dir while climbing
return B_TRUE; return B_TRUE;
} }
@ -21985,11 +21999,16 @@ void startlfturn(lifeform_t *lf) {
dir = 1; dir = 1;
chance = piety; chance = piety;
limit(&chance, 10, 100); limit(&chance, 10, 100);
} else {
if (lfhasflagval(player, F_NOPIETYLOSS, godlf[i]->race->id, NA, NA, NULL)) {
dir = 0;
chance = 0;
} else { } else {
dir = -1; dir = -1;
chance = 100 - (piety-200); // ie. 100 max chance = 100 - (piety-200); // ie. 100 max
limit(&chance, 1, 50); limit(&chance, 1, 50);
} }
}
// the further away from neutral you are, the less chance // the further away from neutral you are, the less chance
// piety/anger has of 'expiring' // piety/anger has of 'expiring'
if (pctchance(chance)) { if (pctchance(chance)) {
@ -22222,6 +22241,8 @@ void startlfturn(lifeform_t *lf) {
if (f && !lfhasflag(lf, F_HOSTILE) && if (f && !lfhasflag(lf, F_HOSTILE) &&
!isinbattle(lf, B_INCLUDEDISTANT, B_FALSE) && !isinbattle(lf, B_INCLUDEDISTANT, B_FALSE) &&
!isfleeing(lf) && !isplayer(lf)) { !isfleeing(lf) && !isplayer(lf)) {
lf->loslock = B_TRUE;
for (i = 1 ; i < lf->nlos; i++) { for (i = 1 ; i < lf->nlos; i++) {
lifeform_t *otherlf; lifeform_t *otherlf;
otherlf = lf->los[i]->lf; otherlf = lf->los[i]->lf;
@ -22242,6 +22263,7 @@ void startlfturn(lifeform_t *lf) {
} }
} }
} }
lf->loslock = B_FALSE;
} }
f = lfhasflag(lf, F_AUTOROTATE); f = lfhasflag(lf, F_AUTOROTATE);
@ -24221,6 +24243,7 @@ int real_touch(lifeform_t *lf, object_t *o, int onpurpose) {
void turntoface(lifeform_t *lf, cell_t *dstcell) { void turntoface(lifeform_t *lf, cell_t *dstcell) {
if (isdead(lf)) return; if (isdead(lf)) return;
if (lfhasflag(lf, F_AUTOROTATE)) return; if (lfhasflag(lf, F_AUTOROTATE)) return;
if (dstcell == lf->cell) return;
// not providing srclf, since this will make getdirtowards() not include // not providing srclf, since this will make getdirtowards() not include
// directions in which the next cell is unwalkable. in this case we're // directions in which the next cell is unwalkable. in this case we're
// not actually walking there, so we don't care. // not actually walking there, so we don't care.

2
move.c
View File

@ -220,8 +220,10 @@ int celldangerous(lifeform_t *lf, cell_t *cell, int onlyifknown, enum ERROR *err
} }
} else if (o->type->id == OT_HOLYCIRCLE) { } else if (o->type->id == OT_HOLYCIRCLE) {
if (isundead(lf) || lfhasflag(lf, F_LYCANTHROPE)) { if (isundead(lf) || lfhasflag(lf, F_LYCANTHROPE)) {
if (error) {
*error = E_AVOIDOB; *error = E_AVOIDOB;
rdata = o; rdata = o;
}
return B_TRUE; return B_TRUE;
} }
} }

View File

@ -3639,8 +3639,7 @@ void explodeob(object_t *o, flag_t *f, int bigness, lifeform_t *causedby) {
cell_t *c; cell_t *c;
int dam; int dam;
char obname[BUFLEN]; char obname[BUFLEN];
object_t *outerob;
c = getoblocation(o);
// override causedby // override causedby
if (!causedby) { if (!causedby) {
@ -3652,24 +3651,36 @@ void explodeob(object_t *o, flag_t *f, int bigness, lifeform_t *causedby) {
} }
dam = roll(f->text); dam = roll(f->text);
getobname(o, obname, o->amt);
// inside a container? if so, it's the container
// which you will see exploding.
if (o->pile->parentob) {
outerob = o->pile->parentob;
} else {
outerob = o;
}
c = getoblocation(outerob);
getobname(outerob, obname, outerob->amt);
// announce // announce
if (o->pile->owner) { if (outerob->pile->owner) {
if (isplayer(o->pile->owner)) { if (isplayer(outerob->pile->owner)) {
msg("^BYour %s explode%s!^n", noprefix(obname),OBS1(o)); msg("^BYour %s explode%s!^n", noprefix(obname),OBS1(outerob));
} else if (cansee(player, o->pile->owner)) { } else if (cansee(player, outerob->pile->owner)) {
char lfname[BUFLEN]; char lfname[BUFLEN];
getlfname(o->pile->owner, lfname); getlfname(outerob->pile->owner, lfname);
msg("^B%s%s %s explode%s!^n", lfname, getpossessive(lfname), noprefix(obname),OBS1(o)); msg("^B%s%s %s explode%s!^n", lfname, getpossessive(lfname), noprefix(obname),OBS1(outerob));
} }
} else if (haslos(player, c)) { } else if (haslos(player, c)) {
msg("^B%s explode%s!^n", obname,OBS1(o)); msg("^B%s explode%s!^n", obname,OBS1(outerob));
} }
explodecells(c, dam * o->amt, bigness ? B_TRUE : B_FALSE, o, bigness , DT_ORTH, B_FALSE, causedby); explodecells(c, dam * o->amt, bigness ? B_TRUE : B_FALSE, o, bigness , DT_ORTH, B_FALSE, causedby);
// object dies. // object dies.
removeob(o, o->amt); //removeob(o, o->amt);
// explode the container
removeob(outerob, outerob->amt);
} }
void extinguish(object_t *o) { void extinguish(object_t *o) {

View File

@ -7924,7 +7924,8 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
if (isplayer(target)) { if (isplayer(target)) {
char obname[BUFLEN]; char obname[BUFLEN];
getobname(dropob[i], obname, dropob[i]->amt); getobname(dropob[i], obname, dropob[i]->amt);
msg("^BYour %s %s too hot to hold!", obname, (o->amt == 1) ? "is" : "are"); msg("^BYour %s %s too hot to hold!", obname,
(dropob[i]->amt == 1) ? "is" : "are");
} }
drop(dropob[i], dropob[i]->amt); drop(dropob[i], dropob[i]->amt);
} }
@ -11069,7 +11070,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
fizzle(caster); fizzle(caster);
return B_TRUE; return B_TRUE;
} }
amttolose = power*2; amttolose = roll("1d6") + power;
if (isplayer(target)) { if (isplayer(target)) {
msg("^%cYou suddenly feel very lethargic!", getlfcol(target, CC_BAD)); msg("^%cYou suddenly feel very lethargic!", getlfcol(target, CC_BAD));
} else if (cansee(player, target)) { } else if (cansee(player, target)) {

8
text.c
View File

@ -246,7 +246,11 @@ char *construct_hit_string(lifeform_t *lf, lifeform_t *victim, char *attackernam
if (!victim || getlorelevel(lf, victim->race->raceclass->id)) { if (!victim || getlorelevel(lf, victim->race->raceclass->id)) {
if (!lfhasflag(lf, F_PHANTASM)) { if (!lfhasflag(lf, F_PHANTASM)) {
//strcpy(extradambuf, " but do no damage"); //strcpy(extradambuf, " but do no damage");
if (onein(2)) {
strcpy(extradambuf, " ineffectually"); strcpy(extradambuf, " ineffectually");
} else {
strcpy(extradambuf, ", but do no damage.");
}
knownnodam = B_TRUE; knownnodam = B_TRUE;
} }
} }
@ -335,7 +339,11 @@ char *construct_hit_string(lifeform_t *lf, lifeform_t *victim, char *attackernam
strcpy(nodamstr, ""); strcpy(nodamstr, "");
if ((dam == 0) && (damtype != DT_TOUCH) && !lfhasflag(lf, F_PHANTASM)) { if ((dam == 0) && (damtype != DT_TOUCH) && !lfhasflag(lf, F_PHANTASM)) {
nodam = B_TRUE; nodam = B_TRUE;
if (onein(2)) {
strcpy(nodamstr, " ineffectually"); strcpy(nodamstr, " ineffectually");
} else {
strcpy(nodamstr, ", but does no damage");
}
} }
if (backstab && (idx == 0)) { if (backstab && (idx == 0)) {