smrpgpatchbuilder 7.1.3__tar.gz → 7.1.5__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 (253) hide show
  1. {smrpgpatchbuilder-7.1.3/src/smrpgpatchbuilder.egg-info → smrpgpatchbuilder-7.1.5}/PKG-INFO +1 -1
  2. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/pyproject.toml +1 -1
  3. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/dialogs/formatter.py +50 -0
  4. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5/src/smrpgpatchbuilder.egg-info}/PKG-INFO +1 -1
  5. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/tests/dialogs/test_formatter.py +72 -0
  6. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/LICENSE +0 -0
  7. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/MANIFEST.in +0 -0
  8. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/README.md +0 -0
  9. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/setup.cfg +0 -0
  10. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/__init__.py +0 -0
  11. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/__init__.py +0 -0
  12. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/allies/__init__.py +0 -0
  13. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/allies/ally.py +0 -0
  14. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/allies/ally_collection.py +0 -0
  15. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/battle_animation_scripts/__init__.py +0 -0
  16. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/battle_animation_scripts/arguments/__init__.py +0 -0
  17. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/battle_animation_scripts/arguments/battle_targets.py +0 -0
  18. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/battle_animation_scripts/arguments/bonus_messages.py +0 -0
  19. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/battle_animation_scripts/arguments/flash_colours.py +0 -0
  20. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/battle_animation_scripts/arguments/layer_priority_type.py +0 -0
  21. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/battle_animation_scripts/arguments/mask_effects.py +0 -0
  22. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/battle_animation_scripts/arguments/message_type.py +0 -0
  23. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/battle_animation_scripts/arguments/origins.py +0 -0
  24. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/battle_animation_scripts/arguments/pause_until.py +0 -0
  25. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/battle_animation_scripts/arguments/shift_type.py +0 -0
  26. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/battle_animation_scripts/arguments/types/__init__.py +0 -0
  27. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/battle_animation_scripts/arguments/types/classes.py +0 -0
  28. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/battle_animation_scripts/arguments/wave_effect.py +0 -0
  29. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/battle_animation_scripts/commands/__init__.py +0 -0
  30. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/battle_animation_scripts/commands/commands.py +0 -0
  31. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/battle_animation_scripts/commands/types/__init__.py +0 -0
  32. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/battle_animation_scripts/commands/types/classes.py +0 -0
  33. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/battle_animation_scripts/ids/__init__.py +0 -0
  34. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/battle_animation_scripts/ids/monster_entrances.py +0 -0
  35. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/battle_animation_scripts/types.py +0 -0
  36. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/battles/__init__.py +0 -0
  37. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/battles/battle_dialog_collection.py +0 -0
  38. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/battles/enums.py +0 -0
  39. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/battles/formations_packs/types/__init__.py +0 -0
  40. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/battles/formations_packs/types/classes.py +0 -0
  41. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/battles/ids/__init__.py +0 -0
  42. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/battles/ids/misc.py +0 -0
  43. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/battles/music.py +0 -0
  44. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/battles/types/__init__.py +0 -0
  45. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/battles/types/classes.py +0 -0
  46. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/characters/__init__.py +0 -0
  47. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/characters/classes.py +0 -0
  48. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/characters/constants.py +0 -0
  49. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/characters/enums.py +0 -0
  50. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/dialogs/__init__.py +0 -0
  51. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/dialogs/classes.py +0 -0
  52. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/dialogs/ids/__init__.py +0 -0
  53. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/dialogs/ids/dialog_bank_ids.py +0 -0
  54. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/dialogs/ids/misc.py +0 -0
  55. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/dialogs/ids/types/__init__.py +0 -0
  56. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/dialogs/ids/types/classes.py +0 -0
  57. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/dialogs/utils.py +0 -0
  58. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/enemies/__init__.py +0 -0
  59. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/enemies/classes.py +0 -0
  60. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/enemies/constants.py +0 -0
  61. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/enemies/enums.py +0 -0
  62. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/enemy_attacks/__init__.py +0 -0
  63. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/enemy_attacks/classes.py +0 -0
  64. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/enemy_attacks/constants.py +0 -0
  65. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/graphics/__init__.py +0 -0
  66. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/graphics/classes.py +0 -0
  67. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/items/__init__.py +0 -0
  68. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/items/classes.py +0 -0
  69. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/items/constants.py +0 -0
  70. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/items/encoding.py +0 -0
  71. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/items/enums.py +0 -0
  72. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/levels/classes.py +0 -0
  73. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/levels/room_collection.py +0 -0
  74. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/minecart/__init__.py +0 -0
  75. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/minecart/_vanilla_block.py +0 -0
  76. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/minecart/classes.py +0 -0
  77. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/minecart/constants.py +0 -0
  78. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/minecart/lz3.py +0 -0
  79. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/monster_scripts/__init__.py +0 -0
  80. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/monster_scripts/arguments/__init__.py +0 -0
  81. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/monster_scripts/arguments/command_types.py +0 -0
  82. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/monster_scripts/arguments/targets.py +0 -0
  83. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/monster_scripts/arguments/types/__init__.py +0 -0
  84. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/monster_scripts/arguments/types/classes.py +0 -0
  85. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/monster_scripts/commands/__init__.py +0 -0
  86. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/monster_scripts/commands/commands.py +0 -0
  87. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/monster_scripts/commands/types/__init__.py +0 -0
  88. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/monster_scripts/commands/types/classes.py +0 -0
  89. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/monster_scripts/ids/__init__.py +0 -0
  90. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/monster_scripts/ids/misc.py +0 -0
  91. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/monster_scripts/types.py +0 -0
  92. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/numbers/__init__.py +0 -0
  93. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/numbers/classes.py +0 -0
  94. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/overworld_scripts/__init__.py +0 -0
  95. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/overworld_scripts/action_scripts/__init__.py +0 -0
  96. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/overworld_scripts/action_scripts/arguments/__init__.py +0 -0
  97. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/overworld_scripts/action_scripts/arguments/sequence_speeds.py +0 -0
  98. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/overworld_scripts/action_scripts/arguments/types/__init__.py +0 -0
  99. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/overworld_scripts/action_scripts/arguments/types/classes.py +0 -0
  100. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/overworld_scripts/action_scripts/arguments/vram_priority.py +0 -0
  101. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/overworld_scripts/action_scripts/classes.py +0 -0
  102. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/overworld_scripts/action_scripts/commands/__init__.py +0 -0
  103. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/overworld_scripts/action_scripts/commands/commands.py +0 -0
  104. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/overworld_scripts/action_scripts/commands/types/__init__.py +0 -0
  105. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/overworld_scripts/action_scripts/commands/types/classes.py +0 -0
  106. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/overworld_scripts/action_scripts/ids/__init__.py +0 -0
  107. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/overworld_scripts/action_scripts/ids/misc.py +0 -0
  108. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/overworld_scripts/arguments/__init__.py +0 -0
  109. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/overworld_scripts/arguments/area_objects.py +0 -0
  110. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/overworld_scripts/arguments/colours.py +0 -0
  111. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/overworld_scripts/arguments/controller_inputs.py +0 -0
  112. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/overworld_scripts/arguments/coords.py +0 -0
  113. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/overworld_scripts/arguments/directions.py +0 -0
  114. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/overworld_scripts/arguments/intro_title_text.py +0 -0
  115. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/overworld_scripts/arguments/layers.py +0 -0
  116. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/overworld_scripts/arguments/palette_rows.py +0 -0
  117. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/overworld_scripts/arguments/palette_types.py +0 -0
  118. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/overworld_scripts/arguments/scenes.py +0 -0
  119. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/overworld_scripts/arguments/tutorials.py +0 -0
  120. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/overworld_scripts/arguments/types/__init__.py +0 -0
  121. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/overworld_scripts/arguments/types/area_object.py +0 -0
  122. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/overworld_scripts/arguments/types/battlefield.py +0 -0
  123. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/overworld_scripts/arguments/types/byte_var.py +0 -0
  124. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/overworld_scripts/arguments/types/colour.py +0 -0
  125. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/overworld_scripts/arguments/types/controller_input.py +0 -0
  126. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/overworld_scripts/arguments/types/coord.py +0 -0
  127. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/overworld_scripts/arguments/types/direction.py +0 -0
  128. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/overworld_scripts/arguments/types/flag.py +0 -0
  129. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/overworld_scripts/arguments/types/intro_title_text.py +0 -0
  130. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/overworld_scripts/arguments/types/layer.py +0 -0
  131. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/overworld_scripts/arguments/types/packet.py +0 -0
  132. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/overworld_scripts/arguments/types/palette_row.py +0 -0
  133. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/overworld_scripts/arguments/types/palette_type.py +0 -0
  134. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/overworld_scripts/arguments/types/party_character.py +0 -0
  135. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/overworld_scripts/arguments/types/scene.py +0 -0
  136. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/overworld_scripts/arguments/types/short_var.py +0 -0
  137. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/overworld_scripts/arguments/types/tutorial.py +0 -0
  138. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/overworld_scripts/event_scripts/__init__.py +0 -0
  139. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/overworld_scripts/event_scripts/classes.py +0 -0
  140. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/overworld_scripts/event_scripts/commands/__init__.py +0 -0
  141. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/overworld_scripts/event_scripts/commands/commands.py +0 -0
  142. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/overworld_scripts/event_scripts/commands/types/__init__.py +0 -0
  143. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/overworld_scripts/event_scripts/commands/types/classes.py +0 -0
  144. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/overworld_scripts/event_scripts/ids/__init__.py +0 -0
  145. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/overworld_scripts/event_scripts/ids/misc.py +0 -0
  146. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/overworld_scripts/ids/__init__.py +0 -0
  147. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/overworld_scripts/ids/misc.py +0 -0
  148. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/scripts_common/__init__.py +0 -0
  149. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/scripts_common/classes.py +0 -0
  150. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/shops/__init__.py +0 -0
  151. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/shops/classes.py +0 -0
  152. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/spells/__init__.py +0 -0
  153. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/spells/arguments/__init__.py +0 -0
  154. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/spells/arguments/damage_modifiers.py +0 -0
  155. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/spells/arguments/timing_properties.py +0 -0
  156. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/spells/arguments/types/__init__.py +0 -0
  157. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/spells/arguments/types/classes.py +0 -0
  158. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/spells/classes.py +0 -0
  159. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/spells/enums.py +0 -0
  160. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/spells/ids/__init__.py +0 -0
  161. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/spells/ids/misc.py +0 -0
  162. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/sprites/__init__.py +0 -0
  163. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/sprites/ally_palettes.py +0 -0
  164. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/sprites/collection.py +0 -0
  165. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/sprites/disassembler.py +0 -0
  166. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/sprites/exceptions.py +0 -0
  167. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/sprites/ids/__init__.py +0 -0
  168. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/sprites/ids/event_palettes.py +0 -0
  169. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/sprites/ids/misc.py +0 -0
  170. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/sprites/ids/sprite_palettes.py +0 -0
  171. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/sprites/palette.py +0 -0
  172. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/sprites/sprite.py +0 -0
  173. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/world_map_locations/__init__.py +0 -0
  174. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/datatypes/world_map_locations/classes.py +0 -0
  175. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/manage.py +0 -0
  176. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/allyassembler.py +0 -0
  177. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/allydisassembler.py +0 -0
  178. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/animationassembler.py +0 -0
  179. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/animationdisassembler.py +0 -0
  180. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/battleassembler.py +0 -0
  181. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/battledialogassembler.py +0 -0
  182. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/battledialogdisassembler.py +0 -0
  183. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/battledisassembler.py +0 -0
  184. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/bowser_tile_rearranger.py +0 -0
  185. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/comboassembler.py +0 -0
  186. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/combodisassembler.py +0 -0
  187. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/dialogassembler.py +0 -0
  188. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/dialogdisassembler.py +0 -0
  189. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/enemyassembler.py +0 -0
  190. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/enemyattackassembler.py +0 -0
  191. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/enemyattackdisassembler.py +0 -0
  192. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/enemydisassembler.py +0 -0
  193. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/eventassembler.py +0 -0
  194. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/eventconverter.py +0 -0
  195. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/eventidentifieraudit.py +0 -0
  196. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/eventpalettedisassembler.py +0 -0
  197. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/generatesample.py +0 -0
  198. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/graphicsassembler.py +0 -0
  199. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/graphicsdisassembler.py +0 -0
  200. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/input_file_parser.py +0 -0
  201. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/itemassembler.py +0 -0
  202. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/itemdisassembler.py +0 -0
  203. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/legacy/__init__.py +0 -0
  204. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/legacy/docstrings.py +0 -0
  205. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/legacy/eventdisassembler.py +0 -0
  206. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/legacy/eventtables.py +0 -0
  207. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/legacy/objectsequenceassembler.py +0 -0
  208. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/legacy/objectsequencedisassembler.py +0 -0
  209. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/legacy/objectsequencetables.py +0 -0
  210. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/make_seed.py +0 -0
  211. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/move_spell_gfx.py +0 -0
  212. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/npcmodelassembler.py +0 -0
  213. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/npcmodeldisassembler.py +0 -0
  214. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/objectassembler.py +0 -0
  215. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/objectdisassembler.py +0 -0
  216. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/packassembler.py +0 -0
  217. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/packdisassembler.py +0 -0
  218. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/packetassembler.py +0 -0
  219. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/packetdisassembler.py +0 -0
  220. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/palettebytes.py +0 -0
  221. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/partitionanalyzer.py +0 -0
  222. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/roomassembler.py +0 -0
  223. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/roomconverter.py +0 -0
  224. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/roomdisassembler.py +0 -0
  225. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/shopassembler.py +0 -0
  226. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/shopdisassembler.py +0 -0
  227. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/space_reassigner.py +0 -0
  228. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/spellassembler.py +0 -0
  229. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/spelldisassembler.py +0 -0
  230. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/spritepalettedisassembler.py +0 -0
  231. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/unused_gfx_finder.py +0 -0
  232. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/unused_gfx_remover old.py +0 -0
  233. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/unused_gfx_remover.py +0 -0
  234. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/variableparser.py +0 -0
  235. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/worldmaplocationassembler.py +0 -0
  236. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/commands/worldmaplocationdisassembler.py +0 -0
  237. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/management/django/settings.py +0 -0
  238. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/utils/disassembler_common.py +0 -0
  239. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/utils/npcs.py +0 -0
  240. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/utils/number.py +0 -0
  241. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder/utils/strings.py +0 -0
  242. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder.egg-info/SOURCES.txt +0 -0
  243. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder.egg-info/dependency_links.txt +0 -0
  244. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder.egg-info/requires.txt +0 -0
  245. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/smrpgpatchbuilder.egg-info/top_level.txt +0 -0
  246. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/tests/animations/test_animationscripts.py +0 -0
  247. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/tests/dialogs/__init__.py +0 -0
  248. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/tests/levels/__init__.py +0 -0
  249. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/tests/levels/test_room_collection.py +0 -0
  250. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/tests/minecart/test_minecart.py +0 -0
  251. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/tests/monsters/test_ai.py +0 -0
  252. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/tests/overworld/test_actionscripts.py +0 -0
  253. {smrpgpatchbuilder-7.1.3 → smrpgpatchbuilder-7.1.5}/src/tests/overworld/test_eventscripts.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: smrpgpatchbuilder
3
- Version: 7.1.3
3
+ Version: 7.1.5
4
4
  Summary: Patchable base class support for some SMRPG concepts similar to their definitions in Lazy Shell
5
5
  Author-email: pidgezero_one <s.kischak@gmail.com>
6
6
  License-Expression: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "smrpgpatchbuilder"
7
- version = "7.1.3"
7
+ version = "7.1.5"
8
8
  authors = [
9
9
  { name="pidgezero_one", email="s.kischak@gmail.com" },
10
10
  ]
@@ -110,6 +110,42 @@ def _build_control_token_list() -> list[str]:
110
110
  _CONTROL_TOKENS = _build_control_token_list()
111
111
 
112
112
 
113
+ def _byte_glyph_width(byte: int, widths: tuple[int, ...] = VANILLA_DIALOG_FONT_WIDTHS) -> int:
114
+ """Rendered width (raw + 1px spacing) of a single compressed dialog byte.
115
+
116
+ The game renders the *compressed* byte stream, so a character's on-screen
117
+ width is that of its glyph byte -- e.g. ':' is stored as 0x8E and drawn with
118
+ glyph 0x8E's width, not ASCII 0x3A's. Bytes below 0x20 are control codes and
119
+ have no width (mirrors Lazy Shell's ``l >= 0x20 && l <= 0x9F`` guard).
120
+ """
121
+ if 0x20 <= byte <= 0x20 + len(widths) - 1:
122
+ return widths[byte - 0x20] + 1
123
+ return 0
124
+
125
+
126
+ def _build_glyph_tokens() -> list[tuple[str, int]]:
127
+ """Compression-table substrings that render as one drawable glyph, paired
128
+ with that glyph's byte value.
129
+
130
+ These are the source-string spellings (curly quotes, ``♥``, ``♪``, bullets,
131
+ and remapped punctuation like ``:`` ``~`` ``×``) whose glyph byte differs
132
+ from their unicode codepoint. Sorted longest-first so greedy matching picks
133
+ e.g. the single ``••`` glyph (0x2B) over two ``•`` (0x2A). Control/variable
134
+ entries (byte < 0x20, or multi-byte like ``[0x7000]``) are excluded -- those
135
+ are handled as control/variable tokens elsewhere. Width is computed at
136
+ tokenize time so a caller-supplied ``widths`` table is honored.
137
+ """
138
+ glyphs = []
139
+ for key, val in COMPRESSION_TABLE:
140
+ if len(val) == 1 and 0x20 <= val[0] <= 0x9F:
141
+ glyphs.append((key, val[0]))
142
+ glyphs.sort(key=lambda kv: -len(kv[0]))
143
+ return glyphs
144
+
145
+
146
+ _GLYPH_TOKENS = _build_glyph_tokens()
147
+
148
+
113
149
  def _tokenize(text: str, widths: tuple[int, ...] = VANILLA_DIALOG_FONT_WIDTHS) -> list[Token]:
114
150
  """Parse a dialog string into a sequence of tokens."""
115
151
  tokens = []
@@ -165,6 +201,20 @@ def _tokenize(text: str, widths: tuple[int, ...] = VANILLA_DIALOG_FONT_WIDTHS) -
165
201
  if matched:
166
202
  continue
167
203
 
204
+ # 2c. Match a compression-table glyph substring (curly quotes, ♥, ♪,
205
+ # bullets, remapped punctuation like ':' -> 0x8E). These render as one
206
+ # glyph whose width comes from the *byte*, not the unicode codepoint,
207
+ # so measuring ord(char) would give the wrong width (often 0).
208
+ glyph_matched = False
209
+ for sub, byte in _GLYPH_TOKENS:
210
+ if text[cursor:cursor + len(sub)] == sub:
211
+ tokens.append(Token(text=sub, width_px=_byte_glyph_width(byte, widths)))
212
+ cursor += len(sub)
213
+ glyph_matched = True
214
+ break
215
+ if glyph_matched:
216
+ continue
217
+
168
218
  # 3. Literal character
169
219
  ch = text[cursor]
170
220
  if ch == " ":
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: smrpgpatchbuilder
3
- Version: 7.1.3
3
+ Version: 7.1.5
4
4
  Summary: Patchable base class support for some SMRPG concepts similar to their definitions in Lazy Shell
5
5
  Author-email: pidgezero_one <s.kischak@gmail.com>
6
6
  License-Expression: MIT
@@ -271,3 +271,75 @@ class TestCalculateTextWidth:
271
271
  def test_variable_token(self):
272
272
  # [0x7000] should be 16px
273
273
  assert calculate_text_width("[0x7000]") == 16
274
+
275
+
276
+ class TestSpecialCharWidths:
277
+ """Width must come from the *compressed glyph byte*, not the unicode
278
+ codepoint. The game renders the compressed byte stream, so e.g. ':' is
279
+ drawn with glyph 0x8E, and a heart with glyph 0x24 -- see COMPRESSION_TABLE.
280
+ Before the fix these all measured 0px (out-of-range unicode) or the wrong
281
+ ascii slot."""
282
+
283
+ def test_curly_quotes(self):
284
+ # left/right double quotes -> bytes 0x22 / 0x23 (raw 6 -> 7)
285
+ assert calculate_text_width("“") == 7
286
+ assert calculate_text_width("”") == 7
287
+
288
+ def test_curly_apostrophes(self):
289
+ # left/right single quotes -> bytes 0x26 / 0x27 (raw 4 -> 5)
290
+ assert calculate_text_width("‘") == 5
291
+ assert calculate_text_width("’") == 5
292
+
293
+ def test_heart_and_note(self):
294
+ # heart -> 0x24 (raw 8 -> 9), eighth note -> 0x25 (raw 8 -> 9)
295
+ assert calculate_text_width("♥") == 9
296
+ assert calculate_text_width("♪") == 9
297
+
298
+ def test_bullets_greedy(self):
299
+ # single bullet -> 0x2A (raw 6 -> 7); double bullet -> 0x2B (raw 8 -> 9)
300
+ # Greedy longest-match must pick the single 0x2B glyph, not two 0x2A.
301
+ assert calculate_text_width("•") == 7
302
+ assert calculate_text_width("••") == 9
303
+
304
+ def test_remapped_punctuation(self):
305
+ # ':' stored as 0x8E (raw 7 -> 8), NOT ascii 0x3A (raw 8 -> 9)
306
+ assert calculate_text_width(":") == 8
307
+ assert calculate_text_width(";") == 8 # 0x8F raw 7 -> 8
308
+ assert calculate_text_width("<") == 9 # 0x90 raw 8 -> 9
309
+ assert calculate_text_width(">") == 9 # 0x91 raw 8 -> 9
310
+ assert calculate_text_width("#") == 10 # 0x93 raw 9 -> 10
311
+ assert calculate_text_width("&") == 9 # 0x9C raw 8 -> 9
312
+
313
+ def test_tilde(self):
314
+ # '~' stored as 0x3A (raw 8 -> 9), NOT ascii 0x7E
315
+ assert calculate_text_width("~") == 9
316
+
317
+ def test_multiplication_sign(self):
318
+ # multiplication sign -> 0x95 (raw 9 -> 10); unicode is out-of-range (was 0)
319
+ assert calculate_text_width("×") == 10
320
+
321
+ def test_middle_dots_greedy(self):
322
+ # three middle dots -> single glyph 0x92 (raw 9 -> 10)
323
+ assert calculate_text_width("···") == 10
324
+
325
+ def test_tokenizes_special_into_word(self):
326
+ # A special glyph is part of its surrounding word (not a break), so the
327
+ # whole word's width is counted for wrap decisions.
328
+ tokens = _tokenize("a♥b")
329
+ assert [t.text for t in tokens] == ["a", "♥", "b"]
330
+ assert tokens[1].width_px == 9
331
+
332
+
333
+ class TestSpecialCharWrapping:
334
+ """Regression: special chars measured as 0px let lines overflow, so the
335
+ game wrapped a word on its own right before the formatter's \\n."""
336
+
337
+ def test_line_with_specials_does_not_overflow(self):
338
+ # start_x = 17, wrap boundary = 240 -> a completed line's content width
339
+ # must stay below 240 - 17 = 223px.
340
+ raw = ("The “Super” Star ♥ gives you power ♪ "
341
+ "for a while okay friend")
342
+ formatted = format_dialog(raw)
343
+ for line in formatted.split("\n"):
344
+ assert calculate_text_width(line) < 223, (
345
+ repr(line), calculate_text_width(line))