1
0
mirror of https://gitee.com/sui-feng-cb/AzurLaneAutoScript1 synced 2026-03-28 06:39:43 +08:00

74 Commits

Author SHA1 Message Date
positnuec
20d1b1c9a3 Opt: SkinBox position filter 2026-03-13 14:08:02 +08:00
d7af303d04 Fix: missing argument in skinbox_position_check 2026-03-12 16:14:10 +08:00
69cdd06e60 Upd: event_20240229_cn rerun 2026-03-12 02:11:51 +08:00
positnuec
71f8051b82 Add: Purchase SkinBox by position 2026-03-12 02:07:07 +08:00
positnuec
a07dffbeda Add: Auto recommend submarine fleet in hard mode 2026-03-09 13:42:55 +08:00
positnuec
b5fe8e425b Fix: Misjudgement caused by click light effect interference 2026-03-09 13:42:45 +08:00
positnuec
da7ca5d706 Add: Control CL1 Record independently 2026-03-09 12:50:27 +08:00
positnuec
ecf2a841cf Fix: OS infinite click on CLICK_SAFE_AREA 2026-03-09 12:45:47 +08:00
GH Action - Upstream Sync
3ceade600f Merge branch 'master' of https://github.com/LmeSzinc/AzurLaneAutoScript 2026-03-05 18:14:27 +00:00
LmeSzinc
b687048405 Merge pull request #5545 from LmeSzinc/dev
Bug fix
2026-03-06 01:13:28 +08:00
LmeSzinc
c9e95702dc Fix: Skip event story in event_20260226_cn 2026-03-06 01:12:54 +08:00
LmeSzinc
b24d09f1a0 Upd: [TW] Event event_20260226_cn (fixed #5544) 2026-03-06 01:11:10 +08:00
GH Action - Upstream Sync
4e2e4572c3 Merge branch 'master' of https://github.com/LmeSzinc/AzurLaneAutoScript 2026-03-05 14:56:10 +00:00
LmeSzinc
8618ea2352 Upd: Battle UI SpringInn (#5541) (#5543)
Co-authored-by: heipen <126669219+Heipen@users.noreply.github.com>
2026-03-05 22:42:45 +08:00
heipen
dbc5fe42e8 Upd: Battle UI SpringInn (#5541) 2026-03-04 12:32:12 +08:00
2eec1333ad Merge branch 'master' of https://github.com/LmeSzinc/AzurLaneAutoScript 2026-02-28 05:33:05 +08:00
LmeSzinc
2a2901d218 Merge pull request #5533 from LmeSzinc/dev
Add: Event Springtide Inn Online (event_20260226_cn)
2026-02-28 04:43:01 +08:00
LmeSzinc
66fa598e75 Fix: Abyssal combat with handle_map_event (#5328) 2026-02-28 04:37:52 +08:00
LmeSzinc
bfe67e2922 Opt: swipe multiply in event_20260226_cn 2026-02-28 04:17:37 +08:00
LmeSzinc
bd108dc35f Fix: Clicking BACK_ARROW at combat loading 2026-02-28 04:09:49 +08:00
LmeSzinc
07bf9d9947 Fix: Handle wrong OCR error like "I4-4" (#5532) 2026-02-28 03:42:27 +08:00
guoh064
c8e8d0b2fe Add: Event Springtide Inn Online (event_20260226_cn) 2026-02-28 02:50:22 +08:00
37a1d8bb8e Add: Event Springtide Inn Online (event_20260226_cn) 2026-02-27 17:12:21 +08:00
3b8271fbca Revert "Upd: [tmp] event entrance of event_20260226_cn"
This reverts commit 8f933b5468.
2026-02-27 17:10:42 +08:00
guoh064
4b05184cbd Add: Event Springtide Inn Online (event_20260226_cn) 2026-02-27 00:19:36 +08:00
a97af04d85 Fix: set the management page to top before island run 2026-02-26 20:31:17 +08:00
8f933b5468 Upd: [tmp] event entrance of event_20260226_cn 2026-02-26 16:44:25 +08:00
LmeSzinc
5c7f57f3b2 Fix: patch_mimetype 2026-02-19 10:19:42 +08:00
45b7c2cdba Merge branch 'master' of https://github.com/sui-feng-cb/AzurLaneAutoScript1 2026-02-19 05:16:45 +08:00
GH Action - Upstream Sync
ce23ea94a5 Merge branch 'master' of https://github.com/LmeSzinc/AzurLaneAutoScript 2026-02-18 20:51:23 +00:00
LmeSzinc
ad623f6332 Merge pull request #5525 from LmeSzinc/dev
Bug fix
2026-02-19 03:18:06 +08:00
LmeSzinc
c014140c6e Fix: [CN] Remove more dash-like characters (fixed #5522) 2026-02-19 03:14:09 +08:00
gepotumu
a538739910 Fix: infinite loop in _handle_use_box_amount when box count insufficient (#5516)
When requesting more boxes than available (e.g. requesting 8 but only 3
in stack), the amount-setting loop would never exit because the UI caps
at the available count while the script keeps clicking AMOUNT_PLUS.

Added click_count tracking: if multi_click() has been called 2 times
without the amount reaching the target, treat it as the UI cap and break.
Also changed the return value from bool to the actual amount set, so
_storage_use_one_box tracks the correct number of boxes used.
2026-02-19 02:19:08 +08:00
LmeSzinc
0a4f2a89fc Fix: handle raid remain like "915/", "1515" 2026-02-19 02:15:25 +08:00
LmeSzinc
986d825a81 Fix: [EN] UI switch to page_game_room 2026-02-19 01:58:20 +08:00
LmeSzinc
74bbaf8395 Fix: first ui switch must be ui_ensure 2026-02-18 09:10:55 +08:00
LmeSzinc
d99b759a08 Fix: no poor sleep in fleet_preparation_sidebar_ensure 2026-02-18 09:10:55 +08:00
ArecaSapling
102b7eeaf7 Upd: blueprint purchase for DR5 & PR6 (#5518) 2026-02-18 09:10:41 +08:00
76eeba667f Add: Island Pearl Daemon 2026-02-17 20:58:33 +08:00
1e5a7d444b Merge branch 'master' of https://github.com/sui-feng-cb/AzurLaneAutoScript1 2026-02-15 15:58:29 +08:00
7b48e1ac58 Upd: blueprint purchase for DR5 & PR6 2026-02-15 15:57:18 +08:00
a136cbe1ff Upd: config update 2026-02-15 15:54:45 +08:00
positnuec
39ee794e41 Add: Purchase PR6 and DR5 blueprints in shipyard 2026-02-15 15:11:45 +08:00
e0b231bc58 Merge branch 'master' of https://github.com/LmeSzinc/AzurLaneAutoScript 2026-02-14 12:26:34 +08:00
44eb4dbcf2 Revert "Add: [CN] Spring Auction Adventure (raid_20260212)"
This reverts commit c4961c80eb.
2026-02-14 12:25:42 +08:00
95c1128c73 Revert "Fix: use cnocr for CHANGWU_OCR_REMAIN_*"
This reverts commit 5fceeddcb1.
2026-02-14 12:25:33 +08:00
LmeSzinc
cc089b6223 Merge pull request #5515 from LmeSzinc/dev
Add: Spring Auction Adventure (raid_20260212)
2026-02-14 03:44:51 +08:00
LmeSzinc
7eb80ca6f4 Upd: [CN] game server 裁决协议 2026-02-14 03:32:47 +08:00
LmeSzinc
9bb8e191ac Upd: [EN][JP][TW] Raid CHANGWU assets 2026-02-14 03:30:49 +08:00
LmeSzinc
efeb222764 Upd: [TW] Event entrance of raid_20260212 2026-02-14 03:06:07 +08:00
LmeSzinc
11405cf0c3 Fix: [EN] check other buttons for page_academy 2026-02-14 03:00:01 +08:00
LmeSzinc
3623d4c70a Merge pull request #5508 from sui-feng-cb/event_update
Add: [CN] Spring Auction Adventure (raid_20260212)
2026-02-14 02:32:28 +08:00
5ab18b27fd Fix: use cnocr for CHANGWU_OCR_REMAIN_* 2026-02-12 20:28:24 +08:00
5fceeddcb1 Fix: use cnocr for CHANGWU_OCR_REMAIN_* 2026-02-12 20:27:18 +08:00
c4961c80eb Add: [CN] Spring Auction Adventure (raid_20260212) 2026-02-12 16:45:03 +08:00
7e6b87bee8 Add: [CN] Spring Auction Adventure (raid_20260212) 2026-02-12 16:44:24 +08:00
GH Action - Upstream Sync
fc0e4ce016 Merge branch 'master' of https://github.com/LmeSzinc/AzurLaneAutoScript 2026-02-09 19:27:24 +00:00
LmeSzinc
eb73b3cfd8 Bug fix (#5505)
* Merge pull request #5500 from sui-feng-cb/event_update

Fix: raid_20240328 ex

* Upd: Battle UI Ancient

* Upd: [EN] TEMPLATE_REVELATIONS_OF_DUST

---------

Co-authored-by: ArecaSapling <115386623+sui-feng-cb@users.noreply.github.com>
2026-02-09 23:42:27 +08:00
LmeSzinc
7118c30fea Upd: [EN] TEMPLATE_REVELATIONS_OF_DUST 2026-02-09 23:40:21 +08:00
LmeSzinc
7d9e77e4fd Upd: Battle UI Ancient 2026-02-09 23:31:47 +08:00
ArecaSapling
5a32d9444c Merge pull request #5500 from sui-feng-cb/event_update
Fix: raid_20240328 ex
2026-02-09 23:23:20 +08:00
530efc628e Upd: island ui_additional 2026-02-08 23:10:43 +08:00
f981ec614d Fix: wait until ui appear in project_receive 2026-02-08 22:10:07 +08:00
054da57f5b Fix: GameTooManyClickError in product_select 2026-02-08 21:01:37 +08:00
3767be643a Upd: island character 2026-02-07 14:38:32 +08:00
dfed4c9578 Fix: island item order 2026-02-07 04:09:31 +08:00
352f7412a6 Fix: try reversed order in project_character_select 2026-02-07 03:52:37 +08:00
10e302f37e Upd: island spring season item 2026-02-07 03:15:21 +08:00
5c7b2b695b Merge branch 'master' of https://github.com/LmeSzinc/AzurLaneAutoScript 2026-02-06 23:23:24 +08:00
LmeSzinc
cd1ef2cf95 Merge pull request #5499 from LmeSzinc/dev
Dev
2026-02-06 21:29:17 +08:00
LmeSzinc
0a0e41c07f Merge pull request #5495 from sui-feng-cb/event_update
Upd: raid_20240328 rerun
2026-02-06 21:28:46 +08:00
7e1a2322a6 Fix: use _raid_has_oil_icon for new UI design 2026-02-05 21:44:55 +08:00
a4fec2e2a0 Upd: raid_20240328 rerun 2026-02-05 20:47:33 +08:00
guoh064
eb33bdd747 Fix: slow retrial for MISSION_OVERVIEW_ACCEPT(_SINGLE) (#5487) 2026-02-04 18:26:41 +08:00
125 changed files with 5428 additions and 1843 deletions

View File

@@ -434,6 +434,10 @@ class AzurLaneAutoScript:
from module.storage.box_disassemble import StorageBox
StorageBox(config=self.config, device=self.device, task="BoxDisassemble").run()
def island_pearl(self):
from module.island.pearl_daemon import IslandPearl
IslandPearl(config=self.config, device=self.device, task="IslandPearl").run()
def azur_lane_uncensored(self):
from module.daemon.uncensored import AzurLaneUncensored
AzurLaneUncensored(config=self.config, device=self.device, task="AzurLaneUncensored").run()

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

View File

@@ -281,3 +281,6 @@ To add a new event, add a new row in here, and run `python -m module.config.conf
| 20260122 | event 20220526 cn | Pledge of the Radiant Court | - | - | - | 泠誓光庭 |
| 20260129 | coalition 20260122 | Light & Shadow Fashion Shoot! | - | - | - | 光影風尚-拍攝進行時 |
| 20260205 | raid 20240328 | From Zero to Hero | 复刻从零开始的魔王讨伐之旅 | From Zero to Hero Rerun | ゼロから頑張る魔王討伐(復刻) | - |
| 20260212 | raid 20260212 | Spring Auction Adventure | 春宴怀玉香满庭 | Spring Auction Adventure | 新春玉逸品会 | 春宴懷玉香滿庭 |
| 20260226 | event 20260226 cn | Springtide Inn Online | 春满客栈Online | Springtide Inn Online | 春色旅籠Online | 春滿客棧Online |
| 20260312 | event 20240229 cn | Snowrealm Peregrination | 复刻雪境迷踪 | Snowrealm Peregrination Rerun | 銀界遊廻(復刻) | - |

View File

@@ -1,3 +1,4 @@
from module.base.timer import Timer
from module.campaign.campaign_base import CampaignBase as CampaignBase_
from module.exception import RequestHumanTakeover
from module.logger import logger
@@ -58,6 +59,7 @@ class CampaignBase(CampaignBase_):
Fixed number of scrolls until give up, may need to
increase as more war archives campaigns are added
"""
confirm_timer = Timer(1.5, count=4)
for _ in range(20):
if skip_first_screenshot:
skip_first_screenshot = False
@@ -80,13 +82,19 @@ class CampaignBase(CampaignBase_):
return entrance
if WAR_ARCHIVES_SCROLL.appear(main=self):
confirm_timer.clear()
if WAR_ARCHIVES_SCROLL.at_bottom(main=self):
WAR_ARCHIVES_SCROLL.set_top(main=self)
else:
WAR_ARCHIVES_SCROLL.next_page(main=self, page=0.66)
continue
else:
break
confirm_timer.start()
if confirm_timer.reached():
logger.warning('WAR_ARCHIVES_SCROLL disappeared')
break
else:
continue
logger.warning('Failed to find archives entrance')
return None

View File

@@ -0,0 +1,84 @@
from module.campaign.campaign_base import CampaignBase
from module.map.map_base import CampaignMap
from module.map.map_grids import SelectedGrids, RoadGrids
from module.logger import logger
MAP = CampaignMap('A1')
MAP.shape = 'I8'
MAP.camera_data = ['E2', 'E6']
MAP.camera_data_spawn_point = ['E2']
MAP.map_data = """
-- -- ME -- ME -- -- -- --
-- ++ -- -- -- ME ++ ++ --
-- ++ -- SP -- -- Me ++ --
-- ME -- -- SP -- -- ME --
++ -- Me -- -- -- Me -- --
-- ME ++ MS -- MS ++ ++ ++
-- -- ME -- __ -- ME ++ --
-- -- -- -- MB -- -- -- --
"""
MAP.weight_data = """
50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 2, 'siren': 1},
{'battle': 1, 'enemy': 1},
{'battle': 2, 'enemy': 1},
{'battle': 3, 'enemy': 1, 'boss': 1},
{'battle': 4, 'enemy': 1},
]
A1, B1, C1, D1, E1, F1, G1, H1, I1, \
A2, B2, C2, D2, E2, F2, G2, H2, I2, \
A3, B3, C3, D3, E3, F3, G3, H3, I3, \
A4, B4, C4, D4, E4, F4, G4, H4, I4, \
A5, B5, C5, D5, E5, F5, G5, H5, I5, \
A6, B6, C6, D6, E6, F6, G6, H6, I6, \
A7, B7, C7, D7, E7, F7, G7, H7, I7, \
A8, B8, C8, D8, E8, F8, G8, H8, I8, \
= MAP.flatten()
class Config:
# ===== Start of generated config =====
MAP_SIREN_TEMPLATE = []
MOVABLE_ENEMY_TURN = (2,)
MAP_HAS_SIREN = True
MAP_HAS_MOVABLE_ENEMY = True
MAP_HAS_MAP_STORY = False
MAP_HAS_FLEET_STEP = True
MAP_HAS_AMBUSH = False
MAP_HAS_MYSTERY = False
# ===== End of generated config =====
MAP_CHAPTER_SWITCH_20241219 = True
STAGE_ENTRANCE = ['half', '20240725']
MAP_HAS_MODE_SWITCH = True
STAGE_INCREASE_AB = True
MAP_WALK_USE_CURRENT_FLEET = True
MAP_SIREN_HAS_BOSS_ICON_SMALL = True
MAP_SWIPE_MULTIPLY = (1.179, 1.201)
MAP_SWIPE_MULTIPLY_MINITOUCH = (1.140, 1.161)
MAP_SWIPE_MULTIPLY_MAATOUCH = (1.107, 1.127)
class Campaign(CampaignBase):
MAP = MAP
ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C'
def battle_0(self):
if self.clear_siren():
return True
if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0):
return True
return self.battle_default()
def battle_3(self):
return self.clear_boss()

View File

@@ -0,0 +1,74 @@
from module.campaign.campaign_base import CampaignBase
from module.map.map_base import CampaignMap
from module.map.map_grids import SelectedGrids, RoadGrids
from module.logger import logger
from .a1 import Config as ConfigBase
MAP = CampaignMap('A2')
MAP.shape = 'J7'
MAP.camera_data = ['D2', 'D5', 'E4']
MAP.camera_data_spawn_point = ['D5']
MAP.map_data = """
-- ME -- -- ME ++ ++ -- -- --
MB -- ME -- -- -- ++ ME ME ++
++ -- ++ ++ Me -- Me -- -- ++
-- -- ++ ++ -- __ -- -- ME --
-- MS -- -- MS -- -- ME ++ --
ME -- -- -- -- -- ME -- -- --
++ -- SP SP -- ++ ++ ++ -- --
"""
MAP.weight_data = """
50 50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50 50
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 2, 'siren': 1},
{'battle': 1, 'enemy': 1},
{'battle': 2, 'enemy': 1},
{'battle': 3, 'enemy': 1},
{'battle': 4, 'enemy': 1, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, \
A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, \
A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, \
A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, \
A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, \
A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, \
A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, \
= MAP.flatten()
class Config(ConfigBase):
# ===== Start of generated config =====
MAP_SIREN_TEMPLATE = []
MOVABLE_ENEMY_TURN = (2,)
MAP_HAS_SIREN = True
MAP_HAS_MOVABLE_ENEMY = True
MAP_HAS_MAP_STORY = False
MAP_HAS_FLEET_STEP = True
MAP_HAS_AMBUSH = False
MAP_HAS_MYSTERY = False
# ===== End of generated config =====
MAP_ENSURE_EDGE_INSIGHT_CORNER = 'bottom-left'
class Campaign(CampaignBase):
MAP = MAP
ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C'
def battle_0(self):
if self.clear_siren():
return True
if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0):
return True
return self.battle_default()
def battle_4(self):
return self.clear_boss()

View File

@@ -0,0 +1,75 @@
from module.campaign.campaign_base import CampaignBase
from module.map.map_base import CampaignMap
from module.map.map_grids import SelectedGrids, RoadGrids
from module.logger import logger
from .a1 import Config as ConfigBase
MAP = CampaignMap('A3')
MAP.shape = 'H8'
MAP.camera_data = ['D4', 'D6', 'E3']
MAP.camera_data_spawn_point = ['D4']
MAP.map_data = """
++ ++ -- -- ME -- -- ME
++ ++ MS -- -- -- ME --
SP -- -- MS -- ++ -- --
SP -- -- MS -- ++ ME --
++ Me __ -- -- -- -- --
++ ME -- Me ++ ++ ++ --
-- -- -- -- Me -- ME --
MB ++ Me ME -- ME -- --
"""
MAP.weight_data = """
50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 2, 'siren': 1},
{'battle': 1, 'enemy': 1},
{'battle': 2, 'enemy': 1},
{'battle': 3, 'enemy': 1},
{'battle': 4, 'enemy': 1, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, H1, \
A2, B2, C2, D2, E2, F2, G2, H2, \
A3, B3, C3, D3, E3, F3, G3, H3, \
A4, B4, C4, D4, E4, F4, G4, H4, \
A5, B5, C5, D5, E5, F5, G5, H5, \
A6, B6, C6, D6, E6, F6, G6, H6, \
A7, B7, C7, D7, E7, F7, G7, H7, \
A8, B8, C8, D8, E8, F8, G8, H8, \
= MAP.flatten()
class Config(ConfigBase):
# ===== Start of generated config =====
MAP_SIREN_TEMPLATE = []
MOVABLE_ENEMY_TURN = (2,)
MAP_HAS_SIREN = True
MAP_HAS_MOVABLE_ENEMY = True
MAP_HAS_MAP_STORY = False
MAP_HAS_FLEET_STEP = True
MAP_HAS_AMBUSH = False
MAP_HAS_MYSTERY = False
# ===== End of generated config =====
class Campaign(CampaignBase):
MAP = MAP
ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C'
def battle_0(self):
if self.clear_siren():
return True
if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0):
return True
return self.battle_default()
def battle_4(self):
return self.clear_boss()

View File

@@ -0,0 +1,85 @@
from module.campaign.campaign_base import CampaignBase
from module.map.map_base import CampaignMap
from module.map.map_grids import SelectedGrids, RoadGrids
from module.logger import logger
MAP = CampaignMap('B1')
MAP.shape = 'I8'
MAP.camera_data = ['D3', 'D6', 'F3', 'F6']
MAP.camera_data_spawn_point = ['D6']
MAP.map_data = """
++ -- -- -- -- -- -- -- --
ME -- ME ++ ++ ++ -- -- ++
-- ME -- MS -- MS -- ME ++
-- ++ MS -- -- -- Me -- ME
-- Me -- -- SP -- -- __ Me
-- -- -- SP -- -- Me -- --
++ ++ Me -- -- ++ -- MB --
++ ++ -- ME ME ++ ME -- ME
"""
MAP.weight_data = """
50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 2, 'siren': 1},
{'battle': 1, 'enemy': 1},
{'battle': 2, 'enemy': 2},
{'battle': 3, 'enemy': 1},
{'battle': 4, 'enemy': 2, 'boss': 1},
{'battle': 5, 'enemy': 1},
]
A1, B1, C1, D1, E1, F1, G1, H1, I1, \
A2, B2, C2, D2, E2, F2, G2, H2, I2, \
A3, B3, C3, D3, E3, F3, G3, H3, I3, \
A4, B4, C4, D4, E4, F4, G4, H4, I4, \
A5, B5, C5, D5, E5, F5, G5, H5, I5, \
A6, B6, C6, D6, E6, F6, G6, H6, I6, \
A7, B7, C7, D7, E7, F7, G7, H7, I7, \
A8, B8, C8, D8, E8, F8, G8, H8, I8, \
= MAP.flatten()
class Config:
# ===== Start of generated config =====
MAP_SIREN_TEMPLATE = []
MOVABLE_ENEMY_TURN = (2,)
MAP_HAS_SIREN = True
MAP_HAS_MOVABLE_ENEMY = True
MAP_HAS_MAP_STORY = False
MAP_HAS_FLEET_STEP = True
MAP_HAS_AMBUSH = False
MAP_HAS_MYSTERY = False
# ===== End of generated config =====
MAP_CHAPTER_SWITCH_20241219 = True
STAGE_ENTRANCE = ['half', '20240725']
MAP_HAS_MODE_SWITCH = True
STAGE_INCREASE_AB = True
MAP_WALK_USE_CURRENT_FLEET = True
MAP_SIREN_HAS_BOSS_ICON_SMALL = True
MAP_SWIPE_MULTIPLY = (1.138, 1.160)
MAP_SWIPE_MULTIPLY_MINITOUCH = (1.101, 1.121)
MAP_SWIPE_MULTIPLY_MAATOUCH = (1.069, 1.088)
class Campaign(CampaignBase):
MAP = MAP
ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C'
def battle_0(self):
if self.clear_siren():
return True
if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0):
return True
return self.battle_default()
def battle_4(self):
return self.clear_boss()

View File

@@ -0,0 +1,76 @@
from module.campaign.campaign_base import CampaignBase
from module.map.map_base import CampaignMap
from module.map.map_grids import SelectedGrids, RoadGrids
from module.logger import logger
from .b1 import Config as ConfigBase
MAP = CampaignMap('B2')
MAP.shape = 'J8'
MAP.camera_data = ['D2', 'D6', 'G2', 'G6']
MAP.camera_data_spawn_point = ['G2']
MAP.map_data = """
MB ++ ME ME ++ ++ ++ -- -- --
-- -- -- -- ++ ME MS -- -- SP
-- ME ++ -- Me -- -- MS -- --
-- -- Me -- -- __ MS -- -- SP
-- ME -- ++ -- -- -- -- -- --
-- ++ ME -- Me -- Me ++ ++ ME
-- ME -- ME ++ -- -- ME ++ --
-- -- -- -- ++ ME -- -- -- --
"""
MAP.weight_data = """
50 50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50 50
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 2, 'siren': 1},
{'battle': 1, 'enemy': 1},
{'battle': 2, 'enemy': 2},
{'battle': 3, 'enemy': 1},
{'battle': 4, 'enemy': 2},
{'battle': 5, 'enemy': 1, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, \
A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, \
A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, \
A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, \
A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, \
A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, \
A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, \
A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, \
= MAP.flatten()
class Config(ConfigBase):
# ===== Start of generated config =====
MAP_SIREN_TEMPLATE = []
MOVABLE_ENEMY_TURN = (2,)
MAP_HAS_SIREN = True
MAP_HAS_MOVABLE_ENEMY = True
MAP_HAS_MAP_STORY = False
MAP_HAS_FLEET_STEP = True
MAP_HAS_AMBUSH = False
MAP_HAS_MYSTERY = False
# ===== End of generated config =====
class Campaign(CampaignBase):
MAP = MAP
ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C'
def battle_0(self):
if self.clear_siren():
return True
if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0):
return True
return self.battle_default()
def battle_5(self):
return self.fleet_boss.clear_boss()

View File

@@ -0,0 +1,82 @@
from module.campaign.campaign_base import CampaignBase
from module.map.map_base import CampaignMap
from module.map.map_grids import SelectedGrids, RoadGrids
from module.logger import logger
from .b1 import Config as ConfigBase
MAP = CampaignMap('B3')
MAP.shape = 'I10'
MAP.camera_data = ['D4', 'D6', 'D8', 'F4', 'F6', 'F8']
MAP.camera_data_spawn_point = ['D2']
MAP.map_data = """
++ ++ ++ SP -- SP ++ ++ ++
-- -- -- -- -- -- -- -- --
-- Me ++ -- MS -- ++ Me --
-- Me ++ MS -- MS ++ Me --
-- -- Me -- __ -- Me -- --
ME -- -- -- ++ -- -- -- ME
-- ME -- ++ ++ ++ -- ME --
ME -- -- ME -- ME -- -- ME
++ ++ -- -- MB -- -- ++ ++
++ ++ -- ME -- ME -- ++ ++
"""
MAP.weight_data = """
50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 2, 'siren': 2},
{'battle': 1, 'enemy': 1},
{'battle': 2, 'enemy': 2},
{'battle': 3, 'enemy': 1},
{'battle': 4, 'enemy': 2},
{'battle': 5, 'enemy': 1, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, H1, I1, \
A2, B2, C2, D2, E2, F2, G2, H2, I2, \
A3, B3, C3, D3, E3, F3, G3, H3, I3, \
A4, B4, C4, D4, E4, F4, G4, H4, I4, \
A5, B5, C5, D5, E5, F5, G5, H5, I5, \
A6, B6, C6, D6, E6, F6, G6, H6, I6, \
A7, B7, C7, D7, E7, F7, G7, H7, I7, \
A8, B8, C8, D8, E8, F8, G8, H8, I8, \
A9, B9, C9, D9, E9, F9, G9, H9, I9, \
A10, B10, C10, D10, E10, F10, G10, H10, I10, \
= MAP.flatten()
class Config(ConfigBase):
# ===== Start of generated config =====
MAP_SIREN_TEMPLATE = []
MOVABLE_ENEMY_TURN = (2,)
MAP_HAS_SIREN = True
MAP_HAS_MOVABLE_ENEMY = True
MAP_HAS_MAP_STORY = False
MAP_HAS_FLEET_STEP = True
MAP_HAS_AMBUSH = False
MAP_HAS_MYSTERY = False
# ===== End of generated config =====
class Campaign(CampaignBase):
MAP = MAP
ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C'
def battle_0(self):
if self.clear_siren():
return True
if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0):
return True
return self.battle_default()
def battle_5(self):
return self.fleet_boss.clear_boss()

View File

@@ -0,0 +1,84 @@
from module.campaign.campaign_base import CampaignBase
from module.map.map_base import CampaignMap
from module.map.map_grids import SelectedGrids, RoadGrids
from module.logger import logger
MAP = CampaignMap('C1')
MAP.shape = 'I8'
MAP.camera_data = ['E2', 'E6']
MAP.camera_data_spawn_point = ['E2']
MAP.map_data = """
-- -- ME -- ME -- -- -- --
-- ++ -- -- -- ME ++ ++ --
-- ++ -- SP -- -- Me ++ --
-- ME -- -- SP -- -- ME --
++ -- Me -- -- -- Me -- --
-- ME ++ MS -- MS ++ ++ ++
-- -- ME -- __ -- ME ++ --
-- -- -- -- MB -- -- -- --
"""
MAP.weight_data = """
50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 2, 'siren': 2},
{'battle': 1, 'enemy': 1},
{'battle': 2, 'enemy': 2},
{'battle': 3, 'enemy': 1},
{'battle': 4, 'enemy': 1, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, H1, I1, \
A2, B2, C2, D2, E2, F2, G2, H2, I2, \
A3, B3, C3, D3, E3, F3, G3, H3, I3, \
A4, B4, C4, D4, E4, F4, G4, H4, I4, \
A5, B5, C5, D5, E5, F5, G5, H5, I5, \
A6, B6, C6, D6, E6, F6, G6, H6, I6, \
A7, B7, C7, D7, E7, F7, G7, H7, I7, \
A8, B8, C8, D8, E8, F8, G8, H8, I8, \
= MAP.flatten()
class Config:
# ===== Start of generated config =====
MAP_SIREN_TEMPLATE = []
MOVABLE_ENEMY_TURN = (2,)
MAP_HAS_SIREN = True
MAP_HAS_MOVABLE_ENEMY = True
MAP_HAS_MAP_STORY = False
MAP_HAS_FLEET_STEP = True
MAP_HAS_AMBUSH = False
MAP_HAS_MYSTERY = False
# ===== End of generated config =====
MAP_CHAPTER_SWITCH_20241219 = True
STAGE_ENTRANCE = ['half', '20240725']
MAP_HAS_MODE_SWITCH = True
STAGE_INCREASE_AB = True
MAP_WALK_USE_CURRENT_FLEET = True
MAP_SIREN_HAS_BOSS_ICON_SMALL = True
MAP_SWIPE_MULTIPLY = (1.179, 1.201)
MAP_SWIPE_MULTIPLY_MINITOUCH = (1.140, 1.161)
MAP_SWIPE_MULTIPLY_MAATOUCH = (1.107, 1.127)
class Campaign(CampaignBase):
MAP = MAP
ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C'
def battle_0(self):
if self.clear_siren():
return True
if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0):
return True
return self.battle_default()
def battle_4(self):
return self.clear_boss()

View File

@@ -0,0 +1,74 @@
from module.campaign.campaign_base import CampaignBase
from module.map.map_base import CampaignMap
from module.map.map_grids import SelectedGrids, RoadGrids
from module.logger import logger
from .c1 import Config as ConfigBase
MAP = CampaignMap('C2')
MAP.shape = 'J7'
MAP.camera_data = ['D2', 'D5', 'E4']
MAP.camera_data_spawn_point = ['D5']
MAP.map_data = """
-- ME -- -- ME ++ ++ -- -- --
MB -- ME -- -- -- ++ ME ME ++
++ -- ++ ++ Me -- Me -- -- ++
-- -- ++ ++ -- __ -- -- ME --
-- MS -- -- MS -- -- ME ++ --
ME -- -- -- -- -- ME -- -- --
++ -- SP SP -- ++ ++ ++ -- --
"""
MAP.weight_data = """
50 50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50 50
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 2, 'siren': 2},
{'battle': 1, 'enemy': 1},
{'battle': 2, 'enemy': 2},
{'battle': 3, 'enemy': 1},
{'battle': 4, 'enemy': 1, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, \
A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, \
A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, \
A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, \
A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, \
A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, \
A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, \
= MAP.flatten()
class Config(ConfigBase):
# ===== Start of generated config =====
MAP_SIREN_TEMPLATE = []
MOVABLE_ENEMY_TURN = (2,)
MAP_HAS_SIREN = True
MAP_HAS_MOVABLE_ENEMY = True
MAP_HAS_MAP_STORY = False
MAP_HAS_FLEET_STEP = True
MAP_HAS_AMBUSH = False
MAP_HAS_MYSTERY = False
# ===== End of generated config =====
MAP_ENSURE_EDGE_INSIGHT_CORNER = 'bottom-left'
class Campaign(CampaignBase):
MAP = MAP
ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C'
def battle_0(self):
if self.clear_siren():
return True
if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0):
return True
return self.battle_default()
def battle_4(self):
return self.clear_boss()

View File

@@ -0,0 +1,76 @@
from module.campaign.campaign_base import CampaignBase
from module.map.map_base import CampaignMap
from module.map.map_grids import SelectedGrids, RoadGrids
from module.logger import logger
from .c1 import Config as ConfigBase
MAP = CampaignMap('C3')
MAP.shape = 'H8'
MAP.camera_data = ['D4', 'D6', 'E3']
MAP.camera_data_spawn_point = ['D4']
MAP.map_data = """
++ ++ -- -- ME -- -- ME
++ ++ MS -- -- -- ME --
SP -- -- MS -- ++ -- --
SP -- -- MS -- ++ ME --
++ Me __ -- -- -- -- --
++ ME -- Me ++ ++ ++ --
-- -- -- -- Me -- ME --
MB ++ Me ME -- ME -- --
"""
MAP.weight_data = """
50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 2, 'siren': 2},
{'battle': 1, 'enemy': 1},
{'battle': 2, 'enemy': 2},
{'battle': 3, 'enemy': 1},
{'battle': 4, 'enemy': 1},
{'battle': 5, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, H1, \
A2, B2, C2, D2, E2, F2, G2, H2, \
A3, B3, C3, D3, E3, F3, G3, H3, \
A4, B4, C4, D4, E4, F4, G4, H4, \
A5, B5, C5, D5, E5, F5, G5, H5, \
A6, B6, C6, D6, E6, F6, G6, H6, \
A7, B7, C7, D7, E7, F7, G7, H7, \
A8, B8, C8, D8, E8, F8, G8, H8, \
= MAP.flatten()
class Config(ConfigBase):
# ===== Start of generated config =====
MAP_SIREN_TEMPLATE = []
MOVABLE_ENEMY_TURN = (2,)
MAP_HAS_SIREN = True
MAP_HAS_MOVABLE_ENEMY = True
MAP_HAS_MAP_STORY = False
MAP_HAS_FLEET_STEP = True
MAP_HAS_AMBUSH = False
MAP_HAS_MYSTERY = False
# ===== End of generated config =====
class Campaign(CampaignBase):
MAP = MAP
ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C'
def battle_0(self):
if self.clear_siren():
return True
if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0):
return True
return self.battle_default()
def battle_5(self):
return self.fleet_boss.clear_boss()

View File

@@ -0,0 +1,85 @@
from module.campaign.campaign_base import CampaignBase
from module.map.map_base import CampaignMap
from module.map.map_grids import SelectedGrids, RoadGrids
from module.logger import logger
MAP = CampaignMap('D1')
MAP.shape = 'I8'
MAP.camera_data = ['D3', 'D6', 'F3', 'F6']
MAP.camera_data_spawn_point = ['D6']
MAP.map_data = """
++ -- -- -- -- -- -- -- --
ME -- ME ++ ++ ++ -- -- ++
-- ME -- MS -- MS -- ME ++
-- ++ MS -- -- -- Me -- ME
-- Me -- -- SP -- -- __ Me
-- -- -- SP -- -- Me -- --
++ ++ Me -- -- ++ -- MB --
++ ++ -- ME ME ++ ME -- ME
"""
MAP.weight_data = """
50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 2, 'siren': 2},
{'battle': 1, 'enemy': 1},
{'battle': 2, 'enemy': 2},
{'battle': 3, 'enemy': 1},
{'battle': 4, 'enemy': 2},
{'battle': 5, 'enemy': 1, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, H1, I1, \
A2, B2, C2, D2, E2, F2, G2, H2, I2, \
A3, B3, C3, D3, E3, F3, G3, H3, I3, \
A4, B4, C4, D4, E4, F4, G4, H4, I4, \
A5, B5, C5, D5, E5, F5, G5, H5, I5, \
A6, B6, C6, D6, E6, F6, G6, H6, I6, \
A7, B7, C7, D7, E7, F7, G7, H7, I7, \
A8, B8, C8, D8, E8, F8, G8, H8, I8, \
= MAP.flatten()
class Config:
# ===== Start of generated config =====
MAP_SIREN_TEMPLATE = []
MOVABLE_ENEMY_TURN = (2,)
MAP_HAS_SIREN = True
MAP_HAS_MOVABLE_ENEMY = True
MAP_HAS_MAP_STORY = False
MAP_HAS_FLEET_STEP = True
MAP_HAS_AMBUSH = False
MAP_HAS_MYSTERY = False
# ===== End of generated config =====
MAP_CHAPTER_SWITCH_20241219 = True
STAGE_ENTRANCE = ['half', '20240725']
MAP_HAS_MODE_SWITCH = True
STAGE_INCREASE_AB = True
MAP_WALK_USE_CURRENT_FLEET = True
MAP_SIREN_HAS_BOSS_ICON_SMALL = True
MAP_SWIPE_MULTIPLY = (1.138, 1.160)
MAP_SWIPE_MULTIPLY_MINITOUCH = (1.101, 1.121)
MAP_SWIPE_MULTIPLY_MAATOUCH = (1.069, 1.088)
class Campaign(CampaignBase):
MAP = MAP
ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C'
def battle_0(self):
if self.clear_siren():
return True
if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0):
return True
return self.battle_default()
def battle_5(self):
return self.fleet_boss.clear_boss()

View File

@@ -0,0 +1,85 @@
from module.campaign.campaign_base import CampaignBase
from module.map.map_base import CampaignMap
from module.map.map_grids import SelectedGrids, RoadGrids
from module.logger import logger
from .d1 import Config as ConfigBase
MAP = CampaignMap('D2')
MAP.shape = 'J8'
MAP.camera_data = ['D2', 'D6', 'G2', 'G6']
MAP.camera_data_spawn_point = ['G2']
MAP.map_data = """
MB ++ ME ME ++ ++ ++ -- -- --
-- -- -- -- ++ ME MS -- -- SP
-- ME ++ -- Me -- -- MS -- --
-- -- Me -- -- __ MS -- -- SP
-- ME -- ++ -- -- -- -- -- --
-- ++ ME -- Me -- Me ++ ++ ME
-- ME -- ME ++ -- -- ME ++ --
-- -- -- -- ++ ME -- -- -- --
"""
MAP.weight_data = """
50 50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50 50
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 2, 'siren': 2},
{'battle': 1, 'enemy': 1},
{'battle': 2, 'enemy': 2, 'siren': 1},
{'battle': 3, 'enemy': 1},
{'battle': 4, 'enemy': 2},
{'battle': 5, 'enemy': 1},
{'battle': 6, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, \
A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, \
A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, \
A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, \
A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, \
A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, \
A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, \
A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, \
= MAP.flatten()
class Config(ConfigBase):
# ===== Start of generated config =====
MAP_SIREN_TEMPLATE = []
MOVABLE_ENEMY_TURN = (2,)
MAP_HAS_SIREN = True
MAP_HAS_MOVABLE_ENEMY = True
MAP_HAS_MAP_STORY = False
MAP_HAS_FLEET_STEP = True
MAP_HAS_AMBUSH = False
MAP_HAS_MYSTERY = False
# ===== End of generated config =====
class Campaign(CampaignBase):
MAP = MAP
ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C'
def battle_0(self):
if self.clear_siren():
return True
if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=1):
return True
return self.battle_default()
def battle_5(self):
if self.clear_siren():
return True
if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0):
return True
return self.battle_default()
def battle_6(self):
return self.fleet_boss.clear_boss()

View File

@@ -0,0 +1,91 @@
from module.campaign.campaign_base import CampaignBase
from module.map.map_base import CampaignMap
from module.map.map_grids import SelectedGrids, RoadGrids
from module.logger import logger
from .d1 import Config as ConfigBase
MAP = CampaignMap('D3')
MAP.shape = 'I10'
MAP.camera_data = ['D4', 'D6', 'D8', 'F4', 'F6', 'F8']
MAP.camera_data_spawn_point = ['D2']
MAP.map_data = """
++ ++ ++ SP -- SP ++ ++ ++
-- -- -- -- -- -- -- -- --
-- Me ++ -- MS -- ++ Me --
-- Me ++ MS -- MS ++ Me --
-- -- Me -- __ -- Me -- --
ME -- -- -- ++ -- -- -- ME
-- ME -- ++ ++ ++ -- ME --
ME -- -- ME -- ME -- -- ME
++ ++ -- -- MB -- -- ++ ++
++ ++ -- ME -- ME -- ++ ++
"""
MAP.weight_data = """
50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 2, 'siren': 2},
{'battle': 1, 'enemy': 1},
{'battle': 2, 'enemy': 2, 'siren': 1},
{'battle': 3, 'enemy': 1},
{'battle': 4, 'enemy': 2},
{'battle': 5, 'enemy': 1},
{'battle': 6, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, H1, I1, \
A2, B2, C2, D2, E2, F2, G2, H2, I2, \
A3, B3, C3, D3, E3, F3, G3, H3, I3, \
A4, B4, C4, D4, E4, F4, G4, H4, I4, \
A5, B5, C5, D5, E5, F5, G5, H5, I5, \
A6, B6, C6, D6, E6, F6, G6, H6, I6, \
A7, B7, C7, D7, E7, F7, G7, H7, I7, \
A8, B8, C8, D8, E8, F8, G8, H8, I8, \
A9, B9, C9, D9, E9, F9, G9, H9, I9, \
A10, B10, C10, D10, E10, F10, G10, H10, I10, \
= MAP.flatten()
class Config(ConfigBase):
# ===== Start of generated config =====
MAP_SIREN_TEMPLATE = []
MOVABLE_ENEMY_TURN = (2,)
MAP_HAS_SIREN = True
MAP_HAS_MOVABLE_ENEMY = True
MAP_HAS_MAP_STORY = False
MAP_HAS_FLEET_STEP = True
MAP_HAS_AMBUSH = False
MAP_HAS_MYSTERY = False
# ===== End of generated config =====
class Campaign(CampaignBase):
MAP = MAP
ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C'
def battle_0(self):
if self.clear_siren():
return True
if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=1):
return True
return self.battle_default()
def battle_5(self):
if self.clear_siren():
return True
if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0):
return True
return self.battle_default()
def battle_6(self):
return self.fleet_boss.clear_boss()

View File

@@ -0,0 +1,96 @@
from module.campaign.campaign_base import CampaignBase
from module.map.map_base import CampaignMap
from module.map.map_grids import SelectedGrids, RoadGrids
from module.logger import logger
MAP = CampaignMap('SP')
MAP.shape = 'H7'
MAP.camera_data = ['D5', 'E2', 'E5']
MAP.camera_data_spawn_point = ['D2']
MAP.map_data = """
-- -- -- -- ++ -- ME --
-- SP SP -- ++ ME -- ME
-- -- -- -- MS -- ME --
++ ++ ++ MS __ -- ++ ++
-- ME -- -- -- MS -- ++
ME -- ME -- ++ -- MB --
-- ME -- ++ ++ ME -- ME
"""
MAP.weight_data = """
50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 10, 'siren': 3},
{'battle': 1},
{'battle': 2},
{'battle': 3},
{'battle': 4},
{'battle': 5},
{'battle': 6},
{'battle': 7, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, H1, \
A2, B2, C2, D2, E2, F2, G2, H2, \
A3, B3, C3, D3, E3, F3, G3, H3, \
A4, B4, C4, D4, E4, F4, G4, H4, \
A5, B5, C5, D5, E5, F5, G5, H5, \
A6, B6, C6, D6, E6, F6, G6, H6, \
A7, B7, C7, D7, E7, F7, G7, H7, \
= MAP.flatten()
class Config:
# ===== Start of generated config =====
MAP_SIREN_TEMPLATE = []
MOVABLE_ENEMY_TURN = (2,)
MAP_HAS_SIREN = True
MAP_HAS_MOVABLE_ENEMY = True
MAP_HAS_MAP_STORY = False
MAP_HAS_FLEET_STEP = True
MAP_HAS_AMBUSH = False
MAP_HAS_MYSTERY = False
STAR_REQUIRE_1 = 0
STAR_REQUIRE_2 = 0
STAR_REQUIRE_3 = 0
# ===== End of generated config =====
MAP_CHAPTER_SWITCH_20241219 = True
STAGE_ENTRANCE = ['half', '20240725']
MAP_HAS_MODE_SWITCH = False
STAGE_INCREASE_AB = True
MAP_WALK_USE_CURRENT_FLEET = True
MAP_IS_ONE_TIME_STAGE = True
MAP_SIREN_HAS_BOSS_ICON_SMALL = True
MAP_SWIPE_MULTIPLY = (1.162, 1.184)
MAP_SWIPE_MULTIPLY_MINITOUCH = (1.124, 1.145)
MAP_SWIPE_MULTIPLY_MAATOUCH = (1.091, 1.111)
class Campaign(CampaignBase):
MAP = MAP
ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C'
def battle_0(self):
if self.clear_siren():
return True
if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=2):
return True
return self.battle_default()
def battle_5(self):
if self.clear_siren():
return True
if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0):
return True
return self.battle_default()
def battle_7(self):
return self.fleet_boss.clear_boss()

View File

@@ -103,6 +103,7 @@
"CommissionRecord": "do_not",
"CombatRecord": "do_not",
"OpsiRecord": "do_not",
"CL1Record": "do_not",
"AkashiRecord": "do_not",
"MeowfficerBuy": "do_not",
"MeowfficerTalent": "do_not"
@@ -188,6 +189,7 @@
},
"Submarine": {
"Fleet": 0,
"AutoRecommend": false,
"Mode": "do_not_use",
"AutoSearchMode": "sub_standby",
"DistanceToBoss": "2_grid_to_boss"
@@ -265,6 +267,7 @@
},
"Submarine": {
"Fleet": 0,
"AutoRecommend": false,
"Mode": "do_not_use",
"AutoSearchMode": "sub_standby",
"DistanceToBoss": "2_grid_to_boss"
@@ -342,6 +345,7 @@
},
"Submarine": {
"Fleet": 0,
"AutoRecommend": false,
"Mode": "do_not_use",
"AutoSearchMode": "sub_standby",
"DistanceToBoss": "2_grid_to_boss"
@@ -432,6 +436,7 @@
},
"Submarine": {
"Fleet": 0,
"AutoRecommend": false,
"Mode": "do_not_use",
"AutoSearchMode": "sub_standby",
"DistanceToBoss": "2_grid_to_boss"
@@ -469,57 +474,6 @@
"Storage": {}
}
},
"Coalition": {
"Scheduler": {
"Enable": false,
"NextRun": "2020-01-01 00:00:00",
"Command": "Coalition",
"SuccessInterval": 30,
"FailureInterval": 30,
"ServerUpdate": "00:00"
},
"Campaign": {
"Name": "dynamic",
"Event": "campaign_main",
"Mode": "normal",
"UseClearMode": true,
"UseFleetLock": true,
"UseAutoSearch": false,
"Use2xBook": false,
"AmbushEvade": true,
"ClearAfterSinking": false
},
"Coalition": {
"Mode": "hard",
"Fleet": "single"
},
"StopCondition": {
"OilLimit": 1000,
"RunCount": 0,
"MapAchievement": "non_stop",
"StageIncrease": false,
"GetNewShip": false,
"ReachLevel": 0
},
"Emotion": {
"Mode": "calculate",
"Fleet1Value": 119,
"Fleet1Record": "2020-01-01 00:00:00",
"Fleet1Control": "prevent_yellow_face",
"Fleet1Recover": "not_in_dormitory",
"Fleet1Oath": false,
"Fleet1Onsen": false,
"Fleet2Value": 119,
"Fleet2Record": "2020-01-01 00:00:00",
"Fleet2Control": "prevent_yellow_face",
"Fleet2Recover": "not_in_dormitory",
"Fleet2Oath": false,
"Fleet2Onsen": false
},
"Storage": {
"Storage": {}
}
},
"Event": {
"Scheduler": {
"Enable": false,
@@ -561,6 +515,7 @@
},
"Submarine": {
"Fleet": 0,
"AutoRecommend": false,
"Mode": "do_not_use",
"AutoSearchMode": "sub_standby",
"DistanceToBoss": "2_grid_to_boss"
@@ -638,6 +593,7 @@
},
"Submarine": {
"Fleet": 0,
"AutoRecommend": false,
"Mode": "do_not_use",
"AutoSearchMode": "sub_standby",
"DistanceToBoss": "2_grid_to_boss"
@@ -764,6 +720,57 @@
"Storage": {}
}
},
"Coalition": {
"Scheduler": {
"Enable": false,
"NextRun": "2020-01-01 00:00:00",
"Command": "Coalition",
"SuccessInterval": 30,
"FailureInterval": 30,
"ServerUpdate": "00:00"
},
"Campaign": {
"Name": "dynamic",
"Event": "campaign_main",
"Mode": "normal",
"UseClearMode": true,
"UseFleetLock": true,
"UseAutoSearch": false,
"Use2xBook": false,
"AmbushEvade": true,
"ClearAfterSinking": false
},
"Coalition": {
"Mode": "hard",
"Fleet": "single"
},
"StopCondition": {
"OilLimit": 1000,
"RunCount": 0,
"MapAchievement": "non_stop",
"StageIncrease": false,
"GetNewShip": false,
"ReachLevel": 0
},
"Emotion": {
"Mode": "calculate",
"Fleet1Value": 119,
"Fleet1Record": "2020-01-01 00:00:00",
"Fleet1Control": "prevent_yellow_face",
"Fleet1Recover": "not_in_dormitory",
"Fleet1Oath": false,
"Fleet1Onsen": false,
"Fleet2Value": 119,
"Fleet2Record": "2020-01-01 00:00:00",
"Fleet2Control": "prevent_yellow_face",
"Fleet2Recover": "not_in_dormitory",
"Fleet2Oath": false,
"Fleet2Onsen": false
},
"Storage": {
"Storage": {}
}
},
"MaritimeEscort": {
"Scheduler": {
"Enable": false,
@@ -824,6 +831,7 @@
},
"Submarine": {
"Fleet": 0,
"AutoRecommend": false,
"Mode": "do_not_use",
"AutoSearchMode": "sub_standby",
"DistanceToBoss": "2_grid_to_boss"
@@ -860,57 +868,6 @@
"Storage": {}
}
},
"CoalitionSp": {
"Scheduler": {
"Enable": false,
"NextRun": "2020-01-01 00:00:00",
"Command": "CoalitionSp",
"SuccessInterval": 30,
"FailureInterval": 30,
"ServerUpdate": "00:00"
},
"Campaign": {
"Name": "sp",
"Event": "campaign_main",
"Mode": "normal",
"UseClearMode": true,
"UseFleetLock": true,
"UseAutoSearch": false,
"Use2xBook": false,
"AmbushEvade": true,
"ClearAfterSinking": false
},
"Coalition": {
"Mode": "sp",
"Fleet": "single"
},
"StopCondition": {
"OilLimit": 1000,
"RunCount": 0,
"MapAchievement": "non_stop",
"StageIncrease": false,
"GetNewShip": false,
"ReachLevel": 0
},
"Emotion": {
"Mode": "calculate",
"Fleet1Value": 119,
"Fleet1Record": "2020-01-01 00:00:00",
"Fleet1Control": "prevent_yellow_face",
"Fleet1Recover": "not_in_dormitory",
"Fleet1Oath": false,
"Fleet1Onsen": false,
"Fleet2Value": 119,
"Fleet2Record": "2020-01-01 00:00:00",
"Fleet2Control": "prevent_yellow_face",
"Fleet2Recover": "not_in_dormitory",
"Fleet2Oath": false,
"Fleet2Onsen": false
},
"Storage": {
"Storage": {}
}
},
"EventA": {
"Scheduler": {
"Enable": false,
@@ -956,6 +913,7 @@
},
"Submarine": {
"Fleet": 0,
"AutoRecommend": false,
"Mode": "do_not_use",
"AutoSearchMode": "sub_standby",
"DistanceToBoss": "2_grid_to_boss"
@@ -1037,6 +995,7 @@
},
"Submarine": {
"Fleet": 0,
"AutoRecommend": false,
"Mode": "do_not_use",
"AutoSearchMode": "sub_standby",
"DistanceToBoss": "2_grid_to_boss"
@@ -1118,6 +1077,7 @@
},
"Submarine": {
"Fleet": 0,
"AutoRecommend": false,
"Mode": "do_not_use",
"AutoSearchMode": "sub_standby",
"DistanceToBoss": "2_grid_to_boss"
@@ -1199,6 +1159,7 @@
},
"Submarine": {
"Fleet": 0,
"AutoRecommend": false,
"Mode": "do_not_use",
"AutoSearchMode": "sub_standby",
"DistanceToBoss": "2_grid_to_boss"
@@ -1276,6 +1237,7 @@
},
"Submarine": {
"Fleet": 0,
"AutoRecommend": false,
"Mode": "do_not_use",
"AutoSearchMode": "sub_standby",
"DistanceToBoss": "2_grid_to_boss"
@@ -1362,6 +1324,57 @@
"Storage": {}
}
},
"CoalitionSp": {
"Scheduler": {
"Enable": false,
"NextRun": "2020-01-01 00:00:00",
"Command": "CoalitionSp",
"SuccessInterval": 30,
"FailureInterval": 30,
"ServerUpdate": "00:00"
},
"Campaign": {
"Name": "sp",
"Event": "campaign_main",
"Mode": "normal",
"UseClearMode": true,
"UseFleetLock": true,
"UseAutoSearch": false,
"Use2xBook": false,
"AmbushEvade": true,
"ClearAfterSinking": false
},
"Coalition": {
"Mode": "sp",
"Fleet": "single"
},
"StopCondition": {
"OilLimit": 1000,
"RunCount": 0,
"MapAchievement": "non_stop",
"StageIncrease": false,
"GetNewShip": false,
"ReachLevel": 0
},
"Emotion": {
"Mode": "calculate",
"Fleet1Value": 119,
"Fleet1Record": "2020-01-01 00:00:00",
"Fleet1Control": "prevent_yellow_face",
"Fleet1Recover": "not_in_dormitory",
"Fleet1Oath": false,
"Fleet1Onsen": false,
"Fleet2Value": 119,
"Fleet2Record": "2020-01-01 00:00:00",
"Fleet2Control": "prevent_yellow_face",
"Fleet2Recover": "not_in_dormitory",
"Fleet2Oath": false,
"Fleet2Onsen": false
},
"Storage": {
"Storage": {}
}
},
"Commission": {
"Scheduler": {
"Enable": false,
@@ -1578,9 +1591,7 @@
"Option2": 0,
"Character2": "manjuu",
"Option3": 0,
"Character3": "manjuu",
"Option4": 0,
"Character4": "manjuu"
"Character3": "manjuu"
},
"Island4": {
"Receive": false,
@@ -1609,7 +1620,11 @@
"Option1": 0,
"Character1": "manjuu",
"Option2": 0,
"Character2": "manjuu"
"Character2": "manjuu",
"Option3": 0,
"Character3": "manjuu",
"Option4": 0,
"Character4": "manjuu"
},
"Island7": {
"Receive": false,
@@ -1674,6 +1689,13 @@
"Option2": 0,
"Character2": "manjuu"
},
"Island16": {
"Receive": false,
"Option1": 0,
"Character1": "manjuu",
"Option2": 0,
"Character2": "manjuu"
},
"Storage": {
"Storage": {}
}
@@ -1761,6 +1783,7 @@
"Refresh": false,
"BuySkinBox": "disabled",
"BuySkinBoxAmount": 0,
"SkinBoxPositionFilter": "1 > 2 > 3",
"ConsumeCoins": false,
"Filter": "BookRedT3 > BookYellowT3 > BookBlueT3 > BookRedT2\n> Cube\n> FoodT6 > FoodT5"
},
@@ -2245,6 +2268,11 @@
"Storage": {}
}
},
"IslandPearl": {
"Storage": {
"Storage": {}
}
},
"Benchmark": {
"Benchmark": {
"DeviceType": "emulator",

View File

@@ -567,6 +567,11 @@ class MapData:
lines.append(f' MAP_HAS_FLEET_STEP = {self.MAP_HAS_FLEET_STEP}')
lines.append(f' MAP_HAS_AMBUSH = {self.MAP_HAS_AMBUSH}')
lines.append(f' MAP_HAS_MYSTERY = {self.MAP_HAS_MYSTERY}')
lines.append(f' MAP_CHAPTER_SWITCH_20241219 = True')
lines.append(f" STAGE_ENTRANCE = ['half', '20240725']")
lines.append(f' MAP_HAS_MODE_SWITCH = True')
lines.append(f' STAGE_INCREASE_AB = True')
lines.append(f' MAP_WALK_USE_CURRENT_FLEET = True')
if self.MAP_HAS_PORTAL:
lines.append(f' MAP_HAS_PORTAL = {self.MAP_HAS_PORTAL}')
if self.MAP_HAS_LAND_BASED:

View File

@@ -41,11 +41,21 @@ class CampaignOcr(ModuleBase):
@staticmethod
def _campaign_ocr_result_process(result):
# The result will be like '7--2', because tha dash in game is '' not '-'
result = result.lower().replace('--', '-').replace('--', '-')
if result.startswith('-'):
result = result[1:]
result = result.replace('--', '-').replace('--', '-').lstrip('-')
# Replace wrong 'I' from results like 'I1-1', '1I-1', 'I-I', '11-I', 'I4-4', to '1'
# while keeping results like 'isp-2', 'sp1'
def replace_func(match):
segment = match.group(0)
return segment.replace('I', '1')
result = re.sub(r'[0-9I]+-[0-9I]+', replace_func, result, count=1)
# Convert '72' to '7-2'
if len(result) == 2 and result[0].isdigit():
result = '-'.join(result)
result = result.lower()
return result
@staticmethod

View File

@@ -124,6 +124,10 @@ class Combat(Level, HPBalancer, Retirement, SubmarineCall, CombatAuto, CombatMan
return PAUSE_ShadowPuppetry
if PAUSE_MaidCafe.match_template_color(self.device.image, offset=(10, 10)):
return PAUSE_MaidCafe
if PAUSE_Ancient.match_template_color(self.device.image, offset=(10, 10)):
return PAUSE_Ancient
if PAUSE_SpringInn.match_template_color(self.device.image, offset=(10, 10)):
return PAUSE_SpringInn
return False
def handle_combat_quit(self, offset=(20, 20), interval=3):
@@ -175,6 +179,10 @@ class Combat(Level, HPBalancer, Retirement, SubmarineCall, CombatAuto, CombatMan
self.device.click(QUIT_MaidCafe)
timer.reset()
return True
if QUIT_SpringInn.match_luma(self.device.image, offset=offset):
self.device.click(QUIT_SpringInn)
timer.reset()
return True
return False
def handle_combat_quit_reconfirm(self, interval=2):

View File

@@ -5,6 +5,7 @@ from module.base.template import Template
# Don't modify it manually.
PAUSE = Button(area={'cn': (1158, 40, 1199, 58), 'en': (1155, 38, 1216, 51), 'jp': (1232, 36, 1240, 60), 'tw': (1217, 36, 1225, 59)}, color={'cn': (189, 190, 202), 'en': (164, 169, 181), 'jp': (244, 241, 246), 'tw': (247, 243, 247)}, button={'cn': (1157, 34, 1241, 61), 'en': (1136, 26, 1270, 63), 'jp': (1141, 38, 1220, 57), 'tw': (1157, 34, 1241, 61)}, file={'cn': './assets/cn/combat_ui/PAUSE.png', 'en': './assets/en/combat_ui/PAUSE.png', 'jp': './assets/jp/combat_ui/PAUSE.png', 'tw': './assets/tw/combat_ui/PAUSE.png'})
PAUSE_Ancient = Button(area={'cn': (1228, 36, 1245, 55), 'en': (1228, 36, 1245, 55), 'jp': (1228, 36, 1245, 55), 'tw': (1228, 36, 1245, 55)}, color={'cn': (172, 161, 144), 'en': (172, 161, 144), 'jp': (172, 161, 144), 'tw': (172, 161, 144)}, button={'cn': (1228, 36, 1245, 55), 'en': (1228, 36, 1245, 55), 'jp': (1228, 36, 1245, 55), 'tw': (1228, 36, 1245, 55)}, file={'cn': './assets/cn/combat_ui/PAUSE_Ancient.png', 'en': './assets/cn/combat_ui/PAUSE_Ancient.png', 'jp': './assets/cn/combat_ui/PAUSE_Ancient.png', 'tw': './assets/cn/combat_ui/PAUSE_Ancient.png'})
PAUSE_Christmas = Button(area={'cn': (1234, 35, 1250, 56), 'en': (1234, 35, 1250, 56), 'jp': (1234, 35, 1250, 56), 'tw': (1234, 35, 1250, 56)}, color={'cn': (158, 181, 210), 'en': (158, 181, 210), 'jp': (158, 181, 210), 'tw': (158, 181, 210)}, button={'cn': (1234, 35, 1250, 56), 'en': (1234, 35, 1250, 56), 'jp': (1234, 35, 1250, 56), 'tw': (1234, 35, 1250, 56)}, file={'cn': './assets/cn/combat_ui/PAUSE_Christmas.png', 'en': './assets/cn/combat_ui/PAUSE_Christmas.png', 'jp': './assets/cn/combat_ui/PAUSE_Christmas.png', 'tw': './assets/cn/combat_ui/PAUSE_Christmas.png'})
PAUSE_Cyber = Button(area={'cn': (1231, 32, 1253, 59), 'en': (1231, 32, 1253, 59), 'jp': (1231, 32, 1253, 59), 'tw': (1231, 32, 1253, 59)}, color={'cn': (40, 140, 157), 'en': (40, 140, 157), 'jp': (40, 140, 157), 'tw': (40, 140, 157)}, button={'cn': (1231, 32, 1253, 59), 'en': (1231, 32, 1253, 59), 'jp': (1231, 32, 1253, 59), 'tw': (1231, 32, 1253, 59)}, file={'cn': './assets/cn/combat_ui/PAUSE_Cyber.png', 'en': './assets/cn/combat_ui/PAUSE_Cyber.png', 'jp': './assets/cn/combat_ui/PAUSE_Cyber.png', 'tw': './assets/cn/combat_ui/PAUSE_Cyber.png'})
PAUSE_DOUBLE_CHECK = Button(area={'cn': (1226, 35, 1231, 60), 'en': (1226, 35, 1231, 61), 'jp': (1226, 35, 1230, 60), 'tw': (1226, 35, 1231, 60)}, color={'cn': (96, 104, 136), 'en': (83, 98, 118), 'jp': (97, 102, 120), 'tw': (96, 104, 136)}, button={'cn': (1226, 35, 1231, 60), 'en': (1226, 35, 1231, 61), 'jp': (1226, 35, 1230, 60), 'tw': (1226, 35, 1231, 60)}, file={'cn': './assets/cn/combat_ui/PAUSE_DOUBLE_CHECK.png', 'en': './assets/en/combat_ui/PAUSE_DOUBLE_CHECK.png', 'jp': './assets/jp/combat_ui/PAUSE_DOUBLE_CHECK.png', 'tw': './assets/tw/combat_ui/PAUSE_DOUBLE_CHECK.png'})
@@ -19,6 +20,7 @@ PAUSE_Nurse = Button(area={'cn': (1236, 33, 1251, 50), 'en': (1236, 33, 1251, 50
PAUSE_Pharaoh = Button(area={'cn': (1229, 55, 1259, 62), 'en': (1229, 55, 1259, 62), 'jp': (1229, 55, 1259, 62), 'tw': (1229, 55, 1259, 62)}, color={'cn': (164, 119, 78), 'en': (164, 119, 78), 'jp': (164, 119, 78), 'tw': (164, 119, 78)}, button={'cn': (1229, 55, 1259, 62), 'en': (1229, 55, 1259, 62), 'jp': (1229, 55, 1259, 62), 'tw': (1229, 55, 1259, 62)}, file={'cn': './assets/cn/combat_ui/PAUSE_Pharaoh.png', 'en': './assets/cn/combat_ui/PAUSE_Pharaoh.png', 'jp': './assets/cn/combat_ui/PAUSE_Pharaoh.png', 'tw': './assets/cn/combat_ui/PAUSE_Pharaoh.png'})
PAUSE_Seaside = Button(area={'cn': (1214, 31, 1239, 59), 'en': (1214, 31, 1239, 59), 'jp': (1214, 31, 1239, 59), 'tw': (1214, 31, 1239, 59)}, color={'cn': (172, 196, 212), 'en': (172, 196, 212), 'jp': (172, 196, 212), 'tw': (172, 196, 212)}, button={'cn': (1214, 31, 1239, 59), 'en': (1214, 31, 1239, 59), 'jp': (1214, 31, 1239, 59), 'tw': (1214, 31, 1239, 59)}, file={'cn': './assets/cn/combat_ui/PAUSE_Seaside.png', 'en': './assets/cn/combat_ui/PAUSE_Seaside.png', 'jp': './assets/cn/combat_ui/PAUSE_Seaside.png', 'tw': './assets/cn/combat_ui/PAUSE_Seaside.png'})
PAUSE_ShadowPuppetry = Button(area={'cn': (1216, 37, 1234, 55), 'en': (1216, 37, 1234, 55), 'jp': (1216, 37, 1234, 55), 'tw': (1216, 37, 1234, 55)}, color={'cn': (139, 112, 72), 'en': (139, 112, 72), 'jp': (139, 112, 72), 'tw': (139, 112, 72)}, button={'cn': (1216, 37, 1234, 55), 'en': (1216, 37, 1234, 55), 'jp': (1216, 37, 1234, 55), 'tw': (1216, 37, 1234, 55)}, file={'cn': './assets/cn/combat_ui/PAUSE_ShadowPuppetry.png', 'en': './assets/cn/combat_ui/PAUSE_ShadowPuppetry.png', 'jp': './assets/cn/combat_ui/PAUSE_ShadowPuppetry.png', 'tw': './assets/cn/combat_ui/PAUSE_ShadowPuppetry.png'})
PAUSE_SpringInn = Button(area={'cn': (1212, 37, 1235, 61), 'en': (1212, 37, 1235, 61), 'jp': (1212, 37, 1235, 61), 'tw': (1212, 37, 1235, 61)}, color={'cn': (201, 91, 78), 'en': (201, 91, 78), 'jp': (201, 91, 78), 'tw': (201, 91, 78)}, button={'cn': (1212, 37, 1235, 61), 'en': (1212, 37, 1235, 61), 'jp': (1212, 37, 1235, 61), 'tw': (1212, 37, 1235, 61)}, file={'cn': './assets/cn/combat_ui/PAUSE_SpringInn.png', 'en': './assets/cn/combat_ui/PAUSE_SpringInn.png', 'jp': './assets/cn/combat_ui/PAUSE_SpringInn.png', 'tw': './assets/cn/combat_ui/PAUSE_SpringInn.png'})
PAUSE_Star = Button(area={'cn': (1234, 36, 1250, 57), 'en': (1234, 36, 1250, 57), 'jp': (1234, 36, 1250, 57), 'tw': (1234, 36, 1250, 57)}, color={'cn': (169, 179, 179), 'en': (169, 179, 179), 'jp': (169, 179, 179), 'tw': (169, 179, 179)}, button={'cn': (1234, 36, 1250, 57), 'en': (1234, 36, 1250, 57), 'jp': (1234, 36, 1250, 57), 'tw': (1234, 36, 1250, 57)}, file={'cn': './assets/cn/combat_ui/PAUSE_Star.png', 'en': './assets/cn/combat_ui/PAUSE_Star.png', 'jp': './assets/cn/combat_ui/PAUSE_Star.png', 'tw': './assets/cn/combat_ui/PAUSE_Star.png'})
QUIT = Button(area={'cn': (420, 490, 593, 548), 'en': (473, 508, 567, 532), 'jp': (433, 490, 606, 547), 'tw': (433, 490, 606, 547)}, color={'cn': (199, 122, 114), 'en': (216, 168, 164), 'jp': (196, 120, 113), 'tw': (200, 126, 118)}, button={'cn': (420, 490, 593, 548), 'en': (473, 508, 567, 532), 'jp': (433, 490, 606, 547), 'tw': (433, 490, 606, 547)}, file={'cn': './assets/cn/combat_ui/QUIT.png', 'en': './assets/en/combat_ui/QUIT.png', 'jp': './assets/jp/combat_ui/QUIT.png', 'tw': './assets/tw/combat_ui/QUIT.png'})
QUIT_Christmas = Button(area={'cn': (400, 506, 477, 525), 'en': (410, 507, 469, 524), 'jp': (400, 506, 477, 525), 'tw': (400, 506, 477, 525)}, color={'cn': (195, 139, 166), 'en': (207, 166, 185), 'jp': (195, 139, 166), 'tw': (195, 139, 166)}, button={'cn': (400, 506, 477, 525), 'en': (410, 507, 469, 524), 'jp': (400, 506, 477, 525), 'tw': (400, 506, 477, 525)}, file={'cn': './assets/cn/combat_ui/QUIT_Christmas.png', 'en': './assets/en/combat_ui/QUIT_Christmas.png', 'jp': './assets/cn/combat_ui/QUIT_Christmas.png', 'tw': './assets/cn/combat_ui/QUIT_Christmas.png'})
@@ -30,3 +32,4 @@ QUIT_Ninja = Button(area={'cn': (398, 509, 477, 528), 'en': (398, 509, 477, 528)
QUIT_Nurse = Button(area={'cn': (400, 507, 477, 525), 'en': (400, 507, 477, 525), 'jp': (400, 507, 477, 525), 'tw': (400, 507, 477, 525)}, color={'cn': (254, 193, 170), 'en': (254, 193, 170), 'jp': (254, 193, 170), 'tw': (254, 193, 170)}, button={'cn': (400, 507, 477, 525), 'en': (400, 507, 477, 525), 'jp': (400, 507, 477, 525), 'tw': (400, 507, 477, 525)}, file={'cn': './assets/cn/combat_ui/QUIT_Nurse.png', 'en': './assets/cn/combat_ui/QUIT_Nurse.png', 'jp': './assets/cn/combat_ui/QUIT_Nurse.png', 'tw': './assets/cn/combat_ui/QUIT_Nurse.png'})
QUIT_Pharaoh = Button(area={'cn': (400, 507, 477, 525), 'en': (400, 507, 477, 525), 'jp': (400, 507, 477, 525), 'tw': (400, 507, 477, 525)}, color={'cn': (204, 132, 108), 'en': (204, 132, 108), 'jp': (204, 132, 108), 'tw': (204, 132, 108)}, button={'cn': (400, 507, 477, 525), 'en': (400, 507, 477, 525), 'jp': (400, 507, 477, 525), 'tw': (400, 507, 477, 525)}, file={'cn': './assets/cn/combat_ui/QUIT_Pharaoh.png', 'en': './assets/cn/combat_ui/QUIT_Pharaoh.png', 'jp': './assets/cn/combat_ui/QUIT_Pharaoh.png', 'tw': './assets/cn/combat_ui/QUIT_Pharaoh.png'})
QUIT_Seaside = Button(area={'cn': (398, 509, 476, 528), 'en': (398, 509, 476, 528), 'jp': (398, 509, 476, 528), 'tw': (398, 509, 476, 528)}, color={'cn': (247, 208, 188), 'en': (247, 208, 188), 'jp': (247, 208, 188), 'tw': (247, 208, 188)}, button={'cn': (398, 509, 476, 528), 'en': (398, 509, 476, 528), 'jp': (398, 509, 476, 528), 'tw': (398, 509, 476, 528)}, file={'cn': './assets/cn/combat_ui/QUIT_Seaside.png', 'en': './assets/cn/combat_ui/QUIT_Seaside.png', 'jp': './assets/cn/combat_ui/QUIT_Seaside.png', 'tw': './assets/cn/combat_ui/QUIT_Seaside.png'})
QUIT_SpringInn = Button(area={'cn': (396, 559, 478, 584), 'en': (396, 559, 478, 584), 'jp': (396, 559, 478, 584), 'tw': (396, 559, 478, 584)}, color={'cn': (145, 88, 80), 'en': (145, 88, 80), 'jp': (145, 88, 80), 'tw': (145, 88, 80)}, button={'cn': (396, 559, 478, 584), 'en': (396, 559, 478, 584), 'jp': (396, 559, 478, 584), 'tw': (396, 559, 478, 584)}, file={'cn': './assets/cn/combat_ui/QUIT_SpringInn.png', 'en': './assets/cn/combat_ui/QUIT_SpringInn.png', 'jp': './assets/cn/combat_ui/QUIT_SpringInn.png', 'tw': './assets/cn/combat_ui/QUIT_SpringInn.png'})

File diff suppressed because it is too large Load Diff

View File

@@ -114,6 +114,9 @@ DropRecord:
OpsiRecord:
value: do_not
option: [ do_not, save, upload, save_and_upload ]
CL1Record:
value: do_not
option: [ do_not, save, upload, save_and_upload ]
AkashiRecord:
value: do_not
option: [ do_not, save ]
@@ -205,6 +208,7 @@ Submarine:
Fleet:
value: 0
option: [ 0, 1, 2 ]
AutoRecommend: false
Mode:
value: do_not_use
option: [ do_not_use, hunt_only, boss_only, hunt_and_boss, every_combat ]
@@ -516,6 +520,12 @@ _Island:
IslandOption11: &IslandOption11
value: 0
option: [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ]
IslandOption12: &IslandOption12
value: 0
option: [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 ]
IslandOption16: &IslandOption16
value: 0
option: [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 ]
IslandCharacter: &IslandCharacter
value: manjuu
option:
@@ -528,9 +538,14 @@ _Island:
- akashi
- ying_swei
- chao_ho
- william_d_porter
- chen_hai
- unicorn
- cheshire
- amagi_chan
- helena
- atago
- friedrich_der_grobe
Island1:
Receive: false
Option1: *IslandOption8
@@ -560,6 +575,14 @@ Island2:
option: [ 0, 4 ]
Character4: *IslandCharacter
Island3:
Receive: false
Option1: *IslandOption16
Character1: *IslandCharacter
Option2: *IslandOption16
Character2: *IslandCharacter
Option3: *IslandOption16
Character3: *IslandCharacter
Island4:
Receive: false
Option1: *IslandOption6
Character1: *IslandCharacter
@@ -569,7 +592,7 @@ Island3:
Character3: *IslandCharacter
Option4: *IslandOption6
Character4: *IslandCharacter
Island4:
Island5:
Receive: false
Option1: *IslandOption4
Character1: *IslandCharacter
@@ -579,22 +602,16 @@ Island4:
Character3: *IslandCharacter
Option4: *IslandOption4
Character4: *IslandCharacter
Island5:
Receive: false
Option1: *IslandOption9
Character1: *IslandCharacter
Option2: *IslandOption9
Character2: *IslandCharacter
Option3: *IslandOption9
Character3: *IslandCharacter
Option4: *IslandOption9
Character4: *IslandCharacter
Island6:
Receive: false
Option1: *IslandOption7
Character1: *IslandCharacter
Option2: *IslandOption7
Character2: *IslandCharacter
Option3: *IslandOption7
Character3: *IslandCharacter
Option4: *IslandOption7
Character4: *IslandCharacter
Island7:
Receive: false
Option1: *IslandOption9
@@ -602,29 +619,29 @@ Island7:
Option2: *IslandOption9
Character2: *IslandCharacter
Island8:
Receive: false
Option1: *IslandOption12
Character1: *IslandCharacter
Option2: *IslandOption12
Character2: *IslandCharacter
Island9:
Receive: false
Option1: *IslandOption11
Character1: *IslandCharacter
Option2: *IslandOption11
Character2: *IslandCharacter
Island9:
Island10:
Receive: false
Option1: *IslandOption10
Character1: *IslandCharacter
Option2: *IslandOption10
Character2: *IslandCharacter
Island11:
Receive: false
Option1: *IslandOption9
Character1: *IslandCharacter
Option2: *IslandOption9
Character2: *IslandCharacter
Island10:
Receive: false
Option1: *IslandOption7
Character1: *IslandCharacter
Option2: *IslandOption7
Character2: *IslandCharacter
Island11:
Receive: false
Option1: *IslandOption5
Character1: *IslandCharacter
Option2: *IslandOption5
Character2: *IslandCharacter
Island12:
Receive: false
Option1: *IslandOption6
@@ -632,18 +649,24 @@ Island12:
Option2: *IslandOption6
Character2: *IslandCharacter
Island13:
Receive: false
Option1: *IslandOption6
Character1: *IslandCharacter
Option2: *IslandOption6
Character2: *IslandCharacter
Island14:
Receive: false
Option1: *IslandOption4
Character1: *IslandCharacter
Option2: *IslandOption4
Character2: *IslandCharacter
Island14:
Island15:
Receive: false
Option1: *IslandOption9
Character1: *IslandCharacter
Option2: *IslandOption9
Character2: *IslandCharacter
Island15:
Island16:
Receive: false
Option1: *IslandOption9
Character1: *IslandCharacter
@@ -656,6 +679,8 @@ GeneralShop:
value: disabled
option: [ disabled, unlimited, specified ]
BuySkinBoxAmount: 0
SkinBoxPositionFilter: |-
1 > 2 > 3
ConsumeCoins: false
Filter: |-
BookRedT3 > BookYellowT3 > BookBlueT3 > BookRedT2
@@ -737,7 +762,7 @@ CoreShop:
ShipyardDr:
ResearchSeries:
value: 2
option: [ 2, 3, 4 ]
option: [ 2, 3, 4, 5 ]
ShipIndex:
value: 0
option: [ 0, 1, 2, 3, 4, 5, 6 ]
@@ -746,7 +771,7 @@ ShipyardDr:
Shipyard:
ResearchSeries:
value: 1
option: [ 1, 2, 3, 4, 5 ]
option: [ 1, 2, 3, 4, 5, 6 ]
ShipIndex:
value: 0
option: [ 0, 1, 2, 3, 4, 5, 6 ]

View File

@@ -23,11 +23,11 @@
"page": "setting",
"tasks": [
"EventGeneral",
"Coalition",
"Event",
"Event2",
"Raid",
"Hospital",
"Coalition",
"MaritimeEscort",
"WarArchives"
]
@@ -36,13 +36,13 @@
"menu": "collapse",
"page": "setting",
"tasks": [
"CoalitionSp",
"EventA",
"EventB",
"EventC",
"EventD",
"EventSp",
"RaidDaily"
"RaidDaily",
"CoalitionSp"
]
},
"Reward": {
@@ -105,6 +105,7 @@
"OpsiDaemon",
"EventStory",
"BoxDisassemble",
"IslandPearl",
"Benchmark",
"AzurLaneUncensored",
"GameManager"

View File

@@ -73,12 +73,6 @@ Event:
EventGeneral:
- EventGeneral
- TaskBalancer
Coalition:
- Scheduler
- Campaign
- Coalition
- StopCondition
- Emotion
Event:
- Scheduler
- Campaign
@@ -108,6 +102,12 @@ Event:
- Hospital
- StopCondition
- Emotion
Coalition:
- Scheduler
- Campaign
- Coalition
- StopCondition
- Emotion
MaritimeEscort:
- Scheduler
- MaritimeEscort
@@ -129,12 +129,6 @@ EventDaily:
menu: 'collapse'
page: 'setting'
tasks:
CoalitionSp:
- Scheduler
- Campaign
- Coalition
- StopCondition
- Emotion
EventA:
- Scheduler
- EventDaily
@@ -190,6 +184,12 @@ EventDaily:
- Campaign
- StopCondition
- Emotion
CoalitionSp:
- Scheduler
- Campaign
- Coalition
- StopCondition
- Emotion
# ==================== Reward ====================
@@ -243,6 +243,7 @@ Reward:
- Island13
- Island14
- Island15
- Island16
# ==================== DailyMission ====================
@@ -359,6 +360,8 @@ Tool:
- EventStory
BoxDisassemble:
- BoxDisassemble
IslandPearl:
- IslandPearl
Benchmark:
- Benchmark
AzurLaneUncensored:

View File

@@ -20,7 +20,7 @@ class GeneratedConfig:
# Group `Emulator`
Emulator_Serial = 'auto'
Emulator_PackageName = 'auto' # auto, com.bilibili.azurlane, com.YoStarEN.AzurLane, com.YoStarJP.AzurLane, com.hkmanjuu.azurlane.gp, com.bilibili.blhx.huawei, com.bilibili.blhx.honor, com.bilibili.blhx.mi, com.tencent.tmgp.bilibili.blhx, com.bilibili.blhx.baidu, com.bilibili.blhx.qihoo, com.bilibili.blhx.nearme.gamecenter, com.bilibili.blhx.vivo, com.bilibili.blhx.mz, com.bilibili.blhx.dl, com.bilibili.blhx.lenovo, com.bilibili.blhx.uc, com.bilibili.blhx.mzw, com.yiwu.blhx.yx15, com.bilibili.blhx.m4399, com.bilibili.blhx.bilibiliMove, com.hkmanjuu.azurlane.gp.mc
Emulator_ServerName = 'disabled' # disabled, cn_android-0, cn_android-1, cn_android-2, cn_android-3, cn_android-4, cn_android-5, cn_android-6, cn_android-7, cn_android-8, cn_android-9, cn_android-10, cn_android-11, cn_android-12, cn_android-13, cn_android-14, cn_android-15, cn_android-16, cn_android-17, cn_android-18, cn_android-19, cn_android-20, cn_android-21, cn_android-22, cn_android-23, cn_android-24, cn_android-25, cn_android-26, cn_android-27, cn_ios-0, cn_ios-1, cn_ios-2, cn_ios-3, cn_ios-4, cn_ios-5, cn_ios-6, cn_ios-7, cn_ios-8, cn_ios-9, cn_ios-10, cn_channel-0, cn_channel-1, cn_channel-2, cn_channel-3, cn_channel-4, en-0, en-1, en-2, en-3, en-4, en-5, jp-0, jp-1, jp-2, jp-3, jp-4, jp-5, jp-6, jp-7, jp-8, jp-9, jp-10, jp-11, jp-12, jp-13, jp-14, jp-15, jp-16, jp-17
Emulator_ServerName = 'disabled' # disabled, cn_android-0, cn_android-1, cn_android-2, cn_android-3, cn_android-4, cn_android-5, cn_android-6, cn_android-7, cn_android-8, cn_android-9, cn_android-10, cn_android-11, cn_android-12, cn_android-13, cn_android-14, cn_android-15, cn_android-16, cn_android-17, cn_android-18, cn_android-19, cn_android-20, cn_android-21, cn_android-22, cn_android-23, cn_android-24, cn_android-25, cn_android-26, cn_android-27, cn_android-28, cn_ios-0, cn_ios-1, cn_ios-2, cn_ios-3, cn_ios-4, cn_ios-5, cn_ios-6, cn_ios-7, cn_ios-8, cn_ios-9, cn_ios-10, cn_channel-0, cn_channel-1, cn_channel-2, cn_channel-3, cn_channel-4, en-0, en-1, en-2, en-3, en-4, en-5, jp-0, jp-1, jp-2, jp-3, jp-4, jp-5, jp-6, jp-7, jp-8, jp-9, jp-10, jp-11, jp-12, jp-13, jp-14, jp-15, jp-16, jp-17
Emulator_ScreenshotMethod = 'auto' # auto, ADB, ADB_nc, uiautomator2, aScreenCap, aScreenCap_nc, DroidCast, DroidCast_raw, nemu_ipc, ldopengl
Emulator_ControlMethod = 'MaaTouch' # ADB, uiautomator2, minitouch, Hermit, MaaTouch
Emulator_ScreenshotDedithering = False
@@ -52,6 +52,7 @@ class GeneratedConfig:
DropRecord_CommissionRecord = 'do_not' # do_not, save, upload, save_and_upload
DropRecord_CombatRecord = 'do_not' # do_not, save
DropRecord_OpsiRecord = 'do_not' # do_not, save, upload, save_and_upload
DropRecord_CL1Record = 'do_not' # do_not, save, upload, save_and_upload
DropRecord_AkashiRecord = 'do_not' # do_not, save
DropRecord_MeowfficerBuy = 'do_not' # do_not, save
DropRecord_MeowfficerTalent = 'do_not' # do_not, save, upload, save_and_upload
@@ -109,6 +110,7 @@ class GeneratedConfig:
# Group `Submarine`
Submarine_Fleet = 0 # 0, 1, 2
Submarine_AutoRecommend = False
Submarine_Mode = 'do_not_use' # do_not_use, hunt_only, boss_only, hunt_and_boss, every_combat
Submarine_AutoSearchMode = 'sub_standby' # sub_standby, sub_auto_call
Submarine_DistanceToBoss = '2_grid_to_boss' # to_boss_position, 1_grid_to_boss, 2_grid_to_boss, use_open_ocean_support
@@ -279,133 +281,143 @@ class GeneratedConfig:
# Group `Island1`
Island1_Receive = False
Island1_Option1 = 0 # 0, 1, 2, 3, 4, 5, 6, 7, 8
Island1_Character1 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, unicorn, cheshire, amagi_chan
Island1_Character1 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, william_d_porter, chen_hai, unicorn, cheshire, amagi_chan, helena, atago, friedrich_der_grobe
Island1_Option2 = 0 # 0, 1, 2, 3, 4, 5, 6, 7, 8
Island1_Character2 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, unicorn, cheshire, amagi_chan
Island1_Character2 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, william_d_porter, chen_hai, unicorn, cheshire, amagi_chan, helena, atago, friedrich_der_grobe
Island1_Option3 = 0 # 0, 1, 2, 3, 4, 5, 6, 7, 8
Island1_Character3 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, unicorn, cheshire, amagi_chan
Island1_Character3 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, william_d_porter, chen_hai, unicorn, cheshire, amagi_chan, helena, atago, friedrich_der_grobe
Island1_Option4 = 0 # 0, 1, 2, 3, 4, 5, 6, 7, 8
Island1_Character4 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, unicorn, cheshire, amagi_chan
Island1_Character4 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, william_d_porter, chen_hai, unicorn, cheshire, amagi_chan, helena, atago, friedrich_der_grobe
# Group `Island2`
Island2_Receive = False
Island2_Option1 = 0 # 0, 1
Island2_Character1 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, unicorn, cheshire, amagi_chan
Island2_Character1 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, william_d_porter, chen_hai, unicorn, cheshire, amagi_chan, helena, atago, friedrich_der_grobe
Island2_Option2 = 0 # 0, 2
Island2_Character2 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, unicorn, cheshire, amagi_chan
Island2_Character2 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, william_d_porter, chen_hai, unicorn, cheshire, amagi_chan, helena, atago, friedrich_der_grobe
Island2_Option3 = 0 # 0, 3
Island2_Character3 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, unicorn, cheshire, amagi_chan
Island2_Character3 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, william_d_porter, chen_hai, unicorn, cheshire, amagi_chan, helena, atago, friedrich_der_grobe
Island2_Option4 = 0 # 0, 4
Island2_Character4 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, unicorn, cheshire, amagi_chan
Island2_Character4 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, william_d_porter, chen_hai, unicorn, cheshire, amagi_chan, helena, atago, friedrich_der_grobe
# Group `Island3`
Island3_Receive = False
Island3_Option1 = 0 # 0, 1, 2, 3, 4, 5, 6
Island3_Character1 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, unicorn, cheshire, amagi_chan
Island3_Option2 = 0 # 0, 1, 2, 3, 4, 5, 6
Island3_Character2 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, unicorn, cheshire, amagi_chan
Island3_Option3 = 0 # 0, 1, 2, 3, 4, 5, 6
Island3_Character3 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, unicorn, cheshire, amagi_chan
Island3_Option4 = 0 # 0, 1, 2, 3, 4, 5, 6
Island3_Character4 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, unicorn, cheshire, amagi_chan
Island3_Option1 = 0 # 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16
Island3_Character1 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, william_d_porter, chen_hai, unicorn, cheshire, amagi_chan, helena, atago, friedrich_der_grobe
Island3_Option2 = 0 # 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16
Island3_Character2 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, william_d_porter, chen_hai, unicorn, cheshire, amagi_chan, helena, atago, friedrich_der_grobe
Island3_Option3 = 0 # 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16
Island3_Character3 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, william_d_porter, chen_hai, unicorn, cheshire, amagi_chan, helena, atago, friedrich_der_grobe
# Group `Island4`
Island4_Receive = False
Island4_Option1 = 0 # 0, 1, 2, 3, 4
Island4_Character1 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, unicorn, cheshire, amagi_chan
Island4_Option2 = 0 # 0, 1, 2, 3, 4
Island4_Character2 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, unicorn, cheshire, amagi_chan
Island4_Option3 = 0 # 0, 1, 2, 3, 4
Island4_Character3 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, unicorn, cheshire, amagi_chan
Island4_Option4 = 0 # 0, 1, 2, 3, 4
Island4_Character4 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, unicorn, cheshire, amagi_chan
Island4_Option1 = 0 # 0, 1, 2, 3, 4, 5, 6
Island4_Character1 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, william_d_porter, chen_hai, unicorn, cheshire, amagi_chan, helena, atago, friedrich_der_grobe
Island4_Option2 = 0 # 0, 1, 2, 3, 4, 5, 6
Island4_Character2 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, william_d_porter, chen_hai, unicorn, cheshire, amagi_chan, helena, atago, friedrich_der_grobe
Island4_Option3 = 0 # 0, 1, 2, 3, 4, 5, 6
Island4_Character3 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, william_d_porter, chen_hai, unicorn, cheshire, amagi_chan, helena, atago, friedrich_der_grobe
Island4_Option4 = 0 # 0, 1, 2, 3, 4, 5, 6
Island4_Character4 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, william_d_porter, chen_hai, unicorn, cheshire, amagi_chan, helena, atago, friedrich_der_grobe
# Group `Island5`
Island5_Receive = False
Island5_Option1 = 0 # 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
Island5_Character1 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, unicorn, cheshire, amagi_chan
Island5_Option2 = 0 # 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
Island5_Character2 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, unicorn, cheshire, amagi_chan
Island5_Option3 = 0 # 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
Island5_Character3 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, unicorn, cheshire, amagi_chan
Island5_Option4 = 0 # 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
Island5_Character4 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, unicorn, cheshire, amagi_chan
Island5_Option1 = 0 # 0, 1, 2, 3, 4
Island5_Character1 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, william_d_porter, chen_hai, unicorn, cheshire, amagi_chan, helena, atago, friedrich_der_grobe
Island5_Option2 = 0 # 0, 1, 2, 3, 4
Island5_Character2 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, william_d_porter, chen_hai, unicorn, cheshire, amagi_chan, helena, atago, friedrich_der_grobe
Island5_Option3 = 0 # 0, 1, 2, 3, 4
Island5_Character3 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, william_d_porter, chen_hai, unicorn, cheshire, amagi_chan, helena, atago, friedrich_der_grobe
Island5_Option4 = 0 # 0, 1, 2, 3, 4
Island5_Character4 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, william_d_porter, chen_hai, unicorn, cheshire, amagi_chan, helena, atago, friedrich_der_grobe
# Group `Island6`
Island6_Receive = False
Island6_Option1 = 0 # 0, 1, 2, 3, 4, 5, 6, 7
Island6_Character1 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, unicorn, cheshire, amagi_chan
Island6_Character1 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, william_d_porter, chen_hai, unicorn, cheshire, amagi_chan, helena, atago, friedrich_der_grobe
Island6_Option2 = 0 # 0, 1, 2, 3, 4, 5, 6, 7
Island6_Character2 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, unicorn, cheshire, amagi_chan
Island6_Character2 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, william_d_porter, chen_hai, unicorn, cheshire, amagi_chan, helena, atago, friedrich_der_grobe
Island6_Option3 = 0 # 0, 1, 2, 3, 4, 5, 6, 7
Island6_Character3 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, william_d_porter, chen_hai, unicorn, cheshire, amagi_chan, helena, atago, friedrich_der_grobe
Island6_Option4 = 0 # 0, 1, 2, 3, 4, 5, 6, 7
Island6_Character4 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, william_d_porter, chen_hai, unicorn, cheshire, amagi_chan, helena, atago, friedrich_der_grobe
# Group `Island7`
Island7_Receive = False
Island7_Option1 = 0 # 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
Island7_Character1 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, unicorn, cheshire, amagi_chan
Island7_Character1 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, william_d_porter, chen_hai, unicorn, cheshire, amagi_chan, helena, atago, friedrich_der_grobe
Island7_Option2 = 0 # 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
Island7_Character2 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, unicorn, cheshire, amagi_chan
Island7_Character2 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, william_d_porter, chen_hai, unicorn, cheshire, amagi_chan, helena, atago, friedrich_der_grobe
# Group `Island8`
Island8_Receive = False
Island8_Option1 = 0 # 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
Island8_Character1 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, unicorn, cheshire, amagi_chan
Island8_Option2 = 0 # 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
Island8_Character2 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, unicorn, cheshire, amagi_chan
Island8_Option1 = 0 # 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
Island8_Character1 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, william_d_porter, chen_hai, unicorn, cheshire, amagi_chan, helena, atago, friedrich_der_grobe
Island8_Option2 = 0 # 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
Island8_Character2 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, william_d_porter, chen_hai, unicorn, cheshire, amagi_chan, helena, atago, friedrich_der_grobe
# Group `Island9`
Island9_Receive = False
Island9_Option1 = 0 # 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
Island9_Character1 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, unicorn, cheshire, amagi_chan
Island9_Option2 = 0 # 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
Island9_Character2 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, unicorn, cheshire, amagi_chan
Island9_Option1 = 0 # 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
Island9_Character1 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, william_d_porter, chen_hai, unicorn, cheshire, amagi_chan, helena, atago, friedrich_der_grobe
Island9_Option2 = 0 # 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
Island9_Character2 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, william_d_porter, chen_hai, unicorn, cheshire, amagi_chan, helena, atago, friedrich_der_grobe
# Group `Island10`
Island10_Receive = False
Island10_Option1 = 0 # 0, 1, 2, 3, 4, 5, 6, 7
Island10_Character1 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, unicorn, cheshire, amagi_chan
Island10_Option2 = 0 # 0, 1, 2, 3, 4, 5, 6, 7
Island10_Character2 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, unicorn, cheshire, amagi_chan
Island10_Option1 = 0 # 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
Island10_Character1 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, william_d_porter, chen_hai, unicorn, cheshire, amagi_chan, helena, atago, friedrich_der_grobe
Island10_Option2 = 0 # 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
Island10_Character2 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, william_d_porter, chen_hai, unicorn, cheshire, amagi_chan, helena, atago, friedrich_der_grobe
# Group `Island11`
Island11_Receive = False
Island11_Option1 = 0 # 0, 1, 2, 3, 4, 5
Island11_Character1 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, unicorn, cheshire, amagi_chan
Island11_Option2 = 0 # 0, 1, 2, 3, 4, 5
Island11_Character2 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, unicorn, cheshire, amagi_chan
Island11_Option1 = 0 # 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
Island11_Character1 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, william_d_porter, chen_hai, unicorn, cheshire, amagi_chan, helena, atago, friedrich_der_grobe
Island11_Option2 = 0 # 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
Island11_Character2 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, william_d_porter, chen_hai, unicorn, cheshire, amagi_chan, helena, atago, friedrich_der_grobe
# Group `Island12`
Island12_Receive = False
Island12_Option1 = 0 # 0, 1, 2, 3, 4, 5, 6
Island12_Character1 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, unicorn, cheshire, amagi_chan
Island12_Character1 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, william_d_porter, chen_hai, unicorn, cheshire, amagi_chan, helena, atago, friedrich_der_grobe
Island12_Option2 = 0 # 0, 1, 2, 3, 4, 5, 6
Island12_Character2 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, unicorn, cheshire, amagi_chan
Island12_Character2 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, william_d_porter, chen_hai, unicorn, cheshire, amagi_chan, helena, atago, friedrich_der_grobe
# Group `Island13`
Island13_Receive = False
Island13_Option1 = 0 # 0, 1, 2, 3, 4
Island13_Character1 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, unicorn, cheshire, amagi_chan
Island13_Option2 = 0 # 0, 1, 2, 3, 4
Island13_Character2 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, unicorn, cheshire, amagi_chan
Island13_Option1 = 0 # 0, 1, 2, 3, 4, 5, 6
Island13_Character1 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, william_d_porter, chen_hai, unicorn, cheshire, amagi_chan, helena, atago, friedrich_der_grobe
Island13_Option2 = 0 # 0, 1, 2, 3, 4, 5, 6
Island13_Character2 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, william_d_porter, chen_hai, unicorn, cheshire, amagi_chan, helena, atago, friedrich_der_grobe
# Group `Island14`
Island14_Receive = False
Island14_Option1 = 0 # 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
Island14_Character1 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, unicorn, cheshire, amagi_chan
Island14_Option2 = 0 # 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
Island14_Character2 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, unicorn, cheshire, amagi_chan
Island14_Option1 = 0 # 0, 1, 2, 3, 4
Island14_Character1 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, william_d_porter, chen_hai, unicorn, cheshire, amagi_chan, helena, atago, friedrich_der_grobe
Island14_Option2 = 0 # 0, 1, 2, 3, 4
Island14_Character2 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, william_d_porter, chen_hai, unicorn, cheshire, amagi_chan, helena, atago, friedrich_der_grobe
# Group `Island15`
Island15_Receive = False
Island15_Option1 = 0 # 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
Island15_Character1 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, unicorn, cheshire, amagi_chan
Island15_Character1 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, william_d_porter, chen_hai, unicorn, cheshire, amagi_chan, helena, atago, friedrich_der_grobe
Island15_Option2 = 0 # 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
Island15_Character2 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, unicorn, cheshire, amagi_chan
Island15_Character2 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, william_d_porter, chen_hai, unicorn, cheshire, amagi_chan, helena, atago, friedrich_der_grobe
# Group `Island16`
Island16_Receive = False
Island16_Option1 = 0 # 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
Island16_Character1 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, william_d_porter, chen_hai, unicorn, cheshire, amagi_chan, helena, atago, friedrich_der_grobe
Island16_Option2 = 0 # 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
Island16_Character2 = 'manjuu' # manjuu, saratoga, new_jersey, tashkent, lemalin, shimakaze, akashi, ying_swei, chao_ho, william_d_porter, chen_hai, unicorn, cheshire, amagi_chan, helena, atago, friedrich_der_grobe
# Group `GeneralShop`
GeneralShop_UseGems = False
GeneralShop_Refresh = False
GeneralShop_BuySkinBox = 'disabled' # disabled, unlimited, specified
GeneralShop_BuySkinBoxAmount = 0
GeneralShop_SkinBoxPositionFilter = '1 > 2 > 3'
GeneralShop_ConsumeCoins = False
GeneralShop_Filter = 'BookRedT3 > BookYellowT3 > BookBlueT3 > BookRedT2\n> Cube\n> FoodT6 > FoodT5'
@@ -442,13 +454,13 @@ class GeneratedConfig:
CoreShop_Filter = 'Array'
# Group `ShipyardDr`
ShipyardDr_ResearchSeries = 2 # 2, 3, 4
ShipyardDr_ResearchSeries = 2 # 2, 3, 4, 5
ShipyardDr_ShipIndex = 0 # 0, 1, 2, 3, 4, 5, 6
ShipyardDr_BuyAmount = 2
ShipyardDr_LastRun = datetime.datetime(2020, 1, 1, 0, 0)
# Group `Shipyard`
Shipyard_ResearchSeries = 1 # 1, 2, 3, 4, 5
Shipyard_ResearchSeries = 1 # 1, 2, 3, 4, 5, 6
Shipyard_ShipIndex = 0 # 0, 1, 2, 3, 4, 5, 6
Shipyard_BuyAmount = 2
Shipyard_LastRun = datetime.datetime(2020, 1, 1, 0, 0)

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -74,7 +74,7 @@ VALID_SERVER_LIST = {
'小王冠行动', '波茨坦公告', '白色方案', '瓦尔基里行动',
'曼哈顿计划', '八月风暴', '秋季旅行', '水星行动', '莱茵河卫兵',
'北极光计划', '长戟计划', '暴雨行动', '水仙行动', '冬月计划',
'长弓计划'
'长弓计划', '裁决协议',
],
'cn_ios': [
'夏威夷', '珊瑚海', '中途岛', '铁底湾', '所罗门', '马里亚纳',

View File

@@ -85,10 +85,11 @@ class Control(Hermit, Minitouch, Scrcpy, MaaTouch, NemuIpc):
else:
self.swipe_adb((x, y), (x, y), duration)
def swipe(self, p1, p2, duration=(0.1, 0.2), name='SWIPE', distance_check=True):
def swipe(self, p1, p2, duration=(0.1, 0.2), hold_time=0, name='SWIPE', distance_check=True):
self.handle_control_check(name)
p1, p2 = ensure_int(p1, p2)
duration = ensure_time(duration)
hold_time = ensure_time(hold_time) * 1000
method = self.config.Emulator_ControlMethod
if method == 'uiautomator2':
logger.info('Swipe %s -> %s, %s' % (point2str(*p1), point2str(*p2), duration))
@@ -107,7 +108,7 @@ class Control(Hermit, Minitouch, Scrcpy, MaaTouch, NemuIpc):
return
if method == 'minitouch':
self.swipe_minitouch(p1, p2)
self.swipe_minitouch(p1, p2, hold_time=hold_time)
elif method == 'uiautomator2':
self.swipe_uiautomator2(p1, p2, duration=duration)
elif method == 'scrcpy':

View File

@@ -679,7 +679,7 @@ class Minitouch(Connection):
builder.send()
@retry
def swipe_minitouch(self, p1, p2):
def swipe_minitouch(self, p1, p2, hold_time):
points = insert_swipe(p0=p1, p3=p2)
builder = self.minitouch_builder
@@ -690,6 +690,9 @@ class Minitouch(Connection):
builder.move(*point).commit().wait(10)
builder.send()
if hold_time > 0:
builder.wait(hold_time)
builder.up().commit()
builder.send()

View File

@@ -202,6 +202,14 @@ class EventStory(CampaignUI, Combat, LoginHandler):
return 'unknown'
def run(self):
event = self.config.cross_get('Event.Campaign.Event', '')
if event in [
# event story is in event minigame
'event_20260226_cn',
]:
logger.info(f'Current event ({event}) does not have event story, stopped')
return
if not self.device.app_is_running():
logger.warning('Game is not running, start it')
self.app_start()

Some files were not shown because too many files have changed in this diff Show More