1
0
mirror of https://gitee.com/sui-feng-cb/AzurLaneAutoScript1 synced 2026-05-10 21:45:46 +08:00

20 Commits

Author SHA1 Message Date
8880fef13d Dev: dev_tools war_archives_update 2026-05-10 05:32:17 +08:00
139811457f Add: war_archives_20220818_cn and war_archives_20230803_cn 2026-05-10 05:31:59 +08:00
LmeSzinc
5f4f968c25 Fix: [TW] Enter event_20260417_cn from page_campaign (#5646) 2026-05-01 22:45:25 +08:00
LmeSzinc
23f185c4cc Upd: button_extract 2026-05-01 04:39:08 +08:00
LmeSzinc
be200d4a3f Merge branch 'dev' 2026-05-01 04:34:12 +08:00
LmeSzinc
2a3f3b4941 Fix: No may_enemy override in 14-4 clear mode (#5637) 2026-05-01 04:25:45 +08:00
LmeSzinc
f36ae75ed3 Fix: Switch ui from other DOA events to event_20250424_cn 2026-05-01 04:15:35 +08:00
LmeSzinc
1c6b5eb4a6 Upd: [TW] Vacation Lane – Beachside Brilliance 2026-05-01 03:27:58 +08:00
guoh064
96c1317887 Upd: [JP] assets REWARD_*.BUTTON (#5644)
to avoid collision with REWARD_*_WHITE and misclicking
2026-05-01 03:04:49 +08:00
guoh064
ac7bedc192 Tmp: event entrance for event 20250424 cn rerun
The event date should be fixed after 20260502 to disable previous concurrent event entrance.
2026-05-01 03:04:34 +08:00
guoh064
0c26c5a355 Upd: event entrance for dual event 20201126/20260417 2026-05-01 03:04:34 +08:00
LmeSzinc
0dbac1950a Upd: [CN] EVENT_20201126_ENTRANCE_TEMP 2026-05-01 03:04:34 +08:00
dragonheart107
4b90a64dde Fix: EN event point position via offset (#5633) 2026-05-01 03:04:34 +08:00
shionari
6665ca2ece Fix:修复国内docker环境编译报错的问题 (#5624)
* 因pypi官网已移除低版本pyav的whl文件,改为自行编译安装,添加相关依赖
另外,因阿里云部分镜像失效导致下载超时,国内源改为清华

* 国内源切换回阿里云

* 指定python镜像的Debian版本为bullseye,默认版本为Bookworm
添加自行编译av所需的依赖
2026-05-01 03:03:51 +08:00
LmeSzinc
7466a3882d Upd: [CN] EVENT_20201126_ENTRANCE_TEMP 2026-04-26 05:49:31 +08:00
dragonheart107
04d900bb3b Fix: EN event point position via offset (#5633) 2026-04-26 03:29:27 +08:00
ArecaSapling
9e58a9d8d4 Upd: [EN] asset EVENT_20201126_ENTRANCE_TEMP (#5630) 2026-04-24 23:58:11 +08:00
LmeSzinc
1fd1b2d59a Merge pull request #5627 from LmeSzinc/dev
Bug fix
2026-04-24 19:05:51 +08:00
LmeSzinc
8318c42ce4 Merge pull request #5619 from LmeSzinc/dev
Bug fix
2026-04-22 00:07:38 +08:00
LmeSzinc
995376a5a0 Add: Event Vacation Lane – Beachside Brilliance (event_20260417_cn) (#5611)
* Fix: Event 20220915 campaign (#5607)

Co-authored-by: YQY <91514918+5A8G0001@users.noreply.github.com>

* Upd: [TW] Event entrance of Violet Tempest Blooming Lycoris (fixed #5606)

* Fix: [CN] Skip user agreement

* Add: Event entrance of Vacation Lane – Beachside Brilliance (event_20260417_cn)

* Add: MAP_CHAPTER_SWITCH_20241219_SPEX

* Add: Chapter SP

* Opt: Faster receiving if no drop record

* Upd: Button extract

* Upd: Shop cost icons

* Fix: [JP] Remove wrong "/" in meta counter (#5608)

---------

Co-authored-by: YQY <91514918+TerryOrin@users.noreply.github.com>
Co-authored-by: YQY <91514918+5A8G0001@users.noreply.github.com>
2026-04-18 03:41:37 +08:00
46 changed files with 1070 additions and 52 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.6 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.5 KiB

After

Width:  |  Height:  |  Size: 8.7 KiB

View File

@@ -58,6 +58,8 @@ To add a new event, add a new row in here, and run `python -m module.config.conf
| 20251106 | war archives 20220915 cn | Violet Tempest Blooming Lycoris | 紫绛槿岚 | Violet Tempest Blooming Lycoris | 赫の涙月 菫の暁風 | 紫絳槿嵐 | | 20251106 | war archives 20220915 cn | Violet Tempest Blooming Lycoris | 紫绛槿岚 | Violet Tempest Blooming Lycoris | 赫の涙月 菫の暁風 | 紫絳槿嵐 |
| 20251218 | war archives 20221222 cn | Parallel Superimposition | 定向折叠 | Parallel Superimposition | 積重なる事象の幻界 | 定向折疊 | | 20251218 | war archives 20221222 cn | Parallel Superimposition | 定向折叠 | Parallel Superimposition | 積重なる事象の幻界 | 定向折疊 |
| 20260129 | war archives 20230223 cn | Revelations of Dust | 湮烬尘墟 | Revelations of Dust | 黙示の遺構 | 湮燼塵墟 | | 20260129 | war archives 20230223 cn | Revelations of Dust | 湮烬尘墟 | Revelations of Dust | 黙示の遺構 | 湮燼塵墟 |
| 20260409 | war archives 20220818 cn | Operation Convergence | 远汇点作战 | Operation Convergence | 結像点作戦 | 遠匯點作戰 |
| 20260507 | war archives 20230803 cn | Anthem of Remembrance | 奏响鸢尾之歌 | Anthem of Remembrance | 燃ゆる聖都の回想曲 | 奏響鳶尾之歌 |
| 20200227 | event 20200227 cn | Northern Overture | 北境序曲 | Northern Overture | 凍絶の北海 | - | | 20200227 | event 20200227 cn | Northern Overture | 北境序曲 | Northern Overture | 凍絶の北海 | - |
| 20200312 | event 20200312 cn | The Solomon Ranger | 复刻斯图尔特的硝烟 | The Solomon Ranger Rerun | 南洋に靡く硝煙(復刻) | - | | 20200312 | event 20200312 cn | The Solomon Ranger | 复刻斯图尔特的硝烟 | The Solomon Ranger Rerun | 南洋に靡く硝煙(復刻) | - |
| 20200326 | event 20200326 cn | Microlayer Medley | 微层混合 | Microlayer Medley | 闇靄払う銀翼 | - | | 20200326 | event 20200326 cn | Microlayer Medley | 微层混合 | Microlayer Medley | 闇靄払う銀翼 | - |
@@ -289,3 +291,5 @@ To add a new event, add a new row in here, and run `python -m module.config.conf
| 20260416 | event 20220915 cn | Violet Tempest Blooming Lycoris | - | - | - | 復刻紫絳槿嵐 | | 20260416 | event 20220915 cn | Violet Tempest Blooming Lycoris | - | - | - | 復刻紫絳槿嵐 |
| 20260417 | event 20260417 cn | Vacation Lane Beachside Brilliance | 假日航线闪耀海滨 | Vacation Lane Beachside Brilliance | バケーションレーン・きらめく砂浜 | - | | 20260417 | event 20260417 cn | Vacation Lane Beachside Brilliance | 假日航线闪耀海滨 | Vacation Lane Beachside Brilliance | バケーションレーン・きらめく砂浜 | - |
| 20260417 | event 20201126 cn | Vacation Lane Rerun | 复刻假日航线 | Vacation Lane Rerun | バケーションレーン(復刻) | - | | 20260417 | event 20201126 cn | Vacation Lane Rerun | 复刻假日航线 | Vacation Lane Rerun | バケーションレーン(復刻) | - |
| 20260417 | event 20250424 cn | Toward Tulipas Seas Rerun | 复刻扬起郁金之旗 | Toward Tulipas Seas Rerun | チュリッパの海へ(復刻) | - |
| 20260417 | event 20260417 cn | Vacation Lane Beachside Brilliance | - | - | - | 假日航線閃耀海濱 |

View File

@@ -107,9 +107,10 @@ class Campaign(CampaignBase):
def map_data_init(self, map_): def map_data_init(self, map_):
super().map_data_init(map_) super().map_data_init(map_)
for override_grid in OVERRIDE: if not self.map_is_clear_mode:
# Set may_enemy, but keep may_ambush for override_grid in OVERRIDE:
self.map[override_grid.location].may_enemy = override_grid.may_enemy # Set may_enemy, but keep may_ambush
self.map[override_grid.location].may_enemy = override_grid.may_enemy
def battle_0(self): def battle_0(self):
self.pick_up_light_house(A9) self.pick_up_light_house(A9)

View File

@@ -1,9 +1,9 @@
from module.base.button import Button from module.base.button import Button
from module.campaign.assets import EVENT_20201126_ENTRANCE_TEMP, EVENT_20201126_PT_ICON from module.campaign.assets import EVENT_20201126_PT_ICON, EVENT_20201126_DETAIL, EVENT_20201126_DETAIL_CHECK, EVENT_20201126_DETAIL_WHITE, EVENT_20201126_ENTRANCE
from module.campaign.campaign_base import CampaignBase as CampaignBase_ from module.campaign.campaign_base import CampaignBase as CampaignBase_
from module.exception import CampaignNameError from module.exception import CampaignNameError
from module.logger import logger from module.logger import logger
from module.ui.page import page_campaign_menu, page_event, page_main from module.ui.page import page_campaign_menu, page_event, page_main_white
EVENT_ANIMATION = Button(area=(49, 229, 119, 400), color=(118, 215, 240), button=(49, 229, 119, 400), EVENT_ANIMATION = Button(area=(49, 229, 119, 400), color=(118, 215, 240), button=(49, 229, 119, 400),
name='EVENT_ANIMATION') name='EVENT_ANIMATION')
@@ -19,15 +19,18 @@ class CampaignBase(CampaignBase_):
""" """
def ui_goto_event(self): def ui_goto_event(self):
if self.appear(EVENT_20201126_PT_ICON, offset=(20, 20)) and self.ui_page_appear(page_event): if self.appear(EVENT_20201126_PT_ICON, offset=(40, 20)) and self.ui_page_appear(page_event):
logger.info('Already at EVENT_20201126') logger.info('Already at EVENT_20201126')
return True return True
self.ui_ensure(page_campaign_menu) self.ui_ensure(page_campaign_menu)
if self.is_event_entrance_available(): if self.is_event_entrance_available():
self.ui_ensure(page_main) self.ui_goto_main()
self.ui_click(EVENT_20201126_ENTRANCE_TEMP, if self.ui_page_appear(page_main_white):
check_button=EVENT_20201126_PT_ICON, self.ui_click(EVENT_20201126_DETAIL_WHITE, check_button=EVENT_20201126_DETAIL_CHECK)
appear_button=EVENT_20201126_ENTRANCE_TEMP) else:
self.ui_click(EVENT_20201126_DETAIL, check_button=EVENT_20201126_DETAIL_CHECK)
self.ui_click(EVENT_20201126_ENTRANCE, check_button=EVENT_20201126_PT_ICON,
appear_button=EVENT_20201126_DETAIL_CHECK, offset=(40, 20))
return True return True

View File

@@ -1,5 +1,7 @@
from module.campaign.assets import EVENT_20250424_PT_ICON
from module.campaign.campaign_base import CampaignBase as CampaignBase_ from module.campaign.campaign_base import CampaignBase as CampaignBase_
from module.ui.page import page_event from module.logger import logger
from module.ui.page import page_campaign_menu, page_event
class CampaignBase(CampaignBase_): class CampaignBase(CampaignBase_):
@@ -8,3 +10,12 @@ class CampaignBase(CampaignBase_):
if self.ui_page_appear(page_event): if self.ui_page_appear(page_event):
return False return False
return super().handle_exp_info() return super().handle_exp_info()
def ui_goto_event(self):
if self.appear(EVENT_20250424_PT_ICON, offset=(20, 20)) and self.ui_page_appear(page_event):
logger.info('Already at EVENT_20250424')
return True
self.ui_ensure(page_campaign_menu)
if self.is_event_entrance_available():
self.ui_goto(page_event)
return True

View File

@@ -1,8 +1,8 @@
from module.base.button import Button from module.base.button import Button
from module.campaign.assets import EVENT_20260417_PT_ICON from module.campaign.assets import EVENT_20260417_PT_ICON, EVENT_20260417_DETAIL, EVENT_20260417_DETAIL_CHECK, EVENT_20260417_DETAIL_WHITE, EVENT_20260417_ENTRANCE
from module.campaign.campaign_base import CampaignBase as CampaignBase_ from module.campaign.campaign_base import CampaignBase as CampaignBase_
from module.logger import logger from module.logger import logger
from module.ui.page import page_campaign_menu, page_event from module.ui.page import page_campaign_menu, page_event, page_main_white
EVENT_ANIMATION = Button(area=(49, 229, 119, 400), color=(118, 215, 240), button=(49, 229, 119, 400), EVENT_ANIMATION = Button(area=(49, 229, 119, 400), color=(118, 215, 240), button=(49, 229, 119, 400),
name='EVENT_ANIMATION') name='EVENT_ANIMATION')
@@ -10,13 +10,22 @@ EVENT_ANIMATION = Button(area=(49, 229, 119, 400), color=(118, 215, 240), button
class CampaignBase(CampaignBase_): class CampaignBase(CampaignBase_):
def ui_goto_event(self): def ui_goto_event(self):
if self.appear(EVENT_20260417_PT_ICON, offset=(20, 20)) and self.ui_page_appear(page_event): if self.appear(EVENT_20260417_PT_ICON, offset=(40, 20)) and self.ui_page_appear(page_event):
logger.info('Already at EVENT_20260417') logger.info('Already at EVENT_20260417')
return True return True
self.ui_ensure(page_campaign_menu) self.ui_ensure(page_campaign_menu)
if self.is_event_entrance_available(): if self.is_event_entrance_available():
self.ui_goto(page_event) if self.config.SERVER == 'tw':
return True self.ui_goto(page_event)
else:
self.ui_goto_main()
if self.ui_page_appear(page_main_white):
self.ui_click(EVENT_20260417_DETAIL_WHITE, check_button=EVENT_20260417_DETAIL_CHECK)
else:
self.ui_click(EVENT_20260417_DETAIL, check_button=EVENT_20260417_DETAIL_CHECK)
self.ui_click(EVENT_20260417_ENTRANCE, check_button=EVENT_20260417_PT_ICON,
appear_button=EVENT_20260417_DETAIL_CHECK, offset=(40, 20))
return True
@staticmethod @staticmethod
def _campaign_ocr_result_process(result): def _campaign_ocr_result_process(result):

View File

@@ -0,0 +1,35 @@
from ..campaign_war_archives.campaign_base import CampaignBase as CampaignBase_
class CampaignBase(CampaignBase_):
def campaign_set_chapter_sp(self, chapter, mode='normal'):
# SP event but has an `event` UI
from module.logger import logger
logger.info('Set chapter SP')
if chapter in ['sp', 'sp_sp']:
self.ui_goto_sp()
self.campaign_ensure_chapter(chapter)
return True
else:
return False
@staticmethod
def _campaign_separate_name(name):
if name in ['esp', 'sp']:
return 'sp_sp', '2'
if name in ['ex']:
return 'sp_ex', '3'
return CampaignBase_._campaign_separate_name(name)
def campaign_get_entrance(self, name):
if name == 'sp':
name = 'esp'
return super().campaign_get_entrance(name)
@staticmethod
def _campaign_get_chapter_index(name):
if name in ['sp_sp']:
return 2
if name in ['sp_ex']:
return 3
return CampaignBase_._campaign_get_chapter_index(name)

View File

@@ -0,0 +1,77 @@
from .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('SP1')
MAP.shape = 'I7'
MAP.camera_data = ['D4', 'E5', 'F4']
MAP.camera_data_spawn_point = ['D3']
MAP.map_data = """
-- ++ -- SP -- SP -- ++ ++
-- ++ -- -- -- -- -- ME --
ME -- -- -- MS -- -- -- ME
-- -- Me ++ Me ++ Me -- --
ME -- -- -- __ -- -- -- ME
-- ++ ++ ME -- 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
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 2, 'siren': 1},
{'battle': 1, 'enemy': 2},
{'battle': 2, 'enemy': 1},
{'battle': 3, 'enemy': 1},
{'battle': 4, '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, \
= MAP.flatten()
class Config:
# ===== Start of generated config =====
MAP_SIREN_TEMPLATE = ['Z46', 'PrinzHeinrich', 'GrafZeppelin']
MOVABLE_ENEMY_TURN = (2,)
MAP_HAS_SIREN = True
MAP_HAS_MOVABLE_ENEMY = True
MAP_HAS_MAP_STORY = True
MAP_HAS_FLEET_STEP = True
MAP_HAS_AMBUSH = True
MAP_HAS_MYSTERY = False
# ===== End of generated config =====
HOMO_EDGE_HOUGHLINES_THRESHOLD = 210
MAP_SWIPE_MULTIPLY = (1.203, 1.226)
MAP_SWIPE_MULTIPLY_MINITOUCH = (1.164, 1.185)
MAP_SWIPE_MULTIPLY_MAATOUCH = (1.130, 1.150)
class Campaign(CampaignBase):
MAP = MAP
ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C'
MAP_AIR_RAID_OVERLAY_TRANSPARENCY_THRESHOLD = 0.25
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 .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 .sp1 import Config as ConfigBase
MAP = CampaignMap('SP2')
MAP.shape = 'I8'
MAP.camera_data = ['D3', 'D6']
MAP.camera_data_spawn_point = ['D3']
MAP.map_data = """
++ -- -- ++ -- -- ++ ++ --
-- SP -- Me -- -- ++ ++ --
-- -- -- -- -- MS -- -- --
-- SP -- Me -- -- 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 50 50 50 50 50 50 50 50
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 3, 'siren': 1},
{'battle': 1, 'enemy': 2},
{'battle': 2, 'enemy': 1},
{'battle': 3, 'enemy': 1},
{'battle': 4, '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(ConfigBase):
# ===== Start of generated config =====
MAP_SIREN_TEMPLATE = ['Magdeburg', 'PrinzAdalbert', 'GrafZeppelin']
MOVABLE_ENEMY_TURN = (2,)
MAP_HAS_SIREN = True
MAP_HAS_MOVABLE_ENEMY = True
MAP_HAS_MAP_STORY = True
MAP_HAS_FLEET_STEP = True
MAP_HAS_AMBUSH = True
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'
MAP_AIR_RAID_OVERLAY_TRANSPARENCY_THRESHOLD = 0.25
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,81 @@
from .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 .sp1 import Config as ConfigBase
MAP = CampaignMap('SP3')
MAP.shape = 'H8'
MAP.camera_data = ['D5', 'E3', 'E5']
MAP.camera_data_spawn_point = ['D5']
MAP.map_data = """
-- -- -- -- ++ ++ -- --
++ ++ Me -- Me ++ ME --
-- -- -- -- -- ME -- --
SP -- -- MS __ -- -- MB
SP -- -- MS -- 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
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 3, 'siren': 2},
{'battle': 1, 'enemy': 2},
{'battle': 2, 'enemy': 1},
{'battle': 3, 'enemy': 1},
{'battle': 4},
{'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 = ['GrafZeppelin', 'Weser', 'PeterStrasser']
MOVABLE_ENEMY_TURN = (2,)
MAP_HAS_SIREN = True
MAP_HAS_MOVABLE_ENEMY = True
MAP_HAS_MAP_STORY = True
MAP_HAS_FLEET_STEP = True
MAP_HAS_AMBUSH = True
MAP_HAS_MYSTERY = False
# ===== End of generated config =====
MAP_SWIPE_MULTIPLY = (1.091, 1.112)
MAP_SWIPE_MULTIPLY_MINITOUCH = (1.056, 1.075)
MAP_SWIPE_MULTIPLY_MAATOUCH = (1.025, 1.043)
class Campaign(CampaignBase):
MAP = MAP
ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C'
MAP_AIR_RAID_OVERLAY_TRANSPARENCY_THRESHOLD = 0.25
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 .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 .sp1 import Config as ConfigBase
MAP = CampaignMap('SP4')
MAP.shape = 'I9'
MAP.camera_data = ['D6', 'F6', 'E3']
MAP.camera_data_spawn_point = ['E7']
MAP.map_data = """
-- -- -- ME -- ME -- -- --
-- ++ ME -- MB -- ME ++ --
-- -- -- -- Me -- -- -- --
-- ++ ++ -- -- -- ++ ++ --
-- ++ ++ Me MS Me ++ ++ --
-- ME MS -- __ -- MS ME --
ME -- -- ++ -- ++ -- -- 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 50 50
50 50 50 50 50 50 50 50 50
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 3, 'siren': 2},
{'battle': 1, 'enemy': 2, 'siren': 1},
{'battle': 2, 'enemy': 1},
{'battle': 3, 'enemy': 1},
{'battle': 4},
{'battle': 5, '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, \
= MAP.flatten()
class Config(ConfigBase):
# ===== Start of generated config =====
MAP_SIREN_TEMPLATE = ['UlrichVonHutten']
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 = True
MAP_HAS_MYSTERY = False
# ===== End of generated config =====
MAP_SWIPE_MULTIPLY = (0.995, 1.013)
MAP_SWIPE_MULTIPLY_MINITOUCH = (0.962, 0.980)
MAP_SWIPE_MULTIPLY_MAATOUCH = (0.934, 0.951)
class Campaign(CampaignBase):
MAP = MAP
ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C'
MAP_AIR_RAID_OVERLAY_TRANSPARENCY_THRESHOLD = 0.25
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,7 @@
from ..campaign_war_archives.campaign_base import CampaignBase as CampaignBase_
class CampaignBase(CampaignBase_):
STAGE_INCREASE = [
'SP1 > SP2 > SP3',
]

View File

@@ -0,0 +1,104 @@
from .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('SP1')
MAP.shape = 'I6'
MAP.camera_data = ['F2', 'F4']
MAP.camera_data_spawn_point = ['D2', 'D4']
MAP.map_data = """
++ ++ ++ -- -- ME -- -- --
-- -- Me -- Me -- Me ++ ++
SP -- -- -- -- ME -- MB ++
-- -- -- MS -- -- __ -- ME
SP -- -- -- ++ 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
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 1, 'siren': 1},
{'battle': 1, 'enemy': 1},
{'battle': 2, 'enemy': 1},
{'battle': 3, 'enemy': 1},
{'battle': 4, '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, \
= MAP.flatten()
class Config:
# ===== Start of generated config =====
MAP_SIREN_TEMPLATE = ['DD']
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_HAS_WALK_SPEEDUP = True
MAP_HAS_MOVABLE_NORMAL_ENEMY = True
MOVABLE_NORMAL_ENEMY_TURN = (2,)
MAP_SIREN_MOVE_WAIT = 0.5
MAP_WALK_USE_CURRENT_FLEET = True
INTERNAL_LINES_FIND_PEAKS_PARAMETERS = {
'height': (80, 255 - 24),
'width': (0.9, 10),
'prominence': 10,
'distance': 35,
}
EDGE_LINES_FIND_PEAKS_PARAMETERS = {
'height': (255 - 24, 255),
'prominence': 10,
'distance': 50,
'wlen': 1000
}
HOMO_EDGE_COLOR_RANGE = (0, 24)
MAP_ENSURE_EDGE_INSIGHT_CORNER = 'bottom'
MAP_ENEMY_GENRE_DETECTION_SCALING = {
'DD': 1.111,
'CL': 1.111,
'CAred': 1.111,
'BBred': 1.111,
'CV': 1.111,
}
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.map_is_clear_mode:
if self.clear_siren():
return True
if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=1):
return True
else:
if self.clear_any_enemy(sort=('cost_2',)):
return True
return self.battle_default()
def battle_4(self):
return self.clear_boss()

View File

@@ -0,0 +1,80 @@
from .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 .sp1 import Config as ConfigBase
MAP = CampaignMap('SP2')
MAP.shape = 'H7'
MAP.camera_data = ['D2', 'D5', 'E2', 'E5']
MAP.camera_data_spawn_point = ['E5', 'D5']
MAP.map_data = """
++ ME -- -- -- -- ME --
ME -- -- Me Me -- ++ --
ME -- Me ++ ++ ME ++ ME
-- __ -- ++ ++ -- Me --
ME -- MS MB MB MS __ ME
++ -- -- -- -- -- -- ME
++ ME -- SP SP -- 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': 2, 'siren': 2},
{'battle': 1, 'enemy': 2},
{'battle': 2, 'enemy': 1},
{'battle': 3, 'enemy': 1},
{'battle': 4, '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(ConfigBase):
# ===== Start of generated config =====
MAP_SIREN_TEMPLATE = ['CL', 'CAred']
MOVABLE_ENEMY_TURN = (2,)
MAP_HAS_SIREN = True
MAP_HAS_MOVABLE_ENEMY = True
MAP_HAS_MAP_STORY = True
MAP_HAS_FLEET_STEP = True
MAP_HAS_AMBUSH = False
MAP_HAS_MYSTERY = False
# ===== End of generated config =====
MAP_SWIPE_MULTIPLY = (1.133, 1.155)
MAP_SWIPE_MULTIPLY_MINITOUCH = (1.096, 1.116)
MAP_SWIPE_MULTIPLY_MAATOUCH = (1.064, 1.083)
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.map_is_clear_mode:
if self.clear_siren():
return True
if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=1):
return True
else:
if self.clear_any_enemy(sort=('cost_2',)):
return True
return self.battle_default()
def battle_4(self):
return self.clear_boss()

View File

@@ -0,0 +1,86 @@
from .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 .sp1 import Config as ConfigBase
MAP = CampaignMap('SP3')
MAP.shape = 'I8'
MAP.camera_data = ['D2', 'D4', 'D6', 'F2', 'F4', 'F6']
MAP.camera_data_spawn_point = ['F2', 'D2']
MAP.map_data = """
-- -- ME ++ ++ ++ ME -- --
++ Me -- -- MB -- -- Me ++
ME -- -- SP -- SP -- -- ME
-- MS -- -- __ -- -- MS --
ME -- ++ -- ++ -- ++ -- ME
-- Me ++ MS -- MS ++ 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
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 2, 'siren': 2},
{'battle': 1, 'enemy': 2, 'siren': 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, 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(ConfigBase):
# ===== Start of generated config =====
MAP_SIREN_TEMPLATE = ['SirenBoss15']
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 =====
HOMO_EDGE_HOUGHLINES_THRESHOLD = 210
MAP_SWIPE_MULTIPLY = (1.205, 1.227)
MAP_SWIPE_MULTIPLY_MINITOUCH = (1.165, 1.187)
MAP_SWIPE_MULTIPLY_MAATOUCH = (1.131, 1.151)
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.map_is_clear_mode:
if self.clear_siren():
return True
if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=1):
return True
else:
if self.clear_any_enemy(sort=('cost_2',)):
return True
return self.battle_default()
def battle_5(self):
return self.fleet_boss.clear_boss()

View File

@@ -669,7 +669,7 @@
}, },
"Campaign": { "Campaign": {
"Name": "D3", "Name": "D3",
"Event": "war_archives_20230223_cn", "Event": "war_archives_20230803_cn",
"Mode": "normal", "Mode": "normal",
"UseClearMode": true, "UseClearMode": true,
"UseFleetLock": true, "UseFleetLock": true,

View File

@@ -1,7 +1,7 @@
# docker build -t hgjazhgj/alas:latest . # docker build -t hgjazhgj/alas:latest .
# docker run -v ${PWD}:/app/AzurLaneAutoScript -p 22267:22267 --name alas -it --rm hgjazhgj/alas # docker run -v ${PWD}:/app/AzurLaneAutoScript -p 22267:22267 --name alas -it --rm hgjazhgj/alas
FROM python:3.7-slim FROM python:3.7-slim-bullseye
WORKDIR /app/AzurLaneAutoScript WORKDIR /app/AzurLaneAutoScript
@@ -10,7 +10,12 @@ COPY requirements.txt /tmp/requirements.txt
# Initial download of UiAutomator2 is slow outside of China using appetizer mirror, switch to GitHub # Initial download of UiAutomator2 is slow outside of China using appetizer mirror, switch to GitHub
RUN apt update \ RUN apt update \
&& apt install -y git adb libgomp1 openssh-client \ && apt install -y git adb libgomp1 openssh-client \
&& apt install -y build-essential pkg-config \
&& apt install -y libavformat-dev libavcodec-dev libavdevice-dev \
&& apt install -y libavutil-dev libswscale-dev libswresample-dev libavfilter-dev \
&& git config --global --add safe.directory '*' \ && git config --global --add safe.directory '*' \
&& pip install Cython==0.29.37 \
&& pip install av==10.0.0 --no-build-isolation \
&& pip install -r /tmp/requirements.txt \ && pip install -r /tmp/requirements.txt \
&& rm /tmp/requirements.txt \ && rm /tmp/requirements.txt \
&& rm -r ~/.cache/pip && rm -r ~/.cache/pip

View File

@@ -14,16 +14,19 @@ deb-src https://mirrors.aliyun.com/debian/ bullseye main non-free contrib\n\
deb https://mirrors.aliyun.com/debian-security/ bullseye-security main\n\ deb https://mirrors.aliyun.com/debian-security/ bullseye-security main\n\
deb-src https://mirrors.aliyun.com/debian-security/ bullseye-security main\n\ deb-src https://mirrors.aliyun.com/debian-security/ bullseye-security main\n\
deb https://mirrors.aliyun.com/debian/ bullseye-updates main non-free contrib\n\ deb https://mirrors.aliyun.com/debian/ bullseye-updates main non-free contrib\n\
deb-src https://mirrors.aliyun.com/debian/ bullseye-updates main non-free contrib\n\ deb-src https://mirrors.aliyun.com/debian/ bullseye-updates main non-free contrib" \
deb https://mirrors.aliyun.com/debian/ bullseye-backports main non-free contrib\n\
deb-src https://mirrors.aliyun.com/debian/ bullseye-backports main non-free contrib" \
> /etc/apt/sources.list \ > /etc/apt/sources.list \
&& apt update \ && apt update \
&& apt install -y git adb libgomp1 openssh-client \ && apt install -y git adb libgomp1 openssh-client \
&& apt install -y build-essential pkg-config \
&& apt install -y libavformat-dev libavcodec-dev libavdevice-dev \
&& apt install -y libavutil-dev libswscale-dev libswresample-dev libavfilter-dev \
&& git config --global --add safe.directory '*' \ && git config --global --add safe.directory '*' \
&& ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo 'Asia/Shanghai' > /etc/timezone \ && echo 'Asia/Shanghai' > /etc/timezone \
&& pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple \ && pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple \
&& pip install Cython==0.29.37 \
&& pip install av==10.0.0 --no-build-isolation \
&& pip install -r /tmp/requirements.txt \ && pip install -r /tmp/requirements.txt \
&& rm /tmp/requirements.txt \ && rm /tmp/requirements.txt \
&& rm -r ~/.cache/pip && rm -r ~/.cache/pip

View File

@@ -0,0 +1,292 @@
import os
import re
import shutil
from datetime import datetime
from typing import List
from cached_property import cached_property
from tqdm import tqdm
from module.base.timer import timer
from module.config.config_updater import ConfigGenerator, ConfigUpdater
from module.logger import logger
SERVER_INDEXS = {
'cn': 3,
'en': 4,
'jp': 5,
'tw': 6
}
class WarArchivesUpdater:
aired_date = None
event = None
def __init__(self):
self.cn, self.en, self.jp, self.tw = '-', '-', '-', '-'
self.lines: List[str]
def reset(self):
self.cn, self.en, self.jp, self.tw = '-', '-', '-', '-'
with open('./campaign/Readme.md', 'r', encoding='utf-8') as f:
self.lines = f.readlines()
@cached_property
def lines(self):
with open('./campaign/Readme.md', 'r', encoding='utf-8') as f:
return f.readlines()
@cached_property
def latest_event_cn(self):
for text in self.lines[::-1]:
if not re.search(r'^\|.+\|$', text):
# not a table line
continue
elif re.search(r'^.*\-{3,}.*$', text):
# is a delimiter line
continue
else:
latest = [x.strip() for x in text.strip('| \n').split('|')]
if latest[SERVER_INDEXS['cn']] != '-':
return re.search(r'\d{8}', latest[1]).group(0)
return re.search(r'\d{8}', self.lines[-1].strip('| \n').split('|')[1].strip()).group(0)
def event_name_to_time(self, name):
"""
Args:
name (str): event name, such as '虹彩的终幕曲'
Returns:
str: event time, such as '20220428'
If cannot find, return the time of the latest event
"""
if len(name) == 8 and re.search(r'\d{8}', name):
return name
for text in self.lines:
if name in text:
return re.search(r'\d{8}', text.strip('| \n').split('|')[1].strip()).group(0)
return self.latest_event_cn
def event_time_to_name(self, time):
"""
Args:
time (str): event time, such as '20220428'
Returns:
str: event name in EN server, such as 'Rondo at Rainbow's End'
If cannot find, return the name of the latest event
"""
for text in self.lines:
if not re.search(r'^\|.+\|$', text):
# not a table line
continue
elif re.search(r'^.*\-{3,}.*$', text):
# is a delimiter line
continue
else:
line = [x.strip() for x in text.strip('| \n').split('|')]
if time in line[1]:
return line[SERVER_INDEXS['en']]
return self.lines[-1].strip('| \n').split('|')[SERVER_INDEXS['en']].strip()
def create_campaign_files(self, old_path, new_path):
if os.path.exists(old_path):
if not os.path.exists(new_path):
logger.info(f'Creating files at {new_path}')
shutil.copytree(old_path, new_path, ignore=shutil.ignore_patterns('sp.py'))
else:
logger.info(f'Directory already exists: {new_path}, skip creating files')
sp_path = os.path.join(new_path, 'sp.py')
if os.path.exists(sp_path):
logger.info(f'Removing sp files')
os.remove(sp_path)
return False
else:
logger.warning(f'No such directory: {old_path}')
return False
return True
def modify_campaign_files(self, old_path, new_path):
if os.path.exists(old_path) and os.path.exists(new_path):
files = os.listdir(new_path)
for file_name in tqdm(files):
if os.path.splitext(file_name)[-1] == '.py':
self.modify_single_campaign_file(os.path.join(new_path, file_name))
else:
logger.warning('No such directory, skip modifying files')
def modify_single_campaign_file(self, file_path):
with open(file_path, 'r', encoding='utf-8') as f:
lines = f.readlines()
new_lines = []
pattern = 'from module.campaign.campaign_base import CampaignBase'
replace = 'from ..campaign_war_archives.campaign_base import CampaignBase'
modify = False
for line in lines:
modified_line = line.replace(pattern, replace)
if line != modified_line:
modify = True
new_lines.append(modified_line)
if modify:
with open(file_path, 'w', encoding='utf-8') as f:
f.writelines(new_lines)
else:
logger.info(f'No changes, skip modifying file {os.path.basename(file_path)}')
@timer
def update_readme(self, aired_date, event):
"""
Args:
aired_date (str): war archives update time
event (str): event time
"""
insert = True
for row, text in enumerate(self.lines):
if f'war archives {event}' in text:
insert = False
break
if not re.search(r'^\|.+\|$', text):
# not a table line
continue
elif re.search(r'^.*\-{3,}.*$', text):
# is a delimiter line
continue
else:
line_entries = [x.strip() for x in text.strip('| \n').split('|')]
if re.search(r'\d{8}', text) and event in line_entries[1]:
directory = line_entries[1].replace('event', 'war archives')
for server in SERVER_INDEXS.keys():
if line_entries[SERVER_INDEXS[server]] == '-':
continue
elif self.__getattribute__(server) == '-':
self.__setattr__(server, line_entries[SERVER_INDEXS[server]])
if 'war archives' in text:
insert_row = row
if insert:
insert_event = [aired_date, directory, self.en] + \
[self.__getattribute__(server) for server in SERVER_INDEXS.keys()]
self.lines.insert(insert_row + 1, '|' + '|'.join(insert_event) + '|\n')
with open('./campaign/Readme.md', 'w', encoding='utf-8') as f:
f.writelines(self.lines)
@timer
def update_campaign_files(self, event):
"""
Args:
event (str):
"""
folder = './campaign'
raw_directory = 'event_' + event + '_cn'
directory = 'war_archives_' + event + '_cn'
old_path = os.path.join(folder, raw_directory)
new_path = os.path.join(folder, directory)
self.create_campaign_files(old_path, new_path)
self.modify_campaign_files(old_path, new_path)
@timer
def update_directory(self, event):
"""
Args:
event (str):
"""
directory = 'war_archives_' + event + '_cn'
name = self.event_time_to_name(event).replace('\'', '').replace('-', '_').replace(' ', '_').upper()
file_path = './module/war_archives/dictionary.py'
modify = True
with open(file_path, 'r', encoding='utf-8') as f:
lines = f.readlines()
for row, text in enumerate(lines):
if name in text:
modify = False
break
if 'war_archives' in text:
insert_row = row
if modify:
lines.insert(insert_row + 1, f' \'{directory}\': TEMPLATE_{name},\n')
with open(file_path, 'w', encoding='utf-8') as f:
f.writelines(lines)
else:
logger.info('No changes, skip modifying dictionary.py')
@timer
def war_archives_update(self, aired_date=None, event=None):
"""
Args:
aired_date (str, list[str], None):
use the YYYYMMDD format, such as '20220428',
'today' or None for datetime.today()
event (str, list[str], None):
use the YYYYMMDD format, also can use the event name, such as ['雄鹰的叙事歌', '20220428']
'recent' or None for the lastest event for CN server
"""
if aired_date is None or aired_date == 'today':
dates = [datetime.today().strftime("%Y%m%d")]
elif isinstance(aired_date, str):
dates = [aired_date]
elif isinstance(aired_date, list):
dates = [datetime.today().strftime("%Y%m%d") if d == 'today' else d for d in aired_date]
else:
logger.warning('Wrong Aired Date format')
dates = []
if event is None or event == 'recent':
events = [self.latest_event_cn]
elif isinstance(event, str):
events = [self.event_name_to_time(event)]
elif isinstance(event, list):
events = [self.latest_event_cn if e == 'recent' else self.event_name_to_time(e) for e in event]
else:
logger.warning('Wrong Event format')
events = []
for aired_date, event in tqdm(zip(dates, events)):
self.update_readme(aired_date, event)
self.update_campaign_files(event)
self.update_directory(event)
self.reset()
def run(self):
self.war_archives_update(aired_date=self.aired_date, event=self.event)
ConfigGenerator().generate()
ConfigUpdater().update_file('template', is_template=True)
if __name__ == '__main__':
# Date of update of war archives
# input strings in YYYYMMDD format for war archives update time
# use 'today' for today, use a list to input multiple values,
# such as '20250717', 'today', ['20250619' , '20250717', 'today']
WarArchivesUpdater.aired_date = ['20260409', '20260507']
# Event name or date of update of war archives
# input strings in YYYYMMDD format for event time, or input event name
# use 'recent' for the latest CN enent, use a list to input multiple values,
# such as '20220428', '虹彩的终幕曲', 'recent', ['雄鹰的叙事歌' , '20220428', 'recent']
WarArchivesUpdater.event = ['远汇点作战', '奏响鸢尾之歌']
updater = WarArchivesUpdater()
"""
Step 1:
Run these code.
"""
# Ensure running in Alas root folder
os.chdir(os.path.join(os.path.dirname(__file__), '../'))
updater.run()
"""
Step 2:
Manually add assets of the same name
at the end of module/war_archives/dictionary.py,
and then run dev_tools/button_extract.py.
"""
"""
Step 3:
Modify campaign/<event name>/campaign_base.py for SP event (if file exists)
self.ui_goto_event() --> self.ui_goto_sp()
Modify handle_stage_name() in module/campaign/run.py for T/HT event
"""

View File

@@ -11,12 +11,20 @@ CHAPTER_20241219_SP = Button(area={'cn': (17, 372, 34, 388), 'en': (17, 372, 34,
CHAPTER_NEXT = Button(area={'cn': (1216, 362, 1232, 388), 'en': (1216, 362, 1232, 388), 'jp': (1216, 362, 1232, 388), 'tw': (1216, 362, 1232, 388)}, color={'cn': (121, 150, 198), 'en': (121, 150, 198), 'jp': (121, 150, 198), 'tw': (121, 150, 198)}, button={'cn': (1216, 362, 1232, 388), 'en': (1216, 362, 1232, 388), 'jp': (1216, 362, 1232, 388), 'tw': (1216, 362, 1232, 388)}, file={'cn': './assets/cn/campaign/CHAPTER_NEXT.png', 'en': './assets/en/campaign/CHAPTER_NEXT.png', 'jp': './assets/jp/campaign/CHAPTER_NEXT.png', 'tw': './assets/tw/campaign/CHAPTER_NEXT.png'}) CHAPTER_NEXT = Button(area={'cn': (1216, 362, 1232, 388), 'en': (1216, 362, 1232, 388), 'jp': (1216, 362, 1232, 388), 'tw': (1216, 362, 1232, 388)}, color={'cn': (121, 150, 198), 'en': (121, 150, 198), 'jp': (121, 150, 198), 'tw': (121, 150, 198)}, button={'cn': (1216, 362, 1232, 388), 'en': (1216, 362, 1232, 388), 'jp': (1216, 362, 1232, 388), 'tw': (1216, 362, 1232, 388)}, file={'cn': './assets/cn/campaign/CHAPTER_NEXT.png', 'en': './assets/en/campaign/CHAPTER_NEXT.png', 'jp': './assets/jp/campaign/CHAPTER_NEXT.png', 'tw': './assets/tw/campaign/CHAPTER_NEXT.png'})
CHAPTER_PREV = Button(area={'cn': (42, 360, 58, 387), 'en': (42, 360, 58, 387), 'jp': (42, 360, 58, 387), 'tw': (42, 360, 58, 387)}, color={'cn': (105, 133, 169), 'en': (105, 133, 169), 'jp': (105, 133, 169), 'tw': (105, 133, 169)}, button={'cn': (42, 360, 58, 387), 'en': (42, 360, 58, 387), 'jp': (42, 360, 58, 387), 'tw': (42, 360, 58, 387)}, file={'cn': './assets/cn/campaign/CHAPTER_PREV.png', 'en': './assets/en/campaign/CHAPTER_PREV.png', 'jp': './assets/jp/campaign/CHAPTER_PREV.png', 'tw': './assets/tw/campaign/CHAPTER_PREV.png'}) CHAPTER_PREV = Button(area={'cn': (42, 360, 58, 387), 'en': (42, 360, 58, 387), 'jp': (42, 360, 58, 387), 'tw': (42, 360, 58, 387)}, color={'cn': (105, 133, 169), 'en': (105, 133, 169), 'jp': (105, 133, 169), 'tw': (105, 133, 169)}, button={'cn': (42, 360, 58, 387), 'en': (42, 360, 58, 387), 'jp': (42, 360, 58, 387), 'tw': (42, 360, 58, 387)}, file={'cn': './assets/cn/campaign/CHAPTER_PREV.png', 'en': './assets/en/campaign/CHAPTER_PREV.png', 'jp': './assets/jp/campaign/CHAPTER_PREV.png', 'tw': './assets/tw/campaign/CHAPTER_PREV.png'})
COMMISSION_NOTICE_AT_CAMPAIGN = Button(area={'cn': (1077, 637, 1083, 643), 'en': (1077, 637, 1083, 643), 'jp': (1077, 637, 1083, 643), 'tw': (1077, 637, 1083, 643)}, color={'cn': (172, 72, 49), 'en': (172, 72, 49), 'jp': (172, 72, 49), 'tw': (172, 72, 49)}, button={'cn': (1077, 637, 1083, 643), 'en': (1077, 637, 1083, 643), 'jp': (1077, 637, 1083, 643), 'tw': (1077, 637, 1083, 643)}, file={'cn': './assets/cn/campaign/COMMISSION_NOTICE_AT_CAMPAIGN.png', 'en': './assets/en/campaign/COMMISSION_NOTICE_AT_CAMPAIGN.png', 'jp': './assets/jp/campaign/COMMISSION_NOTICE_AT_CAMPAIGN.png', 'tw': './assets/tw/campaign/COMMISSION_NOTICE_AT_CAMPAIGN.png'}) COMMISSION_NOTICE_AT_CAMPAIGN = Button(area={'cn': (1077, 637, 1083, 643), 'en': (1077, 637, 1083, 643), 'jp': (1077, 637, 1083, 643), 'tw': (1077, 637, 1083, 643)}, color={'cn': (172, 72, 49), 'en': (172, 72, 49), 'jp': (172, 72, 49), 'tw': (172, 72, 49)}, button={'cn': (1077, 637, 1083, 643), 'en': (1077, 637, 1083, 643), 'jp': (1077, 637, 1083, 643), 'tw': (1077, 637, 1083, 643)}, file={'cn': './assets/cn/campaign/COMMISSION_NOTICE_AT_CAMPAIGN.png', 'en': './assets/en/campaign/COMMISSION_NOTICE_AT_CAMPAIGN.png', 'jp': './assets/jp/campaign/COMMISSION_NOTICE_AT_CAMPAIGN.png', 'tw': './assets/tw/campaign/COMMISSION_NOTICE_AT_CAMPAIGN.png'})
EVENT_20201126_ENTRANCE_TEMP = Button(area={'cn': (1023, 368, 1100, 407), 'en': (1025, 367, 1095, 406), 'jp': (1023, 367, 1101, 402), 'tw': (1023, 368, 1100, 407)}, color={'cn': (160, 208, 243), 'en': (156, 206, 243), 'jp': (167, 213, 245), 'tw': (160, 208, 243)}, button={'cn': (1023, 368, 1100, 407), 'en': (1025, 367, 1095, 406), 'jp': (1023, 367, 1101, 402), 'tw': (1023, 368, 1100, 407)}, file={'cn': './assets/cn/campaign/EVENT_20201126_ENTRANCE_TEMP.png', 'en': './assets/en/campaign/EVENT_20201126_ENTRANCE_TEMP.png', 'jp': './assets/jp/campaign/EVENT_20201126_ENTRANCE_TEMP.png', 'tw': './assets/cn/campaign/EVENT_20201126_ENTRANCE_TEMP.png'}) EVENT_20201126_DETAIL = Button(area={'cn': (617, 470, 659, 510), 'en': (617, 470, 659, 510), 'jp': (617, 470, 659, 510), 'tw': (617, 470, 659, 510)}, color={'cn': (188, 152, 166), 'en': (188, 152, 166), 'jp': (188, 152, 166), 'tw': (188, 152, 166)}, button={'cn': (617, 470, 659, 510), 'en': (617, 470, 659, 510), 'jp': (617, 470, 659, 510), 'tw': (617, 470, 659, 510)}, file={'cn': './assets/cn/campaign/EVENT_20201126_DETAIL.png', 'en': './assets/cn/campaign/EVENT_20201126_DETAIL.png', 'jp': './assets/cn/campaign/EVENT_20201126_DETAIL.png', 'tw': './assets/cn/campaign/EVENT_20201126_DETAIL.png'})
EVENT_20201126_DETAIL_CHECK = Button(area={'cn': (1198, 20, 1244, 65), 'en': (1198, 20, 1244, 65), 'jp': (1198, 20, 1244, 65), 'tw': (1198, 20, 1244, 65)}, color={'cn': (176, 138, 121), 'en': (176, 138, 121), 'jp': (176, 138, 121), 'tw': (176, 138, 121)}, button={'cn': (1198, 20, 1244, 65), 'en': (1198, 20, 1244, 65), 'jp': (1198, 20, 1244, 65), 'tw': (1198, 20, 1244, 65)}, file={'cn': './assets/cn/campaign/EVENT_20201126_DETAIL_CHECK.png', 'en': './assets/cn/campaign/EVENT_20201126_DETAIL_CHECK.png', 'jp': './assets/cn/campaign/EVENT_20201126_DETAIL_CHECK.png', 'tw': './assets/cn/campaign/EVENT_20201126_DETAIL_CHECK.png'})
EVENT_20201126_DETAIL_WHITE = Button(area={'cn': (969, 94, 1030, 156), 'en': (969, 94, 1030, 156), 'jp': (969, 94, 1030, 156), 'tw': (969, 94, 1030, 156)}, color={'cn': (178, 148, 165), 'en': (178, 148, 165), 'jp': (178, 148, 165), 'tw': (178, 148, 165)}, button={'cn': (969, 94, 1030, 156), 'en': (969, 94, 1030, 156), 'jp': (969, 94, 1030, 156), 'tw': (969, 94, 1030, 156)}, file={'cn': './assets/cn/campaign/EVENT_20201126_DETAIL_WHITE.png', 'en': './assets/cn/campaign/EVENT_20201126_DETAIL_WHITE.png', 'jp': './assets/cn/campaign/EVENT_20201126_DETAIL_WHITE.png', 'tw': './assets/cn/campaign/EVENT_20201126_DETAIL_WHITE.png'})
EVENT_20201126_ENTRANCE = Button(area={'cn': (927, 599, 1054, 631), 'en': (927, 599, 1054, 631), 'jp': (927, 599, 1054, 631), 'tw': (927, 599, 1054, 631)}, color={'cn': (255, 255, 255), 'en': (255, 255, 255), 'jp': (255, 255, 255), 'tw': (255, 255, 255)}, button={'cn': (927, 599, 1054, 631), 'en': (927, 599, 1054, 631), 'jp': (927, 599, 1054, 631), 'tw': (927, 599, 1054, 631)}, file={'cn': './assets/cn/campaign/EVENT_20201126_ENTRANCE.png', 'en': './assets/cn/campaign/EVENT_20201126_ENTRANCE.png', 'jp': './assets/cn/campaign/EVENT_20201126_ENTRANCE.png', 'tw': './assets/cn/campaign/EVENT_20201126_ENTRANCE.png'})
EVENT_20201126_PT_ICON = Button(area={'cn': (1108, 102, 1133, 127), 'en': (1108, 102, 1133, 127), 'jp': (1108, 102, 1133, 127), 'tw': (1108, 102, 1133, 127)}, color={'cn': (231, 121, 159), 'en': (231, 121, 159), 'jp': (231, 121, 159), 'tw': (231, 121, 159)}, button={'cn': (1108, 102, 1133, 127), 'en': (1108, 102, 1133, 127), 'jp': (1108, 102, 1133, 127), 'tw': (1108, 102, 1133, 127)}, file={'cn': './assets/cn/campaign/EVENT_20201126_PT_ICON.png', 'en': './assets/cn/campaign/EVENT_20201126_PT_ICON.png', 'jp': './assets/cn/campaign/EVENT_20201126_PT_ICON.png', 'tw': './assets/cn/campaign/EVENT_20201126_PT_ICON.png'}) EVENT_20201126_PT_ICON = Button(area={'cn': (1108, 102, 1133, 127), 'en': (1108, 102, 1133, 127), 'jp': (1108, 102, 1133, 127), 'tw': (1108, 102, 1133, 127)}, color={'cn': (231, 121, 159), 'en': (231, 121, 159), 'jp': (231, 121, 159), 'tw': (231, 121, 159)}, button={'cn': (1108, 102, 1133, 127), 'en': (1108, 102, 1133, 127), 'jp': (1108, 102, 1133, 127), 'tw': (1108, 102, 1133, 127)}, file={'cn': './assets/cn/campaign/EVENT_20201126_PT_ICON.png', 'en': './assets/cn/campaign/EVENT_20201126_PT_ICON.png', 'jp': './assets/cn/campaign/EVENT_20201126_PT_ICON.png', 'tw': './assets/cn/campaign/EVENT_20201126_PT_ICON.png'})
EVENT_20221124_ENTRANCE = Button(area={'cn': (1037, 162, 1077, 195), 'en': (1037, 162, 1077, 195), 'jp': (1037, 162, 1077, 195), 'tw': (1037, 162, 1077, 195)}, color={'cn': (207, 168, 148), 'en': (207, 168, 148), 'jp': (207, 168, 148), 'tw': (207, 168, 148)}, button={'cn': (1037, 162, 1077, 195), 'en': (1037, 162, 1077, 195), 'jp': (1037, 162, 1077, 195), 'tw': (1037, 162, 1077, 195)}, file={'cn': './assets/cn/campaign/EVENT_20221124_ENTRANCE.png', 'en': './assets/cn/campaign/EVENT_20221124_ENTRANCE.png', 'jp': './assets/cn/campaign/EVENT_20221124_ENTRANCE.png', 'tw': './assets/cn/campaign/EVENT_20221124_ENTRANCE.png'}) EVENT_20221124_ENTRANCE = Button(area={'cn': (1037, 162, 1077, 195), 'en': (1037, 162, 1077, 195), 'jp': (1037, 162, 1077, 195), 'tw': (1037, 162, 1077, 195)}, color={'cn': (207, 168, 148), 'en': (207, 168, 148), 'jp': (207, 168, 148), 'tw': (207, 168, 148)}, button={'cn': (1037, 162, 1077, 195), 'en': (1037, 162, 1077, 195), 'jp': (1037, 162, 1077, 195), 'tw': (1037, 162, 1077, 195)}, file={'cn': './assets/cn/campaign/EVENT_20221124_ENTRANCE.png', 'en': './assets/cn/campaign/EVENT_20221124_ENTRANCE.png', 'jp': './assets/cn/campaign/EVENT_20221124_ENTRANCE.png', 'tw': './assets/cn/campaign/EVENT_20221124_ENTRANCE.png'})
EVENT_20221124_PT_ICON = Button(area={'cn': (1106, 109, 1135, 130), 'en': (1071, 109, 1101, 129), 'jp': (1106, 109, 1135, 130), 'tw': (1106, 109, 1135, 130)}, color={'cn': (151, 116, 139), 'en': (152, 115, 138), 'jp': (151, 116, 139), 'tw': (151, 116, 139)}, button={'cn': (1106, 109, 1135, 130), 'en': (1071, 109, 1101, 129), 'jp': (1106, 109, 1135, 130), 'tw': (1106, 109, 1135, 130)}, file={'cn': './assets/cn/campaign/EVENT_20221124_PT_ICON.png', 'en': './assets/en/campaign/EVENT_20221124_PT_ICON.png', 'jp': './assets/cn/campaign/EVENT_20221124_PT_ICON.png', 'tw': './assets/cn/campaign/EVENT_20221124_PT_ICON.png'}) EVENT_20221124_PT_ICON = Button(area={'cn': (1106, 109, 1135, 130), 'en': (1071, 109, 1101, 129), 'jp': (1106, 109, 1135, 130), 'tw': (1106, 109, 1135, 130)}, color={'cn': (151, 116, 139), 'en': (152, 115, 138), 'jp': (151, 116, 139), 'tw': (151, 116, 139)}, button={'cn': (1106, 109, 1135, 130), 'en': (1071, 109, 1101, 129), 'jp': (1106, 109, 1135, 130), 'tw': (1106, 109, 1135, 130)}, file={'cn': './assets/cn/campaign/EVENT_20221124_PT_ICON.png', 'en': './assets/en/campaign/EVENT_20221124_PT_ICON.png', 'jp': './assets/cn/campaign/EVENT_20221124_PT_ICON.png', 'tw': './assets/cn/campaign/EVENT_20221124_PT_ICON.png'})
EVENT_20230817_STORY = Button(area={'cn': (610, 320, 670, 380), 'en': (610, 320, 670, 380), 'jp': (610, 320, 670, 380), 'tw': (610, 320, 670, 380)}, color={'cn': (183, 180, 190), 'en': (183, 180, 190), 'jp': (183, 180, 190), 'tw': (183, 180, 190)}, button={'cn': (610, 320, 670, 380), 'en': (610, 320, 670, 380), 'jp': (610, 320, 670, 380), 'tw': (610, 320, 670, 380)}, file={'cn': './assets/cn/campaign/EVENT_20230817_STORY.png', 'en': './assets/en/campaign/EVENT_20230817_STORY.png', 'jp': './assets/jp/campaign/EVENT_20230817_STORY.png', 'tw': './assets/tw/campaign/EVENT_20230817_STORY.png'}) EVENT_20230817_STORY = Button(area={'cn': (610, 320, 670, 380), 'en': (610, 320, 670, 380), 'jp': (610, 320, 670, 380), 'tw': (610, 320, 670, 380)}, color={'cn': (183, 180, 190), 'en': (183, 180, 190), 'jp': (183, 180, 190), 'tw': (183, 180, 190)}, button={'cn': (610, 320, 670, 380), 'en': (610, 320, 670, 380), 'jp': (610, 320, 670, 380), 'tw': (610, 320, 670, 380)}, file={'cn': './assets/cn/campaign/EVENT_20230817_STORY.png', 'en': './assets/en/campaign/EVENT_20230817_STORY.png', 'jp': './assets/jp/campaign/EVENT_20230817_STORY.png', 'tw': './assets/tw/campaign/EVENT_20230817_STORY.png'})
EVENT_20250424_PT_ICON = Button(area={'cn': (1109, 109, 1133, 131), 'en': (1109, 109, 1133, 131), 'jp': (1109, 109, 1133, 131), 'tw': (1109, 109, 1133, 131)}, color={'cn': (182, 173, 150), 'en': (182, 173, 150), 'jp': (182, 173, 150), 'tw': (182, 173, 150)}, button={'cn': (1109, 109, 1133, 131), 'en': (1109, 109, 1133, 131), 'jp': (1109, 109, 1133, 131), 'tw': (1109, 109, 1133, 131)}, file={'cn': './assets/cn/campaign/EVENT_20250424_PT_ICON.png', 'en': './assets/cn/campaign/EVENT_20250424_PT_ICON.png', 'jp': './assets/cn/campaign/EVENT_20250424_PT_ICON.png', 'tw': './assets/cn/campaign/EVENT_20250424_PT_ICON.png'})
EVENT_20250724_PT_ICON = Button(area={'cn': (1102, 106, 1139, 121), 'en': (1067, 108, 1104, 123), 'jp': (1102, 106, 1139, 121), 'tw': (1102, 106, 1139, 121)}, color={'cn': (95, 103, 93), 'en': (97, 101, 94), 'jp': (95, 103, 93), 'tw': (95, 103, 93)}, button={'cn': (1102, 106, 1139, 121), 'en': (1067, 108, 1104, 123), 'jp': (1102, 106, 1139, 121), 'tw': (1102, 106, 1139, 121)}, file={'cn': './assets/cn/campaign/EVENT_20250724_PT_ICON.png', 'en': './assets/en/campaign/EVENT_20250724_PT_ICON.png', 'jp': './assets/cn/campaign/EVENT_20250724_PT_ICON.png', 'tw': './assets/cn/campaign/EVENT_20250724_PT_ICON.png'}) EVENT_20250724_PT_ICON = Button(area={'cn': (1102, 106, 1139, 121), 'en': (1067, 108, 1104, 123), 'jp': (1102, 106, 1139, 121), 'tw': (1102, 106, 1139, 121)}, color={'cn': (95, 103, 93), 'en': (97, 101, 94), 'jp': (95, 103, 93), 'tw': (95, 103, 93)}, button={'cn': (1102, 106, 1139, 121), 'en': (1067, 108, 1104, 123), 'jp': (1102, 106, 1139, 121), 'tw': (1102, 106, 1139, 121)}, file={'cn': './assets/cn/campaign/EVENT_20250724_PT_ICON.png', 'en': './assets/en/campaign/EVENT_20250724_PT_ICON.png', 'jp': './assets/cn/campaign/EVENT_20250724_PT_ICON.png', 'tw': './assets/cn/campaign/EVENT_20250724_PT_ICON.png'})
EVENT_20260417_DETAIL = Button(area={'cn': (618, 251, 658, 290), 'en': (618, 251, 658, 290), 'jp': (618, 251, 658, 290), 'tw': (618, 251, 658, 290)}, color={'cn': (221, 188, 185), 'en': (221, 188, 185), 'jp': (221, 188, 185), 'tw': (221, 188, 185)}, button={'cn': (618, 251, 658, 290), 'en': (618, 251, 658, 290), 'jp': (618, 251, 658, 290), 'tw': (618, 251, 658, 290)}, file={'cn': './assets/cn/campaign/EVENT_20260417_DETAIL.png', 'en': './assets/cn/campaign/EVENT_20260417_DETAIL.png', 'jp': './assets/cn/campaign/EVENT_20260417_DETAIL.png', 'tw': './assets/cn/campaign/EVENT_20260417_DETAIL.png'})
EVENT_20260417_DETAIL_CHECK = Button(area={'cn': (439, 216, 535, 293), 'en': (439, 216, 535, 293), 'jp': (439, 216, 535, 293), 'tw': (439, 216, 535, 293)}, color={'cn': (187, 160, 173), 'en': (187, 160, 173), 'jp': (187, 160, 173), 'tw': (187, 160, 173)}, button={'cn': (439, 216, 535, 293), 'en': (439, 216, 535, 293), 'jp': (439, 216, 535, 293), 'tw': (439, 216, 535, 293)}, file={'cn': './assets/cn/campaign/EVENT_20260417_DETAIL_CHECK.png', 'en': './assets/cn/campaign/EVENT_20260417_DETAIL_CHECK.png', 'jp': './assets/cn/campaign/EVENT_20260417_DETAIL_CHECK.png', 'tw': './assets/cn/campaign/EVENT_20260417_DETAIL_CHECK.png'})
EVENT_20260417_DETAIL_WHITE = Button(area={'cn': (1081, 92, 1141, 153), 'en': (1081, 92, 1141, 153), 'jp': (1081, 92, 1141, 153), 'tw': (1081, 92, 1141, 153)}, color={'cn': (211, 173, 175), 'en': (211, 173, 175), 'jp': (211, 173, 175), 'tw': (211, 173, 175)}, button={'cn': (1081, 92, 1141, 153), 'en': (1081, 92, 1141, 153), 'jp': (1081, 92, 1141, 153), 'tw': (1081, 92, 1141, 153)}, file={'cn': './assets/cn/campaign/EVENT_20260417_DETAIL_WHITE.png', 'en': './assets/cn/campaign/EVENT_20260417_DETAIL_WHITE.png', 'jp': './assets/cn/campaign/EVENT_20260417_DETAIL_WHITE.png', 'tw': './assets/cn/campaign/EVENT_20260417_DETAIL_WHITE.png'})
EVENT_20260417_ENTRANCE = Button(area={'cn': (957, 522, 1091, 573), 'en': (957, 522, 1091, 573), 'jp': (957, 522, 1091, 573), 'tw': (957, 522, 1091, 573)}, color={'cn': (255, 255, 255), 'en': (255, 255, 255), 'jp': (255, 255, 255), 'tw': (255, 255, 255)}, button={'cn': (957, 522, 1091, 573), 'en': (957, 522, 1091, 573), 'jp': (957, 522, 1091, 573), 'tw': (957, 522, 1091, 573)}, file={'cn': './assets/cn/campaign/EVENT_20260417_ENTRANCE.png', 'en': './assets/cn/campaign/EVENT_20260417_ENTRANCE.png', 'jp': './assets/cn/campaign/EVENT_20260417_ENTRANCE.png', 'tw': './assets/cn/campaign/EVENT_20260417_ENTRANCE.png'})
EVENT_20260417_PT_ICON = Button(area={'cn': (1110, 106, 1133, 130), 'en': (1110, 106, 1133, 130), 'jp': (1110, 106, 1133, 130), 'tw': (1110, 106, 1133, 130)}, color={'cn': (119, 177, 213), 'en': (119, 177, 213), 'jp': (119, 177, 213), 'tw': (119, 177, 213)}, button={'cn': (1110, 106, 1133, 130), 'en': (1110, 106, 1133, 130), 'jp': (1110, 106, 1133, 130), 'tw': (1110, 106, 1133, 130)}, file={'cn': './assets/cn/campaign/EVENT_20260417_PT_ICON.png', 'en': './assets/cn/campaign/EVENT_20260417_PT_ICON.png', 'jp': './assets/cn/campaign/EVENT_20260417_PT_ICON.png', 'tw': './assets/cn/campaign/EVENT_20260417_PT_ICON.png'}) EVENT_20260417_PT_ICON = Button(area={'cn': (1110, 106, 1133, 130), 'en': (1110, 106, 1133, 130), 'jp': (1110, 106, 1133, 130), 'tw': (1110, 106, 1133, 130)}, color={'cn': (119, 177, 213), 'en': (119, 177, 213), 'jp': (119, 177, 213), 'tw': (119, 177, 213)}, button={'cn': (1110, 106, 1133, 130), 'en': (1110, 106, 1133, 130), 'jp': (1110, 106, 1133, 130), 'tw': (1110, 106, 1133, 130)}, file={'cn': './assets/cn/campaign/EVENT_20260417_PT_ICON.png', 'en': './assets/cn/campaign/EVENT_20260417_PT_ICON.png', 'jp': './assets/cn/campaign/EVENT_20260417_PT_ICON.png', 'tw': './assets/cn/campaign/EVENT_20260417_PT_ICON.png'})
OCR_COIN = Button(area={'cn': (815, 23, 922, 51), 'en': (815, 23, 922, 51), 'jp': (815, 23, 922, 51), 'tw': (815, 23, 922, 51)}, color={'cn': (61, 61, 73), 'en': (61, 61, 73), 'jp': (61, 61, 73), 'tw': (61, 61, 73)}, button={'cn': (815, 23, 922, 51), 'en': (815, 23, 922, 51), 'jp': (815, 23, 922, 51), 'tw': (815, 23, 922, 51)}, file={'cn': './assets/cn/campaign/OCR_COIN.png', 'en': './assets/en/campaign/OCR_COIN.png', 'jp': './assets/jp/campaign/OCR_COIN.png', 'tw': './assets/tw/campaign/OCR_COIN.png'}) OCR_COIN = Button(area={'cn': (815, 23, 922, 51), 'en': (815, 23, 922, 51), 'jp': (815, 23, 922, 51), 'tw': (815, 23, 922, 51)}, color={'cn': (61, 61, 73), 'en': (61, 61, 73), 'jp': (61, 61, 73), 'tw': (61, 61, 73)}, button={'cn': (815, 23, 922, 51), 'en': (815, 23, 922, 51), 'jp': (815, 23, 922, 51), 'tw': (815, 23, 922, 51)}, file={'cn': './assets/cn/campaign/OCR_COIN.png', 'en': './assets/en/campaign/OCR_COIN.png', 'jp': './assets/jp/campaign/OCR_COIN.png', 'tw': './assets/tw/campaign/OCR_COIN.png'})
OCR_EVENT_PT = Button(area={'cn': (1196, 109, 1280, 131), 'en': (1190, 109, 1280, 129), 'jp': (1196, 109, 1280, 131), 'tw': (1196, 109, 1280, 131)}, color={'cn': (121, 110, 59), 'en': (88, 78, 51), 'jp': (121, 110, 59), 'tw': (121, 110, 59)}, button={'cn': (1196, 109, 1280, 131), 'en': (1190, 109, 1280, 129), 'jp': (1196, 109, 1280, 131), 'tw': (1196, 109, 1280, 131)}, file={'cn': './assets/cn/campaign/OCR_EVENT_PT.png', 'en': './assets/en/campaign/OCR_EVENT_PT.png', 'jp': './assets/jp/campaign/OCR_EVENT_PT.png', 'tw': './assets/tw/campaign/OCR_EVENT_PT.png'}) OCR_EVENT_PT = Button(area={'cn': (1196, 109, 1280, 131), 'en': (1190, 109, 1280, 129), 'jp': (1196, 109, 1280, 131), 'tw': (1196, 109, 1280, 131)}, color={'cn': (121, 110, 59), 'en': (88, 78, 51), 'jp': (121, 110, 59), 'tw': (121, 110, 59)}, button={'cn': (1196, 109, 1280, 131), 'en': (1190, 109, 1280, 129), 'jp': (1196, 109, 1280, 131), 'tw': (1196, 109, 1280, 131)}, file={'cn': './assets/cn/campaign/OCR_EVENT_PT.png', 'en': './assets/en/campaign/OCR_EVENT_PT.png', 'jp': './assets/jp/campaign/OCR_EVENT_PT.png', 'tw': './assets/tw/campaign/OCR_EVENT_PT.png'})

View File

@@ -11,5 +11,5 @@ COMMISSION_SCROLL_AREA = Button(area={'cn': (1254, 77, 1261, 676), 'en': (1254,
COMMISSION_START = Button(area={'cn': (1028, 322, 1156, 383), 'en': (1053, 333, 1134, 361), 'jp': (1033, 340, 1153, 376), 'tw': (1027, 326, 1157, 389)}, color={'cn': (229, 175, 113), 'en': (237, 199, 149), 'jp': (231, 184, 121), 'tw': (231, 180, 120)}, button={'cn': (1028, 322, 1156, 383), 'en': (1053, 333, 1134, 361), 'jp': (1033, 340, 1153, 376), 'tw': (1027, 326, 1157, 389)}, file={'cn': './assets/cn/commission/COMMISSION_START.png', 'en': './assets/en/commission/COMMISSION_START.png', 'jp': './assets/jp/commission/COMMISSION_START.png', 'tw': './assets/tw/commission/COMMISSION_START.png'}) COMMISSION_START = Button(area={'cn': (1028, 322, 1156, 383), 'en': (1053, 333, 1134, 361), 'jp': (1033, 340, 1153, 376), 'tw': (1027, 326, 1157, 389)}, color={'cn': (229, 175, 113), 'en': (237, 199, 149), 'jp': (231, 184, 121), 'tw': (231, 180, 120)}, button={'cn': (1028, 322, 1156, 383), 'en': (1053, 333, 1134, 361), 'jp': (1033, 340, 1153, 376), 'tw': (1027, 326, 1157, 389)}, file={'cn': './assets/cn/commission/COMMISSION_START.png', 'en': './assets/en/commission/COMMISSION_START.png', 'jp': './assets/jp/commission/COMMISSION_START.png', 'tw': './assets/tw/commission/COMMISSION_START.png'})
COMMISSION_URGENT = Button(area={'cn': (35, 231, 68, 281), 'en': (28, 221, 76, 283), 'jp': (34, 266, 68, 279), 'tw': (35, 229, 69, 280)}, color={'cn': (215, 188, 124), 'en': (169, 138, 95), 'jp': (216, 190, 111), 'tw': (213, 186, 123)}, button={'cn': (35, 231, 68, 281), 'en': (28, 221, 76, 283), 'jp': (34, 266, 68, 279), 'tw': (35, 229, 69, 280)}, file={'cn': './assets/cn/commission/COMMISSION_URGENT.png', 'en': './assets/en/commission/COMMISSION_URGENT.png', 'jp': './assets/jp/commission/COMMISSION_URGENT.png', 'tw': './assets/tw/commission/COMMISSION_URGENT.png'}) COMMISSION_URGENT = Button(area={'cn': (35, 231, 68, 281), 'en': (28, 221, 76, 283), 'jp': (34, 266, 68, 279), 'tw': (35, 229, 69, 280)}, color={'cn': (215, 188, 124), 'en': (169, 138, 95), 'jp': (216, 190, 111), 'tw': (213, 186, 123)}, button={'cn': (35, 231, 68, 281), 'en': (28, 221, 76, 283), 'jp': (34, 266, 68, 279), 'tw': (35, 229, 69, 280)}, file={'cn': './assets/cn/commission/COMMISSION_URGENT.png', 'en': './assets/en/commission/COMMISSION_URGENT.png', 'jp': './assets/jp/commission/COMMISSION_URGENT.png', 'tw': './assets/tw/commission/COMMISSION_URGENT.png'})
EXP_INFO_S_REWARD = Button(area={'cn': (498, 140, 557, 154), 'en': (1138, 40, 1266, 145), 'jp': (498, 140, 557, 154), 'tw': (498, 140, 557, 154)}, color={'cn': (233, 241, 127), 'en': (89, 115, 159), 'jp': (233, 241, 127), 'tw': (233, 241, 127)}, button={'cn': (498, 140, 557, 154), 'en': (1138, 40, 1266, 145), 'jp': (498, 140, 557, 154), 'tw': (498, 140, 557, 154)}, file={'cn': './assets/cn/commission/EXP_INFO_S_REWARD.png', 'en': './assets/en/commission/EXP_INFO_S_REWARD.png', 'jp': './assets/jp/commission/EXP_INFO_S_REWARD.png', 'tw': './assets/tw/commission/EXP_INFO_S_REWARD.png'}) EXP_INFO_S_REWARD = Button(area={'cn': (498, 140, 557, 154), 'en': (1138, 40, 1266, 145), 'jp': (498, 140, 557, 154), 'tw': (498, 140, 557, 154)}, color={'cn': (233, 241, 127), 'en': (89, 115, 159), 'jp': (233, 241, 127), 'tw': (233, 241, 127)}, button={'cn': (498, 140, 557, 154), 'en': (1138, 40, 1266, 145), 'jp': (498, 140, 557, 154), 'tw': (498, 140, 557, 154)}, file={'cn': './assets/cn/commission/EXP_INFO_S_REWARD.png', 'en': './assets/en/commission/EXP_INFO_S_REWARD.png', 'jp': './assets/jp/commission/EXP_INFO_S_REWARD.png', 'tw': './assets/tw/commission/EXP_INFO_S_REWARD.png'})
REWARD_1 = Button(area={'cn': (383, 285, 503, 297), 'en': (403, 274, 504, 290), 'jp': (432, 273, 476, 294), 'tw': (383, 285, 503, 297)}, color={'cn': (238, 168, 81), 'en': (241, 198, 145), 'jp': (241, 188, 122), 'tw': (238, 168, 81)}, button={'cn': (383, 285, 503, 297), 'en': (392, 262, 515, 303), 'jp': (393, 262, 514, 303), 'tw': (383, 285, 503, 297)}, file={'cn': './assets/cn/commission/REWARD_1.png', 'en': './assets/en/commission/REWARD_1.png', 'jp': './assets/jp/commission/REWARD_1.png', 'tw': './assets/tw/commission/REWARD_1.png'}) REWARD_1 = Button(area={'cn': (383, 285, 503, 297), 'en': (403, 274, 504, 290), 'jp': (432, 273, 476, 294), 'tw': (383, 285, 503, 297)}, color={'cn': (238, 168, 81), 'en': (241, 198, 145), 'jp': (241, 188, 122), 'tw': (238, 168, 81)}, button={'cn': (383, 285, 503, 297), 'en': (392, 262, 515, 303), 'jp': (403, 271, 514, 303), 'tw': (383, 285, 503, 297)}, file={'cn': './assets/cn/commission/REWARD_1.png', 'en': './assets/en/commission/REWARD_1.png', 'jp': './assets/jp/commission/REWARD_1.png', 'tw': './assets/tw/commission/REWARD_1.png'})
REWARD_SAVE_CLICK = Button(area={'cn': (415, 184, 496, 214), 'en': (415, 184, 496, 214), 'jp': (415, 184, 496, 214), 'tw': (415, 184, 496, 214)}, color={'cn': (152, 150, 168), 'en': (152, 150, 168), 'jp': (152, 150, 168), 'tw': (152, 150, 168)}, button={'cn': (415, 184, 496, 214), 'en': (415, 184, 496, 214), 'jp': (415, 184, 496, 214), 'tw': (415, 184, 496, 214)}, file={'cn': './assets/cn/commission/REWARD_SAVE_CLICK.png', 'en': './assets/en/commission/REWARD_SAVE_CLICK.png', 'jp': './assets/jp/commission/REWARD_SAVE_CLICK.png', 'tw': './assets/tw/commission/REWARD_SAVE_CLICK.png'}) REWARD_SAVE_CLICK = Button(area={'cn': (415, 184, 496, 214), 'en': (415, 184, 496, 214), 'jp': (415, 184, 496, 214), 'tw': (415, 184, 496, 214)}, color={'cn': (152, 150, 168), 'en': (152, 150, 168), 'jp': (152, 150, 168), 'tw': (152, 150, 168)}, button={'cn': (415, 184, 496, 214), 'en': (415, 184, 496, 214), 'jp': (415, 184, 496, 214), 'tw': (415, 184, 496, 214)}, file={'cn': './assets/cn/commission/REWARD_SAVE_CLICK.png', 'en': './assets/en/commission/REWARD_SAVE_CLICK.png', 'jp': './assets/jp/commission/REWARD_SAVE_CLICK.png', 'tw': './assets/tw/commission/REWARD_SAVE_CLICK.png'})

View File

@@ -1643,27 +1643,30 @@
"value": "campaign_main", "value": "campaign_main",
"option": [ "option": [
"event_20201126_cn", "event_20201126_cn",
"event_20220915_cn", "event_20250424_cn",
"event_20260417_cn" "event_20260417_cn"
], ],
"option_cn": [ "option_cn": [
"event_20250424_cn",
"event_20201126_cn", "event_20201126_cn",
"event_20260417_cn" "event_20260417_cn"
], ],
"option_en": [ "option_en": [
"event_20250424_cn",
"event_20201126_cn", "event_20201126_cn",
"event_20260417_cn" "event_20260417_cn"
], ],
"option_jp": [ "option_jp": [
"event_20250424_cn",
"event_20201126_cn", "event_20201126_cn",
"event_20260417_cn" "event_20260417_cn"
], ],
"option_tw": [ "option_tw": [
"event_20220915_cn" "event_20260417_cn"
], ],
"option_bold": [ "option_bold": [
"event_20201126_cn", "event_20201126_cn",
"event_20220915_cn", "event_20250424_cn",
"event_20260417_cn" "event_20260417_cn"
] ]
}, },
@@ -1930,27 +1933,30 @@
"value": "campaign_main", "value": "campaign_main",
"option": [ "option": [
"event_20201126_cn", "event_20201126_cn",
"event_20220915_cn", "event_20250424_cn",
"event_20260417_cn" "event_20260417_cn"
], ],
"option_cn": [ "option_cn": [
"event_20250424_cn",
"event_20201126_cn", "event_20201126_cn",
"event_20260417_cn" "event_20260417_cn"
], ],
"option_en": [ "option_en": [
"event_20250424_cn",
"event_20201126_cn", "event_20201126_cn",
"event_20260417_cn" "event_20260417_cn"
], ],
"option_jp": [ "option_jp": [
"event_20250424_cn",
"event_20201126_cn", "event_20201126_cn",
"event_20260417_cn" "event_20260417_cn"
], ],
"option_tw": [ "option_tw": [
"event_20220915_cn" "event_20260417_cn"
], ],
"option_bold": [ "option_bold": [
"event_20201126_cn", "event_20201126_cn",
"event_20220915_cn", "event_20250424_cn",
"event_20260417_cn" "event_20260417_cn"
] ]
}, },
@@ -2332,27 +2338,30 @@
"value": "campaign_main", "value": "campaign_main",
"option": [ "option": [
"event_20201126_cn", "event_20201126_cn",
"event_20220915_cn", "event_20250424_cn",
"event_20260417_cn" "event_20260417_cn"
], ],
"option_cn": [ "option_cn": [
"event_20250424_cn",
"event_20201126_cn", "event_20201126_cn",
"event_20260417_cn" "event_20260417_cn"
], ],
"option_en": [ "option_en": [
"event_20250424_cn",
"event_20201126_cn", "event_20201126_cn",
"event_20260417_cn" "event_20260417_cn"
], ],
"option_jp": [ "option_jp": [
"event_20250424_cn",
"event_20201126_cn", "event_20201126_cn",
"event_20260417_cn" "event_20260417_cn"
], ],
"option_tw": [ "option_tw": [
"event_20220915_cn" "event_20260417_cn"
], ],
"option_bold": [ "option_bold": [
"event_20201126_cn", "event_20201126_cn",
"event_20220915_cn", "event_20250424_cn",
"event_20260417_cn" "event_20260417_cn"
] ]
}, },
@@ -3485,12 +3494,16 @@
"war_archives_20220428_cn", "war_archives_20220428_cn",
"war_archives_20220526_cn", "war_archives_20220526_cn",
"war_archives_20220728_cn", "war_archives_20220728_cn",
"war_archives_20220818_cn",
"war_archives_20220915_cn", "war_archives_20220915_cn",
"war_archives_20221222_cn", "war_archives_20221222_cn",
"war_archives_20230223_cn", "war_archives_20230223_cn",
"war_archives_20230803_cn",
"war_archives_20231026_cn" "war_archives_20231026_cn"
], ],
"option_cn": [ "option_cn": [
"war_archives_20230803_cn",
"war_archives_20220818_cn",
"war_archives_20230223_cn", "war_archives_20230223_cn",
"war_archives_20221222_cn", "war_archives_20221222_cn",
"war_archives_20220915_cn", "war_archives_20220915_cn",
@@ -3537,6 +3550,8 @@
"war_archives_20181020_en" "war_archives_20181020_en"
], ],
"option_en": [ "option_en": [
"war_archives_20230803_cn",
"war_archives_20220818_cn",
"war_archives_20230223_cn", "war_archives_20230223_cn",
"war_archives_20221222_cn", "war_archives_20221222_cn",
"war_archives_20220915_cn", "war_archives_20220915_cn",
@@ -3583,6 +3598,8 @@
"war_archives_20181020_en" "war_archives_20181020_en"
], ],
"option_jp": [ "option_jp": [
"war_archives_20230803_cn",
"war_archives_20220818_cn",
"war_archives_20230223_cn", "war_archives_20230223_cn",
"war_archives_20221222_cn", "war_archives_20221222_cn",
"war_archives_20220915_cn", "war_archives_20220915_cn",
@@ -3629,6 +3646,8 @@
"war_archives_20181020_en" "war_archives_20181020_en"
], ],
"option_tw": [ "option_tw": [
"war_archives_20230803_cn",
"war_archives_20220818_cn",
"war_archives_20230223_cn", "war_archives_20230223_cn",
"war_archives_20221222_cn", "war_archives_20221222_cn",
"war_archives_20220915_cn", "war_archives_20220915_cn",
@@ -4064,27 +4083,30 @@
"value": "campaign_main", "value": "campaign_main",
"option": [ "option": [
"event_20201126_cn", "event_20201126_cn",
"event_20220915_cn", "event_20250424_cn",
"event_20260417_cn" "event_20260417_cn"
], ],
"option_cn": [ "option_cn": [
"event_20250424_cn",
"event_20201126_cn", "event_20201126_cn",
"event_20260417_cn" "event_20260417_cn"
], ],
"option_en": [ "option_en": [
"event_20250424_cn",
"event_20201126_cn", "event_20201126_cn",
"event_20260417_cn" "event_20260417_cn"
], ],
"option_jp": [ "option_jp": [
"event_20250424_cn",
"event_20201126_cn", "event_20201126_cn",
"event_20260417_cn" "event_20260417_cn"
], ],
"option_tw": [ "option_tw": [
"event_20220915_cn" "event_20260417_cn"
], ],
"option_bold": [ "option_bold": [
"event_20201126_cn", "event_20201126_cn",
"event_20220915_cn", "event_20250424_cn",
"event_20260417_cn" "event_20260417_cn"
] ]
}, },
@@ -4483,27 +4505,30 @@
"value": "campaign_main", "value": "campaign_main",
"option": [ "option": [
"event_20201126_cn", "event_20201126_cn",
"event_20220915_cn", "event_20250424_cn",
"event_20260417_cn" "event_20260417_cn"
], ],
"option_cn": [ "option_cn": [
"event_20250424_cn",
"event_20201126_cn", "event_20201126_cn",
"event_20260417_cn" "event_20260417_cn"
], ],
"option_en": [ "option_en": [
"event_20250424_cn",
"event_20201126_cn", "event_20201126_cn",
"event_20260417_cn" "event_20260417_cn"
], ],
"option_jp": [ "option_jp": [
"event_20250424_cn",
"event_20201126_cn", "event_20201126_cn",
"event_20260417_cn" "event_20260417_cn"
], ],
"option_tw": [ "option_tw": [
"event_20220915_cn" "event_20260417_cn"
], ],
"option_bold": [ "option_bold": [
"event_20201126_cn", "event_20201126_cn",
"event_20220915_cn", "event_20250424_cn",
"event_20260417_cn" "event_20260417_cn"
] ]
}, },
@@ -4902,27 +4927,30 @@
"value": "campaign_main", "value": "campaign_main",
"option": [ "option": [
"event_20201126_cn", "event_20201126_cn",
"event_20220915_cn", "event_20250424_cn",
"event_20260417_cn" "event_20260417_cn"
], ],
"option_cn": [ "option_cn": [
"event_20250424_cn",
"event_20201126_cn", "event_20201126_cn",
"event_20260417_cn" "event_20260417_cn"
], ],
"option_en": [ "option_en": [
"event_20250424_cn",
"event_20201126_cn", "event_20201126_cn",
"event_20260417_cn" "event_20260417_cn"
], ],
"option_jp": [ "option_jp": [
"event_20250424_cn",
"event_20201126_cn", "event_20201126_cn",
"event_20260417_cn" "event_20260417_cn"
], ],
"option_tw": [ "option_tw": [
"event_20220915_cn" "event_20260417_cn"
], ],
"option_bold": [ "option_bold": [
"event_20201126_cn", "event_20201126_cn",
"event_20220915_cn", "event_20250424_cn",
"event_20260417_cn" "event_20260417_cn"
] ]
}, },
@@ -5321,27 +5349,30 @@
"value": "campaign_main", "value": "campaign_main",
"option": [ "option": [
"event_20201126_cn", "event_20201126_cn",
"event_20220915_cn", "event_20250424_cn",
"event_20260417_cn" "event_20260417_cn"
], ],
"option_cn": [ "option_cn": [
"event_20250424_cn",
"event_20201126_cn", "event_20201126_cn",
"event_20260417_cn" "event_20260417_cn"
], ],
"option_en": [ "option_en": [
"event_20250424_cn",
"event_20201126_cn", "event_20201126_cn",
"event_20260417_cn" "event_20260417_cn"
], ],
"option_jp": [ "option_jp": [
"event_20250424_cn",
"event_20201126_cn", "event_20201126_cn",
"event_20260417_cn" "event_20260417_cn"
], ],
"option_tw": [ "option_tw": [
"event_20220915_cn" "event_20260417_cn"
], ],
"option_bold": [ "option_bold": [
"event_20201126_cn", "event_20201126_cn",
"event_20220915_cn", "event_20250424_cn",
"event_20260417_cn" "event_20260417_cn"
] ]
}, },
@@ -5730,27 +5761,30 @@
"value": "campaign_main", "value": "campaign_main",
"option": [ "option": [
"event_20201126_cn", "event_20201126_cn",
"event_20220915_cn", "event_20250424_cn",
"event_20260417_cn" "event_20260417_cn"
], ],
"option_cn": [ "option_cn": [
"event_20250424_cn",
"event_20201126_cn", "event_20201126_cn",
"event_20260417_cn" "event_20260417_cn"
], ],
"option_en": [ "option_en": [
"event_20250424_cn",
"event_20201126_cn", "event_20201126_cn",
"event_20260417_cn" "event_20260417_cn"
], ],
"option_jp": [ "option_jp": [
"event_20250424_cn",
"event_20201126_cn", "event_20201126_cn",
"event_20260417_cn" "event_20260417_cn"
], ],
"option_tw": [ "option_tw": [
"event_20220915_cn" "event_20260417_cn"
], ],
"option_bold": [ "option_bold": [
"event_20201126_cn", "event_20201126_cn",
"event_20220915_cn", "event_20250424_cn",
"event_20260417_cn" "event_20260417_cn"
] ]
}, },

View File

@@ -760,7 +760,7 @@
"event_20241121_cn": "Dangerous Inventions Incoming", "event_20241121_cn": "Dangerous Inventions Incoming",
"event_20241219_cn": "Substellar Crepuscule", "event_20241219_cn": "Substellar Crepuscule",
"event_20250227_cn": "Paradiso of Shackled Light", "event_20250227_cn": "Paradiso of Shackled Light",
"event_20250424_cn": "Toward Tulipas Seas", "event_20250424_cn": "Toward Tulipas Seas Rerun",
"event_20250520_cn": "A Rose on the High Tower", "event_20250520_cn": "A Rose on the High Tower",
"event_20250724_cn": "The Alchemist and the Tower of Horizons", "event_20250724_cn": "The Alchemist and the Tower of Horizons",
"event_20250814_cn": "Secrets of the Abyss", "event_20250814_cn": "Secrets of the Abyss",
@@ -821,9 +821,11 @@
"war_archives_20220428_cn": "archives Rondo at Rainbows End", "war_archives_20220428_cn": "archives Rondo at Rainbows End",
"war_archives_20220526_cn": "archives Pledge of the Radiant Court", "war_archives_20220526_cn": "archives Pledge of the Radiant Court",
"war_archives_20220728_cn": "archives Aquilifers Ballade", "war_archives_20220728_cn": "archives Aquilifers Ballade",
"war_archives_20220818_cn": "archives Operation Convergence",
"war_archives_20220915_cn": "archives Violet Tempest Blooming Lycoris", "war_archives_20220915_cn": "archives Violet Tempest Blooming Lycoris",
"war_archives_20221222_cn": "archives Parallel Superimposition", "war_archives_20221222_cn": "archives Parallel Superimposition",
"war_archives_20230223_cn": "archives Revelations of Dust", "war_archives_20230223_cn": "archives Revelations of Dust",
"war_archives_20230803_cn": "archives Anthem of Remembrance",
"war_archives_20231026_cn": "archives Tempesta and the Fountain of Youth" "war_archives_20231026_cn": "archives Tempesta and the Fountain of Youth"
}, },
"Mode": { "Mode": {

View File

@@ -760,7 +760,7 @@
"event_20241121_cn": "危険発明接近中", "event_20241121_cn": "危険発明接近中",
"event_20241219_cn": "星降る夕影の残光", "event_20241219_cn": "星降る夕影の残光",
"event_20250227_cn": "籠檻に囚われし神光", "event_20250227_cn": "籠檻に囚われし神光",
"event_20250424_cn": "チュリッパの海へ", "event_20250424_cn": "チュリッパの海へ(復刻)",
"event_20250520_cn": "高い塔の薔薇", "event_20250520_cn": "高い塔の薔薇",
"event_20250724_cn": "錬金術士と天空邂逅の塔", "event_20250724_cn": "錬金術士と天空邂逅の塔",
"event_20250814_cn": "淵層界の秘密", "event_20250814_cn": "淵層界の秘密",
@@ -821,9 +821,11 @@
"war_archives_20220428_cn": "檔案 吟ずる瑠璃の楽章", "war_archives_20220428_cn": "檔案 吟ずる瑠璃の楽章",
"war_archives_20220526_cn": "檔案 诚閃の剣 搖光の城", "war_archives_20220526_cn": "檔案 诚閃の剣 搖光の城",
"war_archives_20220728_cn": "檔案 鋼鷲の冒険譚", "war_archives_20220728_cn": "檔案 鋼鷲の冒険譚",
"war_archives_20220818_cn": "檔案 結像点作戦",
"war_archives_20220915_cn": "檔案 赫の涙月 菫の暁風", "war_archives_20220915_cn": "檔案 赫の涙月 菫の暁風",
"war_archives_20221222_cn": "檔案 積重なる事象の幻界", "war_archives_20221222_cn": "檔案 積重なる事象の幻界",
"war_archives_20230223_cn": "檔案 黙示の遺構", "war_archives_20230223_cn": "檔案 黙示の遺構",
"war_archives_20230803_cn": "檔案 燃ゆる聖都の回想曲",
"war_archives_20231026_cn": "檔案 テンペスタと若返りの泉" "war_archives_20231026_cn": "檔案 テンペスタと若返りの泉"
}, },
"Mode": { "Mode": {

View File

@@ -551,6 +551,12 @@
"default": "默认 (Cloudflare)", "default": "默认 (Cloudflare)",
"cn_gz_reverse_proxy": "国内反向代理 (广州)" "cn_gz_reverse_proxy": "国内反向代理 (广州)"
}, },
"DailyRecord": {
"name": "每日挑战截图",
"help": "",
"do_not": "无操作",
"save": "保存"
},
"ResearchRecord": { "ResearchRecord": {
"name": "科研截图", "name": "科研截图",
"help": "", "help": "",
@@ -760,7 +766,7 @@
"event_20241121_cn": "危险发明迫近中", "event_20241121_cn": "危险发明迫近中",
"event_20241219_cn": "星光下的余晖", "event_20241219_cn": "星光下的余晖",
"event_20250227_cn": "樊笼内的神光", "event_20250227_cn": "樊笼内的神光",
"event_20250424_cn": "扬起郁金之旗", "event_20250424_cn": "复刻扬起郁金之旗",
"event_20250520_cn": "高塔上的蔷薇", "event_20250520_cn": "高塔上的蔷薇",
"event_20250724_cn": "优米雅的炼金工房", "event_20250724_cn": "优米雅的炼金工房",
"event_20250814_cn": "奇渊下的秘密", "event_20250814_cn": "奇渊下的秘密",
@@ -821,9 +827,11 @@
"war_archives_20220428_cn": "档案 虹彩的终幕曲", "war_archives_20220428_cn": "档案 虹彩的终幕曲",
"war_archives_20220526_cn": "档案 泠誓光庭", "war_archives_20220526_cn": "档案 泠誓光庭",
"war_archives_20220728_cn": "档案 雄鹰的叙事歌", "war_archives_20220728_cn": "档案 雄鹰的叙事歌",
"war_archives_20220818_cn": "档案 远汇点作战",
"war_archives_20220915_cn": "档案 紫绛槿岚", "war_archives_20220915_cn": "档案 紫绛槿岚",
"war_archives_20221222_cn": "档案 定向折叠", "war_archives_20221222_cn": "档案 定向折叠",
"war_archives_20230223_cn": "档案 湮烬尘墟", "war_archives_20230223_cn": "档案 湮烬尘墟",
"war_archives_20230803_cn": "档案 奏响鸢尾之歌",
"war_archives_20231026_cn": "档案 飓风与青春之泉" "war_archives_20231026_cn": "档案 飓风与青春之泉"
}, },
"Mode": { "Mode": {

View File

@@ -769,7 +769,7 @@
"event_20251218_cn": "響徹於天穹之音", "event_20251218_cn": "響徹於天穹之音",
"event_20260226_cn": "春滿客棧Online", "event_20260226_cn": "春滿客棧Online",
"event_20260326_cn": "漫遊者招募計劃", "event_20260326_cn": "漫遊者招募計劃",
"event_20260417_cn": "Vacation Lane Beachside Brilliance", "event_20260417_cn": "假日航線閃耀海濱",
"raid_20200624": "特別演習埃塞克斯級(復刻)", "raid_20200624": "特別演習埃塞克斯級(復刻)",
"raid_20210708": "復刻穿越彼方的水線", "raid_20210708": "復刻穿越彼方的水線",
"raid_20220127": "演習神秘事件調查", "raid_20220127": "演習神秘事件調查",
@@ -821,9 +821,11 @@
"war_archives_20220428_cn": "檔案 虹彩的終幕曲", "war_archives_20220428_cn": "檔案 虹彩的終幕曲",
"war_archives_20220526_cn": "檔案 泠誓光庭", "war_archives_20220526_cn": "檔案 泠誓光庭",
"war_archives_20220728_cn": "檔案 雄鷹的敘事歌", "war_archives_20220728_cn": "檔案 雄鷹的敘事歌",
"war_archives_20220818_cn": "檔案 遠匯點作戰",
"war_archives_20220915_cn": "檔案 紫絳槿嵐", "war_archives_20220915_cn": "檔案 紫絳槿嵐",
"war_archives_20221222_cn": "檔案 定向折疊", "war_archives_20221222_cn": "檔案 定向折疊",
"war_archives_20230223_cn": "檔案 湮燼塵墟", "war_archives_20230223_cn": "檔案 湮燼塵墟",
"war_archives_20230803_cn": "檔案 奏響鳶尾之歌",
"war_archives_20231026_cn": "檔案 飓風與青春之泉" "war_archives_20231026_cn": "檔案 飓風與青春之泉"
}, },
"Mode": { "Mode": {

View File

@@ -8,7 +8,7 @@ ADD_NEW_STUDENT = Button(area={'cn': (417, 375, 438, 398), 'en': (417, 375, 438,
BOOK_EMPTY_POPUP = Button(area={'cn': (880, 180, 908, 209), 'en': (880, 180, 908, 209), 'jp': (880, 180, 908, 209), 'tw': (880, 180, 908, 209)}, color={'cn': (211, 109, 105), 'en': (211, 109, 105), 'jp': (211, 109, 105), 'tw': (211, 109, 105)}, button={'cn': (880, 180, 908, 209), 'en': (880, 180, 908, 209), 'jp': (880, 180, 908, 209), 'tw': (880, 180, 908, 209)}, file={'cn': './assets/cn/tactical/BOOK_EMPTY_POPUP.png', 'en': './assets/en/tactical/BOOK_EMPTY_POPUP.png', 'jp': './assets/jp/tactical/BOOK_EMPTY_POPUP.png', 'tw': './assets/tw/tactical/BOOK_EMPTY_POPUP.png'}) BOOK_EMPTY_POPUP = Button(area={'cn': (880, 180, 908, 209), 'en': (880, 180, 908, 209), 'jp': (880, 180, 908, 209), 'tw': (880, 180, 908, 209)}, color={'cn': (211, 109, 105), 'en': (211, 109, 105), 'jp': (211, 109, 105), 'tw': (211, 109, 105)}, button={'cn': (880, 180, 908, 209), 'en': (880, 180, 908, 209), 'jp': (880, 180, 908, 209), 'tw': (880, 180, 908, 209)}, file={'cn': './assets/cn/tactical/BOOK_EMPTY_POPUP.png', 'en': './assets/en/tactical/BOOK_EMPTY_POPUP.png', 'jp': './assets/jp/tactical/BOOK_EMPTY_POPUP.png', 'tw': './assets/tw/tactical/BOOK_EMPTY_POPUP.png'})
OCR_SKILL_EXP = Button(area={'cn': (771, 191, 951, 209), 'en': (771, 191, 951, 209), 'jp': (728, 189, 950, 211), 'tw': (771, 191, 951, 209)}, color={'cn': (72, 82, 83), 'en': (72, 82, 83), 'jp': (69, 78, 82), 'tw': (72, 82, 83)}, button={'cn': (771, 191, 951, 209), 'en': (771, 191, 951, 209), 'jp': (728, 189, 950, 211), 'tw': (771, 191, 951, 209)}, file={'cn': './assets/cn/tactical/OCR_SKILL_EXP.png', 'en': './assets/en/tactical/OCR_SKILL_EXP.png', 'jp': './assets/jp/tactical/OCR_SKILL_EXP.png', 'tw': './assets/tw/tactical/OCR_SKILL_EXP.png'}) OCR_SKILL_EXP = Button(area={'cn': (771, 191, 951, 209), 'en': (771, 191, 951, 209), 'jp': (728, 189, 950, 211), 'tw': (771, 191, 951, 209)}, color={'cn': (72, 82, 83), 'en': (72, 82, 83), 'jp': (69, 78, 82), 'tw': (72, 82, 83)}, button={'cn': (771, 191, 951, 209), 'en': (771, 191, 951, 209), 'jp': (728, 189, 950, 211), 'tw': (771, 191, 951, 209)}, file={'cn': './assets/cn/tactical/OCR_SKILL_EXP.png', 'en': './assets/en/tactical/OCR_SKILL_EXP.png', 'jp': './assets/jp/tactical/OCR_SKILL_EXP.png', 'tw': './assets/tw/tactical/OCR_SKILL_EXP.png'})
RAPID_TRAINING = Button(area={'cn': (518, 566, 583, 582), 'en': (518, 568, 585, 580), 'jp': (518, 566, 584, 583), 'tw': (518, 566, 583, 582)}, color={'cn': (233, 212, 171), 'en': (229, 205, 156), 'jp': (232, 209, 165), 'tw': (233, 212, 171)}, button={'cn': (518, 566, 583, 582), 'en': (518, 568, 585, 580), 'jp': (518, 566, 584, 583), 'tw': (518, 566, 583, 582)}, file={'cn': './assets/cn/tactical/RAPID_TRAINING.png', 'en': './assets/en/tactical/RAPID_TRAINING.png', 'jp': './assets/jp/tactical/RAPID_TRAINING.png', 'tw': './assets/cn/tactical/RAPID_TRAINING.png'}) RAPID_TRAINING = Button(area={'cn': (518, 566, 583, 582), 'en': (518, 568, 585, 580), 'jp': (518, 566, 584, 583), 'tw': (518, 566, 583, 582)}, color={'cn': (233, 212, 171), 'en': (229, 205, 156), 'jp': (232, 209, 165), 'tw': (233, 212, 171)}, button={'cn': (518, 566, 583, 582), 'en': (518, 568, 585, 580), 'jp': (518, 566, 584, 583), 'tw': (518, 566, 583, 582)}, file={'cn': './assets/cn/tactical/RAPID_TRAINING.png', 'en': './assets/en/tactical/RAPID_TRAINING.png', 'jp': './assets/jp/tactical/RAPID_TRAINING.png', 'tw': './assets/cn/tactical/RAPID_TRAINING.png'})
REWARD_2 = Button(area={'cn': (418, 413, 468, 434), 'en': (403, 416, 504, 432), 'jp': (432, 415, 476, 436), 'tw': (418, 413, 468, 434)}, color={'cn': (240, 191, 120), 'en': (240, 201, 145), 'jp': (240, 191, 121), 'tw': (240, 191, 120)}, button={'cn': (383, 404, 503, 444), 'en': (392, 404, 515, 445), 'jp': (399, 415, 520, 450), 'tw': (383, 404, 503, 444)}, file={'cn': './assets/cn/tactical/REWARD_2.png', 'en': './assets/en/tactical/REWARD_2.png', 'jp': './assets/jp/tactical/REWARD_2.png', 'tw': './assets/tw/tactical/REWARD_2.png'}) REWARD_2 = Button(area={'cn': (418, 413, 468, 434), 'en': (403, 416, 504, 432), 'jp': (432, 415, 476, 436), 'tw': (418, 413, 468, 434)}, color={'cn': (240, 191, 120), 'en': (240, 201, 145), 'jp': (240, 191, 121), 'tw': (240, 191, 120)}, button={'cn': (383, 404, 503, 444), 'en': (392, 404, 515, 445), 'jp': (403, 415, 520, 450), 'tw': (383, 404, 503, 444)}, file={'cn': './assets/cn/tactical/REWARD_2.png', 'en': './assets/en/tactical/REWARD_2.png', 'jp': './assets/jp/tactical/REWARD_2.png', 'tw': './assets/tw/tactical/REWARD_2.png'})
SKILL_CONFIRM = Button(area={'cn': (575, 563, 705, 594), 'en': (600, 558, 681, 581), 'jp': (576, 563, 705, 594), 'tw': (577, 563, 704, 593)}, color={'cn': (147, 177, 216), 'en': (167, 191, 223), 'jp': (136, 170, 213), 'tw': (161, 187, 220)}, button={'cn': (575, 563, 705, 594), 'en': (600, 558, 681, 581), 'jp': (576, 563, 705, 594), 'tw': (577, 563, 704, 593)}, file={'cn': './assets/cn/tactical/SKILL_CONFIRM.png', 'en': './assets/en/tactical/SKILL_CONFIRM.png', 'jp': './assets/jp/tactical/SKILL_CONFIRM.png', 'tw': './assets/tw/tactical/SKILL_CONFIRM.png'}) SKILL_CONFIRM = Button(area={'cn': (575, 563, 705, 594), 'en': (600, 558, 681, 581), 'jp': (576, 563, 705, 594), 'tw': (577, 563, 704, 593)}, color={'cn': (147, 177, 216), 'en': (167, 191, 223), 'jp': (136, 170, 213), 'tw': (161, 187, 220)}, button={'cn': (575, 563, 705, 594), 'en': (600, 558, 681, 581), 'jp': (576, 563, 705, 594), 'tw': (577, 563, 704, 593)}, file={'cn': './assets/cn/tactical/SKILL_CONFIRM.png', 'en': './assets/en/tactical/SKILL_CONFIRM.png', 'jp': './assets/jp/tactical/SKILL_CONFIRM.png', 'tw': './assets/tw/tactical/SKILL_CONFIRM.png'})
TACTICAL_CLASS_CANCEL = Button(area={'cn': (818, 591, 990, 647), 'en': (836, 591, 973, 639), 'jp': (840, 606, 969, 637), 'tw': (819, 590, 989, 647)}, color={'cn': (153, 154, 154), 'en': (163, 164, 164), 'jp': (175, 176, 176), 'tw': (152, 153, 154)}, button={'cn': (818, 591, 990, 647), 'en': (836, 591, 973, 639), 'jp': (840, 606, 969, 637), 'tw': (819, 590, 989, 647)}, file={'cn': './assets/cn/tactical/TACTICAL_CLASS_CANCEL.png', 'en': './assets/en/tactical/TACTICAL_CLASS_CANCEL.png', 'jp': './assets/jp/tactical/TACTICAL_CLASS_CANCEL.png', 'tw': './assets/tw/tactical/TACTICAL_CLASS_CANCEL.png'}) TACTICAL_CLASS_CANCEL = Button(area={'cn': (818, 591, 990, 647), 'en': (836, 591, 973, 639), 'jp': (840, 606, 969, 637), 'tw': (819, 590, 989, 647)}, color={'cn': (153, 154, 154), 'en': (163, 164, 164), 'jp': (175, 176, 176), 'tw': (152, 153, 154)}, button={'cn': (818, 591, 990, 647), 'en': (836, 591, 973, 639), 'jp': (840, 606, 969, 637), 'tw': (819, 590, 989, 647)}, file={'cn': './assets/cn/tactical/TACTICAL_CLASS_CANCEL.png', 'en': './assets/en/tactical/TACTICAL_CLASS_CANCEL.png', 'jp': './assets/jp/tactical/TACTICAL_CLASS_CANCEL.png', 'tw': './assets/tw/tactical/TACTICAL_CLASS_CANCEL.png'})
TACTICAL_CLASS_START = Button(area={'cn': (1024, 590, 1197, 648), 'en': (1045, 592, 1176, 640), 'jp': (1046, 606, 1176, 637), 'tw': (1026, 590, 1196, 647)}, color={'cn': (96, 139, 194), 'en': (95, 137, 190), 'jp': (132, 165, 208), 'tw': (101, 143, 196)}, button={'cn': (1024, 590, 1197, 648), 'en': (1045, 592, 1176, 640), 'jp': (1046, 606, 1176, 637), 'tw': (1026, 590, 1196, 647)}, file={'cn': './assets/cn/tactical/TACTICAL_CLASS_START.png', 'en': './assets/en/tactical/TACTICAL_CLASS_START.png', 'jp': './assets/jp/tactical/TACTICAL_CLASS_START.png', 'tw': './assets/tw/tactical/TACTICAL_CLASS_START.png'}) TACTICAL_CLASS_START = Button(area={'cn': (1024, 590, 1197, 648), 'en': (1045, 592, 1176, 640), 'jp': (1046, 606, 1176, 637), 'tw': (1026, 590, 1196, 647)}, color={'cn': (96, 139, 194), 'en': (95, 137, 190), 'jp': (132, 165, 208), 'tw': (101, 143, 196)}, button={'cn': (1024, 590, 1197, 648), 'en': (1045, 592, 1176, 640), 'jp': (1046, 606, 1176, 637), 'tw': (1026, 590, 1196, 647)}, file={'cn': './assets/cn/tactical/TACTICAL_CLASS_START.png', 'en': './assets/en/tactical/TACTICAL_CLASS_START.png', 'jp': './assets/jp/tactical/TACTICAL_CLASS_START.png', 'tw': './assets/tw/tactical/TACTICAL_CLASS_START.png'})

View File

@@ -6,6 +6,7 @@ from module.base.template import Template
OCR_DATA_KEY_CAMPAIGN = Button(area={'cn': (1188, 107, 1272, 131), 'en': (1188, 107, 1272, 131), 'jp': (1188, 107, 1272, 131), 'tw': (1188, 107, 1272, 131)}, color={'cn': (104, 101, 107), 'en': (104, 101, 107), 'jp': (104, 101, 107), 'tw': (104, 101, 107)}, button={'cn': (1188, 107, 1272, 131), 'en': (1188, 107, 1272, 131), 'jp': (1188, 107, 1272, 131), 'tw': (1188, 107, 1272, 131)}, file={'cn': './assets/cn/war_archives/OCR_DATA_KEY_CAMPAIGN.png', 'en': './assets/en/war_archives/OCR_DATA_KEY_CAMPAIGN.png', 'jp': './assets/jp/war_archives/OCR_DATA_KEY_CAMPAIGN.png', 'tw': './assets/tw/war_archives/OCR_DATA_KEY_CAMPAIGN.png'}) OCR_DATA_KEY_CAMPAIGN = Button(area={'cn': (1188, 107, 1272, 131), 'en': (1188, 107, 1272, 131), 'jp': (1188, 107, 1272, 131), 'tw': (1188, 107, 1272, 131)}, color={'cn': (104, 101, 107), 'en': (104, 101, 107), 'jp': (104, 101, 107), 'tw': (104, 101, 107)}, button={'cn': (1188, 107, 1272, 131), 'en': (1188, 107, 1272, 131), 'jp': (1188, 107, 1272, 131), 'tw': (1188, 107, 1272, 131)}, file={'cn': './assets/cn/war_archives/OCR_DATA_KEY_CAMPAIGN.png', 'en': './assets/en/war_archives/OCR_DATA_KEY_CAMPAIGN.png', 'jp': './assets/jp/war_archives/OCR_DATA_KEY_CAMPAIGN.png', 'tw': './assets/tw/war_archives/OCR_DATA_KEY_CAMPAIGN.png'})
TEMPLATE_ABYSSAL_REFRAIN = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_ABYSSAL_REFRAIN.png', 'en': './assets/cn/war_archives/TEMPLATE_ABYSSAL_REFRAIN.png', 'jp': './assets/cn/war_archives/TEMPLATE_ABYSSAL_REFRAIN.png', 'tw': './assets/cn/war_archives/TEMPLATE_ABYSSAL_REFRAIN.png'}) TEMPLATE_ABYSSAL_REFRAIN = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_ABYSSAL_REFRAIN.png', 'en': './assets/cn/war_archives/TEMPLATE_ABYSSAL_REFRAIN.png', 'jp': './assets/cn/war_archives/TEMPLATE_ABYSSAL_REFRAIN.png', 'tw': './assets/cn/war_archives/TEMPLATE_ABYSSAL_REFRAIN.png'})
TEMPLATE_ANTHEM_OF_REMEMBRANCE = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_ANTHEM_OF_REMEMBRANCE.png', 'en': './assets/cn/war_archives/TEMPLATE_ANTHEM_OF_REMEMBRANCE.png', 'jp': './assets/cn/war_archives/TEMPLATE_ANTHEM_OF_REMEMBRANCE.png', 'tw': './assets/cn/war_archives/TEMPLATE_ANTHEM_OF_REMEMBRANCE.png'})
TEMPLATE_AQUILIFERS_BALLADE = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_AQUILIFERS_BALLADE.png', 'en': './assets/cn/war_archives/TEMPLATE_AQUILIFERS_BALLADE.png', 'jp': './assets/cn/war_archives/TEMPLATE_AQUILIFERS_BALLADE.png', 'tw': './assets/cn/war_archives/TEMPLATE_AQUILIFERS_BALLADE.png'}) TEMPLATE_AQUILIFERS_BALLADE = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_AQUILIFERS_BALLADE.png', 'en': './assets/cn/war_archives/TEMPLATE_AQUILIFERS_BALLADE.png', 'jp': './assets/cn/war_archives/TEMPLATE_AQUILIFERS_BALLADE.png', 'tw': './assets/cn/war_archives/TEMPLATE_AQUILIFERS_BALLADE.png'})
TEMPLATE_ASHEN_SIMULACRUM = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_ASHEN_SIMULACRUM.png', 'en': './assets/en/war_archives/TEMPLATE_ASHEN_SIMULACRUM.png', 'jp': './assets/cn/war_archives/TEMPLATE_ASHEN_SIMULACRUM.png', 'tw': './assets/cn/war_archives/TEMPLATE_ASHEN_SIMULACRUM.png'}) TEMPLATE_ASHEN_SIMULACRUM = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_ASHEN_SIMULACRUM.png', 'en': './assets/en/war_archives/TEMPLATE_ASHEN_SIMULACRUM.png', 'jp': './assets/cn/war_archives/TEMPLATE_ASHEN_SIMULACRUM.png', 'tw': './assets/cn/war_archives/TEMPLATE_ASHEN_SIMULACRUM.png'})
TEMPLATE_AURORA_NOCTIS = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_AURORA_NOCTIS.png', 'en': './assets/en/war_archives/TEMPLATE_AURORA_NOCTIS.png', 'jp': './assets/cn/war_archives/TEMPLATE_AURORA_NOCTIS.png', 'tw': './assets/cn/war_archives/TEMPLATE_AURORA_NOCTIS.png'}) TEMPLATE_AURORA_NOCTIS = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_AURORA_NOCTIS.png', 'en': './assets/en/war_archives/TEMPLATE_AURORA_NOCTIS.png', 'jp': './assets/cn/war_archives/TEMPLATE_AURORA_NOCTIS.png', 'tw': './assets/cn/war_archives/TEMPLATE_AURORA_NOCTIS.png'})
@@ -27,6 +28,7 @@ TEMPLATE_MICROLAYER_MEDLEY = Template(file={'cn': './assets/cn/war_archives/TEMP
TEMPLATE_MIRROR_INVOLUTION = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_MIRROR_INVOLUTION.png', 'en': './assets/cn/war_archives/TEMPLATE_MIRROR_INVOLUTION.png', 'jp': './assets/cn/war_archives/TEMPLATE_MIRROR_INVOLUTION.png', 'tw': './assets/cn/war_archives/TEMPLATE_MIRROR_INVOLUTION.png'}) TEMPLATE_MIRROR_INVOLUTION = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_MIRROR_INVOLUTION.png', 'en': './assets/cn/war_archives/TEMPLATE_MIRROR_INVOLUTION.png', 'jp': './assets/cn/war_archives/TEMPLATE_MIRROR_INVOLUTION.png', 'tw': './assets/cn/war_archives/TEMPLATE_MIRROR_INVOLUTION.png'})
TEMPLATE_MOONLIT_OVERTURE = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_MOONLIT_OVERTURE.png', 'en': './assets/cn/war_archives/TEMPLATE_MOONLIT_OVERTURE.png', 'jp': './assets/cn/war_archives/TEMPLATE_MOONLIT_OVERTURE.png', 'tw': './assets/cn/war_archives/TEMPLATE_MOONLIT_OVERTURE.png'}) TEMPLATE_MOONLIT_OVERTURE = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_MOONLIT_OVERTURE.png', 'en': './assets/cn/war_archives/TEMPLATE_MOONLIT_OVERTURE.png', 'jp': './assets/cn/war_archives/TEMPLATE_MOONLIT_OVERTURE.png', 'tw': './assets/cn/war_archives/TEMPLATE_MOONLIT_OVERTURE.png'})
TEMPLATE_NORTHERN_OVERTURE = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_NORTHERN_OVERTURE.png', 'en': './assets/en/war_archives/TEMPLATE_NORTHERN_OVERTURE.png', 'jp': './assets/cn/war_archives/TEMPLATE_NORTHERN_OVERTURE.png', 'tw': './assets/cn/war_archives/TEMPLATE_NORTHERN_OVERTURE.png'}) TEMPLATE_NORTHERN_OVERTURE = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_NORTHERN_OVERTURE.png', 'en': './assets/en/war_archives/TEMPLATE_NORTHERN_OVERTURE.png', 'jp': './assets/cn/war_archives/TEMPLATE_NORTHERN_OVERTURE.png', 'tw': './assets/cn/war_archives/TEMPLATE_NORTHERN_OVERTURE.png'})
TEMPLATE_OPERATION_CONVERGENCE = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_OPERATION_CONVERGENCE.png', 'en': './assets/cn/war_archives/TEMPLATE_OPERATION_CONVERGENCE.png', 'jp': './assets/cn/war_archives/TEMPLATE_OPERATION_CONVERGENCE.png', 'tw': './assets/cn/war_archives/TEMPLATE_OPERATION_CONVERGENCE.png'})
TEMPLATE_PARALLEL_SUPERIMPOSITION = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_PARALLEL_SUPERIMPOSITION.png', 'en': './assets/cn/war_archives/TEMPLATE_PARALLEL_SUPERIMPOSITION.png', 'jp': './assets/cn/war_archives/TEMPLATE_PARALLEL_SUPERIMPOSITION.png', 'tw': './assets/cn/war_archives/TEMPLATE_PARALLEL_SUPERIMPOSITION.png'}) TEMPLATE_PARALLEL_SUPERIMPOSITION = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_PARALLEL_SUPERIMPOSITION.png', 'en': './assets/cn/war_archives/TEMPLATE_PARALLEL_SUPERIMPOSITION.png', 'jp': './assets/cn/war_archives/TEMPLATE_PARALLEL_SUPERIMPOSITION.png', 'tw': './assets/cn/war_archives/TEMPLATE_PARALLEL_SUPERIMPOSITION.png'})
TEMPLATE_PLEDGE_OF_THE_RADIANT_COURT = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_PLEDGE_OF_THE_RADIANT_COURT.png', 'en': './assets/cn/war_archives/TEMPLATE_PLEDGE_OF_THE_RADIANT_COURT.png', 'jp': './assets/cn/war_archives/TEMPLATE_PLEDGE_OF_THE_RADIANT_COURT.png', 'tw': './assets/cn/war_archives/TEMPLATE_PLEDGE_OF_THE_RADIANT_COURT.png'}) TEMPLATE_PLEDGE_OF_THE_RADIANT_COURT = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_PLEDGE_OF_THE_RADIANT_COURT.png', 'en': './assets/cn/war_archives/TEMPLATE_PLEDGE_OF_THE_RADIANT_COURT.png', 'jp': './assets/cn/war_archives/TEMPLATE_PLEDGE_OF_THE_RADIANT_COURT.png', 'tw': './assets/cn/war_archives/TEMPLATE_PLEDGE_OF_THE_RADIANT_COURT.png'})
TEMPLATE_PRELUDE_UNDER_THE_MOON = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_PRELUDE_UNDER_THE_MOON.png', 'en': './assets/cn/war_archives/TEMPLATE_PRELUDE_UNDER_THE_MOON.png', 'jp': './assets/cn/war_archives/TEMPLATE_PRELUDE_UNDER_THE_MOON.png', 'tw': './assets/cn/war_archives/TEMPLATE_PRELUDE_UNDER_THE_MOON.png'}) TEMPLATE_PRELUDE_UNDER_THE_MOON = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_PRELUDE_UNDER_THE_MOON.png', 'en': './assets/cn/war_archives/TEMPLATE_PRELUDE_UNDER_THE_MOON.png', 'jp': './assets/cn/war_archives/TEMPLATE_PRELUDE_UNDER_THE_MOON.png', 'tw': './assets/cn/war_archives/TEMPLATE_PRELUDE_UNDER_THE_MOON.png'})

View File

@@ -45,4 +45,6 @@ dic_archives_template = {
'war_archives_20220915_cn': TEMPLATE_VIOLET_TEMPEST_BLOOMING_LYCORIS, 'war_archives_20220915_cn': TEMPLATE_VIOLET_TEMPEST_BLOOMING_LYCORIS,
'war_archives_20221222_cn': TEMPLATE_PARALLEL_SUPERIMPOSITION, 'war_archives_20221222_cn': TEMPLATE_PARALLEL_SUPERIMPOSITION,
'war_archives_20230223_cn': TEMPLATE_REVELATIONS_OF_DUST, 'war_archives_20230223_cn': TEMPLATE_REVELATIONS_OF_DUST,
'war_archives_20220818_cn': TEMPLATE_OPERATION_CONVERGENCE,
'war_archives_20230803_cn': TEMPLATE_ANTHEM_OF_REMEMBRANCE,
} }