Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff --git c/include/mondata.h i/include/mondata.h
- index 155ebfa..e815140 100644
- --- c/include/mondata.h
- +++ i/include/mondata.h
- @@ -197,6 +197,10 @@
- #define is_vampire(ptr) ((ptr)->mlet == S_VAMPIRE)
- +/* does not include nymphs; only those who will perform services */
- +#define is_seducer(ptr) \
- + ((ptr) == &mons[PM_SUCCUBUS] || (ptr) == &mons[PM_INCUBUS])
- +
- #define hates_light(ptr) ((ptr) == &mons[PM_GREMLIN])
- /* used to vary a few messages */
- diff --git c/src/apply.c i/src/apply.c
- index e77984d..2565d67 100644
- --- c/src/apply.c
- +++ i/src/apply.c
- @@ -960,8 +960,7 @@ struct obj *obj;
- if (vis)
- pline("%s confuses itself!", Monnam(mtmp));
- mtmp->mconf = 1;
- - } else if (monable && (mlet == S_NYMPH || mtmp->data == &mons[PM_SUCCUBUS]
- - || mtmp->data == &mons[PM_INCUBUS])) {
- + } else if (monable && (mlet == S_NYMPH || is_seducer(mtmp->data))) {
- if (vis) {
- char buf[BUFSZ]; /* "She" or "He" */
- @@ -969,11 +968,15 @@ struct obj *obj;
- mirror);
- pline("%s takes it!", upstart(strcpy(buf, mhe(mtmp))));
- } else
- - pline("It steals your %s!", mirror);
- + pline("It takes your %s!", mirror);
- setnotworn(obj); /* in case mirror was wielded */
- freeinv(obj);
- (void) mpickobj(mtmp, obj);
- - if (!tele_restrict(mtmp))
- + if (mlet != S_NYMPH && !mtmp->mpeaceful && rn2(3)) {
- + pline("%s thanks you for the gift!", Monnam(mtmp));
- + mtmp->mpeaceful = TRUE;
- + set_malign(mtmp);
- + } else if (!tele_restrict(mtmp))
- (void) rloc(mtmp, TRUE);
- } else if (!is_unicorn(mtmp->data) && !humanoid(mtmp->data)
- && (!mtmp->minvis || perceives(mtmp->data)) && rn2(5)) {
- diff --git c/src/attrib.c i/src/attrib.c
- index 028eebf..7df8d62 100644
- --- c/src/attrib.c
- +++ i/src/attrib.c
- @@ -1049,8 +1049,7 @@ int x;
- #endif
- } else if (x == A_CHA) {
- if (tmp < 18
- - && (youmonst.data->mlet == S_NYMPH || u.umonnum == PM_SUCCUBUS
- - || u.umonnum == PM_INCUBUS))
- + && (youmonst.data->mlet == S_NYMPH || is_seducer(youmonst.data)))
- return (schar) 18;
- } else if (x == A_CON) {
- if (uwep && uwep->oartifact == ART_OGRESMASHER)
- diff --git c/src/dokick.c i/src/dokick.c
- index d9e275f..f903a0e 100644
- --- c/src/dokick.c
- +++ i/src/dokick.c
- @@ -293,7 +293,8 @@ register struct obj *gold;
- boolean msg_given = FALSE;
- if (!likes_gold(mtmp->data) && !mtmp->isshk && !mtmp->ispriest
- - && !mtmp->isgd && !is_mercenary(mtmp->data)) {
- + && !mtmp->isgd && !is_mercenary(mtmp->data)
- + && !is_seducer(mtmp->data)) {
- wakeup(mtmp, TRUE);
- } else if (!mtmp->mcanmove) {
- /* too light to do real damage */
- @@ -379,6 +380,14 @@ register struct obj *gold;
- verbalize("That should do. Now beat it!");
- else
- verbalize("That's not enough, coward!");
- + } else if (is_seducer(mtmp->data)) {
- + if (value < rnz(300)) /* arbitrary */
- + verbalize("Fie! I've had Convicts who paid more!");
- + else {
- + mtmp->mpeaceful = TRUE;
- + set_malign(mtmp);
- + verbalize("Impressive! Let's get down to business, then.");
- + }
- }
- return TRUE;
- }
- diff --git c/src/makemon.c i/src/makemon.c
- index 3145ad6..a2900eb 100644
- --- c/src/makemon.c
- +++ i/src/makemon.c
- @@ -1332,6 +1332,15 @@ int mmflags;
- if (uwep && uwep->oartifact == ART_EXCALIBUR)
- mtmp->mpeaceful = mtmp->mtame = FALSE;
- }
- + if (is_seducer(ptr)) {
- + /* Let them be more amiable to potential customers. */
- + int reqmoney;
- + if (sgn(ptr->maligntyp) == u.ualign.type)
- + reqmoney = rnz(1000);
- + else
- + reqmoney = rnz(1500);
- + mtmp->mpeaceful = (money_cnt(invent) >= reqmoney);
- + }
- #ifndef DCC30_BUG
- if (mndx == PM_LONG_WORM && (mtmp->wormno = get_wormno()) != 0)
- #else
- diff --git c/src/mhitu.c i/src/mhitu.c
- index 849ddb1..e076d6f 100644
- --- c/src/mhitu.c
- +++ i/src/mhitu.c
- @@ -270,15 +270,12 @@ struct attack *alt_attk_buf;
- /* honor SEDUCE=0 */
- if (!SYSOPT_SEDUCE) {
- - extern const struct attack sa_no[NATTK];
- -
- /* if the first attack is for SSEX damage, all six attacks will be
- substituted (expected succubus/incubus handling); if it isn't
- but another one is, only that other one will be substituted */
- - if (mptr->mattk[0].adtyp == AD_SSEX) {
- - *alt_attk_buf = sa_no[indx];
- - attk = alt_attk_buf;
- - } else if (attk->adtyp == AD_SSEX) {
- + /* foocubi always have AD_DRLI attacks now, so only second option
- + * remains... and even it isn't relevant for vanilla */
- + if (attk->adtyp == AD_SSEX) {
- *alt_attk_buf = *attk;
- attk = alt_attk_buf;
- attk->adtyp = AD_DRLI;
- @@ -1340,11 +1337,7 @@ register struct attack *mattk;
- if (mtmp->mcan)
- break;
- /* Continue below */
- - } else if (dmgtype(youmonst.data, AD_SEDU)
- - /* !SYSOPT_SEDUCE: when hero is attacking and AD_SSEX
- - is disabled, it would be changed to another damage
- - type, but when defending, it remains as-is */
- - || dmgtype(youmonst.data, AD_SSEX)) {
- + } else if (youmonst.data->msound == MS_SEDUCE) {
- pline("%s %s.", Monnam(mtmp),
- Deaf ? "says something but you can't hear it"
- : mtmp->minvent
- @@ -2406,8 +2399,8 @@ struct attack *mattk; /* non-Null: current attack; Null: general capability */
- }
- adtyp = mattk ? mattk->adtyp
- - : dmgtype(pagr, AD_SSEX) ? AD_SSEX
- - : dmgtype(pagr, AD_SEDU) ? AD_SEDU
- + : is_seducer(pagr) ? AD_SSEX
- + : pagr->msound == MS_SEDUCE ? AD_SEDU
- : AD_PHYS;
- if (adtyp == AD_SSEX && !SYSOPT_SEDUCE)
- adtyp = AD_SEDU;
- @@ -2419,8 +2412,7 @@ struct attack *mattk; /* non-Null: current attack; Null: general capability */
- for seduction, both pass the could_seduce() test;
- incubi/succubi have three attacks, their claw attacks for damage
- don't pass the test */
- - if ((pagr->mlet != S_NYMPH
- - && pagr != &mons[PM_INCUBUS] && pagr != &mons[PM_SUCCUBUS])
- + if ((pagr->mlet != S_NYMPH && !is_seducer(pagr))
- || (adtyp != AD_SEDU && adtyp != AD_SSEX && adtyp != AD_SITM))
- return 0;
- @@ -2447,6 +2439,18 @@ struct monst *mon;
- pline("%s seems dismayed at your lack of response.", Monnam(mon));
- return 0;
- }
- + if (!mon->mtame) {
- + int price = (400 + u.ulevel * 20) * (50 - ACURR(A_CHA)) / 50;
- + verbalize("I'm all yours for %d %s, dear.", price, currency(price));
- + if (yn("Pay?") != 'y')
- + return 0;
- + if (price > money_cnt(invent)) {
- + You("don't have enough money!");
- + return 0;
- + }
- + money2mon(mon, price);
- + context.botl = 1;
- + }
- seewho = canseemon(mon);
- if (!seewho)
- pline("Someone caresses you...");
- @@ -2686,37 +2690,6 @@ struct monst *mon;
- }
- }
- - if (mon->mtame) { /* don't charge */
- - ;
- - } else if (rn2(20) < ACURR(A_CHA)) {
- - pline("%s demands that you pay %s, but you refuse...",
- - noit_Monnam(mon), noit_mhim(mon));
- - } else if (u.umonnum == PM_LEPRECHAUN) {
- - pline("%s tries to take your money, but fails...", noit_Monnam(mon));
- - } else {
- - long cost;
- - long umoney = money_cnt(invent);
- -
- - if (umoney > (long) LARGEST_INT - 10L)
- - cost = (long) rnd(LARGEST_INT) + 500L;
- - else
- - cost = (long) rnd((int) umoney + 10) + 500L;
- - if (mon->mpeaceful) {
- - cost /= 5L;
- - if (!cost)
- - cost = 1L;
- - }
- - if (cost > umoney)
- - cost = umoney;
- - if (!cost) {
- - verbalize("It's on the house!");
- - } else {
- - pline("%s takes %ld %s for services rendered!", noit_Monnam(mon),
- - cost, currency(cost));
- - money2mon(mon, cost);
- - context.botl = 1;
- - }
- - }
- if (!rn2(25))
- mon->mcan = 1; /* monster is worn out */
- if (!tele_restrict(mon))
- diff --git c/src/monst.c i/src/monst.c
- index 6b8a5f7..146fffa 100644
- --- c/src/monst.c
- +++ i/src/monst.c
- @@ -2372,9 +2372,9 @@ struct permonst _mons2[] = {
- A(ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_CLAW, AD_PHYS, 1, 3), \
- ATTK(AT_BITE, AD_DRLI, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK)
- MON("succubus", S_DEMON, LVL(6, 12, 0, 70, -9), (G_NOCORPSE | 1),
- - SEDUCTION_ATTACKS_YES, SIZ(WT_HUMAN, 400, MS_SEDUCE, MZ_HUMAN),
- + SEDUCTION_ATTACKS_NO, SIZ(WT_HUMAN, 400, MS_SEDUCE, MZ_HUMAN),
- MR_FIRE | MR_POISON, 0, M1_HUMANOID | M1_FLY | M1_POIS,
- - M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY | M2_FEMALE,
- + M2_DEMON | M2_STALK | M2_NASTY | M2_FEMALE,
- M3_INFRAVISIBLE | M3_INFRAVISION, 8, CLR_GRAY),
- MON("horned devil", S_DEMON, LVL(6, 9, -5, 50, 11),
- (G_HELL | G_NOCORPSE | 2),
- @@ -2385,9 +2385,9 @@ struct permonst _mons2[] = {
- M1_POIS | M1_THICK_HIDE, M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY,
- M3_INFRAVISIBLE | M3_INFRAVISION, 9, CLR_BROWN),
- MON("incubus", S_DEMON, LVL(6, 12, 0, 70, -9), (G_NOCORPSE | 1),
- - SEDUCTION_ATTACKS_YES, SIZ(WT_HUMAN, 400, MS_SEDUCE, MZ_HUMAN),
- + SEDUCTION_ATTACKS_NO, SIZ(WT_HUMAN, 400, MS_SEDUCE, MZ_HUMAN),
- MR_FIRE | MR_POISON, 0, M1_HUMANOID | M1_FLY | M1_POIS,
- - M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY | M2_MALE,
- + M2_DEMON | M2_STALK | M2_NASTY | M2_MALE,
- M3_INFRAVISIBLE | M3_INFRAVISION, 8, CLR_GRAY),
- /* Used by AD&D for a type of demon, originally one of the Furies
- and spelled this way */
- @@ -3234,9 +3234,6 @@ monst_init()
- {
- return;
- }
- -
- -const struct attack sa_yes[NATTK] = SEDUCTION_ATTACKS_YES;
- -const struct attack sa_no[NATTK] = SEDUCTION_ATTACKS_NO;
- #endif
- /*monst.c*/
- diff --git c/src/sounds.c i/src/sounds.c
- index 1bf7716..495213d 100644
- --- c/src/sounds.c
- +++ i/src/sounds.c
- @@ -841,7 +841,7 @@ register struct monst *mtmp;
- int swval;
- if (SYSOPT_SEDUCE) {
- - if (ptr->mlet != S_NYMPH
- + if (is_seducer(ptr) && mtmp->mpeaceful
- && could_seduce(mtmp, &youmonst, (struct attack *) 0) == 1) {
- (void) doseduce(mtmp);
- break;
- @@ -849,6 +849,13 @@ register struct monst *mtmp;
- swval = ((poly_gender() != (int) mtmp->female) ? rn2(3) : 0);
- } else
- swval = ((poly_gender() == 0) ? rn2(3) : 0);
- + if (is_seducer(ptr) && !mtmp->mpeaceful) {
- + if (is_demon(ptr) && !rn2(3))
- + cuss(mtmp);
- + else
- + verbl_msg = "I doubt thou couldst even afford me, oaf.";
- + break;
- + }
- switch (swval) {
- case 2:
- verbl_msg = "Hello, sailor.";
- diff --git c/src/steed.c i/src/steed.c
- index 9de2935..28bc045 100644
- --- c/src/steed.c
- +++ i/src/steed.c
- @@ -75,7 +75,7 @@ struct obj *otmp;
- instapetrify(kbuf);
- }
- }
- - if (ptr == &mons[PM_INCUBUS] || ptr == &mons[PM_SUCCUBUS]) {
- + if (is_seducer(ptr)) {
- pline("Shame on you!");
- exercise(A_WIS, FALSE);
- return 1;
- diff --git c/src/sys.c i/src/sys.c
- index 6a0c52d..651c16c 100644
- --- c/src/sys.c
- +++ i/src/sys.c
- @@ -123,8 +123,10 @@ sysopt_release()
- return;
- }
- +#if 0
- extern const struct attack sa_yes[NATTK];
- extern const struct attack sa_no[NATTK];
- +#endif
- void
- sysopt_seduce_set(val)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement