rom24-quickmud-python 2.5.2__tar.gz → 2.5.4__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.
Files changed (673) hide show
  1. {rom24_quickmud_python-2.5.2/rom24_quickmud_python.egg-info → rom24_quickmud_python-2.5.4}/PKG-INFO +13 -11
  2. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/README.md +12 -10
  3. rom24_quickmud_python-2.5.4/data/time.json +7 -0
  4. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/__main__.py +1 -1
  5. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/ai/__init__.py +14 -8
  6. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/characters/follow.py +15 -1
  7. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/combat/death.py +22 -26
  8. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/combat/engine.py +57 -37
  9. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/commands/admin_commands.py +2 -0
  10. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/commands/advancement.py +10 -2
  11. rom24_quickmud_python-2.5.4/mud/commands/affects.py +149 -0
  12. rom24_quickmud_python-2.5.4/mud/commands/character.py +207 -0
  13. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/commands/combat.py +10 -0
  14. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/commands/communication.py +15 -4
  15. rom24_quickmud_python-2.5.4/mud/commands/compare.py +111 -0
  16. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/commands/equipment.py +153 -30
  17. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/commands/imm_commands.py +92 -86
  18. rom24_quickmud_python-2.5.4/mud/commands/info.py +591 -0
  19. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/commands/info_extended.py +127 -67
  20. rom24_quickmud_python-2.5.4/mud/commands/inspection.py +279 -0
  21. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/commands/inventory.py +169 -9
  22. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/commands/obj_manipulation.py +39 -3
  23. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/commands/player_info.py +42 -40
  24. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/commands/session.py +166 -24
  25. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/commands/shop.py +3 -24
  26. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/config.py +19 -1
  27. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/game_loop.py +183 -11
  28. rom24_quickmud_python-2.5.4/mud/handler.py +1424 -0
  29. rom24_quickmud_python-2.5.4/mud/magic/effects.py +775 -0
  30. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/mob_cmds.py +54 -10
  31. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/models/character.py +178 -2
  32. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/models/constants.py +8 -0
  33. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/models/room.py +77 -7
  34. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/persistence.py +327 -1
  35. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/skills/handlers.py +0 -8
  36. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/spawning/templates.py +73 -4
  37. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/utils/rng_mm.py +15 -0
  38. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/utils/text.py +50 -12
  39. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/world/char_find.py +33 -35
  40. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/world/look.py +156 -49
  41. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/world/obj_find.py +60 -40
  42. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/world/vision.py +17 -7
  43. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/world/world_state.py +13 -2
  44. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/pyproject.toml +1 -1
  45. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4/rom24_quickmud_python.egg-info}/PKG-INFO +13 -11
  46. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/rom24_quickmud_python.egg-info/SOURCES.txt +45 -3
  47. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/integration/conftest.py +10 -8
  48. rom24_quickmud_python-2.5.4/tests/integration/test_admin_commands.py +458 -0
  49. rom24_quickmud_python-2.5.4/tests/integration/test_auto_flags.py +487 -0
  50. rom24_quickmud_python-2.5.4/tests/integration/test_channels.py +209 -0
  51. rom24_quickmud_python-2.5.4/tests/integration/test_character_advancement.py +475 -0
  52. rom24_quickmud_python-2.5.4/tests/integration/test_character_commands.py +276 -0
  53. rom24_quickmud_python-2.5.4/tests/integration/test_character_creation_runtime.py +258 -0
  54. rom24_quickmud_python-2.5.4/tests/integration/test_communication_enhancement.py +243 -0
  55. rom24_quickmud_python-2.5.4/tests/integration/test_compare_critical_gaps.py +325 -0
  56. rom24_quickmud_python-2.5.4/tests/integration/test_config_commands.py +315 -0
  57. rom24_quickmud_python-2.5.4/tests/integration/test_death_and_corpses.py +443 -0
  58. rom24_quickmud_python-2.5.4/tests/integration/test_do_affects.py +186 -0
  59. rom24_quickmud_python-2.5.4/tests/integration/test_do_consider_command.py +261 -0
  60. rom24_quickmud_python-2.5.4/tests/integration/test_do_equipment.py +281 -0
  61. rom24_quickmud_python-2.5.4/tests/integration/test_do_examine_command.py +362 -0
  62. rom24_quickmud_python-2.5.4/tests/integration/test_do_exits_command.py +413 -0
  63. rom24_quickmud_python-2.5.4/tests/integration/test_do_help_command.py +362 -0
  64. rom24_quickmud_python-2.5.4/tests/integration/test_do_inventory.py +352 -0
  65. rom24_quickmud_python-2.5.4/tests/integration/test_do_password_command.py +262 -0
  66. rom24_quickmud_python-2.5.4/tests/integration/test_do_practice_command.py +312 -0
  67. rom24_quickmud_python-2.5.4/tests/integration/test_do_time_command.py +220 -0
  68. rom24_quickmud_python-2.5.4/tests/integration/test_do_weather_command.py +153 -0
  69. rom24_quickmud_python-2.5.4/tests/integration/test_do_where_command.py +329 -0
  70. rom24_quickmud_python-2.5.4/tests/integration/test_do_who_command.py +366 -0
  71. rom24_quickmud_python-2.5.4/tests/integration/test_do_worth.py +137 -0
  72. rom24_quickmud_python-2.5.4/tests/integration/test_environmental_effects.py +467 -0
  73. rom24_quickmud_python-2.5.4/tests/integration/test_equipment_ac_calculations.py +400 -0
  74. rom24_quickmud_python-2.5.4/tests/integration/test_equipment_system.py +657 -0
  75. rom24_quickmud_python-2.5.4/tests/integration/test_group_combat.py +676 -0
  76. rom24_quickmud_python-2.5.4/tests/integration/test_info_display.py +328 -0
  77. rom24_quickmud_python-2.5.4/tests/integration/test_invisibility_combat.py +186 -0
  78. rom24_quickmud_python-2.5.4/tests/integration/test_mob_ai.py +545 -0
  79. rom24_quickmud_python-2.5.4/tests/integration/test_money_objects.py +415 -0
  80. rom24_quickmud_python-2.5.4/tests/integration/test_olc_builders.py +366 -0
  81. rom24_quickmud_python-2.5.4/tests/integration/test_pet_persistence.py +515 -0
  82. rom24_quickmud_python-2.5.4/tests/integration/test_player_config.py +265 -0
  83. rom24_quickmud_python-2.5.4/tests/integration/test_room_light_tracking.py +262 -0
  84. rom24_quickmud_python-2.5.4/tests/integration/test_room_safety_features.py +261 -0
  85. rom24_quickmud_python-2.5.4/tests/integration/test_save_load_parity.py +508 -0
  86. rom24_quickmud_python-2.5.4/tests/integration/test_skills_integration.py +449 -0
  87. rom24_quickmud_python-2.5.4/tests/integration/test_skills_integration_combat_specials.py +317 -0
  88. rom24_quickmud_python-2.5.4/tests/integration/test_socials.py +262 -0
  89. rom24_quickmud_python-2.5.4/tests/integration/test_spell_affects_persistence.py +717 -0
  90. rom24_quickmud_python-2.5.4/tests/integration/test_weather_time.py +525 -0
  91. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_agent_interface.py +20 -0
  92. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_combat_death.py +8 -4
  93. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_encumbrance.py +192 -0
  94. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_movement_costs.py +5 -1
  95. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_skills.py +5 -8
  96. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_world.py +9 -0
  97. rom24_quickmud_python-2.5.2/data/time.json +0 -7
  98. rom24_quickmud_python-2.5.2/mud/commands/affects.py +0 -98
  99. rom24_quickmud_python-2.5.2/mud/commands/character.py +0 -161
  100. rom24_quickmud_python-2.5.2/mud/commands/compare.py +0 -144
  101. rom24_quickmud_python-2.5.2/mud/commands/info.py +0 -352
  102. rom24_quickmud_python-2.5.2/mud/commands/inspection.py +0 -141
  103. rom24_quickmud_python-2.5.2/mud/magic/effects.py +0 -86
  104. rom24_quickmud_python-2.5.2/tests/test_admin_commands.py +0 -610
  105. rom24_quickmud_python-2.5.2/tests/test_socials.py +0 -47
  106. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/CHANGELOG.md +0 -0
  107. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/LICENSE +0 -0
  108. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/MANIFEST.in +0 -0
  109. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/area/air.are +0 -0
  110. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/area/arachnos.are +0 -0
  111. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/area/area.lst +0 -0
  112. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/area/astral.are +0 -0
  113. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/area/canyon.are +0 -0
  114. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/area/catacomb.are +0 -0
  115. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/area/chapel.are +0 -0
  116. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/area/daycare.are +0 -0
  117. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/area/draconia.are +0 -0
  118. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/area/dream.are +0 -0
  119. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/area/drow.are +0 -0
  120. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/area/dwarven.are +0 -0
  121. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/area/dylan.are +0 -0
  122. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/area/eastern.are +0 -0
  123. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/area/galaxy.are +0 -0
  124. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/area/gnome.are +0 -0
  125. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/area/grave.are +0 -0
  126. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/area/group.are +0 -0
  127. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/area/grove.are +0 -0
  128. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/area/haon.are +0 -0
  129. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/area/help.are +0 -0
  130. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/area/hitower.are +0 -0
  131. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/area/hood.are +0 -0
  132. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/area/immort.are +0 -0
  133. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/area/limbo.are +0 -0
  134. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/area/mahntor.are +0 -0
  135. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/area/marsh.are +0 -0
  136. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/area/mega1.are +0 -0
  137. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/area/midennir.are +0 -0
  138. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/area/midgaard.are +0 -0
  139. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/area/mirror.are +0 -0
  140. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/area/mobfact.are +0 -0
  141. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/area/moria.are +0 -0
  142. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/area/newthalos.are +0 -0
  143. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/area/nirvana.are +0 -0
  144. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/area/ofcol.are +0 -0
  145. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/area/ofcol2.are +0 -0
  146. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/area/olympus.are +0 -0
  147. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/area/plains.are +0 -0
  148. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/area/proto.are +0 -0
  149. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/area/pyramid.are +0 -0
  150. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/area/quifael.are +0 -0
  151. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/area/redferne.are +0 -0
  152. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/area/rom.are +0 -0
  153. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/area/school.are +0 -0
  154. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/area/sewer.are +0 -0
  155. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/area/shire.are +0 -0
  156. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/area/smurf.are +0 -0
  157. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/area/social.are +0 -0
  158. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/area/thalos.are +0 -0
  159. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/area/tohell.are +0 -0
  160. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/area/trollden.are +0 -0
  161. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/area/valley.are +0 -0
  162. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/area/wyvern.are +0 -0
  163. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas/air.json +0 -0
  164. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas/arachnos.json +0 -0
  165. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas/area.json +0 -0
  166. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas/area_0.json +0 -0
  167. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas/astral.json +0 -0
  168. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas/canyon.json +0 -0
  169. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas/catacomb.json +0 -0
  170. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas/chapel.json +0 -0
  171. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas/daycare.json +0 -0
  172. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas/draconia.json +0 -0
  173. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas/dream.json +0 -0
  174. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas/drow.json +0 -0
  175. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas/dwarven.json +0 -0
  176. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas/eastern.json +0 -0
  177. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas/galaxy.json +0 -0
  178. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas/gnome.json +0 -0
  179. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas/group.json +0 -0
  180. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas/grove.json +0 -0
  181. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas/haon.json +0 -0
  182. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas/help.json +0 -0
  183. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas/hitower.json +0 -0
  184. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas/hood.json +0 -0
  185. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas/immort.json +0 -0
  186. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas/limbo.json +0 -0
  187. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas/mahntor.json +0 -0
  188. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas/marsh.json +0 -0
  189. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas/mega1.json +0 -0
  190. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas/midennir.json +0 -0
  191. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas/midgaard.json +0 -0
  192. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas/mirror.json +0 -0
  193. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas/mobfact.json +0 -0
  194. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas/moria.json +0 -0
  195. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas/newthalos.json +0 -0
  196. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas/nirvana.json +0 -0
  197. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas/ofcol.json +0 -0
  198. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas/ofcol2.json +0 -0
  199. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas/olympus.json +0 -0
  200. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas/plains.json +0 -0
  201. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas/pyramid.json +0 -0
  202. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas/quifael.json +0 -0
  203. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas/redferne.json +0 -0
  204. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas/rom.json +0 -0
  205. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas/school.json +0 -0
  206. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas/sewer.json +0 -0
  207. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas/shire.json +0 -0
  208. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas/smurf.json +0 -0
  209. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas/social.json +0 -0
  210. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas/thalos.json +0 -0
  211. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas/tohell.json +0 -0
  212. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas/trollden.json +0 -0
  213. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas/valley.json +0 -0
  214. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas/wyvern.json +0 -0
  215. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas_backup/arachnos.json +0 -0
  216. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas_backup/area.json +0 -0
  217. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas_backup/area_0.json +0 -0
  218. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas_backup/astral_plane.json +0 -0
  219. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas_backup/catacombs.json +0 -0
  220. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas_backup/chapel.json +0 -0
  221. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas_backup/day_care.json +0 -0
  222. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas_backup/dragon_tower.json +0 -0
  223. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas_backup/drow_city.json +0 -0
  224. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas_backup/dwarven_kingdom.json +0 -0
  225. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas_backup/dylan's_area.json +0 -0
  226. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas_backup/elemental_canyon.json +0 -0
  227. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas_backup/galaxy.json +0 -0
  228. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas_backup/gangland.json +0 -0
  229. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas_backup/gnome_village.json +0 -0
  230. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas_backup/graveyard.json +0 -0
  231. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas_backup/group.json +0 -0
  232. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas_backup/haon_dor.json +0 -0
  233. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas_backup/help.json +0 -0
  234. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas_backup/high_tower.json +0 -0
  235. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas_backup/holy_grove.json +0 -0
  236. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas_backup/in_the_air.json +0 -0
  237. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas_backup/limbo.json +0 -0
  238. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas_backup/machine_dreams.json +0 -0
  239. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas_backup/mahn-tor.json +0 -0
  240. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas_backup/marsh.json +0 -0
  241. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas_backup/mega_city_one.json +0 -0
  242. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas_backup/miden'nir.json +0 -0
  243. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas_backup/midgaard.json +0 -0
  244. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas_backup/mob_factory.json +0 -0
  245. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas_backup/moria.json +0 -0
  246. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas_backup/mud_school.json +0 -0
  247. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas_backup/new_ofcol.json +0 -0
  248. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas_backup/new_thalos.json +0 -0
  249. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas_backup/nirvana.json +0 -0
  250. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas_backup/ofcol.json +0 -0
  251. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas_backup/old_thalos.json +0 -0
  252. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas_backup/olympus.json +0 -0
  253. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas_backup/plains.json +0 -0
  254. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas_backup/pyramid.json +0 -0
  255. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas_backup/quifael's.json +0 -0
  256. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas_backup/redferne's.json +0 -0
  257. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas_backup/rom.json +0 -0
  258. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas_backup/sands_of_sorrow.json +0 -0
  259. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas_backup/sewers.json +0 -0
  260. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas_backup/shire.json +0 -0
  261. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas_backup/smurfville.json +0 -0
  262. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas_backup/social.json +0 -0
  263. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas_backup/thalos.json +0 -0
  264. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas_backup/tohell.json +0 -0
  265. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas_backup/troll_den.json +0 -0
  266. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas_backup/valhalla.json +0 -0
  267. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas_backup/valley_of_the_elves.json +0 -0
  268. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/areas_backup/wyvern's_tower.json +0 -0
  269. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/help.json +0 -0
  270. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/players/.json +0 -0
  271. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/players/attacker.json +0 -0
  272. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/players/eddol.json +0 -0
  273. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/players/hero.json +0 -0
  274. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/players/sleeper.json +0 -0
  275. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/players/trouble.json +0 -0
  276. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/shops.json +0 -0
  277. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/skills.json +0 -0
  278. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/data/socials.json +0 -0
  279. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/doc/MPDocs/examples.doc +0 -0
  280. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/doc/MPDocs/hacker.doc +0 -0
  281. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/doc/MPDocs/mobprog.doc +0 -0
  282. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/doc/MPDocs/new_readme.txt +0 -0
  283. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/doc/QuickMUD.txt +0 -0
  284. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/doc/Rom2.4.doc +0 -0
  285. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/doc/act.txt +0 -0
  286. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/doc/area.txt +0 -0
  287. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/doc/c_module_inventory.md +0 -0
  288. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/doc/c_python_cross_reference.md +0 -0
  289. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/doc/c_to_python_file_coverage.md +0 -0
  290. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/doc/class.txt +0 -0
  291. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/doc/command.txt +0 -0
  292. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/doc/contrib.txt +0 -0
  293. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/doc/drool.txt +0 -0
  294. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/doc/hacker.txt +0 -0
  295. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/doc/license.doc +0 -0
  296. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/doc/license.txt +0 -0
  297. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/doc/memory.txt +0 -0
  298. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/doc/new.txt +0 -0
  299. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/doc/pfile.txt +0 -0
  300. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/doc/port.txt +0 -0
  301. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/doc/pr_queue.md +0 -0
  302. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/doc/python_architecture.md +0 -0
  303. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/doc/python_module_inventory.md +0 -0
  304. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/doc/security.txt +0 -0
  305. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/doc/sites.txt +0 -0
  306. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/doc/skill.txt +0 -0
  307. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/doc/sky.txt +0 -0
  308. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/doc/trad.txt +0 -0
  309. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/doc/vnum.txt +0 -0
  310. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/doc/~$Rom2.4.doc +0 -0
  311. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/__init__.py +0 -0
  312. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/account/__init__.py +0 -0
  313. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/account/account_manager.py +0 -0
  314. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/account/account_service.py +0 -0
  315. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/admin_logging/__init__.py +0 -0
  316. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/admin_logging/admin.py +0 -0
  317. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/admin_logging/agent_trace.py +0 -0
  318. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/advancement.py +0 -0
  319. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/affects/engine.py +0 -0
  320. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/affects/saves.py +0 -0
  321. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/agent/__init__.py +0 -0
  322. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/agent/agent_protocol.py +0 -0
  323. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/agent/character_agent.py +0 -0
  324. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/ai/aggressive.py +0 -0
  325. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/characters/__init__.py +0 -0
  326. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/characters/conditions.py +0 -0
  327. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/combat/__init__.py +0 -0
  328. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/combat/assist.py +0 -0
  329. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/combat/kill_table.py +0 -0
  330. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/combat/messages.py +0 -0
  331. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/combat/safety.py +0 -0
  332. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/commands/__init__.py +0 -0
  333. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/commands/alias_cmds.py +0 -0
  334. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/commands/auto_settings.py +0 -0
  335. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/commands/build.py +0 -0
  336. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/commands/channels.py +0 -0
  337. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/commands/consider.py +0 -0
  338. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/commands/consumption.py +0 -0
  339. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/commands/decorators.py +0 -0
  340. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/commands/dispatcher.py +0 -0
  341. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/commands/doors.py +0 -0
  342. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/commands/feedback.py +0 -0
  343. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/commands/give.py +0 -0
  344. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/commands/group_commands.py +0 -0
  345. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/commands/healer.py +0 -0
  346. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/commands/help.py +0 -0
  347. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/commands/imc.py +0 -0
  348. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/commands/imm_admin.py +0 -0
  349. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/commands/imm_display.py +0 -0
  350. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/commands/imm_emote.py +0 -0
  351. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/commands/imm_load.py +0 -0
  352. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/commands/imm_olc.py +0 -0
  353. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/commands/imm_punish.py +0 -0
  354. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/commands/imm_search.py +0 -0
  355. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/commands/imm_server.py +0 -0
  356. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/commands/imm_set.py +0 -0
  357. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/commands/liquids.py +0 -0
  358. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/commands/magic_items.py +0 -0
  359. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/commands/misc_info.py +0 -0
  360. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/commands/misc_player.py +0 -0
  361. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/commands/mobprog_tools.py +0 -0
  362. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/commands/movement.py +0 -0
  363. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/commands/murder.py +0 -0
  364. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/commands/notes.py +0 -0
  365. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/commands/player_config.py +0 -0
  366. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/commands/position.py +0 -0
  367. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/commands/remaining_rom.py +0 -0
  368. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/commands/socials.py +0 -0
  369. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/commands/thief_skills.py +0 -0
  370. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/commands/typo_guards.py +0 -0
  371. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/db/__init__.py +0 -0
  372. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/db/init.py +0 -0
  373. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/db/migrate_from_files.py +0 -0
  374. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/db/migrations.py +0 -0
  375. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/db/models.py +0 -0
  376. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/db/seed.py +0 -0
  377. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/db/session.py +0 -0
  378. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/devtools/__init__.py +0 -0
  379. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/devtools/agent_demo.py +0 -0
  380. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/entrypoint.py +0 -0
  381. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/game_tick_scheduler.py +0 -0
  382. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/groups/__init__.py +0 -0
  383. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/groups/xp.py +0 -0
  384. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/imc/__init__.py +0 -0
  385. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/imc/commands.py +0 -0
  386. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/imc/network.py +0 -0
  387. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/imc/protocol.py +0 -0
  388. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/loaders/__init__.py +0 -0
  389. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/loaders/area_loader.py +0 -0
  390. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/loaders/base_loader.py +0 -0
  391. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/loaders/help_loader.py +0 -0
  392. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/loaders/json_area_loader.py +0 -0
  393. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/loaders/json_loader.py +0 -0
  394. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/loaders/mob_loader.py +0 -0
  395. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/loaders/mobprog_loader.py +0 -0
  396. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/loaders/obj_loader.py +0 -0
  397. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/loaders/reset_loader.py +0 -0
  398. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/loaders/room_loader.py +0 -0
  399. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/loaders/shop_loader.py +0 -0
  400. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/loaders/social_loader.py +0 -0
  401. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/loaders/specials_loader.py +0 -0
  402. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/logging.py +0 -0
  403. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/magic/__init__.py +0 -0
  404. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/math/c_compat.py +0 -0
  405. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/mobprog.py +0 -0
  406. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/models/__init__.py +0 -0
  407. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/models/area.py +0 -0
  408. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/models/area_json.py +0 -0
  409. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/models/board.py +0 -0
  410. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/models/board_json.py +0 -0
  411. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/models/character_json.py +0 -0
  412. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/models/clans.py +0 -0
  413. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/models/classes.py +0 -0
  414. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/models/conversion.py +0 -0
  415. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/models/help.py +0 -0
  416. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/models/help_json.py +0 -0
  417. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/models/json_io.py +0 -0
  418. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/models/mob.py +0 -0
  419. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/models/note.py +0 -0
  420. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/models/note_json.py +0 -0
  421. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/models/obj.py +0 -0
  422. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/models/object.py +0 -0
  423. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/models/object_json.py +0 -0
  424. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/models/player_json.py +0 -0
  425. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/models/races.py +0 -0
  426. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/models/room_json.py +0 -0
  427. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/models/shop.py +0 -0
  428. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/models/shop_json.py +0 -0
  429. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/models/skill.py +0 -0
  430. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/models/skill_json.py +0 -0
  431. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/models/social.py +0 -0
  432. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/models/social_json.py +0 -0
  433. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/music/__init__.py +0 -0
  434. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/net/__init__.py +0 -0
  435. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/net/ansi.py +0 -0
  436. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/net/connection.py +0 -0
  437. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/net/protocol.py +0 -0
  438. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/net/session.py +0 -0
  439. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/net/ssh_server.py +0 -0
  440. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/net/telnet_server.py +0 -0
  441. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/network/__init__.py +0 -0
  442. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/network/websocket_server.py +0 -0
  443. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/network/websocket_session.py +0 -0
  444. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/notes.py +0 -0
  445. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/olc/__init__.py +0 -0
  446. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/olc/save.py +0 -0
  447. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/registry.py +0 -0
  448. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/rom_api.py +0 -0
  449. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/scripts/convert_are_to_json.py +0 -0
  450. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/scripts/convert_help_are_to_json.py +0 -0
  451. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/scripts/convert_player_to_json.py +0 -0
  452. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/scripts/convert_shops_to_json.py +0 -0
  453. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/scripts/convert_skills_to_json.py +0 -0
  454. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/scripts/convert_social_are_to_json.py +0 -0
  455. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/scripts/load_test_data.py +0 -0
  456. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/security/__init__.py +0 -0
  457. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/security/bans.py +0 -0
  458. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/security/hash_utils.py +0 -0
  459. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/server.py +0 -0
  460. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/skills/__init__.py +0 -0
  461. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/skills/groups.py +0 -0
  462. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/skills/metadata.py +0 -0
  463. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/skills/registry.py +0 -0
  464. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/skills/say_spell.py +0 -0
  465. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/spawning/__init__.py +0 -0
  466. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/spawning/mob_spawner.py +0 -0
  467. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/spawning/obj_spawner.py +0 -0
  468. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/spawning/reset_handler.py +0 -0
  469. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/spec_funs.py +0 -0
  470. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/time.py +0 -0
  471. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/utils/act.py +0 -0
  472. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/wiznet.py +0 -0
  473. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/world/__init__.py +0 -0
  474. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/world/linking.py +0 -0
  475. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/mud/world/movement.py +0 -0
  476. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/rom24_quickmud_python.egg-info/dependency_links.txt +0 -0
  477. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/rom24_quickmud_python.egg-info/entry_points.txt +0 -0
  478. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/rom24_quickmud_python.egg-info/requires.txt +0 -0
  479. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/rom24_quickmud_python.egg-info/top_level.txt +0 -0
  480. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/setup.cfg +0 -0
  481. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/setup.py +0 -0
  482. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/conftest.py +0 -0
  483. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/helpers.py +0 -0
  484. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/helpers_player.py +0 -0
  485. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/integration/test_architectural_parity.py +0 -0
  486. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/integration/test_auto_sequences.py +0 -0
  487. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/integration/test_mobprog_scenarios.py +0 -0
  488. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/integration/test_new_player_workflow.py +0 -0
  489. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/integration/test_pilot_integration.py +0 -0
  490. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/integration/test_player_npc_interaction.py +0 -0
  491. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/integration/test_spell_casting.py +0 -0
  492. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_account_auth.py +0 -0
  493. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_act_comm_rom_parity.py +0 -0
  494. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_act_enter_rom_parity.py +0 -0
  495. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_act_info_rom_parity.py +0 -0
  496. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_act_obj_rom_parity.py +0 -0
  497. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_act_wiz_rom_parity.py +0 -0
  498. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_advancement.py +0 -0
  499. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_affects.py +0 -0
  500. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_alias_parity.py +0 -0
  501. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_ansi.py +0 -0
  502. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_are_conversion.py +0 -0
  503. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_area_counts.py +0 -0
  504. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_area_exits.py +0 -0
  505. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_area_loader.py +0 -0
  506. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_area_specials.py +0 -0
  507. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_bans.py +0 -0
  508. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_boards.py +0 -0
  509. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_builder_hedit.py +0 -0
  510. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_builder_stat_commands.py +0 -0
  511. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_building.py +0 -0
  512. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_char_update_rom_parity.py +0 -0
  513. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_combat.py +0 -0
  514. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_combat_assist.py +0 -0
  515. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_combat_damage_types.py +0 -0
  516. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_combat_defenses_prob.py +0 -0
  517. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_combat_messages.py +0 -0
  518. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_combat_position_damage.py +0 -0
  519. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_combat_rom_parity.py +0 -0
  520. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_combat_skills.py +0 -0
  521. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_combat_state.py +0 -0
  522. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_combat_surrender.py +0 -0
  523. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_combat_thac0.py +0 -0
  524. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_combat_thac0_engine.py +0 -0
  525. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_command_abbrev.py +0 -0
  526. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_command_parity.py +0 -0
  527. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_commands.py +0 -0
  528. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_communication.py +0 -0
  529. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_connection_motd.py +0 -0
  530. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_convert_are_to_json_cli.py +0 -0
  531. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_critical_function_parity.py +0 -0
  532. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_damage_reduction.py +0 -0
  533. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_damage_reduction_integration.py +0 -0
  534. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_db_resets_rom_parity.py +0 -0
  535. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_db_seed.py +0 -0
  536. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_defense_flags.py +0 -0
  537. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_enter_portal.py +0 -0
  538. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_fighting_state.py +0 -0
  539. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_game_loop.py +0 -0
  540. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_game_loop_order.py +0 -0
  541. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_game_loop_wait_daze.py +0 -0
  542. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_golden_reference.py +0 -0
  543. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_handler_affects_rom_parity.py +0 -0
  544. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_hash_utils.py +0 -0
  545. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_healer.py +0 -0
  546. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_healer_parity.py +0 -0
  547. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_healer_rom_parity.py +0 -0
  548. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_help_conversion.py +0 -0
  549. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_help_system.py +0 -0
  550. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_imc.py +0 -0
  551. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_inventory_persistence.py +0 -0
  552. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_json_io.py +0 -0
  553. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_json_model_instantiation.py +0 -0
  554. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_json_room_fields.py +0 -0
  555. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_load_midgaard.py +0 -0
  556. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_logging_admin.py +0 -0
  557. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_logging_rotation.py +0 -0
  558. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_mob_act_flags.py +0 -0
  559. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_mob_damage_modifiers.py +0 -0
  560. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_mobprog.py +0 -0
  561. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_mobprog_commands.py +0 -0
  562. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_mobprog_helpers.py +0 -0
  563. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_mobprog_triggers.py +0 -0
  564. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_movement.py +0 -0
  565. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_movement_charm.py +0 -0
  566. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_movement_doors.py +0 -0
  567. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_movement_followers.py +0 -0
  568. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_movement_mobprog.py +0 -0
  569. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_movement_npc.py +0 -0
  570. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_movement_portals.py +0 -0
  571. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_movement_privacy.py +0 -0
  572. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_movement_visibility.py +0 -0
  573. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_music.py +0 -0
  574. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_nanny_rom_parity.py +0 -0
  575. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_networking_telnet.py +0 -0
  576. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_obj_update_rom_parity.py +0 -0
  577. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_olc_aedit.py +0 -0
  578. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_olc_medit.py +0 -0
  579. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_olc_oedit.py +0 -0
  580. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_olc_save.py +0 -0
  581. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_passive_skills_rom_parity.py +0 -0
  582. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_persistence.py +0 -0
  583. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_player_affect_flags.py +0 -0
  584. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_player_auto_settings.py +0 -0
  585. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_player_combat_attributes.py +0 -0
  586. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_player_conditions.py +0 -0
  587. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_player_creation.py +0 -0
  588. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_player_equipment.py +0 -0
  589. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_player_flags.py +0 -0
  590. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_player_info_commands.py +0 -0
  591. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_player_mechanics.py +0 -0
  592. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_player_prompt.py +0 -0
  593. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_player_resistance_flags.py +0 -0
  594. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_player_save_format.py +0 -0
  595. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_player_skills_spells.py +0 -0
  596. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_player_stats.py +0 -0
  597. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_player_title_description.py +0 -0
  598. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_player_wimpy.py +0 -0
  599. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_practice.py +0 -0
  600. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_reset_levels.py +0 -0
  601. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_resets.py +0 -0
  602. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_rng_and_ccompat.py +0 -0
  603. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_rng_dice.py +0 -0
  604. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_rom_api.py +0 -0
  605. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_runtime_models.py +0 -0
  606. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_saves_rom_parity.py +0 -0
  607. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_say_spell.py +0 -0
  608. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_scan_parity.py +0 -0
  609. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_schema_validation.py +0 -0
  610. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_scripted_session.py +0 -0
  611. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_shop_conversion.py +0 -0
  612. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_shops.py +0 -0
  613. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_skill_combat_rom_parity.py +0 -0
  614. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_skill_conversion.py +0 -0
  615. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_skill_envenom_rom_parity.py +0 -0
  616. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_skill_haggle_rom_parity.py +0 -0
  617. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_skill_hide_rom_parity.py +0 -0
  618. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_skill_peek_rom_parity.py +0 -0
  619. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_skill_pick_lock_rom_parity.py +0 -0
  620. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_skill_recall_rom_parity.py +0 -0
  621. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_skill_registry.py +0 -0
  622. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_skill_steal_rom_parity.py +0 -0
  623. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_skills_buffs.py +0 -0
  624. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_skills_combat.py +0 -0
  625. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_skills_conjuration.py +0 -0
  626. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_skills_damage.py +0 -0
  627. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_skills_debuffs.py +0 -0
  628. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_skills_detection.py +0 -0
  629. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_skills_healing.py +0 -0
  630. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_skills_identify.py +0 -0
  631. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_skills_learned.py +0 -0
  632. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_skills_mass.py +0 -0
  633. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_skills_misc.py +0 -0
  634. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_skills_transport.py +0 -0
  635. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_social_conversion.py +0 -0
  636. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_social_placeholders.py +0 -0
  637. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_spawning.py +0 -0
  638. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_spec_fun_behaviors.py +0 -0
  639. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_spec_funs.py +0 -0
  640. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_spec_funs_extra.py +0 -0
  641. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_specials_loader_ext.py +0 -0
  642. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_spell_area_effects_rom_parity.py +0 -0
  643. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_spell_breath_weapons_rom_parity.py +0 -0
  644. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_spell_buff_debuff_additional_rom_parity.py +0 -0
  645. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_spell_buff_debuff_rom_parity.py +0 -0
  646. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_spell_cancellation_rom_parity.py +0 -0
  647. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_spell_charm_control_rom_parity.py +0 -0
  648. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_spell_creation_rom_parity.py +0 -0
  649. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_spell_critical_gameplay_rom_parity.py +0 -0
  650. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_spell_damage_additional_rom_parity.py +0 -0
  651. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_spell_detection_rom_parity.py +0 -0
  652. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_spell_enchantment_rom_parity.py +0 -0
  653. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_spell_farsight_rom_parity.py +0 -0
  654. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_spell_final_nine_rom_parity.py +0 -0
  655. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_spell_harm_rom_parity.py +0 -0
  656. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_spell_healing_rom_parity.py +0 -0
  657. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_spell_heat_metal_rom_parity.py +0 -0
  658. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_spell_high_priority_missing_rom_parity.py +0 -0
  659. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_spell_information_rom_parity.py +0 -0
  660. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_spell_mass_healing_rom_parity.py +0 -0
  661. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_spell_priority_high_rom_parity.py +0 -0
  662. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_spell_shocking_grasp_rom_parity.py +0 -0
  663. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_spell_travel_portal_rom_parity.py +0 -0
  664. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_spells_basic.py +0 -0
  665. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_spells_damage.py +0 -0
  666. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_state_transitions.py +0 -0
  667. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_telnet_server.py +0 -0
  668. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_time_daynight.py +0 -0
  669. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_time_persistence.py +0 -0
  670. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_utility_spells_parity.py +0 -0
  671. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_weapon_damage.py +0 -0
  672. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_weapon_special_attacks.py +0 -0
  673. {rom24_quickmud_python-2.5.2 → rom24_quickmud_python-2.5.4}/tests/test_wiznet.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rom24-quickmud-python
3
- Version: 2.5.2
3
+ Version: 2.5.4
4
4
  Summary: A modern Python port of the ROM 2.4b6 MUD engine with full telnet server and JSON world loading
5
5
  Author-email: Mark Jedrzejczyk <mark.jedrzejczyk@gmail.com>
6
6
  Maintainer-email: Mark Jedrzejczyk <mark.jedrzejczyk@gmail.com>
@@ -56,10 +56,10 @@ Dynamic: license-file
56
56
  [![Version](https://img.shields.io/badge/version-2.5.0-blue.svg)](https://github.com/avinson/rom24-quickmud)
57
57
  [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)
58
58
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
59
- [![Tests](https://img.shields.io/badge/tests-700+%20passing-brightgreen.svg)](https://github.com/Nostoi/rom24-quickmud-python)
59
+ [![Tests](https://img.shields.io/badge/tests-1435%2F1436%20passing-brightgreen.svg)](https://github.com/Nostoi/rom24-quickmud-python)
60
60
  [![ROM 2.4b Parity](https://img.shields.io/badge/ROM%202.4b%20Parity-100%25%20CERTIFIED-success.svg)](ROM_2.4B6_PARITY_CERTIFICATION.md)
61
61
  [![Function Coverage](https://img.shields.io/badge/ROM%20C%20Functions-96.1%25-blue.svg)](FUNCTION_MAPPING.md)
62
- [![Integration Tests](https://img.shields.io/badge/integration%20tests-43%2F43%20passing-brightgreen.svg)](tests/integration/)
62
+ [![Integration Tests](https://img.shields.io/badge/integration%20tests-688%2F701%20passing-brightgreen.svg)](tests/integration/)
63
63
 
64
64
  **QuickMUD is a modern Python port of the legendary ROM 2.4b6 MUD engine**, derived from ROM 2.4b6, Merc 2.1 and DikuMUD. This is a complete rewrite that brings the classic text-based MMORPG experience to modern Python with async networking, JSON world data, and **100% ROM 2.4b behavioral parity**.
65
65
 
@@ -77,7 +77,7 @@ A "[Multi-User Dungeon](https://en.wikipedia.org/wiki/MUD)" (MUD) is a text-base
77
77
  - **⚔️ ROM Combat System**: Classic ROM combat mechanics and skill system
78
78
  - **👥 Social Features**: Say, tell, shout, and 100+ social interactions
79
79
  - **🛠️ Admin Commands**: Teleport, spawn, ban management, and OLC building
80
- - **📊 Comprehensive Testing**: 700+ tests with 43/43 integration tests passing (100%)
80
+ - **📊 Comprehensive Testing**: 1435+ tests with 688/701 integration tests passing (98.1%)
81
81
  - **🔧 ROM C-Compatible API**: Public API wrappers for external tools and scripts (27 functions)
82
82
 
83
83
  ## 📦 Installation
@@ -92,13 +92,15 @@ pip install quickmud
92
92
 
93
93
  Run a QuickMUD server:
94
94
 
95
- **Telnet Server (port 5000):**
95
+ **Telnet Server (port 5001):**
96
96
  ```bash
97
97
  python3 -m mud socketserver
98
98
  # or
99
99
  mud socketserver
100
100
  ```
101
101
 
102
+ > **⚠️ macOS Users:** Port 5000 is used by macOS AirPlay Receiver (Monterey+). QuickMUD defaults to port 5001 to avoid conflicts. To use a different port: `python3 -m mud socketserver --port 4000`
103
+
102
104
  **WebSocket Server (port 8000):**
103
105
  ```bash
104
106
  python3 -m mud websocketserver
@@ -122,7 +124,7 @@ Connect to the server:
122
124
 
123
125
  **Via Telnet:**
124
126
  ```bash
125
- telnet localhost 5000
127
+ telnet localhost 5001
126
128
  ```
127
129
 
128
130
  **Via SSH:**
@@ -149,7 +151,7 @@ pip install -e .[dev]
149
151
 
150
152
  ```bash
151
153
  pytest # Run all tests (~16 seconds)
152
- pytest tests/integration/ -v # Run integration tests (43/43 passing)
154
+ pytest tests/integration/ -v # Run integration tests (688/701 passing)
153
155
  ```
154
156
 
155
157
  ### Development Server
@@ -163,8 +165,8 @@ python -m mud # Start development server
163
165
  - **Version**: 2.5.0 (Production Ready - ROM 2.4b6 Parity Certified)
164
166
  - **ROM 2.4b Parity**: ✅ **100% CERTIFIED** ([official certification](ROM_2.4B6_PARITY_CERTIFICATION.md))
165
167
  - **ROM C Function Coverage**: 96.1% (716/745 functions mapped)
166
- - **Test Coverage**: 700+ tests passing, 43/43 integration tests (100%)
167
- - **Performance**: Full test suite completes in ~16 seconds
168
+ - **Test Coverage**: 1435/1436 tests passing (99.93%), 688/701 integration tests (98.1%)
169
+ - **Performance**: Full test suite completes in ~75 seconds
168
170
  - **Compatibility**: Python 3.10+, cross-platform
169
171
 
170
172
  ## 🏛️ Architecture
@@ -263,7 +265,7 @@ Build and run the Python server with Docker:
263
265
 
264
266
  ```bash
265
267
  docker build -t quickmud .
266
- docker run -p 5000:5000 quickmud
268
+ docker run -p 5001:5001 quickmud
267
269
  ```
268
270
 
269
271
  Or use docker-compose to rebuild on changes and mount the repository:
@@ -275,7 +277,7 @@ docker-compose up
275
277
  Connect via:
276
278
 
277
279
  ```bash
278
- telnet localhost 5000
280
+ telnet localhost 5001
279
281
  ```
280
282
 
281
283
  ## Data Models
@@ -3,10 +3,10 @@
3
3
  [![Version](https://img.shields.io/badge/version-2.5.0-blue.svg)](https://github.com/avinson/rom24-quickmud)
4
4
  [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)
5
5
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
6
- [![Tests](https://img.shields.io/badge/tests-700+%20passing-brightgreen.svg)](https://github.com/Nostoi/rom24-quickmud-python)
6
+ [![Tests](https://img.shields.io/badge/tests-1435%2F1436%20passing-brightgreen.svg)](https://github.com/Nostoi/rom24-quickmud-python)
7
7
  [![ROM 2.4b Parity](https://img.shields.io/badge/ROM%202.4b%20Parity-100%25%20CERTIFIED-success.svg)](ROM_2.4B6_PARITY_CERTIFICATION.md)
8
8
  [![Function Coverage](https://img.shields.io/badge/ROM%20C%20Functions-96.1%25-blue.svg)](FUNCTION_MAPPING.md)
9
- [![Integration Tests](https://img.shields.io/badge/integration%20tests-43%2F43%20passing-brightgreen.svg)](tests/integration/)
9
+ [![Integration Tests](https://img.shields.io/badge/integration%20tests-688%2F701%20passing-brightgreen.svg)](tests/integration/)
10
10
 
11
11
  **QuickMUD is a modern Python port of the legendary ROM 2.4b6 MUD engine**, derived from ROM 2.4b6, Merc 2.1 and DikuMUD. This is a complete rewrite that brings the classic text-based MMORPG experience to modern Python with async networking, JSON world data, and **100% ROM 2.4b behavioral parity**.
12
12
 
@@ -24,7 +24,7 @@ A "[Multi-User Dungeon](https://en.wikipedia.org/wiki/MUD)" (MUD) is a text-base
24
24
  - **⚔️ ROM Combat System**: Classic ROM combat mechanics and skill system
25
25
  - **👥 Social Features**: Say, tell, shout, and 100+ social interactions
26
26
  - **🛠️ Admin Commands**: Teleport, spawn, ban management, and OLC building
27
- - **📊 Comprehensive Testing**: 700+ tests with 43/43 integration tests passing (100%)
27
+ - **📊 Comprehensive Testing**: 1435+ tests with 688/701 integration tests passing (98.1%)
28
28
  - **🔧 ROM C-Compatible API**: Public API wrappers for external tools and scripts (27 functions)
29
29
 
30
30
  ## 📦 Installation
@@ -39,13 +39,15 @@ pip install quickmud
39
39
 
40
40
  Run a QuickMUD server:
41
41
 
42
- **Telnet Server (port 5000):**
42
+ **Telnet Server (port 5001):**
43
43
  ```bash
44
44
  python3 -m mud socketserver
45
45
  # or
46
46
  mud socketserver
47
47
  ```
48
48
 
49
+ > **⚠️ macOS Users:** Port 5000 is used by macOS AirPlay Receiver (Monterey+). QuickMUD defaults to port 5001 to avoid conflicts. To use a different port: `python3 -m mud socketserver --port 4000`
50
+
49
51
  **WebSocket Server (port 8000):**
50
52
  ```bash
51
53
  python3 -m mud websocketserver
@@ -69,7 +71,7 @@ Connect to the server:
69
71
 
70
72
  **Via Telnet:**
71
73
  ```bash
72
- telnet localhost 5000
74
+ telnet localhost 5001
73
75
  ```
74
76
 
75
77
  **Via SSH:**
@@ -96,7 +98,7 @@ pip install -e .[dev]
96
98
 
97
99
  ```bash
98
100
  pytest # Run all tests (~16 seconds)
99
- pytest tests/integration/ -v # Run integration tests (43/43 passing)
101
+ pytest tests/integration/ -v # Run integration tests (688/701 passing)
100
102
  ```
101
103
 
102
104
  ### Development Server
@@ -110,8 +112,8 @@ python -m mud # Start development server
110
112
  - **Version**: 2.5.0 (Production Ready - ROM 2.4b6 Parity Certified)
111
113
  - **ROM 2.4b Parity**: ✅ **100% CERTIFIED** ([official certification](ROM_2.4B6_PARITY_CERTIFICATION.md))
112
114
  - **ROM C Function Coverage**: 96.1% (716/745 functions mapped)
113
- - **Test Coverage**: 700+ tests passing, 43/43 integration tests (100%)
114
- - **Performance**: Full test suite completes in ~16 seconds
115
+ - **Test Coverage**: 1435/1436 tests passing (99.93%), 688/701 integration tests (98.1%)
116
+ - **Performance**: Full test suite completes in ~75 seconds
115
117
  - **Compatibility**: Python 3.10+, cross-platform
116
118
 
117
119
  ## 🏛️ Architecture
@@ -210,7 +212,7 @@ Build and run the Python server with Docker:
210
212
 
211
213
  ```bash
212
214
  docker build -t quickmud .
213
- docker run -p 5000:5000 quickmud
215
+ docker run -p 5001:5001 quickmud
214
216
  ```
215
217
 
216
218
  Or use docker-compose to rebuild on changes and mount the repository:
@@ -222,7 +224,7 @@ docker-compose up
222
224
  Connect via:
223
225
 
224
226
  ```bash
225
- telnet localhost 5000
227
+ telnet localhost 5001
226
228
  ```
227
229
 
228
230
  ## Data Models
@@ -0,0 +1,7 @@
1
+ {
2
+ "hour": 0,
3
+ "day": 0,
4
+ "month": 0,
5
+ "year": 0,
6
+ "sunlight": 0
7
+ }
@@ -31,7 +31,7 @@ def loadtestuser():
31
31
 
32
32
 
33
33
  @cli.command()
34
- def socketserver(host: str = "0.0.0.0", port: int = 5000):
34
+ def socketserver(host: str = "0.0.0.0", port: int = 5001):
35
35
  """Start the telnet server."""
36
36
  asyncio.run(start_telnet(host=host, port=port))
37
37
 
@@ -16,7 +16,8 @@ from mud.models.constants import (
16
16
  EX_CLOSED,
17
17
  )
18
18
  from mud.models.obj import ObjectData
19
- from mud.models.room import Exit, Room, room_registry
19
+ from mud.models.room import Exit, Room
20
+ from mud.registry import room_registry
20
21
  from mud.utils import rng_mm
21
22
  from mud.world.movement import move_character
22
23
 
@@ -209,14 +210,20 @@ def _room_contents(room: Room | None) -> Iterable[ObjectData]:
209
210
 
210
211
 
211
212
  def _take_object(mob: Character, obj: ObjectData) -> None:
212
- room = getattr(obj, "in_room", None) or getattr(mob, "room", None)
213
+ room = getattr(obj, "in_room", None) or getattr(obj, "location", None) or getattr(mob, "room", None)
213
214
  if room is not None:
214
215
  contents = getattr(room, "contents", None)
215
216
  if isinstance(contents, list) and obj in contents:
216
217
  contents.remove(obj)
217
- obj.in_room = None
218
- obj.in_obj = None
219
- obj.carried_by = mob
218
+
219
+ if hasattr(obj, "in_room"):
220
+ obj.in_room = None
221
+ if hasattr(obj, "location"):
222
+ obj.location = None
223
+ if hasattr(obj, "in_obj"):
224
+ obj.in_obj = None
225
+ if hasattr(obj, "carried_by"):
226
+ obj.carried_by = mob
220
227
 
221
228
  inventory = getattr(mob, "inventory", None)
222
229
  if isinstance(inventory, list) and obj not in inventory:
@@ -280,9 +287,8 @@ def _maybe_wander(mob: Character, room: Room) -> None:
280
287
  if rng_mm.number_bits(3) != 0:
281
288
  return
282
289
 
283
- door = rng_mm.number_bits(5)
284
- if door > int(Direction.DOWN):
285
- return
290
+ # ROM C mob_cmds.c:1274 uses number_door() for random direction
291
+ door = rng_mm.number_door()
286
292
 
287
293
  exit_obj = _valid_exit(room, door)
288
294
  if exit_obj is None:
@@ -67,4 +67,18 @@ def stop_follower(follower: "Character") -> None:
67
67
  follower.leader = None
68
68
 
69
69
 
70
- __all__ = ["add_follower", "stop_follower"]
70
+ def die_follower(char: "Character") -> None:
71
+ """Stop all followers when character dies.
72
+
73
+ ROM Reference: src/handler.c die_follower
74
+ Mirrors ROM behavior: when character dies, all their followers stop following.
75
+ """
76
+ from mud.models.character import character_registry
77
+
78
+ for follower in list(character_registry):
79
+ master = getattr(follower, "master", None)
80
+ if master is char:
81
+ stop_follower(follower)
82
+
83
+
84
+ __all__ = ["add_follower", "stop_follower", "die_follower"]
@@ -145,7 +145,9 @@ def _is_floating_slot(slot: str | None, obj: Object) -> bool:
145
145
 
146
146
 
147
147
  def _format_corpse_labels(corpse: Object, name: str) -> None:
148
- short_template = getattr(corpse.prototype, "short_descr", None) or getattr(corpse, "short_descr", "the corpse of %s")
148
+ short_template = getattr(corpse.prototype, "short_descr", None) or getattr(
149
+ corpse, "short_descr", "the corpse of %s"
150
+ )
149
151
  desc_template = getattr(corpse.prototype, "description", None) or getattr(
150
152
  corpse, "description", "The corpse of %s is lying here."
151
153
  )
@@ -216,11 +218,7 @@ def _broadcast_neighbor_cry(victim: Character) -> None:
216
218
  if room is None:
217
219
  return
218
220
 
219
- message = (
220
- "You hear something's death cry."
221
- if getattr(victim, "is_npc", False)
222
- else "You hear someone's death cry."
223
- )
221
+ message = "You hear something's death cry." if getattr(victim, "is_npc", False) else "You hear someone's death cry."
224
222
 
225
223
  for exit_data in getattr(room, "exits", []) or []:
226
224
  if exit_data is None:
@@ -341,7 +339,7 @@ def death_cry(victim: Character) -> None:
341
339
  def _fallback_corpse(vnum: int, *, item_type: ItemType) -> Object:
342
340
  """Return a minimal corpse object when the real prototype is missing."""
343
341
 
344
- proto = ObjIndex(vnum=vnum, short_descr="a corpse", description="The corpse of someone lies here.")
342
+ proto = ObjIndex(vnum=vnum, short_descr="the corpse of %s", description="The corpse of %s is lying here.")
345
343
  proto.item_type = int(item_type)
346
344
  corpse = Object(instance_id=None, prototype=proto)
347
345
  corpse.item_type = int(item_type)
@@ -368,19 +366,6 @@ def _strip_inventory(victim: Character) -> list[tuple[Object, bool]]:
368
366
  return items
369
367
 
370
368
 
371
- def _set_corpse_coins(corpse: Object, gold: int, silver: int) -> None:
372
- """Persist coin totals on the corpse and mirror into ``value[0:2]``."""
373
-
374
- corpse.gold = gold
375
- corpse.silver = silver
376
- values = list(getattr(corpse, "value", []) or [])
377
- while len(values) < 2:
378
- values.append(0)
379
- values[0] = gold
380
- values[1] = silver
381
- corpse.value = values
382
-
383
-
384
369
  def _handle_corpse_item(
385
370
  corpse: Object,
386
371
  room,
@@ -445,9 +430,18 @@ def make_corpse(victim: Character) -> Object | None:
445
430
 
446
431
  gold = max(0, int(getattr(victim, "gold", 0) or 0))
447
432
  silver = max(0, int(getattr(victim, "silver", 0) or 0))
448
- _set_corpse_coins(corpse, gold, silver)
449
- victim.gold = max(0, int(getattr(victim, "gold", 0) or 0) - gold)
450
- victim.silver = max(0, int(getattr(victim, "silver", 0) or 0) - silver)
433
+
434
+ # ROM C fight.c:1473-1478 - Create money object inside corpse
435
+ if gold > 0 or silver > 0:
436
+ from mud.handler import create_money
437
+
438
+ money_obj = create_money(gold, silver)
439
+ if money_obj:
440
+ corpse.contained_items.append(money_obj)
441
+ money_obj.location = None # Inside corpse, not in room
442
+
443
+ victim.gold = 0
444
+ victim.silver = 0
451
445
 
452
446
  if not is_npc:
453
447
  _clear_player_flag(victim, PlayerFlag.CANLOOT)
@@ -557,16 +551,18 @@ def raw_kill(victim: Character) -> Object | None:
557
551
  """Handle character death by creating a corpse and removing the victim."""
558
552
 
559
553
  from mud.combat.engine import stop_fighting as _stop_fighting
560
-
554
+ from mud.characters.follow import die_follower
555
+
561
556
  # Trigger death mobprog handled in apply_damage before raw_kill
562
557
  # ROM Reference: src/fight.c:1136-1180 (mp_death_trigger called before raw_kill)
563
-
558
+
559
+ _nuke_pets(victim, room=getattr(victim, "room", None))
560
+ die_follower(victim)
564
561
  _stop_fighting(victim, True)
565
562
  death_cry(victim)
566
563
  corpse = make_corpse(victim)
567
564
 
568
565
  room = getattr(victim, "room", None)
569
- _nuke_pets(victim, room)
570
566
  if room is not None:
571
567
  room.remove_character(victim)
572
568
 
@@ -499,6 +499,20 @@ def apply_damage(
499
499
  if victim.position == Position.DEAD:
500
500
  return "Already dead."
501
501
 
502
+ # Set up fighting state BEFORE defense checks (ROM parity: src/fight.c:damage sets fighting before parry/dodge)
503
+ if victim != attacker:
504
+ if victim.position > Position.STUNNED:
505
+ if victim.fighting is None:
506
+ set_fighting(victim, attacker)
507
+ if getattr(victim, "is_npc", False):
508
+ mobprog.mp_kill_trigger(victim, attacker)
509
+ if getattr(victim, "timer", 0) <= 4:
510
+ victim.position = Position.FIGHTING
511
+
512
+ if victim.position > Position.STUNNED:
513
+ if attacker.fighting is None:
514
+ set_fighting(attacker, victim)
515
+
502
516
  # Check for parry, dodge, and shield block following C src/fight.c:damage() order
503
517
  # These are checked AFTER hit determination but BEFORE damage application
504
518
  # Order is critical: shield_block → parry → dodge (per ROM C src/fight.c:one_hit)
@@ -533,23 +547,6 @@ def apply_damage(
533
547
  message_bundle = dam_message(attacker, victim, damage, dt, immune)
534
548
  _dispatch_damage_messages(attacker, victim, message_bundle)
535
549
 
536
- # Set up fighting state if not already fighting
537
- if victim != attacker:
538
- # Victim starts fighting back if able
539
- if victim.position > Position.STUNNED:
540
- if victim.fighting is None:
541
- set_fighting(victim, attacker)
542
- if getattr(victim, "is_npc", False):
543
- mobprog.mp_kill_trigger(victim, attacker)
544
- # Update victim to fighting position if timer allows
545
- if getattr(victim, "timer", 0) <= 4:
546
- victim.position = Position.FIGHTING
547
-
548
- # Attacker starts fighting if not already
549
- if victim.position > Position.STUNNED:
550
- if attacker.fighting is None:
551
- set_fighting(attacker, victim)
552
-
553
550
  if damage <= 0:
554
551
  if message_bundle and message_bundle.attacker:
555
552
  return message_bundle.attacker
@@ -752,30 +749,53 @@ def _object_has_wear_flag(obj, flag: WearFlag) -> bool:
752
749
 
753
750
 
754
751
  def _transfer_corpse_coins(attacker: Character, corpse) -> bool:
755
- """Move coins from *corpse* to *attacker*, returning True when any moved."""
752
+ """Extract gold/silver from money objects and add to attacker's purse.
756
753
 
757
- try:
758
- gold = int(getattr(corpse, "gold", 0) or 0)
759
- except (TypeError, ValueError):
760
- gold = 0
761
- try:
762
- silver = int(getattr(corpse, "silver", 0) or 0)
763
- except (TypeError, ValueError):
764
- silver = 0
754
+ ROM Reference: src/fight.c auto_loot handles money extraction.
755
+ QuickMUD uses actual money objects (ItemType.MONEY) instead of corpse attributes.
756
+ Money objects may already be in attacker's inventory if AUTOLOOT moved them.
757
+ """
758
+ from mud.models.constants import ItemType
759
+
760
+ contained = list(getattr(corpse, "contained_items", []) or [])
761
+ attacker_inv = list(getattr(attacker, "inventory", []) or [])
765
762
 
766
- if gold == 0 and silver == 0:
763
+ money_in_corpse = [obj for obj in contained if getattr(obj, "item_type", None) == int(ItemType.MONEY)]
764
+ money_in_inventory = [obj for obj in attacker_inv if getattr(obj, "item_type", None) == int(ItemType.MONEY)]
765
+
766
+ all_money_objects = money_in_corpse + money_in_inventory
767
+
768
+ if not all_money_objects:
767
769
  return False
768
770
 
769
- attacker.gold = int(getattr(attacker, "gold", 0) or 0) + gold
770
- attacker.silver = int(getattr(attacker, "silver", 0) or 0) + silver
771
- corpse.gold = 0
772
- corpse.silver = 0
773
- values = list(getattr(corpse, "value", []) or [])
774
- if len(values) < 2:
775
- values.extend([0] * (2 - len(values)))
776
- values[0] = 0
777
- values[1] = 0
778
- corpse.value = values
771
+ total_gold = 0
772
+ total_silver = 0
773
+
774
+ for money_obj in all_money_objects:
775
+ values = list(getattr(money_obj, "value", [0, 0]) or [0, 0])
776
+ while len(values) < 2:
777
+ values.append(0)
778
+
779
+ silver = int(values[0] or 0)
780
+ gold = int(values[1] or 0)
781
+
782
+ total_silver += silver
783
+ total_gold += gold
784
+
785
+ if money_obj in money_in_corpse:
786
+ try:
787
+ corpse.contained_items.remove(money_obj)
788
+ except (AttributeError, ValueError):
789
+ pass
790
+ else:
791
+ try:
792
+ attacker.remove_object(money_obj)
793
+ except (AttributeError, ValueError):
794
+ pass
795
+
796
+ attacker.gold = int(getattr(attacker, "gold", 0) or 0) + total_gold
797
+ attacker.silver = int(getattr(attacker, "silver", 0) or 0) + total_silver
798
+
779
799
  return True
780
800
 
781
801
 
@@ -34,6 +34,8 @@ def cmd_who(char: Character, args: str) -> str:
34
34
 
35
35
 
36
36
  def cmd_teleport(char: Character, args: str) -> str:
37
+ if char.level < 52:
38
+ return "You don't have permission to use this command."
37
39
  if not args.isdigit() or int(args) not in room_registry:
38
40
  return "Invalid room."
39
41
  target = room_registry[int(args)]
@@ -188,9 +188,17 @@ def do_practice(char: Character, args: str) -> str:
188
188
  new_value = min(adept, current + increment)
189
189
  char.skills[skill_key] = new_value
190
190
 
191
+ # ROM C parity: Send messages to both char and room (src/act_info.c:2767-2777)
191
192
  if new_value >= adept:
192
- return f"You are now learned at {skill.name}."
193
- return f"You practice {skill.name}."
193
+ char.messages.append(f"You are now learned at {skill.name}.")
194
+ if char.room:
195
+ char.room.broadcast(f"{char.name} is now learned at {skill.name}.", exclude=char)
196
+ else:
197
+ char.messages.append(f"You practice {skill.name}.")
198
+ if char.room:
199
+ char.room.broadcast(f"{char.name} practices {skill.name}.", exclude=char)
200
+
201
+ return ""
194
202
 
195
203
 
196
204
  def do_train(char: Character, args: str) -> str:
@@ -0,0 +1,149 @@
1
+ """
2
+ Affects command - show active spell/affect effects on character.
3
+
4
+ ROM Reference: src/act_info.c do_affects (lines 2300-2400)
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ from mud.models.character import Character
10
+ from mud.models.constants import AffectFlag
11
+
12
+
13
+ # Mapping of affect flags to human-readable names
14
+ _AFFECT_NAMES = {
15
+ AffectFlag.BLIND: "blindness",
16
+ AffectFlag.INVISIBLE: "invisibility",
17
+ AffectFlag.DETECT_EVIL: "detect evil",
18
+ AffectFlag.DETECT_INVIS: "detect invisibility",
19
+ AffectFlag.DETECT_MAGIC: "detect magic",
20
+ AffectFlag.DETECT_HIDDEN: "detect hidden",
21
+ AffectFlag.DETECT_GOOD: "detect good",
22
+ AffectFlag.SANCTUARY: "sanctuary",
23
+ AffectFlag.FAERIE_FIRE: "faerie fire",
24
+ AffectFlag.INFRARED: "infrared vision",
25
+ AffectFlag.CURSE: "curse",
26
+ AffectFlag.POISON: "poison",
27
+ AffectFlag.PROTECT_EVIL: "protection evil",
28
+ AffectFlag.PROTECT_GOOD: "protection good",
29
+ AffectFlag.SNEAK: "sneak",
30
+ AffectFlag.HIDE: "hide",
31
+ AffectFlag.SLEEP: "sleep",
32
+ AffectFlag.CHARM: "charm",
33
+ AffectFlag.FLYING: "fly",
34
+ AffectFlag.PASS_DOOR: "pass door",
35
+ AffectFlag.HASTE: "haste",
36
+ AffectFlag.CALM: "calm",
37
+ AffectFlag.PLAGUE: "plague",
38
+ AffectFlag.WEAKEN: "weaken",
39
+ AffectFlag.DARK_VISION: "dark vision",
40
+ AffectFlag.BERSERK: "berserk",
41
+ AffectFlag.SWIM: "swim",
42
+ AffectFlag.REGENERATION: "regeneration",
43
+ AffectFlag.SLOW: "slow",
44
+ }
45
+
46
+
47
+ def affect_loc_name(location: int) -> str:
48
+ """
49
+ Return ASCII name of an affect location.
50
+
51
+ ROM Reference: src/handler.c affect_loc_name (lines 2718-2775)
52
+
53
+ Args:
54
+ location: APPLY_* constant (0-25)
55
+
56
+ Returns:
57
+ Human-readable location name (e.g., "strength", "armor class", "hit roll")
58
+ """
59
+ # ROM C APPLY_* constants (src/merc.h lines 1205-1231)
60
+ APPLY_NAMES = {
61
+ 0: "none", # APPLY_NONE
62
+ 1: "strength", # APPLY_STR
63
+ 2: "dexterity", # APPLY_DEX
64
+ 3: "intelligence", # APPLY_INT
65
+ 4: "wisdom", # APPLY_WIS
66
+ 5: "constitution", # APPLY_CON
67
+ 6: "sex", # APPLY_SEX
68
+ 7: "class", # APPLY_CLASS
69
+ 8: "level", # APPLY_LEVEL
70
+ 9: "age", # APPLY_AGE
71
+ 10: "height", # APPLY_HEIGHT (not shown in ROM affect_loc_name)
72
+ 11: "weight", # APPLY_WEIGHT (not shown in ROM affect_loc_name)
73
+ 12: "mana", # APPLY_MANA
74
+ 13: "hp", # APPLY_HIT
75
+ 14: "moves", # APPLY_MOVE
76
+ 15: "gold", # APPLY_GOLD
77
+ 16: "experience", # APPLY_EXP
78
+ 17: "armor class", # APPLY_AC
79
+ 18: "hit roll", # APPLY_HITROLL
80
+ 19: "damage roll", # APPLY_DAMROLL
81
+ 20: "saves", # APPLY_SAVES / APPLY_SAVING_PARA
82
+ 21: "save vs rod", # APPLY_SAVING_ROD
83
+ 22: "save vs petrification", # APPLY_SAVING_PETRI
84
+ 23: "save vs breath", # APPLY_SAVING_BREATH
85
+ 24: "save vs spell", # APPLY_SAVING_SPELL
86
+ 25: "none", # APPLY_SPELL_AFFECT (returns "none" in ROM C)
87
+ }
88
+
89
+ return APPLY_NAMES.get(location, "(unknown)")
90
+
91
+
92
+ def do_affects(char: Character, args: str) -> str:
93
+ """
94
+ Display active affects on the character.
95
+
96
+ ROM Reference: src/act_info.c do_affects (lines 1714-1755)
97
+
98
+ Usage: affects
99
+
100
+ Behavior:
101
+ - Level <20: Shows simple format (spell name only)
102
+ - Level 20+: Shows detailed format (modifier, location, duration)
103
+ - Stacked affects (same spell, multiple modifiers): Indented continuation lines
104
+ """
105
+ # Primary ROM C behavior: iterate ch.affected list (AFFECT_DATA structures)
106
+ affected = getattr(char, "affected", [])
107
+
108
+ if not affected:
109
+ return "You are not affected by any spells."
110
+
111
+ lines = ["You are affected by the following spells:"]
112
+ paf_last = None
113
+
114
+ for paf in affected:
115
+ # Deduplication: check if same spell as previous affect
116
+ if paf_last and paf.type == paf_last.type:
117
+ if char.level >= 20:
118
+ # Level 20+: Show duplicate affects with indentation (22 spaces + ": ")
119
+ buf = " " * 22 + ": "
120
+ else:
121
+ # Level <20: Skip duplicate spells entirely
122
+ continue
123
+ else:
124
+ # New spell: show spell name (left-aligned, 15 chars)
125
+ # TODO: Replace with proper skill_table[paf.type].name lookup when SN mapping is available
126
+ # For now, assume paf.type is already a skill name string (temporary until spell system updated)
127
+ spell_name = str(paf.type) if paf.type else "(unknown)"
128
+
129
+ buf = f"Spell: {spell_name:15s}"
130
+
131
+ # Level 20+: Show detailed modifier information
132
+ if char.level >= 20:
133
+ location_name = affect_loc_name(paf.location)
134
+
135
+ # ROM C line 1737: uses raw %d (no explicit + sign)
136
+ modifier_str = str(paf.modifier)
137
+
138
+ if paf.duration == -1:
139
+ duration_str = "permanently"
140
+ else:
141
+ duration_str = f"for {paf.duration} hours"
142
+
143
+ # ROM C line 1736: ": modifies..." (colon prefix)
144
+ buf += f": modifies {location_name} by {modifier_str} {duration_str}"
145
+
146
+ lines.append(buf)
147
+ paf_last = paf
148
+
149
+ return "\n".join(lines)