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.
Files changed (725) hide show
  1. autowsgr-2.3.0/AGENTS.md +105 -0
  2. {autowsgr-2.2.2 → autowsgr-2.3.0}/PKG-INFO +2 -2
  3. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/__init__.py +1 -1
  4. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/combat/__init__.py +18 -0
  5. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/combat/actions.py +16 -9
  6. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/combat/engine.py +6 -1
  7. autowsgr-2.3.0/autowsgr/combat/fleet.py +434 -0
  8. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/combat/handlers.py +1 -1
  9. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/combat/node_tracker.py +78 -9
  10. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/combat/plan.py +46 -1
  11. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/combat/recognizer.py +33 -16
  12. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/combat/rules.py +35 -11
  13. autowsgr-2.3.0/autowsgr/constants/__init__.py +28 -0
  14. autowsgr-2.3.0/autowsgr/constants/shipnames.py +152 -0
  15. autowsgr-2.3.0/autowsgr/context/bathroom.py +88 -0
  16. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/context/game_context.py +43 -0
  17. autowsgr-2.3.0/autowsgr/contracts/__init__.py +1 -0
  18. autowsgr-2.3.0/autowsgr/contracts/vessel_types.py +92 -0
  19. autowsgr-2.3.0/autowsgr/data/images/event/difficulty_easy_540p_1.png +0 -0
  20. autowsgr-2.3.0/autowsgr/data/images/event/difficulty_easy_540p_2.png +0 -0
  21. autowsgr-2.3.0/autowsgr/data/images/event/difficulty_hard_540p_1.png +0 -0
  22. autowsgr-2.3.0/autowsgr/data/images/event/difficulty_hard_540p_2.png +0 -0
  23. autowsgr-2.3.0/autowsgr/data/images/event/event_icon_20260730_540p.png +0 -0
  24. autowsgr-2.3.0/autowsgr/data/images/event/event_title_20260730_540p.png +0 -0
  25. autowsgr-2.3.0/autowsgr/data/images/event/fight_button_20260730_540p.png +0 -0
  26. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/decisive_battle/enemy_spec.yaml +9 -9
  27. 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
  28. 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
  29. 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
  30. 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
  31. 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
  32. 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
  33. 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
  34. 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
  35. 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
  36. 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
  37. 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
  38. 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
  39. 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
  40. 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
  41. 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
  42. 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
  43. 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
  44. 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
  45. autowsgr-2.3.0/autowsgr/data/plan/event/E1/347/202/270/351/261/274.yaml +9 -0
  46. autowsgr-2.3.0/autowsgr/data/plan/event/E5/345/244/234/346/210/230.yaml +17 -0
  47. autowsgr-2.3.0/autowsgr/data/plan/event/H1/347/202/270/351/261/274.yaml +9 -0
  48. autowsgr-2.3.0/autowsgr/data/plan/event/H5/345/244/234/346/210/230.yaml +17 -0
  49. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/1/345/221/250/345/270/270.yaml +1 -1
  50. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/2/345/221/250/345/270/270.yaml +1 -1
  51. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/3/345/221/250/345/270/270.yaml +1 -1
  52. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/4/345/221/250/345/270/270.yaml +3 -2
  53. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/5/345/221/250/345/270/270.yaml +3 -2
  54. 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
  55. 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
  56. 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
  57. 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
  58. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/6/345/221/250/345/270/270.yaml +3 -2
  59. 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
  60. 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
  61. 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
  62. 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
  63. {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
  64. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/7/345/221/250/345/270/270.yaml +3 -2
  65. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/8/345/221/250/345/270/270.yaml +3 -2
  66. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/9-4/345/221/250/345/270/270.yaml +2 -1
  67. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/9/345/221/250/345/270/270.yaml +1 -1
  68. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/emulator/controller/protocol.py +3 -1
  69. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/emulator/controller/scrcpy.py +274 -28
  70. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/infra/config.py +174 -39
  71. autowsgr-2.3.0/autowsgr/infra/config_compat.py +280 -0
  72. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/infra/file_utils.py +43 -19
  73. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ops/campaign.py +30 -0
  74. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ops/decisive/chapter.py +4 -5
  75. autowsgr-2.3.0/autowsgr/ops/destroy.py +94 -0
  76. autowsgr-2.3.0/autowsgr/ops/event_fight.py +216 -0
  77. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ops/exercise.py +28 -1
  78. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ops/normal_fight.py +152 -82
  79. autowsgr-2.3.0/autowsgr/ops/repair.py +152 -0
  80. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/scheduler/__init__.py +13 -1
  81. autowsgr-2.3.0/autowsgr/scheduler/daily_plan.py +273 -0
  82. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/scheduler/launcher.py +32 -5
  83. autowsgr-2.3.0/autowsgr/scheduler/scheduler.py +509 -0
  84. autowsgr-2.3.0/autowsgr/scheduler/triggers.py +396 -0
  85. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/server/__init__.py +4 -0
  86. autowsgr-2.3.0/autowsgr/server/device_lease.py +81 -0
  87. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/server/main.py +3 -0
  88. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/server/routes/game.py +2 -4
  89. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/server/routes/ops.py +12 -29
  90. autowsgr-2.3.0/autowsgr/server/routes/system.py +124 -0
  91. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/server/routes/task.py +76 -61
  92. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/server/schemas.py +121 -46
  93. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/server/serializers.py +62 -13
  94. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/server/task_manager.py +86 -11
  95. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/types.py +13 -11
  96. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/__init__.py +5 -1
  97. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/bath_page/page.py +66 -0
  98. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/battle/detection.py +2 -2
  99. autowsgr-2.3.0/autowsgr/ui/battle/fleet_change/_change.py +1109 -0
  100. autowsgr-2.3.0/autowsgr/ui/battle/fleet_change/_detect.py +218 -0
  101. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/battle/fleet_change.py +4 -6
  102. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/choose_ship_page.py +85 -152
  103. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/decisive/fleet_ocr.py +0 -1
  104. autowsgr-2.3.0/autowsgr/ui/decisive/legacy_fleet_change.py +96 -0
  105. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/decisive/map_controller.py +2 -1
  106. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/decisive/preparation.py +15 -0
  107. autowsgr-2.3.0/autowsgr/ui/event/event_page.py +425 -0
  108. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/main_page/event_nav.py +13 -2
  109. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/map/panels/sortie.py +3 -3
  110. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/utils/ship_list.py +91 -58
  111. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/vision/api_dll.py +5 -5
  112. autowsgr-2.3.0/autowsgr/vision/easyocr_models_checker.py +71 -0
  113. autowsgr-2.3.0/autowsgr/vision/easyocr_models_cli.py +393 -0
  114. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/vision/ocr.py +155 -47
  115. autowsgr-2.3.0/autowsgr/vision/ocr_rules.py +157 -0
  116. {autowsgr-2.2.2 → autowsgr-2.3.0}/docs/architecture/combat-engine.md +5 -4
  117. {autowsgr-2.2.2 → autowsgr-2.3.0}/docs/architecture/context-and-config.md +3 -4
  118. {autowsgr-2.2.2 → autowsgr-2.3.0}/docs/architecture/infra.md +0 -1
  119. autowsgr-2.3.0/docs/features/decisive-optimization.md +62 -0
  120. autowsgr-2.3.0/docs/features/ocr-ship-name-reliability.md +78 -0
  121. {autowsgr-2.2.2 → autowsgr-2.3.0}/docs/usage/usage_combat.md +59 -15
  122. autowsgr-2.3.0/examples/auto_daily.py +117 -0
  123. {autowsgr-2.2.2 → autowsgr-2.3.0}/examples/change_fleet.py +2 -1
  124. autowsgr-2.3.0/examples/event_fight.py +22 -0
  125. {autowsgr-2.2.2 → autowsgr-2.3.0}/examples/usersettings.full.yaml +26 -16
  126. {autowsgr-2.2.2 → autowsgr-2.3.0}/examples/week.py +2 -1
  127. {autowsgr-2.2.2 → autowsgr-2.3.0}/pyproject.toml +2 -2
  128. {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/combat/test_combat.py +429 -2
  129. autowsgr-2.3.0/testing/context/test_bathroom.py +97 -0
  130. autowsgr-2.3.0/testing/emulator/test_controller.py +227 -0
  131. autowsgr-2.3.0/testing/infra/test_config.py +558 -0
  132. {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/infra/test_file_utils.py +62 -0
  133. {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ops/_framework.py +1 -1
  134. {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ops/event_fight.py +2 -0
  135. {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ops/normal_fight.py +3 -1
  136. {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ops/scheduler.py +7 -1
  137. autowsgr-2.3.0/testing/ops/test_destroy_unit.py +101 -0
  138. autowsgr-2.3.0/testing/ops/test_normal_fight_unit.py +455 -0
  139. autowsgr-2.3.0/testing/ops/test_repair_unit.py +127 -0
  140. autowsgr-2.3.0/testing/ops/test_scheduler_unit.py +474 -0
  141. autowsgr-2.3.0/testing/server/__init__.py +1 -0
  142. autowsgr-2.3.0/testing/server/test_device_lease.py +72 -0
  143. autowsgr-2.3.0/testing/server/test_device_routes.py +53 -0
  144. autowsgr-2.3.0/testing/server/test_system_routes.py +246 -0
  145. autowsgr-2.3.0/testing/server/test_task_manager.py +417 -0
  146. autowsgr-2.3.0/testing/server/test_task_routes.py +479 -0
  147. autowsgr-2.3.0/testing/test_server_schemas.py +419 -0
  148. autowsgr-2.3.0/testing/test_vessel_type_contract.py +28 -0
  149. autowsgr-2.3.0/testing/tools/test_migrate_config.py +137 -0
  150. autowsgr-2.3.0/testing/ui/battle_preparation/test_unit.py +1597 -0
  151. {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ui/event_page/e2e.py +0 -9
  152. autowsgr-2.3.0/testing/ui/test_choose_ship_page.py +200 -0
  153. autowsgr-2.3.0/testing/ui/test_ship_list.py +174 -0
  154. autowsgr-2.3.0/testing/vision/__init__.py +0 -0
  155. {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/vision/test_ocr.py +216 -0
  156. autowsgr-2.3.0/tools/__init__.py +0 -0
  157. autowsgr-2.3.0/tools/migrate_config.py +260 -0
  158. {autowsgr-2.2.2 → autowsgr-2.3.0}/usersettings.yaml +27 -17
  159. autowsgr-2.3.0/uv.lock +4172 -0
  160. autowsgr-2.2.2/AGENTS.md +0 -85
  161. autowsgr-2.2.2/autowsgr/constants/__init__.py +0 -8
  162. autowsgr-2.2.2/autowsgr/constants/shipnames.py +0 -53
  163. autowsgr-2.2.2/autowsgr/ops/destroy.py +0 -51
  164. autowsgr-2.2.2/autowsgr/ops/event_fight.py +0 -440
  165. autowsgr-2.2.2/autowsgr/ops/repair.py +0 -84
  166. autowsgr-2.2.2/autowsgr/scheduler/scheduler.py +0 -304
  167. autowsgr-2.2.2/autowsgr/server/routes/system.py +0 -97
  168. autowsgr-2.2.2/autowsgr/ui/battle/fleet_change/_change.py +0 -644
  169. autowsgr-2.2.2/autowsgr/ui/battle/fleet_change/_detect.py +0 -125
  170. autowsgr-2.2.2/autowsgr/ui/event/event_page.py +0 -319
  171. autowsgr-2.2.2/examples/event_fight.py +0 -17
  172. autowsgr-2.2.2/testing/emulator/test_controller.py +0 -161
  173. autowsgr-2.2.2/testing/infra/test_config.py +0 -180
  174. autowsgr-2.2.2/testing/ui/battle_preparation/test_unit.py +0 -291
  175. autowsgr-2.2.2/uv.lock +0 -4218
  176. {autowsgr-2.2.2 → autowsgr-2.3.0}/.agents/skills/emulator-debug/SKILL.md +0 -0
  177. {autowsgr-2.2.2 → autowsgr-2.3.0}/.agents/skills/generic-issue-log-analysis/SKILL.md +0 -0
  178. {autowsgr-2.2.2 → autowsgr-2.3.0}/.agents/skills/release-backend/SKILL.md +0 -0
  179. {autowsgr-2.2.2 → autowsgr-2.3.0}/.gitattributes +0 -0
  180. {autowsgr-2.2.2 → autowsgr-2.3.0}/.github/CONTRIBUTING.md +0 -0
  181. {autowsgr-2.2.2 → autowsgr-2.3.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  182. {autowsgr-2.2.2 → autowsgr-2.3.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  183. {autowsgr-2.2.2 → autowsgr-2.3.0}/.github/ISSUE_TEMPLATE/enhancement_suggestion.yml +0 -0
  184. {autowsgr-2.2.2 → autowsgr-2.3.0}/.github/workflows/ai-issue-analysis.yml +0 -0
  185. {autowsgr-2.2.2 → autowsgr-2.3.0}/.github/workflows/lint.yml +0 -0
  186. {autowsgr-2.2.2 → autowsgr-2.3.0}/.github/workflows/lunar.yml +0 -0
  187. {autowsgr-2.2.2 → autowsgr-2.3.0}/.github/workflows/pytest.yml +0 -0
  188. {autowsgr-2.2.2 → autowsgr-2.3.0}/.github/workflows/release.yml +0 -0
  189. {autowsgr-2.2.2 → autowsgr-2.3.0}/.github/workflows/sync-upstream.yml +0 -0
  190. {autowsgr-2.2.2 → autowsgr-2.3.0}/.gitignore +0 -0
  191. {autowsgr-2.2.2 → autowsgr-2.3.0}/.pre-commit-config.yaml +0 -0
  192. {autowsgr-2.2.2 → autowsgr-2.3.0}/CLAUDE.md +0 -0
  193. {autowsgr-2.2.2 → autowsgr-2.3.0}/LICENSE +0 -0
  194. {autowsgr-2.2.2 → autowsgr-2.3.0}/README.md +0 -0
  195. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/combat/README.md +0 -0
  196. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/combat/history.py +0 -0
  197. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/combat/recognition.py +0 -0
  198. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/combat/state.py +0 -0
  199. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/context/README.md +0 -0
  200. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/context/__init__.py +0 -0
  201. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/context/build.py +0 -0
  202. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/context/equipment.py +0 -0
  203. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/context/expedition.py +0 -0
  204. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/context/fleet.py +0 -0
  205. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/context/resources.py +0 -0
  206. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/context/ship.py +0 -0
  207. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/bin/scrcpy-server.jar +0 -0
  208. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/build/equip_complete_540p.png +0 -0
  209. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/build/equip_fast_540p.png +0 -0
  210. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/build/equip_full_depot_540p.png +0 -0
  211. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/build/equip_start_540p.png +0 -0
  212. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/build/resource_540p.png +0 -0
  213. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/build/ship_complete_540p.png +0 -0
  214. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/build/ship_fast_540p.png +0 -0
  215. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/build/ship_full_depot_540p.png +0 -0
  216. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/build/ship_start_540p.png +0 -0
  217. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/choose_ship/tab_1_540p.png +0 -0
  218. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/choose_ship/tab_2_540p.png +0 -0
  219. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/choose_ship/tab_3_540p.png +0 -0
  220. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/choose_ship/tab_4_540p.png +0 -0
  221. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/combat/battle_times_exceed_540p.png +0 -0
  222. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/combat/bypass_540p.png +0 -0
  223. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/combat/end_battle_page_540p.png +0 -0
  224. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/combat/end_exercise_page_540p.png +0 -0
  225. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/combat/end_map_page_540p.png +0 -0
  226. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/combat/fight_condition_540p.png +0 -0
  227. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/combat/fight_period_540p.png +0 -0
  228. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/combat/flagship_damage_540p.png +0 -0
  229. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/combat/formation_540p.png +0 -0
  230. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/combat/get_item_540p.png +0 -0
  231. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/combat/get_ship_540p.png +0 -0
  232. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/combat/missile_animation_540p.png +0 -0
  233. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/combat/missile_support_540p.png +0 -0
  234. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/combat/mvp_badge_540p.png +0 -0
  235. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/combat/night_battle_540p.png +0 -0
  236. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/combat/proceed_540p.png +0 -0
  237. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/combat/result/a_540p.png +0 -0
  238. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/combat/result/b_540p.png +0 -0
  239. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/combat/result/c_540p.png +0 -0
  240. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/combat/result/d_540p.png +0 -0
  241. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/combat/result/loot_540p.png +0 -0
  242. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/combat/result/s_540p.png +0 -0
  243. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/combat/result/ss_540p.png +0 -0
  244. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/combat/result_540p.png +0 -0
  245. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/combat/result_page_540p.png +0 -0
  246. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/combat/ship_icon_1_540p.png +0 -0
  247. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/combat/ship_icon_2_540p.png +0 -0
  248. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/combat/spot_enemy_540p.png +0 -0
  249. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/common/README.md +0 -0
  250. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/common/confirm_1_540p.png +0 -0
  251. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/common/confirm_2_540p.png +0 -0
  252. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/common/confirm_3_540p.png +0 -0
  253. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/common/confirm_4_540p.png +0 -0
  254. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/common/confirm_5_540p.png +0 -0
  255. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/cook/cook_button_540p.png +0 -0
  256. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/cook/have_cook_540p.png +0 -0
  257. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/cook/no_times_540p.png +0 -0
  258. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/decisive/entry_cant_fight_540p.png +0 -0
  259. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/decisive/entry_challenging_540p.png +0 -0
  260. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/decisive/entry_refresh_540p.png +0 -0
  261. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/decisive/entry_refreshed_540p.png +0 -0
  262. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/decisive/use_last_fleet_540p.png +0 -0
  263. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/error/bad_network_1_540p.png +0 -0
  264. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/error/bad_network_2_540p.png +0 -0
  265. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/error/network_retry_540p.png +0 -0
  266. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/error/remote_login_540p.png +0 -0
  267. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/error/remote_login_confirm_540p.png +0 -0
  268. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/event/event_icon_20260212_720p.png +0 -0
  269. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/reward/collect_540p.png +0 -0
  270. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/reward/collect_all_540p.png +0 -0
  271. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/ui/build.png +0 -0
  272. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/ui/friend.png +0 -0
  273. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/ui/intensify.png +0 -0
  274. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/ui/map.png +0 -0
  275. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/images/ui/mission.png +0 -0
  276. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20220928/E-1.yaml +0 -0
  277. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20220928/E-2.yaml +0 -0
  278. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20220928/E-3.yaml +0 -0
  279. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20220928/E-4.yaml +0 -0
  280. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20220928/E-5.yaml +0 -0
  281. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20220928/E-6.yaml +0 -0
  282. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20220928/H-1.yaml +0 -0
  283. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20220928/H-2.yaml +0 -0
  284. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20220928/H-3.yaml +0 -0
  285. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20220928/H-4.yaml +0 -0
  286. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20220928/H-5.yaml +0 -0
  287. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20220928/H-6.yaml +0 -0
  288. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20221118/E-1.yaml +0 -0
  289. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20221118/E-2.yaml +0 -0
  290. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20221118/E-3.yaml +0 -0
  291. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20221118/E-4.yaml +0 -0
  292. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20221118/E-5.yaml +0 -0
  293. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20221118/E-6.yaml +0 -0
  294. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20221118/H-1.yaml +0 -0
  295. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20221118/H-2.yaml +0 -0
  296. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20221118/H-3.yaml +0 -0
  297. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20221118/H-4.yaml +0 -0
  298. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20221118/H-5.yaml +0 -0
  299. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20221118/H-6.yaml +0 -0
  300. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230117/E-1.yaml +0 -0
  301. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230117/E-2.yaml +0 -0
  302. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230117/E-3.yaml +0 -0
  303. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230117/E-4.yaml +0 -0
  304. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230117/E-5.yaml +0 -0
  305. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230117/E-6.yaml +0 -0
  306. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230117/H-1.yaml +0 -0
  307. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230117/H-2.yaml +0 -0
  308. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230117/H-3.yaml +0 -0
  309. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230117/H-4.yaml +0 -0
  310. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230117/H-5.yaml +0 -0
  311. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230117/H-6.yaml +0 -0
  312. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230613/E-1.yaml +0 -0
  313. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230613/E-2.yaml +0 -0
  314. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230613/E-3.yaml +0 -0
  315. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230613/E-4.yaml +0 -0
  316. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230613/E-5.yaml +0 -0
  317. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230613/E-6.yaml +0 -0
  318. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230613/H-1.yaml +0 -0
  319. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230613/H-2.yaml +0 -0
  320. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230613/H-3.yaml +0 -0
  321. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230613/H-4.yaml +0 -0
  322. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230613/H-5.yaml +0 -0
  323. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230613/H-6.yaml +0 -0
  324. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230809/E-1.yaml +0 -0
  325. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230809/E-2.yaml +0 -0
  326. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230809/E-3.yaml +0 -0
  327. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230809/E-4.yaml +0 -0
  328. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230809/E-5.yaml +0 -0
  329. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230809/E-6.yaml +0 -0
  330. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230809/H-1.yaml +0 -0
  331. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230809/H-2.yaml +0 -0
  332. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230809/H-3.yaml +0 -0
  333. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230809/H-4.yaml +0 -0
  334. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230809/H-5.yaml +0 -0
  335. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230809/H-6.yaml +0 -0
  336. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230927/E-1.yaml +0 -0
  337. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230927/E-2.yaml +0 -0
  338. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230927/E-3.yaml +0 -0
  339. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230927/E-4.yaml +0 -0
  340. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230927/E-5.yaml +0 -0
  341. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230927/E-6.yaml +0 -0
  342. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230927/E-7.yaml +0 -0
  343. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230927/E-8.yaml +0 -0
  344. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230927/H-1.yaml +0 -0
  345. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230927/H-2.yaml +0 -0
  346. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230927/H-3.yaml +0 -0
  347. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230927/H-4.yaml +0 -0
  348. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230927/H-5.yaml +0 -0
  349. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230927/H-6.yaml +0 -0
  350. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230927/H-7.yaml +0 -0
  351. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20230927/H-8.yaml +0 -0
  352. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20231215/E-1.yaml +0 -0
  353. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20231215/E-2.yaml +0 -0
  354. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20231215/E-3.yaml +0 -0
  355. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20231215/E-4.yaml +0 -0
  356. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20231215/E-5.yaml +0 -0
  357. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20231215/E-6.yaml +0 -0
  358. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20231215/H-1.yaml +0 -0
  359. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20231215/H-2.yaml +0 -0
  360. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20231215/H-3.yaml +0 -0
  361. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20231215/H-4.yaml +0 -0
  362. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20231215/H-5.yaml +0 -0
  363. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20231215/H-6.yaml +0 -0
  364. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240206/E-1.yaml +0 -0
  365. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240206/E-2.yaml +0 -0
  366. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240206/E-3.yaml +0 -0
  367. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240206/E-4.yaml +0 -0
  368. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240206/E-5.yaml +0 -0
  369. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240206/E-6.yaml +0 -0
  370. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240206/E-7.yaml +0 -0
  371. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240206/E-8.yaml +0 -0
  372. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240206/H-1.yaml +0 -0
  373. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240206/H-2.yaml +0 -0
  374. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240206/H-3.yaml +0 -0
  375. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240206/H-4.yaml +0 -0
  376. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240206/H-5.yaml +0 -0
  377. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240206/H-6.yaml +0 -0
  378. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240206/H-7.yaml +0 -0
  379. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240206/H-8.yaml +0 -0
  380. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240419/E-1.yaml +0 -0
  381. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240419/E-2.yaml +0 -0
  382. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240419/E-3.yaml +0 -0
  383. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240419/E-4.yaml +0 -0
  384. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240419/E-5.yaml +0 -0
  385. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240419/E-6.yaml +0 -0
  386. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240419/H-1.yaml +0 -0
  387. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240419/H-2.yaml +0 -0
  388. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240419/H-3.yaml +0 -0
  389. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240419/H-4.yaml +0 -0
  390. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240419/H-5.yaml +0 -0
  391. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240419/H-6.yaml +0 -0
  392. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240930/E-1.yaml +0 -0
  393. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240930/E-2.yaml +0 -0
  394. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240930/E-3.yaml +0 -0
  395. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240930/E-4.yaml +0 -0
  396. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240930/E-5.yaml +0 -0
  397. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240930/H-1.yaml +0 -0
  398. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240930/H-2.yaml +0 -0
  399. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240930/H-3.yaml +0 -0
  400. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240930/H-4.yaml +0 -0
  401. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20240930/H-5.yaml +0 -0
  402. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20241219/E-1.yaml +0 -0
  403. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20241219/E-2.yaml +0 -0
  404. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20241219/E-3.yaml +0 -0
  405. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20241219/E-4.yaml +0 -0
  406. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20241219/E-5.yaml +0 -0
  407. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20241219/E-6.yaml +0 -0
  408. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20241219/H-1.yaml +0 -0
  409. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20241219/H-2.yaml +0 -0
  410. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20241219/H-3.yaml +0 -0
  411. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20241219/H-4.yaml +0 -0
  412. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20241219/H-5.yaml +0 -0
  413. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20241219/H-6.yaml +0 -0
  414. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250123/E-1.yaml +0 -0
  415. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250123/E-2.yaml +0 -0
  416. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250123/E-3.yaml +0 -0
  417. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250123/E-4.yaml +0 -0
  418. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250123/E-5.yaml +0 -0
  419. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250123/E-6.yaml +0 -0
  420. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250123/H-1.yaml +0 -0
  421. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250123/H-2.yaml +0 -0
  422. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250123/H-3.yaml +0 -0
  423. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250123/H-4.yaml +0 -0
  424. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250123/H-5.yaml +0 -0
  425. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250123/H-6.yaml +0 -0
  426. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250710/E-1.yaml +0 -0
  427. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250710/E-2.yaml +0 -0
  428. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250710/E-3.yaml +0 -0
  429. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250710/E-4.yaml +0 -0
  430. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250710/E-5.yaml +0 -0
  431. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250710/E-6.yaml +0 -0
  432. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250710/H-1.yaml +0 -0
  433. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250710/H-2.yaml +0 -0
  434. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250710/H-3.yaml +0 -0
  435. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250710/H-4.yaml +0 -0
  436. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250710/H-5.yaml +0 -0
  437. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250710/H-6.yaml +0 -0
  438. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250930/E-1.yaml +0 -0
  439. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250930/E-2.yaml +0 -0
  440. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250930/E-3.yaml +0 -0
  441. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250930/E-4.yaml +0 -0
  442. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250930/E-5.yaml +0 -0
  443. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250930/E-6.yaml +0 -0
  444. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250930/H-1.yaml +0 -0
  445. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250930/H-2.yaml +0 -0
  446. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250930/H-3.yaml +0 -0
  447. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250930/H-4.yaml +0 -0
  448. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250930/H-5.yaml +0 -0
  449. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20250930/H-6.yaml +0 -0
  450. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20260104/E-1.yaml +0 -0
  451. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20260104/E-2.yaml +0 -0
  452. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20260104/E-3.yaml +0 -0
  453. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20260104/E-4.yaml +0 -0
  454. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20260104/E-5.yaml +0 -0
  455. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20260104/E-6.yaml +0 -0
  456. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20260104/H-1.yaml +0 -0
  457. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20260104/H-2.yaml +0 -0
  458. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20260104/H-3.yaml +0 -0
  459. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20260104/H-4.yaml +0 -0
  460. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20260104/H-5.yaml +0 -0
  461. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20260104/H-6.yaml +0 -0
  462. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20260212/E-1.yaml +0 -0
  463. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20260212/E-2.yaml +0 -0
  464. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20260212/E-3.yaml +0 -0
  465. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20260212/E-4.yaml +0 -0
  466. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20260212/E-5.yaml +0 -0
  467. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20260212/E-6.yaml +0 -0
  468. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20260212/H-1.yaml +0 -0
  469. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20260212/H-2.yaml +0 -0
  470. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20260212/H-3.yaml +0 -0
  471. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20260212/H-4.yaml +0 -0
  472. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20260212/H-5.yaml +0 -0
  473. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/event/20260212/H-6.yaml +0 -0
  474. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/1-1.yaml +0 -0
  475. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/1-2.yaml +0 -0
  476. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/1-3.yaml +0 -0
  477. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/1-4.yaml +0 -0
  478. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/1-5.yaml +0 -0
  479. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/10-1.yaml +0 -0
  480. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/2-1.yaml +0 -0
  481. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/2-2.yaml +0 -0
  482. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/2-3.yaml +0 -0
  483. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/2-4.yaml +0 -0
  484. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/2-5.yaml +0 -0
  485. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/2-6.yaml +0 -0
  486. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/3-1.yaml +0 -0
  487. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/3-2.yaml +0 -0
  488. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/3-3.yaml +0 -0
  489. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/3-4.yaml +0 -0
  490. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/4-1.yaml +0 -0
  491. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/4-2.yaml +0 -0
  492. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/4-3.yaml +0 -0
  493. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/4-4.yaml +0 -0
  494. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/5-1.yaml +0 -0
  495. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/5-2.yaml +0 -0
  496. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/5-3.yaml +0 -0
  497. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/5-4.yaml +0 -0
  498. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/5-5.yaml +0 -0
  499. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/6-1.yaml +0 -0
  500. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/6-2.yaml +0 -0
  501. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/6-3.yaml +0 -0
  502. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/6-4.yaml +0 -0
  503. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/7-1.yaml +0 -0
  504. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/7-2.yaml +0 -0
  505. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/7-3.yaml +0 -0
  506. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/7-4.yaml +0 -0
  507. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/7-5.yaml +0 -0
  508. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/8-1.yaml +0 -0
  509. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/8-2.yaml +0 -0
  510. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/8-3.yaml +0 -0
  511. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/8-4.yaml +0 -0
  512. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/8-5.yaml +0 -0
  513. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/9-1.yaml +0 -0
  514. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/9-2.yaml +0 -0
  515. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/9-3.yaml +0 -0
  516. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/9-4.yaml +0 -0
  517. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/map/normal/9-5.yaml +0 -0
  518. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/missions.yaml +0 -0
  519. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/event/E5ADE/345/244/234/346/210/230.yaml" +0 -0
  520. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/event/H5ADE/345/244/234/346/210/230.yaml" +0 -0
  521. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/1-1.yaml +0 -0
  522. {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
  523. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/5-2/347/202/270/351/261/274.yaml" +0 -0
  524. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/6-15SS.yaml +0 -0
  525. {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
  526. {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
  527. {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
  528. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/7-4/345/215/203/344/274/252.yaml" +0 -0
  529. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/7-4/345/221/250/345/270/270.yaml" +0 -0
  530. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/7-4/350/203/226/346/254/241.yaml" +0 -0
  531. {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
  532. {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
  533. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/8-2A/347/202/270/351/261/274.yaml" +0 -0
  534. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/8-2B.yaml +0 -0
  535. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/8-2BJ.yaml +0 -0
  536. {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
  537. {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
  538. {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
  539. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/8-4-6SSweek.yaml +0 -0
  540. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/8-5AI.yaml +0 -0
  541. {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
  542. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/9-1A.yaml +0 -0
  543. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/9-1B.yaml +0 -0
  544. {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
  545. {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
  546. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/9-2ADGHM.yaml +0 -0
  547. {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
  548. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/9-2C/347/202/270/351/261/274.yaml" +0 -0
  549. {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
  550. {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
  551. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/9-3AD.yaml +0 -0
  552. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/9-46SS.yaml +0 -0
  553. {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
  554. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/9-5B.yaml +0 -0
  555. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/plan/normal_fight/9-5BE.yaml +0 -0
  556. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/data/shipnames.yaml +0 -0
  557. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/emulator/__init__.py +0 -0
  558. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/emulator/controller/__init__.py +0 -0
  559. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/emulator/detector.py +0 -0
  560. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/emulator/os_control/__init__.py +0 -0
  561. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/emulator/os_control/base.py +0 -0
  562. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/emulator/os_control/linux.py +0 -0
  563. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/emulator/os_control/macos.py +0 -0
  564. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/emulator/os_control/windows.py +0 -0
  565. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/image_resources/__init__.py +0 -0
  566. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/image_resources/_lazy.py +0 -0
  567. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/image_resources/combat.py +0 -0
  568. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/image_resources/keys.py +0 -0
  569. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/image_resources/ops.py +0 -0
  570. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/infra/__init__.py +0 -0
  571. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/infra/exceptions.py +0 -0
  572. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/infra/logger.py +0 -0
  573. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ops/README.md +0 -0
  574. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ops/__init__.py +0 -0
  575. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ops/build.py +0 -0
  576. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ops/cook.py +0 -0
  577. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ops/decisive/__init__.py +0 -0
  578. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ops/decisive/base.py +0 -0
  579. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ops/decisive/config.py +0 -0
  580. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ops/decisive/controller.py +0 -0
  581. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ops/decisive/handlers.py +0 -0
  582. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ops/decisive/logic.py +0 -0
  583. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ops/decisive/state.py +0 -0
  584. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ops/expedition.py +0 -0
  585. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ops/navigate.py +0 -0
  586. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ops/retry_plan.md +0 -0
  587. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ops/reward.py +0 -0
  588. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ops/startup.py +0 -0
  589. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/server/routes/__init__.py +0 -0
  590. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/server/routes/health.py +0 -0
  591. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/server/ws_manager.py +0 -0
  592. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/README.md +0 -0
  593. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/backyard_page.py +0 -0
  594. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/bath_page/__init__.py +0 -0
  595. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/bath_page/recognition.py +0 -0
  596. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/bath_page/signatures.py +0 -0
  597. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/battle/__init__.py +0 -0
  598. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/battle/base.py +0 -0
  599. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/battle/blood.py +0 -0
  600. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/battle/constants.py +0 -0
  601. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/battle/fleet_change/__init__.py +0 -0
  602. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/battle/preparation.py +0 -0
  603. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/battle/repair.py +0 -0
  604. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/battle/supply.py +0 -0
  605. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/build_page.py +0 -0
  606. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/canteen_page.py +0 -0
  607. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/decisive/__init__.py +0 -0
  608. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/decisive/battle_page.py +0 -0
  609. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/decisive/overlay.py +0 -0
  610. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/event/__init__.py +0 -0
  611. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/friend_page.py +0 -0
  612. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/intensify_page.py +0 -0
  613. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/main_page/__init__.py +0 -0
  614. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/main_page/constants.py +0 -0
  615. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/main_page/controller.py +0 -0
  616. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/main_page/overlays.py +0 -0
  617. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/map/__init__.py +0 -0
  618. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/map/base.py +0 -0
  619. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/map/data.py +0 -0
  620. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/map/page.py +0 -0
  621. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/map/panels/__init__.py +0 -0
  622. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/map/panels/campaign.py +0 -0
  623. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/map/panels/decisive.py +0 -0
  624. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/map/panels/exercise.py +0 -0
  625. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/map/panels/expedition.py +0 -0
  626. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/mission_page/__init__.py +0 -0
  627. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/mission_page/data.py +0 -0
  628. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/mission_page/page.py +0 -0
  629. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/mission_page/recognition.py +0 -0
  630. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/navigation.py +0 -0
  631. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/page.py +0 -0
  632. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/sidebar_page.py +0 -0
  633. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/start_screen_page.py +0 -0
  634. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/tabbed_page.py +0 -0
  635. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/utils/__init__.py +0 -0
  636. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/ui/utils/navigation.py +0 -0
  637. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/vision/__init__.py +0 -0
  638. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/vision/image_matcher.py +0 -0
  639. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/vision/image_template.py +0 -0
  640. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/vision/matcher.py +0 -0
  641. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/vision/pixel.py +0 -0
  642. {autowsgr-2.2.2 → autowsgr-2.3.0}/autowsgr/vision/roi.py +0 -0
  643. {autowsgr-2.2.2 → autowsgr-2.3.0}/docs/ai-issue-analysis-bot.md +0 -0
  644. {autowsgr-2.2.2 → autowsgr-2.3.0}/docs/architecture/README.md +0 -0
  645. {autowsgr-2.2.2 → autowsgr-2.3.0}/docs/architecture/emulator.md +0 -0
  646. {autowsgr-2.2.2 → autowsgr-2.3.0}/docs/architecture/ops.md +0 -0
  647. {autowsgr-2.2.2 → autowsgr-2.3.0}/docs/architecture/scheduler-and-server.md +0 -0
  648. {autowsgr-2.2.2 → autowsgr-2.3.0}/docs/architecture/ui.md +0 -0
  649. {autowsgr-2.2.2 → autowsgr-2.3.0}/docs/architecture/vision.md +0 -0
  650. {autowsgr-2.2.2 → autowsgr-2.3.0}/docs/developer/test_pkg.md +0 -0
  651. {autowsgr-2.2.2 → autowsgr-2.3.0}/docs/logo.png +0 -0
  652. {autowsgr-2.2.2 → autowsgr-2.3.0}/docs/spelling_wordlist.txt +0 -0
  653. {autowsgr-2.2.2 → autowsgr-2.3.0}/docs/usage/usage_daily_ops.md +0 -0
  654. {autowsgr-2.2.2 → autowsgr-2.3.0}/docs/usage/usage_decisive.md +0 -0
  655. {autowsgr-2.2.2 → autowsgr-2.3.0}/docs/usage/usage_quickstart.md +0 -0
  656. {autowsgr-2.2.2 → autowsgr-2.3.0}/examples/campaign.py +0 -0
  657. {autowsgr-2.2.2 → autowsgr-2.3.0}/examples/decisive.py +0 -0
  658. {autowsgr-2.2.2 → autowsgr-2.3.0}/examples/exercise.py +0 -0
  659. {autowsgr-2.2.2 → autowsgr-2.3.0}/examples/expedition.py +0 -0
  660. {autowsgr-2.2.2 → autowsgr-2.3.0}/examples/normal_fight.py +0 -0
  661. {autowsgr-2.2.2 → autowsgr-2.3.0}/examples/usersettings.minimal.yaml +0 -0
  662. {autowsgr-2.2.2 → autowsgr-2.3.0}/renovate.json +0 -0
  663. {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/__init__.py +0 -0
  664. {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/combat/__init__.py +0 -0
  665. {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/conftest.py +0 -0
  666. {autowsgr-2.2.2/testing/emulator → autowsgr-2.3.0/testing/context}/__init__.py +0 -0
  667. {autowsgr-2.2.2/testing/infra → autowsgr-2.3.0/testing/emulator}/__init__.py +0 -0
  668. {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/emulator/test_os_control.py +0 -0
  669. {autowsgr-2.2.2/testing/ui → autowsgr-2.3.0/testing/infra}/__init__.py +0 -0
  670. {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/infra/test_exceptions.py +0 -0
  671. {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ops/__init__.py +0 -0
  672. {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ops/build.py +0 -0
  673. {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ops/campaign.py +0 -0
  674. {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ops/cook.py +0 -0
  675. {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ops/decisive_battle.py +0 -0
  676. {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ops/destroy.py +0 -0
  677. {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ops/exercise.py +0 -0
  678. {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ops/expedition.py +0 -0
  679. {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ops/repair.py +0 -0
  680. {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ops/reward.py +0 -0
  681. {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ops/startup.py +0 -0
  682. {autowsgr-2.2.2/testing/ui/backyard_page → autowsgr-2.3.0/testing/tools}/__init__.py +0 -0
  683. {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ui/README.md +0 -0
  684. {autowsgr-2.2.2/testing/ui/bath_page → autowsgr-2.3.0/testing/ui}/__init__.py +0 -0
  685. {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ui/_framework.py +0 -0
  686. {autowsgr-2.2.2/testing/ui/battle_preparation → autowsgr-2.3.0/testing/ui/backyard_page}/__init__.py +0 -0
  687. {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ui/backyard_page/e2e.py +0 -0
  688. {autowsgr-2.2.2/testing/ui/build_page → autowsgr-2.3.0/testing/ui/bath_page}/__init__.py +0 -0
  689. {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ui/bath_page/e2e.py +0 -0
  690. {autowsgr-2.2.2/testing/ui/canteen_page → autowsgr-2.3.0/testing/ui/battle_preparation}/__init__.py +0 -0
  691. {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ui/battle_preparation/e2e.py +0 -0
  692. {autowsgr-2.2.2/testing/ui/decisive_battle_page → autowsgr-2.3.0/testing/ui/build_page}/__init__.py +0 -0
  693. {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ui/build_page/e2e.py +0 -0
  694. {autowsgr-2.2.2/testing/ui/event_page → autowsgr-2.3.0/testing/ui/canteen_page}/__init__.py +0 -0
  695. {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ui/canteen_page/e2e.py +0 -0
  696. {autowsgr-2.2.2/testing/ui/friend_page → autowsgr-2.3.0/testing/ui/decisive_battle_page}/__init__.py +0 -0
  697. {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ui/decisive_battle_page/e2e.py +0 -0
  698. {autowsgr-2.2.2/testing/ui/intensify_page → autowsgr-2.3.0/testing/ui/event_page}/__init__.py +0 -0
  699. {autowsgr-2.2.2/testing/ui/main_page → autowsgr-2.3.0/testing/ui/friend_page}/__init__.py +0 -0
  700. {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ui/friend_page/e2e.py +0 -0
  701. {autowsgr-2.2.2/testing/ui/map_page → autowsgr-2.3.0/testing/ui/intensify_page}/__init__.py +0 -0
  702. {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ui/intensify_page/e2e.py +0 -0
  703. {autowsgr-2.2.2/testing/ui/mission_page → autowsgr-2.3.0/testing/ui/main_page}/__init__.py +0 -0
  704. {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ui/main_page/e2e.py +0 -0
  705. {autowsgr-2.2.2/testing/ui/page → autowsgr-2.3.0/testing/ui/map_page}/__init__.py +0 -0
  706. {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ui/map_page/e2e.py +0 -0
  707. {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ui/map_page/test_unit.py +0 -0
  708. {autowsgr-2.2.2/testing/ui/sidebar_page → autowsgr-2.3.0/testing/ui/mission_page}/__init__.py +0 -0
  709. {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ui/mission_page/e2e.py +0 -0
  710. {autowsgr-2.2.2/testing/vision → autowsgr-2.3.0/testing/ui/page}/__init__.py +0 -0
  711. {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ui/page/test_unit.py +0 -0
  712. {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ui/run_all_e2e.ps1 +0 -0
  713. {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ui/run_all_e2e.py +0 -0
  714. {autowsgr-2.2.2/tools → autowsgr-2.3.0/testing/ui/sidebar_page}/__init__.py +0 -0
  715. {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/ui/sidebar_page/e2e.py +0 -0
  716. {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/vision/_helpers.py +0 -0
  717. {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/vision/test_image_checker.py +0 -0
  718. {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/vision/test_image_template.py +0 -0
  719. {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/vision/test_matcher.py +0 -0
  720. {autowsgr-2.2.2 → autowsgr-2.3.0}/testing/vision/test_roi.py +0 -0
  721. {autowsgr-2.2.2 → autowsgr-2.3.0}/tools/VisualIdentity.md +0 -0
  722. {autowsgr-2.2.2 → autowsgr-2.3.0}/tools/benchmark_emulator.py +0 -0
  723. {autowsgr-2.2.2 → autowsgr-2.3.0}/tools/debug_screenshot.py +0 -0
  724. {autowsgr-2.2.2 → autowsgr-2.3.0}/tools/pixel_marker.py +0 -0
  725. {autowsgr-2.2.2 → autowsgr-2.3.0}/tools/update_shipnames.py +0 -0
@@ -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.2.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>=0.2.0
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,3 +1,3 @@
1
1
  """AutoWSGR - 战舰少女R 自动化框架(v2)"""
2
2
 
3
- __version__ = '2.2.2'
3
+ __version__ = '2.3.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
- device.click(x, y)
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
- device.click(*coords)
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
- device.click(*Coords.SPEED_UP_BATTLE)
195
- time.sleep(0.2)
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
- device.click(*detail.center)
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(plan.event_name, plan.chapter, plan.map_id)
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')