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.
This commit is contained in:
Pasi Kallinen
2021-05-19 18:35:00 +03:00
parent 11e98efb94
commit 2f25556025
9 changed files with 27 additions and 10 deletions
+1
View File
@@ -524,6 +524,7 @@ knights get no metal armor penalty for clerical spells
change touch of death from instadeath to maxhp reduction and damage change touch of death from instadeath to maxhp reduction and damage
dying from being level-drained below level 1 killed hero without saying so dying from being level-drained below level 1 killed hero without saying so
and jumped straight to "do you want your possessions identified?" 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 Fixes to 3.7.0-x Problems that Were Exposed Via git Repository
+1
View File
@@ -1494,6 +1494,7 @@ extern const struct permonst *raceptr(struct monst *);
extern boolean olfaction(struct permonst *); extern boolean olfaction(struct permonst *);
unsigned long cvt_adtyp_to_mseenres(uchar); unsigned long cvt_adtyp_to_mseenres(uchar);
extern void monstseesu(unsigned long); extern void monstseesu(unsigned long);
extern boolean resist_conflict(struct monst *);
/* ### monmove.c ### */ /* ### monmove.c ### */
+2 -2
View File
@@ -885,7 +885,7 @@ dog_move(register struct monst *mtmp,
udist = distu(omx, omy); udist = distu(omx, omy);
/* Let steeds eat and maybe throw rider during Conflict */ /* Let steeds eat and maybe throw rider during Conflict */
if (mtmp == u.usteed) { if (mtmp == u.usteed) {
if (Conflict && !resist(mtmp, RING_CLASS, 0, 0)) { if (Conflict && !resist_conflict(mtmp)) {
dismount_steed(DISMOUNT_THROWN); dismount_steed(DISMOUNT_THROWN);
return 1; return 1;
} }
@@ -915,7 +915,7 @@ dog_move(register struct monst *mtmp,
if (appr == -2) if (appr == -2)
return 0; return 0;
if (Conflict && !resist(mtmp, RING_CLASS, 0, 0)) { if (Conflict && !resist_conflict(mtmp)) {
if (!has_edog) { if (!has_edog) {
/* Guardian angel refuses to be conflicted; rather, /* Guardian angel refuses to be conflicted; rather,
* it disappears, angrily, and sends in some nasties * it disappears, angrily, and sends in some nasties
+1 -1
View File
@@ -116,7 +116,7 @@ fightm(register struct monst *mtmp)
nmon = 0; nmon = 0;
#endif #endif
/* perhaps the monster will resist Conflict */ /* perhaps the monster will resist Conflict */
if (resist(mtmp, RING_CLASS, 0, 0)) if (resist_conflict(mtmp))
return 0; return 0;
if (u.ustuck == mtmp) { if (u.ustuck == mtmp) {
+3 -3
View File
@@ -1019,7 +1019,7 @@ movemon(void)
} }
/* continue if the monster died fighting */ /* continue if the monster died fighting */
if (Conflict && !mtmp->iswiz && mtmp->mcansee) { if (Conflict && !mtmp->iswiz && m_canseeu(mtmp)) {
/* Note: /* Note:
* Conflict does not take effect in the first round. * Conflict does not take effect in the first round.
* Therefore, A monster when stepping into the area will * 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 * The call to fightm() must be _last_. The monster might
* have died if it returns 1. * 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) && (distu(mtmp->mx, mtmp->my) <= BOLT_LIM * BOLT_LIM)
&& fightm(mtmp)) && fightm(mtmp))
continue; /* mon might have died */ continue; /* mon might have died */
@@ -1611,7 +1611,7 @@ mon_allowflags(struct monst* mtmp)
allowflags |= ALLOW_SANCT | ALLOW_SSM; allowflags |= ALLOW_SANCT | ALLOW_SSM;
else else
allowflags |= ALLOW_U; allowflags |= ALLOW_U;
if (Conflict && !resist(mtmp, RING_CLASS, 0, 0)) if (Conflict && !resist_conflict(mtmp))
allowflags |= ALLOW_U; allowflags |= ALLOW_U;
if (mtmp->isshk) if (mtmp->isshk)
allowflags |= ALLOW_SSM; allowflags |= ALLOW_SSM;
+15
View File
@@ -1255,4 +1255,19 @@ monstseesu(unsigned long seenres)
m_setseenres(mtmp, 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*/ /*mondata.c*/
+2 -2
View File
@@ -544,7 +544,7 @@ dochug(register struct monst* mtmp)
} }
pline("A wave of psychic energy pours over you!"); pline("A wave of psychic energy pours over you!");
if (mtmp->mpeaceful if (mtmp->mpeaceful
&& (!Conflict || resist(mtmp, RING_CLASS, 0, 0))) { && (!Conflict || resist_conflict(mtmp))) {
pline("It feels quite soothing."); pline("It feels quite soothing.");
} else if (!u.uinvulnerable) { } else if (!u.uinvulnerable) {
int dmg; int dmg;
@@ -710,7 +710,7 @@ dochug(register struct monst* mtmp)
*/ */
if (tmp != 3 && (!mtmp->mpeaceful if (tmp != 3 && (!mtmp->mpeaceful
|| (Conflict && !resist(mtmp, RING_CLASS, 0, 0)))) { || (Conflict && !resist_conflict(mtmp)))) {
if (inrange && !scared && !noattacks(mdat) if (inrange && !scared && !noattacks(mdat)
/* [is this hp check really needed?] */ /* [is this hp check really needed?] */
&& (Upolyd ? u.mh : u.uhp) > 0) { && (Upolyd ? u.mh : u.uhp) > 0) {
+1 -1
View File
@@ -191,7 +191,7 @@ pri_move(struct monst *priest)
gy += rn1(3, -1); gy += rn1(3, -1);
if (!priest->mpeaceful if (!priest->mpeaceful
|| (Conflict && !resist(priest, RING_CLASS, 0, 0))) { || (Conflict && !resist_conflict(priest))) {
if (monnear(priest, u.ux, u.uy)) { if (monnear(priest, u.ux, u.uy)) {
if (Displaced) if (Displaced)
Your("displaced image doesn't fool %s!", mon_nam(priest)); Your("displaced image doesn't fool %s!", mon_nam(priest));
+1 -1
View File
@@ -3757,7 +3757,7 @@ shk_move(struct monst* shkp)
if ((udist = distu(omx, omy)) < 3 && (shkp->data != &mons[PM_GRID_BUG] if ((udist = distu(omx, omy)) < 3 && (shkp->data != &mons[PM_GRID_BUG]
|| (omx == u.ux || omy == u.uy))) { || (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) if (Displaced)
Your("displaced image doesn't fool %s!", shkname(shkp)); Your("displaced image doesn't fool %s!", shkname(shkp));
(void) mattacku(shkp); (void) mattacku(shkp);