fix memory leak for knight's starting pony

makemon() has a 1% chance to bestow a worn saddle when creating any
rideable monster.  If that chance kicked in on a knight's starting
pony, an extra saddle would end up being created but not worn nor
in inventory nor on floor so not be freed when the game ended.

That 1% chance also overrode saddle suppression for pauper knights.
There wouldn't be any extra saddle but their pony could start with
one, against intent.

Have makedog() (which is only used for starting pet) tell makemon()
to suppress inventory when creating the initial pet.
This commit is contained in:
PatR
2025-01-20 10:24:12 -08:00
parent 991a1dbe43
commit 1acc272718
2 changed files with 10 additions and 2 deletions

View File

@@ -2088,6 +2088,9 @@ shop bug: buying a container with unpaid items in it could produce impossible
"unpaid_cost: object not on any bill" warnings "unpaid_cost: object not on any bill" warnings
when walking into/against a locked closed door, 'autounlock'==kick didn't when walking into/against a locked closed door, 'autounlock'==kick didn't
execute kick when player answered yes to "Door is locked. Kick it?" execute kick when player answered yes to "Door is locked. Kick it?"
having a 1% chance of creating rideable monsters with worn saddle gave knights
a 1% chance of creating an extra saddle for starting pony; it wasn't
tracked with other objects so produced a trivial memory leak
Fixes to 3.7.0-x Platform and/or Interface Problems Exposed Via git Repository Fixes to 3.7.0-x Platform and/or Interface Problems Exposed Via git Repository

View File

@@ -217,7 +217,12 @@ makedog(void)
petname = "Sirius"; /* Orion's dog */ petname = "Sirius"; /* Orion's dog */
} }
mtmp = makemon(&mons[pettype], u.ux, u.uy, MM_EDOG); /* specifying NO_MINVENT prevents makemon() from having a 1% chance
of creating a pony with an already worn saddle; dogs and cats
aren't affected because they don't have any initial inventory
[if anybody adds stranger pets that are expected to have such,
they'll need to modify this] */
mtmp = makemon(&mons[pettype], u.ux, u.uy, MM_EDOG | NO_MINVENT);
if (!mtmp) if (!mtmp)
return ((struct monst *) 0); /* pets were genocided [how?] */ return ((struct monst *) 0); /* pets were genocided [how?] */
@@ -225,7 +230,7 @@ makedog(void)
if (!svc.context.startingpet_mid) { if (!svc.context.startingpet_mid) {
svc.context.startingpet_mid = mtmp->m_id; svc.context.startingpet_mid = mtmp->m_id;
if (!u.uroleplay.pauper) { if (!u.uroleplay.pauper) {
/* initial horses already wear saddle (unless hero is a pauper) */ /* initial horses start wearing a saddle (pauper hero excluded) */
if (pettype == PM_PONY if (pettype == PM_PONY
&& (otmp = mksobj(SADDLE, TRUE, FALSE)) != 0) { && (otmp = mksobj(SADDLE, TRUE, FALSE)) != 0) {
/* pseudo initial inventory; saddle is not actually in hero's /* pseudo initial inventory; saddle is not actually in hero's