rom24-quickmud-python 2.9.2__py3-none-any.whl → 2.9.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
mud/combat/death.py CHANGED
@@ -29,7 +29,7 @@ from mud.characters.follow import stop_follower
29
29
  from mud.models.clans import get_clan_hall_vnum
30
30
  from mud.models.races import get_race_by_index
31
31
  from mud.models.obj import ObjIndex
32
- from mud.models.object import Object
32
+ from mud.models.object import Object, create_object
33
33
  from mud.models.social import expand_placeholders
34
34
  from mud.spawning.obj_spawner import spawn_object
35
35
  from mud.utils import rng_mm
@@ -74,7 +74,7 @@ def _fallback_gore(
74
74
  description=description_template,
75
75
  )
76
76
  proto.item_type = int(item_type)
77
- obj = Object(instance_id=None, prototype=proto)
77
+ obj = create_object(proto)
78
78
  obj.item_type = int(item_type)
79
79
  return obj
80
80
 
@@ -341,7 +341,7 @@ def _fallback_corpse(vnum: int, *, item_type: ItemType) -> Object:
341
341
 
342
342
  proto = ObjIndex(vnum=vnum, short_descr="the corpse of %s", description="The corpse of %s is lying here.")
343
343
  proto.item_type = int(item_type)
344
- corpse = Object(instance_id=None, prototype=proto)
344
+ corpse = create_object(proto)
345
345
  corpse.item_type = int(item_type)
346
346
  return corpse
347
347
 
mud/commands/shop.py CHANGED
@@ -20,7 +20,7 @@ from mud.models.constants import (
20
20
  ITEM_SELL_EXTRACT,
21
21
  ITEM_VIS_DEATH,
22
22
  )
23
- from mud.models.object import Object
23
+ from mud.models.object import Object, create_object
24
24
  from mud.registry import room_registry, shop_registry
25
25
  from mud.skills import check_improve
26
26
  from mud.spawning.obj_spawner import spawn_object
@@ -354,7 +354,7 @@ def _clone_inventory_object(template: Object) -> Object | None:
354
354
 
355
355
  clone = spawn_object(getattr(proto, "vnum", 0))
356
356
  if clone is None:
357
- clone = Object(instance_id=None, prototype=proto)
357
+ clone = create_object(proto)
358
358
 
359
359
  # Mirror runtime overrides from the template copy so shop customisations persist.
360
360
  clone.value = list(getattr(template, "value", clone.value))
mud/handler.py CHANGED
@@ -892,7 +892,7 @@ def create_money(gold: int, silver: int) -> Object:
892
892
  ItemType,
893
893
  )
894
894
  from mud.models.obj import ObjIndex
895
- from mud.models.object import Object
895
+ from mud.models.object import Object, create_object
896
896
 
897
897
  # ROM C handler.c:2432-2437 (validate input)
898
898
  if gold < 0 or silver < 0 or (gold == 0 and silver == 0):
@@ -957,7 +957,7 @@ def create_money(gold: int, silver: int) -> Object:
957
957
  wear_flags=int(WearFlag.TAKE),
958
958
  weight=weight,
959
959
  )
960
- obj = Object(instance_id=None, prototype=proto)
960
+ obj = create_object(proto)
961
961
  obj.item_type = int(ItemType.MONEY)
962
962
  obj.short_descr = short_descr
963
963
  obj.cost = cost
mud/models/conversion.py CHANGED
@@ -2,7 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  from mud.db.models import Character as DBCharacter
4
4
  from mud.db.models import ObjectInstance as DBObjectInstance
5
- from mud.models.object import Object
5
+ from mud.models.object import Object, create_object
6
6
  from mud.registry import obj_registry
7
7
 
8
8
 
@@ -14,7 +14,7 @@ def load_objects_for_character(db_char: DBCharacter) -> tuple[list[Object], dict
14
14
  proto = obj_registry.get(inst.prototype_vnum)
15
15
  if not proto:
16
16
  continue
17
- obj = Object(instance_id=inst.id, prototype=proto)
17
+ obj = create_object(proto, instance_id=inst.id)
18
18
  if inst.location and inst.location.startswith("equipment:"):
19
19
  slot = inst.location.split(":", 1)[1]
20
20
  equipment[slot] = obj
mud/models/object.py CHANGED
@@ -146,3 +146,23 @@ class Object:
146
146
  self.in_room = value # type: ignore[assignment]
147
147
  self.carried_by = None
148
148
  self.in_obj = None
149
+
150
+
151
+ def create_object(prototype: ObjIndex, *, instance_id: int | None = None) -> Object:
152
+ """Build a new ``Object`` and register it on ``object_registry``.
153
+
154
+ INV-014 OBJECT-REGISTRY-MEMBERSHIP: ROM ``src/db.c:create_object``
155
+ appends every freshly built ``OBJ_DATA`` to the global
156
+ ``object_list``. ``mud.models.obj.object_registry`` is the canonical
157
+ Python equivalent; world-scan consumers (``spell_locate_object`` and
158
+ any future iteration over every live object) rely on it being
159
+ complete. Every Python ``Object(...)`` construction site that does
160
+ not already go through ``mud.spawning.obj_spawner.spawn_object``
161
+ must call this helper.
162
+ """
163
+
164
+ from mud.models.obj import object_registry
165
+
166
+ obj = Object(instance_id=instance_id, prototype=prototype)
167
+ object_registry.append(obj)
168
+ return obj
mud/rom_api.py CHANGED
@@ -658,7 +658,7 @@ def recursive_clone(obj: Object, clone_to: Object | None = None) -> Object:
658
658
  Cloned object with all contents
659
659
  """
660
660
  from mud.models.obj import ObjIndex
661
- from mud.models.object import Object
661
+ from mud.models.object import Object, create_object
662
662
 
663
663
  if not obj.prototype:
664
664
  proto = ObjIndex(
@@ -678,7 +678,7 @@ def recursive_clone(obj: Object, clone_to: Object | None = None) -> Object:
678
678
  else:
679
679
  proto = obj.prototype
680
680
 
681
- new_obj = Object(instance_id=None, prototype=proto)
681
+ new_obj = create_object(proto)
682
682
 
683
683
  for content in obj.contained_items:
684
684
  recursive_clone(content, new_obj)
mud/skills/handlers.py CHANGED
@@ -857,16 +857,52 @@ def _object_name_matches(obj: Object, search: str) -> bool:
857
857
 
858
858
 
859
859
  def _iterate_world_objects():
860
- """Yield (object, holder) pairs mirroring ROM ``object_list`` traversal."""
860
+ """Yield ``(object, holder)`` pairs mirroring ROM ``object_list``.
861
+
862
+ INV-014 OBJECT-REGISTRY-MEMBERSHIP: ``object_registry`` is the
863
+ canonical Python equivalent of ROM ``object_list``. The primary
864
+ iteration walks it directly so that registered-but-unplaced objects
865
+ (e.g. transiently between ``extract`` and re-placement, or freshly
866
+ spawned before being put in a room) are surfaced exactly as ROM
867
+ ``spell_locate_object`` (src/magic.c:3737) sees them.
868
+
869
+ For each registered obj the holder is computed per ROM
870
+ src/magic.c:3747: walk the ``in_obj`` chain to the outermost
871
+ container, then prefer ``carried_by`` over ``in_room`` (``None``
872
+ if neither is set, rendered as "somewhere").
873
+
874
+ A secondary walk of ``room_registry`` / ``character_registry``
875
+ backstops legacy unit tests that build ``Object`` instances directly
876
+ without going through ``create_object`` / ``spawn_object``; the seen
877
+ set dedupes by identity so registered objects are not yielded twice.
878
+ """
879
+
880
+ from mud.models.obj import object_registry
861
881
 
862
882
  seen: set[int] = set()
863
883
 
864
- def _walk(obj: Object, holder: object):
884
+ def _yield(obj: Object, holder: object):
865
885
  ident = id(obj)
866
886
  if ident in seen:
867
887
  return
868
888
  seen.add(ident)
869
889
  yield obj, holder
890
+
891
+ for obj in list(object_registry):
892
+ outer = obj
893
+ while getattr(outer, "in_obj", None) is not None:
894
+ outer = outer.in_obj
895
+ carried_by = getattr(outer, "carried_by", None)
896
+ if carried_by is not None:
897
+ yield from _yield(obj, carried_by)
898
+ continue
899
+ in_room = getattr(outer, "in_room", None)
900
+ yield from _yield(obj, in_room)
901
+
902
+ def _walk(obj: Object, holder: object):
903
+ if id(obj) in seen:
904
+ return
905
+ yield from _yield(obj, holder)
870
906
  children: list[Object] = []
871
907
  contained = getattr(obj, "contained_items", None)
872
908
  if isinstance(contained, list):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rom24-quickmud-python
3
- Version: 2.9.2
3
+ Version: 2.9.3
4
4
  Summary: A modern Python port of the ROM 2.4b6 MUD engine with full telnet server and JSON world loading
5
5
  Author-email: Mark Jedrzejczyk <mark.jedrzejczyk@gmail.com>
6
6
  Maintainer-email: Mark Jedrzejczyk <mark.jedrzejczyk@gmail.com>
@@ -5,13 +5,13 @@ mud/config.py,sha256=FmuhwTeR5798i_dHBJvZ_EQ4d_eNO8oMa8ni8fxiHhs,7057
5
5
  mud/entrypoint.py,sha256=WxBW3GfbKCOtSD5rx2ccSAC7lA3YRFi7DJ_EZvi1rmo,854
6
6
  mud/game_loop.py,sha256=nzGos1soW6oN3LCdl_XYlmB-k2QRI0mnpGn5JofbFXM,52109
7
7
  mud/game_tick_scheduler.py,sha256=7ybo2ekDQQPGN82u6fhcrrg7tZ-JMtGy4UUrZv9_Umo,1539
8
- mud/handler.py,sha256=AxfyMfNoAURX-Oa5tkDOAnWc7lB_2QaHP8GxgdSwB24,52001
8
+ mud/handler.py,sha256=UDX7lxaOUFvHBgIJrkxfgVjm0n7B_vD-9xCvvN2CdLM,51995
9
9
  mud/logging.py,sha256=DoKcplYwEePAmXKE2CI_wNk4pF-pc_aouoxa5C6tXlc,582
10
10
  mud/mob_cmds.py,sha256=Qd2A7YEkLJsKsRcnIR5a-f0EkdX1akSPiq3OsAkvnWg,45825
11
11
  mud/mobprog.py,sha256=TZiv4ZErFAlcO1TWaJryzZ5kwTZFe5DSqKVlo6qJcTc,59173
12
12
  mud/notes.py,sha256=mJM_f1lQ-Y1us7MHzHkgfozYKQCBm84FKRjmKpgoiOE,11501
13
13
  mud/registry.py,sha256=s8tGVKLZUU6-5c7HtBqhHQWLVxzFM4A9bpJ8avGt_0I,306
14
- mud/rom_api.py,sha256=ychLx7fdjTnoTZb61WotOV-RYrwvsR23qIZTYVVdTno,17262
14
+ mud/rom_api.py,sha256=4XIQZvWt6oNLiUBGr-NShCQ3Ev9nSEMGNh01VPowagA,17256
15
15
  mud/server.py,sha256=fv6mprd4h9CejTt8kOFkt6RA-NdzTwOd24d_3p9aOKY,219
16
16
  mud/spec_funs.py,sha256=D4x9el8po1FYDY8ZbPwDkJ4ujtIq7fEW1lCvJW8POdk,47536
17
17
  mud/time.py,sha256=eVMXzVoi9w7gGE7bN1FVYjCwSwBydSpkkVtptV4qTtw,1324
@@ -34,7 +34,7 @@ mud/characters/conditions.py,sha256=h7anKi7gy-WqBjP15N761SqEehlAsj6tTp4qdd62W6w,
34
34
  mud/characters/follow.py,sha256=yP2cJ8WvqpWWebzOUfK5wauIQfdT5BL-ukuyax_Tni4,2751
35
35
  mud/combat/__init__.py,sha256=YUphU7bKkxT3Qw0Gj2TcMmDoDyCYyRTQbHPCqKLjugE,215
36
36
  mud/combat/assist.py,sha256=_GDeuK0rfrXoELLNgTxBR1S8XdYIqcmPbTh8AinY9s8,7777
37
- mud/combat/death.py,sha256=ZjdcGo4jMaZdiWDzxCCjdW0ziw5hs-Die1Jl0oHLGlA,19179
37
+ mud/combat/death.py,sha256=FQlnvIBXMtnnhfP9M55RxtiOBheXuGuBZX-IimudGsY,19152
38
38
  mud/combat/engine.py,sha256=GIt7Earo2kgE0fqZKOvA8CkEWON0UqvQpqnHNEPilMo,61663
39
39
  mud/combat/kill_table.py,sha256=oR77me5GJLGXi3q5ZnQAdp3S5lsfJNhiCmaXOMQrNgA,1040
40
40
  mud/combat/messages.py,sha256=PVOYcOCHh4wW0P33ykbr6iYtFN8mottJ8W4S72E5pBM,7726
@@ -91,7 +91,7 @@ mud/commands/player_info.py,sha256=VqEHgETh7u1BMVWJDIMhvBgF2Pm5LGNtNpLRTbXt3mI,7
91
91
  mud/commands/position.py,sha256=uwphiwxN_sEGi2wlAD5oE2pmlPCe1y9f50g_HrARg58,16339
92
92
  mud/commands/remaining_rom.py,sha256=nIDH2XiMyxm-vR45QX6BLwdIdaS4V0kNEhm5mFY79hU,18780
93
93
  mud/commands/session.py,sha256=hrx-HY94JkEed64FPSe6TbfcVITXlsfzQ9DLDQ9ZYjY,14865
94
- mud/commands/shop.py,sha256=gFF9bK_AV9Xbtc0O8pRaVvo-R6TPAxxyIJr7VCjkjcs,40135
94
+ mud/commands/shop.py,sha256=QXISJ0PsevuNWrP3Nn0K4KYxq4e9mvIBJmgVk4yUROw,40129
95
95
  mud/commands/socials.py,sha256=IKSo1n-9aCtMDJFEq9KVBQIeabbijeMOZDXZUGoT_us,4401
96
96
  mud/commands/thief_skills.py,sha256=OJ2rT1Z56Pm1zHeaN5NvWCa4g2xT_k7epJNQR7JpYMM,15161
97
97
  mud/commands/typo_guards.py,sha256=NDL-6n1KwUduJNKpx_vRv3qGVrA1TvYelBwcla_RU9g,1434
@@ -139,7 +139,7 @@ mud/models/character_json.py,sha256=7rdI92S-JT38xb2iUyXTAJpLmFOIRy2pb6v1Yen8VQY,
139
139
  mud/models/clans.py,sha256=vMeVpK4VbYBtGYxRFdg2lUmkrjkCvqEM_jCOTNiuG3g,2227
140
140
  mud/models/classes.py,sha256=Fv0KjS339EBWqz5OBZu5TYSIDSRYpoalLTBJOf-6ThI,2602
141
141
  mud/models/constants.py,sha256=ltr2MeoyD69x1aSbGlZ1fgcBc9ykPPMIHUoIzLciPUQ,28617
142
- mud/models/conversion.py,sha256=1pCzm2mnZJqRQP_1UK8Kq_2b7cd53K-pPSCuJx4JPUg,1427
142
+ mud/models/conversion.py,sha256=uTR4Fnj13-v_D9c3_OyToJbLIabUI7Nh5KYnwVZIIYU,1439
143
143
  mud/models/help.py,sha256=MgAkueRQt5FUBRmvCjDNicaPH53ckBKzZSzjDDwnbWk,1034
144
144
  mud/models/help_json.py,sha256=sUlFUV5V31VANHSNHaRqMWS7EB1Qz87BY1oJsAWXMaw,268
145
145
  mud/models/json_io.py,sha256=q_gWOXgmSCS0B-w8xbbfs2DFh0uqpQgywzIJzLPpo_o,2146
@@ -147,7 +147,7 @@ mud/models/mob.py,sha256=d2JGyNh74c-FQYmFQPXN9M9sb3valppaDRLUe49cMcc,3830
147
147
  mud/models/note.py,sha256=stKuDsBJ5UQHngPVRbgDH4me_6RtUgjRczC2X3jbhgI,653
148
148
  mud/models/note_json.py,sha256=BuYWIGyZFevoObHGknfMOxjpL0laP7G070wNPZLccXU,320
149
149
  mud/models/obj.py,sha256=VNVKGLR9uUFOlGnLeFjRaeH4sAXE_gtyJV43lz4UVuY,2141
150
- mud/models/object.py,sha256=ZC9lSDt0TI3cqZJAz1o_vtPvT1AbJXfsidfvd5prjsA,5706
150
+ mud/models/object.py,sha256=0dtGzbErRPBARyR0IHtlyVMttUAkTzOU5EzGcbLzSQ0,6540
151
151
  mud/models/object_json.py,sha256=v1_FnQnvkGBM1lnXPWQARfDQrs20C5mZDhCaLYgNiZs,960
152
152
  mud/models/player_json.py,sha256=YQerAs3vxyAo7wr3orCXCC-pM_QWiwbz3aQ9RMzWW-Q,1249
153
153
  mud/models/races.py,sha256=U-77PyNogpyLEhdHrwA8Yll3ekBBTYKYfj-l26Catm4,17138
@@ -188,7 +188,7 @@ mud/security/bans.py,sha256=_nM9wEJbxxdLXoe0I31u8dTYgWP0wxMqMVB9mxxfhlk,9174
188
188
  mud/security/hash_utils.py,sha256=GNd2W-TFLSIOk1WMQRuvJo8l4CueBYzPI0EhQuydxUg,656
189
189
  mud/skills/__init__.py,sha256=zzIr-ejbrlrQF1CSepODWhpxQZv8rO2pgaqIi3vpMg0,241
190
190
  mud/skills/groups.py,sha256=_80fJkXfrPUmTcZ9JsCJHIAhRdmmGhayMJgn1pSFcQY,8127
191
- mud/skills/handlers.py,sha256=pBjNs43Z_QmtJlkml7uqv4We2zjyk-KVo2brJsmFxlQ,266593
191
+ mud/skills/handlers.py,sha256=Q2DPf6SqUAPoFS1FwSaiJ7IS0b4MhEmRBhk5XkKejJs,268106
192
192
  mud/skills/metadata.py,sha256=xNpiH3EmCMWY_DtO_Pjrhs2U7bYOBxyrsTL0wC_RJes,15413
193
193
  mud/skills/registry.py,sha256=60vHbukciV5f-o0nurt2Nwwjz3EBpQpRjwWOIh-viHE,13838
194
194
  mud/skills/say_spell.py,sha256=4voaTUbpYKsF0Plv9m-Eh0FK6lp1-Cz15rQBRq_XLNo,3909
@@ -216,9 +216,9 @@ mud/world/obj_find.py,sha256=tgnUkbFjnCl586Lzl6yRzCmllZSNEfQpQlrxCMVcUGU,5295
216
216
  mud/world/time_persistence.py,sha256=K4uhRpu08IDHY5uReBYTvw4BHuqsSxWvbv-h1VsPvf8,1663
217
217
  mud/world/vision.py,sha256=NRk3cvrGyyldU4W98qAVlYZp9wL-IUE1dTgk6DpM-NA,11609
218
218
  mud/world/world_state.py,sha256=3KpiDP6v24sZDn9-g44UypXpegzgRShHo1XvektJzdU,8810
219
- rom24_quickmud_python-2.9.2.dist-info/licenses/LICENSE,sha256=anQ2j9As6sIC8tZgQCXbo0-09JDH9vPiqhA9djnOvkY,1078
220
- rom24_quickmud_python-2.9.2.dist-info/METADATA,sha256=8D5F9gYxuzmqWyqrsb9RbY-043yE47Zkl2E7hsc_orE,15670
221
- rom24_quickmud_python-2.9.2.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
222
- rom24_quickmud_python-2.9.2.dist-info/entry_points.txt,sha256=VFru08UQTXZA_CkK-NBjJmWHyEX5a3864fQHjhaojbw,41
223
- rom24_quickmud_python-2.9.2.dist-info/top_level.txt,sha256=Fk1WPmabIIjp7_iZXLYpbAVqiq7lG7TeAHt30AsOKtQ,4
224
- rom24_quickmud_python-2.9.2.dist-info/RECORD,,
219
+ rom24_quickmud_python-2.9.3.dist-info/licenses/LICENSE,sha256=anQ2j9As6sIC8tZgQCXbo0-09JDH9vPiqhA9djnOvkY,1078
220
+ rom24_quickmud_python-2.9.3.dist-info/METADATA,sha256=-IVsyn-ZbspIdmqhnJlnm1kfANB7ghvHxgy7pWIQlCE,15670
221
+ rom24_quickmud_python-2.9.3.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
222
+ rom24_quickmud_python-2.9.3.dist-info/entry_points.txt,sha256=VFru08UQTXZA_CkK-NBjJmWHyEX5a3864fQHjhaojbw,41
223
+ rom24_quickmud_python-2.9.3.dist-info/top_level.txt,sha256=Fk1WPmabIIjp7_iZXLYpbAVqiq7lG7TeAHt30AsOKtQ,4
224
+ rom24_quickmud_python-2.9.3.dist-info/RECORD,,