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.
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/panel_location.py +2 -2
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/managers/de/map_manager_de.py +16 -8
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/managers/de/xs_manager_de.py +47 -26
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/support/xs_check.py +64 -6
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/scenarios/aoe2_de_scenario.py +9 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/scenarios/aoe2_scenario.py +48 -30
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/version.py +1 -1
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser.egg-info/PKG-INFO +1 -1
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/PKG-INFO +1 -1
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/pyproject.toml +1 -1
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/__init__.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/__init__.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/buildings.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/conditions.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/dataset_enum.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/effects.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/heroes.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/object_support.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/other.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/players.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/projectiles.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/scenario_variant.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/sources/resource_editor_names.json +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/sources/unit_projectile_info.json +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/support/__init__.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/support/dataset_gen/common.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/support/dataset_gen/gen_attr_dataset.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/support/dataset_gen/gen_res_datset.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/support/info_dataset_base.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/techs.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/terrains.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/__init__.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/action_type.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/age.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/attack_stance.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/attribute.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/blast_level.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/blockage_class.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/button_location.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/charge_event.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/charge_type.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/color_mood.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/combat_ability.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/comparison.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/damage_class.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/difficulty_level.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/diplomacy_state.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/fog_visibility.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/garrison_type.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/hero_status_flag.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/hotkey.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/object_attribute.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/object_class.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/object_state.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/object_type.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/obstruction_type.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/occlusion_mode.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/operation.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/projectile_hit_mode.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/projectile_smart_mode.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/projectile_vanish_mode.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/secondary_game_mode.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/selection_effect.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/technology_state.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/terrain_restrictions.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/time_unit.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/unit_ai_action.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/unit_trait.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/victory_condition.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/victory_timer_type.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/trigger_lists/visibility_state.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/units.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/dependencies/xs-check/xs-check +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/dependencies/xs-check/xs-check.exe +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/exceptions/__init__.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/exceptions/asp_exceptions.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/exceptions/asp_warnings.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/helper/__init__.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/helper/attr_dict.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/helper/bytes_conversions.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/helper/bytes_parser.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/helper/helper.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/helper/incremental_generator.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/helper/list_functions.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/helper/maffs.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/helper/pretty_format.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/helper/printers.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/helper/string_manipulations.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/helper/version_check.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/__init__.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/aoe2_object.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/aoe2_object_manager.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/data_objects/__init__.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/data_objects/condition.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/data_objects/effect.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/data_objects/player/__init__.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/data_objects/player/player.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/data_objects/player/player_data_four.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/data_objects/player/player_data_three.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/data_objects/player/player_diplomacy.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/data_objects/player/player_initial_view.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/data_objects/player/player_meta_data.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/data_objects/player/player_resources.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/data_objects/terrain_tile.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/data_objects/trigger.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/data_objects/unit.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/data_objects/units/__init__.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/data_objects/units/player_units.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/data_objects/variable.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/managers/__init__.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/managers/de/__init__.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/managers/de/trigger_manager_de.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/managers/de/unit_manager_de.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/managers/map_manager.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/managers/message_manager.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/managers/option_manager.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/managers/player_manager.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/managers/trigger_manager.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/managers/unit_manager.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/support/__init__.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/support/area.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/support/attr_presentation.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/support/enums/__init__.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/support/enums/group_by.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/support/new_condition.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/support/new_effect.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/support/tile.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/support/trigger_ce_lock.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/support/trigger_object.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/support/trigger_select.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/objects/support/uuid_list.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/scenarios/__init__.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/scenarios/scenario_debug/__init__.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/scenarios/scenario_debug/compare.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/scenarios/scenario_store/__init__.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/scenarios/scenario_store/actions.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/scenarios/scenario_store/getters.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/scenarios/scenario_store/store.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/scenarios/support/data_triggers.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/scenarios/support/object_factory.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/scenarios/support/scenario_actions.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/sections/__init__.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/sections/aoe2_file_section.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/sections/aoe2_struct_model.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/sections/dependencies/__init__.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/sections/dependencies/dependency.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/sections/dependencies/dependency_action.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/sections/dependencies/dependency_eval.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/sections/dependencies/dependency_target.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/sections/dependencies/retriever_dependency.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/sections/retrievers/__init__.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/sections/retrievers/construct_progress.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/sections/retrievers/datatype.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/sections/retrievers/retriever.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/sections/retrievers/retriever_object_link.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/sections/retrievers/retriever_object_link_group.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/sections/retrievers/retriever_object_link_parent.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/sections/retrievers/support.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/settings.py +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.36/conditions.json +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.36/effects.json +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.36/structure.json +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.37/conditions.json +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.37/effects.json +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.37/structure.json +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.40/conditions.json +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.40/effects.json +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.40/structure.json +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.41/conditions.json +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.41/effects.json +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.41/structure.json +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.42/conditions.json +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.42/effects.json +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.42/structure.json +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.43/conditions.json +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.43/effects.json +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.43/structure.json +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.44/conditions.json +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.44/effects.json +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.44/structure.json +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.45/conditions.json +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.45/effects.json +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.45/structure.json +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.46/conditions.json +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.46/effects.json +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.46/structure.json +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.47/conditions.json +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.47/effects.json +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.47/structure.json +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.48/conditions.json +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.48/effects.json +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.48/structure.json +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.49/conditions.json +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.49/effects.json +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.49/structure.json +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.51/conditions.json +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.51/effects.json +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.51/structure.json +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.53/conditions.json +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.53/effects.json +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.53/structure.json +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.54/conditions.json +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.54/effects.json +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/versions/DE/v1.54/structure.json +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser.egg-info/SOURCES.txt +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser.egg-info/dependency_links.txt +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser.egg-info/requires.txt +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser.egg-info/top_level.txt +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/LICENSE +0 -0
- {aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/README.md +0 -0
- {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
|
-
|
|
18
|
+
MIDDLE = 1
|
|
19
19
|
"""Panel between the top and the center of the screen. ~33% from the top"""
|
|
20
|
-
|
|
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
|
-
|
|
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
|
|
37
|
-
map_color_mood = ColorMood[
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
175
|
-
|
|
176
|
-
return
|
|
177
|
-
|
|
178
|
-
self.validate(xs=xs_code)
|
|
198
|
+
if not xs_code:
|
|
199
|
+
return
|
|
179
200
|
|
|
180
|
-
|
|
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.
|
|
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
|
-
|
|
94
|
-
|
|
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
|
-
|
|
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=
|
|
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
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
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
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
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=
|
|
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
|
-
|
|
186
|
-
|
|
187
|
-
|
|
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(
|
|
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
|
|
675
|
+
value = bytes_to_int(value, signed=False)
|
|
658
676
|
try:
|
|
659
677
|
return ScenarioVariant(value)
|
|
660
678
|
except ValueError:
|
{aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser.egg-info/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: AoE2ScenarioParser
|
|
3
|
-
Version: 0.3.0.
|
|
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.
|
|
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
|
{aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/other.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{aoe2scenarioparser-0.3.0.dev0 → aoe2scenarioparser-0.3.0.dev2}/AoE2ScenarioParser/datasets/techs.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|