diff --git a/doc/fixes35.0 b/doc/fixes35.0 index 4d0bf3f47..33aa9918f 100644 --- a/doc/fixes35.0 +++ b/doc/fixes35.0 @@ -159,6 +159,7 @@ tame/peaceful grabber/engulfer will release hero after conflict ends make changes in hallucination be reflected by changes in mimickery feedback add Unaware pseudo-property to suppress various messages while unconscious missile which kills engulfer will now be placed prior to hero's return to map +bugles affect all monsters to some extent Platform- and/or Interface-Specific Fixes diff --git a/include/extern.h b/include/extern.h index 5febadf0e..ba61c0625 100644 --- a/include/extern.h +++ b/include/extern.h @@ -1427,7 +1427,7 @@ E boolean FDECL(munstone, (struct monst *,BOOLEAN_P)); /* ### music.c ### */ -E void NDECL(awaken_soldiers); +E void FDECL(awaken_soldiers, (struct monst *)); E int FDECL(do_play_instrument, (struct obj *)); /* ### nhlan.c ### */ diff --git a/src/muse.c b/src/muse.c index f1b977ccf..a76421c6b 100644 --- a/src/muse.c +++ b/src/muse.c @@ -574,7 +574,7 @@ struct monst *mtmp; pline("%s plays %s!", Monnam(mtmp), doname(otmp)); else if (!Deaf) You_hear("a bugle playing reveille!"); - awaken_soldiers(); + awaken_soldiers(mtmp); return 2; case MUSE_WAN_TELEPORTATION_SELF: if ((mtmp->isshk && inhishop(mtmp)) diff --git a/src/music.c b/src/music.c index 388334dec..709fd22b4 100644 --- a/src/music.c +++ b/src/music.c @@ -161,12 +161,17 @@ int distance; } } -/* Awake only soldiers of the level. */ - +/* Awake soldiers anywhere the level (and any nearby monster). */ void -awaken_soldiers() +awaken_soldiers(bugler) + struct monst *bugler; /* monster that played instrument */ { register struct monst *mtmp; + int distance, distm; + + /* distance of affected non-soldier monsters to bugler */ + distance = ((bugler == &youmonst) ? + u.ulevel : bugler->data->mlevel) * 30; for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) { if (DEADMONSTER(mtmp)) continue; @@ -178,6 +183,19 @@ awaken_soldiers() pline("%s is now ready for battle!", Monnam(mtmp)); else Norep("You hear the rattle of battle gear being readied."); + } else if ((distm = ((bugler == &youmonst) ? + distu(mtmp->mx, mtmp->my) : + dist2(bugler->mx, bugler->my, mtmp->mx, mtmp->my))) + < distance) { + mtmp->msleeping = 0; + mtmp->mcanmove = 1; + mtmp->mfrozen = 0; + /* may scare some monsters -- waiting monsters excluded */ + if ((mtmp->mstrategy & STRAT_WAITMASK) != 0) + mtmp->mstrategy &= ~STRAT_WAITMASK; + else if (distm < distance/3 && + !resist(mtmp, TOOL_CLASS, 0, NOTELL)) + monflee(mtmp, 0, FALSE, TRUE); } } } @@ -476,7 +494,7 @@ struct obj *instr; break; case BUGLE: /* Awaken & attract soldiers */ You("extract a loud noise from %s.", the(xname(instr))); - awaken_soldiers(); + awaken_soldiers(&youmonst); exercise(A_WIS, FALSE); break; case MAGIC_HARP: /* Charm monsters */