diff --git a/src/dog.c b/src/dog.c index 07336ef71..4e7d7aedb 100644 --- a/src/dog.c +++ b/src/dog.c @@ -51,7 +51,7 @@ initedog(struct monst *mtmp) mtmp->meating = 0; EDOG(mtmp)->droptime = 0; EDOG(mtmp)->dropdist = 10000; - EDOG(mtmp)->apport = ACURR(A_CHA); + EDOG(mtmp)->apport = max(1, ACURR(A_CHA)); EDOG(mtmp)->whistletime = 0; EDOG(mtmp)->hungrytime = 1000 + svm.moves; EDOG(mtmp)->ogoal.x = -1; /* force error if used before set */ diff --git a/src/dogmove.c b/src/dogmove.c index 6eba6c089..fe98fa551 100644 --- a/src/dogmove.c +++ b/src/dogmove.c @@ -311,9 +311,16 @@ dog_eat(struct monst *mtmp, } else { /* It's a reward if it's DOGFOOD and the player dropped/threw it. We know the player had it if invlet is set. -dlc */ - if (dogfood(mtmp, obj) == DOGFOOD && obj->invlet) + if (dogfood(mtmp, obj) == DOGFOOD && obj->invlet) { edog->apport += (int) (200L / ((long) edog->dropdist + svm.moves - edog->droptime)); + if (edog->apport <= 0) { + impossible("dog_eat: pet apport <= 0 (%d, %d, %ld, %ld)", + edog->apport, edog->dropdist, edog->droptime, + svm.moves); + edog->apport = 1; + } + } if (obj->unpaid) { /* edible item owned by shop has been thrown or kicked by hero and caught by tame or food-tameable monst */ @@ -399,7 +406,7 @@ dog_invent(struct monst *mtmp, struct edog *edog, int udist) * Use udist+1 so steed won't cause divide by zero. */ if (droppables(mtmp)) { - if (!rn2(udist + 1) || !rn2(edog->apport)) + if (!rn2(udist + 1) || (edog->apport && !rn2(edog->apport))) if (rn2(10) < edog->apport) { relobj(mtmp, (int) mtmp->minvis, TRUE); if (edog->apport > 1) diff --git a/src/restore.c b/src/restore.c index b8e0988aa..67be7cebb 100644 --- a/src/restore.c +++ b/src/restore.c @@ -365,6 +365,10 @@ restmon(NHFILE *nhfp, struct monst *mtmp) newedog(mtmp); if (nhfp->structlevel) Mread(nhfp->fd, EDOG(mtmp), sizeof (struct edog)); + /* sanity check to prevent rn2(0) */ + if (EDOG(mtmp)->apport <= 0) { + EDOG(mtmp)->apport = 1; + } } /* mcorpsenm - obj->corpsenm for mimic posing as corpse or statue (inline int rather than pointer to something) */