- [+] show varpower spell effects in @E

- [+] don't say "you hear xxx" for your pet's footsteps
- [+] when hungry, ekrub likes eating animal corpses, rather than
      killing animals
- [+] failed spells now always make spelleffect() return B_TRUE.
- [+] stickstosnakes now works on non-wood objects.
- [+] light spell can only blind people at high level
- [+] amberon shouls accept sacfirice of evil corpses
- [+] tweak potion rarity
- [+] attacking helpless evil creatures shoudln't anger amberon
This commit is contained in:
Rob Pearce 2012-02-01 20:56:07 +00:00
parent 5506fdcc86
commit 660481c27e
8 changed files with 329 additions and 129 deletions

View File

@ -220,6 +220,39 @@ int attackcell(lifeform_t *lf, cell_t *c, int force) {
attackedpeaceful = B_TRUE;
}
// above average wisdom will prvent you from annoying your god
if (getattrbracket(getattr(lf, A_WIS), A_WIS, NULL) >= AT_GTAVERAGE) {
if (!force && isplayer(lf)) {
enum HELPLESSTYPE how;
if (ishelplessvictim(c->lf, lf, &how)) {
int dowarning = B_FALSE;
if (godprayedto(R_GODPURITY) && (getalignment(c->lf) != AL_EVIL)) {
dowarning = B_TRUE;
} else if (godprayedto(R_GODMERCY)) {
dowarning = B_TRUE;
}
if (dowarning) {
char victimname[BUFLEN],buf[BUFLEN];
getlfname(c->lf, victimname);
snprintf(buf, BUFLEN, "Really attack the %s %s?",
(how == HL_FLEEING) ? "fleeing" : "helpless",
noprefix(victimname));
if (!warnabout(buf)) {
return B_TRUE;
}
}
}
}
if (!force && isplayer(lf) && (getraceclass(c->lf) == RC_PLANT) && godprayedto(R_GODNATURE)) {
char victimname[BUFLEN],buf[BUFLEN];
getlfname(c->lf, victimname);
snprintf(buf, BUFLEN, "Really attack %s?",victimname);
if (!warnabout(buf)) {
return B_TRUE;
}
}
}
if (!force && isplayer(lf) && lfhasflag(lf, F_HASNEWLEVEL)) {
if (!warnabout(TEXT_WARN_ATTACK_NOXP)) {
return B_TRUE;
@ -510,8 +543,8 @@ int attackcell(lifeform_t *lf, cell_t *c, int force) {
}
} else if (attackedhelpless) {
angergodmaybe(R_GODMERCY, 50, GA_ATTACKHELPLESS);
angergodmaybe(R_GODPURITY, 50, GA_ATTACKHELPLESS);
if (getalignment(attacktarget) != AL_EVIL) {
angergodmaybe(R_GODPURITY, 50, GA_ATTACKHELPLESS);
pleasegodmaybe(R_GODTHIEVES, 5);
pleasegodmaybe(R_GODDEATH, 10);
}

16
data.c
View File

@ -2326,10 +2326,10 @@ void initobjects(void) {
addflag(lastot->flags, F_VALUE, 75, NA, NA, NULL);
addot(OT_POT_ETHEREALNESS, "potion of etherealness", "Allows the walker to temporarily pass through walls.", MT_GLASS, 1, OC_POTION, SZ_TINY);
addflag(lastot->flags, F_RARITY, H_ALL, 70, NA, NULL);
addflag(lastot->flags, F_RARITY, H_ALL, 70, RR_RARE, NULL);
addflag(lastot->flags, F_VALUE, 140, NA, NA, NULL);
addot(OT_POT_EXPERIENCE, "potion of experience", "Instantly grants the imbiber the next experience level.", MT_GLASS, 1, OC_POTION, SZ_TINY);
addflag(lastot->flags, F_RARITY, H_ALL, 100, NA, NULL);
addflag(lastot->flags, F_RARITY, H_ALL, 100, RR_RARE, NULL);
addflag(lastot->flags, F_AIBOOSTITEM, B_TRUE, 40, NA, NULL);
addflag(lastot->flags, F_VALUE, 210, NA, NA, NULL);
@ -3554,6 +3554,7 @@ void initobjects(void) {
addflag(lastot->flags, F_LOSLOF, B_TRUE, LOF_DONTNEED, NA, NULL);
addot(OT_S_LIGHT, "light area", "Creates a temporary light source centred on the caster.", MT_NOTHING, 0, OC_SPELL, SZ_TINY);
addflag(lastot->flags, F_EXTRADESC, NA, NA, NA, "At Power III, you can control where the light appears.");
addflag(lastot->flags, F_EXTRADESC, NA, NA, NA, "At Power V, the light will blind creatures with night vision.");
addflag(lastot->flags, F_EXTRADESC, NA, NA, NA, "At Power VIII, the light becomes permenant.");
addflag(lastot->flags, F_SPELLSCHOOL, SS_MODIFICATION, NA, NA, NULL);
addflag(lastot->flags, F_SPELLSCHOOL, SS_LIFE, NA, NA, NULL);
@ -6130,7 +6131,7 @@ void initobjects(void) {
addflag(lastot->flags, F_ARMOURPIERCE, 90, NA, NA, "");
addflag(lastot->flags, F_DAM, DT_TOUCH, 1, NA, NULL);
addflag(lastot->flags, F_ACCURACY, 100, NA, NA, NULL);
addflag(lastot->flags, F_HITCONFER, F_PARALYZED, SC_CON, 22, "2-4");
addflag(lastot->flags, F_HITCONFER, F_PARALYZED, SC_CON, 22, "1-2");
addflag(lastot->flags, F_HITCONFERVALS, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_NOSTRDAMMOD, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_USESSKILL, SK_NONE, NA, NA, NULL);
@ -6139,7 +6140,7 @@ void initobjects(void) {
addflag(lastot->flags, F_ARMOURPIERCE, 90, NA, NA, "");
addflag(lastot->flags, F_DAM, DT_TOUCH, 1, NA, NULL);
addflag(lastot->flags, F_ACCURACY, 100, NA, NA, NULL);
addflag(lastot->flags, F_HITCONFER, F_PARALYZED, SC_CON, 30, "5-10");
addflag(lastot->flags, F_HITCONFER, F_PARALYZED, SC_CON, 30, "3-5");
addflag(lastot->flags, F_HITCONFERVALS, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_NOSTRDAMMOD, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_USESSKILL, SK_NONE, NA, NA, NULL);
@ -6592,8 +6593,8 @@ void initobjects(void) {
addflag(lastot->flags, F_ATTREQ, A_AGI, 65, 80, "10");
addflag(lastot->flags, F_CRITCHANCE, 1, NA, NA, NULL);
addot(OT_PITCHFORK, "pitchfork", "A multi-pronged agricultural tool designed to lift loose material. Works as a makeshift weapon.", MT_METAL, 5, OC_WEAPON, SZ_HUMAN);
addflag(lastot->flags, F_RARITY, H_DUNGEON, 85, RR_FREQUENT, NULL);
addflag(lastot->flags, F_RARITY, H_FOREST, 85, RR_FREQUENT, NULL);
addflag(lastot->flags, F_RARITY, H_DUNGEON, 85, RR_COMMON, NULL);
addflag(lastot->flags, F_RARITY, H_FOREST, 85, RR_COMMON, NULL);
addflag(lastot->flags, F_DAM, DT_SLASH, 3, NA, NULL);
addflag(lastot->flags, F_ALTDAM, DT_BASH, 3, NA, NULL);
addflag(lastot->flags, F_ACCURACY, 80, NA, NA, NULL);
@ -7653,6 +7654,7 @@ void initrace(void) {
}
}
addflag(lastrace->flags, F_SACRIFICEOBBLESSED, B_CURSED, NA, 5, "OB explode#S in a shower of sparks!");
addflag(lastrace->flags, F_SACRIFICEOB, OT_CORPSE, NA, 10, "OB IS consumed by a shaft of holy light.");
addflag(lastrace->flags, F_CANWILL, OT_S_WISHLIMITED, NA, NA, "pw:10;");
addflag(lastrace->flags, F_CANWILL, OT_S_PLANESHIFT, NA, NA, "pw:1;");
@ -7764,7 +7766,7 @@ void initrace(void) {
}
}
addflag(lastrace->flags, F_GODPOISON, B_FALSE, 25, NA, NULL);
addflag(lastrace->flags, F_GODLIKES, NA, NA, NA, "killing animals when hungry");
addflag(lastrace->flags, F_GODLIKES, NA, NA, NA, "eating animals when hungry");
addflag(lastrace->flags, F_GODLIKES, NA, NA, NA, "killing dragons");
addflag(lastrace->flags, F_GODLIKES, NA, NA, NA, "cooking");
addflag(lastrace->flags, F_GODLIKES, NA, NA, NA, "creating objects");

Binary file not shown.

117
god.c
View File

@ -464,6 +464,16 @@ void dooffer(void) {
}
}
}
// special case - amberon only accepts evil corpses
if (validcorpse && (god->race->id == R_GODPURITY) && (o->type->id == OT_CORPSE)) {
flag_t *ff;
ff = hasflag(o->flags, F_ALIGNMENT);
if (!ff || (ff->val[0] != AL_EVIL)) {
validcorpse = B_FALSE;
}
}
if (validcorpse) {
ok = B_TRUE;
thispiety = f->val[2];
@ -634,14 +644,10 @@ lifeform_t *getrandomgod(void) {
// get a random god which player has prayed to
lifeform_t *getrandomprayedgod(void) {
int i,nposs = 0;
lifeform_t *god,*poss[MAXGODS];
for (i = 0; i < ngodlfs; i++) {
god = godlf[i];
if (lfhasflag(god, F_PRAYEDTO)) {
poss[nposs++] = god;
}
}
int nposs;
lifeform_t *poss[MAXGODS];
getprayedgods(poss, &nposs);
if (nposs == 0) {
return NULL;
}
@ -950,12 +956,9 @@ int godgiftmaybe(enum RACE rid, int fromtemple) {
break;
case R_GODPURITY:
while (rollagain) {
int n,nposs,i;
object_t *poss[MAXCANDIDATES],*o;
flag_t *f;
object_t *wep;
rollagain = B_FALSE;
switch (rnd(1,6)) {
switch (rnd(1,4)) {
case 1:
snprintf(obtogive, BUFLEN, "2-4 blessed potions of water");
break;
@ -965,15 +968,7 @@ int godgiftmaybe(enum RACE rid, int fromtemple) {
case 3:
snprintf(obtogive, BUFLEN, "wand of turn undead");
break;
case 4: // bless your weapon
wep = getweapon(player);
if (wep && !isblessed(wep)) {
blessob(wep);
} else {
rollagain = B_TRUE;
}
break;
case 5: // holy aura
case 4: // holy aura
if (lfhasflag(player, F_HOLYAURA)) {
rollagain = B_TRUE;
} else {
@ -983,23 +978,7 @@ int godgiftmaybe(enum RACE rid, int fromtemple) {
f->obfrom = god->race->id;
}
break;
case 6: // bless 1-3 obs
nposs = 0;
n = rnd(1,3); // num to bless
for (o = player->pack->first ; o ; o = o->next) {
if (!isblessed(o)) {
poss[nposs++] = o;
}
}
if (nposs < n) n = nposs;
for (i = 0; i < n; i++) {
o = poss[rnd(0,nposs-1)];
while (isblessed(o)) {
o = poss[rnd(0,nposs-1)];
}
blessob(o);
}
break;
}
}
break;
@ -1377,18 +1356,55 @@ int prayto(lifeform_t *lf, lifeform_t *god) {
blessob(o);
}
}
// smite evil
for (l = lf->cell->map->lf ; l ; l = l->next) {
if (getalignment(l) == AL_EVIL) {
if (haslof(lf->cell, l->cell, LOF_WALLSTOP, NULL)) {
// smite them
castspell(god, OT_S_SMITEEVIL, l, NULL, l->cell, NULL, NULL);
// cure poison
if (ispoisoned(lf)) {
dospelleffects(god, OT_S_CUREPOISON, 10, lf, NULL, lf->cell, B_UNCURSED, NULL, B_FALSE);
}
if (isinbattle(lf, B_TRUE)) {
// smite evil
for (l = lf->cell->map->lf ; l ; l = l->next) {
if (getalignment(l) == AL_EVIL) {
if (haslof(lf->cell, l->cell, LOF_WALLSTOP, NULL)) {
// smite them
castspell(god, OT_S_SMITEEVIL, l, NULL, l->cell, NULL, NULL);
}
}
}
// turn undead
castspell(god, OT_S_TURNUNDEAD, lf, NULL, NULL, NULL, NULL);
} else {
object_t *wep;
int donesomething = B_FALSE;
wep = getweapon(player);
if (wep && !isblessed(wep)) {
blessob(wep);
donesomething = B_TRUE;
}
if (!donesomething) {
int nposs = 0, n;
object_t *o,*poss[MAXCANDIDATES];
// bless 1-3 obs
nposs = 0;
n = rnd(1,3); // num to bless
for (o = player->pack->first ; o ; o = o->next) {
if (!isblessed(o) && !hasflag(o->flags, F_NOBLESS)) {
poss[nposs++] = o;
}
}
if (nposs < n) n = nposs;
for (i = 0; i < n; i++) {
o = poss[rnd(0,nposs-1)];
while (isblessed(o)) {
o = poss[rnd(0,nposs-1)];
}
blessob(o);
donesomething = B_TRUE;
}
}
}
// turn undead
castspell(god, OT_S_TURNUNDEAD, lf, NULL, NULL, NULL, NULL);
break;
case R_GODDEATH:
msg("\"Behold, the power of death!\"");
@ -1727,6 +1743,13 @@ int prayto(lifeform_t *lf, lifeform_t *god) {
break;
}
if (god->race->id == R_GODNATURE) {
addob(lf->cell->obpile, "flower");
if (haslos(player, lf->cell)) {
msg("A beautiful flower grows from the ground.");
}
}
if (!godgiftmaybe(god->race->id, B_FALSE)) {
// if you didn't get a gift, lower piety for this god

21
io.c
View File

@ -4848,8 +4848,15 @@ char *makedesc_god(lifeform_t *god, char *retbuf) {
if (retflag[i]->val[1] == NA) {
objecttype_t *ot;
char *text;
ot = findot(retflag[i]->val[0]);
sprintf(thisline, "- %s\n", ot->name);
text = makeplural(ot->name);
sprintf(thisline, "- %s", text);
free(text);
if ((god->race->id == R_GODPURITY) && (retflag[i]->val[0] == OT_CORPSE)){
strcat(thisline, " of evil creatures");
}
strcat(thisline, "\n");
strncat(retbuf, thisline, HUGEBUFLEN);
} else {
raceclass_t *rc;
@ -11399,12 +11406,22 @@ void showlfstats(lifeform_t *lf, int showall) {
objecttype_t *sp;
sp = findot(f->val[0]);
if (sp) {
char thisline[BUFLEN];
char desc[BUFLEN];
if (nfound == 0) {
mvwprintw(mainwin, y, 0, "%s %s the following spells active:", you(lf),
isplayer(lf) ? "have" : "has");
y++;
}
mvwprintw(mainwin, y, 0, " - %s %s (consuming %d MP)", sp->name, roman(f->val[2]), f->val[1]);
sprintf(thisline, " - %s %s (consuming %d MP", sp->name, roman(f->val[2]), f->val[1]);
getspelldesc(f->val[0], f->val[2], desc);
if (strlen(desc)) {
strcat(thisline, ", ");
strcat(thisline, desc);
}
strcat(thisline, ")");
mvwprintw(mainwin, y, 0, "%s", desc);
y++;
nfound++;
}

29
lf.c
View File

@ -1603,7 +1603,7 @@ int castspell(lifeform_t *lf, enum OBTYPE sid, lifeform_t *targlf, object_t *tar
thiscost = getmpcost(lf, sid) * i;
if (lf->mp >= thiscost) {
snprintf(buf, BUFLEN, "Power %s (%d MP)", roman(i), thiscost);
getvarpowerspelldesc(sp->id, i, desc);
getspelldesc(sp->id, i, desc);
if (strlen(desc)) {
strcat(buf, "\t");
strcat(buf, desc);
@ -2551,11 +2551,6 @@ void die(lifeform_t *lf) {
}
switch (lf->race->raceclass->id) {
case RC_ANIMAL:
if (gethungerlevel(gethungerval(player)) > H_NONE) {
pleasegodmaybe(R_GODNATURE, 3);
}
break;
case RC_DRAGON:
pleasegodmaybe(R_GODNATURE, 50);
break;
@ -2695,6 +2690,8 @@ void die(lifeform_t *lf) {
copyflag(corpse->flags, lf->flags, F_DTVULN);
copyflag(corpse->flags, lf->flags, F_DTRESIST);
copyflag(corpse->flags, lf->flags, F_DTIMMUNE);
// inherit alighnment
copyflag(corpse->flags, lf->flags, F_ALIGNMENT);
// some corpses will regenerate...
if (copyflag(corpse->flags, lf->flags, F_REVIVETIMER)) {
@ -3537,6 +3534,21 @@ int eat(lifeform_t *lf, object_t *o) {
}
if (isplayer(lf)) makeknown(o->type->id);
if (isplayer(lf)) {
flag_t *f;
f = hasflag(o->flags, F_CORPSEOF);
if (f) {
race_t *r;
r = findrace(f->val[0]);
if (r && (r->raceclass->id == RC_ANIMAL)) {
if (gethungerlevel(gethungerval(lf)) > H_NONE) {
pleasegodmaybe(R_GODNATURE, 5);
}
}
}
}
} // end if fullyeaten
// take time
@ -13712,6 +13724,8 @@ int noise(cell_t *c, lifeform_t *noisemaker, enum NOISECLASS nclass, int volume,
msg("%s", seetext);
rv = B_TRUE;
}
} else if (noisemaker && ispetof(noisemaker, player)) {
rv = B_FALSE;
} else if (text && !isdeaf(l) && ((nclass != NC_MOVEMENT) || !lfhasflag(l, F_DONELISTEN))) {
// this means you can only hear one 'walk' sound per turn
char textnopunc[BUFLEN];
@ -16096,7 +16110,8 @@ int real_skillcheck(lifeform_t *lf, enum CHECKTYPE ct, int diff, int mod, int *r
}
// level modifier
levmod = (gethitdice(lf) / 3);
//levmod = (gethitdice(lf) / 3);
levmod = (gethitdice(lf) / 2);
// other modifiers
if (ct == SC_CLIMB) {

238
spell.c
View File

@ -2812,6 +2812,7 @@ int abilityeffects(lifeform_t *user, enum OBTYPE abilid, cell_t *targcell, lifef
msg("%s is now a %s.", lfname, j->name);
} else {
fizzle(user);
return B_TRUE;
}
} else {
msg("There is nobody there!");
@ -3475,6 +3476,17 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
}
}
// worshipers of ekrub gain power from piety
if (isplayer(caster) && godprayedto(R_GODNATURE) &&
(hasflagval(sp->flags, F_SPELLSCHOOL, SS_NATURE, NA, NA, NULL))) {
enum PIETYLEV pl;
pl = getpietylev(R_GODNATURE, NULL, NULL);
if (pl >= PL_PLEASED) {
power += pl;
limit(&power, NA, 10);
}
}
// special: spit attacks need an animation
casttype = lfhasflag(caster, F_CASTTYPE);
if (casttype && (casttype->val[0] == CT_EYESPIT)) {
@ -3601,6 +3613,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
gainmp(caster, howmuch);
} else {
fizzle(caster);
return B_TRUE;
}
} else if (spellid == OT_S_AIRBLAST) {
int dir;
@ -3695,6 +3708,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
if (seenbyplayer) *seenbyplayer = B_TRUE;
} else {
fizzle(caster);
return B_TRUE;
}
} else if (spellid == OT_S_ANIMATEMETAL) {
object_t *o;
@ -3710,6 +3724,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
msg("Your %s is not metal, therefore unaffected.", noprefix(obname));
} else {
fizzle(caster);
return B_TRUE;
}
return B_FALSE;
} else if (o->amt != 1) {
@ -3717,6 +3732,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
msg("Your %s wobbles a little.", obname);
} else {
fizzle(caster);
return B_TRUE;
}
return B_FALSE;
}
@ -3733,9 +3749,11 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
}
} else {
fizzle(caster);
return B_TRUE;
}
} else {
fizzle(caster);
return B_TRUE;
}
} else if (spellid == OT_S_ANIMATESTATUE) {
object_t *o;
@ -3749,7 +3767,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
return B_FALSE;
} else {
fizzle(caster);
return B_FALSE;
return B_TRUE;
}
}
@ -3763,7 +3781,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
f = hasflag(o->flags, F_CORPSEOF);
if (!f) {
fizzle(caster);
return B_FALSE;
return B_TRUE;
}
// add it!
getobname(o, obname, 1);
@ -3782,7 +3800,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
if (isplayer(caster)) pleasegodmaybe(R_GODNATURE, 25);
} else {
fizzle(caster);
return B_FALSE;
return B_TRUE;
}
} else if (spellid == OT_S_APPORTATION) {
int failed = B_FALSE;
@ -3847,6 +3865,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
if (failed) {
fizzle(caster);
return B_TRUE;
}
} else if (spellid == OT_S_AWARENESS) {
flag_t *f;
@ -3888,14 +3907,14 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
target = targcell->lf;
if (!target) {
fizzle(caster);
return B_FALSE;
return B_TRUE;
}
// does caster have a weapon?
wep = getweapon(target);
if (!wep) {
fizzle(caster);
return B_FALSE;
return B_TRUE;
}
if (isplayer(target)) {
if (seenbyplayer) *seenbyplayer = B_TRUE;
@ -3910,7 +3929,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
if (isblind(target)) {
fizzle(caster);
return B_FALSE;
return B_TRUE;
}
if (spellresisted(target, caster, spellid, power, seenbyplayer, B_FALSE)) {
@ -3936,6 +3955,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
}
} else {
fizzle(caster);
return B_TRUE;
}
} else if (spellid == OT_S_BLINK) {
cell_t *poss[MAXCANDIDATES];
@ -4086,6 +4106,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
nothinghappens();
} else {
fizzle(caster);
return B_TRUE;
}
} else {
howlong = getspellduration(20,30,blessed) + (power*10);
@ -4104,7 +4125,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
target = targcell->lf;
if (!target) {
fizzle(caster);
return B_FALSE;
return B_TRUE;
}
// which object to take?
@ -4153,6 +4174,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
moveob(targob, caster->pack, ALL);
} else {
fizzle(caster);
return B_TRUE;
}
} else if (spellid == OT_S_CALLLIGHTNING) {
int failed = B_FALSE;
@ -4182,6 +4204,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
if (failed) {
fizzle(caster);
return B_TRUE;
}
} else if (spellid == OT_S_CALLWIND) {
int failed = B_FALSE;
@ -4239,6 +4262,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
if (failed) {
fizzle(caster);
return B_TRUE;
}
} else if (spellid == OT_S_CALMANIMALS) {
int i,ncalmed = 0;
@ -4289,6 +4313,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
if (!donesomething) {
fizzle(caster);
return B_TRUE;
}
} else if (spellid == OT_S_CALMINGSCENT) {
// just announce
@ -4410,7 +4435,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
if (targcell->type->solid) {
fizzle(caster);
return B_FALSE;
return B_TRUE;
}
radius = (power/4)+1;
@ -4427,7 +4452,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
if (!target) {
fizzle(caster);
return B_FALSE;
return B_TRUE;
}
getlfname(target, targetname);
@ -4461,13 +4486,13 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
if (getallegiance(caster) == AL_PEACEFUL) {
fizzle(caster);
return B_FALSE;
return B_TRUE;
}
if (ispetof(target, caster)) {
if (isplayer(caster)) {
msg("%s is already allied with you!",targetname);
}
return B_FALSE;
return B_TRUE;
}
if (spellresisted(target, caster, spellid, power, seenbyplayer, B_TRUE)) {
@ -4494,14 +4519,14 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
if (!target) {
fizzle(caster);
return B_FALSE;
return B_TRUE;
}
getlfname(target, targetname);
// only animals
if (getraceclass(target) != RC_ANIMAL) {
fizzle(caster);
return B_FALSE;
return B_TRUE;
}
if (!ischarmable(target)) {
@ -4526,13 +4551,13 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
if (getallegiance(caster) == AL_PEACEFUL) {
fizzle(caster);
return B_FALSE;
return B_TRUE;
}
if (ispetof(target, caster)) {
if (isplayer(caster)) {
msg("%s is already allied with you!",targetname);
}
return B_FALSE;
return B_TRUE;
}
// no saving throw, just depends on hit dice.
@ -4564,7 +4589,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
target = targcell->lf;
if (!target) {
fizzle(caster);
return B_FALSE;
return B_TRUE;
}
getlfname(target, lfname);
@ -4887,7 +4912,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
if (!donesomething) {
fizzle(caster);
stopspell(caster, spellid);
return B_FALSE;
return B_TRUE;
}
} else if (spellid == OT_S_CRYSTALSHIELD) {
@ -4897,7 +4922,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
if (getequippedob(target->pack, BP_SECWEAPON)) {
fizzle(caster);
stopspell(caster, spellid);
return B_FALSE;
return B_TRUE;
}
o = addob(target->pack, "ice crystal shield");
if (o) {
@ -4931,17 +4956,18 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
killob(o);
fizzle(caster);
stopspell(caster, spellid);
return B_TRUE;
}
} else {
fizzle(caster);
stopspell(caster, spellid);
return B_FALSE;
return B_TRUE;
}
} else if (spellid == OT_S_CUREPOISON) {
target = targcell->lf;
if (!target) {
fizzle(caster);
return B_FALSE;
return B_TRUE;
}
killflagsofid(target->flags, F_POISONED);
@ -5370,6 +5396,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
msg("Some nearby liquid evaporates!");
} else {
fizzle(caster);
return B_TRUE;
}
} else if (spellid == OT_S_EXPLODEMETAL) {
@ -5401,6 +5428,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
}
} else {
fizzle(caster);
return B_TRUE;
}
} else if (spellid == OT_S_DISPERSAL) {
cell_t *c = NULL;
@ -5486,7 +5514,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
getlfname(target, lfname);
} else {
fizzle(caster);
return B_FALSE;
return B_TRUE;
}
if (!isimmuneto(target->flags, DT_NECROTIC, B_FALSE)) {
@ -5619,6 +5647,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
if (seenbyplayer) *seenbyplayer = B_TRUE;
} else {
fizzle(caster);
return B_TRUE;
}
} else if (spellid == OT_S_FLASH) {
if (isplayer(caster) || cansee(player, caster)) {
@ -5719,6 +5748,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
if (failed) {
fizzle(caster);
return B_TRUE;
}
} else if (spellid == OT_S_FORCESPHERE) {
cell_t *retcell[MAXRETCELLS];
@ -5895,6 +5925,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
if (failed) {
fizzle(caster);
return B_TRUE;
}
} else if (spellid == OT_S_FIREDART) {
char lfname[BUFLEN];
@ -5993,6 +6024,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
if (failed) {
fizzle(caster);
return B_TRUE;
}
} else if (spellid == OT_S_EARTHQUAKE) {
cell_t *retcell[MAXRETCELLS],*c;
@ -6080,7 +6112,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
target = targcell->lf;
if (!target) {
fizzle(caster);
return B_FALSE;
return B_TRUE;
}
f = addtempflag(caster->flags, F_DTRESIST, DT_FIRE, NA, NA, NULL, FROMSPELL);
@ -6281,7 +6313,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
target = targcell->lf;
if (!target) {
fizzle(caster);
return B_FALSE;
return B_TRUE;
}
getlfname(target, lfname);
@ -6347,7 +6379,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
int radius;
if (targcell->type->solid) {
fizzle(caster);
return B_FALSE;
return B_TRUE;
}
radius = power/2;
if (radius < 1) radius = 1;
@ -6419,6 +6451,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
if (failed) {
fizzle(caster);
return B_TRUE;
}
} else if (spellid == OT_S_HASTE) {
int howlong = 15;
@ -6426,7 +6459,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
if (!target) {
fizzle(caster);
return B_FALSE;
return B_TRUE;
}
if (haslos(player, target->cell)) {
@ -6450,7 +6483,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
target = targcell->lf;
if (!target) {
fizzle(caster);
return B_FALSE;
return B_TRUE;
}
// cure certain bad effects
@ -6656,6 +6689,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
nothinghappens();
} else {
fizzle(caster);
return B_TRUE;
}
}
} else if (spellid == OT_S_HOLDPORTAL) {
@ -6665,7 +6699,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
if (!o) {
fizzle(caster);
return B_FALSE;
return B_TRUE;
}
// move any objects which are in the way (but not lfs)
@ -6689,7 +6723,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
target = targcell->lf;
if (!target) {
fizzle(caster);
return B_FALSE;
return B_TRUE;
}
if (isplayer(target)) {
@ -6722,14 +6756,14 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
target = targcell->lf;
if (!target) {
fizzle(caster);
return B_FALSE;
return B_TRUE;
}
// does caster have a weapon?
wep = getweapon(target);
if (!wep) {
fizzle(caster);
return B_FALSE;
return B_TRUE;
}
getobname(wep, obname, wep->amt);
@ -6797,7 +6831,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
if (!donesomething) {
fizzle(caster);
return B_FALSE;
return B_TRUE;
}
} else if (spellid == OT_S_IDENTIFY) {
@ -6957,7 +6991,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
msg("Your %s pulls away from you a little.", noprefix(buf));
}
fizzle(caster);
return B_FALSE;
return B_TRUE;
}
}
}
@ -7060,6 +7094,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
gainhp(caster, howmuch);
} else {
fizzle(caster);
return B_TRUE;
}
} else if (spellid == OT_S_MINDSCAN) {
int failed = B_FALSE;
@ -7095,6 +7130,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
if (failed) {
fizzle(caster);
return B_TRUE;
}
} else if (spellid == OT_S_NULLIFY) {
flag_t *retflag[MAXCANDIDATES],*poss[MAXCANDIDATES],*f;
@ -7102,6 +7138,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
target = targcell->lf;
if (!target) {
fizzle(caster);
return B_TRUE;
}
if (isplayer(target)) {
@ -7373,7 +7410,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
if (lfhasflag(target, F_PAIN)) {
fizzle(caster);
return B_FALSE;
return B_TRUE;
}
if (spellresisted(target, caster, spellid, power, seenbyplayer, B_FALSE)) {
@ -7401,6 +7438,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
}
} else {
fizzle(caster);
return B_TRUE;
}
} else if (spellid == OT_S_PETRIFY) {
target = targcell->lf;
@ -7408,10 +7446,10 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
// some thigns can't be stoned
if (!lfcanbestoned(target)) {
fizzle(caster);
return B_FALSE;
return B_TRUE;
} else if (lfhasflag(target, F_BEINGSTONED)) {
fizzle(caster);
return B_FALSE;
return B_TRUE;
}
// savingthrow
@ -7461,7 +7499,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
target = targcell->lf;
if (!target) {
fizzle(caster);
return B_FALSE;
return B_TRUE;
}
getlfname(target, targname);
@ -7632,6 +7670,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
if (!donesomething) {
fizzle(caster);
return B_TRUE;
}
} else if (targcell->obpile->first) { // no lifeform there
targob = NULL;
@ -7654,9 +7693,11 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
}
} else {
fizzle(caster);
return B_TRUE;
}
} else {
fizzle(caster);
return B_TRUE;
}
}
} else if (spellid == OT_S_GATE) {
@ -7679,6 +7720,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
if ((newdepth < min) || (newdepth > max)) {
fizzle(caster);
return B_TRUE;
} else {
cell_t *srccell;
object_t *srcportal,*dstportal;
@ -7687,7 +7729,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
srccell = real_getrandomadjcell(caster->cell, WE_WALKABLE, B_ALLOWEXPAND, LOF_NEED, NULL, caster);
if (!srccell) {
fizzle(caster);
return B_FALSE;
return B_TRUE;
}
// create the source portal
srcportal = addobfast(srccell->obpile, OT_PORTAL);
@ -7816,10 +7858,10 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
if (!target) {
fizzle(caster);
return B_FALSE;
return B_TRUE;
} else if ( lfhasflag(target, F_INVISIBLE) ) {
fizzle(caster);
return B_FALSE;
return B_TRUE;
}
getlfname(target, targname);
@ -7851,6 +7893,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
losehp(target, dam, DT_ELECTRIC, caster, "a jolt of electricity");
} else {
fizzle(caster);
return B_TRUE;
}
} else if (spellid == OT_S_KNOCK) {
object_t *o;
@ -7903,6 +7946,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
if (isplayer(caster)) pleasegodmaybe(R_GODTHIEVES, 5);
} else {
fizzle(caster);
return B_TRUE;
}
@ -7949,11 +7993,13 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
// (player last)
for (l = caster->cell->map->lf ; l ; l = l->next) {
if (!isplayer(l) && haslos(l, caster->cell)) {
if (lfhasflag(l, F_SEEINDARK)) {
// if you don't have eyes, your'e safe!
if (!lfhasflagval(l, F_NOBODYPART, BP_EYES, NA, NA, NULL)) {
// blind for 1-3 turns
addtempflag(l->flags, F_BLIND, B_TRUE, NA, NA, NULL, rnd(3,5));
if (power >= 5) {
if (lfhasflag(l, F_SEEINDARK)) {
// if you don't have eyes, your'e safe!
if (!lfhasflagval(l, F_NOBODYPART, BP_EYES, NA, NA, NULL)) {
// blind for 1-3 turns
addtempflag(l->flags, F_BLIND, B_TRUE, NA, NA, NULL, rnd(3,5));
}
}
}
// undead will flee from light
@ -8079,6 +8125,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
} else {
fizzle(caster);
return B_TRUE;
}
} else if (spellid == OT_S_LOCATEOBJECT) {
char wantname[BUFLEN];
@ -8088,7 +8135,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
if (!isplayer(caster)) {
fizzle(caster);
return B_FALSE;
return B_TRUE;
}
// ask for object
askstring("Locate what kind of object", '?', wantname, BUFLEN, NULL);
@ -8189,7 +8236,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
}
if (prompt.nchoices == 0) {
fizzle(caster);
return B_FALSE;
return B_TRUE;
}
getchoice(&prompt);
@ -8202,7 +8249,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
msg("New knowledge floods into your mind!");
} else {
fizzle(caster);
return B_FALSE;
return B_TRUE;
}
} else if (spellid == OT_S_GRAVBOOST) {
target = targcell->lf;
@ -8243,6 +8290,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
addtempflag(target->flags, F_GRAVBOOSTED, B_TRUE, NA, NA, NULL, howlong);
} else {
fizzle(caster);
return B_TRUE;
}
} else if (spellid == OT_S_GRAVLOWER) {
flag_t *f;
@ -8433,7 +8481,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
if (!target) {
fizzle(caster);
return B_FALSE;
return B_TRUE;
}
getlfname(target, targetname);
@ -8754,12 +8802,14 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
}
if (!donesomething) {
fizzle(caster);
return B_TRUE;
}
} else if (spellid == OT_S_QUENCH) {
object_t *o,*nexto;
int ndone = 0;
if (!targcell) {
fizzle(caster);
return B_TRUE;
}
if (targcell->lf) {
@ -8807,6 +8857,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
}
if (!ndone) {
fizzle(caster);
return B_TRUE;
}
} else if (spellid == OT_S_QUICKENSTONE) {
int howmany,i,n,sel,nposs = 0,nseen = 0;
@ -8857,7 +8908,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
target = targcell->lf;
if (!target) {
fizzle(caster);
return B_FALSE;
return B_TRUE;
}
for (f = target->flags->first ; f ; f = f->next) {
@ -8878,6 +8929,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
if (seenbyplayer) *seenbyplayer = B_TRUE;
} else {
fizzle(caster);
return B_TRUE;
}
if (ndone && isplayer(caster) && !frompot) {
pleasegodmaybe(R_GODMERCY, 3);
@ -8887,7 +8939,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
target = targcell->lf;
if (!target) {
fizzle(caster);
return B_FALSE;
return B_TRUE;
}
amttolose = power*2;
if (isplayer(target)) {
@ -9091,6 +9143,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
snprintf(buf, BUFLEN, "%s%s shatter spell", castername, getpossessive(castername));
if (!shattercell(targcell, caster, buf)) {
fizzle(caster);
return B_TRUE;
}
} else if (spellid == OT_S_SIXTHSENSE) {
if (isplayer(caster)) {
@ -9185,6 +9238,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
if (failed) {
fizzle(caster);
return B_TRUE;
}
} else if (spellid == OT_S_SLIDE) {
flag_t *f;
@ -9258,6 +9312,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
}
} else {
fizzle(caster);
return B_TRUE;
}
} else if (spellid == OT_S_SNOWBALL) {
int failed = B_FALSE;
@ -9315,6 +9370,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
if (failed) {
fizzle(caster);
return B_TRUE;
}
} else if (spellid == OT_S_SOFTENEARTH) {
int seen = B_FALSE;
@ -9357,6 +9413,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
}
} else {
fizzle(caster);
return B_TRUE;
}
} else if (spellid == OT_S_SPARK) {
object_t *o,*nexto;
@ -9531,8 +9588,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
if (cansee(caster, c->lf)) {
for (o = c->lf->pack->first ; o ; o = nexto) {
nexto = o->next;
if ((o->material->id == MT_WOOD) &&
hasflag(o->flags, F_RODSHAPED) &&
if ( hasflag(o->flags, F_RODSHAPED) &&
isequipped(o) &&
(o->blessed == B_UNCURSED) &&
!hasflag(o->flags, F_HASBRAND)) {
@ -9551,6 +9607,9 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
noprefix(obname));
killflagsofid(snake->flags, F_XPVAL);
addflag(snake->flags, F_XPVAL, 0, NA, NA, NULL);
killflagsofid(snake->flags, F_FLEEONDAM);
killflagsofid(snake->flags, F_FLEEONHPPCT);
addflag(snake->flags, F_NOFLEE, B_TRUE, NA, NA, NULL);
makefriendly(snake, PERMENANT);
if (c->lf == caster) {
char fullobname[BUFLEN];
@ -9571,10 +9630,10 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
}
} else { // ie. no lf there
for (o = c->obpile->first ; o ; o = nexto) {
lifeform_t *snake = NULL;
nexto = o->next;
if ((o->material->id == MT_WOOD) && hasflag(o->flags, F_RODSHAPED) && !isblessed(o)) {
if (hasflag(o->flags, F_RODSHAPED) && !isblessed(o)) {
cell_t *newcell = NULL;
lifeform_t *snake;
char obname[BUFLEN];
getobname(o, obname, o->amt);
@ -9593,6 +9652,9 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
killob(o);
killflagsofid(snake->flags, F_XPVAL);
addflag(snake->flags, F_XPVAL, 0, NA, NA, NULL);
killflagsofid(snake->flags, F_FLEEONDAM);
killflagsofid(snake->flags, F_FLEEONHPPCT);
addflag(snake->flags, F_NOFLEE, B_TRUE, NA, NA, NULL);
makefriendly(snake, PERMENANT);
ndone++;
}
@ -9609,6 +9671,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
if (seenbyplayer) *seenbyplayer = B_TRUE;
} else {
fizzle(caster);
return B_TRUE;
}
} else if (spellid == OT_S_STUN) {
target = targcell->lf;
@ -9654,6 +9717,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
if (!donesomething) {
fizzle(caster);
return B_TRUE;
}
} else if (spellid == OT_S_SUCK) {
target = targcell->lf;
@ -9683,6 +9747,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
}
} else {
fizzle(caster);
return B_TRUE;
}
} else if (spellid == OT_S_SUPERHEAT) {
char obname[BUFLEN];
@ -9794,7 +9859,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
c = askcoords(buf, "Teleport->",TT_NONE, caster, UNLIMITED, LOF_DONTNEED, B_FALSE);
if (!c) {
fizzle(caster);
return B_FALSE;
return B_TRUE;
} else if (!c->known) {
// confirm
ch = askchar("Are you sure to want to teleport into the unknown?", "yn", "n", B_TRUE, B_FALSE);
@ -9881,7 +9946,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
break;
default: // should never happen
fizzle(caster);
return B_FALSE;
return B_TRUE;
}
if (xmin < 0) xmin = 0;
@ -9901,7 +9966,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
if (nposs <= 0) {
fizzle(caster);
return B_FALSE;
return B_TRUE;
}
@ -9917,7 +9982,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
c = getrandomadjcell(c, WE_WALKABLE, B_ALLOWEXPAND);
if (!c) {
fizzle(caster);
return B_FALSE;
return B_TRUE;
}
}
@ -10051,6 +10116,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
if (failed) {
fizzle(caster);
return B_TRUE;
}
} else if (spellid == OT_S_THORNS) {
flag_t *f;
@ -10064,7 +10130,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
target = targcell->lf;
if (!target) {
fizzle(caster);
return B_FALSE;
return B_TRUE;
}
f = addtempflag(target->flags, F_TRUESTRIKE, power, NA, NA, NULL, FROMSPELL);
f->obfrom = spellid;
@ -10236,7 +10302,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
if (getequippedob(target->pack, BP_WEAPON)) {
fizzle(caster);
stopspell(caster, spellid);
return B_FALSE;
return B_TRUE;
}
o = addob(target->pack, "energy blade");
if (o) {
@ -10268,11 +10334,12 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
killob(o);
fizzle(caster);
stopspell(caster, spellid);
return B_TRUE;
}
} else {
fizzle(caster);
stopspell(caster, spellid);
return B_FALSE;
return B_TRUE;
}
} else if (spellid == OT_S_WALLOFICE) {
object_t *o;
@ -10299,7 +10366,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
if ((vdist == 0) && (hdist == 0)) {
fizzle(caster);
return B_FALSE;
return B_TRUE;
}
// select direction
@ -10448,6 +10515,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
if (!targcell) {
fizzle(caster);
return B_TRUE;
}
if (targcell->lf) {
@ -10493,6 +10561,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
}
if (!ndone) {
fizzle(caster);
return B_TRUE;
}
} else if (spellid == OT_S_WEAKEN) {
target = targcell->lf;
@ -10529,6 +10598,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
if (seenbyplayer) *seenbyplayer = B_TRUE;
} else {
fizzle(caster);
return B_TRUE;
}
} else if (spellid == OT_S_WEB) {
char numbuf[BUFLEN];
@ -11251,7 +11321,9 @@ char *getspellname(enum OBTYPE spellid, lifeform_t *lf, char *buf, int forcepowe
}
} else if (spellid == OT_S_LIGHT) {
if (power >= 8) {
strcat(buf, "(perm,ctrl)");
strcat(buf, "(perm,ctrl,blind)");
} else if (power >= 5) {
strcat(buf, "(ctrl,blind)");
} else if (power >= 3) {
strcat(buf, "(ctrl)");
}
@ -11552,16 +11624,51 @@ int getstamcost(lifeform_t *lf, enum OBTYPE oid) {
return stamcost;
}
char *getvarpowerspelldesc(enum OBTYPE spellid, int power, char *buf) {
// provides a description for f_ongoing spells.
char *getspelldesc(enum OBTYPE spellid, int power, char *buf) {
// default
strcpy(buf, "");
switch (spellid) {
case OT_S_ALARM:
snprintf(buf, BUFLEN, "warnings about nearby enemies");
break;
case OT_S_BARKSKIN:
snprintf(buf, BUFLEN, "%d damage reduction, vuln to fire", gethardness(MT_WOOD));
break;
case OT_S_ENDUREELEMENTS:
snprintf(buf, BUFLEN, "resist fire, resist cold");
break;
case OT_S_EQANDOP:
snprintf(buf, BUFLEN, "reflects missile attacks");
break;
case OT_S_GRAVLOWER:
snprintf(buf, BUFLEN, "reduces load by %dkg", power*15);
break;
case OT_S_HOLYAURA:
snprintf(buf, BUFLEN, "weapons deal holy damage");
break;
case OT_S_LOWERMETAB:
if (power >= 5) {
snprintf(buf, BUFLEN, "reduces hunger");
} else {
snprintf(buf, BUFLEN, "reduces hunger and speed");
}
break;
case OT_S_PSYARMOUR:
snprintf(buf, BUFLEN, "+%d Armour Rating", power*4);
break;
case OT_S_SIXTHSENSE:
snprintf(buf, BUFLEN, "warnings about adjacent enemies");
break;
case OT_S_SUMMONWEAPON:
snprintf(buf, BUFLEN, "Create a %d damage rating magical weapon",2+(power*2));
break;
case OT_S_TAILWIND:
snprintf(buf, BUFLEN, "Speed boost when moving fowards");
break;
case OT_S_THORNS:
snprintf(buf, BUFLEN, "1d4 piercing damage to attackers");
break;
case OT_S_TRUESTRIKE:
if (power == 1) {
snprintf(buf, BUFLEN, "Next attack automatically hits");
@ -11569,6 +11676,9 @@ char *getvarpowerspelldesc(enum OBTYPE spellid, int power, char *buf) {
snprintf(buf, BUFLEN, "Next %d attacks automatically hit",power);
}
break;
case OT_S_WHATGOESUP:
snprintf(buf, BUFLEN, "missiles return to source");
break;
case OT_S_WINDSHIELD:
snprintf(buf, BUFLEN, "Protection from missiles <= %d km/h",speedtokph(power));
break;

View File

@ -28,7 +28,7 @@ enum SPELLSCHOOL getspellschoolknown(lifeform_t *lf, enum OBTYPE spellid);
enum SKILLLEVEL getspellskill(lifeform_t *lf, enum OBTYPE spellid);
int getspellrange(lifeform_t *lf, enum OBTYPE spellid, int power);
int getstamcost(lifeform_t *lf, enum OBTYPE oid);
char *getvarpowerspelldesc(enum OBTYPE spellid, int power, char *buf);
char *getspelldesc(enum OBTYPE spellid, int power, char *buf);
int getworkablematerials(lifeform_t *lf, enum SKILL skid , enum MATERIAL *repairablemats, int *cutoffpct, int *nmats);
object_t *getworkhelpob(obpile_t *op, enum MATERIAL mat);
void pullobto(object_t *o, lifeform_t *lf);