rom24-quickmud-python 2.8.21__tar.gz → 2.9.3__tar.gz
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.
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/CHANGELOG.md +561 -0
- {rom24_quickmud_python-2.8.21/rom24_quickmud_python.egg-info → rom24_quickmud_python-2.9.3}/PKG-INFO +17 -16
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/README.md +16 -15
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas/air.json +221 -358
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas/arachnos.json +450 -268
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas/astral.json +1663 -733
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas/canyon.json +1450 -458
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas/catacomb.json +805 -299
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas/chapel.json +1065 -396
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas/daycare.json +415 -140
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas/draconia.json +1384 -299
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas/dream.json +447 -507
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas/drow.json +697 -285
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas/dwarven.json +722 -254
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas/dylan.json +415 -255
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas/eastern.json +1107 -368
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas/galaxy.json +1396 -418
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas/gnome.json +1079 -404
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas/grave.json +443 -132
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas/grove.json +550 -156
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas/haon.json +869 -259
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas/hitower.json +3760 -1045
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas/hood.json +841 -283
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas/immort.json +61 -65
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas/limbo.json +1 -1
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas/mahntor.json +3382 -860
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas/marsh.json +415 -179
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas/mega1.json +720 -229
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas/midennir.json +396 -277
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas/midgaard.json +346 -340
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas/mirror.json +1486 -723
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas/mobfact.json +148 -197
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas/moria.json +1581 -801
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas/newthalos.json +3913 -1401
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas/nirvana.json +325 -222
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas/ofcol.json +16 -25
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas/ofcol2.json +2650 -780
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas/olympus.json +1175 -333
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas/plains.json +522 -202
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas/pyramid.json +1288 -306
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas/quifael.json +13 -20
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas/redferne.json +137 -53
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas/school.json +1025 -537
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas/sewer.json +1710 -595
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas/shire.json +947 -421
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas/smurf.json +471 -186
- rom24_quickmud_python-2.9.3/data/areas/social.json +15 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas/thalos.json +1344 -433
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas/tohell.json +2532 -895
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas/trollden.json +289 -92
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas/valley.json +1030 -547
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas/wyvern.json +1027 -446
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/account/account_manager.py +10 -4
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/affects/engine.py +4 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/ai/__init__.py +9 -11
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/combat/death.py +6 -4
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/combat/engine.py +157 -50
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/combat/messages.py +67 -31
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/commands/advancement.py +14 -8
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/commands/auto_settings.py +32 -3
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/commands/combat.py +101 -56
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/commands/communication.py +103 -17
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/commands/dispatcher.py +15 -2
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/commands/imm_emote.py +8 -3
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/commands/info.py +10 -6
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/commands/info_extended.py +88 -51
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/commands/inventory.py +5 -2
- rom24_quickmud_python-2.9.3/mud/commands/misc_info.py +279 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/commands/session.py +36 -33
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/commands/shop.py +2 -2
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/game_loop.py +75 -37
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/handler.py +28 -23
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/loaders/base_loader.py +2 -4
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/loaders/json_loader.py +9 -5
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/loaders/obj_loader.py +9 -5
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/loaders/room_loader.py +21 -2
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/mob_cmds.py +3 -9
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/models/__init__.py +1 -2
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/models/character.py +20 -12
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/models/conversion.py +2 -2
- rom24_quickmud_python-2.9.3/mud/models/obj.py +69 -0
- rom24_quickmud_python-2.9.3/mud/models/object.py +168 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/models/room.py +14 -1
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/music/__init__.py +5 -4
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/net/connection.py +155 -88
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/network/websocket_stream.py +2 -1
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/rom_api.py +20 -7
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/scripts/convert_are_to_json.py +1 -1
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/skills/handlers.py +88 -58
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/spawning/obj_spawner.py +6 -1
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/spawning/templates.py +0 -1
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/world/look.py +18 -29
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/world/vision.py +31 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/pyproject.toml +1 -1
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3/rom24_quickmud_python.egg-info}/PKG-INFO +17 -16
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/rom24_quickmud_python.egg-info/SOURCES.txt +18 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/conftest.py +15 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_act_comm_gaps.py +39 -1
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_act_wiz_command_parity.py +2 -2
- rom24_quickmud_python-2.9.3/tests/integration/test_auto_sacrifice_pers.py +76 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_communication_enhancement.py +7 -3
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_compare_critical_gaps.py +10 -16
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_config_commands.py +4 -2
- rom24_quickmud_python-2.9.3/tests/integration/test_dam_message_pers.py +130 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_do_equipment.py +28 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_do_inventory.py +24 -0
- rom24_quickmud_python-2.9.3/tests/integration/test_do_look_command.py +210 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_do_where_command.py +28 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_do_who_command.py +40 -0
- rom24_quickmud_python-2.9.3/tests/integration/test_emote_parity.py +100 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_inv008_persistence_coherence.py +32 -1
- rom24_quickmud_python-2.9.3/tests/integration/test_inv009_registry_disconnect_cleanup.py +110 -0
- rom24_quickmud_python-2.9.3/tests/integration/test_inv010_room_people_coherence.py +243 -0
- rom24_quickmud_python-2.9.3/tests/integration/test_inv011_carry_weight_coherence.py +155 -0
- rom24_quickmud_python-2.9.3/tests/integration/test_inv012_end_to_end.py +90 -0
- rom24_quickmud_python-2.9.3/tests/integration/test_inv012_object_list_canonical.py +181 -0
- rom24_quickmud_python-2.9.3/tests/integration/test_inv013_object_location_coherence.py +127 -0
- rom24_quickmud_python-2.9.3/tests/integration/test_inv014_object_registry_membership.py +169 -0
- rom24_quickmud_python-2.9.3/tests/integration/test_invisibility_combat.py +429 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_music_play.py +11 -10
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_nanny_login_parity.py +366 -3
- rom24_quickmud_python-2.9.3/tests/integration/test_nanny_saveload_runtime_path.py +183 -0
- rom24_quickmud_python-2.9.3/tests/integration/test_prompt_cmd_parity.py +212 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_prompt_rom_parity.py +4 -1
- rom24_quickmud_python-2.9.3/tests/integration/test_say_parity.py +224 -0
- rom24_quickmud_python-2.9.3/tests/integration/test_shout_yell_parity.py +114 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_skills_integration.py +71 -13
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_spell_affects_persistence.py +170 -0
- rom24_quickmud_python-2.9.3/tests/integration/test_tell_parity.py +165 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_update_c_parity.py +5 -5
- rom24_quickmud_python-2.9.3/tests/integration/test_weapon_proc_pers.py +200 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_account_auth.py +64 -55
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_advancement.py +32 -0
- rom24_quickmud_python-2.9.3/tests/test_area_counts.py +75 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_area_exits.py +5 -3
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_area_loader.py +133 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_combat.py +3 -1
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_combat_death.py +28 -42
- rom24_quickmud_python-2.9.3/tests/test_combat_messages.py +44 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_combat_rom_parity.py +13 -8
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_command_abbrev.py +2 -1
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_commands.py +13 -8
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_communication.py +12 -10
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_connection_motd.py +8 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_damage_reduction_integration.py +8 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_game_loop.py +23 -18
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_game_loop_wait_daze.py +9 -1
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_mobprog_commands.py +3 -2
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_music.py +6 -5
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_obj_update_rom_parity.py +23 -46
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_player_auto_settings.py +4 -2
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_player_info_commands.py +103 -6
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_player_prompt.py +14 -5
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_rom_api.py +15 -2
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_scan_parity.py +1 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_skills.py +9 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_skills_buffs.py +5 -5
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_skills_damage.py +26 -25
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_skills_learned.py +1 -0
- rom24_quickmud_python-2.9.3/tests/test_skills_spells_cast_listing.py +236 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_telnet_server.py +12 -2
- rom24_quickmud_python-2.9.3/tests/test_websocket_server.py +516 -0
- rom24_quickmud_python-2.8.21/data/areas/help.json +0 -18
- rom24_quickmud_python-2.8.21/mud/commands/misc_info.py +0 -270
- rom24_quickmud_python-2.8.21/mud/models/obj.py +0 -107
- rom24_quickmud_python-2.8.21/mud/models/object.py +0 -87
- rom24_quickmud_python-2.8.21/tests/integration/test_invisibility_combat.py +0 -186
- rom24_quickmud_python-2.8.21/tests/test_area_counts.py +0 -12
- rom24_quickmud_python-2.8.21/tests/test_combat_messages.py +0 -30
- rom24_quickmud_python-2.8.21/tests/test_websocket_server.py +0 -58
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/LICENSE +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/MANIFEST.in +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/area/air.are +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/area/arachnos.are +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/area/area.lst +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/area/astral.are +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/area/canyon.are +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/area/catacomb.are +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/area/chapel.are +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/area/daycare.are +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/area/draconia.are +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/area/dream.are +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/area/drow.are +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/area/dwarven.are +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/area/dylan.are +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/area/eastern.are +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/area/galaxy.are +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/area/gnome.are +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/area/grave.are +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/area/group.are +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/area/grove.are +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/area/haon.are +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/area/help.are +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/area/hitower.are +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/area/hood.are +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/area/immort.are +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/area/limbo.are +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/area/mahntor.are +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/area/marsh.are +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/area/mega1.are +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/area/midennir.are +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/area/midgaard.are +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/area/mirror.are +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/area/mobfact.are +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/area/moria.are +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/area/newthalos.are +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/area/nirvana.are +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/area/ofcol.are +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/area/ofcol2.are +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/area/olympus.are +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/area/plains.are +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/area/proto.are +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/area/pyramid.are +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/area/quifael.are +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/area/redferne.are +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/area/rom.are +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/area/school.are +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/area/sewer.are +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/area/shire.are +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/area/smurf.are +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/area/social.are +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/area/thalos.are +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/area/tohell.are +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/area/trollden.are +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/area/valley.are +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/area/wyvern.are +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas/area.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas/area_0.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas/group.json +0 -0
- /rom24_quickmud_python-2.8.21/data/areas/rom.json → /rom24_quickmud_python-2.9.3/data/areas/help.json +0 -0
- /rom24_quickmud_python-2.8.21/data/areas/social.json → /rom24_quickmud_python-2.9.3/data/areas/rom.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas_backup/arachnos.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas_backup/area.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas_backup/area_0.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas_backup/astral_plane.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas_backup/catacombs.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas_backup/chapel.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas_backup/day_care.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas_backup/dragon_tower.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas_backup/drow_city.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas_backup/dwarven_kingdom.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas_backup/dylan's_area.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas_backup/elemental_canyon.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas_backup/galaxy.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas_backup/gangland.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas_backup/gnome_village.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas_backup/graveyard.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas_backup/group.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas_backup/haon_dor.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas_backup/help.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas_backup/high_tower.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas_backup/holy_grove.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas_backup/in_the_air.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas_backup/limbo.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas_backup/machine_dreams.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas_backup/mahn-tor.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas_backup/marsh.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas_backup/mega_city_one.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas_backup/miden'nir.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas_backup/midgaard.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas_backup/mob_factory.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas_backup/moria.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas_backup/mud_school.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas_backup/new_ofcol.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas_backup/new_thalos.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas_backup/nirvana.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas_backup/ofcol.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas_backup/old_thalos.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas_backup/olympus.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas_backup/plains.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas_backup/pyramid.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas_backup/quifael's.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas_backup/redferne's.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas_backup/rom.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas_backup/sands_of_sorrow.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas_backup/sewers.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas_backup/shire.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas_backup/smurfville.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas_backup/social.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas_backup/thalos.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas_backup/tohell.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas_backup/troll_den.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas_backup/valhalla.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas_backup/valley_of_the_elves.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/areas_backup/wyvern's_tower.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/help.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/players/.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/players/attacker.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/players/eddol.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/players/hero.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/players/sleeper.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/players/trouble.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/shops.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/skills.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/socials.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/data/time.json +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/doc/MPDocs/examples.doc +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/doc/MPDocs/hacker.doc +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/doc/MPDocs/mobprog.doc +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/doc/MPDocs/new_readme.txt +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/doc/QuickMUD.txt +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/doc/Rom2.4.doc +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/doc/act.txt +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/doc/area.txt +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/doc/c_module_inventory.md +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/doc/c_python_cross_reference.md +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/doc/c_to_python_file_coverage.md +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/doc/class.txt +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/doc/command.txt +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/doc/contrib.txt +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/doc/drool.txt +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/doc/hacker.txt +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/doc/license.doc +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/doc/license.txt +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/doc/memory.txt +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/doc/new.txt +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/doc/pfile.txt +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/doc/port.txt +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/doc/pr_queue.md +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/doc/python_architecture.md +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/doc/python_module_inventory.md +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/doc/security.txt +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/doc/sites.txt +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/doc/skill.txt +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/doc/sky.txt +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/doc/trad.txt +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/doc/vnum.txt +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/doc/~$Rom2.4.doc +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/__init__.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/__main__.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/account/__init__.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/account/account_service.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/admin_logging/__init__.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/admin_logging/admin.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/admin_logging/agent_trace.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/advancement.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/affects/saves.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/agent/__init__.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/agent/agent_protocol.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/agent/character_agent.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/ai/aggressive.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/characters/__init__.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/characters/conditions.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/characters/follow.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/combat/__init__.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/combat/assist.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/combat/kill_table.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/combat/safety.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/commands/__init__.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/commands/admin_commands.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/commands/affects.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/commands/alias_cmds.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/commands/build.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/commands/channels.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/commands/character.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/commands/compare.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/commands/consider.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/commands/consumption.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/commands/decorators.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/commands/doors.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/commands/equipment.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/commands/feedback.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/commands/give.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/commands/group_commands.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/commands/healer.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/commands/help.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/commands/imc.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/commands/imm_admin.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/commands/imm_commands.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/commands/imm_display.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/commands/imm_load.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/commands/imm_olc.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/commands/imm_punish.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/commands/imm_search.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/commands/imm_server.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/commands/imm_set.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/commands/inspection.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/commands/liquids.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/commands/magic_items.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/commands/misc_player.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/commands/mobprog_tools.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/commands/movement.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/commands/murder.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/commands/notes.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/commands/obj_manipulation.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/commands/player_config.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/commands/player_info.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/commands/position.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/commands/remaining_rom.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/commands/socials.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/commands/thief_skills.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/commands/typo_guards.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/config.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/db/__init__.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/db/init.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/db/migrate_from_files.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/db/migrations.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/db/models.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/db/seed.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/db/serializers.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/db/session.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/devtools/__init__.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/devtools/agent_demo.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/entrypoint.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/game_tick_scheduler.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/groups/__init__.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/groups/xp.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/imc/__init__.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/imc/commands.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/imc/network.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/imc/protocol.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/loaders/__init__.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/loaders/area_loader.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/loaders/help_loader.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/loaders/json_area_loader.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/loaders/mob_loader.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/loaders/mobprog_loader.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/loaders/reset_loader.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/loaders/shop_loader.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/loaders/social_loader.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/loaders/specials_loader.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/logging.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/magic/__init__.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/magic/effects.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/math/c_compat.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/math/stat_apps.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/mobprog.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/models/area.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/models/area_json.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/models/board.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/models/board_json.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/models/character_json.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/models/clans.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/models/classes.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/models/constants.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/models/help.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/models/help_json.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/models/json_io.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/models/mob.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/models/note.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/models/note_json.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/models/object_json.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/models/player_json.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/models/races.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/models/room_json.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/models/shop.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/models/shop_json.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/models/skill.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/models/skill_json.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/models/social.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/models/social_json.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/models/titles.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/models/weapon_table.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/net/__init__.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/net/ansi.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/net/protocol.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/net/session.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/net/ssh_server.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/net/telnet_server.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/network/__init__.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/network/websocket_server.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/network/websocket_session.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/notes.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/olc/__init__.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/olc/editor_state.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/olc/save.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/registry.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/scripts/convert_help_are_to_json.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/scripts/convert_player_to_json.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/scripts/convert_shops_to_json.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/scripts/convert_skills_to_json.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/scripts/convert_social_are_to_json.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/scripts/load_test_data.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/security/__init__.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/security/bans.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/security/hash_utils.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/server.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/skills/__init__.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/skills/groups.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/skills/metadata.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/skills/registry.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/skills/say_spell.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/spawning/__init__.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/spawning/mob_spawner.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/spawning/reset_handler.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/spec_funs.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/time.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/utils/act.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/utils/bit.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/utils/fix_sex.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/utils/olc_tables.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/utils/poses.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/utils/prefix_lookup.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/utils/prompt.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/utils/rng_mm.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/utils/string_editor.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/utils/text.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/wiznet.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/world/__init__.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/world/char_find.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/world/linking.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/world/movement.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/world/obj_find.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/world/time_persistence.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/mud/world/world_state.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/rom24_quickmud_python.egg-info/dependency_links.txt +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/rom24_quickmud_python.egg-info/entry_points.txt +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/rom24_quickmud_python.egg-info/requires.txt +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/rom24_quickmud_python.egg-info/top_level.txt +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/setup.cfg +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/setup.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/helpers.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/helpers_player.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/conftest.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_act_enter_gaps.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_admin_commands.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_advancement_con_app.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_advancement_wis_app.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_alias_command_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_architectural_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_auto_flags.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_auto_sequences.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_ban_command_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_bit_flag_string.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_bit_flag_value.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_bit_is_stat.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_boards_rom_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_channels.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_character_advancement.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_character_commands.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_character_creation_runtime.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_combat_dex_app.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_combat_str_app.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_consumables.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_container_retrieval.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_db2_loader_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_db_canonical_round_trip.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_death_and_corpses.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_do_affects.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_do_consider_command.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_do_examine_command.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_do_exits_command.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_do_help_command.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_do_password_command.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_do_practice_command.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_do_time_command.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_do_weather_command.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_do_worth.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_door_portal_commands.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_drop_command.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_environmental_effects.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_equipment_ac_calculations.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_equipment_system.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_fight_c_do_kill_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_fight_c_safe_room_damage_gate.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_flag_command_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_furniture_occupancy.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_get_room_messages.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_give_command.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_group_combat.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_healer_command_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_hedit_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_info_display.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_interp_dispatcher.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_interp_prefix_order.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_interp_trust.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_inv005_same_room_combat.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_inv006_fighting_pointer_coherence.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_json_loader_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_lookup_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_message_delivery_no_duplicate.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_mob_ai.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_mob_cmds_assist.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_mob_cmds_call.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_mob_cmds_cast.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_mob_cmds_damage.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_mob_cmds_flee.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_mob_cmds_junk.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_mob_cmds_kill.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_mob_cmds_oload.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_mob_cmds_purge.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_mob_cmds_transfer.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_mobprog_edge_cases.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_mobprog_greet_trigger.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_mobprog_predicates.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_mobprog_program_flow.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_mobprog_scenarios.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_money_objects.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_mpedit_001_interpret_mpedit.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_mpedit_002_do_mpedit.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_mpedit_003_mprog_code_model.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_music_load_songs.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_new_player_workflow.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_numbered_get_syntax.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_olc_001_run_olc_editor.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_olc_007_redit_list_show.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_olc_008_oedit_missing_cmds.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_olc_009_medit_missing_cmds.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_olc_010_015_do_olc_router.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_olc_011_aedit_flag_toggle.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_olc_012_014_editor_fallback.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_olc_act_001_aedit_create.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_olc_act_002_redit_create.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_olc_act_003_redit_reset.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_olc_act_004_redit_vnum_teleport.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_olc_act_005_oedit_create.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_olc_act_006_medit_create.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_olc_act_007_aedit_show_flags.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_olc_act_008_redit_show_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_olc_act_009_oedit_show_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_olc_act_010_medit_show_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_olc_act_011_name_messages.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_olc_act_012_aedit_reset.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_olc_act_013_get_area_for_vnum_order.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_olc_act_014_area_changed_protocol.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_olc_alist.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_olc_builders.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_olc_commands_listing.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_olc_descriptor_state.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_olc_display_resets.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_olc_do_resets_subcommands.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_olc_save_001_mob_defensive_flags.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_olc_save_002_mob_form_parts_size_material.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_olc_save_003_mob_mprogs.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_olc_save_004_mob_shops.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_olc_save_005_mob_spec_fun.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_olc_save_006_object_level.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_olc_save_007_object_affects.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_olc_save_008_object_extra_descr.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_olc_save_009_area_helps_round_trip.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_olc_save_010_asave_area_dispatch.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_olc_save_011_autosave_entry.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_olc_save_012_npc_security_gate.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_olc_save_013_area_list_social_prepend.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_olc_save_014_017_message_strings.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_pc_death_keeps_connection.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_pc_death_no_message_replay.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_pilot_integration.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_pit_timer_handling.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_player_config.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_player_npc_interaction.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_position_commands.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_put_pit_timer.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_put_room_messages.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_put_weight_mult.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_recall_train_commands.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_remove_command.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_room_light_tracking.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_room_retrieval.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_room_safety_features.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_runtime_bugs_2026_04_30.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_sacrifice_command.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_scan_broadcasts.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_skills_integration_combat_specials.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_socials.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_spell_casting.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_steal_command.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_string_editor_append.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_string_editor_edit.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_string_editor_first_arg.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_string_editor_format_string.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_string_editor_lineadd.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_string_editor_linedel.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_string_editor_merc_getline.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_string_editor_numlines.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_string_editor_proper.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_string_editor_replace.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_string_editor_string_add.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_string_editor_unpad.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_tables_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/integration/test_weather_time.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_act_comm_rom_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_act_enter_rom_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_act_info_rom_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_act_obj_rom_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_act_wiz_rom_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_affects.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_agent_interface.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_alias_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_ansi.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_are_conversion.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_area_specials.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_bans.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_boards.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_builder_hedit.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_builder_stat_commands.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_building.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_char_update_rom_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_combat_assist.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_combat_damage_types.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_combat_defenses_prob.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_combat_position_damage.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_combat_skills.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_combat_state.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_combat_surrender.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_combat_thac0.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_combat_thac0_engine.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_command_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_convert_are_to_json_cli.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_critical_function_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_damage_reduction.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_db_resets_rom_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_db_seed.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_defense_flags.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_encumbrance.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_enter_portal.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_fighting_state.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_fix_sex.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_game_loop_order.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_golden_reference.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_handler_affects_rom_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_hash_utils.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_healer.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_healer_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_healer_rom_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_help_conversion.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_help_system.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_imc.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_json_io.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_json_model_instantiation.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_json_room_fields.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_load_midgaard.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_logging_admin.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_logging_rotation.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_mob_act_flags.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_mob_damage_modifiers.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_mobprog.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_mobprog_helpers.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_mobprog_triggers.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_movement.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_movement_charm.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_movement_costs.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_movement_doors.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_movement_followers.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_movement_mobprog.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_movement_npc.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_movement_portals.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_movement_privacy.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_movement_visibility.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_nanny_rom_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_networking_telnet.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_obj_loader.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_olc_aedit.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_olc_medit.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_olc_oedit.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_olc_save.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_passive_skills_rom_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_player_affect_flags.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_player_combat_attributes.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_player_conditions.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_player_creation.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_player_equipment.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_player_flags.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_player_mechanics.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_player_resistance_flags.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_player_skills_spells.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_player_stats.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_player_title_description.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_player_wimpy.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_practice.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_prompt_clamps_hp.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_reset_levels.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_resets.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_rng_and_ccompat.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_rng_determinism.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_rng_dice.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_runtime_models.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_saves_rom_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_say_spell.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_schema_validation.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_scripted_session.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_shop_conversion.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_shops.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_skill_combat_rom_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_skill_conversion.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_skill_envenom_rom_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_skill_haggle_rom_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_skill_hide_rom_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_skill_peek_rom_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_skill_pick_lock_rom_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_skill_recall_rom_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_skill_registry.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_skill_steal_rom_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_skills_combat.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_skills_conjuration.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_skills_debuffs.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_skills_detection.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_skills_healing.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_skills_identify.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_skills_mass.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_skills_misc.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_skills_transport.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_social_conversion.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_social_placeholders.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_spawning.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_spec_fun_behaviors.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_spec_funs.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_spec_funs_extra.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_specials_loader_ext.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_spell_area_effects_rom_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_spell_breath_weapons_rom_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_spell_buff_debuff_additional_rom_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_spell_buff_debuff_rom_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_spell_cancellation_rom_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_spell_charm_control_rom_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_spell_creation_rom_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_spell_critical_gameplay_rom_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_spell_damage_additional_rom_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_spell_detection_rom_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_spell_enchantment_rom_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_spell_farsight_rom_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_spell_final_nine_rom_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_spell_harm_rom_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_spell_healing_rom_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_spell_heat_metal_rom_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_spell_high_priority_missing_rom_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_spell_information_rom_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_spell_mass_healing_rom_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_spell_priority_high_rom_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_spell_shocking_grasp_rom_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_spell_travel_portal_rom_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_spells_basic.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_spells_damage.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_state_transitions.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_thief_skills_dispatcher_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_time_daynight.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_time_persistence.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_utility_spells_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_weapon_damage.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_weapon_special_attacks.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_weapon_table_parity.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_wiznet.py +0 -0
- {rom24_quickmud_python-2.8.21 → rom24_quickmud_python-2.9.3}/tests/test_world.py +0 -0
|
@@ -7,6 +7,567 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [2.9.3]
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- **`INV-014` — OBJECT-REGISTRY-MEMBERSHIP locked in** (`docs/parity/CROSS_FILE_INVARIANTS_TRACKER.md`, `tests/integration/test_inv014_object_registry_membership.py`): ROM `src/db.c:create_object` appends every freshly built `OBJ_DATA` to the global `object_list` unconditionally — every world-scan consumer (`src/magic.c:3737 spell_locate_object`, decay sweep, save) walks that list. Previously only `mud/spawning/obj_spawner.py:spawn_object` appended to `mud.models.obj.object_registry`; six other production sites built `Object` instances without registering, leaving freshly-created corpses, gore objects, money piles, shop clones, and DB-restored inventory invisible to `locate object`. Added `mud.models.object.create_object(prototype, *, instance_id=None)` as the canonical factory (appends and returns); routed every production construction site through it. `mud/skills/handlers.py:_iterate_world_objects` now walks `object_registry` first, computing the holder per ROM `src/magic.c:3747` (outermost `in_obj` chain → `carried_by` → `in_room` → `None` rendered as "somewhere"); a legacy room/character walk remains as a compat backstop for unit tests. Eight enforcement tests cover every construction path plus the homeless-object locate symptom.
|
|
14
|
+
|
|
15
|
+
### Fixed
|
|
16
|
+
- **`spell_locate_object` could not find homeless objects** (`mud/skills/handlers.py:_iterate_world_objects`): an object spawned but not yet placed (`in_room=None, carried_by=None, in_obj=None`) was skipped entirely, while ROM `src/magic.c:3756-3762` reports it as "one is in somewhere" (the `in_room == NULL` branch). Iterator now walks `object_registry` so registered-but-unplaced objects surface at parity with ROM.
|
|
17
|
+
- **Six production sites built `Object` instances without registering** (handler.py, combat/death.py ×2, rom_api.py, commands/shop.py fallback, models/conversion.py): `create_money`, `_fallback_gore`, `_fallback_corpse`, `recursive_clone`, `_clone_inventory_object` (when `spawn_object` returned `None`), and `load_objects_for_character` all bypassed `object_registry`. ROM `create_object` always appends. All six now route through `create_object` (or `spawn_object` where applicable).
|
|
18
|
+
|
|
19
|
+
## [2.9.2]
|
|
20
|
+
|
|
21
|
+
### Added
|
|
22
|
+
- **`INV-013` — OBJECT-LOCATION-COHERENCE locked in** (`docs/parity/CROSS_FILE_INVARIANTS_TRACKER.md`, `tests/integration/test_inv013_object_location_coherence.py`): `Object.location` is no longer a stored field — it is now a property dispatching to the three canonical ROM container fields (`in_room`, `carried_by`, `in_obj`) per `src/handler.c:1626 obj_to_char` / `1953 obj_to_room` / `1968 obj_to_obj`. Setting `location` to a Room/Character/Object sets the matching ROM field and clears the other two; setting it to None clears all three; reads return whichever ROM field is non-None. Eliminates the latent divergence where callers had to remember to update both `obj.location` and `obj.in_room`. Seven enforcement tests.
|
|
23
|
+
|
|
24
|
+
### Fixed
|
|
25
|
+
- **`MobInstance.add_to_inventory` cleared `carried_by` right after setting it** (`mud/spawning/templates.py:445-446`): the method did `obj.carried_by = self; obj.location = None`. Pre-INV-013 the second line was a redundant legacy-field reset; under the new dispatch it cleared the carried_by we just set. Deleted the redundant `obj.location = None` line. Surfaced as a P-reset regression (`tests/test_spawning.py::test_reset_P_fills_mob_carried_container`) when the reset_handler could no longer find the mob-carried container.
|
|
26
|
+
- **`make_corpse` left money objects with no container linkage** (`mud/combat/death.py:441`): money was appended to `corpse.contained_items` but `money_obj.location` was set to None, leaving `money_obj.in_obj` unset. Per ROM `src/handler.c:1968 obj_to_obj`, money inside a corpse must have `in_obj = corpse`. Changed to `money_obj.location = corpse`.
|
|
27
|
+
- **Two `act_wiz` parity tests passed `location=-1` to the `Object` constructor** (`tests/integration/test_act_wiz_command_parity.py:398,582`): a Room or None was expected; `-1` was a stale placeholder from earlier refactors. Removed the kwarg — the tests already set `obj.in_room = room` on the next line.
|
|
28
|
+
|
|
29
|
+
## [2.9.1]
|
|
30
|
+
|
|
31
|
+
### Fixed
|
|
32
|
+
- **`test_wait_and_daze_decrement_on_violence_pulse` — long-standing red test was asserting non-ROM behavior** (`tests/test_game_loop_wait_daze.py:27`, ROM `src/comm.c:616-621` + `src/fight.c:191-196`): the test created a `Character` without a descriptor and expected wait/daze to decrement by 1 per `game_tick`. ROM's descriptor input loop (`comm.c:616-621`) decrements only for characters with a `d->character` descriptor; descriptor-less actors decrement in `PULSE_VIOLENCE`-sized chunks via `violence_update` (`fight.c:191-196`). Fix: add `ch.desc = object()` to the test fixture so it exercises the descriptor path it was clearly written for. Renamed to `test_wait_and_daze_decrement_per_pulse_for_connected_character` to match its actual contract. Per AGENTS.md "a test asserting non-ROM behavior is a bug in the test, not the implementation."
|
|
33
|
+
|
|
34
|
+
## [2.9.0]
|
|
35
|
+
|
|
36
|
+
### Added
|
|
37
|
+
- **`INV-012` — OBJECT-LIST-CANONICAL locked in** (`docs/parity/CROSS_FILE_INVARIANTS_TRACKER.md`, `tests/integration/test_inv012_object_list_canonical.py`): single canonical `Object` runtime class. `mud.models.obj.ObjectData` deleted. `object_registry` is now populated at spawn (`mud/spawning/obj_spawner.py:spawn_object`) and drained at extract (`mud/game_loop.py:_extract_obj`, including recursive contents per ROM `src/handler.c:2063-2067`). New ROM-named fields on `Object`: `in_room`, `in_obj`, `carried_by` (dataclass fields with `compare=False` to avoid `__eq__` graph recursion), `pIndexData` (read+write `@property` aliased to `prototype`), `contains` (read-only `@property` aliased to `contained_items`). Eight enforcement tests + smoke tests for `get_obj_world` and `obj_update`.
|
|
38
|
+
|
|
39
|
+
### Fixed
|
|
40
|
+
- **`object_registry` was never populated in production** (now-live behavior): every iteration over the global instance list was a no-op before this consolidation, silently disabling locate-object spells (`mud/world/obj_find.py:get_obj_world`, `mud/magic/effects.py`), mobprog oload triggers (`mud/mobprog.py`), global object scans (`mud/skills/handlers.py`), music decay (`mud/music/__init__.py`), and object decay tick (`mud/game_loop.py:obj_update`). Surfaced and closed under INV-012 — six smoke + correctness tests gate the behavior; per-system end-to-end coverage deferred to follow-up sessions.
|
|
41
|
+
|
|
42
|
+
### Changed
|
|
43
|
+
- ~12 `isinstance(target, ObjectData)` / `isinstance(target, (Object, ObjectData))` branches across `mud/skills/handlers.py` and `mud/game_loop.py` collapsed to `Object`-only.
|
|
44
|
+
- 17 helper signatures in `mud/game_loop.py` and 3 in `mud/handler.py` re-typed from `ObjectData` to `Object`. 4 dual-shape `getattr(obj, "contained_items", None) or getattr(obj, "contains", [])` fallbacks in `mud/game_loop.py` collapsed.
|
|
45
|
+
- `mud/mob_cmds.py:_extract_runtime_object` dead `isinstance(obj, ObjectData)` dispatch branch removed; local cleanup is the single canonical path.
|
|
46
|
+
- 35 test fixtures across 9 test files migrated from `ObjectData(item_type=X, ...)` to `Object(instance_id=None, prototype=ObjIndex(...))`.
|
|
47
|
+
- `tests/conftest.py` adds an autouse fixture that snapshots/clears/restores `object_registry` between tests, preventing leakage from the 10 test files that use `spawn_object`.
|
|
48
|
+
|
|
49
|
+
### Removed
|
|
50
|
+
- `mud.models.obj.ObjectData` (the dual-class runtime). Re-export dropped from `mud.models.__init__`.
|
|
51
|
+
|
|
52
|
+
## [2.8.79]
|
|
53
|
+
|
|
54
|
+
### Added
|
|
55
|
+
- **`INV-011` — CARRY-WEIGHT-COHERENCE locked in** (`docs/parity/CROSS_FILE_INVARIANTS_TRACKER.md`, `tests/integration/test_inv011_carry_weight_coherence.py`): new cross-file invariant codifies that `ch.carry_weight` / `ch.carry_number` stay in lockstep with `ch.inventory + ch.equipment.values()` after every mutation path. ROM mirrors via `src/handler.c:1626 obj_to_char` / `1642 obj_from_char`. Five enforcement tests cover the canonical helpers (`Character.add_object` / `equip_object` / `remove_object`) and the runtime extract paths.
|
|
56
|
+
|
|
57
|
+
### Fixed
|
|
58
|
+
- **`_extract_obj` left stale carry counters on the carrier** (`mud/game_loop.py:784 _remove_from_character`, ROM `src/handler.c:2051 → 1642 obj_from_char`): the runtime extract path used by `_extract_obj`, corpse decay, and light-source decay removed the obj from `character.inventory` / `character.equipment` but never re-derived `carry_weight` or decremented `carry_number`. Every extract on a carried object skewed encumbrance upward; over a long-running session a player could become permanently over-encumbered with zero visible items. Fix: after the inventory/equipment removal, call `_recalculate_carry_weight()` and subtract the obj's `_object_carry_number` slot cost. Surfaced and closed under INV-011.
|
|
59
|
+
|
|
60
|
+
### Watch list
|
|
61
|
+
- New cross-file watch item: dual `Object` (`mud/models/object.py`) vs `ObjectData` (`mud/models/obj.py`) runtime classes — `object_registry: list[ObjectData]` is never populated because `spawn_object` constructs `Object`. Every iteration over `object_registry` (mobprog oload triggers, `get_obj_world`, locate-object spells, object decay) is a no-op in production. Parallel shape to INV-008. Tracked in `CROSS_FILE_INVARIANTS_TRACKER.md` watch list pending a multi-session consolidation strategy.
|
|
62
|
+
|
|
63
|
+
## [2.8.78]
|
|
64
|
+
|
|
65
|
+
### Added
|
|
66
|
+
- **`INV-010` — ROOM-PEOPLE-COHERENCE locked in** (`docs/parity/CROSS_FILE_INVARIANTS_TRACKER.md`, `tests/integration/test_inv010_room_people_coherence.py`): new cross-file invariant codifies the bidirectional contract between `char.room` and `room.people`. Six enforcement tests exercise the canonical helpers (`Room.add_character` / `Room.remove_character`), the `char_to_room` NULL → temple fallback, the imm_commands `_char_from_room` / `_char_to_room` duplicates, `MobInstance.move_to_room`, the raw `room.people.remove/append` pattern from `do_recall`, and a global registry sweep.
|
|
67
|
+
|
|
68
|
+
### Fixed
|
|
69
|
+
- **Dual `room_registry` divergence** (`mud/models/room.py:204`, ROM `src/db.c:get_room_index`): `mud.models.room` declared a second `room_registry` dict that the world loader never populated. `char_to_room`'s temple fallback (`mud/models/room.py:67`) and `mud/game_loop.py:525`'s limbo lookup read from this empty dict and silently no-oped — a NULL-room redirect dropped the character on the floor with `ch.room = None` instead of routing to `ROOM_VNUM_TEMPLE`. Fix: re-export the canonical `mud.registry.room_registry` from `mud/models/room.py` so both readers see the world-loaded table. Surfaced and closed under INV-010.
|
|
70
|
+
|
|
71
|
+
## [2.8.77]
|
|
72
|
+
|
|
73
|
+
### Fixed
|
|
74
|
+
- **`TRAIN-001` — `do_train` listing branch crashed on unrecognized args** (`mud/commands/advancement.py:315-324`, ROM `src/act_move.c:1713-1745`): any `train <typo>` (e.g. `train magic`, `train magic missile`) routed through the listing branch and raised `AttributeError: 'Character' object has no attribute 'perm_str'`. ROM reads `ch->perm_stat[STAT_*]`; QuickMUD stores the same data on `char.perm_stat: list[int]` — there are no `perm_str`/`perm_int`/`perm_wis`/`perm_dex`/`perm_con` attributes on `Character`. Fix: index `char.perm_stat` by STAT_STR..STAT_CON (0..4) for the max-stat comparison. Tests: `tests/test_advancement.py::test_train_lists_available_stats_without_crash`, `::test_train_lists_only_unmaxed_stats`.
|
|
75
|
+
|
|
76
|
+
## [2.8.76]
|
|
77
|
+
|
|
78
|
+
### Fixed
|
|
79
|
+
- **`CAST-001` — `do_cast` target resolution honors ROM `TAR_*` dispatch** (`mud/commands/combat.py:704`, ROM `src/magic.c:301-536`): `do_cast` previously defaulted `target = char` whenever no target arg was given, regardless of the spell's target type. Casting `'magic missile'` mid-combat (offensive spell, `ch->fighting != NULL`, no explicit victim) hit the caster instead of the fighting victim (`Your magic missile scratches you.`). Fix: dispatch on `skill.target` against the ROM `TAR_*` matrix — `"victim"` / `"character_or_object"` (TAR_CHAR_OFFENSIVE / TAR_OBJ_CHAR_OFF) default to `char.fighting` and error `"Cast the spell on whom?"` if not fighting; `"friendly"` (TAR_CHAR_DEFENSIVE) defaults to self; `"self"` / `"ignore"` (TAR_CHAR_SELF / TAR_IGNORE) bind to the caster. Object-only and PK-gate paths are noted as scope-deferred in `docs/parity/MAGIC_C_AUDIT.md`. Tests: `tests/test_skills_spells_cast_listing.py::test_do_cast_offensive_no_target_defaults_to_fighting_victim`, `::test_do_cast_offensive_no_target_no_fight_errors`.
|
|
80
|
+
|
|
81
|
+
### Docs
|
|
82
|
+
- Added `docs/parity/MAGIC_C_AUDIT.md` as a stub for the eventual full `magic.c` audit; currently tracks only `CAST-001 ✅ FIXED` plus scope notes for object-targeted spells and PK gates.
|
|
83
|
+
|
|
84
|
+
## [2.8.75]
|
|
85
|
+
|
|
86
|
+
### Fixed
|
|
87
|
+
- **`do_cast` failed to dispatch handlers and resolve targets** (`mud/commands/combat.py:704-805`, ROM `src/magic.c:299-360`): three latent bugs the `2.8.74` `find_spell` fix exposed —
|
|
88
|
+
- Handler lookup used `getattr(skill, "handler", None)`, which is always `None` because `SkillRegistry` stores handlers in `skill_registry.handlers[name]` rather than on the `Skill` object. Every cast therefore returned `"The spell '<name>' is not fully implemented yet."` Fixed to read from `skill_registry.handlers.get(skill.name)`.
|
|
89
|
+
- Handler call passed three arguments (`spell_func(char, target, spell_level)`) but every entry in `mud/skills/handlers.py` is `(caster, target=None)`. The `TypeError` was swallowed by the broad `except` and returned as `"Spell cast failed: …"`. Fixed by matching the canonical `(caster, target)` signature used by `skill_registry.use()`.
|
|
90
|
+
- Target lookup iterated `getattr(room, "characters", [])`, but the `Room` model stores occupants on `room.people`. Result: `cast magic missile fido` silently self-targeted. Fixed by iterating `room.people`.
|
|
91
|
+
- `do_cast` also passed the handler's raw return value through to the dispatcher, which expects a `str`. Damage-spell handlers return an `int`; the dispatcher choked on `if "…" not in result`. Spells emit their flavour text via `char.messages` (the `apply_damage` / `_send_to_char` path), so `do_cast` now always returns a `"You cast <name>."` acknowledgment string.
|
|
92
|
+
|
|
93
|
+
### Added
|
|
94
|
+
- `tests/test_skills_spells_cast_listing.py::test_do_cast_magic_missile_dispatches_handler_and_damages_target` — end-to-end regression that places a caster + target in a `Room`, casts `'magic missile' Fido` through `do_cast`, and asserts the handler ran (HP dropped, mana consumed, no `"is not fully implemented yet"` / `"Spell cast failed"` string). This locks down all three latent paths above.
|
|
95
|
+
|
|
96
|
+
## [2.8.74]
|
|
97
|
+
|
|
98
|
+
### Fixed
|
|
99
|
+
- **`do_skills` / `do_spells` listing always returned "No skills found." / "No spells found."** (`mud/commands/misc_info.py:93-260`, ROM `src/skills.c:256-485`): both handlers iterated `getattr(mud.registry, "skill_table", {})`, a non-existent attribute that silently fell back to an empty dict. They also read the wrong skill fields (`spell_fun`, `skill_level`) and the wrong learned-percent source (`char.pcdata.learned` rather than `char.skills`). Rewritten to iterate `mud.skills.skill_registry.skills`, discriminate spells via `skill.type == "spell"`, look up class-level requirements via `skill.levels[ch_class]`, and read learned percentages from `char.skills` — matching the data source `do_practice` already uses successfully. Added ROM-faithful `[all] [max [min]]` argument parsing.
|
|
100
|
+
- **`do_cast <name>` reported "You don't know any spells of that name."** (`mud/commands/combat.py:704-791`, ROM `src/magic.c:299-360`): exact-match lookup against `char.skills` rejected ROM prefix abbreviations, and single-token argument parsing broke multi-word spells like `magic missile`. Rewritten to use `mud.utils.string_editor.first_arg` (ROM `one_argument` parity, single-quote aware) and `skill_registry.find_spell(...)` for prefix matching. Mana cost now follows ROM's `UMAX(skill.min_mana, 100 / (2 + level - skill.skill_level[class]))` formula, with the level+2 == required → 50 mana edge case.
|
|
101
|
+
|
|
102
|
+
### Added
|
|
103
|
+
- `tests/test_skills_spells_cast_listing.py` — 10 regression tests covering the three listing/cast paths against the canonical `data/skills.json` table, including NPC short-circuit, ROM "Arguments must be numerical or all." error, `cast 'magic missile' …` quoted multi-word parsing, and `cast magic …` prefix matching.
|
|
104
|
+
|
|
105
|
+
## [2.8.73]
|
|
106
|
+
|
|
107
|
+
### Added
|
|
108
|
+
- **`magic.c + magic2.c` subsystem closed at 100%**: `spell_pass_door()` parity (`mud/skills/handlers.py:5884` mirroring `src/magic.c:3864`) verified by new runtime-path integration coverage in `tests/integration/test_spell_affects_persistence.py::TestSpellPassDoorIntegration` — the affect persists through `game_tick()`, drops `AffectFlag.PASS_DOOR` on expiry, emits the ROM "You feel solid again." wear-off message exactly once, and a duplicate cast on an already-affected target is rejected with the ROM "already out of phase" message.
|
|
109
|
+
|
|
110
|
+
### Changed
|
|
111
|
+
- `docs/parity/ROM_C_SUBSYSTEM_AUDIT_TRACKER.md` P0-3 row updated from 98% → 100% (no remaining missing functions).
|
|
112
|
+
|
|
113
|
+
## [2.8.72]
|
|
114
|
+
|
|
115
|
+
### Fixed
|
|
116
|
+
- **`magic.c + magic2.c` affect persistence runtime parity** (`src/update.c:765-768`): `mud/affects/engine.py:tick_spell_effects` now mirrors ROM `char_update()` by applying the 20% per-point-pulse spell-strength fade (`level--` on `number_range(0, 4) == 0`) while durations decay through the real `game_tick()` path.
|
|
117
|
+
|
|
118
|
+
### Added
|
|
119
|
+
- **`magic.c + magic2.c` affect-persistence integration coverage**: `tests/integration/test_spell_affects_persistence.py` now proves three ROM runtime contracts through `game_tick()` — affects do not decay before `PULSE_TICK`, affect `level` can fade on the point pulse, and multi-entry spell affects emit exactly one wear-off message when they expire.
|
|
120
|
+
|
|
121
|
+
## [2.8.71]
|
|
122
|
+
|
|
123
|
+
### Fixed
|
|
124
|
+
- **`skills.c` game-loop integration parity** (`src/fight.c:192-196`, `src/fight.c:2952`, `src/update.c:update_handler`): descriptor-less actors no longer burn `wait`/`daze` every Python tick. `mud/game_loop.py:violence_tick` now mirrors ROM's split semantics — connected characters recover one pulse at a time, while descriptor-less actors recover in `PULSE_VIOLENCE` chunks on the combat cadence. The stale hardcoded timer burn was removed from `mud/combat/engine.py:multi_hit`.
|
|
125
|
+
|
|
126
|
+
### Added
|
|
127
|
+
- **`skills.c` runtime-path integration coverage**: `tests/integration/test_skills_integration.py` now proves a skill command (`bash`) enters combat and advances through `game_tick()` on the violence boundary, and locks wait-state recovery to ROM cadence. Companion unit expectations were updated to match the restored timer model.
|
|
128
|
+
|
|
129
|
+
## [2.8.70]
|
|
130
|
+
|
|
131
|
+
### Fixed
|
|
132
|
+
- **`PMOTE-003` — `do_pmote` and `do_smote` skip NPC viewers with `desc == NULL`** (`src/act_comm.c:1130`, `src/act_wiz.c:392-393`): ROM's pmote/smote viewer loops immediately `continue` when `vch->desc == NULL || vch == ch`, which excludes all NPC observers. Python's `mud/commands/imm_emote.py` had weakened that guard to `desc is None and not is_npc`, so NPCs incorrectly received both personalized pmote output and smote broadcasts. Fix: restore the ROM rule in both loops by skipping any non-self viewer whose `desc` is `None`. Locked in by `tests/integration/test_act_comm_gaps.py::TestPmoteGaps::test_pmote_003_npc_viewers_do_not_receive_pmote_or_smote`.
|
|
133
|
+
|
|
134
|
+
## [2.8.69]
|
|
135
|
+
|
|
136
|
+
### Fixed
|
|
137
|
+
- **`PMOTE-002` — `do_pmote` viewer broadcast routes actor `$N` through PERS** (`src/act_comm.c:1136,1188`): ROM sends pmote output to each eligible viewer via `act("$N $t", vch, ..., ch, TO_CHAR)`, which evaluates `PERS(ch, vch)` per recipient so an invisible actor renders as `"someone"` to viewers without `DETECT_INVIS`. Python's `mud/commands/imm_emote.py:do_pmote` previously hardcoded `f"{char_name} {substituted}"`, leaking the invisible actor's identity on both the matched-name and no-match branches. Fix: route the actor prefix through `mud.world.vision.pers(char, viewer)` per viewer. Locked in by `tests/integration/test_act_comm_gaps.py::TestPmoteGaps::test_pmote_002_invisible_actor_renders_as_someone_to_unaided_viewer`.
|
|
138
|
+
|
|
139
|
+
## [2.8.68]
|
|
140
|
+
|
|
141
|
+
### Changed
|
|
142
|
+
- Untrack `log/orphaned_helps.txt` (test artifact that drifted on every run) and add it to `log/.gitignore`. No code change.
|
|
143
|
+
|
|
144
|
+
### Docs
|
|
145
|
+
- **`PMOTE-001` — closed as ✅ FIXED in `docs/parity/ACT_COMM_C_AUDIT.md`** (`src/act_comm.c:1098-1192`): audit row was stale. `do_pmote` is fully implemented at `mud/commands/imm_emote.py:170` with NOEMOTE block, Moron guard, the letter-by-letter substitution loop mirroring ROM C `src/act_comm.c:1131-1175`, apostrophe/possessive handling (`"Bob's"` → `"your"`), and trailing-`s` absorption (`"Bobs"` → `"yous"`). Covered by 5 tests in `tests/integration/test_act_comm_gaps.py::TestPmoteGaps`. Two new sub-gaps filed during the re-check for follow-up: `PMOTE-002` (TO_CHAR `$N` prefix should route through PERS — invisible-actor leak parallel to EMOTE-001) and `PMOTE-003` (NPC viewers should be skipped via `desc is None`, not gated on `not is_npc` — same divergence in `do_smote`).
|
|
146
|
+
|
|
147
|
+
## [2.8.67]
|
|
148
|
+
|
|
149
|
+
### Fixed
|
|
150
|
+
- **`DAMMSG-001/002/003` — `dam_message` per-hit broadcasts route `$n` / `$N` through PERS per recipient** (`src/fight.c:2218-2228`): ROM's `dam_message` ends with three `act()` calls — `TO_NOTVICT`, `TO_CHAR`, `TO_VICT` — each evaluating `PERS(ch, looker)` and `PERS(victim, looker)` independently for every observer. Python's `dam_message` in `mud/combat/messages.py` previously returned `DamageMessages` containing three pre-rendered strings baked with `attacker.name` / `victim.name`, then the engine shipped them via `_broadcast_room` / `_push_message` without per-recipient PERS substitution — leaking both identities to every observer regardless of `can_see`. This is the highest-volume PERS leak in combat (fires on every melee swing and spell hit). Fix: (a) `dam_message` now returns templates with `{attacker}` / `{victim}` placeholders (ROM colour codes `{3...{x` doubled to survive `str.format()`); (b) new `render_for(template, attacker, victim, observer)` helper in `mud/combat/messages.py` substitutes both names through `pers()` per recipient; (c) `_dispatch_damage_messages` renamed to `_broadcast_damage_messages` (back-compat alias kept) and now iterates `room.people` for TO_NOTVICT, calling `render_for` per occupant — TO_CHAR uses `observer=attacker`, TO_VICT uses `observer=victim`. The `damage()` return value (consumed by `multi_hit`'s `attack_message` results) is also rendered for the attacker's view so scripted/test callers receive PERS-correct strings. Locked in by three new failing-first tests in `tests/integration/test_dam_message_pers.py` (one per direction); `tests/test_combat_messages.py` updated to call `render_for` on the returned templates.
|
|
151
|
+
|
|
152
|
+
## [2.8.66]
|
|
153
|
+
|
|
154
|
+
### Fixed
|
|
155
|
+
- **`FIGHT-014` — `_auto_sacrifice` TO_ROOM broadcast routes `$n` through PERS** (`src/act_obj.c:1856`, dispatched from `src/fight.c:961-970`): ROM's `act("$n sacrifices $p to Mota.", ch, obj, NULL, TO_ROOM)` substitutes `$n` per-listener through PERS so an invisible attacker renders as `"someone"` to room observers without `DETECT_INVIS`. Python's `_auto_sacrifice` in `mud/combat/engine.py` previously pre-rendered the broadcast via `expand_placeholders(...)` baked into a single `_broadcast_room` string keyed on `attacker.name`, leaking the attacker's identity. Fix: route through `_broadcast_pos_change(attacker, "{name} sacrifices {corpse} to Mota.", corpse=corpse_name)`. Orphan `SimpleNamespace` import removed as a side effect (the only callsite was the broadcast we just rewrote). Locked in by `tests/integration/test_auto_sacrifice_pers.py::test_fight_014_auto_sacrifice_broadcast_uses_pers_for_invisible_attacker`.
|
|
156
|
+
|
|
157
|
+
### Notes
|
|
158
|
+
|
|
159
|
+
- Python's `_auto_sacrifice` re-implements sacrifice logic inline rather than dispatching to `do_sacrifice` like ROM does at `src/fight.c:970`. That structural divergence (parallel implementation vs ROM dispatch) is tracked as FIGHT-015 (reserved) for a future session.
|
|
160
|
+
|
|
161
|
+
## [2.8.65]
|
|
162
|
+
|
|
163
|
+
### Fixed
|
|
164
|
+
- **`FIGHT-013` — WEAPON_SHOCKING TO_ROOM broadcast routes `$n` through PERS** (`src/fight.c:673-674`): ROM's `act("$n is struck by lightning from $p.", victim, wield, NULL, TO_ROOM)` substitutes `$n` per-listener through PERS. Python's shocking branch in `process_weapon_special_attacks` previously baked `victim.name` into a fixed `_broadcast_room` string. Fix: route through `_broadcast_pos_change`. Closes the FIGHT-009..013 weapon-proc PERS sweep — all five weapon special-attack TO_ROOM broadcasts now ROM-faithful. Locked in by `tests/integration/test_weapon_proc_pers.py::TestWeaponProcBroadcastPers::test_fight_013_shocking_broadcast_uses_pers_for_invisible_victim`.
|
|
165
|
+
|
|
166
|
+
### Notes
|
|
167
|
+
|
|
168
|
+
- With FIGHT-009..013 closed the `mud/combat/engine.py` PERS surface is fully normalized for both position-change broadcasts (FIGHT-004..008) and weapon-proc broadcasts (FIGHT-009..013). Remaining PERS surfaces in combat: `dam_message` (ROM `src/fight.c:2035-2233`, the per-hit damage-tier broadcast surface — hundreds of `act()` lines), and `do_sacrifice` in `mud/combat/engine.py:956` (single `_broadcast_room` call with `expand_placeholders`-rendered fixed string).
|
|
169
|
+
|
|
170
|
+
## [2.8.64]
|
|
171
|
+
|
|
172
|
+
### Fixed
|
|
173
|
+
- **`FIGHT-012` — WEAPON_FROST TO_ROOM broadcast PERS + ROM-true wording** (`src/fight.c:663`): Two divergences. (a) PERS gap on `$n` — invisible victim leaks identity. (b) Wording — ROM `act("$p freezes $n.", ...)` puts the weapon first (e.g. `"the sword freezes Alice."`) but Python previously emitted `f"{victim.name} is frozen by {weapon_name}."` (subject/object inverted). Fix: `_broadcast_pos_change(victim, "{weapon} freezes {name}.", weapon=weapon_name)` — single change closes both sub-gaps. Locked in by `tests/integration/test_weapon_proc_pers.py::TestWeaponProcBroadcastPers::test_fight_012_frost_broadcast_uses_pers_and_rom_wording`.
|
|
174
|
+
|
|
175
|
+
## [2.8.63]
|
|
176
|
+
|
|
177
|
+
### Fixed
|
|
178
|
+
- **`FIGHT-011` — WEAPON_FLAMING TO_ROOM broadcast routes `$n` through PERS** (`src/fight.c:654`): ROM's `act("$n is burned by $p.", victim, wield, NULL, TO_ROOM)` substitutes `$n` per-listener through PERS. Python's flaming branch in `process_weapon_special_attacks` previously baked `victim.name` into a fixed `_broadcast_room` string. Fix: route through `_broadcast_pos_change`. Locked in by `tests/integration/test_weapon_proc_pers.py::TestWeaponProcBroadcastPers::test_fight_011_flaming_broadcast_uses_pers_for_invisible_victim`.
|
|
179
|
+
|
|
180
|
+
## [2.8.62]
|
|
181
|
+
|
|
182
|
+
### Fixed
|
|
183
|
+
- **`FIGHT-010` — WEAPON_VAMPIRIC TO_ROOM broadcast routes `$n` through PERS** (`src/fight.c:643`): ROM's `act("$p draws life from $n.", victim, wield, NULL, TO_ROOM)` substitutes `$n` per-listener through PERS. Python's vampiric branch in `process_weapon_special_attacks` previously baked `victim.name` into a fixed `_broadcast_room` string. Fix: route through `_broadcast_pos_change`. Locked in by `tests/integration/test_weapon_proc_pers.py::TestWeaponProcBroadcastPers::test_fight_010_vampiric_broadcast_uses_pers_for_invisible_victim`.
|
|
184
|
+
|
|
185
|
+
## [2.8.61]
|
|
186
|
+
|
|
187
|
+
### Fixed
|
|
188
|
+
- **`FIGHT-009` — WEAPON_POISON TO_ROOM broadcast routes `$n` through PERS** (`src/fight.c:614-615`): ROM's `act("$n is poisoned by the venom on $p.", victim, wield, NULL, TO_ROOM)` substitutes `$n` per-listener through PERS. Python previously baked `victim.name` into a fixed `_broadcast_room` string. Fix: route through `_broadcast_pos_change`, now extended to accept `**extra` template kwargs (`{weapon}` for ROM `$p`). First commit in the FIGHT-009..013 weapon-proc PERS sweep. Locked in by `tests/integration/test_weapon_proc_pers.py::TestWeaponProcBroadcastPers::test_fight_009_poison_broadcast_uses_pers_for_invisible_victim`.
|
|
189
|
+
|
|
190
|
+
## [2.8.60]
|
|
191
|
+
|
|
192
|
+
### Fixed
|
|
193
|
+
- **`PROMPT-CMD-005` legacy-test hygiene**: two pre-existing legacy assertions missed in 2.8.54's PROMPT-CMD-005 rollout were asserting the pre-fix stored value (no trailing space). Updated `tests/integration/test_config_commands.py::test_prompt_custom` and `tests/test_player_auto_settings.py::TestPrompt::test_prompt_set_custom` to ROM-true stored values with trailing space, per AGENTS.md "ROM is the source of truth" rule. No production code change.
|
|
194
|
+
|
|
195
|
+
## [2.8.59]
|
|
196
|
+
|
|
197
|
+
### Fixed
|
|
198
|
+
- **`FIGHT-008` — POS_DEAD TO_CHAR self-message red colour + blank-line spacing** (`src/fight.c:861`): ROM's `send_to_char("{RYou have been KILLED!!{x\n\r\n\r", victim)` wraps the death notice in red colour codes and appends two `\n\r` pairs so a blank line follows the message. Python's `mud/combat/engine.py:_position_change_message` previously returned the bare `"You have been KILLED!!"` — no colour, no extra spacing. Fix: return `"{RYou have been KILLED!!{x\n"`. The protocol layer in `mud/net/protocol.py:send_to_char` auto-appends one `\r\n` to every message, so the embedded trailing `\n` plus the auto-append produces the same visual blank-line spacing ROM gets from its two `\n\r` pairs. Closes the FIGHT-004..008 position-change-broadcast sweep. Locked in by `tests/integration/test_invisibility_combat.py::TestPositionChangeBroadcastPers::test_fight_008_pos_dead_self_message_wraps_red_and_appends_blank_line`.
|
|
199
|
+
|
|
200
|
+
### Notes
|
|
201
|
+
|
|
202
|
+
- Closes the 2026-05-23 `fight.c` PERS sweep on the position-change broadcast surface (FIGHT-004..008 all ✅ FIXED in `docs/parity/FIGHT_C_AUDIT.md`).
|
|
203
|
+
- Weapon-proc broadcasts at `mud/combat/engine.py:1496/1510/1531/1541/1551` have analogous PERS gaps but are deferred to a follow-up cluster (FIGHT-009..013 reserved).
|
|
204
|
+
|
|
205
|
+
## [2.8.58]
|
|
206
|
+
|
|
207
|
+
### Fixed
|
|
208
|
+
- **`FIGHT-007` — POS_DEAD TO_ROOM broadcast (PERS + red colour + two-bang wording)** (`src/fight.c:860`): ROM's `act("{R$n is DEAD!!{x", victim, 0, 0, TO_ROOM)` had three divergences vs Python's previous `f"{victim.name} is DEAD!!!"` baked broadcast: (a) `$n` must route through PERS per-listener so invisible victims render as `"someone"` for observers without `DETECT_INVIS`; (b) missing ROM red colour codes `{R...{x` that the ANSI translation layer consumes on websocket send; (c) wording typo — three exclamation marks instead of ROM's two. Fix: `mud/combat/engine.py:_position_change_message` DEAD branch now uses `_broadcast_pos_change(victim, "{{R{name} is DEAD!!{{x")`. Legacy assertion in `tests/test_combat.py` (×1) updated to ROM-exact form. Locked in by `tests/integration/test_invisibility_combat.py::TestPositionChangeBroadcastPers::test_fight_007_pos_dead_broadcast_uses_pers_and_red_colour_and_two_bangs`.
|
|
209
|
+
|
|
210
|
+
## [2.8.57]
|
|
211
|
+
|
|
212
|
+
### Fixed
|
|
213
|
+
- **`FIGHT-006` — POS_STUNNED TO_ROOM broadcast routes `$n` through PERS** (`src/fight.c:853-854`): ROM's `act("$n is stunned, but will probably recover.", victim, NULL, NULL, TO_ROOM)` substitutes `$n` per-listener through PERS. Python's STUNNED branch in `mud/combat/engine.py:_position_change_message` previously baked `victim.name` into a fixed `_broadcast_room` string. Fix: route through the `_broadcast_pos_change` helper. Locked in by `tests/integration/test_invisibility_combat.py::TestPositionChangeBroadcastPers::test_fight_006_pos_stunned_broadcast_uses_pers_for_invisible_victim`.
|
|
214
|
+
|
|
215
|
+
## [2.8.56]
|
|
216
|
+
|
|
217
|
+
### Fixed
|
|
218
|
+
- **`FIGHT-005` — POS_INCAP TO_ROOM broadcast routes `$n` through PERS** (`src/fight.c:845-846`): ROM's `act("$n is incapacitated and will slowly die, if not aided.", victim, NULL, NULL, TO_ROOM)` substitutes `$n` per-listener through PERS. Python's INCAP branch in `mud/combat/engine.py:_position_change_message` previously baked `victim.name` into a fixed `_broadcast_room` string. Fix: route through the `_broadcast_pos_change` helper introduced in 2.8.55. Locked in by `tests/integration/test_invisibility_combat.py::TestPositionChangeBroadcastPers::test_fight_005_pos_incap_broadcast_uses_pers_for_invisible_victim`.
|
|
219
|
+
|
|
220
|
+
## [2.8.55]
|
|
221
|
+
|
|
222
|
+
### Fixed
|
|
223
|
+
- **`FIGHT-004` — POS_MORTAL TO_ROOM broadcast routes `$n` through PERS** (`src/fight.c:837-838`, `src/handler.c:2618`): ROM's `act("$n is mortally wounded, and will die soon, if not aided.", victim, NULL, NULL, TO_ROOM)` renders `$n` per-listener through `PERS(victim, looker)`, so an invisible victim shows as `"someone"` to room observers without `DETECT_INVIS`. Python previously baked `victim.name` into a single fixed broadcast string via `_broadcast_room`, leaking the victim's identity to every recipient. Fix: new `_broadcast_pos_change` helper in `mud/combat/engine.py` iterates `room.people`, calls `mud.world.vision.pers(victim, listener)` per recipient, and dispatches through the same fire-and-forget websocket path as `broadcast_room`. Same channel-arc PERS fix pattern (SAY-002/EMOTE-001/TELL-003/SHOUT-003/YELL-001) applied to combat death messaging. Locked in by `tests/integration/test_invisibility_combat.py::TestPositionChangeBroadcastPers::test_fight_004_pos_mortal_broadcast_uses_pers_for_invisible_victim`.
|
|
224
|
+
|
|
225
|
+
### Notes
|
|
226
|
+
|
|
227
|
+
- First gap closed in the 2026-05-23 `fight.c` PERS sweep. FIGHT-005..008 (POS_INCAP / POS_STUNNED / POS_DEAD TO_ROOM and POS_DEAD TO_CHAR) stable-IDed in `docs/parity/FIGHT_C_AUDIT.md` and will land in follow-up commits using the new `_broadcast_pos_change` helper.
|
|
228
|
+
|
|
229
|
+
## [2.8.54]
|
|
230
|
+
|
|
231
|
+
### Fixed
|
|
232
|
+
- **`PROMPT-CMD-004` — `do_prompt` truncates custom template to 50 chars** (`src/act_info.c:943-944`): ROM caps the raw `argument` at 50 chars (`if (strlen(argument) > 50) argument[50] = '\0';`) before `strcpy`/`smash_tilde`/suffix-append. Python previously stored the full untruncated string. Fix: `mud/commands/auto_settings.py:do_prompt` slices `arg = arg[:50]` before smash_tilde. Locked in by `tests/integration/test_prompt_cmd_parity.py::test_prompt_cmd_004_truncates_template_to_50_chars`.
|
|
233
|
+
- **`PROMPT-CMD-005` — `do_prompt` appends trailing space unless template ends in `%c`** (`src/act_info.c:946-947`): ROM appends a literal space to every custom prompt template unless the (already smash_tilded) buf already ends with `%c` — `if (str_suffix("%c", buf)) strcat(buf, " ")`, and `str_suffix` (src/db.c:3784) returns TRUE when `"%c"` is *not* a suffix of buf. So prompts that don't end in a colour-code escape gain a trailing space; prompts that do (e.g. ANSI colour close) are left alone. Python previously skipped this normalization, so `prompt TAG>` stored `"TAG>"` instead of ROM's `"TAG> "`. Fix: `mud/commands/auto_settings.py:do_prompt` now applies `arg = arg + " "` when not `arg.endswith("%c")`, after smash_tilde and the 50-char truncation. Legacy assertions in `tests/test_player_prompt.py` (×4) and `tests/integration/test_prompt_rom_parity.py` (×1) updated to ROM-exact stored values. Locked in by `tests/integration/test_prompt_cmd_parity.py::test_prompt_cmd_005_appends_trailing_space_unless_pct_c_suffix`.
|
|
234
|
+
|
|
235
|
+
### Notes
|
|
236
|
+
|
|
237
|
+
- Closes the `do_prompt` warm-up shelf — PROMPT-CMD-001..005 now all ✅ FIXED in `docs/parity/ACT_INFO_C_AUDIT.md`.
|
|
238
|
+
- PROMPT-CMD-004 and PROMPT-CMD-005 committed jointly because the legacy test assertions in `tests/test_player_prompt.py` couple both fixes; separate commits would assert transient half-states.
|
|
239
|
+
|
|
240
|
+
## [2.8.53]
|
|
241
|
+
|
|
242
|
+
### Changed
|
|
243
|
+
- **`TELL-006` — closed as ✅ ANALYZED-INERT** (`src/act_comm.c:893,926,937`): ROM's `buf[0] = UPPER(buf[0])` on the buffered tell strings is provably a no-op in ROM C itself — the formatted string always begins with `'{'` (colour code `{k`), and `UPPER('{') == '{'` since `{` is not lowercase. Unlike TELL-004 (behaviorally masked by a separate code path), this transformation has no reachable behavior to mirror and no failing test can be written. Doc-only close; no code change. `docs/parity/ACT_COMM_C_AUDIT.md` row flipped from 🔄 OPEN to ✅ ANALYZED. With this, the entire `do_tell` gap row (TELL-001..006) is closed.
|
|
244
|
+
|
|
245
|
+
## [2.8.52]
|
|
246
|
+
|
|
247
|
+
### Fixed
|
|
248
|
+
- **`YELL-001` — `do_yell` TO_VICT `$n` routes through PERS for invisible-yeller protection** (`src/act_comm.c:1059`, `src/handler.c:2618`): ROM's `act("$n yells '$t'", ..., TO_VICT)` substitutes `$n` per-listener through `PERS(ch, victim)`. So an invisible yeller renders as `"someone"` to listeners without `DETECT_INVIS`. Python's `do_yell` already iterates per-listener (area-wide loop over `character_registry` with area filter) but hardcoded `char.name` into the rendered string. Fix: `mud/commands/communication.py:do_yell` now substitutes `mud.world.vision.pers(char, victim)` for the yeller's name inside its existing per-listener loop. Closes the channel-message arc (say / tell / emote / shout / yell all now route through PERS). Locked in by `tests/integration/test_shout_yell_parity.py::test_yell_001_invisible_yeller_renders_as_someone_to_listener`.
|
|
249
|
+
|
|
250
|
+
### Notes
|
|
251
|
+
|
|
252
|
+
- Completes the 2026-05-22/23 act_comm.c channel re-audit arc: `do_say` (SAY-001..004), `do_emote` (EMOTE-001/002), `do_tell` (TELL-001..005), `do_shout` (SHOUT-001..003), `do_yell` (YELL-001). All five channel commands now route `$n` through `pers()` and emit ROM-exact wording / colour codes. PMOTE-001 remains as the only open ROM `do_pmote` greenfield port; TELL-006 deferred (MINOR cosmetic).
|
|
253
|
+
- Full suite at `4629 passed, 4 skipped` (+1 vs 2.8.51; zero regressions).
|
|
254
|
+
|
|
255
|
+
## [2.8.51]
|
|
256
|
+
|
|
257
|
+
### Fixed
|
|
258
|
+
- **`SHOUT-003` — `do_shout` TO_VICT `$n` routes through PERS for invisible-shouter protection** (`src/act_comm.c:836`, `src/handler.c:2618`): ROM's `act("$n shouts '$t'", ...)` substitutes `$n` per-listener through `PERS(ch, victim)`. So an invisible shouter renders as `"someone"` to listeners without `DETECT_INVIS`. Python previously broadcast one fixed message string via `broadcast_global(message, channel="shout", exclude=char, should_send=_should_receive)`, leaking the invisible shouter's identity to every recipient. Fix: replaced `broadcast_global` in `mud/commands/communication.py:do_shout` with a per-listener loop over `character_registry` (mirroring ROM's `descriptor_list` iteration at `src/act_comm.c:825-838`) that filters by `SHOUTSOFF` / `QUIET` / muted_channels and renders `mud.world.vision.pers(char, victim)` per recipient. Locked in by `tests/integration/test_shout_yell_parity.py::test_shout_003_invisible_shouter_renders_as_someone_to_listener`.
|
|
259
|
+
|
|
260
|
+
### Notes
|
|
261
|
+
|
|
262
|
+
- Third of three `do_shout` gaps from the 2026-05-23 re-audit. `do_shout` is now complete. YELL-001 (same PERS pattern in `do_yell`) remains open and is the last item in the channel-message arc.
|
|
263
|
+
- Full suite at `4628 passed, 4 skipped, 1 deselected` (+1 vs 2.8.50; zero regressions despite the per-listener broadcast refactor).
|
|
264
|
+
|
|
265
|
+
## [2.8.50]
|
|
266
|
+
|
|
267
|
+
### Fixed
|
|
268
|
+
- **`SHOUT-002` — `do_shout` TO_VICT wording drops the comma** (`src/act_comm.c:836`): ROM emits `act("$n shouts '$t'", ...)` — no comma between `shouts` and the open quote. Python broadcast `"{char.name} shouts, '{cleaned}'"` with an extra comma. Fix: drop the comma in the broadcast message string. Legacy assertions in `tests/test_communication.py` (×2) updated. Locked in by `tests/integration/test_shout_yell_parity.py::test_shout_002_to_vict_wording_drops_comma`.
|
|
269
|
+
|
|
270
|
+
### Notes
|
|
271
|
+
|
|
272
|
+
- Second of three `do_shout` gaps. SHOUT-003 (PERS for shouter) and YELL-001 (PERS for yeller) remain open.
|
|
273
|
+
- Full suite at `4627 passed, 4 skipped, 2 deselected` (+1 vs 2.8.49; zero regressions).
|
|
274
|
+
|
|
275
|
+
## [2.8.49]
|
|
276
|
+
|
|
277
|
+
### Fixed
|
|
278
|
+
- **`SHOUT-001` — `do_shout` TO_CHAR wording drops the comma** (`src/act_comm.c:824`): ROM emits `act("You shout '$T'", ...)` — no comma between `shout` and the open quote. Python previously returned `"You shout, '{cleaned}'"` with an extra comma. Fix: drop the comma in `mud/commands/communication.py:do_shout` return. Legacy assertions in `tests/test_communication.py` (×2) were baked to the buggy comma form and have been updated to the ROM-exact wording. Surfaced by a 2026-05-23 `do_shout` re-audit that found the prior "100% VERIFIED" claim incorrect (same audit-doc inflation that hit `do_say` / `do_emote` / `do_tell` this run). Locked in by `tests/integration/test_shout_yell_parity.py::test_shout_001_to_char_wording_drops_comma`.
|
|
279
|
+
|
|
280
|
+
### Notes
|
|
281
|
+
|
|
282
|
+
- First of three `do_shout` gaps from the 2026-05-23 re-audit. SHOUT-002 (TO_VICT wording), SHOUT-003 (PERS for shouter), plus YELL-001 (PERS for yeller — `do_yell` already gets wording right) all stable-IDed and queued.
|
|
283
|
+
- Full suite at `4626 passed, 4 skipped, 3 deselected` (+1 vs 2.8.48; zero regressions).
|
|
284
|
+
|
|
285
|
+
## [2.8.48]
|
|
286
|
+
|
|
287
|
+
### Fixed
|
|
288
|
+
- **`TELL-005` — `do_tell` wraps both lines with ROM `{k...{K...{k...{x` charcoal colour codes** (`src/act_comm.c:941-942`): ROM frames the tell channel in charcoal/black (`{k`), switches to bright/highlighted-charcoal (`{K`) for the message body, returns to `{k` for the closing quote, and resets with `{x`. The ANSI translation layer at `mud/net/ansi.py` consumes those tokens on websocket send. Python previously emitted no codes, so the tell channel rendered in the player's default terminal colour and the framing-vs-body contrast ROM relies on was lost. Fix: `mud/commands/communication.py:do_tell` return and `_handle_buffered_tell` formatted string now wrap with the ROM colour sequence. Legacy assertions in `tests/test_communication.py` (×5) and `tests/integration/test_communication_enhancement.py` were baked to the codeless plain-text form (per AGENTS.md — tests asserting Python behavior contradicting ROM are bugs in the **test**, not the implementation) and have been updated to the ROM-exact wording. Locked in by `tests/integration/test_tell_parity.py::test_tell_005_to_char_wraps_rom_color_codes` and `::test_tell_005_to_vict_wraps_rom_color_codes`.
|
|
289
|
+
|
|
290
|
+
### Notes
|
|
291
|
+
|
|
292
|
+
- Fifth of six TELL-NNN gaps from the 2026-05-22 `do_tell` re-audit. The audit's main cluster (TELL-001/002/003/004/005) is now closed. TELL-006 (uppercase first char of buffered tells — MINOR cosmetic) remains intentionally deferred and stable-IDed in `docs/parity/ACT_COMM_C_AUDIT.md`.
|
|
293
|
+
- Full suite at `4625 passed, 4 skipped` (+2 vs 2.8.47 baseline 4623/4; zero regressions).
|
|
294
|
+
|
|
295
|
+
## [2.8.47]
|
|
296
|
+
|
|
297
|
+
### Fixed
|
|
298
|
+
- **`TELL-004` — `do_tell` TO_CHAR `$N` routes through PERS for code-structure parity** (`src/act_comm.c:941`, `src/handler.c:2618`): ROM's `act("You tell $N '$t'", ...)` substitutes `$N` (capital) through `PERS(victim, ch)`. In practice this is masked by `get_char_world`'s `can_see` filtering during name lookup — an invisible target returns `"They aren't here."` before PERS would ever evaluate (same in ROM and Python). Fix is defensive code-parity: `mud/commands/communication.py:do_tell` return now substitutes `mud.world.vision.pers(target, char)` for the target name so the macro structure matches ROM regardless of future lookup-path changes. Test: `tests/integration/test_tell_parity.py::test_tell_004_to_char_uses_pers_for_target_name` pins the visible-target code path; the unreachable `"someone"` branch is exercised by sibling PERS tests (SAY-002, EMOTE-001, TELL-003).
|
|
299
|
+
|
|
300
|
+
### Notes
|
|
301
|
+
|
|
302
|
+
- Fourth of six TELL-NNN gaps from the 2026-05-22 `do_tell` re-audit. TELL-005 (charcoal colour codes) remains open. TELL-006 deferred (MINOR).
|
|
303
|
+
- Full suite at `4623 passed, 4 skipped, 2 deselected` (+1 vs 2.8.46; zero regressions).
|
|
304
|
+
|
|
305
|
+
## [2.8.46]
|
|
306
|
+
|
|
307
|
+
### Fixed
|
|
308
|
+
- **`TELL-003` — `do_tell` TO_VICT `$n` routes through PERS for invisible-sender protection** (`src/act_comm.c:942`, `src/handler.c:2618`): ROM's `act_new("$n tells you '$t'", ...)` substitutes `$n` per-target through `PERS(ch, victim)`, so an invisible sender renders as `"someone"` to a target without `DETECT_INVIS`. Python's `_handle_buffered_tell` hardcoded `sender.name`, leaking the invisible sender's identity (same pattern as pre-fix `do_say` / `do_emote`). Fix: substitute `mud.world.vision.pers(sender, target)` for the sender's name in the formatted string. Also applies to the buffered tell paths (linkdead / AFK / note-writing) since ROM's `sprintf(..., PERS(ch, victim), ...)` at `src/act_comm.c:891`/`924`/`935` wraps the same PERS call. Locked in by `tests/integration/test_tell_parity.py::test_tell_003_invisible_sender_renders_as_someone_to_target`.
|
|
309
|
+
|
|
310
|
+
### Notes
|
|
311
|
+
|
|
312
|
+
- Third of six TELL-NNN gaps from the 2026-05-22 `do_tell` re-audit. TELL-004 (PERS for target to sender) and TELL-005 (charcoal colour codes) remain open. TELL-006 deferred (MINOR).
|
|
313
|
+
- Full suite at `4622 passed, 4 skipped, 3 deselected` (+1 vs 2.8.45; zero regressions).
|
|
314
|
+
|
|
315
|
+
## [2.8.45]
|
|
316
|
+
|
|
317
|
+
### Fixed
|
|
318
|
+
- **`TELL-002` — `do_tell` TO_VICT wording drops the comma** (`src/act_comm.c:942`): ROM emits `act_new("$n tells you '$t'", ...)` — no comma between `you` and the open quote. Python's `_handle_buffered_tell` previously formatted `"{sender.name} tells you, '{message}'"` with an extra comma. Fix: drop the comma in `mud/commands/communication.py:_handle_buffered_tell` formatted string. Legacy assertions in `tests/test_communication.py` (×4) were baked to the buggy comma form and have been updated to the ROM-exact wording. Locked in by `tests/integration/test_tell_parity.py::test_tell_002_to_vict_wording_drops_comma`.
|
|
319
|
+
|
|
320
|
+
### Notes
|
|
321
|
+
|
|
322
|
+
- Second of six TELL-NNN gaps from the 2026-05-22 `do_tell` re-audit. TELL-003 (PERS for sender to victim), TELL-004 (PERS for target to sender), TELL-005 (charcoal colour codes) remain open. TELL-006 deferred (MINOR).
|
|
323
|
+
- Full suite at `4621 passed, 4 skipped, 4 deselected` (+1 vs 2.8.44; zero regressions).
|
|
324
|
+
|
|
325
|
+
## [2.8.44]
|
|
326
|
+
|
|
327
|
+
### Fixed
|
|
328
|
+
- **`TELL-001` — `do_tell` TO_CHAR wording drops the comma** (`src/act_comm.c:941`): ROM emits `act("You tell $N '$t'", ...)` — no comma between target name and the open quote. Python previously returned `"You tell {target.name}, '{message}'"` with an extra comma. Fix: drop the comma in `mud/commands/communication.py:do_tell` return. Legacy assertions in `tests/test_communication.py` (×2) and `tests/integration/test_communication_enhancement.py` were baked to the buggy comma form and have been updated to the ROM-exact wording. Surfaced by a 2026-05-22 `do_tell` re-audit that found the prior "100% VERIFIED" claim incorrect (same audit-doc inflation that hit `do_say` and `do_emote` this session). Locked in by `tests/integration/test_tell_parity.py::test_tell_001_to_char_wording_drops_comma`.
|
|
329
|
+
|
|
330
|
+
### Notes
|
|
331
|
+
|
|
332
|
+
- First of six TELL-NNN gaps from the 2026-05-22 `do_tell` re-audit. TELL-002 (TO_VICT wording comma), TELL-003 (PERS for sender to victim), TELL-004 (PERS for target to sender), TELL-005 (charcoal colour codes) remain open and will close in sequence. TELL-006 (uppercase first char of buffered tells — MINOR cosmetic) is intentionally deferred.
|
|
333
|
+
- Full suite at `4620 passed, 4 skipped, 5 deselected` (+1 vs 2.8.43 baseline 4619/4; deselected = the still-open TELL gaps; zero regressions).
|
|
334
|
+
|
|
335
|
+
## [2.8.43]
|
|
336
|
+
|
|
337
|
+
### Fixed
|
|
338
|
+
- **`EMOTE-002` — `do_emote` TO_CHAR `$n` renders as "You", not the actor's own name** (`src/act_comm.c:1092`): ROM's `act("$n $T", ..., TO_CHAR)` substitutes `$n` to `"You"` on the self branch — the actor reads `"You smiles happily"`, not `"Alice smiles happily"`. Python previously returned `f"{char.name} {args}"` so the actor saw their own name as the emote subject. Fix: `mud/commands/communication.py:do_emote` now returns `f"You {args}"`. Legacy `tests/integration/test_communication_enhancement.py::test_emote_broadcasts_custom_action` was baked to the buggy form (per AGENTS.md — tests asserting Python behavior contradicting ROM are bugs in the **test**, not the implementation) and has been updated to the ROM-exact wording. Locked in by `tests/integration/test_emote_parity.py::test_emote_002_self_message_renders_you_not_actor_name`.
|
|
339
|
+
|
|
340
|
+
### Notes
|
|
341
|
+
|
|
342
|
+
- Second of three gaps from the 2026-05-22 `do_emote` re-audit. PMOTE-001 (`do_pmote` not implemented in Python) remains open as a missing-function gap, tracked for a future session.
|
|
343
|
+
- Full suite at `4619 passed, 4 skipped` (+1 vs 2.8.42 baseline 4618/4; zero regressions).
|
|
344
|
+
|
|
345
|
+
## [2.8.42]
|
|
346
|
+
|
|
347
|
+
### Fixed
|
|
348
|
+
- **`EMOTE-001` — `do_emote` PERS substitution: invisible emoter renders as `"someone"`** (`src/act_comm.c:1091`, `src/handler.c:2618-2664`): ROM's `act("$n $T", ..., TO_ROOM)` substitutes `$n` per-listener through `PERS()` so an invisible emoter renders as `"someone"` to listeners without `DETECT_INVIS`. Python previously hardcoded `char.name` into one TO_ROOM message and broadcast it to everyone in the room, leaking the invisible emoter's identity exactly like the pre-fix `do_say` (SAY-002). Fix: refactored `mud/commands/communication.py:do_emote` to render TO_ROOM per-listener using `mud.world.vision.pers(char, listener)` (the helper added in 2.8.41 for SAY-002). Tests: `tests/integration/test_emote_parity.py::test_emote_001_invisible_emoter_renders_as_someone_to_unaided_listener` and `::test_emote_001_visible_emoter_renders_real_name_to_listener`.
|
|
349
|
+
|
|
350
|
+
### Notes
|
|
351
|
+
|
|
352
|
+
- First of three gaps from the 2026-05-22 `do_emote` re-audit. EMOTE-002 (TO_CHAR `$n` → "You" instead of actor's own name) and PMOTE-001 (`do_pmote` not implemented in Python) remain open.
|
|
353
|
+
- Full suite at `4618 passed, 4 skipped` (+2 vs 2.8.41 baseline 4616/4; zero regressions despite the per-listener broadcast refactor).
|
|
354
|
+
|
|
355
|
+
## [2.8.41]
|
|
356
|
+
|
|
357
|
+
### Added
|
|
358
|
+
- **`mud.world.vision.pers(target, observer)`** mirroring ROM's `PERS()` macro (`src/comm.c` via `#define` and `src/handler.c:2618-2664 can_see`). Returns `"someone"` if `observer` cannot see `target`, otherwise the target's NPC `short_descr` or PC `name`. No aura prefixes (that's `act_info show_char_to_char_0`) and no self-handling (callers route TO_CHAR vs TO_ROOM separately).
|
|
359
|
+
|
|
360
|
+
### Fixed
|
|
361
|
+
- **`SAY-002` — `do_say` PERS substitution: invisible/hidden speakers appear as `"someone"`** (`src/act_comm.c:776`, `src/handler.c:2618-2664`): ROM's `act()` substitutes `$n` through `PERS(ch, looker)`, which gates on `can_see(looker, ch)`. So when an invisible speaker says something, listeners without `DETECT_INVIS` see `"someone says '<msg>'"`, not the speaker's real name. Python previously built one TO_ROOM message string with `char.name` hardcoded and broadcast it to everyone in the room, leaking invisible/hidden PC identities. Fix: added `pers()` helper in `mud/world/vision.py` (uses existing `can_see_character`), then refactored `do_say` to render the TO_ROOM string per-listener with `pers(speaker, listener)` substituted for `$n`. Closes the four-gap `do_say` re-audit cluster opened on 2026-05-22. Tests: `tests/integration/test_say_parity.py::test_say_002_invisible_speaker_renders_as_someone_to_unaided_listener` and `::test_say_002_invisible_speaker_seen_by_detect_invis_listener`.
|
|
362
|
+
|
|
363
|
+
### Notes
|
|
364
|
+
|
|
365
|
+
- Fourth and final SAY-NNN gap from the 2026-05-22 `act_comm.c` re-audit. `do_say` is now ✅ 100% re-audited.
|
|
366
|
+
- Analogous CRITICAL gaps almost certainly exist in `do_tell` / `do_shout` / `do_yell` / `do_emote` / `do_pose` / `do_pmote` — those audits are now unblocked (the helper exists). Tracked as next-session candidates in `docs/sessions/SESSION_STATUS.md`.
|
|
367
|
+
- Full suite at `4616 passed, 4 skipped` (+2 vs 2.8.40 baseline 4614/4; zero regressions despite the per-listener broadcast refactor).
|
|
368
|
+
|
|
369
|
+
## [2.8.40]
|
|
370
|
+
|
|
371
|
+
### Fixed
|
|
372
|
+
- **`SAY-003` — `do_say` wraps output with ROM colour codes (`{6...{7$T{6'{x`)** (`src/act_comm.c:776-777`): ROM frames the say channel in cyan/green (`{6`), switches to white (`{7`) for the message body, returns to `{6` for the closing quote, and resets with `{x`. The ANSI translation layer at `mud/net/ansi.py` consumes those tokens on websocket send. Python previously emitted no codes, so the say channel rendered in the player's default terminal colour and the framing-vs-body contrast ROM relies on was lost. Fix: `mud/commands/communication.py:do_say` now wraps both TO_CHAR and TO_ROOM strings with the ROM colour sequence. Legacy assertions in `tests/test_commands.py`, `tests/test_command_abbrev.py`, and `tests/integration/test_communication_enhancement.py` were baked to the codeless plain-text form (per AGENTS.md, tests asserting Python behavior contradicting ROM are bugs in the **test**, not the implementation) and have been updated. Locked in by `tests/integration/test_say_parity.py::test_say_003_to_char_wraps_rom_color_codes` and `::test_say_003_to_room_wraps_rom_color_codes`.
|
|
373
|
+
|
|
374
|
+
### Notes
|
|
375
|
+
|
|
376
|
+
- Third of four SAY-NNN gaps from the 2026-05-22 `act_comm.c` re-audit. SAY-002 (`$n` PERS for invisible speakers) remains open — requires building a Python `pers()` helper that mirrors ROM's `PERS()` macro.
|
|
377
|
+
- Full suite at `4614 passed, 4 skipped` (+2 vs 2.8.39 baseline 4612/4; zero regressions).
|
|
378
|
+
|
|
379
|
+
## [2.8.39]
|
|
380
|
+
|
|
381
|
+
### Fixed
|
|
382
|
+
- **`SAY-004` — `do_say` delivers TO_ROOM broadcast exactly once (INV-001 SINGLE-DELIVERY)** (`src/act_comm.c:776`): ROM's `act(..., TO_ROOM)` iterates `ch->in_room->people` and delivers to each target exactly once. Python called BOTH `char.room.broadcast(message, exclude=char)` AND `broadcast_room(char.room, message, exclude=char)`. The two helpers do identical work — iterate `room.people`, fire-and-forget websocket send, append to `char.messages` — so every `say` was delivered twice. Players received "<name> says 'hi'" twice; transcripts and message queues both diverged. Fix: dropped the redundant `broadcast_room` call in `mud/commands/communication.py:do_say`, keeping only `char.room.broadcast`. Locked in by `tests/integration/test_say_parity.py::test_say_004_listener_receives_broadcast_exactly_once`.
|
|
383
|
+
|
|
384
|
+
### Notes
|
|
385
|
+
|
|
386
|
+
- Second of four SAY-NNN gaps from the 2026-05-22 `act_comm.c` re-audit. SAY-002 (`$n` PERS for invisible speakers) and SAY-003 (ROM colour codes) remain open.
|
|
387
|
+
- Full suite at `4612 passed, 4 skipped` (+1 vs 2.8.38 baseline 4611/4; zero regressions).
|
|
388
|
+
|
|
389
|
+
## [2.8.38]
|
|
390
|
+
|
|
391
|
+
### Fixed
|
|
392
|
+
- **`SAY-001` — `do_say` wording matches ROM (`says '$T'` / `You say '$T'` — no comma)** (`src/act_comm.c:776-777`): ROM emits `act("$n says '$T'", ...)` and `act("You say '$T'", ...)`. Python emitted `"says, '..'"` and `"You say, '..'"` with a comma the player did not type. Surfaced by a 2026-05-22 re-audit of `act_comm.c` that found the previous "100% VERIFIED" claim was incorrect. Fix: `mud/commands/communication.py:do_say` now produces the ROM-exact wording. Legacy `tests/test_commands.py`, `tests/test_command_abbrev.py`, `tests/integration/test_communication_enhancement.py` assertions were baked to the buggy comma form (per AGENTS.md — tests that assert Python behavior contradicting ROM are bugs in the **test**, not the implementation) and have been updated to the ROM-exact wording. Locked in by `tests/integration/test_say_parity.py::test_say_001_room_broadcast_drops_comma` and `test_say_001_to_char_drops_comma`.
|
|
393
|
+
|
|
394
|
+
### Notes
|
|
395
|
+
|
|
396
|
+
- Three additional `do_say` gaps surfaced by the re-audit are stable-IDed in `docs/parity/ACT_COMM_C_AUDIT.md` for sequential closure: SAY-002 (`$n` PERS substitution for invisible speakers), SAY-003 (ROM colour codes), SAY-004 (double-delivery via `room.broadcast` + `broadcast_room` — INV-001 SINGLE-DELIVERY violation).
|
|
397
|
+
- Full suite at `4611 passed, 4 skipped` (+2 vs 2.8.37 baseline 4609/4; zero regressions).
|
|
398
|
+
|
|
399
|
+
## [2.8.37]
|
|
400
|
+
|
|
401
|
+
### Fixed
|
|
402
|
+
- **`PROMPT-CMD-003` — `do_prompt` runs `smash_tilde` on custom template before storing** (`src/act_info.c:945`, `src/db.c:3663-3672`): ROM calls `smash_tilde(buf)` before `ch->prompt = str_dup(buf)`, replacing every `~` with `-` so the stored template cannot corrupt the player file on save (ROM treats `~` as the end-of-string marker on disk). Python's `do_prompt` previously stored the raw argument including any tildes the player typed. Fix: `mud/commands/auto_settings.py:do_prompt` now calls `mud.utils.text.smash_tilde` on the custom-template branch before assigning `char.prompt`. Locked in by `tests/integration/test_prompt_cmd_parity.py::test_prompt_cmd_003_smash_tilde_on_custom_template`.
|
|
403
|
+
|
|
404
|
+
### Notes
|
|
405
|
+
|
|
406
|
+
- Closes the PROMPT-CMD cluster opened by 2.8.35's NANNY-SAVELOAD-002 probe (PROMPT-CMD-001/002 landed in 2.8.36).
|
|
407
|
+
- Two ROM-divergence corners remain on `do_prompt` but are now stable-IDed for future hardening: PROMPT-CMD-004 (50-char truncation), PROMPT-CMD-005 (`%c`-suffix → append trailing space). Both are corner cases — no behavioral impact for typical players — and tracked in `docs/parity/ACT_INFO_C_AUDIT.md`.
|
|
408
|
+
- Full suite at `4609 passed, 4 skipped` (+1 vs 2.8.36 baseline 4608/4; zero regressions).
|
|
409
|
+
|
|
410
|
+
## [2.8.36]
|
|
411
|
+
|
|
412
|
+
### Fixed
|
|
413
|
+
- **`PROMPT-CMD-001` — `do_prompt` preserves trailing whitespace in custom templates** (`src/act_info.c:944`): the dispatcher (`mud/commands/dispatcher.py:process_command`) used `core = trimmed.rstrip()` which stripped visible trailing whitespace from every command before reaching its handler. ROM `src/interp.c:interpret` only strips line-ending whitespace, leaving visible trailing whitespace intact. Fix: dispatcher now uses `core = trimmed.rstrip("\r\n")` and computes log-line trailing whitespace from `trimmed.rstrip()` separately so the existing per-command log convention (`tests/test_logging_admin.py::test_logging_logs_alias_expansion`) is preserved. Also removed `arg = args.strip()` in `mud/commands/auto_settings.py:do_prompt` so the handler now uses the raw arg (matching ROM's raw `argument` usage at `src/act_info.c:944`). Now `prompt MYTAG> ` correctly stores `"MYTAG> "` and `bust_a_prompt` renders the trailing space.
|
|
414
|
+
- **`PROMPT-CMD-002` — `do_prompt` success reply echoes the stored template** (`src/act_info.c:953-954`): Python previously emitted the truncated `"Prompt set."`; ROM emits `"Prompt set to %s\n\r"` with the stored template. Fixed both the `"all"` branch and the custom-template branch in `mud/commands/auto_settings.py:do_prompt`. Existing helper tests (`tests/test_player_prompt.py`) and the live-websocket round-trip in `tests/integration/test_nanny_saveload_runtime_path.py` updated to the ROM-exact wording.
|
|
415
|
+
|
|
416
|
+
### Notes
|
|
417
|
+
|
|
418
|
+
- New enforcement tests in `tests/integration/test_prompt_cmd_parity.py` lock in both gaps on the live websocket path.
|
|
419
|
+
- Full suite at `4608 passed, 4 skipped` (+2 vs 2.8.35 baseline 4606/4; zero regressions). Surfaced and fixed in a single session after being flagged in 2.8.35's NANNY-SAVELOAD-002 probe.
|
|
420
|
+
|
|
421
|
+
## [2.8.35]
|
|
422
|
+
|
|
423
|
+
### Changed
|
|
424
|
+
- **`NANNY-SAVELOAD-001` — wimpy round-trips through reconnect** (`src/act_info.c:2800-2830`, `src/save.c:fwrite_char/fread_char`, `src/act_info.c:1548-1549`): added `tests/integration/test_nanny_saveload_runtime_path.py::test_nanny_saveload_001_wimpy_round_trips_through_reconnect` exercising `wimpy <n>` mid-session, then asserting the value comes back via `score` on the first command after reconnect. Verified the live runtime path; no implementation drift found.
|
|
425
|
+
- **`NANNY-SAVELOAD-002` — custom prompt template round-trips through reconnect** (`src/act_info.c:919-955`, `src/comm.c:1420-1595`): added `tests/integration/test_nanny_saveload_runtime_path.py::test_nanny_saveload_002_prompt_template_round_trips_through_reconnect` exercising `prompt <template>` mid-session, then asserting the first in-game prompt after reconnect renders the saved template (no ROM-default `<Nhp Nm Nmv>` fallback). Verified the live runtime path; the persistence layer round-trip is intact. Probe also surfaced two **separate** `do_prompt` command-side parity gaps (not save→reload bugs): (a) the dispatcher strips trailing whitespace from `prompt <template>` args before `do_prompt` sees them, so a template with a trailing space loses it; (b) the success reply is the truncated `"Prompt set."` instead of ROM's `"Prompt set to <template>\n\r"` which echoes the stored template. Both captured as follow-ups in `docs/sessions/SESSION_STATUS.md`.
|
|
426
|
+
- **`NANNY-SAVELOAD-003` — per-character aliases round-trip through reconnect** (`src/alias.c:102-220`, `src/save.c:fwrite_char/fread_char`): added `tests/integration/test_nanny_saveload_runtime_path.py::test_nanny_saveload_003_alias_round_trips_through_reconnect` exercising `alias k kill` mid-session, then asserting the alias listing on the first command after reconnect re-renders the saved entry with ROM listing format `" k: kill"`. Verified the live runtime path through the DB JSON column; no implementation drift found.
|
|
427
|
+
|
|
428
|
+
### Notes
|
|
429
|
+
|
|
430
|
+
- Full suite at `4606 passed, 4 skipped` (+3 vs 2.8.34 baseline 4603/4; zero regressions).
|
|
431
|
+
- Plan Task 4 (`docs/superpowers/plans/2026-05-21-parity-trust-rebuild-reaudit.md`) — save → reload → retained-state runtime-path bullet — is now complete. Remaining trust-rebuild work shifts to Plan Task 5 (re-audit other high-risk user-visible command families).
|
|
432
|
+
|
|
433
|
+
## [2.8.34]
|
|
434
|
+
|
|
435
|
+
### Fixed
|
|
436
|
+
- **`INV-009` REGISTRY-DISCONNECT-CLEANUP** (new cross-file invariant): `character_registry` was accumulating duplicate `Character` entries per player name in two places:
|
|
437
|
+
- **In-session promote-from-bare-row duplication.** The level=0 bare-row Character loaded at `_select_character` (during the nanny name/password phase) was appended to `character_registry` and never replaced. After creation finalised, a fresh level=1 Character was loaded via `load_character` and appended on top, leaving both in the registry. `next((c for c in character_registry if c.name == X), None)` could return the stale level=0 entry (e.g. `hit=20`) while the live session ran against the level=1 entry (`hit=100`).
|
|
438
|
+
- **Cross-session leak on clean disconnect.** The websocket and telnet disconnect `finally` blocks already saved the character, removed them from their room, and released the account — but never removed them from `character_registry`. Each disconnect-then-reconnect cycle added a new entry without removing the old one.
|
|
439
|
+
- **Fix (`mud/account/account_manager.py:load_character`)**: drop any prior `character_registry` entry with the same name before appending the freshly-loaded one (dedup-by-name on append).
|
|
440
|
+
- **Fix (`mud/net/connection.py` websocket + telnet disconnect cleanup)**: remove the Character from `character_registry` in the `if char: if not forced_disconnect:` block, matching the `save + char_from_room + release_account` quit semantics already present. Forced disconnects (descriptor takeover) skip removal — `_disconnect_session` transfers the live Character to the new descriptor.
|
|
441
|
+
- **Test**: `tests/integration/test_inv009_registry_disconnect_cleanup.py::test_inv009_registry_has_single_entry_after_disconnect_and_reconnect` reproduces both cases on the live websocket path and asserts: (a) zero `Regista` entries after a clean disconnect, (b) exactly one `Regista` entry while a reconnected session is active.
|
|
442
|
+
- **Tracker**: new INV-009 row in `docs/parity/CROSS_FILE_INVARIANTS_TRACKER.md`.
|
|
443
|
+
|
|
444
|
+
### Notes
|
|
445
|
+
|
|
446
|
+
- Full suite at `4603 passed, 4 skipped` (+1 vs 2.8.33 baseline 4602/4; zero regressions).
|
|
447
|
+
- Discovered during NANNY-RECONNECT-003 debugging in 2.8.33 (see SESSION_SUMMARY_2026-05-22_NANNY_RECONNECT_RUNTIME_PATH_PARITY.md "follow-ups").
|
|
448
|
+
|
|
449
|
+
## [2.8.33]
|
|
450
|
+
|
|
451
|
+
### Changed
|
|
452
|
+
- **`NANNY-RECONNECT-001` — `score` after reconnect transcript parity** (`src/act_info.c:1477-1507`, `src/nanny.c:760`): added a websocket-runtime-path regression in `tests/test_websocket_server.py::test_websocket_reconnect_score_matches_rom_act_info_lines` that asserts ROM-exact title (`"You are <name> the Apprentice of Magic, level 1, ..."`), race/sex/class line (`"Race: elf Sex: male Class: mage"`), and hit/mana/move at full after `reset_char` on login. Verified the live runtime path; no implementation drift found.
|
|
453
|
+
- **`NANNY-RECONNECT-002` — `look` after reconnect matches live room registry** (`src/act_info.c:1037-1116`): added `tests/test_websocket_server.py::test_websocket_reconnect_look_matches_room_registry_not_cached_snapshot` which reconnects an elf mage, snapshots the live `character_registry` entry's `room.name` and description, then asserts the `look` transcript on the **first command after reconnect** contains both — guarding against stale pre-disconnect cached snapshots. Verified the live runtime path; no implementation drift found.
|
|
454
|
+
- **`NANNY-RECONNECT-003` — first in-game prompt after reconnect reflects loaded resources** (`src/comm.c:1437-1443`, `src/nanny.c:760`): added `tests/test_websocket_server.py::test_websocket_reconnect_initial_prompt_reflects_loaded_resources` which captures the first post-MOTD prompt on the live websocket, then sends `score` on the same session and asserts the ROM `<Nhp Nm Nmv>` token values equal what `score` reports (self-consistent), and that `hit == max_hit` after `reset_char` on login. Verified the live runtime path; no implementation drift found.
|
|
455
|
+
|
|
456
|
+
### Notes
|
|
457
|
+
|
|
458
|
+
- Full suite at `4602 passed, 4 skipped` (+3 vs prior baseline 4599/4; zero regressions).
|
|
459
|
+
- During NANNY-RECONNECT-003 debugging, a `character_registry` reconnect-duplication oddity surfaced (stale pre-disconnect Character returned by name lookup). Recorded as a follow-up in `docs/sessions/SESSION_STATUS.md` for a dedicated future slice.
|
|
460
|
+
|
|
461
|
+
## [2.8.32]
|
|
462
|
+
|
|
463
|
+
### Fixed
|
|
464
|
+
- **`nanny.c` happy-path new-character creation prompts**: `mud/net/connection.py` now emits ROM-exact `"New character."`, `"Give me a password for <Name>:"`, `"Please retype password:"`, and ROM race/sex/class/weapon prompt wording on the live runtime path. Removed the non-ROM `"Creating new character 'X'."` line and the non-ROM stat-reroll and hometown prompts (ROM `nanny.c:476-478` derives `perm_stat` from `pc_race_table[race].stats[i]` and has no such prompts).
|
|
465
|
+
- **`nanny.c` pre-login greeting parser**: the greeting no longer leaks the embedded MOTD block before `Name:`.
|
|
466
|
+
- **`NANNY-RETRY-001` — race invalid wording** (`src/nanny.c:460-471`): `_prompt_for_race` now sends `"That is not a valid race."` (was `"That's"`); race listing prefix is `"The following races are available:\n\r "` to match ROM telnet line endings.
|
|
467
|
+
- **`NANNY-RETRY-002` — race "help" branch wording** (`src/nanny.c:444-453`): verified ROM-exact; regression test added.
|
|
468
|
+
- **`NANNY-RETRY-003` — class invalid wording** (`src/nanny.c:538-539`): `_prompt_for_class` now sends `"That's not a class."` (was `"That's not a valid class."`) and switches the retry prompt to `"What IS your class? "`.
|
|
469
|
+
- **`NANNY-RETRY-004` — customize Y/N retry** (`src/nanny.c:626-628`): `_prompt_customization_choice` now sends `"Please answer (Y/N)? "` on invalid entry (was the generic `"Please answer Y or N."`). `_prompt_yes_no` gained an optional `retry_message` kwarg so other Y/N callsites keep their existing wording.
|
|
470
|
+
- **`NANNY-RETRY-005` / `NANNY-RETRY-006` — weapon prompt CRLF** (`src/nanny.c:611-624`, `:638-649`): the weapon-pick prompt and its invalid-entry retry now use ROM `\n\r` line endings before `"Your choice? "` (were bare `\n`).
|
|
471
|
+
|
|
472
|
+
### Changed
|
|
473
|
+
- **Stricter creation transcript coverage**: `tests/integration/test_nanny_login_parity.py` adds six transcript-parity tests (`NANNY-RETRY-001..006`); full suite now at `4599 passed, 4 skipped` (+6 from prior baseline 4593/4, zero regressions).
|
|
474
|
+
|
|
475
|
+
## [2.8.31]
|
|
476
|
+
|
|
477
|
+
### Fixed
|
|
478
|
+
- **`nanny.c` trust-rebuild: `CON_READ_MOTD` now emits the ROM welcome line**: `mud/net/connection.py` now sends `Welcome to ROM 2.4. Please don't feed the mobiles!` at the moment a normal login actually enters the game, matching the ROM branch instead of skipping straight to MOTD/help/look output.
|
|
479
|
+
- **Forced reconnects no longer run the normal login tail**: duplicate-session takeover reconnects now skip the normal welcome/look/board path and only emit the ROM reconnect-side output, which restores parity with `check_reconnect(..., TRUE)` and keeps telnet reconnect sequencing stable.
|
|
480
|
+
|
|
481
|
+
### Changed
|
|
482
|
+
- **Stricter reconnect/login runtime coverage**: `tests/test_websocket_server.py` now asserts the ROM welcome line on first entry, and the full suite recertifies clean with the reconnect split in place (`4593 passed, 4 skipped`).
|
|
483
|
+
|
|
484
|
+
## [2.8.30]
|
|
485
|
+
|
|
486
|
+
### Fixed
|
|
487
|
+
- **`save.c` trust-rebuild: reconnect now preserves the school outfit**: `mud/models/character.py` now restores equipped items from DB-canonical `equipment_state` without silently dropping them on load, and recomputes carry totals after inventory/equipment restore so the first `score` after reconnect matches the first `score` after character creation.
|
|
488
|
+
- **`nanny.c` trust-rebuild: login now emits the ROM board summary**: `mud/net/connection.py` now mirrors the tail of `CON_READ_MOTD` by sending a blank line and `board` output after the initial room `look` on both connection paths.
|
|
489
|
+
|
|
490
|
+
### Changed
|
|
491
|
+
- **Stricter runtime-path persistence coverage**: `tests/test_websocket_server.py` now asserts both reconnect outfit persistence and post-login board summary output on the real WebSocket path, and `tests/integration/test_inv008_persistence_coherence.py` now locks equipment/carry-state save-load round trips directly.
|
|
492
|
+
|
|
493
|
+
## [2.8.29]
|
|
494
|
+
|
|
495
|
+
### Fixed
|
|
496
|
+
- **`nanny.c` trust-rebuild: returning level-1 players no longer replay first-login outfit flow**: `mud/net/connection.py` now treats the persisted `newbie_help_seen` flag as the durable first-login marker, so reconnecting or relogging level-1 characters no longer get re-equipped by Mota or reclassified as brand-new.
|
|
497
|
+
|
|
498
|
+
### Changed
|
|
499
|
+
- **Stricter runtime-path login coverage**: `tests/test_websocket_server.py` now asserts that a real WebSocket reconnect does not replay the one-time school outfit path, and `tests/test_connection_motd.py` now locks the `_is_new_player()` helper contract directly.
|
|
500
|
+
|
|
501
|
+
## [2.8.28]
|
|
502
|
+
|
|
503
|
+
### Fixed
|
|
504
|
+
- **`act_info.c` trust-rebuild: `do_look` dark-room and container-detail parity**: `mud/world/look.py` now mirrors ROM dark-room output more closely by appending raw visible character lines without a Python-only `Characters:` label, and `look in` now uses the ROM drink-container wording with liquid color plus the correct `CONT_CLOSED` bit for closed containers.
|
|
505
|
+
- **`check_blind()` / `do_look` blind-gate parity**: `mud/rom_api.py` now rejects `AFF_BLIND` correctly, and `mud/world/look.py` now returns the ROM blind message `"You can't see a thing!"` instead of falling through to normal room output.
|
|
506
|
+
|
|
507
|
+
### Changed
|
|
508
|
+
- **Stricter `do_look` regression coverage**: `tests/integration/test_do_look_command.py` now includes exact ROM-style assertions for dark-room visible occupants, drink-container liquid wording, closed-container gating, and blindness; `tests/test_rom_api.py` now locks the blind helper contract directly.
|
|
509
|
+
|
|
510
|
+
## [2.8.27]
|
|
511
|
+
|
|
512
|
+
### Fixed
|
|
513
|
+
- **`act_info.c` trust-rebuild: `do_look` autoexit parity**: `mud/world/look.py` no longer emits a manual exits line on every room look; exits now appear only through the ROM `PLR_AUTOEXIT` branch.
|
|
514
|
+
- **`act_info.c` trust-rebuild: `do_look` room rendering parity**: room contents and visible occupants are now appended as raw lines instead of Python-only `Objects:` / `Characters:` labels, matching ROM `show_list_to_char` / `show_char_to_char` behavior more closely.
|
|
515
|
+
|
|
516
|
+
### Changed
|
|
517
|
+
- **Direct `do_look` regression coverage**: added ROM-exact room-look tests for autoexit gating and raw room content / occupant line formatting.
|
|
518
|
+
|
|
519
|
+
|
|
520
|
+
## [2.8.26]
|
|
521
|
+
|
|
522
|
+
### Fixed
|
|
523
|
+
- **`act_info.c` trust-rebuild: `do_who` switched-session parity**: `mud/commands/info.py` now mirrors ROM `do_who` by preferring the switched descriptor `original` character for output and title rendering instead of always showing the shell character.
|
|
524
|
+
|
|
525
|
+
### Changed
|
|
526
|
+
- **Stricter `do_who` output coverage**: `tests/integration/test_do_who_command.py` now includes exact ROM-style output assertions for switched sessions and representative fully-flagged player rows.
|
|
527
|
+
|
|
528
|
+
|
|
529
|
+
## [2.8.25]
|
|
530
|
+
|
|
531
|
+
### Fixed
|
|
532
|
+
- **`act_info.c` trust-rebuild: `do_equipment` slot order parity**: `mud/commands/inventory.py` now mirrors ROM `do_equipment` by iterating wear slots in numeric `MAX_WEAR` order instead of Python dict insertion order.
|
|
533
|
+
- **`act_info.c` trust-rebuild: `do_where` private-room parity**: `mud/commands/info.py` mode 1 now applies the ROM room-owner/private-room gate on the live session path, so mortals no longer see descriptor-backed players in genuinely private rooms.
|
|
534
|
+
|
|
535
|
+
### Changed
|
|
536
|
+
- **Stricter `inventory` / `equipment` / `where` regressions**: added ROM-exact layout assertions for `do_inventory` and `do_equipment`, plus a real descriptor-path private-room regression for `do_where`.
|
|
537
|
+
|
|
538
|
+
|
|
539
|
+
## [2.8.24]
|
|
540
|
+
|
|
541
|
+
### Fixed
|
|
542
|
+
- **`act_info.c` trust-rebuild: `whois` formatting parity**: `mud/commands/info_extended.py` now mirrors ROM descriptor-path `whois` behavior more closely, including race/class display, immortal rank labels, AFK/KILLER/THIEF flags via enums, and switched-descriptor `original` handling.
|
|
543
|
+
- **`score` player-race mapping**: fixed the player-facing race-name helper so playable race id `0` renders as `human` instead of the base-race sentinel `unique`.
|
|
544
|
+
|
|
545
|
+
### Changed
|
|
546
|
+
- **Stricter `act_info.c` regressions**: `tests/test_player_info_commands.py` now replaces several weak smoke assertions with ROM-exact `score` and `whois` output checks.
|
|
547
|
+
- **Trust-rebuild handoff updated**: `ACT_INFO_C_AUDIT.md` and the session docs now explicitly record that `act_info.c` is under observable-behavior revalidation rather than relying on legacy structural-audit completion claims.
|
|
548
|
+
|
|
549
|
+
|
|
550
|
+
## [2.8.23]
|
|
551
|
+
|
|
552
|
+
### Fixed
|
|
553
|
+
- **`score` parity and load-session hydration**: fixed ROM-visible `score` output so loaded characters now refresh live session `logon`, render race/class/title correctly, and use ROM-style low-level AC wording instead of stale helper-path values.
|
|
554
|
+
- **Runtime-path persistence regression coverage**: added a full WebSocket create → disconnect → reconnect test to prove completed character creation persists and the second login reaches `Password:` instead of restarting character creation.
|
|
555
|
+
|
|
556
|
+
### Changed
|
|
557
|
+
- **Verification language downgraded to match evidence**: README and session guidance now mark ROM parity as under active revalidation rather than fully certified, after a live `score` bug showed gaps in prior observable-behavior coverage.
|
|
558
|
+
- **Trust-rebuild program documented**: added a re-audit plan and a differential-testing design spec covering ROM-exact output, runtime-path verification, and data parity for future audit closure work.
|
|
559
|
+
|
|
560
|
+
|
|
561
|
+
## [2.8.22]
|
|
562
|
+
|
|
563
|
+
### Fixed
|
|
564
|
+
- **Area JSON boot/reset parity**: repaired the checked-in `data/areas/*.json` dataset and the ROM area loaders so world boot no longer emits the invalid O/P/D/G/E reset warning flood. This includes ROM-accurate room-door lock decoding, object `F` affect parsing, first-tilde string termination, and JSON room-sector preservation.
|
|
565
|
+
|
|
566
|
+
### Changed
|
|
567
|
+
- **Area dataset regeneration**: regenerated the checked-in area JSON files from their `.are` sources after the loader fixes, restoring missing object prototypes and corrected room topology across the shipped world data.
|
|
568
|
+
- **Stale test cleanup after area repair**: updated area/scan/mobprog parity tests to stop depending on previously broken topology or ambient RNG state.
|
|
569
|
+
- **Full-suite recertification**: the suite now reruns clean at `4567 passed, 4 skipped`.
|
|
570
|
+
|
|
10
571
|
## [2.8.21]
|
|
11
572
|
|
|
12
573
|
### Changed
|