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:34:57 +03:00
parent 11e98efb94
commit 2f25556025
9 changed files with 27 additions and 10 deletions

View File

@@ -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

View File

@@ -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) {

View File

@@ -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;

View File

@@ -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*/

View File

@@ -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) {

View File

@@ -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));

View File

@@ -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);