autowsgr 2.2.2__tar.gz → 2.3.0__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.
- autowsgr-2.3.0/AGENTS.md +105 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/PKG-INFO +2 -2
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/__init__.py +1 -1
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/combat/__init__.py +18 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/combat/actions.py +16 -9
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/combat/engine.py +6 -1
- autowsgr-2.3.0/autowsgr/combat/fleet.py +434 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/combat/handlers.py +1 -1
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/combat/node_tracker.py +78 -9
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/combat/plan.py +46 -1
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/combat/recognizer.py +33 -16
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/combat/rules.py +35 -11
- autowsgr-2.3.0/autowsgr/constants/__init__.py +28 -0
- autowsgr-2.3.0/autowsgr/constants/shipnames.py +152 -0
- autowsgr-2.3.0/autowsgr/context/bathroom.py +88 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/context/game_context.py +43 -0
- autowsgr-2.3.0/autowsgr/contracts/__init__.py +1 -0
- autowsgr-2.3.0/autowsgr/contracts/vessel_types.py +92 -0
- autowsgr-2.3.0/autowsgr/data/images/event/difficulty_easy_540p_1.png +0 -0
- autowsgr-2.3.0/autowsgr/data/images/event/difficulty_easy_540p_2.png +0 -0
- autowsgr-2.3.0/autowsgr/data/images/event/difficulty_hard_540p_1.png +0 -0
- autowsgr-2.3.0/autowsgr/data/images/event/difficulty_hard_540p_2.png +0 -0
- autowsgr-2.3.0/autowsgr/data/images/event/event_icon_20260730_540p.png +0 -0
- autowsgr-2.3.0/autowsgr/data/images/event/event_title_20260730_540p.png +0 -0
- autowsgr-2.3.0/autowsgr/data/images/event/fight_button_20260730_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/decisive_battle/enemy_spec.yaml +9 -9
- autowsgr-2.3.0/autowsgr/data/map/event/20260730//346/277/200/346/226/227/346/274/251/346/266/241-Ex-1-/316/261.yaml +86 -0
- autowsgr-2.3.0/autowsgr/data/map/event/20260730//346/277/200/346/226/227/346/274/251/346/266/241-Ex-2-/316/261.yaml +87 -0
- autowsgr-2.3.0/autowsgr/data/map/event/20260730//346/277/200/346/226/227/346/274/251/346/266/241-Ex-3-/316/261.yaml +87 -0
- autowsgr-2.3.0/autowsgr/data/map/event/20260730//346/277/200/346/226/227/346/274/251/346/266/241-Ex-3-/316/262.yaml +80 -0
- autowsgr-2.3.0/autowsgr/data/map/event/20260730//346/277/200/346/226/227/346/274/251/346/266/241-Ex-4-/316/261.yaml +80 -0
- autowsgr-2.3.0/autowsgr/data/map/event/20260730//346/277/200/346/226/227/346/274/251/346/266/241-Ex-4-/316/262.yaml +92 -0
- autowsgr-2.3.0/autowsgr/data/map/event/20260730//346/277/200/346/226/227/346/274/251/346/266/241-Ex-5-/316/261.yaml +97 -0
- autowsgr-2.3.0/autowsgr/data/map/event/20260730//346/277/200/346/226/227/346/274/251/346/266/241-Ex-6-/316/261.yaml +82 -0
- autowsgr-2.3.0/autowsgr/data/map/event/20260730//346/277/200/346/226/227/346/274/251/346/266/241-Ex-6-/316/262.yaml +67 -0
- autowsgr-2.3.0/autowsgr/data/map/event/20260730//346/277/200/346/226/227/346/274/251/346/266/241H-Ex-1-/316/261.yaml +86 -0
- autowsgr-2.3.0/autowsgr/data/map/event/20260730//346/277/200/346/226/227/346/274/251/346/266/241H-Ex-2-/316/261.yaml +87 -0
- autowsgr-2.3.0/autowsgr/data/map/event/20260730//346/277/200/346/226/227/346/274/251/346/266/241H-Ex-3-/316/261.yaml +87 -0
- autowsgr-2.3.0/autowsgr/data/map/event/20260730//346/277/200/346/226/227/346/274/251/346/266/241H-Ex-3-/316/262.yaml +80 -0
- autowsgr-2.3.0/autowsgr/data/map/event/20260730//346/277/200/346/226/227/346/274/251/346/266/241H-Ex-4-/316/261.yaml +80 -0
- autowsgr-2.3.0/autowsgr/data/map/event/20260730//346/277/200/346/226/227/346/274/251/346/266/241H-Ex-4-/316/262.yaml +92 -0
- autowsgr-2.3.0/autowsgr/data/map/event/20260730//346/277/200/346/226/227/346/274/251/346/266/241H-Ex-5-/316/261.yaml +97 -0
- autowsgr-2.3.0/autowsgr/data/map/event/20260730//346/277/200/346/226/227/346/274/251/346/266/241H-Ex-6-/316/261.yaml +82 -0
- autowsgr-2.3.0/autowsgr/data/map/event/20260730//346/277/200/346/226/227/346/274/251/346/266/241H-Ex-6-/316/262.yaml +67 -0
- autowsgr-2.3.0/autowsgr/data/plan/event/E1/347/202/270/351/261/274.yaml +9 -0
- autowsgr-2.3.0/autowsgr/data/plan/event/E5/345/244/234/346/210/230.yaml +17 -0
- autowsgr-2.3.0/autowsgr/data/plan/event/H1/347/202/270/351/261/274.yaml +9 -0
- autowsgr-2.3.0/autowsgr/data/plan/event/H5/345/244/234/346/210/230.yaml +17 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/1/345/221/250/345/270/270.yaml +1 -1
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/2/345/221/250/345/270/270.yaml +1 -1
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/3/345/221/250/345/270/270.yaml +1 -1
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/4/345/221/250/345/270/270.yaml +3 -2
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/5/345/221/250/345/270/270.yaml +3 -2
- autowsgr-2.2.2/autowsgr/data/plan/normal_fight/6-1/347/211/271/346/256/212/344/273/273/345/212/241..yaml → autowsgr-2.3.0/autowsgr/data/plan/normal_fight/6-1/347/211/271/346/256/212/344/273/273/345/212/241.yaml +1 -1
- autowsgr-2.2.2/autowsgr/data/plan/normal_fight/6-2/347/211/271/346/256/212/344/273/273/345/212/241..yaml → autowsgr-2.3.0/autowsgr/data/plan/normal_fight/6-2/347/211/271/346/256/212/344/273/273/345/212/241.yaml +1 -1
- autowsgr-2.2.2/autowsgr/data/plan/normal_fight/6-4D/347/211/271/346/256/212/344/273/273/345/212/241..yaml → autowsgr-2.3.0/autowsgr/data/plan/normal_fight/6-4D/347/211/271/346/256/212/344/273/273/345/212/241.yaml +1 -1
- autowsgr-2.2.2/autowsgr/data/plan/normal_fight/6-4F/347/211/271/346/256/212/344/273/273/345/212/241..yaml → autowsgr-2.3.0/autowsgr/data/plan/normal_fight/6-4F/347/211/271/346/256/212/344/273/273/345/212/241.yaml +1 -1
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/6/345/221/250/345/270/270.yaml +3 -2
- autowsgr-2.2.2/autowsgr/data/plan/normal_fight/7-1/347/211/271/346/256/212/344/273/273/345/212/241..yaml → autowsgr-2.3.0/autowsgr/data/plan/normal_fight/7-1/347/211/271/346/256/212/344/273/273/345/212/241.yaml +1 -1
- autowsgr-2.2.2/autowsgr/data/plan/normal_fight/7-2/347/211/271/346/256/212/344/273/273/345/212/241..yaml → autowsgr-2.3.0/autowsgr/data/plan/normal_fight/7-2/347/211/271/346/256/212/344/273/273/345/212/241.yaml +1 -1
- autowsgr-2.2.2/autowsgr/data/plan/normal_fight/7-3/347/211/271/346/256/212/344/273/273/345/212/241..yaml → autowsgr-2.3.0/autowsgr/data/plan/normal_fight/7-3/347/211/271/346/256/212/344/273/273/345/212/241.yaml +1 -1
- autowsgr-2.2.2/autowsgr/data/plan/normal_fight/7-4/347/211/271/346/256/212/344/273/273/345/212/241..yaml → autowsgr-2.3.0/autowsgr/data/plan/normal_fight/7-4/347/211/271/346/256/212/344/273/273/345/212/241.yaml +1 -1
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/7-5/347/211/271/346/256/212/344/273/273/345/212/241.yaml +1 -1
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/7/345/221/250/345/270/270.yaml +3 -2
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/8/345/221/250/345/270/270.yaml +3 -2
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/9-4/345/221/250/345/270/270.yaml +2 -1
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/9/345/221/250/345/270/270.yaml +1 -1
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/emulator/controller/protocol.py +3 -1
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/emulator/controller/scrcpy.py +274 -28
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/infra/config.py +174 -39
- autowsgr-2.3.0/autowsgr/infra/config_compat.py +280 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/infra/file_utils.py +43 -19
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ops/campaign.py +30 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ops/decisive/chapter.py +4 -5
- autowsgr-2.3.0/autowsgr/ops/destroy.py +94 -0
- autowsgr-2.3.0/autowsgr/ops/event_fight.py +216 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ops/exercise.py +28 -1
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ops/normal_fight.py +152 -82
- autowsgr-2.3.0/autowsgr/ops/repair.py +152 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/scheduler/__init__.py +13 -1
- autowsgr-2.3.0/autowsgr/scheduler/daily_plan.py +273 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/scheduler/launcher.py +32 -5
- autowsgr-2.3.0/autowsgr/scheduler/scheduler.py +509 -0
- autowsgr-2.3.0/autowsgr/scheduler/triggers.py +396 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/server/__init__.py +4 -0
- autowsgr-2.3.0/autowsgr/server/device_lease.py +81 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/server/main.py +3 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/server/routes/game.py +2 -4
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/server/routes/ops.py +12 -29
- autowsgr-2.3.0/autowsgr/server/routes/system.py +124 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/server/routes/task.py +76 -61
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/server/schemas.py +121 -46
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/server/serializers.py +62 -13
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/server/task_manager.py +86 -11
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/types.py +13 -11
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/__init__.py +5 -1
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/bath_page/page.py +66 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/battle/detection.py +2 -2
- autowsgr-2.3.0/autowsgr/ui/battle/fleet_change/_change.py +1109 -0
- autowsgr-2.3.0/autowsgr/ui/battle/fleet_change/_detect.py +218 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/battle/fleet_change.py +4 -6
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/choose_ship_page.py +85 -152
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/decisive/fleet_ocr.py +0 -1
- autowsgr-2.3.0/autowsgr/ui/decisive/legacy_fleet_change.py +96 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/decisive/map_controller.py +2 -1
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/decisive/preparation.py +15 -0
- autowsgr-2.3.0/autowsgr/ui/event/event_page.py +425 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/main_page/event_nav.py +13 -2
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/map/panels/sortie.py +3 -3
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/utils/ship_list.py +91 -58
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/vision/api_dll.py +5 -5
- autowsgr-2.3.0/autowsgr/vision/easyocr_models_checker.py +71 -0
- autowsgr-2.3.0/autowsgr/vision/easyocr_models_cli.py +393 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/vision/ocr.py +155 -47
- autowsgr-2.3.0/autowsgr/vision/ocr_rules.py +157 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/docs/architecture/combat-engine.md +5 -4
- {autowsgr-2.2.2 → autowsgr-2.3.0}/docs/architecture/context-and-config.md +3 -4
- {autowsgr-2.2.2 → autowsgr-2.3.0}/docs/architecture/infra.md +0 -1
- autowsgr-2.3.0/docs/features/decisive-optimization.md +62 -0
- autowsgr-2.3.0/docs/features/ocr-ship-name-reliability.md +78 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/docs/usage/usage_combat.md +59 -15
- autowsgr-2.3.0/examples/auto_daily.py +117 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/examples/change_fleet.py +2 -1
- autowsgr-2.3.0/examples/event_fight.py +22 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/examples/usersettings.full.yaml +26 -16
- {autowsgr-2.2.2 → autowsgr-2.3.0}/examples/week.py +2 -1
- {autowsgr-2.2.2 → autowsgr-2.3.0}/pyproject.toml +2 -2
- {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/combat/test_combat.py +429 -2
- autowsgr-2.3.0/testing/context/test_bathroom.py +97 -0
- autowsgr-2.3.0/testing/emulator/test_controller.py +227 -0
- autowsgr-2.3.0/testing/infra/test_config.py +558 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/infra/test_file_utils.py +62 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ops/_framework.py +1 -1
- {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ops/event_fight.py +2 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ops/normal_fight.py +3 -1
- {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ops/scheduler.py +7 -1
- autowsgr-2.3.0/testing/ops/test_destroy_unit.py +101 -0
- autowsgr-2.3.0/testing/ops/test_normal_fight_unit.py +455 -0
- autowsgr-2.3.0/testing/ops/test_repair_unit.py +127 -0
- autowsgr-2.3.0/testing/ops/test_scheduler_unit.py +474 -0
- autowsgr-2.3.0/testing/server/__init__.py +1 -0
- autowsgr-2.3.0/testing/server/test_device_lease.py +72 -0
- autowsgr-2.3.0/testing/server/test_device_routes.py +53 -0
- autowsgr-2.3.0/testing/server/test_system_routes.py +246 -0
- autowsgr-2.3.0/testing/server/test_task_manager.py +417 -0
- autowsgr-2.3.0/testing/server/test_task_routes.py +479 -0
- autowsgr-2.3.0/testing/test_server_schemas.py +419 -0
- autowsgr-2.3.0/testing/test_vessel_type_contract.py +28 -0
- autowsgr-2.3.0/testing/tools/test_migrate_config.py +137 -0
- autowsgr-2.3.0/testing/ui/battle_preparation/test_unit.py +1597 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ui/event_page/e2e.py +0 -9
- autowsgr-2.3.0/testing/ui/test_choose_ship_page.py +200 -0
- autowsgr-2.3.0/testing/ui/test_ship_list.py +174 -0
- autowsgr-2.3.0/testing/vision/__init__.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/vision/test_ocr.py +216 -0
- autowsgr-2.3.0/tools/__init__.py +0 -0
- autowsgr-2.3.0/tools/migrate_config.py +260 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/usersettings.yaml +27 -17
- autowsgr-2.3.0/uv.lock +4172 -0
- autowsgr-2.2.2/AGENTS.md +0 -85
- autowsgr-2.2.2/autowsgr/constants/__init__.py +0 -8
- autowsgr-2.2.2/autowsgr/constants/shipnames.py +0 -53
- autowsgr-2.2.2/autowsgr/ops/destroy.py +0 -51
- autowsgr-2.2.2/autowsgr/ops/event_fight.py +0 -440
- autowsgr-2.2.2/autowsgr/ops/repair.py +0 -84
- autowsgr-2.2.2/autowsgr/scheduler/scheduler.py +0 -304
- autowsgr-2.2.2/autowsgr/server/routes/system.py +0 -97
- autowsgr-2.2.2/autowsgr/ui/battle/fleet_change/_change.py +0 -644
- autowsgr-2.2.2/autowsgr/ui/battle/fleet_change/_detect.py +0 -125
- autowsgr-2.2.2/autowsgr/ui/event/event_page.py +0 -319
- autowsgr-2.2.2/examples/event_fight.py +0 -17
- autowsgr-2.2.2/testing/emulator/test_controller.py +0 -161
- autowsgr-2.2.2/testing/infra/test_config.py +0 -180
- autowsgr-2.2.2/testing/ui/battle_preparation/test_unit.py +0 -291
- autowsgr-2.2.2/uv.lock +0 -4218
- {autowsgr-2.2.2 → autowsgr-2.3.0}/.agents/skills/emulator-debug/SKILL.md +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/.agents/skills/generic-issue-log-analysis/SKILL.md +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/.agents/skills/release-backend/SKILL.md +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/.gitattributes +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/.github/CONTRIBUTING.md +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/.github/ISSUE_TEMPLATE/enhancement_suggestion.yml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/.github/workflows/ai-issue-analysis.yml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/.github/workflows/lint.yml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/.github/workflows/lunar.yml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/.github/workflows/pytest.yml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/.github/workflows/release.yml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/.github/workflows/sync-upstream.yml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/.gitignore +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/.pre-commit-config.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/CLAUDE.md +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/LICENSE +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/README.md +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/combat/README.md +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/combat/history.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/combat/recognition.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/combat/state.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/context/README.md +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/context/__init__.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/context/build.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/context/equipment.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/context/expedition.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/context/fleet.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/context/resources.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/context/ship.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/bin/scrcpy-server.jar +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/build/equip_complete_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/build/equip_fast_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/build/equip_full_depot_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/build/equip_start_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/build/resource_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/build/ship_complete_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/build/ship_fast_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/build/ship_full_depot_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/build/ship_start_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/choose_ship/tab_1_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/choose_ship/tab_2_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/choose_ship/tab_3_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/choose_ship/tab_4_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/combat/battle_times_exceed_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/combat/bypass_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/combat/end_battle_page_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/combat/end_exercise_page_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/combat/end_map_page_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/combat/fight_condition_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/combat/fight_period_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/combat/flagship_damage_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/combat/formation_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/combat/get_item_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/combat/get_ship_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/combat/missile_animation_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/combat/missile_support_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/combat/mvp_badge_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/combat/night_battle_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/combat/proceed_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/combat/result/a_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/combat/result/b_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/combat/result/c_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/combat/result/d_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/combat/result/loot_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/combat/result/s_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/combat/result/ss_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/combat/result_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/combat/result_page_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/combat/ship_icon_1_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/combat/ship_icon_2_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/combat/spot_enemy_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/common/README.md +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/common/confirm_1_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/common/confirm_2_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/common/confirm_3_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/common/confirm_4_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/common/confirm_5_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/cook/cook_button_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/cook/have_cook_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/cook/no_times_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/decisive/entry_cant_fight_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/decisive/entry_challenging_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/decisive/entry_refresh_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/decisive/entry_refreshed_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/decisive/use_last_fleet_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/error/bad_network_1_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/error/bad_network_2_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/error/network_retry_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/error/remote_login_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/error/remote_login_confirm_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/event/event_icon_20260212_720p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/reward/collect_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/reward/collect_all_540p.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/ui/build.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/ui/friend.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/ui/intensify.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/ui/map.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/ui/mission.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20220928/E-1.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20220928/E-2.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20220928/E-3.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20220928/E-4.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20220928/E-5.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20220928/E-6.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20220928/H-1.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20220928/H-2.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20220928/H-3.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20220928/H-4.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20220928/H-5.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20220928/H-6.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20221118/E-1.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20221118/E-2.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20221118/E-3.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20221118/E-4.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20221118/E-5.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20221118/E-6.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20221118/H-1.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20221118/H-2.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20221118/H-3.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20221118/H-4.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20221118/H-5.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20221118/H-6.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230117/E-1.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230117/E-2.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230117/E-3.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230117/E-4.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230117/E-5.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230117/E-6.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230117/H-1.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230117/H-2.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230117/H-3.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230117/H-4.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230117/H-5.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230117/H-6.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230613/E-1.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230613/E-2.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230613/E-3.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230613/E-4.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230613/E-5.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230613/E-6.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230613/H-1.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230613/H-2.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230613/H-3.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230613/H-4.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230613/H-5.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230613/H-6.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230809/E-1.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230809/E-2.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230809/E-3.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230809/E-4.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230809/E-5.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230809/E-6.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230809/H-1.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230809/H-2.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230809/H-3.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230809/H-4.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230809/H-5.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230809/H-6.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230927/E-1.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230927/E-2.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230927/E-3.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230927/E-4.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230927/E-5.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230927/E-6.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230927/E-7.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230927/E-8.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230927/H-1.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230927/H-2.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230927/H-3.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230927/H-4.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230927/H-5.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230927/H-6.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230927/H-7.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230927/H-8.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20231215/E-1.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20231215/E-2.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20231215/E-3.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20231215/E-4.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20231215/E-5.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20231215/E-6.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20231215/H-1.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20231215/H-2.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20231215/H-3.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20231215/H-4.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20231215/H-5.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20231215/H-6.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240206/E-1.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240206/E-2.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240206/E-3.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240206/E-4.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240206/E-5.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240206/E-6.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240206/E-7.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240206/E-8.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240206/H-1.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240206/H-2.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240206/H-3.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240206/H-4.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240206/H-5.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240206/H-6.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240206/H-7.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240206/H-8.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240419/E-1.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240419/E-2.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240419/E-3.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240419/E-4.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240419/E-5.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240419/E-6.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240419/H-1.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240419/H-2.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240419/H-3.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240419/H-4.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240419/H-5.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240419/H-6.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240930/E-1.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240930/E-2.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240930/E-3.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240930/E-4.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240930/E-5.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240930/H-1.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240930/H-2.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240930/H-3.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240930/H-4.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240930/H-5.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20241219/E-1.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20241219/E-2.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20241219/E-3.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20241219/E-4.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20241219/E-5.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20241219/E-6.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20241219/H-1.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20241219/H-2.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20241219/H-3.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20241219/H-4.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20241219/H-5.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20241219/H-6.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250123/E-1.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250123/E-2.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250123/E-3.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250123/E-4.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250123/E-5.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250123/E-6.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250123/H-1.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250123/H-2.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250123/H-3.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250123/H-4.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250123/H-5.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250123/H-6.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250710/E-1.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250710/E-2.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250710/E-3.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250710/E-4.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250710/E-5.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250710/E-6.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250710/H-1.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250710/H-2.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250710/H-3.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250710/H-4.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250710/H-5.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250710/H-6.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250930/E-1.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250930/E-2.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250930/E-3.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250930/E-4.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250930/E-5.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250930/E-6.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250930/H-1.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250930/H-2.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250930/H-3.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250930/H-4.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250930/H-5.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250930/H-6.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20260104/E-1.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20260104/E-2.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20260104/E-3.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20260104/E-4.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20260104/E-5.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20260104/E-6.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20260104/H-1.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20260104/H-2.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20260104/H-3.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20260104/H-4.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20260104/H-5.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20260104/H-6.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20260212/E-1.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20260212/E-2.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20260212/E-3.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20260212/E-4.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20260212/E-5.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20260212/E-6.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20260212/H-1.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20260212/H-2.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20260212/H-3.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20260212/H-4.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20260212/H-5.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20260212/H-6.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/1-1.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/1-2.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/1-3.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/1-4.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/1-5.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/10-1.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/2-1.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/2-2.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/2-3.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/2-4.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/2-5.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/2-6.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/3-1.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/3-2.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/3-3.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/3-4.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/4-1.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/4-2.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/4-3.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/4-4.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/5-1.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/5-2.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/5-3.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/5-4.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/5-5.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/6-1.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/6-2.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/6-3.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/6-4.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/7-1.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/7-2.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/7-3.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/7-4.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/7-5.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/8-1.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/8-2.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/8-3.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/8-4.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/8-5.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/9-1.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/9-2.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/9-3.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/9-4.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/9-5.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/missions.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/event/E5ADE/345/244/234/346/210/230.yaml" +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/event/H5ADE/345/244/234/346/210/230.yaml" +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/1-1.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/2-1/346/215/236/350/203/226/346/254/241.yaml" +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/5-2/347/202/270/351/261/274.yaml" +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/6-15SS.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/6-1/347/202/270/351/261/274/344/270/215/346/211/2235/351/261/274.yaml" +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/6-1/347/202/270/351/261/274/344/270/215/346/211/223/350/275/273/346/257/215.yaml" +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/6-1/347/273/203/346/275/234/350/211/207.yaml" +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/7-4/345/215/203/344/274/252.yaml" +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/7-4/345/221/250/345/270/270.yaml" +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/7-4/350/203/226/346/254/241.yaml" +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/8-1A/345/217/252/347/202/2705/346/275/234/350/211/207.yaml" +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/8-2A/345/217/252/347/202/2705/346/275/234/350/211/207.yaml" +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/8-2A/347/202/270/351/261/274.yaml" +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/8-2B.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/8-2BJ.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/8-2C/347/273/203/351/207/215/345/267/241.yaml" +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/8-3CE/347/273/203/351/207/215/345/267/241.yaml" +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/8-3C/351/261/274/351/230/237/347/273/203/347/272/247.yaml" +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/8-4-6SSweek.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/8-5AI.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/8-5AI/345/217/252/346/211/2231/351/251/261/351/200/220.yaml" +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/9-1A.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/9-1B.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/9-1BF/347/202/270/351/261/274/345/270/246/346/215/236/350/203/226/346/254/241.yaml" +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/9-1B/345/217/252/347/202/2705/346/275/234/350/211/207.yaml" +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/9-2ADGHM.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/9-2C/345/217/252/347/202/2704/346/275/234/350/211/207.yaml" +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/9-2C/347/202/270/351/261/274.yaml" +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/9-2/350/203/226/346/254/24185/345/267/245/347/250/213.yaml" +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/9-2/350/203/226/346/254/24185/346/227/240/351/227/250/347/245/236.yaml" +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/9-3AD.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/9-46SS.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/9-5A/345/244/247/350/247/222/345/272/246.yaml" +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/9-5B.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/9-5BE.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/shipnames.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/emulator/__init__.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/emulator/controller/__init__.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/emulator/detector.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/emulator/os_control/__init__.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/emulator/os_control/base.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/emulator/os_control/linux.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/emulator/os_control/macos.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/emulator/os_control/windows.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/image_resources/__init__.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/image_resources/_lazy.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/image_resources/combat.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/image_resources/keys.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/image_resources/ops.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/infra/__init__.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/infra/exceptions.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/infra/logger.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ops/README.md +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ops/__init__.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ops/build.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ops/cook.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ops/decisive/__init__.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ops/decisive/base.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ops/decisive/config.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ops/decisive/controller.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ops/decisive/handlers.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ops/decisive/logic.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ops/decisive/state.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ops/expedition.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ops/navigate.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ops/retry_plan.md +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ops/reward.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ops/startup.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/server/routes/__init__.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/server/routes/health.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/server/ws_manager.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/README.md +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/backyard_page.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/bath_page/__init__.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/bath_page/recognition.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/bath_page/signatures.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/battle/__init__.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/battle/base.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/battle/blood.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/battle/constants.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/battle/fleet_change/__init__.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/battle/preparation.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/battle/repair.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/battle/supply.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/build_page.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/canteen_page.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/decisive/__init__.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/decisive/battle_page.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/decisive/overlay.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/event/__init__.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/friend_page.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/intensify_page.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/main_page/__init__.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/main_page/constants.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/main_page/controller.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/main_page/overlays.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/map/__init__.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/map/base.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/map/data.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/map/page.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/map/panels/__init__.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/map/panels/campaign.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/map/panels/decisive.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/map/panels/exercise.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/map/panels/expedition.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/mission_page/__init__.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/mission_page/data.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/mission_page/page.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/mission_page/recognition.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/navigation.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/page.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/sidebar_page.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/start_screen_page.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/tabbed_page.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/utils/__init__.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/utils/navigation.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/vision/__init__.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/vision/image_matcher.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/vision/image_template.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/vision/matcher.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/vision/pixel.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/vision/roi.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/docs/ai-issue-analysis-bot.md +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/docs/architecture/README.md +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/docs/architecture/emulator.md +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/docs/architecture/ops.md +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/docs/architecture/scheduler-and-server.md +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/docs/architecture/ui.md +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/docs/architecture/vision.md +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/docs/developer/test_pkg.md +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/docs/logo.png +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/docs/spelling_wordlist.txt +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/docs/usage/usage_daily_ops.md +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/docs/usage/usage_decisive.md +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/docs/usage/usage_quickstart.md +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/examples/campaign.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/examples/decisive.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/examples/exercise.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/examples/expedition.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/examples/normal_fight.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/examples/usersettings.minimal.yaml +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/renovate.json +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/__init__.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/combat/__init__.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/conftest.py +0 -0
- {autowsgr-2.2.2/testing/emulator → autowsgr-2.3.0/testing/context}/__init__.py +0 -0
- {autowsgr-2.2.2/testing/infra → autowsgr-2.3.0/testing/emulator}/__init__.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/emulator/test_os_control.py +0 -0
- {autowsgr-2.2.2/testing/ui → autowsgr-2.3.0/testing/infra}/__init__.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/infra/test_exceptions.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ops/__init__.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ops/build.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ops/campaign.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ops/cook.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ops/decisive_battle.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ops/destroy.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ops/exercise.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ops/expedition.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ops/repair.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ops/reward.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ops/startup.py +0 -0
- {autowsgr-2.2.2/testing/ui/backyard_page → autowsgr-2.3.0/testing/tools}/__init__.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ui/README.md +0 -0
- {autowsgr-2.2.2/testing/ui/bath_page → autowsgr-2.3.0/testing/ui}/__init__.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ui/_framework.py +0 -0
- {autowsgr-2.2.2/testing/ui/battle_preparation → autowsgr-2.3.0/testing/ui/backyard_page}/__init__.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ui/backyard_page/e2e.py +0 -0
- {autowsgr-2.2.2/testing/ui/build_page → autowsgr-2.3.0/testing/ui/bath_page}/__init__.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ui/bath_page/e2e.py +0 -0
- {autowsgr-2.2.2/testing/ui/canteen_page → autowsgr-2.3.0/testing/ui/battle_preparation}/__init__.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ui/battle_preparation/e2e.py +0 -0
- {autowsgr-2.2.2/testing/ui/decisive_battle_page → autowsgr-2.3.0/testing/ui/build_page}/__init__.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ui/build_page/e2e.py +0 -0
- {autowsgr-2.2.2/testing/ui/event_page → autowsgr-2.3.0/testing/ui/canteen_page}/__init__.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ui/canteen_page/e2e.py +0 -0
- {autowsgr-2.2.2/testing/ui/friend_page → autowsgr-2.3.0/testing/ui/decisive_battle_page}/__init__.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ui/decisive_battle_page/e2e.py +0 -0
- {autowsgr-2.2.2/testing/ui/intensify_page → autowsgr-2.3.0/testing/ui/event_page}/__init__.py +0 -0
- {autowsgr-2.2.2/testing/ui/main_page → autowsgr-2.3.0/testing/ui/friend_page}/__init__.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ui/friend_page/e2e.py +0 -0
- {autowsgr-2.2.2/testing/ui/map_page → autowsgr-2.3.0/testing/ui/intensify_page}/__init__.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ui/intensify_page/e2e.py +0 -0
- {autowsgr-2.2.2/testing/ui/mission_page → autowsgr-2.3.0/testing/ui/main_page}/__init__.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ui/main_page/e2e.py +0 -0
- {autowsgr-2.2.2/testing/ui/page → autowsgr-2.3.0/testing/ui/map_page}/__init__.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ui/map_page/e2e.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ui/map_page/test_unit.py +0 -0
- {autowsgr-2.2.2/testing/ui/sidebar_page → autowsgr-2.3.0/testing/ui/mission_page}/__init__.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ui/mission_page/e2e.py +0 -0
- {autowsgr-2.2.2/testing/vision → autowsgr-2.3.0/testing/ui/page}/__init__.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ui/page/test_unit.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ui/run_all_e2e.ps1 +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ui/run_all_e2e.py +0 -0
- {autowsgr-2.2.2/tools → autowsgr-2.3.0/testing/ui/sidebar_page}/__init__.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ui/sidebar_page/e2e.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/vision/_helpers.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/vision/test_image_checker.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/vision/test_image_template.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/vision/test_matcher.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/vision/test_roi.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/tools/VisualIdentity.md +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/tools/benchmark_emulator.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/tools/debug_screenshot.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/tools/pixel_marker.py +0 -0
- {autowsgr-2.2.2 → autowsgr-2.3.0}/tools/update_shipnames.py +0 -0
autowsgr-2.3.0/AGENTS.md
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# Agent Guidelines
|
|
2
|
+
|
|
3
|
+
## 开发环境
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
git clone git@github.com:OpenWSGR/AutoWSGR.git
|
|
7
|
+
cd AutoWSGR
|
|
8
|
+
uv sync
|
|
9
|
+
pre-commit install
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
激活虚拟环境后可直接运行命令(无需 `uv run` 前缀):
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
source .venv/bin/activate # Linux/macOS
|
|
16
|
+
# .venv\Scripts\activate # Windows
|
|
17
|
+
pytest
|
|
18
|
+
pre-commit run --all-files
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## 代码风格
|
|
22
|
+
|
|
23
|
+
- Python 版本:3.12+
|
|
24
|
+
- 格式化与 lint:**Ruff**(已覆盖 isort / black 功能),配置见 `pyproject.toml`
|
|
25
|
+
- 目标行宽 100,单引号字符串
|
|
26
|
+
- 禁止相对导入(`ban-relative-imports = all`)
|
|
27
|
+
- 英语拼写检查:**codespell**,忽略词表见 `docs/spelling_wordlist.txt`
|
|
28
|
+
|
|
29
|
+
提交前务必运行:
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
pre-commit run --all-files
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## 测试
|
|
36
|
+
|
|
37
|
+
- 单元测试:`pytest`(测试目录 `testing/`)
|
|
38
|
+
- 功能测试:运行 `examples/` 目录中的脚本进行端到端验证
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
pytest
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## 约定式提交(Conventional Commits)
|
|
45
|
+
|
|
46
|
+
提交信息格式:
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
<type>(<scope>): <简短描述>
|
|
50
|
+
|
|
51
|
+
<正文>
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
常用类型:
|
|
55
|
+
|
|
56
|
+
- `feat`:新功能
|
|
57
|
+
- `fix`:修复
|
|
58
|
+
- `build`:构建系统或依赖变更
|
|
59
|
+
- `docs`:文档
|
|
60
|
+
- `style`:不影响代码逻辑的格式调整
|
|
61
|
+
- `refactor`:重构
|
|
62
|
+
- `test`:测试
|
|
63
|
+
|
|
64
|
+
示例:
|
|
65
|
+
|
|
66
|
+
```
|
|
67
|
+
build: migrate from setuptools to hatchling
|
|
68
|
+
|
|
69
|
+
- Replace setuptools with hatchling as build backend
|
|
70
|
+
- Remove obsolete MANIFEST.in
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## 构建与打包
|
|
74
|
+
|
|
75
|
+
- Build backend:**hatchling**
|
|
76
|
+
- 包数据(图片、YAML、JAR 等)位于 `autowsgr/data/`,由 hatchling 自动包含,无需 `MANIFEST.in`
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
uv build
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## 文档
|
|
83
|
+
|
|
84
|
+
- 用户文档地址:https://docs-autowsgr.notion.site
|
|
85
|
+
- 代码变更后同步更新文档,并鼓励在代码中编写注释和文档字符串。
|
|
86
|
+
|
|
87
|
+
## ShiinaKuroko Fork 分支管理
|
|
88
|
+
|
|
89
|
+
本仓库的个人 Fork 为 `https://github.com/ShiinaKuroko/AutoWSGR.git`。后续 Agent
|
|
90
|
+
必须遵守以下分支职责,不得自行改变分支用途:
|
|
91
|
+
|
|
92
|
+
- `main` 只用于同步 `OpenWSGR/AutoWSGR:main`,禁止在该分支直接开发、提交或推送功能代码。
|
|
93
|
+
- `ShiinaKuroko` 是个人 Fork 的最新开发分支,经过验证的最新代码才允许推送到这里。
|
|
94
|
+
- `backup/YYYYMMDD-<short-sha>` 是版本备份分支。每次更新 `ShiinaKuroko` 前,先创建一个指向更新前稳定提交的备份;完成更新后,再创建一个指向新稳定提交的备份,最多保留两个备份分支。
|
|
95
|
+
- 备份分支一旦创建不得移动、覆盖或追加提交。超过两个备份时,只删除最旧的备份分支,不删除当前备份和上一个备份。
|
|
96
|
+
- Agent 临时分支、worktree 分支和实验分支不得直接推送到 `main` 或冒充 `ShiinaKuroko`;任务完成后应删除不再需要的临时远程分支。
|
|
97
|
+
- 推送前必须确认工作树、提交范围和目标分支:`git status --short --branch`、`git diff --check`、`git log --oneline -5`。
|
|
98
|
+
- 推送最新代码前必须先创建备份,并使用 `git push --force-with-lease` 更新 `ShiinaKuroko`,禁止无条件 `--force`。
|
|
99
|
+
- 任何删除远程分支的操作都必须先列出将被删除的分支、提交和原因;禁止删除 `main`、`ShiinaKuroko` 或未明确授权的分支。
|
|
100
|
+
- 新功能必须在独立分支或 worktree 中开发,完成测试后才能合并或推送到 `ShiinaKuroko`。
|
|
101
|
+
- 本地独立开发分支只能用于编码、测试和审查,禁止直接推送到 Fork 的任何发布分支。
|
|
102
|
+
- 本地独立分支完成后,必须将已验证提交合并、cherry-pick 或 rebase 整理到本地 `ShiinaKuroko` 分支;只有本地 `ShiinaKuroko` 分支允许执行 `git push origin ShiinaKuroko`。
|
|
103
|
+
- 不得执行 `git push origin <local-feature-branch>` 作为发布流程;远程临时分支如确有协作需要,必须获得明确授权,并不得替代 `ShiinaKuroko` 发布入口。
|
|
104
|
+
- 推送前必须确认当前分支为本地 `ShiinaKuroko`,且 `git log origin/ShiinaKuroko..ShiinaKuroko` 只包含本次计划发布的提交。
|
|
105
|
+
- 后端发布至少执行 `pytest -q` 和 `git diff --check`;无法执行的检查必须在交付说明中明确记录。
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: autowsgr
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.3.0
|
|
4
4
|
Summary: Auto Warship Girls Framework.
|
|
5
5
|
Project-URL: Documentation, https://docs-autowsgr.notion.site
|
|
6
6
|
Project-URL: Repository, https://github.com/OpenWSGR/AutoWSGR
|
|
@@ -12,7 +12,7 @@ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
|
12
12
|
Classifier: Topic :: System :: Distributed Computing
|
|
13
13
|
Requires-Python: <3.14,>=3.12
|
|
14
14
|
Requires-Dist: adbutils<3.0,>=2.0
|
|
15
|
-
Requires-Dist: autowsgr-native
|
|
15
|
+
Requires-Dist: autowsgr-native==0.3.0
|
|
16
16
|
Requires-Dist: av>=12.0
|
|
17
17
|
Requires-Dist: easyocr>=1.7.1
|
|
18
18
|
Requires-Dist: fastapi>=0.100.0
|
|
@@ -1,6 +1,16 @@
|
|
|
1
1
|
"""战斗系统 — 独立于 UI 框架的战斗状态机引擎。"""
|
|
2
2
|
|
|
3
3
|
from .engine import CombatEngine, run_combat
|
|
4
|
+
from .fleet import (
|
|
5
|
+
ALLOWED_SHIP_TYPE_CODES,
|
|
6
|
+
FleetPreset,
|
|
7
|
+
FleetSelectionSource,
|
|
8
|
+
FleetSlotRule,
|
|
9
|
+
ResolvedFleetSelection,
|
|
10
|
+
ShipSelector,
|
|
11
|
+
fleet_slot_from_api,
|
|
12
|
+
resolve_fleet_selection,
|
|
13
|
+
)
|
|
4
14
|
from .history import CombatEvent, CombatHistory, CombatResult, FightResult
|
|
5
15
|
from .node_tracker import MapNodeData, NodeTracker
|
|
6
16
|
from .plan import CombatMode, CombatPlan, NodeDecision
|
|
@@ -15,6 +25,7 @@ from .state import CombatPhase
|
|
|
15
25
|
|
|
16
26
|
|
|
17
27
|
__all__ = [
|
|
28
|
+
'ALLOWED_SHIP_TYPE_CODES',
|
|
18
29
|
'SHIP_DROP_PAGE_SIGNATURE',
|
|
19
30
|
'CombatEngine',
|
|
20
31
|
'CombatEvent',
|
|
@@ -24,13 +35,20 @@ __all__ = [
|
|
|
24
35
|
'CombatPlan',
|
|
25
36
|
'CombatResult',
|
|
26
37
|
'FightResult',
|
|
38
|
+
'FleetPreset',
|
|
39
|
+
'FleetSelectionSource',
|
|
40
|
+
'FleetSlotRule',
|
|
27
41
|
'MapNodeData',
|
|
28
42
|
'NodeDecision',
|
|
29
43
|
'NodeTracker',
|
|
44
|
+
'ResolvedFleetSelection',
|
|
30
45
|
'RuleEngine',
|
|
31
46
|
'RuleResult',
|
|
32
47
|
'ShipDropResult',
|
|
48
|
+
'ShipSelector',
|
|
49
|
+
'fleet_slot_from_api',
|
|
33
50
|
'recognize_enemy_formation',
|
|
34
51
|
'recognize_ship_drop',
|
|
52
|
+
'resolve_fleet_selection',
|
|
35
53
|
'run_combat',
|
|
36
54
|
]
|
|
@@ -133,7 +133,9 @@ def click_fight_condition(device: AndroidController, condition: FightCondition)
|
|
|
133
133
|
目标战况。
|
|
134
134
|
"""
|
|
135
135
|
x, y = condition.relative_click_position
|
|
136
|
-
|
|
136
|
+
|
|
137
|
+
# 选择战况后,舰队会在地图上移动,不能添加延迟,否则会出现识别不到下一个点的问题
|
|
138
|
+
device.click(x, y, delay=False)
|
|
137
139
|
|
|
138
140
|
|
|
139
141
|
def click_night_battle(device: AndroidController, pursue: bool) -> None:
|
|
@@ -186,14 +188,19 @@ def click_speed_up(device: AndroidController, *, battle_mode: bool = False) -> N
|
|
|
186
188
|
``True`` 使用战役加速坐标,``False`` 使用常规战坐标。
|
|
187
189
|
"""
|
|
188
190
|
coords = Coords.SPEED_UP_BATTLE if battle_mode else Coords.SPEED_UP_NORMAL
|
|
189
|
-
|
|
191
|
+
|
|
192
|
+
# 由于加速过快可能导致卡顿, 增加极短延迟以确保点击生效
|
|
193
|
+
time.sleep(0.05)
|
|
194
|
+
device.click(*coords, delay=False)
|
|
190
195
|
|
|
191
196
|
|
|
192
197
|
def click_skip_missile_animation(device: AndroidController) -> None:
|
|
193
198
|
"""跳过导弹支援动画。"""
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
device.click(*Coords.SPEED_UP_BATTLE)
|
|
199
|
+
|
|
200
|
+
# 快速点击不需要增加操作后的 delay
|
|
201
|
+
device.click(*Coords.SPEED_UP_BATTLE, delay=False)
|
|
202
|
+
time.sleep(1)
|
|
203
|
+
device.click(*Coords.SPEED_UP_BATTLE, delay=False)
|
|
197
204
|
|
|
198
205
|
|
|
199
206
|
# ═══════════════════════════════════════════════════════════════════════════════
|
|
@@ -298,7 +305,7 @@ def click_image(device: AndroidController, template_key: TemplateKey, timeout: f
|
|
|
298
305
|
return False
|
|
299
306
|
|
|
300
307
|
|
|
301
|
-
def get_ship_drop(device: AndroidController) -> str | None:
|
|
308
|
+
def get_ship_drop(device: AndroidController, ocr: OCREngine) -> str | None:
|
|
302
309
|
"""获取掉落舰船名称。
|
|
303
310
|
|
|
304
311
|
Parameters
|
|
@@ -311,10 +318,8 @@ def get_ship_drop(device: AndroidController) -> str | None:
|
|
|
311
318
|
str | None
|
|
312
319
|
掉落的舰船名称,或 ``None`` 如果未获取到。
|
|
313
320
|
"""
|
|
314
|
-
from autowsgr.vision import EasyOCREngine
|
|
315
321
|
|
|
316
322
|
screen = device.screenshot()
|
|
317
|
-
ocr = EasyOCREngine.create(gpu=False)
|
|
318
323
|
result = recognize_ship_drop(screen, ocr)
|
|
319
324
|
if result.ship_name:
|
|
320
325
|
_log.info('[Combat] 掉落识别: {} ({})', result.ship_name, result.ship_type or '未知')
|
|
@@ -420,7 +425,9 @@ def dismiss_resource_confirm(device: AndroidController, screen: ndarray) -> None
|
|
|
420
425
|
)
|
|
421
426
|
if detail is not None:
|
|
422
427
|
time.sleep(0.25)
|
|
423
|
-
|
|
428
|
+
|
|
429
|
+
# 由于在地图移动的过程中,点击后必须立刻获取当前画面,因此不能加延迟
|
|
430
|
+
device.click(*detail.center, delay=False)
|
|
424
431
|
_log.info(
|
|
425
432
|
"[Combat] 点掉资源确认弹窗: '{}' ({:.4f}, {:.4f})",
|
|
426
433
|
detail.template_name,
|
|
@@ -126,7 +126,12 @@ class CombatEngine(PhaseHandlersMixin):
|
|
|
126
126
|
plan.map_id,
|
|
127
127
|
)
|
|
128
128
|
elif plan.mode == CombatMode.EVENT and plan.event_name:
|
|
129
|
-
map_data = MapNodeData.load_event(
|
|
129
|
+
map_data = MapNodeData.load_event(
|
|
130
|
+
plan.event_name,
|
|
131
|
+
plan.chapter,
|
|
132
|
+
plan.map_id,
|
|
133
|
+
plan.entrance,
|
|
134
|
+
)
|
|
130
135
|
if map_data is not None:
|
|
131
136
|
self._tracker = NodeTracker(map_data)
|
|
132
137
|
_log.info(
|
|
@@ -0,0 +1,434 @@
|
|
|
1
|
+
"""舰队规则领域模型和入口转换。
|
|
2
|
+
|
|
3
|
+
YAML 与 HTTP 请求只在各自入口转换一次。执行器和 UI 只接收本模块定义的
|
|
4
|
+
不可变对象,不再解释字典、Pydantic DTO 或旧 candidates 字符串格式。
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from collections.abc import Mapping, Sequence
|
|
10
|
+
from dataclasses import dataclass
|
|
11
|
+
from enum import StrEnum
|
|
12
|
+
from types import MappingProxyType
|
|
13
|
+
from typing import TYPE_CHECKING, Any
|
|
14
|
+
|
|
15
|
+
from autowsgr.contracts.vessel_types import (
|
|
16
|
+
FLEET_VESSEL_TYPE_BY_CODE,
|
|
17
|
+
FLEET_VESSEL_TYPES,
|
|
18
|
+
)
|
|
19
|
+
from autowsgr.types import ShipType
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
if TYPE_CHECKING:
|
|
23
|
+
from autowsgr_native.vessel_type import VesselType
|
|
24
|
+
|
|
25
|
+
from autowsgr.combat.plan import CombatPlan
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
NATIVE_FLEET_VESSEL_TYPES = tuple(vessel_type.native for vessel_type in FLEET_VESSEL_TYPES)
|
|
29
|
+
"""由公共 native 契约提供的普通舰种。"""
|
|
30
|
+
|
|
31
|
+
_NATIVE_CODE_TO_SHIP_TYPE: Mapping[str, ShipType] = MappingProxyType(
|
|
32
|
+
{
|
|
33
|
+
'cv': ShipType.CV,
|
|
34
|
+
'cvl': ShipType.CVL,
|
|
35
|
+
'av': ShipType.AV,
|
|
36
|
+
'bb': ShipType.BB,
|
|
37
|
+
'bbv': ShipType.BBV,
|
|
38
|
+
'bc': ShipType.BC,
|
|
39
|
+
'ca': ShipType.CA,
|
|
40
|
+
'cav': ShipType.CAV,
|
|
41
|
+
'clt': ShipType.CLT,
|
|
42
|
+
'cl': ShipType.CL,
|
|
43
|
+
'bm': ShipType.BM,
|
|
44
|
+
'dd': ShipType.DD,
|
|
45
|
+
'ssg': ShipType.SSG,
|
|
46
|
+
'ss': ShipType.SS,
|
|
47
|
+
'sc': ShipType.SC,
|
|
48
|
+
'ap': ShipType.NAP,
|
|
49
|
+
'asdg': ShipType.ASDG,
|
|
50
|
+
'aadg': ShipType.AADG,
|
|
51
|
+
'kp': ShipType.KP,
|
|
52
|
+
'cg': ShipType.CG,
|
|
53
|
+
'bbg': ShipType.BG,
|
|
54
|
+
'bg': ShipType.CBG,
|
|
55
|
+
},
|
|
56
|
+
)
|
|
57
|
+
"""native 0.3 舰种代码到 AutoWSGR 领域枚举的显式映射。"""
|
|
58
|
+
|
|
59
|
+
VESSEL_TYPE_TO_SHIP_TYPE: tuple[tuple[VesselType, ShipType], ...] = tuple(
|
|
60
|
+
(vessel_type.native, _NATIVE_CODE_TO_SHIP_TYPE[vessel_type.code])
|
|
61
|
+
for vessel_type in FLEET_VESSEL_TYPES
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
for _native_type, _ship_type in VESSEL_TYPE_TO_SHIP_TYPE:
|
|
65
|
+
if _native_type.as_chinese() != _ship_type.value:
|
|
66
|
+
raise RuntimeError(
|
|
67
|
+
f'native 舰种中文语义不一致: {_native_type.as_english()}',
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def ship_type_from_native(vessel_type: VesselType) -> ShipType:
|
|
72
|
+
"""把 native 普通舰种转换为 AutoWSGR 领域枚举。"""
|
|
73
|
+
for native_type, ship_type in VESSEL_TYPE_TO_SHIP_TYPE:
|
|
74
|
+
if vessel_type == native_type:
|
|
75
|
+
return ship_type
|
|
76
|
+
message = f'不支持的 native 舰种: {vessel_type!r}'
|
|
77
|
+
raise ValueError(message)
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
NATIVE_VESSEL_TYPE_BY_CODE: Mapping[str, VesselType] = MappingProxyType(
|
|
81
|
+
{code: vessel_type.native for code, vessel_type in FLEET_VESSEL_TYPE_BY_CODE.items()},
|
|
82
|
+
)
|
|
83
|
+
"""API 使用的 native 0.3 canonical 舰种代码。"""
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
SHIP_TYPE_BY_CODE: Mapping[str, tuple[ShipType, ...]] = MappingProxyType(
|
|
87
|
+
{
|
|
88
|
+
**{
|
|
89
|
+
code: (ship_type_from_native(vessel_type),)
|
|
90
|
+
for code, vessel_type in NATIVE_VESSEL_TYPE_BY_CODE.items()
|
|
91
|
+
},
|
|
92
|
+
'ss_or_ssg': (ShipType.SS, ShipType.SSG),
|
|
93
|
+
},
|
|
94
|
+
)
|
|
95
|
+
"""API 舰种代码到后端领域枚举的唯一映射。"""
|
|
96
|
+
|
|
97
|
+
LEGACY_SHIP_TYPE_ALIASES: Mapping[str, str] = MappingProxyType(
|
|
98
|
+
{
|
|
99
|
+
'cf': 'cv',
|
|
100
|
+
'cgaa': 'cg',
|
|
101
|
+
'cbg': 'bg',
|
|
102
|
+
'ddg': 'asdg',
|
|
103
|
+
'ddgaa': 'aadg',
|
|
104
|
+
},
|
|
105
|
+
)
|
|
106
|
+
"""旧版 API/GUI 舰种代码到 canonical code 的兼容映射。"""
|
|
107
|
+
|
|
108
|
+
_ALL_SHIP_TYPE_CODES = {
|
|
109
|
+
*SHIP_TYPE_BY_CODE,
|
|
110
|
+
*LEGACY_SHIP_TYPE_ALIASES,
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
ALLOWED_SHIP_TYPE_CODES = frozenset(_ALL_SHIP_TYPE_CODES)
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def parse_ship_type_codes(raw: object) -> tuple[ShipType, ...]:
|
|
117
|
+
"""校验舰种缩写并转换为去重后的领域枚举。"""
|
|
118
|
+
if raw is None or raw == '':
|
|
119
|
+
return ()
|
|
120
|
+
values = [raw] if isinstance(raw, str) else raw
|
|
121
|
+
if not isinstance(values, Sequence):
|
|
122
|
+
raise TypeError('ship_type 必须是非空字符串列表')
|
|
123
|
+
|
|
124
|
+
result: list[ShipType] = []
|
|
125
|
+
for value in values:
|
|
126
|
+
if not isinstance(value, str) or not value.strip():
|
|
127
|
+
raise ValueError('ship_type 必须是非空字符串列表')
|
|
128
|
+
code = value.strip().lower()
|
|
129
|
+
canonical_code = LEGACY_SHIP_TYPE_ALIASES.get(code, code)
|
|
130
|
+
ship_types = SHIP_TYPE_BY_CODE.get(canonical_code)
|
|
131
|
+
if ship_types is None:
|
|
132
|
+
allowed = ', '.join(sorted(ALLOWED_SHIP_TYPE_CODES))
|
|
133
|
+
raise ValueError(f'ship_type 不合法: {value!r}, 可选值: {allowed}')
|
|
134
|
+
for ship_type in ship_types:
|
|
135
|
+
if ship_type not in result:
|
|
136
|
+
result.append(ship_type)
|
|
137
|
+
return tuple(result)
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
@dataclass(frozen=True, slots=True)
|
|
141
|
+
class ShipSelector:
|
|
142
|
+
"""一艘主选或备选舰船的完整选择规则。"""
|
|
143
|
+
|
|
144
|
+
name: str
|
|
145
|
+
search_name: str | None = None
|
|
146
|
+
ship_types: tuple[ShipType, ...] = ()
|
|
147
|
+
min_level: int | None = None
|
|
148
|
+
max_level: int | None = None
|
|
149
|
+
relaxed_constraints: bool = False
|
|
150
|
+
|
|
151
|
+
def __post_init__(self) -> None:
|
|
152
|
+
name = self.name.strip()
|
|
153
|
+
if not name:
|
|
154
|
+
raise ValueError('name 不能为空')
|
|
155
|
+
object.__setattr__(self, 'name', name)
|
|
156
|
+
|
|
157
|
+
search_name = self.search_name.strip() if self.search_name else None
|
|
158
|
+
object.__setattr__(self, 'search_name', search_name)
|
|
159
|
+
if self.min_level is not None and self.min_level < 1:
|
|
160
|
+
raise ValueError('min_level 必须大于等于 1')
|
|
161
|
+
if self.max_level is not None and self.max_level < 1:
|
|
162
|
+
raise ValueError('max_level 必须大于等于 1')
|
|
163
|
+
if (
|
|
164
|
+
self.min_level is not None
|
|
165
|
+
and self.max_level is not None
|
|
166
|
+
and self.max_level < self.min_level
|
|
167
|
+
):
|
|
168
|
+
raise ValueError('max_level 必须大于或等于 min_level')
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
@dataclass(frozen=True, slots=True)
|
|
172
|
+
class FleetSlotRule:
|
|
173
|
+
"""一个舰队槽位的严格主选和有序宽泛备选。"""
|
|
174
|
+
|
|
175
|
+
primary: ShipSelector | None = None
|
|
176
|
+
candidates: tuple[ShipSelector, ...] = ()
|
|
177
|
+
|
|
178
|
+
def __post_init__(self) -> None:
|
|
179
|
+
if self.primary is None and not self.candidates:
|
|
180
|
+
raise ValueError('位置至少需要一艘主选或备选舰船')
|
|
181
|
+
|
|
182
|
+
@property
|
|
183
|
+
def options(self) -> tuple[ShipSelector, ...]:
|
|
184
|
+
"""返回智能编队按顺序尝试的完整规则。"""
|
|
185
|
+
if self.primary is None:
|
|
186
|
+
return self.candidates
|
|
187
|
+
return (self.primary, *self.candidates)
|
|
188
|
+
|
|
189
|
+
@property
|
|
190
|
+
def preferred_name(self) -> str:
|
|
191
|
+
"""返回集合分配开始时使用的首个舰名。"""
|
|
192
|
+
return self.options[0].name
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
@dataclass(frozen=True, slots=True)
|
|
196
|
+
class FleetPreset:
|
|
197
|
+
"""YAML 中一套已经完成入口转换的舰队预设。"""
|
|
198
|
+
|
|
199
|
+
name: str
|
|
200
|
+
slots: tuple[FleetSlotRule, ...]
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
class FleetSelectionSource(StrEnum):
|
|
204
|
+
"""最终舰队选择的数据来源。"""
|
|
205
|
+
|
|
206
|
+
OVERRIDE_RULES = 'override_rules'
|
|
207
|
+
OVERRIDE_FLEET = 'override_fleet'
|
|
208
|
+
PLAN_PRESET = 'plan_preset'
|
|
209
|
+
PLAN_FLEET = 'plan_fleet'
|
|
210
|
+
NONE = 'none'
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
@dataclass(frozen=True, slots=True)
|
|
214
|
+
class ResolvedFleetSelection:
|
|
215
|
+
"""runner 启动前确定的唯一舰队选择结果。"""
|
|
216
|
+
|
|
217
|
+
fleet_id: int
|
|
218
|
+
slot_rules: tuple[FleetSlotRule, ...] | None
|
|
219
|
+
plain_fleet: tuple[str, ...] | None
|
|
220
|
+
source: FleetSelectionSource
|
|
221
|
+
|
|
222
|
+
@property
|
|
223
|
+
def primary_names(self) -> list[str | None] | None:
|
|
224
|
+
"""返回战斗记录可使用的显式主选舰名。"""
|
|
225
|
+
if self.slot_rules is not None:
|
|
226
|
+
return [
|
|
227
|
+
rule.primary.name if rule.primary is not None else None
|
|
228
|
+
for rule in self.slot_rules[:6]
|
|
229
|
+
]
|
|
230
|
+
return list(self.plain_fleet) if self.plain_fleet is not None else None
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
def _optional_text(value: object) -> str | None:
|
|
234
|
+
if value is None:
|
|
235
|
+
return None
|
|
236
|
+
if not isinstance(value, str):
|
|
237
|
+
raise TypeError('舰船名称必须是字符串')
|
|
238
|
+
return value.strip() or None
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
def _optional_level(rule: Mapping[str, Any], field: str) -> int | None:
|
|
242
|
+
value = rule.get(field)
|
|
243
|
+
if value is None:
|
|
244
|
+
return None
|
|
245
|
+
if not isinstance(value, int) or isinstance(value, bool):
|
|
246
|
+
raise TypeError(f'{field} 必须是整数')
|
|
247
|
+
return value
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
def _selector_from_mapping(
|
|
251
|
+
raw: Mapping[str, Any],
|
|
252
|
+
*,
|
|
253
|
+
relaxed: bool,
|
|
254
|
+
inherited: Mapping[str, Any] | None = None,
|
|
255
|
+
) -> ShipSelector:
|
|
256
|
+
name = _optional_text(raw.get('name'))
|
|
257
|
+
if name is None:
|
|
258
|
+
raise ValueError('name 不能为空')
|
|
259
|
+
source = raw if inherited is None else inherited
|
|
260
|
+
inherited_search_name = inherited.get('search_name') if inherited is not None else None
|
|
261
|
+
return ShipSelector(
|
|
262
|
+
name=name,
|
|
263
|
+
search_name=_optional_text(raw.get('search_name', inherited_search_name)),
|
|
264
|
+
ship_types=parse_ship_type_codes(source.get('ship_type')),
|
|
265
|
+
min_level=_optional_level(source, 'min_level'),
|
|
266
|
+
max_level=_optional_level(source, 'max_level'),
|
|
267
|
+
relaxed_constraints=relaxed,
|
|
268
|
+
)
|
|
269
|
+
|
|
270
|
+
|
|
271
|
+
def _deduplicate_selectors(selectors: Sequence[ShipSelector]) -> tuple[ShipSelector, ...]:
|
|
272
|
+
"""按完整规则去重,保留同名但约束不同的有序候选。"""
|
|
273
|
+
result: list[ShipSelector] = []
|
|
274
|
+
for selector in selectors:
|
|
275
|
+
if selector not in result:
|
|
276
|
+
result.append(selector)
|
|
277
|
+
return tuple(result)
|
|
278
|
+
|
|
279
|
+
|
|
280
|
+
def fleet_slot_from_api(raw: str | Mapping[str, Any]) -> FleetSlotRule:
|
|
281
|
+
"""把已经通过 HTTP schema 的槽位转换成 canonical 规则。"""
|
|
282
|
+
if isinstance(raw, str):
|
|
283
|
+
return FleetSlotRule(primary=ShipSelector(name=raw))
|
|
284
|
+
if not isinstance(raw, Mapping):
|
|
285
|
+
raise TypeError('舰队槽位必须是字符串或规则对象')
|
|
286
|
+
|
|
287
|
+
name = _optional_text(raw.get('name'))
|
|
288
|
+
primary = _selector_from_mapping(raw, relaxed=False) if name is not None else None
|
|
289
|
+
raw_candidates = raw.get('candidates', [])
|
|
290
|
+
if not isinstance(raw_candidates, Sequence) or isinstance(raw_candidates, str):
|
|
291
|
+
raise TypeError('candidates 必须是规则对象列表')
|
|
292
|
+
candidates = _deduplicate_selectors(
|
|
293
|
+
tuple(
|
|
294
|
+
ShipSelector(
|
|
295
|
+
name=candidate,
|
|
296
|
+
search_name=_optional_text(raw.get('search_name')),
|
|
297
|
+
ship_types=parse_ship_type_codes(raw.get('ship_type')),
|
|
298
|
+
min_level=_optional_level(raw, 'min_level'),
|
|
299
|
+
max_level=_optional_level(raw, 'max_level'),
|
|
300
|
+
)
|
|
301
|
+
if isinstance(candidate, str)
|
|
302
|
+
else _selector_from_mapping(candidate, relaxed=False)
|
|
303
|
+
for candidate in raw_candidates
|
|
304
|
+
)
|
|
305
|
+
)
|
|
306
|
+
return FleetSlotRule(primary=primary, candidates=candidates)
|
|
307
|
+
|
|
308
|
+
|
|
309
|
+
def fleet_slot_from_yaml(raw: object) -> FleetSlotRule:
|
|
310
|
+
"""把 YAML 槽位转换成 canonical 规则,并仅在此兼容旧字符串候选。"""
|
|
311
|
+
if isinstance(raw, str):
|
|
312
|
+
return FleetSlotRule(primary=ShipSelector(name=raw))
|
|
313
|
+
if not isinstance(raw, Mapping):
|
|
314
|
+
raise TypeError('舰队槽位必须是字符串或规则对象')
|
|
315
|
+
|
|
316
|
+
raw_candidates = raw.get('candidates', [])
|
|
317
|
+
if not isinstance(raw_candidates, Sequence) or isinstance(raw_candidates, str):
|
|
318
|
+
raise TypeError('candidates 必须是列表')
|
|
319
|
+
candidates = list(raw_candidates)
|
|
320
|
+
|
|
321
|
+
primary: ShipSelector | None = None
|
|
322
|
+
if _optional_text(raw.get('name')) is not None:
|
|
323
|
+
primary = _selector_from_mapping(raw, relaxed=False)
|
|
324
|
+
normalized_candidates: list[ShipSelector] = []
|
|
325
|
+
for candidate in candidates:
|
|
326
|
+
if isinstance(candidate, str):
|
|
327
|
+
selector = _selector_from_mapping(
|
|
328
|
+
{'name': candidate},
|
|
329
|
+
relaxed=False,
|
|
330
|
+
inherited=raw,
|
|
331
|
+
)
|
|
332
|
+
elif isinstance(candidate, Mapping):
|
|
333
|
+
selector = _selector_from_mapping(candidate, relaxed=False)
|
|
334
|
+
else:
|
|
335
|
+
raise TypeError('candidates 只能包含舰名字符串或规则对象')
|
|
336
|
+
normalized_candidates.append(selector)
|
|
337
|
+
return FleetSlotRule(
|
|
338
|
+
primary=primary,
|
|
339
|
+
candidates=_deduplicate_selectors(normalized_candidates),
|
|
340
|
+
)
|
|
341
|
+
|
|
342
|
+
|
|
343
|
+
def fleet_presets_from_yaml(raw: object) -> tuple[FleetPreset, ...] | None:
|
|
344
|
+
"""解析 YAML 的舰队预设列表。"""
|
|
345
|
+
if raw is None:
|
|
346
|
+
return None
|
|
347
|
+
if not isinstance(raw, list):
|
|
348
|
+
raise TypeError('fleet_presets 必须是列表')
|
|
349
|
+
|
|
350
|
+
presets: list[FleetPreset] = []
|
|
351
|
+
for raw_preset in raw:
|
|
352
|
+
if not isinstance(raw_preset, Mapping):
|
|
353
|
+
raise TypeError('fleet_presets 每一项必须是对象')
|
|
354
|
+
name = _optional_text(raw_preset.get('name')) or ''
|
|
355
|
+
raw_slots = raw_preset.get('ships')
|
|
356
|
+
if not isinstance(raw_slots, list):
|
|
357
|
+
raise TypeError('fleet_presets.ships 必须是非空列表')
|
|
358
|
+
if not raw_slots:
|
|
359
|
+
raise ValueError('fleet_presets 不能包含空 ships')
|
|
360
|
+
presets.append(
|
|
361
|
+
FleetPreset(
|
|
362
|
+
name=name,
|
|
363
|
+
slots=tuple(fleet_slot_from_yaml(slot) for slot in raw_slots),
|
|
364
|
+
),
|
|
365
|
+
)
|
|
366
|
+
return tuple(presets)
|
|
367
|
+
|
|
368
|
+
|
|
369
|
+
def exact_fleet_rules(names: Sequence[str]) -> tuple[FleetSlotRule, ...]:
|
|
370
|
+
"""把普通舰名列表转换成精确槽位规则。"""
|
|
371
|
+
return tuple(FleetSlotRule(primary=ShipSelector(name=name)) for name in names)
|
|
372
|
+
|
|
373
|
+
|
|
374
|
+
def resolve_fleet_selection(
|
|
375
|
+
plan: CombatPlan,
|
|
376
|
+
*,
|
|
377
|
+
fleet_id: int | None = None,
|
|
378
|
+
fleet: Sequence[str] | None = None,
|
|
379
|
+
slot_rules: Sequence[FleetSlotRule] | None = None,
|
|
380
|
+
) -> ResolvedFleetSelection:
|
|
381
|
+
"""按 override rules > override fleet > plan preset > plan fleet 集中解析。"""
|
|
382
|
+
if fleet is not None and len(fleet) == 0:
|
|
383
|
+
raise ValueError('fleet 不能为空')
|
|
384
|
+
if slot_rules is not None and len(slot_rules) == 0:
|
|
385
|
+
raise ValueError('fleet_rules 不能为空')
|
|
386
|
+
resolved_id = fleet_id if fleet_id is not None else plan.fleet_id
|
|
387
|
+
if slot_rules is not None:
|
|
388
|
+
return ResolvedFleetSelection(
|
|
389
|
+
fleet_id=resolved_id,
|
|
390
|
+
slot_rules=tuple(slot_rules),
|
|
391
|
+
plain_fleet=None,
|
|
392
|
+
source=FleetSelectionSource.OVERRIDE_RULES,
|
|
393
|
+
)
|
|
394
|
+
if fleet is not None:
|
|
395
|
+
return ResolvedFleetSelection(
|
|
396
|
+
fleet_id=resolved_id,
|
|
397
|
+
slot_rules=None,
|
|
398
|
+
plain_fleet=tuple(fleet),
|
|
399
|
+
source=FleetSelectionSource.OVERRIDE_FLEET,
|
|
400
|
+
)
|
|
401
|
+
if plan.fleet_presets:
|
|
402
|
+
return ResolvedFleetSelection(
|
|
403
|
+
fleet_id=resolved_id,
|
|
404
|
+
slot_rules=plan.fleet_presets[0].slots,
|
|
405
|
+
plain_fleet=None,
|
|
406
|
+
source=FleetSelectionSource.PLAN_PRESET,
|
|
407
|
+
)
|
|
408
|
+
if plan.fleet is not None:
|
|
409
|
+
return ResolvedFleetSelection(
|
|
410
|
+
fleet_id=resolved_id,
|
|
411
|
+
slot_rules=None,
|
|
412
|
+
plain_fleet=tuple(plan.fleet),
|
|
413
|
+
source=FleetSelectionSource.PLAN_FLEET,
|
|
414
|
+
)
|
|
415
|
+
return ResolvedFleetSelection(
|
|
416
|
+
fleet_id=resolved_id,
|
|
417
|
+
slot_rules=None,
|
|
418
|
+
plain_fleet=None,
|
|
419
|
+
source=FleetSelectionSource.NONE,
|
|
420
|
+
)
|
|
421
|
+
|
|
422
|
+
|
|
423
|
+
def validate_fleet_selection_arguments(
|
|
424
|
+
fleet_selection: ResolvedFleetSelection | None,
|
|
425
|
+
*,
|
|
426
|
+
fleet_id: int | None,
|
|
427
|
+
fleet: Sequence[str] | None,
|
|
428
|
+
slot_rules: Sequence[FleetSlotRule] | None,
|
|
429
|
+
) -> None:
|
|
430
|
+
"""拒绝同时提供 canonical selection 和旧式舰队 override。"""
|
|
431
|
+
if fleet_selection is not None and any(
|
|
432
|
+
value is not None for value in (fleet_id, fleet, slot_rules)
|
|
433
|
+
):
|
|
434
|
+
raise ValueError('fleet_selection 不能同时传入 fleet_id、fleet 或 fleet_rules')
|