From: Pasi Kallinen Date: Wed, 19 May 2021 15:34:57 +0000 (+0300) Subject: Conflict based off of charisma X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2f255560252b0c18ed468baf94b58654bd5413f7;p=nethack Conflict based off of charisma Higher charisma will make it more likely for monsters to be affected. Conflict will also now require the monster to see the hero. Originally from SporkHack by Derek Ray. --- 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);