magicbane groundwork

To fix Magicbane's message sequencing, its code needs to be redone
substantially.  These changes make that easier.

cancel_monst()  let caller know whether cancellation succeeds
resist()  give artifact weapons a resistance attack rating
vtense()  handle monster names and "you" as subjects; checking against
          object names and descriptions pointed out a couple of other
          words that would have ended up being miscategorized.
This commit is contained in:
nethack.rankin
2003-02-10 10:23:01 +00:00
parent 6f0783dad3
commit 00d320c3d3
3 changed files with 40 additions and 15 deletions
+2 -2
View File
@@ -2322,8 +2322,8 @@ E int FDECL(zappable, (struct obj *));
E void FDECL(zapnodir, (struct obj *)); E void FDECL(zapnodir, (struct obj *));
E int NDECL(dozap); E int NDECL(dozap);
E int FDECL(zapyourself, (struct obj *,BOOLEAN_P)); E int FDECL(zapyourself, (struct obj *,BOOLEAN_P));
E void FDECL(cancel_monst, (struct monst *,struct obj *, E boolean FDECL(cancel_monst, (struct monst *,struct obj *,
BOOLEAN_P,BOOLEAN_P,BOOLEAN_P)); BOOLEAN_P,BOOLEAN_P,BOOLEAN_P));
E void FDECL(weffects, (struct obj *)); E void FDECL(weffects, (struct obj *));
E int NDECL(spell_damage_bonus); E int NDECL(spell_damage_bonus);
E const char *FDECL(exclam, (int force)); E const char *FDECL(exclam, (int force));
+29 -6
View File
@@ -1,4 +1,4 @@
/* SCCS Id: @(#)objnam.c 3.4 2002/09/21 */ /* SCCS Id: @(#)objnam.c 3.4 2003/02/08 */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
@@ -1029,6 +1029,19 @@ register const char *verb;
return buf; return buf;
} }
/* various singular words that vtense would otherwise categorize as plural */
static const char * const special_subjs[] = {
"erinys",
"manes", /* this one is ambiguous */
"Cyclops",
"Hippocrates",
"Pelias",
"aklys",
"amnesia",
"paralysis",
0
};
/* return form of the verb (input plural) for present tense 3rd person subj */ /* return form of the verb (input plural) for present tense 3rd person subj */
char * char *
vtense(subj, verb) vtense(subj, verb)
@@ -1037,8 +1050,8 @@ register const char *verb;
{ {
char *buf = nextobuf(); char *buf = nextobuf();
int len; int len;
const char *spot; const char *sp, *spot;
const char *sp; const char * const *spec;
/* /*
* verb is given in plural (without trailing s). Return as input * verb is given in plural (without trailing s). Return as input
@@ -1054,6 +1067,7 @@ register const char *verb;
spot = (const char *)0; spot = (const char *)0;
for (sp = subj; (sp = index(sp, ' ')) != 0; ++sp) { for (sp = subj; (sp = index(sp, ' ')) != 0; ++sp) {
if (!strncmp(sp, " of ", 4) || if (!strncmp(sp, " of ", 4) ||
!strncmp(sp, " from ", 6) ||
!strncmp(sp, " called ", 8) || !strncmp(sp, " called ", 8) ||
!strncmp(sp, " named ", 7) || !strncmp(sp, " named ", 7) ||
!strncmp(sp, " labeled ", 9)) { !strncmp(sp, " labeled ", 9)) {
@@ -1061,7 +1075,7 @@ register const char *verb;
break; break;
} }
} }
len = strlen(subj); len = (int) strlen(subj);
if (!spot) spot = subj + len - 1; if (!spot) spot = subj + len - 1;
/* /*
@@ -1074,11 +1088,20 @@ register const char *verb;
((spot - subj) >= 3 && !strncmp(spot-3, "feet", 4)) || ((spot - subj) >= 3 && !strncmp(spot-3, "feet", 4)) ||
((spot - subj) >= 2 && !strncmp(spot-1, "ia", 2)) || ((spot - subj) >= 2 && !strncmp(spot-1, "ia", 2)) ||
((spot - subj) >= 2 && !strncmp(spot-1, "ae", 2))) { ((spot - subj) >= 2 && !strncmp(spot-1, "ae", 2))) {
Strcpy(buf, verb); /* check for special cases to avoid false matches */
return buf; len = (int)(spot - subj) + 1;
for (spec = special_subjs; *spec; spec++)
if (!strncmpi(*spec, subj, len)) goto sing;
return strcpy(buf, verb);
} }
/*
* 2nd person singular behaves as if plural.
*/
if (!strcmpi(subj, "you")) return strcpy(buf, verb);
} }
sing:
len = strlen(verb); len = strlen(verb);
spot = verb + len - 1; spot = verb + len - 1;
+9 -7
View File
@@ -1,4 +1,4 @@
/* SCCS Id: @(#)zap.c 3.4 2003/01/08 */ /* SCCS Id: @(#)zap.c 3.4 2003/02/08 */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
@@ -202,7 +202,7 @@ struct obj *otmp;
break; break;
case WAN_CANCELLATION: case WAN_CANCELLATION:
case SPE_CANCELLATION: case SPE_CANCELLATION:
cancel_monst(mtmp, otmp, TRUE, TRUE, FALSE); (void) cancel_monst(mtmp, otmp, TRUE, TRUE, FALSE);
break; break;
case WAN_TELEPORTATION: case WAN_TELEPORTATION:
case SPE_TELEPORT_AWAY: case SPE_TELEPORT_AWAY:
@@ -1956,7 +1956,7 @@ boolean ordinary;
case WAN_CANCELLATION: case WAN_CANCELLATION:
case SPE_CANCELLATION: case SPE_CANCELLATION:
cancel_monst(&youmonst, obj, TRUE, FALSE, TRUE); (void) cancel_monst(&youmonst, obj, TRUE, FALSE, TRUE);
break; break;
case SPE_DRAIN_LIFE: case SPE_DRAIN_LIFE:
@@ -2203,7 +2203,7 @@ struct obj *obj; /* wand or spell */
* effect is too strong. currently non-hero monsters do not zap * effect is too strong. currently non-hero monsters do not zap
* themselves with cancellation. * themselves with cancellation.
*/ */
void boolean
cancel_monst(mdef, obj, youattack, allow_cancel_kill, self_cancel) cancel_monst(mdef, obj, youattack, allow_cancel_kill, self_cancel)
register struct monst *mdef; register struct monst *mdef;
register struct obj *obj; register struct obj *obj;
@@ -2216,7 +2216,7 @@ boolean youattack, allow_cancel_kill, self_cancel;
if (youdefend ? (!youattack && Antimagic) if (youdefend ? (!youattack && Antimagic)
: resist(mdef, obj->oclass, 0, NOTELL)) : resist(mdef, obj->oclass, 0, NOTELL))
return; /* resisted cancellation */ return FALSE; /* resisted cancellation */
if (self_cancel) { /* 1st cancel inventory */ if (self_cancel) { /* 1st cancel inventory */
struct obj *otmp; struct obj *otmp;
@@ -2259,6 +2259,7 @@ boolean youattack, allow_cancel_kill, self_cancel;
} }
} }
} }
return TRUE;
} }
/* you've zapped an immediate type wand up or down */ /* you've zapped an immediate type wand up or down */
@@ -4010,11 +4011,12 @@ int damage, tell;
/* attack level */ /* attack level */
switch (oclass) { switch (oclass) {
case WAND_CLASS: alev = 12; break; case WAND_CLASS: alev = 12; break;
case TOOL_CLASS: alev = 10; break; case TOOL_CLASS: alev = 10; break; /* instrument */
case WEAPON_CLASS: alev = 10; break; /* artifact */
case SCROLL_CLASS: alev = 9; break; case SCROLL_CLASS: alev = 9; break;
case POTION_CLASS: alev = 6; break; case POTION_CLASS: alev = 6; break;
case RING_CLASS: alev = 5; break; case RING_CLASS: alev = 5; break;
default: alev = u.ulevel; break; /* spell */ default: alev = u.ulevel; break; /* spell */
} }
/* defense level */ /* defense level */
dlev = (int)mtmp->m_lev; dlev = (int)mtmp->m_lev;