diff --git a/include/extern.h b/include/extern.h index d85e8f881..f0e6a0adb 100644 --- a/include/extern.h +++ b/include/extern.h @@ -1,4 +1,4 @@ -/* NetHack 3.7 extern.h $NHDT-Date: 1693359531 2023/08/30 01:38:51 $ $NHDT-Branch: keni-crashweb2 $:$NHDT-Revision: 1.1281 $ */ +/* NetHack 3.7 extern.h $NHDT-Date: 1695159584 2023/09/19 21:39:44 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1287 $ */ /* Copyright (c) Steve Creps, 1988. */ /* NetHack may be freely redistributed. See license for details. */ @@ -1148,6 +1148,7 @@ extern void addinv_core1(struct obj *); extern void addinv_core2(struct obj *); extern struct obj *addinv(struct obj *); extern struct obj *addinv_before(struct obj *, struct obj *); +extern struct obj *addinv_nomerge(struct obj *); extern struct obj *hold_another_object(struct obj *, const char *, const char *, const char *); extern void useupall(struct obj *); diff --git a/src/apply.c b/src/apply.c index 579f9833c..deb21a967 100644 --- a/src/apply.c +++ b/src/apply.c @@ -1,4 +1,4 @@ -/* NetHack 3.7 apply.c $NHDT-Date: 1685202442 2023/05/27 15:47:22 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.420 $ */ +/* NetHack 3.7 apply.c $NHDT-Date: 1695159606 2023/09/19 21:40:06 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.422 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Robert Patrick Rankin, 2012. */ /* NetHack may be freely redistributed. See license for details. */ @@ -3499,9 +3499,7 @@ use_royal_jelly(struct obj **optr) update_inventory(); /* freeinv() updated perminv w/ obj omitted */ } else { /* this lump was already separate; pervent merge */ - obj->nomerge = 1; - addinv(obj); /* put the unused lump back; updates perminv */ - obj->nomerge = 0; + addinv_nomerge(obj); /* put unused lump back; updates perminv */ } return ECMD_CANCEL; } diff --git a/src/dothrow.c b/src/dothrow.c index 83faea149..36885835d 100644 --- a/src/dothrow.c +++ b/src/dothrow.c @@ -1,4 +1,4 @@ -/* NetHack 3.7 dothrow.c $NHDT-Date: 1683334246 2023/05/06 00:50:46 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.266 $ */ +/* NetHack 3.7 dothrow.c $NHDT-Date: 1695159620 2023/09/19 21:40:20 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.269 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Robert Patrick Rankin, 2013. */ /* NetHack may be freely redistributed. See license for details. */ @@ -1834,9 +1834,9 @@ return_throw_to_inv( /* if 'obj' wasn't from a stack split or if it wouldn't merge back (maybe new erosion damage?) then it needs to be added to invent; don't merge with any other stack even if there is a compatible one - (others with similar erosion?) */ + (others with similar erosion?); can't use addinv_nomerge() here */ if (!otmp) { - obj->nomerge = 1; + obj->nomerge = 1; /* redundant unless 'oldslot' somehow went away */ obj = addinv_before(obj, oldslot); obj->nomerge = 0; diff --git a/src/eat.c b/src/eat.c index a2a050619..edff2221b 100644 --- a/src/eat.c +++ b/src/eat.c @@ -1,4 +1,4 @@ -/* NetHack 3.7 eat.c $NHDT-Date: 1674294705 2023/01/21 09:51:45 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.301 $ */ +/* NetHack 3.7 eat.c $NHDT-Date: 1695159623 2023/09/19 21:40:23 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.310 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Robert Patrick Rankin, 2012. */ /* NetHack may be freely redistributed. See license for details. */ @@ -367,9 +367,7 @@ touchfood(struct obj *otmp) dropy(otmp); sellobj_state(SELL_NORMAL); } else { - otmp->nomerge = 1; /* used to prevent merge */ - otmp = addinv(otmp); - otmp->nomerge = 0; + otmp = addinv_nomerge(otmp); } } return otmp; diff --git a/src/invent.c b/src/invent.c index 0998438ac..f91026545 100644 --- a/src/invent.c +++ b/src/invent.c @@ -1,4 +1,4 @@ -/* NetHack 3.7 invent.c $NHDT-Date: 1672827802 2023/01/04 10:23:22 $ $NHDT-Branch: naming-overflow-fix $:$NHDT-Revision: 1.439 $ */ +/* NetHack 3.7 invent.c $NHDT-Date: 1695159625 2023/09/19 21:40:25 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.449 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Derek S. Ray, 2015. */ /* NetHack may be freely redistributed. See license for details. */ @@ -860,11 +860,11 @@ addinv_core1(struct obj *obj) if (is_mines_prize(obj)) { record_achievement(ACH_MINE_PRIZE); gc.context.achieveo.mines_prize_oid = 0; /* done with luckstone o_id */ - obj->nomerge = 0; + obj->nomerge = 0; /* was set in create_object(sp_lev.c) */ } else if (is_soko_prize(obj)) { record_achievement(ACH_SOKO_PRIZE); gc.context.achieveo.soko_prize_oid = 0; /* done with bag/amulet o_id */ - obj->nomerge = 0; + obj->nomerge = 0; /* (got set in sp_lev.c) */ } } @@ -914,7 +914,7 @@ addinv_core0(struct obj *obj, struct obj *other_obj, reset_justpicked(gi.invent); } - addinv_core1(obj); + addinv_core1(obj); /* handle most side effects of carrying obj */ /* for addinv_before(); if something has been removed and is now being reinserted, try to put it in the same place instead of merging or @@ -975,7 +975,7 @@ addinv_core0(struct obj *obj, struct obj *other_obj, setuqwep(obj); added: obj->pickup_prev = 1; - addinv_core2(obj); + addinv_core2(obj); /* handle extrinsics conferred by carrying obj */ carry_obj_effects(obj); /* carrying affects the obj */ if (update_perm_invent) update_inventory(); @@ -989,13 +989,28 @@ addinv(struct obj *obj) return addinv_core0(obj, (struct obj *) 0, TRUE); } -/* add obj to the hero's inventory by inserting in front of a specific item */ +/* add obj to the hero's inventory by inserting in front of a specific item; + used for throw-and-return in case '!fixinv' is in effect */ struct obj * addinv_before(struct obj *obj, struct obj *other_obj) { + /* if 'other_obj' is present this will implicitly be 'nomerge' */ return addinv_core0(obj, other_obj, TRUE); } +/* return value will always be 'obj' */ +struct obj * +addinv_nomerge(struct obj *obj) +{ + struct obj *result; + unsigned save_nomerge = obj->nomerge; + + obj->nomerge = 1; + result = addinv(obj); + obj->nomerge = save_nomerge; + return result; +} + /* * Some objects are affected by being carried. * Make those adjustments here. Called _after_ the object @@ -1063,7 +1078,8 @@ hold_another_object( } if (Fumbling) { obj->nomerge = 1; - /* dropping expects obj to be in invent */ + /* dropping expects obj to be in invent; since it's going to be + dropped, avoid perminv update when temporarily adding it */ obj = addinv_core0(obj, (struct obj *) 0, FALSE); goto drop_it; } else { diff --git a/src/nhlua.c b/src/nhlua.c index df77c0ba0..5b644d172 100644 --- a/src/nhlua.c +++ b/src/nhlua.c @@ -1,4 +1,4 @@ -/* NetHack 3.7 nhlua.c $NHDT-Date: 1673740532 2023/01/14 23:55:32 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.95 $ */ +/* NetHack 3.7 nhlua.c $NHDT-Date: 1695159626 2023/09/19 21:40:26 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.115 $ */ /* Copyright (c) 2018 by Pasi Kallinen */ /* NetHack may be freely redistributed. See license for details. */ @@ -1583,9 +1583,7 @@ nhl_gamestate(lua_State *L) wornmask = otmp->owornmask; otmp->owornmask = 0L; extract_nobj(otmp, &gmst_invent); - otmp->nomerge = 1; - addinv(otmp); - otmp->nomerge = 0; + addinv_nomerge(otmp); if (wornmask) setworn(otmp, wornmask); } diff --git a/src/sp_lev.c b/src/sp_lev.c index 2bd7419c8..80b8e96c6 100644 --- a/src/sp_lev.c +++ b/src/sp_lev.c @@ -1,4 +1,4 @@ -/* NetHack 3.7 sp_lev.c $NHDT-Date: 1646428015 2022/03/04 21:06:55 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.259 $ */ +/* NetHack 3.7 sp_lev.c $NHDT-Date: 1695159628 2023/09/19 21:40:28 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.339 $ */ /* Copyright (c) 1989 by Jean-Christophe Collet */ /* NetHack may be freely redistributed. See license for details. */ @@ -2349,7 +2349,8 @@ create_object(object *o, struct mkroom *croom) if (!gc.context.achieveo.mines_prize_oid) { gc.context.achieveo.mines_prize_oid = otmp->o_id; gc.context.achieveo.mines_prize_otyp = otmp->otyp; - /* prevent stacking; cleared when achievement is recorded */ + /* prevent stacking; cleared when achievement is recorded; + will be reset in addinv_core1() */ otmp->nomerge = 1; } else { impossible(prize_warning, "mines end"); @@ -2358,7 +2359,8 @@ create_object(object *o, struct mkroom *croom) if (!gc.context.achieveo.soko_prize_oid) { gc.context.achieveo.soko_prize_oid = otmp->o_id; gc.context.achieveo.soko_prize_otyp = otmp->otyp; - otmp->nomerge = 1; /* redundant; Sokoban prizes don't stack */ + otmp->nomerge = 1; /* redundant; Sokoban prizes don't stack; + * will be reset in addinv_core1() */ } else { impossible(prize_warning, "sokoban end"); } diff --git a/src/wield.c b/src/wield.c index 456911adc..c32a11489 100644 --- a/src/wield.c +++ b/src/wield.c @@ -1,4 +1,4 @@ -/* NetHack 3.7 wield.c $NHDT-Date: 1650875488 2022/04/25 08:31:28 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.90 $ */ +/* NetHack 3.7 wield.c $NHDT-Date: 1695159631 2023/09/19 21:40:31 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.97 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Robert Patrick Rankin, 2009. */ /* NetHack may be freely redistributed. See license for details. */ @@ -430,9 +430,7 @@ dowield(void) if (finish_splitting) { /* wep was split off from something; give it its own invlet */ freeinv(wep); - wep->nomerge = 1; - addinv(wep); - wep->nomerge = 0; + addinv_nomerge(wep); } /* Set your new primary weapon */ @@ -635,9 +633,7 @@ doquiver_core(const char *verb) /* "ready" or "fire" */ quivering: if (finish_splitting) { freeinv(newquiver); - newquiver->nomerge = 1; - addinv(newquiver); - newquiver->nomerge = 0; + addinv_nomerge(newquiver); } if (!strcmp(verb, "ready")) {