AoE2ScenarioParser 0.3.0.dev0__tar.gz → 0.3.0.dev2__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 (211) hide show
  1. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/panel_location.py +2 -2
  2. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/managers/de/map_manager_de.py +16 -8
  3. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/managers/de/xs_manager_de.py +47 -26
  4. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/support/xs_check.py +64 -6
  5. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/scenarios/aoe2_de_scenario.py +9 -0
  6. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/scenarios/aoe2_scenario.py +48 -30
  7. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/version.py +1 -1
  8. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser.egg-info/PKG-INFO +1 -1
  9. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/PKG-INFO +1 -1
  10. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/pyproject.toml +1 -1
  11. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/__init__.py +0 -0
  12. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/__init__.py +0 -0
  13. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/buildings.py +0 -0
  14. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/conditions.py +0 -0
  15. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/dataset_enum.py +0 -0
  16. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/effects.py +0 -0
  17. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/heroes.py +0 -0
  18. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/object_support.py +0 -0
  19. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/other.py +0 -0
  20. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/players.py +0 -0
  21. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/projectiles.py +0 -0
  22. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/scenario_variant.py +0 -0
  23. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/sources/resource_editor_names.json +0 -0
  24. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/sources/unit_projectile_info.json +0 -0
  25. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/support/__init__.py +0 -0
  26. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/support/dataset_gen/common.py +0 -0
  27. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/support/dataset_gen/gen_attr_dataset.py +0 -0
  28. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/support/dataset_gen/gen_res_datset.py +0 -0
  29. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/support/info_dataset_base.py +0 -0
  30. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/techs.py +0 -0
  31. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/terrains.py +0 -0
  32. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/__init__.py +0 -0
  33. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/action_type.py +0 -0
  34. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/age.py +0 -0
  35. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/attack_stance.py +0 -0
  36. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/attribute.py +0 -0
  37. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/blast_level.py +0 -0
  38. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/blockage_class.py +0 -0
  39. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/button_location.py +0 -0
  40. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/charge_event.py +0 -0
  41. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/charge_type.py +0 -0
  42. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/color_mood.py +0 -0
  43. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/combat_ability.py +0 -0
  44. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/comparison.py +0 -0
  45. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/damage_class.py +0 -0
  46. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/difficulty_level.py +0 -0
  47. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/diplomacy_state.py +0 -0
  48. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/fog_visibility.py +0 -0
  49. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/garrison_type.py +0 -0
  50. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/hero_status_flag.py +0 -0
  51. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/hotkey.py +0 -0
  52. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/object_attribute.py +0 -0
  53. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/object_class.py +0 -0
  54. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/object_state.py +0 -0
  55. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/object_type.py +0 -0
  56. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/obstruction_type.py +0 -0
  57. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/occlusion_mode.py +0 -0
  58. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/operation.py +0 -0
  59. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/projectile_hit_mode.py +0 -0
  60. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/projectile_smart_mode.py +0 -0
  61. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/projectile_vanish_mode.py +0 -0
  62. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/secondary_game_mode.py +0 -0
  63. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/selection_effect.py +0 -0
  64. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/technology_state.py +0 -0
  65. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/terrain_restrictions.py +0 -0
  66. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/time_unit.py +0 -0
  67. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/unit_ai_action.py +0 -0
  68. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/unit_trait.py +0 -0
  69. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/victory_condition.py +0 -0
  70. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/victory_timer_type.py +0 -0
  71. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/visibility_state.py +0 -0
  72. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/units.py +0 -0
  73. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/dependencies/xs-check/xs-check +0 -0
  74. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/dependencies/xs-check/xs-check.exe +0 -0
  75. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/exceptions/__init__.py +0 -0
  76. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/exceptions/asp_exceptions.py +0 -0
  77. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/exceptions/asp_warnings.py +0 -0
  78. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/helper/__init__.py +0 -0
  79. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/helper/attr_dict.py +0 -0
  80. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/helper/bytes_conversions.py +0 -0
  81. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/helper/bytes_parser.py +0 -0
  82. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/helper/helper.py +0 -0
  83. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/helper/incremental_generator.py +0 -0
  84. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/helper/list_functions.py +0 -0
  85. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/helper/maffs.py +0 -0
  86. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/helper/pretty_format.py +0 -0
  87. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/helper/printers.py +0 -0
  88. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/helper/string_manipulations.py +0 -0
  89. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/helper/version_check.py +0 -0
  90. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/__init__.py +0 -0
  91. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/aoe2_object.py +0 -0
  92. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/aoe2_object_manager.py +0 -0
  93. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/data_objects/__init__.py +0 -0
  94. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/data_objects/condition.py +0 -0
  95. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/data_objects/effect.py +0 -0
  96. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/data_objects/player/__init__.py +0 -0
  97. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/data_objects/player/player.py +0 -0
  98. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/data_objects/player/player_data_four.py +0 -0
  99. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/data_objects/player/player_data_three.py +0 -0
  100. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/data_objects/player/player_diplomacy.py +0 -0
  101. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/data_objects/player/player_initial_view.py +0 -0
  102. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/data_objects/player/player_meta_data.py +0 -0
  103. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/data_objects/player/player_resources.py +0 -0
  104. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/data_objects/terrain_tile.py +0 -0
  105. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/data_objects/trigger.py +0 -0
  106. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/data_objects/unit.py +0 -0
  107. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/data_objects/units/__init__.py +0 -0
  108. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/data_objects/units/player_units.py +0 -0
  109. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/data_objects/variable.py +0 -0
  110. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/managers/__init__.py +0 -0
  111. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/managers/de/__init__.py +0 -0
  112. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/managers/de/trigger_manager_de.py +0 -0
  113. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/managers/de/unit_manager_de.py +0 -0
  114. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/managers/map_manager.py +0 -0
  115. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/managers/message_manager.py +0 -0
  116. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/managers/option_manager.py +0 -0
  117. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/managers/player_manager.py +0 -0
  118. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/managers/trigger_manager.py +0 -0
  119. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/managers/unit_manager.py +0 -0
  120. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/support/__init__.py +0 -0
  121. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/support/area.py +0 -0
  122. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/support/attr_presentation.py +0 -0
  123. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/support/enums/__init__.py +0 -0
  124. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/support/enums/group_by.py +0 -0
  125. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/support/new_condition.py +0 -0
  126. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/support/new_effect.py +0 -0
  127. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/support/tile.py +0 -0
  128. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/support/trigger_ce_lock.py +0 -0
  129. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/support/trigger_object.py +0 -0
  130. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/support/trigger_select.py +0 -0
  131. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/support/uuid_list.py +0 -0
  132. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/scenarios/__init__.py +0 -0
  133. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/scenarios/scenario_debug/__init__.py +0 -0
  134. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/scenarios/scenario_debug/compare.py +0 -0
  135. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/scenarios/scenario_store/__init__.py +0 -0
  136. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/scenarios/scenario_store/actions.py +0 -0
  137. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/scenarios/scenario_store/getters.py +0 -0
  138. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/scenarios/scenario_store/store.py +0 -0
  139. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/scenarios/support/data_triggers.py +0 -0
  140. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/scenarios/support/object_factory.py +0 -0
  141. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/scenarios/support/scenario_actions.py +0 -0
  142. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/sections/__init__.py +0 -0
  143. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/sections/aoe2_file_section.py +0 -0
  144. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/sections/aoe2_struct_model.py +0 -0
  145. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/sections/dependencies/__init__.py +0 -0
  146. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/sections/dependencies/dependency.py +0 -0
  147. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/sections/dependencies/dependency_action.py +0 -0
  148. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/sections/dependencies/dependency_eval.py +0 -0
  149. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/sections/dependencies/dependency_target.py +0 -0
  150. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/sections/dependencies/retriever_dependency.py +0 -0
  151. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/sections/retrievers/__init__.py +0 -0
  152. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/sections/retrievers/construct_progress.py +0 -0
  153. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/sections/retrievers/datatype.py +0 -0
  154. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/sections/retrievers/retriever.py +0 -0
  155. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/sections/retrievers/retriever_object_link.py +0 -0
  156. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/sections/retrievers/retriever_object_link_group.py +0 -0
  157. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/sections/retrievers/retriever_object_link_parent.py +0 -0
  158. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/sections/retrievers/support.py +0 -0
  159. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/settings.py +0 -0
  160. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.36/conditions.json +0 -0
  161. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.36/effects.json +0 -0
  162. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.36/structure.json +0 -0
  163. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.37/conditions.json +0 -0
  164. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.37/effects.json +0 -0
  165. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.37/structure.json +0 -0
  166. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.40/conditions.json +0 -0
  167. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.40/effects.json +0 -0
  168. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.40/structure.json +0 -0
  169. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.41/conditions.json +0 -0
  170. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.41/effects.json +0 -0
  171. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.41/structure.json +0 -0
  172. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.42/conditions.json +0 -0
  173. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.42/effects.json +0 -0
  174. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.42/structure.json +0 -0
  175. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.43/conditions.json +0 -0
  176. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.43/effects.json +0 -0
  177. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.43/structure.json +0 -0
  178. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.44/conditions.json +0 -0
  179. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.44/effects.json +0 -0
  180. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.44/structure.json +0 -0
  181. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.45/conditions.json +0 -0
  182. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.45/effects.json +0 -0
  183. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.45/structure.json +0 -0
  184. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.46/conditions.json +0 -0
  185. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.46/effects.json +0 -0
  186. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.46/structure.json +0 -0
  187. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.47/conditions.json +0 -0
  188. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.47/effects.json +0 -0
  189. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.47/structure.json +0 -0
  190. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.48/conditions.json +0 -0
  191. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.48/effects.json +0 -0
  192. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.48/structure.json +0 -0
  193. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.49/conditions.json +0 -0
  194. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.49/effects.json +0 -0
  195. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.49/structure.json +0 -0
  196. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.51/conditions.json +0 -0
  197. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.51/effects.json +0 -0
  198. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.51/structure.json +0 -0
  199. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.53/conditions.json +0 -0
  200. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.53/effects.json +0 -0
  201. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.53/structure.json +0 -0
  202. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.54/conditions.json +0 -0
  203. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.54/effects.json +0 -0
  204. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.54/structure.json +0 -0
  205. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser.egg-info/SOURCES.txt +0 -0
  206. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser.egg-info/dependency_links.txt +0 -0
  207. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser.egg-info/requires.txt +0 -0
  208. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser.egg-info/top_level.txt +0 -0
  209. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/LICENSE +0 -0
  210. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/README.md +0 -0
  211. {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/setup.cfg +0 -0
@@ -15,7 +15,7 @@ class PanelLocation(_DataSetIntEnums):
15
15
  """
16
16
  TOP = 0
17
17
  """Panel at the top of the screen. ~13% from the top"""
18
- BETWEEN = 1
18
+ MIDDLE = 1
19
19
  """Panel between the top and the center of the screen. ~33% from the top"""
20
- CENTER = 2
20
+ BOTTOM = 2
21
21
  """Panel close to the center of the screen. ~45% from the top"""
@@ -1,4 +1,4 @@
1
- from typing import List
1
+ from typing import List, Union
2
2
 
3
3
  from AoE2ScenarioParser.datasets.trigger_lists import ColorMood
4
4
  from AoE2ScenarioParser.helper.printers import warn
@@ -13,7 +13,7 @@ class MapManagerDE(MapManager):
13
13
  """Manager of all DE map related features"""
14
14
  _link_list = [
15
15
  RetrieverObjectLinkGroup("Map", group=[
16
- RetrieverObjectLink("map_color_mood"),
16
+ RetrieverObjectLink("_map_color_mood", link="map_color_mood"),
17
17
  RetrieverObjectLink("collide_and_correct"),
18
18
  RetrieverObjectLink("villager_force_drop", support=Support(since=1.37)),
19
19
  RetrieverObjectLink("map_width"),
@@ -23,23 +23,31 @@ class MapManagerDE(MapManager):
23
23
  ]
24
24
 
25
25
  def __init__(self,
26
- map_color_mood: str,
26
+ _map_color_mood: str,
27
27
  collide_and_correct: bool,
28
28
  villager_force_drop: bool,
29
29
  map_width: int,
30
30
  map_height: int,
31
31
  terrain: List[TerrainTile],
32
- **kwargs,
33
- ):
32
+ **kwargs):
34
33
  super().__init__(map_width, map_height, terrain, **kwargs)
35
34
 
36
- if map_color_mood.upper() in ColorMood.__members__:
37
- map_color_mood = ColorMood[map_color_mood.upper()]
35
+ if _map_color_mood.upper() in ColorMood.__members__:
36
+ map_color_mood = ColorMood[_map_color_mood.upper()]
37
+ else:
38
+ map_color_mood = _map_color_mood
38
39
 
39
- self.map_color_mood: str = map_color_mood
40
+ self.map_color_mood: Union[str, ColorMood] = map_color_mood
40
41
  self.collide_and_correct: bool = collide_and_correct
41
42
  self.villager_force_drop: bool = villager_force_drop
42
43
 
44
+ @property
45
+ def _map_color_mood(self):
46
+ """Purely here to convert the Enum back to string"""
47
+ if isinstance(self.map_color_mood, ColorMood):
48
+ return self.map_color_mood.name.lower()
49
+ return self.map_color_mood
50
+
43
51
  @property
44
52
  def collide_and_correct(self):
45
53
  warn("Moved to the OptionManager. Use: `option_manager.collide_and_correct` instead", DeprecationWarning)
@@ -1,10 +1,9 @@
1
1
  import tempfile
2
2
  from pathlib import Path
3
- from typing import Optional, Union, TYPE_CHECKING
3
+ from typing import Optional, Union, TYPE_CHECKING, List, Tuple
4
4
 
5
5
  from AoE2ScenarioParser.datasets.effects import EffectId
6
6
  from AoE2ScenarioParser.exceptions.asp_exceptions import UnsupportedAttributeError, UnsupportedVersionError
7
- from AoE2ScenarioParser.helper.pretty_format import pretty_format_list
8
7
  from AoE2ScenarioParser.objects.aoe2_object import AoE2Object
9
8
  from AoE2ScenarioParser.objects.data_objects.trigger import Trigger
10
9
  from AoE2ScenarioParser.objects.support.xs_check import XsCheck
@@ -13,9 +12,8 @@ from AoE2ScenarioParser.scenarios.scenario_store.getters import get_scenario_ver
13
12
  from AoE2ScenarioParser.sections.retrievers.retriever_object_link import RetrieverObjectLink
14
13
  from AoE2ScenarioParser.sections.retrievers.support import Support
15
14
 
16
-
17
15
  if TYPE_CHECKING:
18
- from AoE2ScenarioParser.scenarios.aoe2_de_scenario import AoE2DEScenario
16
+ pass
19
17
 
20
18
 
21
19
  class XsManagerDE(AoE2Object):
@@ -36,7 +34,7 @@ class XsManagerDE(AoE2Object):
36
34
  """
37
35
 
38
36
  # Instantiate the xs-check helper
39
- self.xs_check = XsCheck()
37
+ self.xs_check = XsCheck(self._uuid)
40
38
 
41
39
  # --- XS Script Call Trigger ---
42
40
  self._initialized = False
@@ -48,9 +46,6 @@ class XsManagerDE(AoE2Object):
48
46
  "each system once the game starts in the default0.xs file. -- Created using AoE2ScenarioParser",
49
47
  )
50
48
 
51
- # Register this function to run on write
52
- self.get_scenario().on_write(self.on_write_register_xs_validation)
53
-
54
49
  @property
55
50
  def script_name(self):
56
51
  """The XS script name to include in the scenario"""
@@ -98,7 +93,7 @@ class XsManagerDE(AoE2Object):
98
93
  self._initialized = True
99
94
  actions.import_triggers(self._uuid, [self.xs_trigger], insert_index, deepcopy=False)
100
95
 
101
- def _append_to_xs(self, title, xs) -> None:
96
+ def _append_to_xs(self, title: str, xs: str) -> None:
102
97
  self.xs_trigger.effects[0].message += f"// {'-' * 25} {title} {'-' * 25}\n{xs}\n\n"
103
98
 
104
99
  def add_script(self, xs_file_path: str = "", xs_string: str = "", validate: bool = False):
@@ -157,28 +152,54 @@ class XsManagerDE(AoE2Object):
157
152
 
158
153
  return self.xs_check.validate(str(file.absolute()))
159
154
 
160
- def on_write_register_xs_validation(self, scenario: 'AoE2DEScenario'):
155
+ def _get_scenario_xs(self, include_short_code: bool = False) -> str:
156
+ """
157
+ Get all XS code in the scenario from effects and conditions
158
+
159
+ Args:
160
+ include_short_code: If Trigger, Effect/Condition information should be prefixed to each line
161
+
162
+ Returns:
163
+ All XS code in the scenario (from effects and conditions)
164
+ """
165
+ scenario = self.get_scenario()
166
+
167
+ xs_snippet_map: List[Tuple[str, str]] = []
168
+ for trigger in scenario.trigger_manager.triggers:
169
+ for index, condition in enumerate(trigger.conditions):
170
+ if condition.xs_function:
171
+ short_code = f"T{trigger.trigger_id}C{index}"
172
+ xs_snippet_map.append((short_code, condition.xs_function))
173
+ for index, effect in enumerate(trigger.effects):
174
+ if effect.effect_type == EffectId.SCRIPT_CALL and effect.message != '':
175
+ short_code = f"T{trigger.trigger_id}E{index}"
176
+ xs_snippet_map.append((short_code, effect.message))
177
+
178
+ xs_snippets: List[str]
179
+ if include_short_code:
180
+ xs_snippets: List[str] = [
181
+ '\n'.join([
182
+ f"/*{xs_snippet[0]}*/ {line}" if include_short_code else line
183
+ for line in xs_snippet[1].splitlines()
184
+ ])
185
+ for xs_snippet in xs_snippet_map
186
+ ]
187
+ else:
188
+ xs_snippets = [xs_snippet[1] for xs_snippet in xs_snippet_map]
189
+
190
+ return '\n'.join(xs_snippets)
191
+
192
+ def validate_scenario_xs(self):
161
193
  if self.xs_check.is_disabled:
162
194
  return
163
195
 
164
- def on_write_run_xs_validation(scenario: 'AoE2DEScenario'):
165
- xs_snippets = []
166
- for trigger in scenario.trigger_manager.triggers:
167
- for condition in trigger.conditions:
168
- if condition.xs_function:
169
- xs_snippets.append(condition.xs_function)
170
- for effect in trigger.effects:
171
- if effect.effect_type == EffectId.SCRIPT_CALL and effect.message != '':
172
- xs_snippets.append(effect.message)
196
+ xs_code = self._get_scenario_xs(include_short_code=True)
173
197
 
174
- xs_code = '\n'.join(xs_snippets)
175
- if not xs_code:
176
- return
177
-
178
- self.validate(xs=xs_code)
198
+ if not xs_code:
199
+ return
179
200
 
180
- scenario.on_write(on_write_run_xs_validation)
201
+ self.validate(xs=xs_code)
181
202
 
182
203
  def _debug_write_script_to_file(self, filename: str = "xs.txt"):
183
204
  with open(filename, 'w') as file:
184
- file.write(self.xs_trigger.effects[0].message)
205
+ file.write(self._get_scenario_xs())
@@ -5,19 +5,30 @@ import tempfile
5
5
  import time
6
6
  from pathlib import Path
7
7
  from typing import Optional, Union, Tuple, Set
8
+ from uuid import UUID
8
9
 
9
10
  from AoE2ScenarioParser import settings
11
+ from AoE2ScenarioParser.datasets.conditions import ConditionId
12
+ from AoE2ScenarioParser.datasets.effects import EffectId
10
13
  from AoE2ScenarioParser.exceptions.asp_exceptions import XsCheckValidationError
14
+ from AoE2ScenarioParser.helper.pretty_format import pretty_format_name
15
+ from AoE2ScenarioParser.helper.printers import s_print
11
16
  from AoE2ScenarioParser.helper.string_manipulations import add_tabs
17
+ from AoE2ScenarioParser.scenarios.scenario_store import getters
12
18
 
13
19
 
14
20
  class XsCheck:
15
21
  version: Tuple[int, int, int] = (0, 1, 5)
16
22
 
17
- def __init__(self):
23
+ def __init__(self, uuid: UUID):
24
+ self._uuid: UUID = uuid
25
+
18
26
  self.enabled = True
19
27
  self.xs_encoding = 'utf-8'
20
28
  self.allow_unsupported_versions: bool = False
29
+ """If XS-Check should be checked for compatibility"""
30
+ self.raise_on_error: bool = False
31
+ """If a Python error should be raised if XS-Check encounters an error"""
21
32
 
22
33
  self.path = None
23
34
  """The path for a custom XS check binary (One that is not shipped with AoE2ScenarioParser"""
@@ -65,12 +76,13 @@ class XsCheck:
65
76
  f'You can try `xs_manager.xs_check.allow_unsupported_versions = True` to override this check'
66
77
  )
67
78
 
68
- def validate(self, xs_file: Optional[Union[Path, str]]) -> True:
79
+ def validate(self, xs_file: Optional[Union[Path, str]], show_tmpfile: bool = True) -> True:
69
80
  """
70
81
  Validates the XS file and throws an exception if xs-check finds an error
71
82
 
72
83
  Args:
73
84
  xs_file: The XS file to validate
85
+ show_tmpfile: If a reference to the tmp file should be displayed
74
86
 
75
87
  Throws:
76
88
  XsCheckValidationError: When xs-check encounters an error
@@ -88,14 +100,28 @@ class XsCheck:
88
100
  if output.startswith('No errors found in file'):
89
101
  return True
90
102
 
103
+ # Do not show temp file name as it might be confusing
104
+ output = output.replace(xs_file_path, 'AoE2ScenarioParser.xs')
105
+
91
106
  version = '.'.join(str(v) for v in self.get_version())
92
107
 
93
- print(f"\nxs-check:{version} output: [ Provided by: https://github.com/Divy1211/xs-check/ ]\n")
94
- print(add_tabs(output, 1))
108
+ s_print('\n' + ('-' * 25) + '<[ XS-CHECK VALIDATION RESULT ]>' + ('-' * 25), final=True)
109
+
110
+ s_print(f"\nxs-check:{version} output: [ Provided by: https://github.com/Divy1211/xs-check/ ]\n", final=True)
111
+ s_print(add_tabs(output, 1), final=True)
112
+
113
+ self._print_parsed_xs_check_errors(output)
114
+
115
+ if show_tmpfile:
116
+ display_path = xs_file_path.replace('\\', '/')
117
+ s_print(f"\nOpen the file below to view the entire XS file:\n\tfile:///{display_path}", final=True)
95
118
 
96
119
  time.sleep(.5)
97
120
 
98
- raise XsCheckValidationError("Xs-Check failed validation, see errors above", xs_check_errors=output)
121
+ if self.raise_on_error:
122
+ raise XsCheckValidationError("Xs-Check failed validation, see errors above", xs_check_errors=output)
123
+
124
+ s_print('\n' + ('-' * 25) + '<[ END XS-CHECK VALIDATION RESULT ]>' + ('-' * 25), final=True)
99
125
 
100
126
  def validate_safe(self, xs_file: Optional[Union[Path, str]]) -> True:
101
127
  """
@@ -182,7 +208,7 @@ class XsCheck:
182
208
  stderr_file, stderr_path = tempfile.mkstemp()
183
209
 
184
210
  command = [self.path, *args]
185
- exitcode = subprocess.call(command, timeout=5, stdout=stdout_file, stderr=stderr_file)
211
+ exitcode = subprocess.call(command, timeout=60, stdout=stdout_file, stderr=stderr_file)
186
212
 
187
213
  if exitcode != 0:
188
214
  error = Path(stderr_path).read_text(encoding=self.xs_encoding)
@@ -190,3 +216,35 @@ class XsCheck:
190
216
  raise ValueError(f"A non-zero exit code ({exitcode}) was returned by xs-check: '{error}'")
191
217
 
192
218
  return Path(stdout_path).read_text(encoding=self.xs_encoding)
219
+
220
+ def _print_parsed_xs_check_errors(self, output: str) -> None:
221
+ # Remove unwanted characters from output (Color highlighting etc.)
222
+ plain_output = re.sub(r'\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])', '', output)
223
+
224
+ prev_trigger_index = None
225
+ matches = re.findall(r'/\*T(\d+)([CE])(\d+)\*/', plain_output)
226
+
227
+ if len(matches) == 0:
228
+ return
229
+
230
+ s_print(f"\nXS-Check errors origins:\n", final=True)
231
+ for match in matches:
232
+ trigger_index, ce_type, ce_index = match
233
+
234
+ trigger = getters.get_trigger(self._uuid, int(trigger_index))
235
+ if ce_type == 'C':
236
+ obj = 'Condition'
237
+ type_ = trigger.conditions[int(ce_index)].condition_type
238
+ obj_name = pretty_format_name(ConditionId(type_).name)
239
+ elif ce_type == 'E':
240
+ obj = 'Effect'
241
+ type_ = trigger.effects[int(ce_index)].effect_type
242
+ obj_name = pretty_format_name(EffectId(type_).name)
243
+ else:
244
+ continue
245
+
246
+ if prev_trigger_index != trigger_index:
247
+ s_print(f" ⇒ [Trigger #{trigger_index}] '{trigger.name}'", final=True)
248
+
249
+ s_print(f" ↳ [{obj} #{ce_index}] {obj_name} {obj}", final=True)
250
+ s_print(f"", final=True)
@@ -2,6 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  from typing import Type
4
4
 
5
+ from AoE2ScenarioParser.exceptions.asp_exceptions import XsCheckValidationError
5
6
  from AoE2ScenarioParser.objects.managers.de.map_manager_de import MapManagerDE
6
7
  from AoE2ScenarioParser.objects.managers.de.trigger_manager_de import TriggerManagerDE
7
8
  from AoE2ScenarioParser.objects.managers.de.unit_manager_de import UnitManagerDE
@@ -64,3 +65,11 @@ class AoE2DEScenario(AoE2Scenario):
64
65
  An instance of the AoE2DEScenario class which is the object representation of the given scenario file
65
66
  """
66
67
  return super().from_file(path=path, game_version=game_version, name=name)
68
+
69
+ def _internal_on_write(self, filename: str):
70
+ super()._internal_on_write(filename)
71
+
72
+ try:
73
+ self.xs_manager.validate_scenario_xs()
74
+ except XsCheckValidationError as e:
75
+ raise XsCheckValidationError(str(e), xs_check_errors=e.xs_check_errors) from None
@@ -81,12 +81,12 @@ class AoE2Scenario:
81
81
  return tuple(map(int, self.scenario_version.split('.')))
82
82
 
83
83
  def __init__(
84
- self,
85
- game_version: str,
86
- scenario_version: str,
87
- source_location: str,
88
- name: str,
89
- variant: ScenarioVariant | None = None
84
+ self,
85
+ game_version: str,
86
+ scenario_version: str,
87
+ source_location: str,
88
+ name: str,
89
+ variant: ScenarioVariant | None = None
90
90
  ):
91
91
  # Scenario meta info
92
92
  self.game_version: str = game_version
@@ -119,10 +119,10 @@ class AoE2Scenario:
119
119
 
120
120
  @classmethod
121
121
  def from_file(
122
- cls: Type[S],
123
- path: str,
124
- game_version: str,
125
- name: str = ""
122
+ cls: Type[S],
123
+ path: str,
124
+ game_version: str,
125
+ name: str = ""
126
126
  ) -> S:
127
127
  """
128
128
  Creates and returns an instance of the AoE2Scenario class from the given scenario file
@@ -160,7 +160,7 @@ class AoE2Scenario:
160
160
  s_print("\n############### Attributes ###############", final=True, color="blue")
161
161
  s_print(f">>> Game version: '{scenario.game_version}'", final=True, color="blue")
162
162
  s_print(f">>> Scenario version: {scenario.scenario_version}", final=True, color="blue")
163
- s_print(f">>> Scenario variant: '{variant}'", final=True, color= "blue")
163
+ s_print(f">>> Scenario variant: '{variant}'", final=True, color="blue")
164
164
  s_print("##########################################", final=True, color="blue")
165
165
 
166
166
  s_print(f"Loading scenario structure...", time=True, newline=True)
@@ -182,9 +182,9 @@ class AoE2Scenario:
182
182
 
183
183
  @staticmethod
184
184
  def get_scenario(
185
- uuid: UUID = None,
186
- obj: 'AoE2Object' = None,
187
- name: str = None
185
+ uuid: UUID = None,
186
+ obj: 'AoE2Object' = None,
187
+ name: str = None
188
188
  ) -> S:
189
189
  """
190
190
  Get scenario through a UUID, a related object or the name of a scenario.
@@ -305,7 +305,12 @@ class AoE2Scenario:
305
305
  ####################################### Write functions ######################################
306
306
  ########################################################################################## """
307
307
 
308
- def write_to_file(self, filename: str, skip_reconstruction: bool = False) -> None:
308
+ def write_to_file(
309
+ self,
310
+ filename: str,
311
+ skip_reconstruction: bool = False,
312
+ skip_validation: bool = False,
313
+ ) -> None:
309
314
  """
310
315
  Writes the scenario to a new file with the given filename
311
316
 
@@ -313,13 +318,36 @@ class AoE2Scenario:
313
318
  filename: The location to write the file to
314
319
  skip_reconstruction: If reconstruction should be skipped. If true, this will ignore all changes made
315
320
  using the managers (For example all changes made using trigger_manager).
321
+ skip_validation: If validation should be skipped. If true, no blocking checks will be done when writing.
316
322
 
317
323
  Raises:
318
324
  ValueError: if the setting DISABLE_ERROR_ON_OVERWRITING_SOURCE is not disabled and the source filename is
319
325
  the same as the filename being written to
320
326
  """
327
+ if not skip_validation:
328
+ self._validate_before_write(filename)
329
+
330
+ self._prepare_writing(filename)
321
331
  self._write_from_structure(filename, skip_reconstruction)
322
332
 
333
+ def _validate_before_write(self, filename: str):
334
+ """
335
+ Validates aspects of the scenario before writing the file
336
+
337
+ Args:
338
+ filename: The location to write the file to
339
+ """
340
+ if settings.ALLOW_OVERWRITING_SOURCE and self.source_location == filename:
341
+ raise ValueError("Overwriting the source scenario file is discouraged & disallowed. ")
342
+
343
+ self._validate_scenario_variant()
344
+
345
+ def _prepare_writing(self, filename: str):
346
+ for func in self._on_write_funcs:
347
+ func(self)
348
+
349
+ self._internal_on_write(filename)
350
+
323
351
  def _write_from_structure(self, filename: str, skip_reconstruction: bool = False) -> None:
324
352
  """
325
353
  Writes the scenario to a new file with the given filename
@@ -333,20 +361,9 @@ class AoE2Scenario:
333
361
  ValueError: if the setting DISABLE_ERROR_ON_OVERWRITING_SOURCE is not disabled and the source filename is
334
362
  the same as the filename being written to
335
363
  """
336
- if settings.ALLOW_OVERWRITING_SOURCE and self.source_location == filename:
337
- raise ValueError("Overwriting the source scenario file is discouraged & disallowed. ")
338
-
339
- for func in self._on_write_funcs:
340
- func(self)
341
-
342
- # Update the internal file name to match the output filename
343
- self._update_internal_filename(filename)
344
-
345
364
  if not skip_reconstruction:
346
365
  self.commit()
347
366
 
348
- self._validate_scenario_variant()
349
-
350
367
  s_print("File writing from structure started...", final=True, time=True, newline=True)
351
368
  binary = _get_file_section_data(self.sections.get('FileHeader'))
352
369
 
@@ -366,6 +383,10 @@ class AoE2Scenario:
366
383
  s_print(f"File successfully written to: " + color_string(f"'{filename}'", "magenta"), final=True, time=True)
367
384
  s_print(f"Execution time from scenario read: {etime}s", final=True, time=True)
368
385
 
386
+ def _internal_on_write(self, filename: str):
387
+ # Update the internal file name to match the output filename
388
+ self.sections['DataHeader'].filename = Path(filename).stem
389
+
369
390
  def write_error_file(self, filename: str = "error_file.txt", trail_generator: IncrementalGenerator = None) -> None:
370
391
  """
371
392
  Outputs the contents of the entire scenario file in a readable format. An example of the format is given below::
@@ -466,9 +487,6 @@ class AoE2Scenario:
466
487
  self.sections["FileHeader"].amount_of_unknown_numbers = len(dlcs)
467
488
  self.sections["FileHeader"].unknown_numbers = dlcs
468
489
 
469
- def _update_internal_filename(self, filename: str) -> None:
470
- self.sections['DataHeader'].filename = Path(filename).stem
471
-
472
490
  """ #############################################
473
491
  ################ Debug functions ################
474
492
  ############################################# """
@@ -654,7 +672,7 @@ def _get_scenario_variant(generator: IncrementalGenerator) -> ScenarioVariant |
654
672
  return None # Unable to find sequence
655
673
 
656
674
  value = generator.file_content[index + 4:index + 8]
657
- value = bytes_to_int(value, signed = False)
675
+ value = bytes_to_int(value, signed=False)
658
676
  try:
659
677
  return ScenarioVariant(value)
660
678
  except ValueError:
@@ -1,4 +1,4 @@
1
1
  """ Expose version """
2
2
 
3
- __version__ = "0.3.0.dev0"
3
+ __version__ = "0.3.0.dev2"
4
4
  VERSION = __version__.split(".")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: AoE2ScenarioParser
3
- Version: 0.3.0.dev0
3
+ Version: 0.3.0.dev2
4
4
  Summary: This is a project for editing parts of an 'aoe2scenario' file from Age of Empires 2 Definitive Edition
5
5
  Author-email: Kerwin Sneijders <ksneijders-dev@hotmail.com>
6
6
  Project-URL: Homepage, https://github.com/KSneijders/AoE2ScenarioParser
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: AoE2ScenarioParser
3
- Version: 0.3.0.dev0
3
+ Version: 0.3.0.dev2
4
4
  Summary: This is a project for editing parts of an 'aoe2scenario' file from Age of Empires 2 Definitive Edition
5
5
  Author-email: Kerwin Sneijders <ksneijders-dev@hotmail.com>
6
6
  Project-URL: Homepage, https://github.com/KSneijders/AoE2ScenarioParser
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "AoE2ScenarioParser"
3
- version = "0.3.0.dev0"
3
+ version = "0.3.0.dev2"
4
4
  authors = [
5
5
  { name = "Kerwin Sneijders", email = "ksneijders-dev@hotmail.com" },
6
6
  ]