Merge branch 'ais523-elbereth' into NetHack-3.6.0
This commit is contained in:
@@ -353,6 +353,8 @@ sometimes generate the random mazes with wide corridors, thick walls,
|
||||
put throne room gold in the chest
|
||||
wielding Trollsbane prevents trolls from reviving
|
||||
wielding Demonbane prevents demons summoning friends
|
||||
Elbereth must now be on a square by itself to function
|
||||
Elbereth now erodes based on attacks by the player, not monsters scared
|
||||
|
||||
|
||||
Fixes to Post-3.6.0 Problems that Were Exposed Via git Repository
|
||||
|
||||
@@ -1355,8 +1355,8 @@ E void FDECL(mnexto, (struct monst *));
|
||||
E void FDECL(maybe_mnexto, (struct monst *));
|
||||
E boolean FDECL(mnearto, (struct monst *, XCHAR_P, XCHAR_P, BOOLEAN_P));
|
||||
E void FDECL(m_respond, (struct monst *));
|
||||
E void FDECL(setmangry, (struct monst *));
|
||||
E void FDECL(wakeup, (struct monst *));
|
||||
E void FDECL(setmangry, (struct monst *, boolean));
|
||||
E void FDECL(wakeup, (struct monst *, boolean));
|
||||
E void NDECL(wake_nearby);
|
||||
E void FDECL(wake_nearto, (int, int, int));
|
||||
E void FDECL(seemimic, (struct monst *));
|
||||
|
||||
@@ -2695,7 +2695,7 @@ struct obj *obj;
|
||||
pline1(msg_slipsfree);
|
||||
}
|
||||
if (mtmp)
|
||||
wakeup(mtmp);
|
||||
wakeup(mtmp, TRUE);
|
||||
} else
|
||||
pline1(msg_snap);
|
||||
|
||||
@@ -2789,7 +2789,7 @@ struct obj *obj;
|
||||
} else {
|
||||
pline1(msg_slipsfree);
|
||||
}
|
||||
wakeup(mtmp);
|
||||
wakeup(mtmp, TRUE);
|
||||
} else {
|
||||
if (mtmp->m_ap_type && !Protection_from_shape_changers
|
||||
&& !sensemon(mtmp))
|
||||
|
||||
@@ -2008,7 +2008,7 @@ struct monst *mtmp;
|
||||
}
|
||||
|
||||
mtmp->mburied = TRUE;
|
||||
wakeup(mtmp); /* at least give it a chance :-) */
|
||||
wakeup(mtmp, FALSE); /* at least give it a chance :-) */
|
||||
newsym(mtmp->mx, mtmp->my);
|
||||
}
|
||||
|
||||
|
||||
@@ -156,7 +156,7 @@ xchar x, y;
|
||||
int i, j;
|
||||
|
||||
/* anger target even if wild miss will occur */
|
||||
setmangry(mon);
|
||||
setmangry(mon, TRUE);
|
||||
|
||||
if (Levitation && !rn2(3) && verysmall(mon->data)
|
||||
&& !is_flyer(mon->data)) {
|
||||
@@ -298,7 +298,7 @@ register struct obj *gold;
|
||||
|
||||
if (!likes_gold(mtmp->data) && !mtmp->isshk && !mtmp->ispriest
|
||||
&& !mtmp->isgd && !is_mercenary(mtmp->data)) {
|
||||
wakeup(mtmp);
|
||||
wakeup(mtmp, TRUE);
|
||||
} else if (!mtmp->mcanmove) {
|
||||
/* too light to do real damage */
|
||||
if (canseemon(mtmp)) {
|
||||
@@ -312,7 +312,7 @@ register struct obj *gold;
|
||||
mtmp->msleeping = 0;
|
||||
finish_meating(mtmp);
|
||||
if (!mtmp->isgd && !rn2(4)) /* not always pleasing */
|
||||
setmangry(mtmp);
|
||||
setmangry(mtmp, TRUE);
|
||||
/* greedy monsters catch gold */
|
||||
if (cansee(mtmp->mx, mtmp->my))
|
||||
pline("%s catches the gold.", Monnam(mtmp));
|
||||
|
||||
@@ -608,7 +608,8 @@ int x, y;
|
||||
|
||||
if ((mon = m_at(x, y)) != 0) {
|
||||
You("bump into %s.", a_monnam(mon));
|
||||
wakeup(mon);
|
||||
wakeup(mon, FALSE);
|
||||
setmangry(mon, FALSE);
|
||||
wake_nearto(x,y, 10);
|
||||
return FALSE;
|
||||
}
|
||||
@@ -1346,7 +1347,7 @@ boolean maybe_wakeup;
|
||||
else
|
||||
miss(missile, mon);
|
||||
if (maybe_wakeup && !rn2(3))
|
||||
wakeup(mon);
|
||||
wakeup(mon, TRUE);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1448,7 +1449,8 @@ register struct obj *obj; /* thrownobj or kickedobj or uwep */
|
||||
at leader... (kicked artifact is ok too; HMON_APPLIED could
|
||||
occur if quest artifact polearm or grapnel ever gets added) */
|
||||
if (hmode != HMON_APPLIED && quest_arti_hits_leader(obj, mon)) {
|
||||
/* not wakeup(), which angers non-tame monsters */
|
||||
/* AIS: changes to wakeup() means that it's now less inappropriate here
|
||||
than it used to be, but the manual version works just as well */
|
||||
mon->msleeping = 0;
|
||||
mon->mstrategy &= ~STRAT_WAITMASK;
|
||||
|
||||
@@ -1562,7 +1564,7 @@ register struct obj *obj; /* thrownobj or kickedobj or uwep */
|
||||
} else {
|
||||
tmiss(obj, mon, TRUE);
|
||||
if (hmode == HMON_APPLIED)
|
||||
wakeup(mon);
|
||||
wakeup(mon, TRUE);
|
||||
}
|
||||
|
||||
} else if (otyp == HEAVY_IRON_BALL) {
|
||||
@@ -1610,7 +1612,7 @@ register struct obj *obj; /* thrownobj or kickedobj or uwep */
|
||||
}
|
||||
} else if (guaranteed_hit) {
|
||||
/* this assumes that guaranteed_hit is due to swallowing */
|
||||
wakeup(mon);
|
||||
wakeup(mon, TRUE);
|
||||
if (obj->otyp == CORPSE && touch_petrifies(&mons[obj->corpsenm])) {
|
||||
if (is_animal(u.ustuck->data)) {
|
||||
minstapetrify(u.ustuck, TRUE);
|
||||
|
||||
@@ -257,8 +257,7 @@ xchar x, y;
|
||||
* Ignore headstones, in case the player names herself "Elbereth".
|
||||
*
|
||||
* If strict checking is requested, the word is only considered to be
|
||||
* present if it is intact and is the first word in the engraving.
|
||||
* ("Elbereth burrito" matches; "o Elbereth" does not.)
|
||||
* present if it is intact and is the entire content of the engraving.
|
||||
*/
|
||||
int
|
||||
sengr_at(s, x, y, strict)
|
||||
@@ -269,9 +268,10 @@ boolean strict;
|
||||
register struct engr *ep = engr_at(x, y);
|
||||
|
||||
if (ep && ep->engr_type != HEADSTONE && ep->engr_time <= moves) {
|
||||
return strict ? (strncmpi(ep->engr_txt, s, strlen(s)) == 0)
|
||||
return strict ? (fuzzymatch(ep->engr_txt, s, "", TRUE))
|
||||
: (strstri(ep->engr_txt, s) != 0);
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
@@ -433,7 +433,7 @@ int expltype;
|
||||
monkilled(mtmp, "", (int) adtyp);
|
||||
} else if (!context.mon_moving) {
|
||||
/* all affected monsters, even if mdef is set */
|
||||
setmangry(mtmp);
|
||||
setmangry(mtmp, TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
33
src/mon.c
33
src/mon.c
@@ -2583,10 +2583,33 @@ struct monst *mtmp;
|
||||
}
|
||||
}
|
||||
|
||||
/* Called whenever the player attacks mtmp; also called in other situations
|
||||
where mtmp gets annoyed at the player. Handles mtmp getting annoyed at the
|
||||
attack and any ramifications that might have. Useful also in situations where
|
||||
mtmp was already hostile; it checks for situations where the player shouldn't
|
||||
be attacking and any ramifications /that/ might have. */
|
||||
void
|
||||
setmangry(mtmp)
|
||||
setmangry(mtmp, via_attack)
|
||||
struct monst *mtmp;
|
||||
boolean via_attack;
|
||||
{
|
||||
if (via_attack && sengr_at("Elbereth", u.ux, u.uy, TRUE)) {
|
||||
You_feel("like a hypocrite.");
|
||||
/* AIS: Yes, I know alignment penalties and bonuses aren't balanced at
|
||||
the moment. This is about correct relative to other "small"
|
||||
penalties; it should be fairly large, as attacking while standing on
|
||||
an Elbereth means that you're requesting peace and then violating
|
||||
your own request. I know 5 isn't actually large, but it's
|
||||
intentionally larger than the 1s and 2s that are normally given for
|
||||
this sort of thing. */
|
||||
adjalign(-5);
|
||||
|
||||
if (!Blind)
|
||||
pline("The engraving beneath you fades.");
|
||||
del_engr_at(u.ux, u.uy);
|
||||
}
|
||||
|
||||
/* AIS: Should this be in both places, or just in wakeup()? */
|
||||
mtmp->mstrategy &= ~STRAT_WAITMASK;
|
||||
if (!mtmp->mpeaceful)
|
||||
return;
|
||||
@@ -2681,14 +2704,16 @@ struct monst *mtmp;
|
||||
|
||||
}
|
||||
|
||||
/* wake up a monster, usually making it angry in the process */
|
||||
/* wake up a monster, possibly making it angry in the process */
|
||||
void
|
||||
wakeup(mtmp)
|
||||
wakeup(mtmp, via_attack)
|
||||
register struct monst *mtmp;
|
||||
boolean via_attack;
|
||||
{
|
||||
mtmp->msleeping = 0;
|
||||
finish_meating(mtmp);
|
||||
setmangry(mtmp);
|
||||
if (via_attack)
|
||||
setmangry(mtmp, TRUE);
|
||||
if (mtmp->m_ap_type) {
|
||||
seemimic(mtmp);
|
||||
} else if (context.forcefight && !context.mon_moving
|
||||
|
||||
@@ -320,12 +320,6 @@ int *inrange, *nearby, *scared;
|
||||
|| (!mtmp->mpeaceful && in_your_sanctuary(mtmp, 0, 0)))) {
|
||||
*scared = 1;
|
||||
monflee(mtmp, rnd(rn2(7) ? 10 : 100), TRUE, TRUE);
|
||||
|
||||
/* magical protection won't last forever, so there'll be a
|
||||
* chance of the magic being used up regardless of type */
|
||||
if (sawscary) {
|
||||
wipe_engr_at(seescaryx, seescaryy, 1, TRUE);
|
||||
}
|
||||
} else
|
||||
*scared = 0;
|
||||
}
|
||||
|
||||
@@ -263,7 +263,7 @@ int force;
|
||||
for (x = start_x; x <= end_x; x++)
|
||||
for (y = start_y; y <= end_y; y++) {
|
||||
if ((mtmp = m_at(x, y)) != 0) {
|
||||
wakeup(mtmp); /* peaceful monster will become hostile */
|
||||
wakeup(mtmp, TRUE); /* peaceful monster will become hostile */
|
||||
if (mtmp->mundetected && is_hider(mtmp->data)) {
|
||||
mtmp->mundetected = 0;
|
||||
if (cansee(x, y))
|
||||
|
||||
@@ -1310,8 +1310,8 @@ dogaze()
|
||||
mon_nam(mtmp));
|
||||
if (yn(qbuf) != 'y')
|
||||
continue;
|
||||
setmangry(mtmp);
|
||||
}
|
||||
setmangry(mtmp, TRUE);
|
||||
if (!mtmp->mcanmove || mtmp->mstun || mtmp->msleeping
|
||||
|| !mtmp->mcansee || !haseyes(mtmp->data)) {
|
||||
looked--;
|
||||
|
||||
@@ -1488,7 +1488,7 @@ boolean your_fault;
|
||||
/* target might have been killed */
|
||||
if (mon->mhp > 0) {
|
||||
if (angermon)
|
||||
wakeup(mon);
|
||||
wakeup(mon, TRUE);
|
||||
else
|
||||
mon->msleeping = 0;
|
||||
}
|
||||
|
||||
@@ -795,7 +795,8 @@ angry_priest()
|
||||
if ((priest = findpriest(temple_occupied(u.urooms))) != 0) {
|
||||
struct epri *eprip = EPRI(priest);
|
||||
|
||||
wakeup(priest);
|
||||
wakeup(priest, FALSE);
|
||||
setmangry(priest, FALSE);
|
||||
/*
|
||||
* If the altar has been destroyed or converted, let the
|
||||
* priest run loose.
|
||||
|
||||
@@ -901,7 +901,7 @@ struct obj *sobj;
|
||||
unsigned was_peaceful = mtmp->mpeaceful;
|
||||
|
||||
if (sobj->cursed) {
|
||||
setmangry(mtmp);
|
||||
setmangry(mtmp, FALSE);
|
||||
if (was_peaceful && !mtmp->mpeaceful)
|
||||
return -1;
|
||||
} else {
|
||||
|
||||
@@ -974,7 +974,7 @@ genericptr_t p2;
|
||||
if (cansee(mtmp->mx, mtmp->my))
|
||||
pline("%s coughs!", Monnam(mtmp));
|
||||
if (heros_fault(reg))
|
||||
setmangry(mtmp);
|
||||
setmangry(mtmp, TRUE);
|
||||
if (haseyes(mtmp->data) && mtmp->mcansee) {
|
||||
mtmp->mblinded = 1;
|
||||
mtmp->mcansee = 0;
|
||||
|
||||
@@ -2119,7 +2119,7 @@ register struct monst *mtmp;
|
||||
Recognizing who made the trap isn't completely
|
||||
unreasonable; everybody has their own style. */
|
||||
if (trap->madeby_u && rnl(5))
|
||||
setmangry(mtmp);
|
||||
setmangry(mtmp, TRUE);
|
||||
|
||||
in_sight = canseemon(mtmp);
|
||||
see_it = cansee(mtmp->mx, mtmp->my);
|
||||
@@ -4541,7 +4541,7 @@ boolean *noticed; /* set to true iff hero notices the effect; */
|
||||
or if you sense the monster who becomes trapped */
|
||||
*noticed = cansee(t->tx, t->ty) || canspotmon(mon);
|
||||
/* monster will be angered; mintrap doesn't handle that */
|
||||
wakeup(mon);
|
||||
wakeup(mon, TRUE);
|
||||
++force_mintrap;
|
||||
result = (mintrap(mon) != 0);
|
||||
--force_mintrap;
|
||||
|
||||
24
src/uhitm.c
24
src/uhitm.c
@@ -145,7 +145,7 @@ struct obj *wep; /* uwep for attack(), null for kick_monster() */
|
||||
if (!u.ustuck && !mtmp->mflee && dmgtype(mtmp->data, AD_STCK))
|
||||
u.ustuck = mtmp;
|
||||
}
|
||||
wakeup(mtmp); /* always necessary; also un-mimics mimics */
|
||||
wakeup(mtmp, TRUE); /* always necessary; also un-mimics mimics */
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -190,7 +190,7 @@ struct obj *wep; /* uwep for attack(), null for kick_monster() */
|
||||
*/
|
||||
if ((mtmp->mundetected || mtmp->m_ap_type) && sensemon(mtmp)) {
|
||||
mtmp->mundetected = 0;
|
||||
wakeup(mtmp);
|
||||
wakeup(mtmp, TRUE);
|
||||
}
|
||||
|
||||
if (flags.confirm && mtmp->mpeaceful && !Confusion && !Hallucination
|
||||
@@ -573,7 +573,7 @@ int thrown; /* HMON_xxx (0 => hand-to-hand, other => ranged) */
|
||||
unconventional[0] = '\0';
|
||||
saved_oname[0] = '\0';
|
||||
|
||||
wakeup(mon);
|
||||
wakeup(mon, TRUE);
|
||||
if (!obj) { /* attack with bare hands */
|
||||
if (mdat == &mons[PM_SHADE])
|
||||
tmp = 0;
|
||||
@@ -894,7 +894,7 @@ int thrown; /* HMON_xxx (0 => hand-to-hand, other => ranged) */
|
||||
pline("%s %s over %s!", what,
|
||||
vtense(what, "splash"), whom);
|
||||
}
|
||||
setmangry(mon);
|
||||
setmangry(mon, TRUE);
|
||||
mon->mcansee = 0;
|
||||
tmp = rn1(25, 21);
|
||||
if (((int) mon->mblinded + tmp) > 127)
|
||||
@@ -903,7 +903,7 @@ int thrown; /* HMON_xxx (0 => hand-to-hand, other => ranged) */
|
||||
mon->mblinded += tmp;
|
||||
} else {
|
||||
pline(obj->otyp == CREAM_PIE ? "Splat!" : "Splash!");
|
||||
setmangry(mon);
|
||||
setmangry(mon, TRUE);
|
||||
}
|
||||
if (thrown)
|
||||
obfree(obj, (struct obj *) 0);
|
||||
@@ -2097,7 +2097,7 @@ boolean wouldhavehit;
|
||||
else
|
||||
You("miss it.");
|
||||
if (!mdef->msleeping && mdef->mcanmove)
|
||||
wakeup(mdef);
|
||||
wakeup(mdef, TRUE);
|
||||
}
|
||||
|
||||
/* attack monster as a monster. */
|
||||
@@ -2178,7 +2178,7 @@ register struct monst *mon;
|
||||
sum[i] = damageum(mon, mattk);
|
||||
break;
|
||||
}
|
||||
wakeup(mon);
|
||||
wakeup(mon, TRUE);
|
||||
/* maybe this check should be in damageum()? */
|
||||
if (mon->data == &mons[PM_SHADE]
|
||||
&& !(mattk->aatyp == AT_KICK && uarmf
|
||||
@@ -2212,7 +2212,7 @@ register struct monst *mon;
|
||||
* already grabbed in a previous attack
|
||||
*/
|
||||
dhit = 1;
|
||||
wakeup(mon);
|
||||
wakeup(mon, TRUE);
|
||||
if (mon->data == &mons[PM_SHADE])
|
||||
Your("hug passes harmlessly through %s.", mon_nam(mon));
|
||||
else if (!sticks(mon->data) && !u.uswallow) {
|
||||
@@ -2230,7 +2230,7 @@ register struct monst *mon;
|
||||
|
||||
case AT_EXPL: /* automatic hit if next to */
|
||||
dhit = -1;
|
||||
wakeup(mon);
|
||||
wakeup(mon, TRUE);
|
||||
sum[i] = explum(mon, mattk);
|
||||
break;
|
||||
|
||||
@@ -2238,7 +2238,7 @@ register struct monst *mon;
|
||||
tmp = find_roll_to_hit(mon, mattk->aatyp, (struct obj *) 0,
|
||||
&attknum, &armorpenalty);
|
||||
if ((dhit = (tmp > rnd(20 + i)))) {
|
||||
wakeup(mon);
|
||||
wakeup(mon, TRUE);
|
||||
if (mon->data == &mons[PM_SHADE])
|
||||
Your("attempt to surround %s is harmless.", mon_nam(mon));
|
||||
else {
|
||||
@@ -2637,7 +2637,7 @@ struct monst *mtmp;
|
||||
if (what)
|
||||
pline(fmt, what);
|
||||
|
||||
wakeup(mtmp); /* clears mimicking */
|
||||
wakeup(mtmp, FALSE); /* clears mimicking */
|
||||
/* if hero is blind, wakeup() won't display the monster even though
|
||||
it's no longer concealed */
|
||||
if (!canspotmon(mtmp)
|
||||
@@ -2695,7 +2695,7 @@ struct obj *otmp; /* source of flash */
|
||||
}
|
||||
if (mtmp->mhp > 0) {
|
||||
if (!context.mon_moving)
|
||||
setmangry(mtmp);
|
||||
setmangry(mtmp, TRUE);
|
||||
if (tmp < 9 && !mtmp->isshk && rn2(4))
|
||||
monflee(mtmp, rn2(4) ? rnd(100) : 0, FALSE, TRUE);
|
||||
mtmp->mcansee = 0;
|
||||
|
||||
@@ -400,7 +400,7 @@ invault()
|
||||
}
|
||||
mongone(guard);
|
||||
} else {
|
||||
setmangry(guard);
|
||||
setmangry(guard, FALSE);
|
||||
if (Deaf) {
|
||||
if (!Blind)
|
||||
pline("%s mouths something and looks very angry!",
|
||||
|
||||
@@ -426,7 +426,7 @@ struct obj *otmp;
|
||||
}
|
||||
if (wake) {
|
||||
if (mtmp->mhp > 0) {
|
||||
wakeup(mtmp);
|
||||
wakeup(mtmp, TRUE);
|
||||
m_respond(mtmp);
|
||||
if (mtmp->isshk && !*u.ushops)
|
||||
hot_pursuit(mtmp);
|
||||
@@ -4535,12 +4535,9 @@ short exploding_wand_typ;
|
||||
You("%s of smoke.", !Blind ? "see a puff" : "smell a whiff");
|
||||
}
|
||||
if ((mon = m_at(x, y)) != 0) {
|
||||
/* Cannot use wakeup() which also angers the monster */
|
||||
mon->msleeping = 0;
|
||||
if (mon->m_ap_type)
|
||||
seemimic(mon);
|
||||
wakeup(mon, FALSE);
|
||||
if (type >= 0) {
|
||||
setmangry(mon);
|
||||
setmangry(mon, TRUE);
|
||||
if (mon->ispriest && *in_rooms(mon->mx, mon->my, TEMPLE))
|
||||
ghod_hitsu(mon);
|
||||
if (mon->isshk && !*u.ushops)
|
||||
|
||||
Reference in New Issue
Block a user