From a68bc3b3fbe3da5998971d2fb384f08c137337c0 Mon Sep 17 00:00:00 2001 From: nhmall Date: Wed, 12 Feb 2025 23:26:03 -0500 Subject: [PATCH] fix tamed pet issue #1379 fixes #1379 --- include/extern.h | 2 +- src/dog.c | 38 +++++++++++++++++++++----------------- src/mhitu.c | 2 +- src/read.c | 2 +- 4 files changed, 24 insertions(+), 20 deletions(-) diff --git a/include/extern.h b/include/extern.h index 9960e47f4..b39db3219 100644 --- a/include/extern.h +++ b/include/extern.h @@ -743,7 +743,7 @@ extern int count_worn_armor(void); extern void newedog(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 *makedog(void); extern void update_mlstmv(void); diff --git a/src/dog.c b/src/dog.c index 7c1fa5dd0..570b73c2a 100644 --- a/src/dog.c +++ b/src/dog.c @@ -42,25 +42,27 @@ free_edog(struct monst *mtmp) } void -initedog(struct monst *mtmp) +initedog(struct monst *mtmp, boolean everything) { mtmp->mtame = is_domestic(mtmp->data) ? 10 : 5; mtmp->mpeaceful = 1; mtmp->mavenge = 0; set_malign(mtmp); /* recalc alignment now that it's tamed */ - mtmp->mleashed = 0; - mtmp->meating = 0; - EDOG(mtmp)->droptime = 0; - EDOG(mtmp)->dropdist = 10000; - EDOG(mtmp)->apport = ACURR(A_CHA); - EDOG(mtmp)->whistletime = 0; - EDOG(mtmp)->hungrytime = 1000 + svm.moves; - EDOG(mtmp)->ogoal.x = -1; /* force error if used before set */ - EDOG(mtmp)->ogoal.y = -1; - EDOG(mtmp)->abuse = 0; - EDOG(mtmp)->revivals = 0; - EDOG(mtmp)->mhpmax_penalty = 0; - EDOG(mtmp)->killed_by_u = 0; + if (everything) { + mtmp->mleashed = 0; + mtmp->meating = 0; + EDOG(mtmp)->droptime = 0; + EDOG(mtmp)->dropdist = 10000; + EDOG(mtmp)->apport = ACURR(A_CHA); + EDOG(mtmp)->whistletime = 0; + EDOG(mtmp)->hungrytime = 1000 + svm.moves; + EDOG(mtmp)->ogoal.x = -1; /* force error if used before set */ + EDOG(mtmp)->ogoal.y = -1; + EDOG(mtmp)->abuse = 0; + EDOG(mtmp)->revivals = 0; + EDOG(mtmp)->mhpmax_penalty = 0; + EDOG(mtmp)->killed_by_u = 0; + } 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)) return (struct monst *) 0; - initedog(mtmp); + initedog(mtmp, TRUE); mtmp->msleeping = 0; if (otmp) { /* figurine; resulting monster might not become a pet */ chance = rn2(10); /* 0==tame, 1==peaceful, 2==hostile */ @@ -244,7 +246,7 @@ makedog(void) if (!gp.petname_used++ && *petname) mtmp = christen_monst(mtmp, petname); - initedog(mtmp); + initedog(mtmp, TRUE); return mtmp; } @@ -1214,7 +1216,9 @@ tamedog( /* add the pet extension */ if (!has_edog(mtmp)) { newedog(mtmp); - initedog(mtmp); + initedog(mtmp, TRUE); + } else { + initedog(mtmp, FALSE); } if (obj) { /* thrown food */ diff --git a/src/mhitu.c b/src/mhitu.c index 31289282b..904321a51 100644 --- a/src/mhitu.c +++ b/src/mhitu.c @@ -2572,7 +2572,7 @@ cloneu(void) return NULL; mon->mcloned = 1; mon = christen_monst(mon, svp.plname); - initedog(mon); + initedog(mon, TRUE); mon->m_lev = gy.youmonst.data->mlevel; mon->mhpmax = u.mhmax; mon->mhp = u.mh / 2; diff --git a/src/read.c b/src/read.c index b8cbdc881..4344f319a 100644 --- a/src/read.c +++ b/src/read.c @@ -1680,7 +1680,7 @@ seffect_light(struct obj **sobjp) mon = makemon(&mons[pm], u.ux, u.uy, MM_EDOG | NO_MINVENT | MM_NOMSG); if (mon) { - initedog(mon); + initedog(mon, TRUE); mon->msleeping = 0; mon->mcan = TRUE; if (canspotmon(mon))