diff --git a/doc/fixes37.0 b/doc/fixes37.0 index fffcfdf09..617c8d8f0 100644 --- a/doc/fixes37.0 +++ b/doc/fixes37.0 @@ -524,6 +524,7 @@ knights get no metal armor penalty for clerical spells change touch of death from instadeath to maxhp reduction and damage dying from being level-drained below level 1 killed hero without saying so and jumped straight to "do you want your possessions identified?" +conflict will now consider your charisma and requires line of sight Fixes to 3.7.0-x Problems that Were Exposed Via git Repository diff --git a/include/extern.h b/include/extern.h index 5956b547d..de1b834f7 100644 --- a/include/extern.h +++ b/include/extern.h @@ -1494,6 +1494,7 @@ extern const struct permonst *raceptr(struct monst *); extern boolean olfaction(struct permonst *); unsigned long cvt_adtyp_to_mseenres(uchar); extern void monstseesu(unsigned long); +extern boolean resist_conflict(struct monst *); /* ### monmove.c ### */ diff --git a/src/dogmove.c b/src/dogmove.c index 120f4156c..fa5b0a389 100644 --- a/src/dogmove.c +++ b/src/dogmove.c @@ -885,7 +885,7 @@ dog_move(register struct monst *mtmp, udist = distu(omx, omy); /* Let steeds eat and maybe throw rider during Conflict */ if (mtmp == u.usteed) { - if (Conflict && !resist(mtmp, RING_CLASS, 0, 0)) { + if (Conflict && !resist_conflict(mtmp)) { dismount_steed(DISMOUNT_THROWN); return 1; } @@ -915,7 +915,7 @@ dog_move(register struct monst *mtmp, if (appr == -2) return 0; - if (Conflict && !resist(mtmp, RING_CLASS, 0, 0)) { + if (Conflict && !resist_conflict(mtmp)) { if (!has_edog) { /* Guardian angel refuses to be conflicted; rather, * it disappears, angrily, and sends in some nasties diff --git a/src/mhitm.c b/src/mhitm.c index 6c046c9c0..13e36af1f 100644 --- a/src/mhitm.c +++ b/src/mhitm.c @@ -116,7 +116,7 @@ fightm(register struct monst *mtmp) nmon = 0; #endif /* perhaps the monster will resist Conflict */ - if (resist(mtmp, RING_CLASS, 0, 0)) + if (resist_conflict(mtmp)) return 0; if (u.ustuck == mtmp) { diff --git a/src/mon.c b/src/mon.c index 368d4c1ba..80714d052 100644 --- a/src/mon.c +++ b/src/mon.c @@ -1019,7 +1019,7 @@ movemon(void) } /* continue if the monster died fighting */ - if (Conflict && !mtmp->iswiz && mtmp->mcansee) { + if (Conflict && !mtmp->iswiz && m_canseeu(mtmp)) { /* Note: * Conflict does not take effect in the first round. * Therefore, A monster when stepping into the area will @@ -1028,7 +1028,7 @@ movemon(void) * The call to fightm() must be _last_. The monster might * have died if it returns 1. */ - if (couldsee(mtmp->mx, mtmp->my) + if (cansee(mtmp->mx, mtmp->my) && (distu(mtmp->mx, mtmp->my) <= BOLT_LIM * BOLT_LIM) && fightm(mtmp)) continue; /* mon might have died */ @@ -1611,7 +1611,7 @@ mon_allowflags(struct monst* mtmp) allowflags |= ALLOW_SANCT | ALLOW_SSM; else allowflags |= ALLOW_U; - if (Conflict && !resist(mtmp, RING_CLASS, 0, 0)) + if (Conflict && !resist_conflict(mtmp)) allowflags |= ALLOW_U; if (mtmp->isshk) allowflags |= ALLOW_SSM; diff --git a/src/mondata.c b/src/mondata.c index 2dc28bb0e..a85f4dea8 100644 --- a/src/mondata.c +++ b/src/mondata.c @@ -1255,4 +1255,19 @@ monstseesu(unsigned long seenres) m_setseenres(mtmp, seenres); } +/* Can monster resist conflict caused by hero? + + High-CHA heroes will be able to 'convince' monsters + (through the magic of the ring, of course) to fight + for them much more easily than low-CHA ones. +*/ +boolean +resist_conflict(struct monst* mtmp) +{ + /* always a small chance at 19 */ + int resist_chance = min(19, (ACURR(A_CHA) - mtmp->m_lev + u.ulevel)); + + return (rnd(20) > resist_chance); +} + /*mondata.c*/ diff --git a/src/monmove.c b/src/monmove.c index 4ba8b5acc..7c9069820 100644 --- a/src/monmove.c +++ b/src/monmove.c @@ -544,7 +544,7 @@ dochug(register struct monst* mtmp) } pline("A wave of psychic energy pours over you!"); if (mtmp->mpeaceful - && (!Conflict || resist(mtmp, RING_CLASS, 0, 0))) { + && (!Conflict || resist_conflict(mtmp))) { pline("It feels quite soothing."); } else if (!u.uinvulnerable) { int dmg; @@ -710,7 +710,7 @@ dochug(register struct monst* mtmp) */ if (tmp != 3 && (!mtmp->mpeaceful - || (Conflict && !resist(mtmp, RING_CLASS, 0, 0)))) { + || (Conflict && !resist_conflict(mtmp)))) { if (inrange && !scared && !noattacks(mdat) /* [is this hp check really needed?] */ && (Upolyd ? u.mh : u.uhp) > 0) { diff --git a/src/priest.c b/src/priest.c index a62ed76ad..f42743cf7 100644 --- a/src/priest.c +++ b/src/priest.c @@ -191,7 +191,7 @@ pri_move(struct monst *priest) gy += rn1(3, -1); if (!priest->mpeaceful - || (Conflict && !resist(priest, RING_CLASS, 0, 0))) { + || (Conflict && !resist_conflict(priest))) { if (monnear(priest, u.ux, u.uy)) { if (Displaced) Your("displaced image doesn't fool %s!", mon_nam(priest)); diff --git a/src/shk.c b/src/shk.c index 9fe5399e3..1f2f07c75 100644 --- a/src/shk.c +++ b/src/shk.c @@ -3757,7 +3757,7 @@ shk_move(struct monst* shkp) if ((udist = distu(omx, omy)) < 3 && (shkp->data != &mons[PM_GRID_BUG] || (omx == u.ux || omy == u.uy))) { - if (ANGRY(shkp) || (Conflict && !resist(shkp, RING_CLASS, 0, 0))) { + if (ANGRY(shkp) || (Conflict && !resist_conflict(shkp))) { if (Displaced) Your("displaced image doesn't fool %s!", shkname(shkp)); (void) mattacku(shkp);