*** oldsrc\include\config.h Wed Mar 20 16:42:44 2002 --- include\config.h Tue Oct 15 19:20:42 2002 *************** *** 335,343 **** --- 335,353 ---- # define DOAGAIN '\001' /* ^A, the "redo" key used in cmd.c and getline.c */ #endif + #define MARRY_FOOCUBI + /* If a foocubus uses a ring of adornment when such rings are engagement rings, + * they get renamed to "darling wife [or husband]". They turn tame, unless the + * ring has a negative enchantment, which cancels them. File compatibility is + * not affected. + * Rob Ellwood, Oct 15, 2002. + */ + #define EXP_ON_BOTL /* Show experience on bottom line */ /* #define SCORE_ON_BOTL */ /* added by Gary Erickson (erickson@ucivax) */ + + /* * Section 5: EXPERIMENTAL STUFF * *** oldsrc\util\makedefs.c Wed Mar 20 16:44:06 2002 --- util\makedefs.c Tue Oct 15 14:19:08 2002 *************** *** 691,696 **** --- 691,699 ---- #ifdef SEDUCE "seduction", #endif + #ifdef MARRY_FOOCUBI + "marry foocubi", + #endif #ifdef SHELL "shell command", #endif *** oldsrc\src\mhitu.c Wed Mar 20 16:43:08 2002 --- src\mhitu.c Tue Oct 15 19:14:38 2002 *************** *** 5,10 **** --- 5,14 ---- #include "hack.h" #include "artifact.h" + #ifdef MARRY_FOOCUBI + #include "edog.h" + #endif + STATIC_VAR NEARDATA struct obj *otmp; STATIC_DCL void FDECL(urustm, (struct monst *, struct obj *)); *************** *** 2075,2084 **** --- 2079,2094 ---- int doseduce(mon) register struct monst *mon; + { register struct obj *ring, *nring; boolean fem = (mon->data == &mons[PM_SUCCUBUS]); /* otherwise incubus */ char qbuf[QBUFSZ]; + #ifdef MARRY_FOOCUBI + struct monst *mon2; + const char *ring_descr; + boolean tame_foocubus_pending = FALSE; + #endif if (mon->mcan || mon->mspec_used) { pline("%s acts as though %s has got a %sheadache.", *************** *** 2114,2119 **** --- 2124,2144 ---- if (ring==uquiver) setuqwep((struct obj *)0); freeinv(ring); (void) mpickobj(mon,ring); + + #ifdef MARRY_FOOCUBI + + /* Copied from "quaff smoky" without true understanding. */ + ring_descr = OBJ_DESCR(objects[ring->otyp]); + if (ring_descr) { + if (!strcmp(ring_descr, "engagement")) { + if (ring->spe < 0) + mon->mcan = TRUE; + else + tame_foocubus_pending = TRUE; + } + } + #endif + } else { char buf[BUFSZ]; *************** *** 2155,2160 **** --- 2180,2199 ---- } else impossible("ring replacement"); Ring_on(ring); prinv((char *)0, ring, 0L); + + #ifdef MARRY_FOOCUBI + + /* Copied from "quaff smoky" without true understanding. */ + ring_descr = OBJ_DESCR(objects[ring->otyp]); + if (ring_descr) { + if (!strcmp(ring_descr, "engagement")) { + if (ring->spe < 0) + mon->mcan = TRUE; + else + tame_foocubus_pending = TRUE; + } + } + #endif } } *************** *** 2185,2190 **** --- 2224,2233 ---- verbalize("You're such a %s; I wish...", flags.female ? "sweet lady" : "nice guy"); if (!tele_restrict(mon)) rloc(mon); + + #ifdef MARRY_FOOCUBI /* The wedding's off. Lout! */ + tame_foocubus_pending = FALSE; + #endif return 1; } if (u.ualign.type == A_CHAOTIC) *************** *** 2264,2269 **** --- 2307,2346 ---- } } + + #ifdef MARRY_FOOCUBI + if (tame_foocubus_pending) { + register struct monst *mtmp2; + + if (fem) + mon = christen_monst(mon, "darling wife"); + else + mon = christen_monst(mon, "darling husband"); + + /* "tamedog" refuses to tame demons unless you're a demon, so: */ + mon->mpeaceful = 1; + set_malign(mon); + mon->mflee = 0; + mon->mfleetim = 0; + + mon2 = newmonst(sizeof(struct edog) + mon->mnamelth); + *mon2 = *mon; + mon2->mxlth = sizeof(struct edog); + if (mon->mnamelth) Strcpy(NAME(mon2), NAME(mon)); + initedog(mon2); + replmon(mon, mon2); + /* `mon' is now obsolete */ + + newsym(mon2->mx, mon2->my); + if (attacktype(mon2->data, AT_WEAP)) { + mon2->weapon_check = NEED_HTH_WEAPON; + (void) mon_wield_item(mon2); + } + return 0; + } + else + #endif + if (mon->mtame) /* don't charge */ ; else if (rn2(20) < ACURR(A_CHA)) { pline("%s demands that you pay %s, but you refuse...",