tuning: succubi

This one had been intended for longer than several years, but I
hadn't gotten around to it.  When consorting with succubi and
incubi, very high Cha+Int no longer guarantees that a positive
outcome will occur.

Chance of positive outcome is still quite high and most of the
negative outcomes are pretty easy to repair, so this isn't likely
to make a significant impact.  However, the possibility of losing
spell power will matter for some players....
This commit is contained in:
PatR
2016-03-18 15:50:13 -07:00
parent 6ae8f291ac
commit bb68c4b4e7

View File

@@ -2302,7 +2302,7 @@ register struct monst *mon;
{ {
register struct obj *ring, *nring; register struct obj *ring, *nring;
boolean fem = (mon->data == &mons[PM_SUCCUBUS]); /* otherwise incubus */ boolean fem = (mon->data == &mons[PM_SUCCUBUS]); /* otherwise incubus */
int tried_gloves = 0; int attr_tot, tried_gloves = 0;
char qbuf[QBUFSZ]; char qbuf[QBUFSZ];
if (mon->mcan || mon->mspec_used) { if (mon->mcan || mon->mspec_used) {
@@ -2443,7 +2443,12 @@ register struct monst *mon;
/* by this point you have discovered mon's identity, blind or not... */ /* by this point you have discovered mon's identity, blind or not... */
pline("Time stands still while you and %s lie in each other's arms...", pline("Time stands still while you and %s lie in each other's arms...",
noit_mon_nam(mon)); noit_mon_nam(mon));
if (rn2(35) > ACURR(A_CHA) + ACURR(A_INT)) { /* 3.6.1: a combined total for charisma plus intelligence of 35-1
used to guarantee successful outcome; now total maxes out at 32
as far as deciding what will happen; chance for bad outcome when
Cha+Int is 32 or more is 2/35, a bit over 5.7% */
attr_tot = ACURR(A_CHA) + ACURR(A_INT);
if (rn2(35) > min(attr_tot, 32)) {
/* Don't bother with mspec_used here... it didn't get tired! */ /* Don't bother with mspec_used here... it didn't get tired! */
pline("%s seems to have enjoyed it more than you...", pline("%s seems to have enjoyed it more than you...",
noit_Monnam(mon)); noit_Monnam(mon));
@@ -2475,16 +2480,20 @@ register struct monst *mon;
} else { } else {
You("have a curious feeling..."); You("have a curious feeling...");
} }
exercise(A_CON, FALSE);
exercise(A_DEX, FALSE);
exercise(A_WIS, FALSE);
break; break;
case 4: { case 4: {
int tmp; int tmp;
You_feel("exhausted."); You_feel("exhausted.");
exercise(A_STR, FALSE); exercise(A_STR, FALSE);
tmp = rn1(10, 6); tmp = rn1(10, 6);
losehp(Maybe_Half_Phys(tmp), "exhaustion", KILLED_BY); losehp(Maybe_Half_Phys(tmp), "exhaustion", KILLED_BY);
break; break;
} } /* case 4 */
} } /* switch */
} else { } else {
mon->mspec_used = rnd(100); /* monster is worn out */ mon->mspec_used = rnd(100); /* monster is worn out */
You("seem to have enjoyed it more than %s...", noit_mon_nam(mon)); You("seem to have enjoyed it more than %s...", noit_mon_nam(mon));
@@ -2522,14 +2531,14 @@ register struct monst *mon;
} }
} }
if (mon->mtame) /* don't charge */ if (mon->mtame) { /* don't charge */
; ;
else if (rn2(20) < ACURR(A_CHA)) { } else if (rn2(20) < ACURR(A_CHA)) {
pline("%s demands that you pay %s, but you refuse...", pline("%s demands that you pay %s, but you refuse...",
noit_Monnam(mon), Blind ? (fem ? "her" : "him") : mhim(mon)); noit_Monnam(mon), Blind ? (fem ? "her" : "him") : mhim(mon));
} else if (u.umonnum == PM_LEPRECHAUN) } else if (u.umonnum == PM_LEPRECHAUN) {
pline("%s tries to take your money, but fails...", noit_Monnam(mon)); pline("%s tries to take your money, but fails...", noit_Monnam(mon));
else { } else {
long cost; long cost;
long umoney = money_cnt(invent); long umoney = money_cnt(invent);
@@ -2544,9 +2553,9 @@ register struct monst *mon;
} }
if (cost > umoney) if (cost > umoney)
cost = umoney; cost = umoney;
if (!cost) if (!cost) {
verbalize("It's on the house!"); verbalize("It's on the house!");
else { } else {
pline("%s takes %ld %s for services rendered!", noit_Monnam(mon), pline("%s takes %ld %s for services rendered!", noit_Monnam(mon),
cost, currency(cost)); cost, currency(cost));
money2mon(mon, cost); money2mon(mon, cost);