fix tamed pet issue #1379

fixes #1379
This commit is contained in:
nhmall
2025-02-12 23:26:03 -05:00
parent f8773f65db
commit a68bc3b3fb
4 changed files with 24 additions and 20 deletions

View File

@@ -743,7 +743,7 @@ extern int count_worn_armor(void);
extern void newedog(struct monst *) NONNULLARG1; extern void newedog(struct monst *) NONNULLARG1;
extern void free_edog(struct monst *) NONNULLARG1; extern void free_edog(struct monst *) NONNULLARG1;
extern void initedog(struct monst *) NONNULLARG1; extern void initedog(struct monst *, boolean) NONNULLARG1;
extern struct monst *make_familiar(struct obj *, coordxy, coordxy, boolean); extern struct monst *make_familiar(struct obj *, coordxy, coordxy, boolean);
extern struct monst *makedog(void); extern struct monst *makedog(void);
extern void update_mlstmv(void); extern void update_mlstmv(void);

View File

@@ -42,25 +42,27 @@ free_edog(struct monst *mtmp)
} }
void void
initedog(struct monst *mtmp) initedog(struct monst *mtmp, boolean everything)
{ {
mtmp->mtame = is_domestic(mtmp->data) ? 10 : 5; mtmp->mtame = is_domestic(mtmp->data) ? 10 : 5;
mtmp->mpeaceful = 1; mtmp->mpeaceful = 1;
mtmp->mavenge = 0; mtmp->mavenge = 0;
set_malign(mtmp); /* recalc alignment now that it's tamed */ set_malign(mtmp); /* recalc alignment now that it's tamed */
mtmp->mleashed = 0; if (everything) {
mtmp->meating = 0; mtmp->mleashed = 0;
EDOG(mtmp)->droptime = 0; mtmp->meating = 0;
EDOG(mtmp)->dropdist = 10000; EDOG(mtmp)->droptime = 0;
EDOG(mtmp)->apport = ACURR(A_CHA); EDOG(mtmp)->dropdist = 10000;
EDOG(mtmp)->whistletime = 0; EDOG(mtmp)->apport = ACURR(A_CHA);
EDOG(mtmp)->hungrytime = 1000 + svm.moves; EDOG(mtmp)->whistletime = 0;
EDOG(mtmp)->ogoal.x = -1; /* force error if used before set */ EDOG(mtmp)->hungrytime = 1000 + svm.moves;
EDOG(mtmp)->ogoal.y = -1; EDOG(mtmp)->ogoal.x = -1; /* force error if used before set */
EDOG(mtmp)->abuse = 0; EDOG(mtmp)->ogoal.y = -1;
EDOG(mtmp)->revivals = 0; EDOG(mtmp)->abuse = 0;
EDOG(mtmp)->mhpmax_penalty = 0; EDOG(mtmp)->revivals = 0;
EDOG(mtmp)->killed_by_u = 0; EDOG(mtmp)->mhpmax_penalty = 0;
EDOG(mtmp)->killed_by_u = 0;
}
u.uconduct.pets++; u.uconduct.pets++;
} }
@@ -155,7 +157,7 @@ make_familiar(struct obj *otmp, coordxy x, coordxy y, boolean quietly)
if (is_pool(mtmp->mx, mtmp->my) && minliquid(mtmp)) if (is_pool(mtmp->mx, mtmp->my) && minliquid(mtmp))
return (struct monst *) 0; return (struct monst *) 0;
initedog(mtmp); initedog(mtmp, TRUE);
mtmp->msleeping = 0; mtmp->msleeping = 0;
if (otmp) { /* figurine; resulting monster might not become a pet */ if (otmp) { /* figurine; resulting monster might not become a pet */
chance = rn2(10); /* 0==tame, 1==peaceful, 2==hostile */ chance = rn2(10); /* 0==tame, 1==peaceful, 2==hostile */
@@ -244,7 +246,7 @@ makedog(void)
if (!gp.petname_used++ && *petname) if (!gp.petname_used++ && *petname)
mtmp = christen_monst(mtmp, petname); mtmp = christen_monst(mtmp, petname);
initedog(mtmp); initedog(mtmp, TRUE);
return mtmp; return mtmp;
} }
@@ -1214,7 +1216,9 @@ tamedog(
/* add the pet extension */ /* add the pet extension */
if (!has_edog(mtmp)) { if (!has_edog(mtmp)) {
newedog(mtmp); newedog(mtmp);
initedog(mtmp); initedog(mtmp, TRUE);
} else {
initedog(mtmp, FALSE);
} }
if (obj) { /* thrown food */ if (obj) { /* thrown food */

View File

@@ -2572,7 +2572,7 @@ cloneu(void)
return NULL; return NULL;
mon->mcloned = 1; mon->mcloned = 1;
mon = christen_monst(mon, svp.plname); mon = christen_monst(mon, svp.plname);
initedog(mon); initedog(mon, TRUE);
mon->m_lev = gy.youmonst.data->mlevel; mon->m_lev = gy.youmonst.data->mlevel;
mon->mhpmax = u.mhmax; mon->mhpmax = u.mhmax;
mon->mhp = u.mh / 2; mon->mhp = u.mh / 2;

View File

@@ -1680,7 +1680,7 @@ seffect_light(struct obj **sobjp)
mon = makemon(&mons[pm], u.ux, u.uy, mon = makemon(&mons[pm], u.ux, u.uy,
MM_EDOG | NO_MINVENT | MM_NOMSG); MM_EDOG | NO_MINVENT | MM_NOMSG);
if (mon) { if (mon) {
initedog(mon); initedog(mon, TRUE);
mon->msleeping = 0; mon->msleeping = 0;
mon->mcan = TRUE; mon->mcan = TRUE;
if (canspotmon(mon)) if (canspotmon(mon))