Merge pull request #3935 from LmeSzinc/dev

Add: Event Welcome to Little Academy (coalition_20240627)
This commit is contained in:
LmeSzinc 2024-06-28 03:04:20 +08:00 committed by GitHub
commit 58bfbe011d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
87 changed files with 661 additions and 199 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

View File

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

View File

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

View File

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

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: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

View File

@ -197,4 +197,6 @@ To add a new event, add a new row in here, and run `python -m module.config.conf
| 20240521 | event 20240521 cn | Light of the Martyrium | 绽放于辉光之城 | Light of the Martyrium | 赫輝のマルティリウム | - | | 20240521 | event 20240521 cn | Light of the Martyrium | 绽放于辉光之城 | Light of the Martyrium | 赫輝のマルティリウム | - |
| 20240523 | event 20230525 cn | Confluence of Nothingness | - | - | - | 空相交會點 | | 20240523 | event 20230525 cn | Confluence of Nothingness | - | - | - | 空相交會點 |
| 20240613 | event 20201012 cn | Sundered Blue | - | - | - | 復刻劃破海空之翼 | | 20240613 | event 20201012 cn | Sundered Blue | - | - | - | 復刻劃破海空之翼 |
| 20240620 | event 20220428 cn | Rondo at Rainbow's End Rerun | 复刻虹彩的终幕曲 | Rondo at Rainbow's End Rerun | 吟ずる瑠璃の楽章(復刻) | - | | 20240620 | event 20220428 cn | Rondo at Rainbow's End Rerun | 复刻虹彩的终幕曲 | Rondo at Rainbow's End Rerun | 吟ずる瑠璃の楽章(復刻) | - |
| 20240627 | event 20231026 cn | Tempesta and the Fountain of Youth | - | - | - | 飓風與青春之泉 |
| 20240627 | coalition 20240627 | Welcome to Little Academy | 欢迎来到童心学院 | Welcome to Little Academy | リトル学園へようこそ | - |

View File

@ -568,7 +568,7 @@
"ServerUpdate": "00:00" "ServerUpdate": "00:00"
}, },
"Campaign": { "Campaign": {
"Name": "TC-3", "Name": "dynamic",
"Event": "campaign_main", "Event": "campaign_main",
"Mode": "normal", "Mode": "normal",
"UseClearMode": true, "UseClearMode": true,
@ -578,6 +578,7 @@
"AmbushEvade": true "AmbushEvade": true
}, },
"Coalition": { "Coalition": {
"Mode": "hard",
"Fleet": "single" "Fleet": "single"
}, },
"StopCondition": { "StopCondition": {
@ -1148,6 +1149,7 @@
"AmbushEvade": true "AmbushEvade": true
}, },
"Coalition": { "Coalition": {
"Mode": "hard",
"Fleet": "single" "Fleet": "single"
}, },
"StopCondition": { "StopCondition": {

View File

@ -86,3 +86,14 @@ class AdbManager(DeployConfig):
initer._device.shell(["rm", "/data/local/tmp/minicap"]) initer._device.shell(["rm", "/data/local/tmp/minicap"])
initer._device.shell(["rm", "/data/local/tmp/minicap.so"]) initer._device.shell(["rm", "/data/local/tmp/minicap.so"])
if __name__ == '__main__':
import psutil
for c in psutil.net_connections():
# print(type(c.laddr), c.laddr, type(c.raddr), c.raddr)
try:
if c.laddr.port == 5038 or c.raddr.port == 5038:
print(c.status, c.pid)
except AttributeError:
continue

View File

@ -219,7 +219,7 @@ class AssetExtractor:
modules = [m for m in os.listdir(AzurLaneConfig.ASSETS_FOLDER + '/cn') modules = [m for m in os.listdir(AzurLaneConfig.ASSETS_FOLDER + '/cn')
if os.path.isdir(os.path.join(AzurLaneConfig.ASSETS_FOLDER + '/cn', m))] if os.path.isdir(os.path.join(AzurLaneConfig.ASSETS_FOLDER + '/cn', m))]
process_map(worker, modules) process_map(worker, modules, max_workers=2)
if __name__ == '__main__': if __name__ == '__main__':

View File

@ -38,7 +38,7 @@ class Config:
MAP_SWIPE_MULTIPLY_MINITOUCH = (1.276, 0.974) MAP_SWIPE_MULTIPLY_MINITOUCH = (1.276, 0.974)
cfg = AzurLaneConfig('alas', task='Alas').merge(Config()) cfg = AzurLaneConfig('alas5', task='Alas').merge(Config())
cfg.DETECTION_BACKEND = 'perspective' cfg.DETECTION_BACKEND = 'perspective'
az = CampaignBase(cfg) az = CampaignBase(cfg)
az.map = MAP az.map = MAP
@ -165,4 +165,4 @@ if __name__ == '__main__':
-- -- -- -- -- -- -- -- -- -- -- --
After run, Result is ready to copy. After run, Result is ready to copy.
""" """
sim = SwipeSimulate((420, 0)).run() sim = SwipeSimulate((380, 0)).run()

View File

@ -1,6 +1,5 @@
import shutil import shutil
import numpy as np
from tqdm import tqdm from tqdm import tqdm
import module.config.server as server import module.config.server as server
@ -8,8 +7,8 @@ import module.config.server as server
server.server = 'cn' # Edit your server here. server.server = 'cn' # Edit your server here.
from module.logger import logger from module.logger import logger
from module.statistics.battle_status import BattleStatusStatistics from module.statistics.image.battle_status import BattleStatusStatistics
from module.statistics.get_items import GetItemsStatistics from module.statistics.image.get_items import GetItemsStatistics
from module.statistics.utils import * from module.statistics.utils import *
STATUS_ITEMS_INTERVAL = 10 STATUS_ITEMS_INTERVAL = 10

View File

@ -304,15 +304,15 @@ class MapData:
# portal # portal
self.portal = [] self.portal = []
if self.map_id in MAP_EVENT_LIST: # if self.map_id in MAP_EVENT_LIST:
for event_id in MAP_EVENT_LIST[self.map_id]['event_list'].values(): # for event_id in MAP_EVENT_LIST[self.map_id]['event_list'].values():
event = MAP_EVENT_TEMPLATE[event_id] # event = MAP_EVENT_TEMPLATE[event_id]
for effect in event['effect'].values(): # for effect in event['effect'].values():
if effect[0] == 'jump': # if effect[0] == 'jump':
address = event['address'] # address = event['address']
address = location2node((address[1], address[0])) # address = location2node((address[1], address[0]))
target = location2node((effect[2], effect[1])) # target = location2node((effect[2], effect[1]))
self.portal.append((address, target)) # self.portal.append((address, target))
# land_based # land_based
# land_based = {{6, 7, 1}, ...} # land_based = {{6, 7, 1}, ...}
@ -676,8 +676,8 @@ Arguments:
adapted for war_archives usage adapted for war_archives usage
""" """
FILE = '../AzurLaneLuaScripts' FILE = '../AzurLaneLuaScripts'
FOLDER = './campaign/test' FOLDER = './campaign/event_20240521_cn'
KEYWORD = '' KEYWORD = '1810001'
SELECT = True SELECT = True
OVERWRITE = True OVERWRITE = True
IS_WAR_ARCHIVES = False IS_WAR_ARCHIVES = False
@ -686,8 +686,8 @@ ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C'
LOADER = LuaLoader(FILE, server='CN') LOADER = LuaLoader(FILE, server='CN')
DATA = LOADER.load('./sharecfgdata/chapter_template.lua') DATA = LOADER.load('./sharecfgdata/chapter_template.lua')
DATA_LOOP = LOADER.load('./sharecfgdata/chapter_template_loop.lua') DATA_LOOP = LOADER.load('./sharecfgdata/chapter_template_loop.lua')
MAP_EVENT_LIST = LOADER.load('./sharecfg/map_event_list.lua') # MAP_EVENT_LIST = LOADER.load('./sharecfg/map_event_list.lua')
MAP_EVENT_TEMPLATE = LOADER.load('./sharecfg/map_event_template.lua') # MAP_EVENT_TEMPLATE = LOADER.load('./sharecfg/map_event_template.lua')
EXPECTATION_DATA = LOADER.load('./sharecfgdata/expedition_data_template.lua') EXPECTATION_DATA = LOADER.load('./sharecfgdata/expedition_data_template.lua')
ct = ChapterTemplate() ct = ChapterTemplate()

View File

@ -126,7 +126,7 @@ Arguments:
FILE: Path to repository, such as 'xxx/AzurLaneLuaScripts' FILE: Path to repository, such as 'xxx/AzurLaneLuaScripts'
SAVE: File to save, 'module/os/map_data.py' SAVE: File to save, 'module/os/map_data.py'
""" """
FOLDER = '' FOLDER = r'E:\ProgramData\Pycharm\AzurLaneLuaScripts'
SAVE = 'module/os/map_data.py' SAVE = 'module/os/map_data.py'
LOADER = LuaLoader(FOLDER) LOADER = LuaLoader(FOLDER)

View File

@ -15,15 +15,28 @@ class Config:
""" """
Paste the config of map file here Paste the config of map file here
""" """
pass INTERNAL_LINES_FIND_PEAKS_PARAMETERS = {
'height': (80, 255 - 17),
'width': (0.9, 10),
'prominence': 10,
'distance': 35,
}
EDGE_LINES_FIND_PEAKS_PARAMETERS = {
'height': (255 - 17, 255),
'prominence': 10,
'distance': 50,
'wlen': 1000
}
HOMO_EDGE_COLOR_RANGE = (0, 17)
HOMO_EDGE_HOUGHLINES_THRESHOLD = 210
from module.os.config import OSConfig from module.os.config import OSConfig
cfg = AzurLaneConfig('alas').merge(OSConfig()) cfg = AzurLaneConfig('alas5').merge(Config())
# Folder to save temp images # Folder to save temp images
folder = './screenshots/relative_crop' folder = './screenshots/relative_crop'
# Put Screenshot here # Put Screenshot here
file = '' file = r'E:\ProgramData\Pycharm\StarRailCopilot\screenshots\dev_screenshots\2023-12-22_00-41-21-728648.png'
i = load_image(file) i = load_image(file)
grids = View(cfg) grids = View(cfg)
@ -36,7 +49,7 @@ os.makedirs(folder, exist_ok=True)
for grid in grids: for grid in grids:
# Find more relative_crop area in module/map/grid_predictor.py # Find more relative_crop area in module/map/grid_predictor.py
# This one is for `predict_enemy_genre` # This one is for `predict_enemy_genre`
piece = rgb2gray(grid.relative_crop((-0.5, -1, 0.5, 0), shape=(60, 60))) piece = rgb2gray(grid.relative_crop((-0, -0.2, 0.8, 0.2), shape=(40, 20)))
file = '%s_%s_%s.png' % (int(time.time()), grid.location[0], grid.location[1]) file = '%s_%s_%s.png' % (int(time.time()), grid.location[0], grid.location[1])
file = os.path.join(folder, file) file = os.path.join(folder, file)

View File

@ -17,7 +17,19 @@ class Config:
""" """
Paste the config of map file here Paste the config of map file here
""" """
pass INTERNAL_LINES_FIND_PEAKS_PARAMETERS = {
'height': (80, 255 - 17),
'width': (0.9, 10),
'prominence': 10,
'distance': 35,
}
EDGE_LINES_FIND_PEAKS_PARAMETERS = {
'height': (255 - 17, 255),
'prominence': 10,
'distance': 50,
'wlen': 1000
}
HOMO_EDGE_COLOR_RANGE = (0, 17)
""" """
@ -41,10 +53,11 @@ Arguments:
NAME: Siren name, images will save in <FOLDER>/<NAME> NAME: Siren name, images will save in <FOLDER>/<NAME>
NODE: Node in local map view, that you are going to crop. NODE: Node in local map view, that you are going to crop.
""" """
CONFIG = 'alas' CONFIG = 'alas5'
FOLDER = '' FOLDER = r'E:\ProgramData\Pycharm\Azurlane-image\screenshot\record'
NAME = 'Deutschland' NAME = 'huiguangzhihe'
NODE = 'D5' NODE = 'E5'
if __name__ == '__main__': if __name__ == '__main__':
for folder in [FOLDER, os.path.join(FOLDER, NAME)]: for folder in [FOLDER, os.path.join(FOLDER, NAME)]:

View File

@ -27,7 +27,7 @@ Arguments:
""" """
# FOLDER = '' # FOLDER = ''
# NAME = 'Deutschland' # NAME = 'Deutschland'
AREA = (32, 32, 54, 52) AREA = (25, 16, 37, 34)
THRESHOLD = 0.92 THRESHOLD = 0.92
if __name__ == '__main__': if __name__ == '__main__':

View File

@ -137,7 +137,7 @@ Arguments:
FILE: Path to AzurLaneData, '<your_folder>/AzurLaneData' FILE: Path to AzurLaneData, '<your_folder>/AzurLaneData'
SAVE: File to save, 'module/research/project_data.py' SAVE: File to save, 'module/research/project_data.py'
""" """
FOLDER = '' FOLDER = r'E:\ProgramData\Pycharm\AzurLaneLuaScripts'
SAVE = 'module/research/project_data.py' SAVE = 'module/research/project_data.py'
TechnologyTemplate().write(SAVE) TechnologyTemplate().write(SAVE)

View File

@ -20,7 +20,7 @@ class LuaLoader:
] ]
def __init__(self, folder, server='zh-CN'): def __init__(self, folder, server='zh-CN'):
self.folder = folder self.folder = os.path.abspath(folder)
self._server = '' self._server = ''
self.server = server self.server = server

View File

@ -4,16 +4,32 @@ from module.base.template import Template
# This file was automatically generated by dev_tools/button_extract.py. # This file was automatically generated by dev_tools/button_extract.py.
# Don't modify it manually. # Don't modify it manually.
ACADEMY_EASY = Button(area={'cn': (201, 290, 243, 311), 'en': (186, 294, 229, 311), 'jp': (201, 290, 243, 311), 'tw': (201, 290, 243, 311)}, color={'cn': (172, 141, 121), 'en': (178, 153, 137), 'jp': (172, 141, 121), 'tw': (172, 141, 121)}, button={'cn': (201, 290, 243, 311), 'en': (186, 294, 229, 311), 'jp': (201, 290, 243, 311), 'tw': (201, 290, 243, 311)}, file={'cn': './assets/cn/coalition/ACADEMY_EASY.png', 'en': './assets/en/coalition/ACADEMY_EASY.png', 'jp': './assets/cn/coalition/ACADEMY_EASY.png', 'tw': './assets/cn/coalition/ACADEMY_EASY.png'})
ACADEMY_EX = Button(area={'cn': (712, 178, 744, 196), 'en': (681, 179, 705, 193), 'jp': (712, 178, 744, 196), 'tw': (712, 178, 744, 196)}, color={'cn': (151, 200, 191), 'en': (177, 210, 200), 'jp': (151, 200, 191), 'tw': (151, 200, 191)}, button={'cn': (712, 178, 744, 196), 'en': (681, 179, 705, 193), 'jp': (712, 178, 744, 196), 'tw': (712, 178, 744, 196)}, file={'cn': './assets/cn/coalition/ACADEMY_EX.png', 'en': './assets/en/coalition/ACADEMY_EX.png', 'jp': './assets/cn/coalition/ACADEMY_EX.png', 'tw': './assets/cn/coalition/ACADEMY_EX.png'})
ACADEMY_HARD = Button(area={'cn': (956, 503, 1000, 524), 'en': (947, 506, 992, 520), 'jp': (956, 503, 1000, 524), 'tw': (956, 503, 1000, 524)}, color={'cn': (169, 137, 118), 'en': (168, 136, 117), 'jp': (169, 137, 118), 'tw': (169, 137, 118)}, button={'cn': (956, 503, 1000, 524), 'en': (947, 506, 992, 520), 'jp': (956, 503, 1000, 524), 'tw': (956, 503, 1000, 524)}, file={'cn': './assets/cn/coalition/ACADEMY_HARD.png', 'en': './assets/en/coalition/ACADEMY_HARD.png', 'jp': './assets/cn/coalition/ACADEMY_HARD.png', 'tw': './assets/cn/coalition/ACADEMY_HARD.png'})
ACADEMY_MODE_BATTLE = Button(area={'cn': (105, 654, 182, 675), 'en': (99, 656, 165, 672), 'jp': (105, 654, 182, 675), 'tw': (105, 654, 182, 675)}, color={'cn': (207, 169, 129), 'en': (207, 172, 137), 'jp': (207, 169, 129), 'tw': (207, 169, 129)}, button={'cn': (105, 654, 182, 675), 'en': (99, 656, 165, 672), 'jp': (105, 654, 182, 675), 'tw': (105, 654, 182, 675)}, file={'cn': './assets/cn/coalition/ACADEMY_MODE_BATTLE.png', 'en': './assets/en/coalition/ACADEMY_MODE_BATTLE.png', 'jp': './assets/cn/coalition/ACADEMY_MODE_BATTLE.png', 'tw': './assets/cn/coalition/ACADEMY_MODE_BATTLE.png'})
ACADEMY_MODE_STORY = Button(area={'cn': (224, 654, 302, 675), 'en': (238, 655, 288, 673), 'jp': (224, 654, 302, 675), 'tw': (224, 654, 302, 675)}, color={'cn': (210, 175, 139), 'en': (212, 175, 129), 'jp': (210, 175, 139), 'tw': (210, 175, 139)}, button={'cn': (224, 654, 302, 675), 'en': (238, 655, 288, 673), 'jp': (224, 654, 302, 675), 'tw': (224, 654, 302, 675)}, file={'cn': './assets/cn/coalition/ACADEMY_MODE_STORY.png', 'en': './assets/en/coalition/ACADEMY_MODE_STORY.png', 'jp': './assets/cn/coalition/ACADEMY_MODE_STORY.png', 'tw': './assets/cn/coalition/ACADEMY_MODE_STORY.png'})
ACADEMY_NORMAL = Button(area={'cn': (604, 411, 646, 433), 'en': (568, 416, 638, 430), 'jp': (604, 411, 646, 433), 'tw': (604, 411, 646, 433)}, color={'cn': (169, 137, 118), 'en': (168, 138, 120), 'jp': (169, 137, 118), 'tw': (169, 137, 118)}, button={'cn': (604, 411, 646, 433), 'en': (568, 416, 638, 430), 'jp': (604, 411, 646, 433), 'tw': (604, 411, 646, 433)}, file={'cn': './assets/cn/coalition/ACADEMY_NORMAL.png', 'en': './assets/en/coalition/ACADEMY_NORMAL.png', 'jp': './assets/cn/coalition/ACADEMY_NORMAL.png', 'tw': './assets/cn/coalition/ACADEMY_NORMAL.png'})
ACADEMY_PT_OCR = Button(area={'cn': (1125, 208, 1265, 225), 'en': (1125, 208, 1265, 225), 'jp': (1125, 208, 1265, 225), 'tw': (1125, 208, 1265, 225)}, color={'cn': (124, 105, 88), 'en': (124, 105, 88), 'jp': (124, 105, 88), 'tw': (124, 105, 88)}, button={'cn': (1125, 208, 1265, 225), 'en': (1125, 208, 1265, 225), 'jp': (1125, 208, 1265, 225), 'tw': (1125, 208, 1265, 225)}, file={'cn': './assets/cn/coalition/ACADEMY_PT_OCR.png', 'en': './assets/en/coalition/ACADEMY_PT_OCR.png', 'jp': './assets/jp/coalition/ACADEMY_PT_OCR.png', 'tw': './assets/tw/coalition/ACADEMY_PT_OCR.png'})
ACADEMY_SP = Button(area={'cn': (333, 580, 362, 597), 'en': (339, 582, 363, 596), 'jp': (333, 580, 362, 597), 'tw': (333, 580, 362, 597)}, color={'cn': (176, 146, 126), 'en': (164, 131, 113), 'jp': (176, 146, 126), 'tw': (176, 146, 126)}, button={'cn': (333, 580, 362, 597), 'en': (339, 582, 363, 596), 'jp': (333, 580, 362, 597), 'tw': (333, 580, 362, 597)}, file={'cn': './assets/cn/coalition/ACADEMY_SP.png', 'en': './assets/en/coalition/ACADEMY_SP.png', 'jp': './assets/cn/coalition/ACADEMY_SP.png', 'tw': './assets/cn/coalition/ACADEMY_SP.png'})
ACADEMY_SWITCH_MULTI = Button(area={'cn': (1088, 458, 1216, 486), 'en': (1089, 458, 1215, 486), 'jp': (1088, 458, 1216, 486), 'tw': (1088, 458, 1216, 486)}, color={'cn': (234, 184, 61), 'en': (200, 156, 54), 'jp': (234, 184, 61), 'tw': (234, 184, 61)}, button={'cn': (1088, 458, 1216, 486), 'en': (1089, 458, 1215, 486), 'jp': (1088, 458, 1216, 486), 'tw': (1088, 458, 1216, 486)}, file={'cn': './assets/cn/coalition/ACADEMY_SWITCH_MULTI.png', 'en': './assets/en/coalition/ACADEMY_SWITCH_MULTI.png', 'jp': './assets/cn/coalition/ACADEMY_SWITCH_MULTI.png', 'tw': './assets/cn/coalition/ACADEMY_SWITCH_MULTI.png'})
ACADEMY_SWITCH_SINGLE = Button(area={'cn': (941, 458, 1070, 486), 'en': (941, 458, 1070, 486), 'jp': (941, 458, 1070, 486), 'tw': (941, 458, 1070, 486)}, color={'cn': (232, 182, 60), 'en': (202, 158, 54), 'jp': (232, 182, 60), 'tw': (232, 182, 60)}, button={'cn': (941, 458, 1070, 486), 'en': (941, 458, 1070, 486), 'jp': (941, 458, 1070, 486), 'tw': (941, 458, 1070, 486)}, file={'cn': './assets/cn/coalition/ACADEMY_SWITCH_SINGLE.png', 'en': './assets/en/coalition/ACADEMY_SWITCH_SINGLE.png', 'jp': './assets/cn/coalition/ACADEMY_SWITCH_SINGLE.png', 'tw': './assets/cn/coalition/ACADEMY_SWITCH_SINGLE.png'})
ACEDEMY_FLEET_PREPARATION = Button(area={'cn': (1025, 537, 1132, 562), 'en': (1033, 538, 1125, 560), 'jp': (1025, 537, 1132, 562), 'tw': (1025, 537, 1132, 562)}, color={'cn': (106, 149, 226), 'en': (108, 151, 225), 'jp': (106, 149, 226), 'tw': (106, 149, 226)}, button={'cn': (1025, 537, 1132, 562), 'en': (1033, 538, 1125, 560), 'jp': (1025, 537, 1132, 562), 'tw': (1025, 537, 1132, 562)}, file={'cn': './assets/cn/coalition/ACEDEMY_FLEET_PREPARATION.png', 'en': './assets/en/coalition/ACEDEMY_FLEET_PREPARATION.png', 'jp': './assets/cn/coalition/ACEDEMY_FLEET_PREPARATION.png', 'tw': './assets/cn/coalition/ACEDEMY_FLEET_PREPARATION.png'})
COALITION_ACADEMY_BACK = Button(area={'cn': (44, 48, 62, 74), 'en': (44, 48, 62, 74), 'jp': (44, 48, 62, 74), 'tw': (44, 48, 62, 74)}, color={'cn': (162, 188, 194), 'en': (162, 188, 194), 'jp': (162, 188, 194), 'tw': (162, 188, 194)}, button={'cn': (44, 48, 62, 74), 'en': (44, 48, 62, 74), 'jp': (44, 48, 62, 74), 'tw': (44, 48, 62, 74)}, file={'cn': './assets/cn/coalition/COALITION_ACADEMY_BACK.png', 'en': './assets/en/coalition/COALITION_ACADEMY_BACK.png', 'jp': './assets/jp/coalition/COALITION_ACADEMY_BACK.png', 'tw': './assets/tw/coalition/COALITION_ACADEMY_BACK.png'})
COALITION_ACADEMY_CAMPAIGN_CHECK = Button(area={'cn': (131, 50, 168, 83), 'en': (123, 52, 176, 78), 'jp': (131, 50, 168, 83), 'tw': (131, 50, 168, 83)}, color={'cn': (165, 210, 212), 'en': (156, 197, 198), 'jp': (165, 210, 212), 'tw': (165, 210, 212)}, button={'cn': (131, 50, 168, 83), 'en': (123, 52, 176, 78), 'jp': (131, 50, 168, 83), 'tw': (131, 50, 168, 83)}, file={'cn': './assets/cn/coalition/COALITION_ACADEMY_CAMPAIGN_CHECK.png', 'en': './assets/en/coalition/COALITION_ACADEMY_CAMPAIGN_CHECK.png', 'jp': './assets/cn/coalition/COALITION_ACADEMY_CAMPAIGN_CHECK.png', 'tw': './assets/cn/coalition/COALITION_ACADEMY_CAMPAIGN_CHECK.png'})
COALITION_ACADEMY_GOTO_CAMPAIGN = Button(area={'cn': (1123, 615, 1159, 651), 'en': (1123, 615, 1159, 651), 'jp': (1123, 615, 1159, 651), 'tw': (1123, 615, 1159, 651)}, color={'cn': (160, 134, 93), 'en': (160, 134, 93), 'jp': (160, 134, 93), 'tw': (160, 134, 93)}, button={'cn': (1123, 615, 1159, 651), 'en': (1123, 615, 1159, 651), 'jp': (1123, 615, 1159, 651), 'tw': (1123, 615, 1159, 651)}, file={'cn': './assets/cn/coalition/COALITION_ACADEMY_GOTO_CAMPAIGN.png', 'en': './assets/en/coalition/COALITION_ACADEMY_GOTO_CAMPAIGN.png', 'jp': './assets/jp/coalition/COALITION_ACADEMY_GOTO_CAMPAIGN.png', 'tw': './assets/tw/coalition/COALITION_ACADEMY_GOTO_CAMPAIGN.png'})
COALITION_ACADEMY_HOME = Button(area={'cn': (1221, 48, 1244, 73), 'en': (1221, 48, 1244, 73), 'jp': (1221, 48, 1244, 73), 'tw': (1221, 48, 1244, 73)}, color={'cn': (182, 197, 203), 'en': (182, 197, 203), 'jp': (182, 197, 203), 'tw': (182, 197, 203)}, button={'cn': (1221, 48, 1244, 73), 'en': (1221, 48, 1244, 73), 'jp': (1221, 48, 1244, 73), 'tw': (1221, 48, 1244, 73)}, file={'cn': './assets/cn/coalition/COALITION_ACADEMY_HOME.png', 'en': './assets/en/coalition/COALITION_ACADEMY_HOME.png', 'jp': './assets/jp/coalition/COALITION_ACADEMY_HOME.png', 'tw': './assets/tw/coalition/COALITION_ACADEMY_HOME.png'})
COALITION_ACADEMY_MAIN_CHECK = Button(area={'cn': (132, 57, 163, 92), 'en': (164, 57, 221, 78), 'jp': (132, 57, 163, 92), 'tw': (132, 57, 163, 92)}, color={'cn': (143, 202, 205), 'en': (205, 189, 166), 'jp': (143, 202, 205), 'tw': (143, 202, 205)}, button={'cn': (132, 57, 163, 92), 'en': (164, 57, 221, 78), 'jp': (132, 57, 163, 92), 'tw': (132, 57, 163, 92)}, file={'cn': './assets/cn/coalition/COALITION_ACADEMY_MAIN_CHECK.png', 'en': './assets/en/coalition/COALITION_ACADEMY_MAIN_CHECK.png', 'jp': './assets/cn/coalition/COALITION_ACADEMY_MAIN_CHECK.png', 'tw': './assets/cn/coalition/COALITION_ACADEMY_MAIN_CHECK.png'})
COALITION_REWARD_CONFIRM = Button(area={'cn': (814, 611, 877, 637), 'en': (788, 612, 902, 634), 'jp': (814, 611, 876, 637), 'tw': (814, 611, 877, 637)}, color={'cn': (155, 186, 227), 'en': (162, 189, 226), 'jp': (143, 176, 219), 'tw': (150, 181, 221)}, button={'cn': (814, 611, 877, 637), 'en': (788, 612, 902, 634), 'jp': (814, 611, 876, 637), 'tw': (814, 611, 877, 637)}, file={'cn': './assets/cn/coalition/COALITION_REWARD_CONFIRM.png', 'en': './assets/en/coalition/COALITION_REWARD_CONFIRM.png', 'jp': './assets/jp/coalition/COALITION_REWARD_CONFIRM.png', 'tw': './assets/tw/coalition/COALITION_REWARD_CONFIRM.png'}) COALITION_REWARD_CONFIRM = Button(area={'cn': (814, 611, 877, 637), 'en': (788, 612, 902, 634), 'jp': (814, 611, 876, 637), 'tw': (814, 611, 877, 637)}, color={'cn': (155, 186, 227), 'en': (162, 189, 226), 'jp': (143, 176, 219), 'tw': (150, 181, 221)}, button={'cn': (814, 611, 877, 637), 'en': (788, 612, 902, 634), 'jp': (814, 611, 876, 637), 'tw': (814, 611, 877, 637)}, file={'cn': './assets/cn/coalition/COALITION_REWARD_CONFIRM.png', 'en': './assets/en/coalition/COALITION_REWARD_CONFIRM.png', 'jp': './assets/jp/coalition/COALITION_REWARD_CONFIRM.png', 'tw': './assets/tw/coalition/COALITION_REWARD_CONFIRM.png'})
FLEET_NOT_PREPARED = Button(area={'cn': (1008, 310, 1110, 334), 'en': (1008, 310, 1110, 334), 'jp': (1008, 310, 1110, 334), 'tw': (1008, 310, 1110, 334)}, color={'cn': (106, 106, 112), 'en': (106, 106, 112), 'jp': (106, 106, 112), 'tw': (108, 107, 112)}, button={'cn': (1008, 310, 1110, 334), 'en': (1008, 310, 1110, 334), 'jp': (1008, 310, 1110, 334), 'tw': (1008, 310, 1110, 334)}, file={'cn': './assets/cn/coalition/FLEET_NOT_PREPARED.png', 'en': './assets/cn/coalition/FLEET_NOT_PREPARED.png', 'jp': './assets/cn/coalition/FLEET_NOT_PREPARED.png', 'tw': './assets/tw/coalition/FLEET_NOT_PREPARED.png'}) FLEET_NOT_PREPARED = Button(area={'cn': (1008, 310, 1110, 334), 'en': (1008, 310, 1110, 334), 'jp': (1008, 310, 1110, 334), 'tw': (1008, 310, 1110, 334)}, color={'cn': (106, 106, 112), 'en': (106, 106, 112), 'jp': (106, 106, 112), 'tw': (108, 107, 112)}, button={'cn': (1008, 310, 1110, 334), 'en': (1008, 310, 1110, 334), 'jp': (1008, 310, 1110, 334), 'tw': (1008, 310, 1110, 334)}, file={'cn': './assets/cn/coalition/FLEET_NOT_PREPARED.png', 'en': './assets/cn/coalition/FLEET_NOT_PREPARED.png', 'jp': './assets/cn/coalition/FLEET_NOT_PREPARED.png', 'tw': './assets/tw/coalition/FLEET_NOT_PREPARED.png'})
FLEET_PREPARATION = Button(area={'cn': (1057, 527, 1155, 548), 'en': (1114, 527, 1200, 545), 'jp': (1056, 525, 1157, 550), 'tw': (1057, 527, 1155, 548)}, color={'cn': (122, 146, 222), 'en': (106, 135, 228), 'jp': (115, 141, 222), 'tw': (110, 136, 224)}, button={'cn': (968, 511, 1245, 563), 'en': (968, 511, 1245, 563), 'jp': (968, 511, 1245, 563), 'tw': (968, 511, 1245, 563)}, file={'cn': './assets/cn/coalition/FLEET_PREPARATION.png', 'en': './assets/en/coalition/FLEET_PREPARATION.png', 'jp': './assets/jp/coalition/FLEET_PREPARATION.png', 'tw': './assets/tw/coalition/FLEET_PREPARATION.png'})
FLEET_SWITCH_MULTI = Button(area={'cn': (1106, 449, 1237, 478), 'en': (1106, 449, 1237, 478), 'jp': (1106, 449, 1237, 478), 'tw': (1106, 449, 1237, 478)}, color={'cn': (232, 175, 58), 'en': (197, 147, 49), 'jp': (220, 165, 55), 'tw': (225, 170, 59)}, button={'cn': (1106, 449, 1237, 478), 'en': (1106, 449, 1237, 478), 'jp': (1106, 449, 1237, 478), 'tw': (1106, 449, 1237, 478)}, file={'cn': './assets/cn/coalition/FLEET_SWITCH_MULTI.png', 'en': './assets/en/coalition/FLEET_SWITCH_MULTI.png', 'jp': './assets/jp/coalition/FLEET_SWITCH_MULTI.png', 'tw': './assets/tw/coalition/FLEET_SWITCH_MULTI.png'})
FLEET_SWITCH_SINGLE = Button(area={'cn': (968, 449, 1098, 478), 'en': (968, 449, 1098, 478), 'jp': (968, 449, 1098, 478), 'tw': (968, 449, 1098, 478)}, color={'cn': (230, 173, 57), 'en': (199, 148, 49), 'jp': (221, 166, 55), 'tw': (220, 166, 58)}, button={'cn': (968, 449, 1098, 478), 'en': (968, 449, 1098, 478), 'jp': (968, 449, 1098, 478), 'tw': (968, 449, 1098, 478)}, file={'cn': './assets/cn/coalition/FLEET_SWITCH_SINGLE.png', 'en': './assets/en/coalition/FLEET_SWITCH_SINGLE.png', 'jp': './assets/jp/coalition/FLEET_SWITCH_SINGLE.png', 'tw': './assets/tw/coalition/FLEET_SWITCH_SINGLE.png'})
FROSTFALL_EX = Button(area={'cn': (622, 372, 649, 384), 'en': (622, 372, 649, 384), 'jp': (622, 372, 649, 384), 'tw': (622, 372, 649, 384)}, color={'cn': (198, 152, 252), 'en': (198, 152, 252), 'jp': (198, 152, 252), 'tw': (182, 127, 252)}, button={'cn': (622, 372, 649, 384), 'en': (622, 372, 649, 384), 'jp': (622, 372, 649, 384), 'tw': (622, 372, 649, 384)}, file={'cn': './assets/cn/coalition/FROSTFALL_EX.png', 'en': './assets/en/coalition/FROSTFALL_EX.png', 'jp': './assets/jp/coalition/FROSTFALL_EX.png', 'tw': './assets/tw/coalition/FROSTFALL_EX.png'}) FROSTFALL_EX = Button(area={'cn': (622, 372, 649, 384), 'en': (622, 372, 649, 384), 'jp': (622, 372, 649, 384), 'tw': (622, 372, 649, 384)}, color={'cn': (198, 152, 252), 'en': (198, 152, 252), 'jp': (198, 152, 252), 'tw': (182, 127, 252)}, button={'cn': (622, 372, 649, 384), 'en': (622, 372, 649, 384), 'jp': (622, 372, 649, 384), 'tw': (622, 372, 649, 384)}, file={'cn': './assets/cn/coalition/FROSTFALL_EX.png', 'en': './assets/en/coalition/FROSTFALL_EX.png', 'jp': './assets/jp/coalition/FROSTFALL_EX.png', 'tw': './assets/tw/coalition/FROSTFALL_EX.png'})
FROSTFALL_FLEET_PREPARATION = Button(area={'cn': (1057, 527, 1155, 548), 'en': (1057, 527, 1155, 548), 'jp': (1057, 527, 1155, 548), 'tw': (1057, 527, 1155, 548)}, color={'cn': (122, 146, 222), 'en': (122, 146, 222), 'jp': (122, 146, 222), 'tw': (122, 146, 222)}, button={'cn': (1057, 527, 1155, 548), 'en': (1057, 527, 1155, 548), 'jp': (1057, 527, 1155, 548), 'tw': (1057, 527, 1155, 548)}, file={'cn': './assets/cn/coalition/FROSTFALL_FLEET_PREPARATION.png', 'en': './assets/cn/coalition/FROSTFALL_FLEET_PREPARATION.png', 'jp': './assets/cn/coalition/FROSTFALL_FLEET_PREPARATION.png', 'tw': './assets/cn/coalition/FROSTFALL_FLEET_PREPARATION.png'})
FROSTFALL_MODE_BATTLE = Button(area={'cn': (71, 608, 137, 653), 'en': (71, 608, 137, 653), 'jp': (71, 608, 137, 653), 'tw': (71, 608, 137, 653)}, color={'cn': (63, 106, 122), 'en': (63, 106, 122), 'jp': (63, 106, 122), 'tw': (63, 106, 122)}, button={'cn': (71, 608, 137, 653), 'en': (71, 608, 137, 653), 'jp': (71, 608, 137, 653), 'tw': (71, 608, 137, 653)}, file={'cn': './assets/cn/coalition/FROSTFALL_MODE_BATTLE.png', 'en': './assets/cn/coalition/FROSTFALL_MODE_BATTLE.png', 'jp': './assets/cn/coalition/FROSTFALL_MODE_BATTLE.png', 'tw': './assets/cn/coalition/FROSTFALL_MODE_BATTLE.png'})
FROSTFALL_MODE_STORY = Button(area={'cn': (73, 610, 134, 652), 'en': (73, 610, 134, 652), 'jp': (73, 610, 134, 652), 'tw': (73, 610, 134, 652)}, color={'cn': (119, 44, 32), 'en': (119, 44, 32), 'jp': (119, 44, 32), 'tw': (119, 44, 32)}, button={'cn': (73, 610, 134, 652), 'en': (73, 610, 134, 652), 'jp': (73, 610, 134, 652), 'tw': (73, 610, 134, 652)}, file={'cn': './assets/cn/coalition/FROSTFALL_MODE_STORY.png', 'en': './assets/cn/coalition/FROSTFALL_MODE_STORY.png', 'jp': './assets/cn/coalition/FROSTFALL_MODE_STORY.png', 'tw': './assets/cn/coalition/FROSTFALL_MODE_STORY.png'})
FROSTFALL_OCR_PT = Button(area={'cn': (1181, 641, 1254, 663), 'en': (1181, 641, 1254, 663), 'jp': (1181, 641, 1254, 663), 'tw': (1181, 641, 1254, 663)}, color={'cn': (93, 100, 106), 'en': (93, 100, 106), 'jp': (93, 100, 106), 'tw': (93, 100, 106)}, button={'cn': (1181, 641, 1254, 663), 'en': (1181, 641, 1254, 663), 'jp': (1181, 641, 1254, 663), 'tw': (1181, 641, 1254, 663)}, file={'cn': './assets/cn/coalition/FROSTFALL_OCR_PT.png', 'en': './assets/en/coalition/FROSTFALL_OCR_PT.png', 'jp': './assets/jp/coalition/FROSTFALL_OCR_PT.png', 'tw': './assets/tw/coalition/FROSTFALL_OCR_PT.png'}) FROSTFALL_OCR_PT = Button(area={'cn': (1181, 641, 1254, 663), 'en': (1181, 641, 1254, 663), 'jp': (1181, 641, 1254, 663), 'tw': (1181, 641, 1254, 663)}, color={'cn': (93, 100, 106), 'en': (93, 100, 106), 'jp': (93, 100, 106), 'tw': (93, 100, 106)}, button={'cn': (1181, 641, 1254, 663), 'en': (1181, 641, 1254, 663), 'jp': (1181, 641, 1254, 663), 'tw': (1181, 641, 1254, 663)}, file={'cn': './assets/cn/coalition/FROSTFALL_OCR_PT.png', 'en': './assets/en/coalition/FROSTFALL_OCR_PT.png', 'jp': './assets/jp/coalition/FROSTFALL_OCR_PT.png', 'tw': './assets/tw/coalition/FROSTFALL_OCR_PT.png'})
FROSTFALL_SP = Button(area={'cn': (631, 160, 658, 173), 'en': (631, 160, 658, 173), 'jp': (631, 160, 658, 173), 'tw': (505, 290, 532, 302)}, color={'cn': (194, 145, 252), 'en': (194, 145, 252), 'jp': (194, 145, 252), 'tw': (183, 128, 253)}, button={'cn': (631, 160, 658, 173), 'en': (631, 160, 658, 173), 'jp': (631, 160, 658, 173), 'tw': (505, 290, 532, 302)}, file={'cn': './assets/cn/coalition/FROSTFALL_SP.png', 'en': './assets/en/coalition/FROSTFALL_SP.png', 'jp': './assets/jp/coalition/FROSTFALL_SP.png', 'tw': './assets/tw/coalition/FROSTFALL_SP.png'}) FROSTFALL_SP = Button(area={'cn': (631, 160, 658, 173), 'en': (631, 160, 658, 173), 'jp': (631, 160, 658, 173), 'tw': (505, 290, 532, 302)}, color={'cn': (194, 145, 252), 'en': (194, 145, 252), 'jp': (194, 145, 252), 'tw': (183, 128, 253)}, button={'cn': (631, 160, 658, 173), 'en': (631, 160, 658, 173), 'jp': (631, 160, 658, 173), 'tw': (505, 290, 532, 302)}, file={'cn': './assets/cn/coalition/FROSTFALL_SP.png', 'en': './assets/en/coalition/FROSTFALL_SP.png', 'jp': './assets/jp/coalition/FROSTFALL_SP.png', 'tw': './assets/tw/coalition/FROSTFALL_SP.png'})
FROSTFALL_SWITCH_MULTI = Button(area={'cn': (1106, 449, 1237, 478), 'en': (1106, 449, 1237, 478), 'jp': (1106, 449, 1237, 478), 'tw': (1106, 449, 1237, 478)}, color={'cn': (232, 175, 58), 'en': (232, 175, 58), 'jp': (232, 175, 58), 'tw': (232, 175, 58)}, button={'cn': (1106, 449, 1237, 478), 'en': (1106, 449, 1237, 478), 'jp': (1106, 449, 1237, 478), 'tw': (1106, 449, 1237, 478)}, file={'cn': './assets/cn/coalition/FROSTFALL_SWITCH_MULTI.png', 'en': './assets/cn/coalition/FROSTFALL_SWITCH_MULTI.png', 'jp': './assets/cn/coalition/FROSTFALL_SWITCH_MULTI.png', 'tw': './assets/cn/coalition/FROSTFALL_SWITCH_MULTI.png'})
FROSTFALL_SWITCH_SINGLE = Button(area={'cn': (968, 449, 1098, 478), 'en': (968, 449, 1098, 478), 'jp': (968, 449, 1098, 478), 'tw': (968, 449, 1098, 478)}, color={'cn': (230, 173, 57), 'en': (230, 173, 57), 'jp': (230, 173, 57), 'tw': (230, 173, 57)}, button={'cn': (968, 449, 1098, 478), 'en': (968, 449, 1098, 478), 'jp': (968, 449, 1098, 478), 'tw': (968, 449, 1098, 478)}, file={'cn': './assets/cn/coalition/FROSTFALL_SWITCH_SINGLE.png', 'en': './assets/cn/coalition/FROSTFALL_SWITCH_SINGLE.png', 'jp': './assets/cn/coalition/FROSTFALL_SWITCH_SINGLE.png', 'tw': './assets/cn/coalition/FROSTFALL_SWITCH_SINGLE.png'})
FROSTFALL_TC1 = Button(area={'cn': (304, 320, 330, 332), 'en': (304, 320, 330, 332), 'jp': (304, 320, 330, 332), 'tw': (304, 320, 330, 332)}, color={'cn': (204, 162, 254), 'en': (204, 162, 254), 'jp': (204, 162, 254), 'tw': (188, 137, 254)}, button={'cn': (304, 320, 330, 332), 'en': (304, 320, 330, 332), 'jp': (304, 320, 330, 332), 'tw': (304, 320, 330, 332)}, file={'cn': './assets/cn/coalition/FROSTFALL_TC1.png', 'en': './assets/en/coalition/FROSTFALL_TC1.png', 'jp': './assets/jp/coalition/FROSTFALL_TC1.png', 'tw': './assets/tw/coalition/FROSTFALL_TC1.png'}) FROSTFALL_TC1 = Button(area={'cn': (304, 320, 330, 332), 'en': (304, 320, 330, 332), 'jp': (304, 320, 330, 332), 'tw': (304, 320, 330, 332)}, color={'cn': (204, 162, 254), 'en': (204, 162, 254), 'jp': (204, 162, 254), 'tw': (188, 137, 254)}, button={'cn': (304, 320, 330, 332), 'en': (304, 320, 330, 332), 'jp': (304, 320, 330, 332), 'tw': (304, 320, 330, 332)}, file={'cn': './assets/cn/coalition/FROSTFALL_TC1.png', 'en': './assets/en/coalition/FROSTFALL_TC1.png', 'jp': './assets/jp/coalition/FROSTFALL_TC1.png', 'tw': './assets/tw/coalition/FROSTFALL_TC1.png'})
FROSTFALL_TC2 = Button(area={'cn': (810, 362, 835, 373), 'en': (810, 362, 835, 373), 'jp': (810, 362, 835, 373), 'tw': (631, 160, 658, 173)}, color={'cn': (214, 178, 254), 'en': (214, 178, 254), 'jp': (214, 178, 254), 'tw': (186, 136, 252)}, button={'cn': (810, 362, 835, 373), 'en': (810, 362, 835, 373), 'jp': (810, 362, 835, 373), 'tw': (631, 160, 658, 173)}, file={'cn': './assets/cn/coalition/FROSTFALL_TC2.png', 'en': './assets/en/coalition/FROSTFALL_TC2.png', 'jp': './assets/jp/coalition/FROSTFALL_TC2.png', 'tw': './assets/tw/coalition/FROSTFALL_TC2.png'}) FROSTFALL_TC2 = Button(area={'cn': (810, 362, 835, 373), 'en': (810, 362, 835, 373), 'jp': (810, 362, 835, 373), 'tw': (631, 160, 658, 173)}, color={'cn': (214, 178, 254), 'en': (214, 178, 254), 'jp': (214, 178, 254), 'tw': (186, 136, 252)}, button={'cn': (810, 362, 835, 373), 'en': (810, 362, 835, 373), 'jp': (810, 362, 835, 373), 'tw': (631, 160, 658, 173)}, file={'cn': './assets/cn/coalition/FROSTFALL_TC2.png', 'en': './assets/en/coalition/FROSTFALL_TC2.png', 'jp': './assets/jp/coalition/FROSTFALL_TC2.png', 'tw': './assets/tw/coalition/FROSTFALL_TC2.png'})
FROSTFALL_TC3 = Button(area={'cn': (505, 290, 532, 302), 'en': (505, 290, 532, 302), 'jp': (505, 290, 532, 302), 'tw': (810, 362, 835, 373)}, color={'cn': (210, 172, 252), 'en': (210, 172, 252), 'jp': (210, 172, 252), 'tw': (197, 153, 255)}, button={'cn': (505, 290, 532, 302), 'en': (505, 290, 532, 302), 'jp': (505, 290, 532, 302), 'tw': (810, 362, 835, 373)}, file={'cn': './assets/cn/coalition/FROSTFALL_TC3.png', 'en': './assets/en/coalition/FROSTFALL_TC3.png', 'jp': './assets/jp/coalition/FROSTFALL_TC3.png', 'tw': './assets/tw/coalition/FROSTFALL_TC3.png'}) FROSTFALL_TC3 = Button(area={'cn': (505, 290, 532, 302), 'en': (505, 290, 532, 302), 'jp': (505, 290, 532, 302), 'tw': (810, 362, 835, 373)}, color={'cn': (210, 172, 252), 'en': (210, 172, 252), 'jp': (210, 172, 252), 'tw': (197, 153, 255)}, button={'cn': (505, 290, 532, 302), 'en': (505, 290, 532, 302), 'jp': (505, 290, 532, 302), 'tw': (810, 362, 835, 373)}, file={'cn': './assets/cn/coalition/FROSTFALL_TC3.png', 'en': './assets/en/coalition/FROSTFALL_TC3.png', 'jp': './assets/jp/coalition/FROSTFALL_TC3.png', 'tw': './assets/tw/coalition/FROSTFALL_TC3.png'})
MODE_SWITCH_BATTLE = Button(area={'cn': (71, 608, 137, 653), 'en': (71, 608, 137, 653), 'jp': (71, 608, 137, 653), 'tw': (71, 608, 137, 653)}, color={'cn': (63, 106, 122), 'en': (63, 106, 122), 'jp': (63, 106, 122), 'tw': (63, 106, 122)}, button={'cn': (71, 608, 137, 653), 'en': (71, 608, 137, 653), 'jp': (71, 608, 137, 653), 'tw': (71, 608, 137, 653)}, file={'cn': './assets/cn/coalition/MODE_SWITCH_BATTLE.png', 'en': './assets/en/coalition/MODE_SWITCH_BATTLE.png', 'jp': './assets/jp/coalition/MODE_SWITCH_BATTLE.png', 'tw': './assets/tw/coalition/MODE_SWITCH_BATTLE.png'})
MODE_SWITCH_STORY = Button(area={'cn': (73, 610, 134, 652), 'en': (73, 610, 134, 652), 'jp': (73, 610, 134, 652), 'tw': (73, 610, 134, 652)}, color={'cn': (119, 44, 32), 'en': (119, 44, 32), 'jp': (119, 44, 32), 'tw': (119, 44, 32)}, button={'cn': (73, 610, 134, 652), 'en': (73, 610, 134, 652), 'jp': (73, 610, 134, 652), 'tw': (73, 610, 134, 652)}, file={'cn': './assets/cn/coalition/MODE_SWITCH_STORY.png', 'en': './assets/en/coalition/MODE_SWITCH_STORY.png', 'jp': './assets/jp/coalition/MODE_SWITCH_STORY.png', 'tw': './assets/tw/coalition/MODE_SWITCH_STORY.png'})

View File

@ -7,7 +7,20 @@ from module.exception import ScriptError, ScriptEnd
from module.logger import logger from module.logger import logger
from module.ocr.ocr import Digit from module.ocr.ocr import Digit
OCR_PT = Digit(FROSTFALL_OCR_PT, name='OCR_PT', letter=(198, 158, 82), threshold=128)
class AcademyPtOcr(Digit):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.alphabet += ':'
def after_process(self, result):
logger.attr(self.name, result)
try:
# 累计: 840
result = result.rsplit(':')[1]
except IndexError:
pass
return super().after_process(result)
class Coalition(CoalitionCombat, CampaignEvent): class Coalition(CoalitionCombat, CampaignEvent):
@ -19,10 +32,19 @@ class Coalition(CoalitionCombat, CampaignEvent):
Returns: Returns:
int: PT amount, or 0 if unable to parse int: PT amount, or 0 if unable to parse
""" """
pt = OCR_PT.ocr(self.device.image) event = self.config.Campaign_Event
if event == 'coalition_20230323':
ocr = Digit(FROSTFALL_OCR_PT, name='OCR_PT', letter=(198, 158, 82), threshold=128)
elif event == 'coalition_20240627':
ocr = AcademyPtOcr(ACADEMY_PT_OCR, name='OCR_PT', letter=(255, 255, 255), threshold=128)
else:
logger.error(f'ocr object is not defined in event {event}')
raise ScriptError
pt = ocr.ocr(self.device.image)
return pt return pt
def triggered_stop_condition(self): def triggered_stop_condition(self, oil_check=False, pt_check=False):
""" """
Returns: Returns:
bool: If triggered a stop condition. bool: If triggered a stop condition.
@ -34,14 +56,16 @@ class Coalition(CoalitionCombat, CampaignEvent):
self.config.Scheduler_Enable = False self.config.Scheduler_Enable = False
return True return True
# Oil limit # Oil limit
if self.get_oil() < max(500, self.config.StopCondition_OilLimit): if oil_check:
logger.hr('Triggered stop condition: Oil limit') if self.get_oil() < max(500, self.config.StopCondition_OilLimit):
self.config.task_delay(minute=(120, 240)) logger.hr('Triggered stop condition: Oil limit')
return True self.config.task_delay(minute=(120, 240))
return True
# Event limit # Event limit
if self.event_pt_limit_triggered(): if pt_check:
logger.hr('Triggered stop condition: Event PT limit') if self.event_pt_limit_triggered():
return True logger.hr('Triggered stop condition: Event PT limit')
return True
# TaskBalancer # TaskBalancer
if self.run_count >= 1: if self.run_count >= 1:
if self.config.TaskBalancer_Enable and self.triggered_task_balancer(): if self.config.TaskBalancer_Enable and self.triggered_task_balancer():
@ -76,9 +100,11 @@ class Coalition(CoalitionCombat, CampaignEvent):
self.config.override( self.config.override(
Coalition_Fleet='multi', Coalition_Fleet='multi',
) )
self.emotion.check_reduce(battle=self.coalition_get_battles(stage)) self.emotion.check_reduce(battle=self.coalition_get_battles(event, stage))
self.enter_map(stage=stage, fleet=fleet) self.enter_map(event=event, stage=stage, mode=fleet)
if self.triggered_stop_condition(oil_check=True):
raise ScriptEnd
self.coalition_combat() self.coalition_combat()
@staticmethod @staticmethod
@ -89,14 +115,14 @@ class Coalition(CoalitionCombat, CampaignEvent):
return event, stage return event, stage
def run(self, name='', stage='', fleet='', total=0): def run(self, event='', mode='', fleet='', total=0):
name = name if name else self.config.Campaign_Event event = event if event else self.config.Campaign_Event
stage = stage if stage else self.config.Campaign_Name mode = mode if mode else self.config.Coalition_Mode
fleet = fleet if fleet else self.config.Coalition_Fleet fleet = fleet if fleet else self.config.Coalition_Fleet
if not name or not stage or not fleet: if not event or not mode or not fleet:
raise ScriptError(f'RaidRun arguments unfilled. name={name}, stage={stage}, fleet={fleet}') raise ScriptError(f'Coalition arguments unfilled. name={event}, mode={mode}, fleet={fleet}')
name, stage = self.handle_stage_name(name, stage) event, mode = self.handle_stage_name(event, mode)
self.run_count = 0 self.run_count = 0
self.run_limit = self.config.StopCondition_RunCount self.run_limit = self.config.StopCondition_RunCount
while 1: while 1:
@ -107,7 +133,7 @@ class Coalition(CoalitionCombat, CampaignEvent):
self.config.task_stop() self.config.task_stop()
# Log # Log
logger.hr(f'{name}_{stage}', level=2) logger.hr(f'{event}_{mode}', level=2)
if self.config.StopCondition_RunCount > 0: if self.config.StopCondition_RunCount > 0:
logger.info(f'Count remain: {self.config.StopCondition_RunCount}') logger.info(f'Count remain: {self.config.StopCondition_RunCount}')
else: else:
@ -117,17 +143,17 @@ class Coalition(CoalitionCombat, CampaignEvent):
self.device.stuck_record_clear() self.device.stuck_record_clear()
self.device.click_record_clear() self.device.click_record_clear()
self.ui_goto_coalition() self.ui_goto_coalition()
self.coalition_ensure_mode('battle') self.coalition_ensure_mode(event, 'battle')
# End # End
if self.triggered_stop_condition(): if self.triggered_stop_condition(pt_check=True):
break break
# Run # Run
self.device.stuck_record_clear() self.device.stuck_record_clear()
self.device.click_record_clear() self.device.click_record_clear()
try: try:
self.coalition_execute_once(event=name, stage=stage, fleet=fleet) self.coalition_execute_once(event=event, stage=mode, fleet=fleet)
except ScriptEnd as e: except ScriptEnd as e:
logger.hr('Script end') logger.hr('Script end')
logger.info(str(e)) logger.info(str(e))
@ -138,7 +164,7 @@ class Coalition(CoalitionCombat, CampaignEvent):
if self.config.StopCondition_RunCount: if self.config.StopCondition_RunCount:
self.config.StopCondition_RunCount -= 1 self.config.StopCondition_RunCount -= 1
# End # End
if self.triggered_stop_condition(): if self.triggered_stop_condition(pt_check=True):
break break
# Scheduler # Scheduler
if self.config.task_switched(): if self.config.task_switched():

View File

@ -5,7 +5,7 @@ from module.config.config import TaskEnd
class CoalitionSP(Coalition): class CoalitionSP(Coalition):
def run(self, *args, **kwargs): def run(self, *args, **kwargs):
try: try:
super().run(stage='sp', total=1) super().run(mode='sp', total=1)
except TaskEnd: except TaskEnd:
# Catch task switch # Catch task switch
pass pass

View File

@ -2,33 +2,38 @@ from module.base.timer import Timer
from module.coalition.assets import * from module.coalition.assets import *
from module.combat.assets import BATTLE_PREPARATION from module.combat.assets import BATTLE_PREPARATION
from module.combat.combat import Combat from module.combat.combat import Combat
from module.exception import CampaignNameError, RequestHumanTakeover from module.exception import CampaignNameError, RequestHumanTakeover, ScriptError
from module.logger import logger from module.logger import logger
from module.ui.assets import COALITION_CHECK from module.ui.page import page_coalition
from module.ui.switch import Switch from module.ui.switch import Switch
MODE_SWITCH = Switch('CoalitionMode', offset=(20, 20))
MODE_SWITCH.add_status('story', MODE_SWITCH_STORY)
MODE_SWITCH.add_status('battle', MODE_SWITCH_BATTLE)
FLEET_SWITCH = Switch('FleetMode', is_selector=True, offset=0) # No offset for color match
FLEET_SWITCH.add_status('single', FLEET_SWITCH_SINGLE)
FLEET_SWITCH.add_status('multi', FLEET_SWITCH_MULTI)
class CoalitionUI(Combat): class CoalitionUI(Combat):
def in_coalition(self): def in_coalition(self):
# The same as raid # The same as raid
return self.appear(COALITION_CHECK, offset=(20, 20)) return self.ui_page_appear(page_coalition, offset=(20, 20))
def coalition_ensure_mode(self, mode): def coalition_ensure_mode(self, event, mode):
""" """
Args: Args:
event (str): Event name.
mode (str): 'story' or 'battle' mode (str): 'story' or 'battle'
Pages: Pages:
in: in_coalition in: in_coalition
""" """
MODE_SWITCH = Switch('CoalitionMode', offset=(20, 20))
if event == 'coalition_20230323':
MODE_SWITCH.add_status('story', FROSTFALL_MODE_STORY)
MODE_SWITCH.add_status('battle', FROSTFALL_MODE_BATTLE)
elif event == 'coalition_20240627':
# Note that switch button are reversed
MODE_SWITCH.add_status('story', ACADEMY_MODE_BATTLE)
MODE_SWITCH.add_status('battle', ACADEMY_MODE_STORY)
else:
logger.error(f'MODE_SWITCH is not defined in event {event}')
raise ScriptError
if mode == 'story': if mode == 'story':
MODE_SWITCH.set('battle', main=self) MODE_SWITCH.set('battle', main=self)
elif mode == 'battle': elif mode == 'battle':
@ -36,14 +41,26 @@ class CoalitionUI(Combat):
else: else:
logger.warning(f'Unknown coalition campaign mode: {mode}') logger.warning(f'Unknown coalition campaign mode: {mode}')
def coalition_ensure_fleet(self, mode): def coalition_ensure_fleet(self, event, mode):
""" """
Args: Args:
event (str): Event name.
mode (str): 'single' or 'multi' mode (str): 'single' or 'multi'
Pages: Pages:
in: FLEET_PREPARATION in: FLEET_PREPARATION
""" """
FLEET_SWITCH = Switch('FleetMode', is_selector=True, offset=0) # No offset for color match
if event == 'coalition_20230323':
FLEET_SWITCH.add_status('single', FROSTFALL_SWITCH_SINGLE)
FLEET_SWITCH.add_status('multi', FROSTFALL_SWITCH_MULTI)
elif event == 'coalition_20240627':
FLEET_SWITCH.add_status('single', ACADEMY_SWITCH_SINGLE)
FLEET_SWITCH.add_status('multi', ACADEMY_SWITCH_MULTI)
else:
logger.error(f'FLEET_SWITCH is not defined in event {event}')
raise ScriptError
if mode == 'single': if mode == 'single':
FLEET_SWITCH.set('single', main=self) FLEET_SWITCH.set('single', main=self)
elif mode == 'multi': elif mode == 'multi':
@ -52,68 +69,119 @@ class CoalitionUI(Combat):
logger.warning(f'Unknown coalition fleet mode: {mode}') logger.warning(f'Unknown coalition fleet mode: {mode}')
@staticmethod @staticmethod
def coalition_get_entrance(stage): def coalition_get_entrance(event, stage):
""" """
Args: Args:
event (str): Event name.
stage (str): Stage name. stage (str): Stage name.
Returns: Returns:
Button: Entrance button Button: Entrance button
""" """
stage = stage.lower() dic = {
if stage == 'tc1': ('coalition_20230323', 'tc1'): FROSTFALL_TC1,
return FROSTFALL_TC1 ('coalition_20230323', 'tc2'): FROSTFALL_TC2,
if stage == 'tc2': ('coalition_20230323', 'tc3'): FROSTFALL_TC3,
return FROSTFALL_TC2 ('coalition_20230323', 'sp'): FROSTFALL_SP,
if stage == 'tc3': ('coalition_20230323', 'ex'): FROSTFALL_EX,
return FROSTFALL_TC3
if stage == 'sp':
return FROSTFALL_SP
if stage == 'ex':
return FROSTFALL_EX
raise CampaignNameError ('coalition_20240627', 'easy'): ACADEMY_EASY,
('coalition_20240627', 'normal'): ACADEMY_NORMAL,
('coalition_20240627', 'hard'): ACADEMY_HARD,
('coalition_20240627', 'sp'): ACADEMY_SP,
('coalition_20240627', 'ex'): ACADEMY_EX,
}
stage = stage.lower()
try:
return dic[(event, stage)]
except KeyError as e:
logger.error(e)
raise CampaignNameError
@staticmethod @staticmethod
def coalition_get_battles(stage): def coalition_get_battles(event, stage):
""" """
Args: Args:
event (str): Event name.
stage (str): Stage name. stage (str): Stage name.
Returns: Returns:
int: Number of battles int: Number of battles
""" """
if stage == 'tc1': dic = {
return 1 ('coalition_20230323', 'tc1'): 1,
if stage == 'tc2': ('coalition_20230323', 'tc2'): 2,
return 2 ('coalition_20230323', 'tc3'): 3,
if stage == 'tc3': ('coalition_20230323', 'sp'): 1,
return 3 ('coalition_20230323', 'ex'): 1,
return 1 ('coalition_20240627', 'easy'): 1,
('coalition_20240627', 'normal'): 2,
def handle_fleet_preparation(self, stage, fleet): ('coalition_20240627', 'hard'): 3,
('coalition_20240627', 'sp'): 4,
('coalition_20240627', 'ex'): 5,
}
stage = stage.lower() stage = stage.lower()
try:
return dic[(event, stage)]
except KeyError as e:
logger.error(e)
raise CampaignNameError
# No fleet switch in TC1 @staticmethod
if stage in ['tc1', 'sp']: def coalition_get_fleet_preparation(event):
return False
self.coalition_ensure_fleet(fleet)
return True
def enter_map(self, stage, fleet, skip_first_screenshot=True):
""" """
Args: Args:
event (str): Event name.
Returns:
Button:
"""
if event == 'coalition_20230323':
return FROSTFALL_FLEET_PREPARATION
elif event == 'coalition_20240627':
return ACEDEMY_FLEET_PREPARATION
else:
logger.error(f'FLEET_PREPARATION is not defined in event {event}')
raise ScriptError
def handle_fleet_preparation(self, event, stage, mode):
"""
Args:
event (str): Event name.
stage (str): Stage name.
mode (str): 'single' or 'multi'
Returns:
bool: If success
"""
stage = stage.lower()
if event == 'coalition_20230323':
# No fleet switch in TC1
if stage in ['tc1', 'sp']:
return False
if event == 'coalition_20240627':
if stage in ['sp', 'ex']:
return False
self.coalition_ensure_fleet(event, mode)
return True
def enter_map(self, event, stage, mode, skip_first_screenshot=True):
"""
Args:
event (str): Event name such as 'coalition_20230323'
stage (str): Stage name such as 'TC3' stage (str): Stage name such as 'TC3'
fleet (str): 'single' or 'multi' mode (str): 'single' or 'multi'
skip_first_screenshot: skip_first_screenshot:
Pages: Pages:
in: in_coalition in: in_coalition
out: BATTLE_PREPARATION out: BATTLE_PREPARATION
""" """
button = self.coalition_get_entrance(stage) button = self.coalition_get_entrance(event, stage)
fleet_preparation = self.coalition_get_fleet_preparation(event)
campaign_timer = Timer(5) campaign_timer = Timer(5)
fleet_timer = Timer(5) fleet_timer = Timer(5)
campaign_click = 0 campaign_click = 0
@ -154,9 +222,9 @@ class CoalitionUI(Combat):
continue continue
# Fleet preparation # Fleet preparation
if fleet_timer.reached() and self.appear(FLEET_PREPARATION, offset=(20, 50)): if fleet_timer.reached() and self.appear(fleet_preparation, offset=(20, 50)):
self.handle_fleet_preparation(stage, fleet) self.handle_fleet_preparation(event, stage, mode)
self.device.click(FLEET_PREPARATION) self.device.click(fleet_preparation)
fleet_click += 1 fleet_click += 1
fleet_timer.reset() fleet_timer.reset()
campaign_timer.reset() campaign_timer.reset()

View File

@ -15,6 +15,7 @@ from module.retire.retirement import Retirement
from module.statistics.azurstats import DropImage from module.statistics.azurstats import DropImage
from module.template.assets import TEMPLATE_COMBAT_LOADING from module.template.assets import TEMPLATE_COMBAT_LOADING
from module.ui.assets import BACK_ARROW, MUNITIONS_CHECK from module.ui.assets import BACK_ARROW, MUNITIONS_CHECK
from module.ui.page import page_event
class Combat(Level, HPBalancer, Retirement, SubmarineCall, CombatAuto, CombatManual, AutoSearchHandler): class Combat(Level, HPBalancer, Retirement, SubmarineCall, CombatAuto, CombatManual, AutoSearchHandler):

View File

@ -1706,13 +1706,13 @@
], ],
"display": "hide", "display": "hide",
"option_bold": [ "option_bold": [
"event_20201012_cn", "event_20220428_cn",
"event_20220428_cn" "event_20231026_cn"
], ],
"cn": "event_20220428_cn", "cn": "event_20220428_cn",
"en": "event_20220428_cn", "en": "event_20220428_cn",
"jp": "event_20220428_cn", "jp": "event_20220428_cn",
"tw": "event_20201012_cn" "tw": "event_20231026_cn"
}, },
"Mode": { "Mode": {
"type": "select", "type": "select",
@ -2041,13 +2041,13 @@
"event_20240521_cn" "event_20240521_cn"
], ],
"option_bold": [ "option_bold": [
"event_20201012_cn", "event_20220428_cn",
"event_20220428_cn" "event_20231026_cn"
], ],
"cn": "event_20220428_cn", "cn": "event_20220428_cn",
"en": "event_20220428_cn", "en": "event_20220428_cn",
"jp": "event_20220428_cn", "jp": "event_20220428_cn",
"tw": "event_20201012_cn" "tw": "event_20231026_cn"
}, },
"Mode": { "Mode": {
"type": "select", "type": "select",
@ -2491,13 +2491,13 @@
"event_20240521_cn" "event_20240521_cn"
], ],
"option_bold": [ "option_bold": [
"event_20201012_cn", "event_20220428_cn",
"event_20220428_cn" "event_20231026_cn"
], ],
"cn": "event_20220428_cn", "cn": "event_20220428_cn",
"en": "event_20220428_cn", "en": "event_20220428_cn",
"jp": "event_20220428_cn", "jp": "event_20220428_cn",
"tw": "event_20201012_cn" "tw": "event_20231026_cn"
}, },
"Mode": { "Mode": {
"type": "select", "type": "select",
@ -3111,20 +3111,23 @@
"Campaign": { "Campaign": {
"Name": { "Name": {
"type": "input", "type": "input",
"value": "12-4" "value": "dynamic",
"display": "hide"
}, },
"Event": { "Event": {
"type": "state", "type": "state",
"value": "campaign_main", "value": "campaign_main",
"option": [ "option": [
"coalition_20230323" "coalition_20230323",
"coalition_20240627"
], ],
"option_bold": [ "option_bold": [
"coalition_20230323" "coalition_20230323",
"coalition_20240627"
], ],
"cn": "coalition_20230323", "cn": "coalition_20240627",
"en": "coalition_20230323", "en": "coalition_20240627",
"jp": "coalition_20230323", "jp": "coalition_20240627",
"tw": "coalition_20230323" "tw": "coalition_20230323"
}, },
"Mode": { "Mode": {
@ -3163,6 +3166,16 @@
} }
}, },
"Coalition": { "Coalition": {
"Mode": {
"type": "select",
"value": "hard",
"option": [
"easy",
"normal",
"hard",
"ex"
]
},
"Fleet": { "Fleet": {
"type": "select", "type": "select",
"value": "single", "value": "single",
@ -3887,13 +3900,13 @@
"event_20240521_cn" "event_20240521_cn"
], ],
"option_bold": [ "option_bold": [
"event_20201012_cn", "event_20220428_cn",
"event_20220428_cn" "event_20231026_cn"
], ],
"cn": "event_20220428_cn", "cn": "event_20220428_cn",
"en": "event_20220428_cn", "en": "event_20220428_cn",
"jp": "event_20220428_cn", "jp": "event_20220428_cn",
"tw": "event_20201012_cn" "tw": "event_20231026_cn"
}, },
"Mode": { "Mode": {
"type": "select", "type": "select",
@ -4354,13 +4367,13 @@
"event_20240521_cn" "event_20240521_cn"
], ],
"option_bold": [ "option_bold": [
"event_20201012_cn", "event_20220428_cn",
"event_20220428_cn" "event_20231026_cn"
], ],
"cn": "event_20220428_cn", "cn": "event_20220428_cn",
"en": "event_20220428_cn", "en": "event_20220428_cn",
"jp": "event_20220428_cn", "jp": "event_20220428_cn",
"tw": "event_20201012_cn" "tw": "event_20231026_cn"
}, },
"Mode": { "Mode": {
"type": "select", "type": "select",
@ -4821,13 +4834,13 @@
"event_20240521_cn" "event_20240521_cn"
], ],
"option_bold": [ "option_bold": [
"event_20201012_cn", "event_20220428_cn",
"event_20220428_cn" "event_20231026_cn"
], ],
"cn": "event_20220428_cn", "cn": "event_20220428_cn",
"en": "event_20220428_cn", "en": "event_20220428_cn",
"jp": "event_20220428_cn", "jp": "event_20220428_cn",
"tw": "event_20201012_cn" "tw": "event_20231026_cn"
}, },
"Mode": { "Mode": {
"type": "select", "type": "select",
@ -5288,13 +5301,13 @@
"event_20240521_cn" "event_20240521_cn"
], ],
"option_bold": [ "option_bold": [
"event_20201012_cn", "event_20220428_cn",
"event_20220428_cn" "event_20231026_cn"
], ],
"cn": "event_20220428_cn", "cn": "event_20220428_cn",
"en": "event_20220428_cn", "en": "event_20220428_cn",
"jp": "event_20220428_cn", "jp": "event_20220428_cn",
"tw": "event_20201012_cn" "tw": "event_20231026_cn"
}, },
"Mode": { "Mode": {
"type": "select", "type": "select",
@ -5745,13 +5758,13 @@
"event_20240521_cn" "event_20240521_cn"
], ],
"option_bold": [ "option_bold": [
"event_20201012_cn", "event_20220428_cn",
"event_20220428_cn" "event_20231026_cn"
], ],
"cn": "event_20220428_cn", "cn": "event_20220428_cn",
"en": "event_20220428_cn", "en": "event_20220428_cn",
"jp": "event_20220428_cn", "jp": "event_20220428_cn",
"tw": "event_20201012_cn" "tw": "event_20231026_cn"
}, },
"Mode": { "Mode": {
"type": "select", "type": "select",
@ -6370,14 +6383,16 @@
"type": "state", "type": "state",
"value": "campaign_main", "value": "campaign_main",
"option": [ "option": [
"coalition_20230323" "coalition_20230323",
"coalition_20240627"
], ],
"option_bold": [ "option_bold": [
"coalition_20230323" "coalition_20230323",
"coalition_20240627"
], ],
"cn": "coalition_20230323", "cn": "coalition_20240627",
"en": "coalition_20230323", "en": "coalition_20240627",
"jp": "coalition_20230323", "jp": "coalition_20240627",
"tw": "coalition_20230323" "tw": "coalition_20230323"
}, },
"Mode": { "Mode": {
@ -6416,6 +6431,17 @@
} }
}, },
"Coalition": { "Coalition": {
"Mode": {
"type": "select",
"value": "hard",
"option": [
"easy",
"normal",
"hard",
"ex"
],
"display": "hide"
},
"Fleet": { "Fleet": {
"type": "select", "type": "select",
"value": "single", "value": "single",

View File

@ -305,6 +305,9 @@ RaidDaily:
MaritimeEscort: MaritimeEscort:
Enable: true Enable: true
Coalition: Coalition:
Mode:
value: hard
option: [ easy, normal, hard, ex ]
Fleet: Fleet:
value: single value: single
option: [ single, multi ] option: [ single, multi ]

View File

@ -215,6 +215,7 @@ Coalition:
Campaign: Campaign:
Event: Event:
type: state type: state
Name: dynamic
Mode: normal Mode: normal
UseClearMode: true UseClearMode: true
UseFleetLock: true UseFleetLock: true
@ -247,6 +248,9 @@ CoalitionSp:
UseAutoSearch: false UseAutoSearch: false
Use2xBook: false Use2xBook: false
AmbushEvade: true AmbushEvade: true
Coalition:
# CoalitionSp hard-codes Mode='sp'
Mode: hard
StopCondition: StopCondition:
MapAchievement: non_stop MapAchievement: non_stop
StageIncrease: false StageIncrease: false

View File

@ -178,6 +178,7 @@ class GeneratedConfig:
MaritimeEscort_Enable = True MaritimeEscort_Enable = True
# Group `Coalition` # Group `Coalition`
Coalition_Mode = 'hard' # easy, normal, hard, ex
Coalition_Fleet = 'single' # single, multi Coalition_Fleet = 'single' # single, multi
# Group `Commission` # Group `Commission`

View File

@ -79,7 +79,7 @@
"help": "" "help": ""
}, },
"Coalition": { "Coalition": {
"name": "Frostfall", "name": "Little Academy",
"help": "" "help": ""
}, },
"MaritimeEscort": { "MaritimeEscort": {
@ -115,7 +115,7 @@
"help": "" "help": ""
}, },
"CoalitionSp": { "CoalitionSp": {
"name": "Frostfall Daily SP", "name": "Little Academy SP",
"help": "" "help": ""
}, },
"Commission": { "Commission": {
@ -660,6 +660,7 @@
"help": "Automatically selects to the latest event", "help": "Automatically selects to the latest event",
"campaign_main": "campaign_main", "campaign_main": "campaign_main",
"coalition_20230323": "Frostfall", "coalition_20230323": "Frostfall",
"coalition_20240627": "Welcome to Little Academy",
"event_20200227_cn": "Northern Overture", "event_20200227_cn": "Northern Overture",
"event_20200312_cn": "The Solomon Ranger Rerun", "event_20200312_cn": "The Solomon Ranger Rerun",
"event_20200326_cn": "Microlayer Medley", "event_20200326_cn": "Microlayer Medley",
@ -1257,6 +1258,14 @@
"name": "Event Settings", "name": "Event Settings",
"help": "Fleets must be prepared manually in game before running" "help": "Fleets must be prepared manually in game before running"
}, },
"Mode": {
"name": "Mode",
"help": "SP needs to use event daily SP to run",
"easy": "Easy",
"normal": "Normal",
"hard": "Hard",
"ex": "EX"
},
"Fleet": { "Fleet": {
"name": "Fleet", "name": "Fleet",
"help": "", "help": "",

View File

@ -79,8 +79,8 @@
"help": "" "help": ""
}, },
"Coalition": { "Coalition": {
"name": "Task.Coalition.name", "name": "リトル学園",
"help": "Task.Coalition.help" "help": ""
}, },
"MaritimeEscort": { "MaritimeEscort": {
"name": "Maritime Escort", "name": "Maritime Escort",
@ -660,6 +660,7 @@
"help": "Campaign.Event.help", "help": "Campaign.Event.help",
"campaign_main": "campaign_main", "campaign_main": "campaign_main",
"coalition_20230323": "星霜海嵐", "coalition_20230323": "星霜海嵐",
"coalition_20240627": "リトル学園へようこそ",
"event_20200227_cn": "凍絶の北海", "event_20200227_cn": "凍絶の北海",
"event_20200312_cn": "南洋に靡く硝煙(復刻)", "event_20200312_cn": "南洋に靡く硝煙(復刻)",
"event_20200326_cn": "闇靄払う銀翼", "event_20200326_cn": "闇靄払う銀翼",
@ -1257,6 +1258,14 @@
"name": "Coalition._info.name", "name": "Coalition._info.name",
"help": "Coalition._info.help" "help": "Coalition._info.help"
}, },
"Mode": {
"name": "Coalition.Mode.name",
"help": "Coalition.Mode.help",
"easy": "easy",
"normal": "normal",
"hard": "hard",
"ex": "ex"
},
"Fleet": { "Fleet": {
"name": "Coalition.Fleet.name", "name": "Coalition.Fleet.name",
"help": "Coalition.Fleet.help", "help": "Coalition.Fleet.help",

View File

@ -79,7 +79,7 @@
"help": "" "help": ""
}, },
"Coalition": { "Coalition": {
"name": "极地风暴", "name": "童心学院",
"help": "" "help": ""
}, },
"MaritimeEscort": { "MaritimeEscort": {
@ -115,7 +115,7 @@
"help": "" "help": ""
}, },
"CoalitionSp": { "CoalitionSp": {
"name": "极地风暴每日SP", "name": "童心学院每日SP",
"help": "" "help": ""
}, },
"Commission": { "Commission": {
@ -660,6 +660,7 @@
"help": "自动选择至最新的活动", "help": "自动选择至最新的活动",
"campaign_main": "主线图", "campaign_main": "主线图",
"coalition_20230323": "极地风暴", "coalition_20230323": "极地风暴",
"coalition_20240627": "欢迎来到童心学院",
"event_20200227_cn": "北境序曲", "event_20200227_cn": "北境序曲",
"event_20200312_cn": "复刻斯图尔特的硝烟", "event_20200312_cn": "复刻斯图尔特的硝烟",
"event_20200326_cn": "微层混合", "event_20200326_cn": "微层混合",
@ -1257,6 +1258,14 @@
"name": "活动设置", "name": "活动设置",
"help": "出击前必须在游戏内手动配队" "help": "出击前必须在游戏内手动配队"
}, },
"Mode": {
"name": "难度",
"help": "SP图需要使用活动每日SP运行",
"easy": "简单",
"normal": "普通",
"hard": "困难",
"ex": "EX"
},
"Fleet": { "Fleet": {
"name": "出击队伍", "name": "出击队伍",
"help": "", "help": "",

View File

@ -660,6 +660,7 @@
"help": "自動選擇至最新的活動圖", "help": "自動選擇至最新的活動圖",
"campaign_main": "主線圖", "campaign_main": "主線圖",
"coalition_20230323": "極地風暴", "coalition_20230323": "極地風暴",
"coalition_20240627": "Welcome to Little Academy",
"event_20200227_cn": "Northern Overture", "event_20200227_cn": "Northern Overture",
"event_20200312_cn": "斯圖爾特的硝煙", "event_20200312_cn": "斯圖爾特的硝煙",
"event_20200326_cn": "Microlayer Medley", "event_20200326_cn": "Microlayer Medley",
@ -719,7 +720,7 @@
"event_20230803_cn": "奏響鳶尾之歌", "event_20230803_cn": "奏響鳶尾之歌",
"event_20230817_cn": "愚者的天平", "event_20230817_cn": "愚者的天平",
"event_20230914_cn": "Effulgence Before Eclipse", "event_20230914_cn": "Effulgence Before Eclipse",
"event_20231026_cn": "Tempesta and the Fountain of Youth", "event_20231026_cn": "飓風與青春之泉",
"event_20231123_cn": "蒼閃忍法帖", "event_20231123_cn": "蒼閃忍法帖",
"event_20231221_cn": "Light-Chasing Sea of Stars", "event_20231221_cn": "Light-Chasing Sea of Stars",
"event_20240229_cn": "Snowrealm Peregrination", "event_20240229_cn": "Snowrealm Peregrination",
@ -1257,6 +1258,14 @@
"name": "活動設定", "name": "活動設定",
"help": "出擊前必須在遊戲內手動配隊" "help": "出擊前必須在遊戲內手動配隊"
}, },
"Mode": {
"name": "難度",
"help": "SP圖需要使用活動每日SP運行",
"easy": "簡單",
"normal": "普通",
"hard": "困難",
"ex": "EX"
},
"Fleet": { "Fleet": {
"name": "出擊隊伍", "name": "出擊隊伍",
"help": "", "help": "",

View File

@ -67,7 +67,44 @@ def filepath_config(filename, mod_name='alas'):
def filepath_code(): def filepath_code():
return './module/config/config_generated.py' return './module/config/config_generated.py'
def show_function_call():
"""
INFO 21:07:31.554 Function calls:
<string> L1 <module>
spawn.py L116 spawn_main()
spawn.py L129 _main()
process.py L314 _bootstrap()
process.py L108 run()
process_manager.py L149 run_process()
alas.py L285 loop()
alas.py L69 run()
src.py L55 rogue()
rogue.py L36 run()
rogue.py L18 rogue_once()
entry.py L335 rogue_world_enter()
path.py L193 rogue_path_select()
"""
import os
import traceback
stack = traceback.extract_stack()
func_list = []
for row in stack:
filename, line_number, function_name, _ = row
filename = os.path.basename(filename)
# /tasks/character/switch.py:64 character_update()
func_list.append([filename, str(line_number), function_name])
max_filename = max([len(row[0]) for row in func_list])
max_linenum = max([len(row[1]) for row in func_list]) + 1
def format_(file, line, func):
file = file.rjust(max_filename, " ")
line = f'L{line}'.rjust(max_linenum, " ")
if not func.startswith('<'):
func = f'{func}()'
return f'{file} {line} {func}'
func_list = [f'\n{format_(*row)}' for row in func_list]
print('Function calls:' + ''.join(func_list))
def read_file(file): def read_file(file):
""" """
Read a file, support both .yaml and .json format. Read a file, support both .yaml and .json format.

View File

@ -173,8 +173,8 @@ class Benchmark(DaemonBase, CampaignUI):
def get_test_methods(self) -> t.Tuple[t.Tuple[str], t.Tuple[str]]: def get_test_methods(self) -> t.Tuple[t.Tuple[str], t.Tuple[str]]:
device = self.config.Benchmark_DeviceType device = self.config.Benchmark_DeviceType
# device == 'emulator' # device == 'emulator'
screenshot = ['ADB', 'ADB_nc', 'uiautomator2', 'aScreenCap', 'aScreenCap_nc', 'DroidCast', 'DroidCast_raw'] screenshot = ['DroidCast_raw']
click = ['ADB', 'uiautomator2', 'minitouch'] click = ['ADB', 'uiautomator2', 'minitouch', 'MaaTouch']
def remove(*args): def remove(*args):
return [l for l in screenshot if l not in args] return [l for l in screenshot if l not in args]
@ -205,8 +205,8 @@ class Benchmark(DaemonBase, CampaignUI):
def run(self): def run(self):
self.config.override(Emulator_ScreenshotMethod='ADB') self.config.override(Emulator_ScreenshotMethod='ADB')
self.device.uninstall_minicap() self.device.uninstall_minicap()
self.ui_goto_campaign() # self.ui_goto_campaign()
self.campaign_set_chapter('7-2') # self.campaign_set_chapter('7-2')
logger.attr('DeviceType', self.config.Benchmark_DeviceType) logger.attr('DeviceType', self.config.Benchmark_DeviceType)
logger.attr('TestScene', self.config.Benchmark_TestScene) logger.attr('TestScene', self.config.Benchmark_TestScene)

View File

@ -7,6 +7,7 @@ from module.map.map_operation import FLEET_PREPARATION, MAP_PREPARATION
class AzurLaneDaemon(DaemonBase, CampaignBase): class AzurLaneDaemon(DaemonBase, CampaignBase):
def run(self): def run(self):
self.config.override(Emotion_Mode='ignore')
while 1: while 1:
self.device.screenshot() self.device.screenshot()
@ -61,6 +62,8 @@ class AzurLaneDaemon(DaemonBase, CampaignBase):
# End # End
# No end condition, stop it manually. # No end condition, stop it manually.
if self.handle_popup_confirm():
continue
return True return True

View File

@ -14,6 +14,7 @@ from adbutils.errors import AdbError
from module.base.decorator import Config, cached_property, del_cached_property, run_once from module.base.decorator import Config, cached_property, del_cached_property, run_once
from module.base.utils import ensure_time from module.base.utils import ensure_time
from module.config.config import AzurLaneConfig
from module.config.server import VALID_CHANNEL_PACKAGE, VALID_PACKAGE, set_server from module.config.server import VALID_CHANNEL_PACKAGE, VALID_PACKAGE, set_server
from module.device.connection_attr import ConnectionAttr from module.device.connection_attr import ConnectionAttr
from module.device.method.utils import (PackageNotInstalled, RETRY_TRIES, get_serial_pair, handle_adb_error, from module.device.method.utils import (PackageNotInstalled, RETRY_TRIES, get_serial_pair, handle_adb_error,
@ -1014,3 +1015,16 @@ class Connection(ConnectionAttr):
f'Multiple AzurLane packages found, auto package detection cannot decide which to choose, ' f'Multiple AzurLane packages found, auto package detection cannot decide which to choose, '
'please copy one of the available devices listed above to Alas.Emulator.PackageName') 'please copy one of the available devices listed above to Alas.Emulator.PackageName')
raise RequestHumanTakeover raise RequestHumanTakeover
if __name__ == '__main__':
cfg = AzurLaneConfig('alas')
cfg.override(Emulator_Serial='127.0.0.1:16416')
self = Connection(cfg)
with self.adb_client.open as c:
list_cmd = f"framebuffer:"
c.send_command(list_cmd)
c.check_okay()
version = c.read_string_block()
print(version)

View File

@ -306,3 +306,12 @@ class Device(Screenshot, Control, AppControl):
super().app_stop() super().app_stop()
self.stuck_record_clear() self.stuck_record_clear()
self.click_record_clear() self.click_record_clear()
if __name__ == '__main__':
self = Device('alas')
# self.maatouch_uninstall()
# self.maatouch_install()
# self.click_maatouch(300, 300)
# self.click_maatouch(300, 300)
# self.drag_maatouch((800, 300), (300, 300))
self.swipe_minitouch((300, 300), (800, 300))
self.swipe_minitouch((800, 300), (300, 300))

View File

@ -344,3 +344,12 @@ class DroidCast(Uiautomator2):
for proc in self._iter_droidcast_proc(): for proc in self._iter_droidcast_proc():
logger.info(f'Kill pid={proc.pid}') logger.info(f'Kill pid={proc.pid}')
self.adb_shell(['kill', '-s', 9, proc.pid]) self.adb_shell(['kill', '-s', 9, proc.pid])
if __name__ == '__main__':
self = DroidCast('alas')
# self.adb_shell(["rm", self.config.DROIDCAST_FILEPATH_REMOTE])
# self.droidcast_stop()
for _ in range(5):
self.image = self.screenshot_droidcast_raw()
from PIL import Image
Image.fromarray(self.image).show()

View File

@ -190,6 +190,6 @@ class SettingExtractor:
if __name__ == '__main__': if __name__ == '__main__':
# Path to AzurLaneLuaScripts\CN # Path to AzurLaneLuaScripts\CN
FOLDER = r'' FOLDER = r'E:\ProgramData\Pycharm\AzurLaneLuaScripts\CN'
ex = SettingExtractor() ex = SettingExtractor()
ex.generate(FOLDER) ex.generate(FOLDER)

View File

@ -10,6 +10,12 @@ class GameSettingsGenerated:
# PlayerPrefs.GetInt("autoBotIsAcitve" .. slot6, 0) # PlayerPrefs.GetInt("autoBotIsAcitve" .. slot6, 0)
autoBotIsAcitve = Field(formatter=int, default=0, regex='autoBotIsAcitve(.*)') autoBotIsAcitve = Field(formatter=int, default=0, regex='autoBotIsAcitve(.*)')
# /controller/command/stage/trackingcommand.lua
# PlayerPrefs.GetString("remaster_tip")
remaster_tip = Field(formatter=str, default='', regex='remaster_tip')
# PlayerPrefs.GetInt("chapter_autofight_flag_" .. uv0.id, 1)
chapter_autofight_flag = Field(formatter=int, default=1, regex='chapter_autofight_flag_(.*)')
# /gamecfg/activity/entrancedata.lua # /gamecfg/activity/entrancedata.lua
# PlayerPrefs.GetString("permanent_time", "") # PlayerPrefs.GetString("permanent_time", "")
permanent_time = Field(formatter=str, default='', regex='permanent_time') permanent_time = Field(formatter=str, default='', regex='permanent_time')
@ -94,6 +100,10 @@ class GameSettingsGenerated:
# PlayerPrefs.GetInt(AUTOFIGHT_DOWN_FRAME, 0) # PlayerPrefs.GetInt(AUTOFIGHT_DOWN_FRAME, 0)
pass # Unknown pass # Unknown
# /mod/experiment/world/model/worldatlas.lua
# PlayerPrefs.GetInt(string.format("world_new_shop_unlock_count_in_port_%d_%d_%d", getProxy(PlayerProxy):getRawData().id, nowWorld().activateCount, slot1), -1)
world_new_shop_unlock_count_in_port__d__d__d = Field(formatter=int, default=0, regex='world_new_shop_unlock_count_in_port_%d_%d_%d')
# /mod/experiment/world/model/worldconst.lua # /mod/experiment/world/model/worldconst.lua
# PlayerPrefs.GetInt("world_help_progress") # PlayerPrefs.GetInt("world_help_progress")
world_help_progress = Field(formatter=int, default=0, regex='world_help_progress') world_help_progress = Field(formatter=int, default=0, regex='world_help_progress')
@ -123,12 +133,14 @@ class GameSettingsGenerated:
auto_switch_mode = Field(formatter=int, default=0, regex='auto_switch_mode') auto_switch_mode = Field(formatter=int, default=0, regex='auto_switch_mode')
# PlayerPrefs.GetString("auto_switch_difficult_safe", "only") # PlayerPrefs.GetString("auto_switch_difficult_safe", "only")
auto_switch_difficult_safe = Field(formatter=str, default='only', regex='auto_switch_difficult_safe') auto_switch_difficult_safe = Field(formatter=str, default='only', regex='auto_switch_difficult_safe')
# PlayerPrefs.GetInt("auto_switch_mode", 0)
pass # Duplicate
# PlayerPrefs.GetString("auto_switch_difficult_base", "all") # PlayerPrefs.GetString("auto_switch_difficult_base", "all")
auto_switch_difficult_base = Field(formatter=str, default='all', regex='auto_switch_difficult_base') auto_switch_difficult_base = Field(formatter=str, default='all', regex='auto_switch_difficult_base')
# PlayerPrefs.GetString("auto_switch_difficult_safe", "only")
# /mod/experiment/world/view/wsmapright.lua
# PlayerPrefs.GetInt("world_skip_precombat", 0)
pass # Duplicate pass # Duplicate
# PlayerPrefs.GetString("auto_switch_difficult_treasure", "all")
auto_switch_difficult_treasure = Field(formatter=str, default='all', regex='auto_switch_difficult_treasure')
# /model/const/chapterconst.lua # /model/const/chapterconst.lua
# PlayerPrefs.GetInt("chapter_skip_battle") # PlayerPrefs.GetInt("chapter_skip_battle")
@ -221,6 +233,10 @@ class GameSettingsGenerated:
SetScreenRatio = Field(formatter=float, default=0.0, regex='SetScreenRatio') SetScreenRatio = Field(formatter=float, default=0.0, regex='SetScreenRatio')
# PlayerPrefs.GetInt("story_autoplay_flag", 0) # PlayerPrefs.GetInt("story_autoplay_flag", 0)
story_autoplay_flag = Field(formatter=int, default=0, regex='story_autoplay_flag') story_autoplay_flag = Field(formatter=int, default=0, regex='story_autoplay_flag')
# PlayerPrefs.GetInt("ActBossTipLastTime", 0)
ActBossTipLastTime = Field(formatter=int, default=0, regex='ActBossTipLastTime')
# PlayerPrefs.GetInt("ActBossTip", 0)
ActBossTip = Field(formatter=int, default=0, regex='ActBossTip')
# PlayerPrefs.GetInt("collection_Help", 0) # PlayerPrefs.GetInt("collection_Help", 0)
collection_Help = Field(formatter=int, default=0, regex='collection_Help') collection_Help = Field(formatter=int, default=0, regex='collection_Help')
# PlayerPrefs.GetInt("main_scene_word_toggle", 1) # PlayerPrefs.GetInt("main_scene_word_toggle", 1)
@ -251,6 +267,8 @@ class GameSettingsGenerated:
event_act_help1 = Field(formatter=int, default=0, regex='event_act_help1(.*)') event_act_help1 = Field(formatter=int, default=0, regex='event_act_help1(.*)')
# PlayerPrefs.GetInt("story_speed_flag" .. ((not getProxy(PlayerProxy) or getProxy(PlayerProxy):getRawData().id) and 1), 0) # PlayerPrefs.GetInt("story_speed_flag" .. ((not getProxy(PlayerProxy) or getProxy(PlayerProxy):getRawData().id) and 1), 0)
story_speed_flag = Field(formatter=int, default=0, regex='story_speed_flag(.*)') story_speed_flag = Field(formatter=int, default=0, regex='story_speed_flag(.*)')
# PlayerPrefs.GetInt("Painting_Download_Prefs", 0)
Painting_Download_Prefs = Field(formatter=int, default=0, regex='Painting_Download_Prefs')
# PlayerPrefs.GetInt("tipLimitSkinShopTime_", 0) # PlayerPrefs.GetInt("tipLimitSkinShopTime_", 0)
tipLimitSkinShopTime = Field(formatter=int, default=0, regex='tipLimitSkinShopTime_') tipLimitSkinShopTime = Field(formatter=int, default=0, regex='tipLimitSkinShopTime_')
# PlayerPrefs.GetString("_WorldBossProgressTipFlag_", slot1[1] .. "&" .. slot1[1] + slot1[2]) # PlayerPrefs.GetString("_WorldBossProgressTipFlag_", slot1[1] .. "&" .. slot1[1] + slot1[2])
@ -265,6 +283,18 @@ class GameSettingsGenerated:
IsTipNewTheme = Field(formatter=int, default=0, regex='(.*)IsTipNewTheme(.*)') IsTipNewTheme = Field(formatter=int, default=0, regex='(.*)IsTipNewTheme(.*)')
# PlayerPrefs.GetString(getProxy(PlayerProxy):getRawData().id .. "IsTipNewGenFurniture") # PlayerPrefs.GetString(getProxy(PlayerProxy):getRawData().id .. "IsTipNewGenFurniture")
IsTipNewGenFurniture = Field(formatter=str, default='', regex='(.*)IsTipNewGenFurniture') IsTipNewGenFurniture = Field(formatter=str, default='', regex='(.*)IsTipNewGenFurniture')
# PlayerPrefs.GetString("RandomFlagShipList" .. slot1:getRawData().id, "")
RandomFlagShipList = Field(formatter=str, default='', regex='RandomFlagShipList(.*)')
# PlayerPrefs.GetInt("RandomFlagShipTime" .. getProxy(PlayerProxy):getRawData().id, 0)
RandomFlagShipTime = Field(formatter=int, default=0, regex='RandomFlagShipTime(.*)')
# PlayerPrefs.GetInt("AutoBotCOFlag" .. getProxy(PlayerProxy):getRawData().id, 0)
AutoBotCOFlag = Field(formatter=int, default=0, regex='AutoBotCOFlag(.*)')
# PlayerPrefs.GetInt("WorkbenchDailyTip" .. getProxy(PlayerProxy):getRawData().id, 0)
WorkbenchDailyTip = Field(formatter=int, default=0, regex='WorkbenchDailyTip(.*)')
# PlayerPrefs.GetInt(BATTLERESULT_SKIP_DISPAY_PAINTING)
pass # Unknown
# PlayerPrefs.GetInt(BATTLERESULT_DISPAY_PAINTING, 0)
pass # Unknown
# /model/proxy/technologyproxy.lua # /model/proxy/technologyproxy.lua
# PlayerPrefs.GetInt("technology_version") # PlayerPrefs.GetInt("technology_version")
@ -293,11 +323,13 @@ class GameSettingsGenerated:
# /model/vo/activity.lua # /model/vo/activity.lua
# PlayerPrefs.GetInt("ACTIVITY_TYPE_EVENT_" .. slot0.id .. "_" .. getProxy(PlayerProxy):getData().id) # PlayerPrefs.GetInt("ACTIVITY_TYPE_EVENT_" .. slot0.id .. "_" .. getProxy(PlayerProxy):getData().id)
ACTIVITY_TYPE_EVENT = Field(formatter=int, default=0, regex='ACTIVITY_TYPE_EVENT_(.*)_(.*)') ACTIVITY_TYPE_EVENT = Field(formatter=int, default=0, regex='ACTIVITY_TYPE_EVENT_(.*)_(.*)')
# PlayerPrefs.GetInt("DAY_TIP_" .. uv0.id .. "_" .. getProxy(PlayerProxy):getData().id .. "_" .. uv0:getDayIndex())
DAY_TIP = Field(formatter=int, default=0, regex='DAY_TIP_(.*)_(.*)_(.*)')
# /model/vo/chapter.lua # /model/vo/chapter.lua
# PlayerPrefs.GetInt("chapter_quickPlay_flag_" .. slot0.id, 0) # PlayerPrefs.GetInt("chapter_quickPlay_flag_" .. slot0.id, 0)
chapter_quickPlay_flag = Field(formatter=int, default=0, regex='chapter_quickPlay_flag_(.*)') chapter_quickPlay_flag = Field(formatter=int, default=0, regex='chapter_quickPlay_flag_(.*)')
# PlayerPrefs.GetInt(uv0.GetChapterLastFleetCacheKey(slot0), 0) # PlayerPrefs.GetInt(Chapter.GetSPOperationItemCacheKey(slot0.id), 0)
pass # Unknown pass # Unknown
# /model/vo/chapterfleet.lua # /model/vo/chapterfleet.lua
@ -313,6 +345,10 @@ class GameSettingsGenerated:
paint_hide_other_obj = Field(formatter=int, default=0, regex='paint_hide_other_obj_(.*)') paint_hide_other_obj = Field(formatter=int, default=0, regex='paint_hide_other_obj_(.*)')
# PlayerPrefs.GetString("equipment_record" .. "_" .. slot1 .. "_" .. slot0.id) # PlayerPrefs.GetString("equipment_record" .. "_" .. slot1 .. "_" .. slot0.id)
equipment_record = Field(formatter=str, default='', regex='equipment_record_(.*)_(.*)') equipment_record = Field(formatter=str, default='', regex='equipment_record_(.*)_(.*)')
# PlayerPrefs.GetString("spweapon_record" .. "_" .. slot1 .. "_" .. slot0.id, "")
spweapon_record = Field(formatter=str, default='', regex='spweapon_record_(.*)_(.*)')
# PlayerPrefs.GetInt("SHIP_NAME_COLOR", PLATFORM_CODE == PLATFORM_CH and 1 or 0)
SHIP_NAME_COLOR = Field(formatter=int, default=0, regex='SHIP_NAME_COLOR')
# /model/vo/guild/events/guildmission.lua # /model/vo/guild/events/guildmission.lua
# PlayerPrefs.GetInt("guild_mission_formation_tip" .. slot0.configId, 0) # PlayerPrefs.GetInt("guild_mission_formation_tip" .. slot0.configId, 0)
@ -322,17 +358,27 @@ class GameSettingsGenerated:
# PlayerPrefs.GetInt(slot0:prefKey()) # PlayerPrefs.GetInt(slot0:prefKey())
pass # Unknown pass # Unknown
# /model/vo/task/activitytask.lua
# PlayerPrefs.GetInt("ryza_task_" .. getProxy(PlayerProxy):getRawData().id .. "_" .. slot0.id)
ryza_task = Field(formatter=int, default=0, regex='ryza_task_(.*)_(.*)')
# PlayerPrefs.GetInt("ryza_task_" .. getProxy(PlayerProxy):getRawData().id .. "_" .. slot0.id)
pass # Duplicate
# /support/helpers/m02.lua # /support/helpers/m02.lua
# PlayerPrefs.GetInt("paint_hide_other_obj_" .. slot1, 0) # PlayerPrefs.GetInt("paint_hide_other_obj_" .. slot1, 0)
pass # Duplicate pass # Duplicate
# PlayerPrefs.GetInt("paint_hide_other_obj_" .. slot1, 0) # PlayerPrefs.GetInt("paint_hide_other_obj_" .. slot1, 0)
pass # Duplicate pass # Duplicate
# PlayerPrefs.GetInt("paint_hide_other_obj_" .. slot1, 0)
pass # Duplicate
# /support/utils/hxset.lua # /support/utils/hxset.lua
# PlayerPrefs.GetInt(uv0.codeModeKey) # PlayerPrefs.GetInt(uv0.codeModeKey)
pass # Unknown pass # Unknown
# PlayerPrefs.GetInt("localization_use", 0) # PlayerPrefs.GetInt("localization_time_1_" .. getProxy(PlayerProxy):getData().id, 0)
localization_use = Field(formatter=int, default=0, regex='localization_use') localization_time_1 = Field(formatter=int, default=0, regex='localization_time_1_(.*)')
# PlayerPrefs.GetInt("localization_time_2_" .. slot2, 0)
localization_time_2 = Field(formatter=int, default=0, regex='localization_time_2_(.*)')
# /view/activity/activitymediator.lua # /view/activity/activitymediator.lua
# PlayerPrefs.GetString("permanent_time", "") # PlayerPrefs.GetString("permanent_time", "")
@ -354,9 +400,33 @@ class GameSettingsGenerated:
# PlayerPrefs.GetInt(string.format("cursing_%d_task_week_%d", slot0.activity.id, slot5), 0) # PlayerPrefs.GetInt(string.format("cursing_%d_task_week_%d", slot0.activity.id, slot5), 0)
cursing__d_task_week__d = Field(formatter=int, default=0, regex='cursing_%d_task_week_%d') cursing__d_task_week__d = Field(formatter=int, default=0, regex='cursing_%d_task_week_%d')
# /view/activity/refluxmediator.lua # /view/activity/ryzataskscene.lua
# PlayerPrefs.GetInt(slot6.id .. "_" .. slot2.data2) # PlayerPrefs.GetInt("ryza_task_help_" .. getProxy(PlayerProxy):getRawData().id)
pass # Unknown ryza_task_help = Field(formatter=int, default=0, regex='ryza_task_help_(.*)')
# /view/activity/atelier/atelierbufflayer.lua
# PlayerPrefs.GetInt("first_enter_ryza_buff_" .. getProxy(PlayerProxy):getRawData().id, 0)
first_enter_ryza_buff = Field(formatter=int, default=0, regex='first_enter_ryza_buff_(.*)')
# /view/activity/atelier/ateliercompositescene.lua
# PlayerPrefs.GetInt("first_enter_ryza_atelier_" .. getProxy(PlayerProxy):getRawData().id, 0)
first_enter_ryza_atelier = Field(formatter=int, default=0, regex='first_enter_ryza_atelier_(.*)')
# /view/activity/backhills/anniversaryisland2023/anniversaryislandcomposite2023scene.lua
# PlayerPrefs.GetInt("workbench_show_composite_avaliable", 0)
workbench_show_composite_avaliable = Field(formatter=int, default=0, regex='workbench_show_composite_avaliable')
# /view/activity/backhills/anniversaryisland2023/anniversaryislandhotspringscene.lua
# PlayerPrefs.GetString("hotspring_ship_pos_2023", "")
hotspring_ship_pos_2023 = Field(formatter=str, default='', regex='hotspring_ship_pos_2023')
# /view/activity/backhills/newyearfestival/newyearhotspringscene.lua
# PlayerPrefs.GetString("hotspring_ship_pos", "")
hotspring_ship_pos = Field(formatter=str, default='', regex='hotspring_ship_pos')
# /view/activity/backhills/springfestival2023/fireworkpanellayer.lua
# PlayerPrefs.GetInt("fireworks_" .. slot0.playerId .. "_pos_" .. slot5)
fireworks = Field(formatter=int, default=0, regex='fireworks_(.*)_pos_(.*)')
# /view/activity/banaiactivity/blackwhitegridlayer.lua # /view/activity/banaiactivity/blackwhitegridlayer.lua
# PlayerPrefs.GetString("BlackWhiteGridMapData-" .. slot1.id .. "-" .. slot0.player.id, "") # PlayerPrefs.GetString("BlackWhiteGridMapData-" .. slot1.id .. "-" .. slot0.player.id, "")
@ -364,6 +434,10 @@ class GameSettingsGenerated:
# PlayerPrefs.GetInt("BlackWhiteGridMapIndex-" .. slot0.player.id, 1) # PlayerPrefs.GetInt("BlackWhiteGridMapIndex-" .. slot0.player.id, 1)
BlackWhiteGridMapIndex = Field(formatter=int, default=1, regex='BlackWhiteGridMapIndex-(.*)') BlackWhiteGridMapIndex = Field(formatter=int, default=1, regex='BlackWhiteGridMapIndex-(.*)')
# /view/activity/bossrush/bossrushfleetselectmediator.lua
# PlayerPrefs.GetInt("series_mode_flag" .. slot1.id, -1)
series_mode_flag = Field(formatter=int, default=-1, regex='series_mode_flag(.*)')
# /view/activity/decodegame/game/decodegameview.lua # /view/activity/decodegame/game/decodegameview.lua
# PlayerPrefs.GetInt("DecodeGameHelpBg" .. getProxy(PlayerProxy):getRawData().id .. slot1, 0) # PlayerPrefs.GetInt("DecodeGameHelpBg" .. getProxy(PlayerProxy):getRawData().id .. slot1, 0)
DecodeGameHelpBg = Field(formatter=int, default=0, regex='DecodeGameHelpBg(.*)(.*)') DecodeGameHelpBg = Field(formatter=int, default=0, regex='DecodeGameHelpBg(.*)(.*)')
@ -388,6 +462,10 @@ class GameSettingsGenerated:
# PlayerPrefs.GetInt("SuperBurinPopUp_" .. getProxy(PlayerProxy):getRawData().id, 0) # PlayerPrefs.GetInt("SuperBurinPopUp_" .. getProxy(PlayerProxy):getRawData().id, 0)
SuperBurinPopUp = Field(formatter=int, default=0, regex='SuperBurinPopUp_(.*)') SuperBurinPopUp = Field(formatter=int, default=0, regex='SuperBurinPopUp_(.*)')
# /view/activity/subpages/cardpuzzlepage.lua
# PlayerPrefs.GetInt("DAY_TIP_" .. slot0.activity.id .. "_" .. getProxy(PlayerProxy):getData().id .. "_" .. slot0.activity:getDayIndex())
pass # Duplicate
# /view/activity/subpages/collectioneventptpage.lua # /view/activity/subpages/collectioneventptpage.lua
# PlayerPrefs.GetInt("ACTIVITY_TYPE_EVENT_" .. slot0.activity.id .. "_" .. getProxy(PlayerProxy):getData().id) # PlayerPrefs.GetInt("ACTIVITY_TYPE_EVENT_" .. slot0.activity.id .. "_" .. getProxy(PlayerProxy):getData().id)
pass # Duplicate pass # Duplicate
@ -428,6 +506,10 @@ class GameSettingsGenerated:
# PlayerPrefs.GetInt("wwf_todo_task_num_" .. getProxy(PlayerProxy):getData().id) # PlayerPrefs.GetInt("wwf_todo_task_num_" .. getProxy(PlayerProxy):getData().id)
pass # Duplicate pass # Duplicate
# /view/activity/worldboss/activitybosstotalrewardpanel.lua
# PlayerPrefs.GetInt(AUTO_BATTLE_LABEL, 0)
pass # Unknown
# /view/activity/worldinpicture/worldinpicturescene.lua # /view/activity/worldinpicture/worldinpicturescene.lua
# PlayerPrefs.GetString("WorldInPictureScene_1" .. getProxy(PlayerProxy):getRawData().id, "0#0") # PlayerPrefs.GetString("WorldInPictureScene_1" .. getProxy(PlayerProxy):getRawData().id, "0#0")
WorldInPictureScene_1 = Field(formatter=str, default='0#0', regex='WorldInPictureScene_1(.*)') WorldInPictureScene_1 = Field(formatter=str, default='0#0', regex='WorldInPictureScene_1(.*)')
@ -457,12 +539,18 @@ class GameSettingsGenerated:
chapter_submarine_ai_type = Field(formatter=int, default=0, regex='chapter_submarine_ai_type_(.*)') chapter_submarine_ai_type = Field(formatter=int, default=0, regex='chapter_submarine_ai_type_(.*)')
# /view/battle/levelscene.lua # /view/battle/levelscene.lua
# PlayerPrefs.GetInt("ex_mapId") # PlayerPrefs.GetInt("ex_mapId", 0)
ex_mapId = Field(formatter=int, default=0, regex='ex_mapId') ex_mapId = Field(formatter=int, default=0, regex='ex_mapId')
# PlayerPrefs.GetString("remaster_tip") # PlayerPrefs.GetInt("first_enter_ryza_buff_" .. getProxy(PlayerProxy):getRawData().id, 0)
remaster_tip = Field(formatter=str, default='', regex='remaster_tip') pass # Duplicate
# PlayerPrefs.GetInt("chapter_autofight_flag_" .. uv2.id, 1)
chapter_autofight_flag = Field(formatter=int, default=1, regex='chapter_autofight_flag_(.*)') # /view/battle/battleresult/pages/newbattleresultdisplayawardpage.lua
# PlayerPrefs.GetInt(DISPLAY_SHIP_GET_EFFECT)
pass # Unknown
# /view/battle/battleresult/util/newbattleresultdataextender.lua
# PlayerPrefs.GetInt(AUTO_BATTLE_LABEL, 0)
pass # Unknown
# /view/collection/galleryconst.lua # /view/collection/galleryconst.lua
# PlayerPrefs.GetInt(uv0.Set_BG_Func_Save_Tag .. getProxy(PlayerProxy):getRawData().id) # PlayerPrefs.GetInt(uv0.Set_BG_Func_Save_Tag .. getProxy(PlayerProxy):getRawData().id)
@ -484,12 +572,16 @@ class GameSettingsGenerated:
# PlayerPrefs.GetInt("Tec_Ship_Gift_Enter_Tag", 0) # PlayerPrefs.GetInt("Tec_Ship_Gift_Enter_Tag", 0)
Tec_Ship_Gift_Enter_Tag = Field(formatter=int, default=0, regex='Tec_Ship_Gift_Enter_Tag') Tec_Ship_Gift_Enter_Tag = Field(formatter=int, default=0, regex='Tec_Ship_Gift_Enter_Tag')
# /view/level/levelfleetview.lua # /view/level/levelcontinuousoperationtotalrewardpanel.lua
# PlayerPrefs.GetInt("autoFight_firstUse_sp", 0) # PlayerPrefs.GetInt("autoFight_firstUse_sp", 0)
autoFight_firstUse_sp = Field(formatter=int, default=0, regex='autoFight_firstUse_sp') autoFight_firstUse_sp = Field(formatter=int, default=0, regex='autoFight_firstUse_sp')
# /view/level/levelfleetview.lua
# PlayerPrefs.GetInt("autoFight_firstUse_sp", 0)
pass # Duplicate
# PlayerPrefs.GetInt(uv0, 1) # PlayerPrefs.GetInt(uv0, 1)
pass # Unknown pass # Unknown
# PlayerPrefs.GetInt(uv0, 1) # PlayerPrefs.GetInt(uv1, 1)
pass # Unknown pass # Unknown
# PlayerPrefs.GetInt("lastFleetDuty_" .. (slot0.chapter.id or 0), 0) # PlayerPrefs.GetInt("lastFleetDuty_" .. (slot0.chapter.id or 0), 0)
lastFleetDuty = Field(formatter=int, default=0, regex='lastFleetDuty_(.*)') lastFleetDuty = Field(formatter=int, default=0, regex='lastFleetDuty_(.*)')
@ -503,15 +595,13 @@ class GameSettingsGenerated:
pass # Unknown pass # Unknown
# PlayerPrefs.GetInt(uv0, 1) # PlayerPrefs.GetInt(uv0, 1)
pass # Unknown pass # Unknown
# PlayerPrefs.GetInt(Chapter.GetSPOperationItemCacheKey(slot0.chapter.id), 0)
pass # Unknown
# /view/level/levelinfoview.lua # /view/level/levelinfoview.lua
# PlayerPrefs.GetInt("chapter_loop_flag_" .. slot1.id, -1) # PlayerPrefs.GetInt("chapter_loop_flag_" .. slot1.id, -1)
chapter_loop_flag = Field(formatter=int, default=-1, regex='chapter_loop_flag_(.*)') chapter_loop_flag = Field(formatter=int, default=-1, regex='chapter_loop_flag_(.*)')
# PlayerPrefs.GetInt("chapter_autofight_flag_" .. slot1.id, 1) # PlayerPrefs.GetInt("chapter_autofight_flag_" .. slot1.id, 1)
pass # Duplicate pass # Duplicate
# PlayerPrefs.GetInt("chapter_quickPlay_flag_" .. slot1.id, 0) # PlayerPrefs.GetInt("chapter_quickPlay_flag_" .. slot1.id, 1)
pass # Duplicate pass # Duplicate
# /view/level/leveloperationitempanel.lua # /view/level/leveloperationitempanel.lua
@ -534,18 +624,40 @@ class GameSettingsGenerated:
# PlayerPrefs.GetInt("help_displayed_on_" .. uv1.id, 0) # PlayerPrefs.GetInt("help_displayed_on_" .. uv1.id, 0)
help_displayed_on = Field(formatter=int, default=0, regex='help_displayed_on_(.*)') help_displayed_on = Field(formatter=int, default=0, regex='help_displayed_on_(.*)')
# /view/limitchallenge/limitchallengeconst.lua
# PlayerPrefs.GetInt(uv0.RedPointKey, 0)
pass # Unknown
# /view/login/loginscene.lua # /view/login/loginscene.lua
# PlayerPrefs.GetString("op_ver", "") # PlayerPrefs.GetString("op_ver", "")
op_ver = Field(formatter=str, default='', regex='op_ver') op_ver = Field(formatter=str, default='', regex='op_ver')
# /view/main/mailmediator.lua
# PlayerPrefs.GetInt("help_research_package", 0)
help_research_package = Field(formatter=int, default=0, regex='help_research_package')
# /view/main/trainingcampscene.lua # /view/main/trainingcampscene.lua
# PlayerPrefs.GetInt("TrainCamp_Tec_Catchup_First_Tag", 0) # PlayerPrefs.GetInt("TrainCamp_Tec_Catchup_First_Tag", 0)
TrainCamp_Tec_Catchup_First_Tag = Field(formatter=int, default=0, regex='TrainCamp_Tec_Catchup_First_Tag') TrainCamp_Tec_Catchup_First_Tag = Field(formatter=int, default=0, regex='TrainCamp_Tec_Catchup_First_Tag')
# /view/main/skinshop/skinshopscene.lua
# PlayerPrefs.GetInt("skinShop#l2dPreViewToggle" .. getProxy(PlayerProxy):getRawData().id, 0)
skinShop#l2dPreViewToggle = Field(formatter=int, default=0, regex='skinShop#l2dPreViewToggle(.*)')
# /view/mediacollection/worldmediacollectionmemorygrouplayer.lua
# PlayerPrefs.GetInt("MEMORY_GROUP_NOTIFICATION" .. getProxy(PlayerProxy):getRawData().id .. " " .. slot3.id, 0)
pass # Duplicate
# PlayerPrefs.GetInt("MEMORY_GROUP_NOTIFICATION" .. slot2 .. " " .. slot7.id, 0)
pass # Duplicate
# /view/minigame/gameview/decodeminigameview.lua # /view/minigame/gameview/decodeminigameview.lua
# PlayerPrefs.GetInt("DecodeGameMapId", 1) # PlayerPrefs.GetInt("DecodeGameMapId", 1)
DecodeGameMapId = Field(formatter=int, default=1, regex='DecodeGameMapId') DecodeGameMapId = Field(formatter=int, default=1, regex='DecodeGameMapId')
# /view/minigame/gameview/gameroomqteview.lua
# PlayerPrefs.GetInt("QTEGameGuide", 0)
QTEGameGuide = Field(formatter=int, default=0, regex='QTEGameGuide')
# /view/minigame/gameview/musicgameview.lua # /view/minigame/gameview/musicgameview.lua
# PlayerPrefs.GetInt("musicgame_first_" .. getProxy(PlayerProxy):getData().id) # PlayerPrefs.GetInt("musicgame_first_" .. getProxy(PlayerProxy):getData().id)
musicgame_first = Field(formatter=int, default=0, regex='musicgame_first_(.*)') musicgame_first = Field(formatter=int, default=0, regex='musicgame_first_(.*)')
@ -554,7 +666,11 @@ class GameSettingsGenerated:
# /view/minigame/gameview/qtegameview.lua # /view/minigame/gameview/qtegameview.lua
# PlayerPrefs.GetInt("QTEGameGuide", 0) # PlayerPrefs.GetInt("QTEGameGuide", 0)
QTEGameGuide = Field(formatter=int, default=0, regex='QTEGameGuide') pass # Duplicate
# /view/minigame/gameview/ryzaminigameview.lua
# PlayerPrefs.GetInt("ryza_minigame_help", 0)
ryza_minigame_help = Field(formatter=int, default=0, regex='ryza_minigame_help')
# /view/minigame/gameview/volleyballgameview.lua # /view/minigame/gameview/volleyballgameview.lua
# PlayerPrefs.GetInt("volleyballgame_first_" .. getProxy(PlayerProxy):getData().id) # PlayerPrefs.GetInt("volleyballgame_first_" .. getProxy(PlayerProxy):getData().id)
@ -578,6 +694,12 @@ class GameSettingsGenerated:
# PlayerPrefs.GetInt("ItemIconChange_" .. slot2.equipID, 0) # PlayerPrefs.GetInt("ItemIconChange_" .. slot2.equipID, 0)
ItemIconChange = Field(formatter=int, default=0, regex='ItemIconChange_(.*)') ItemIconChange = Field(formatter=int, default=0, regex='ItemIconChange_(.*)')
# /view/newmain/sequence/mainguidesequence.lua
# PlayerPrefs.GetInt("ryza_task_help_" .. getProxy(PlayerProxy):getRawData().id, 0)
pass # Duplicate
# PlayerPrefs.GetInt("first_enter_ryza_atelier_" .. getProxy(PlayerProxy):getRawData().id, 0)
pass # Duplicate
# /view/newmain/view/mainchatroomview.lua # /view/newmain/view/mainchatroomview.lua
# PlayerPrefs.GetInt(HIDE_CHAT_FLAG) # PlayerPrefs.GetInt(HIDE_CHAT_FLAG)
pass # Unknown pass # Unknown
@ -590,6 +712,14 @@ class GameSettingsGenerated:
# PlayerPrefs.GetInt("paint_hide_other_obj_" .. slot0.painting.paintingName, 0) # PlayerPrefs.GetInt("paint_hide_other_obj_" .. slot0.painting.paintingName, 0)
pass # Duplicate pass # Duplicate
# /view/reflux/refluxscene.lua
# PlayerPrefs.GetInt(getProxy(PlayerProxy):getRawData().id .. "_" .. getProxy(RefluxProxy).returnTimestamp, 0)
pass # Unknown
# /view/reflux/refluxshopview.lua
# PlayerPrefs.GetInt("RefluxShop_Enter_Day", 0)
RefluxShop_Enter_Day = Field(formatter=int, default=0, regex='RefluxShop_Enter_Day')
# /view/setting/newsettingsscene.lua # /view/setting/newsettingsscene.lua
# PlayerPrefs.GetFloat("firstIntoOtherPanel") # PlayerPrefs.GetFloat("firstIntoOtherPanel")
pass # Duplicate pass # Duplicate
@ -694,6 +824,10 @@ class GameSettingsGenerated:
# PlayerPrefs.GetInt("newserver_shop_first_" .. slot0.playerId) # PlayerPrefs.GetInt("newserver_shop_first_" .. slot0.playerId)
pass # Duplicate pass # Duplicate
# /view/shops/skinshop/views/newskinshopmainview.lua
# PlayerPrefs.GetInt("skinShop#l2dPreViewToggle" .. getProxy(PlayerProxy):getRawData().id, 0)
pass # Duplicate
# /view/snapshot/snapshotscene.lua # /view/snapshot/snapshotscene.lua
# PlayerPrefs.GetInt("hadShowForVideoTip") # PlayerPrefs.GetInt("hadShowForVideoTip")
hadShowForVideoTip = Field(formatter=int, default=0, regex='hadShowForVideoTip') hadShowForVideoTip = Field(formatter=int, default=0, regex='hadShowForVideoTip')
@ -704,6 +838,10 @@ class GameSettingsGenerated:
# PlayerPrefs.GetInt("snapshotAgress") # PlayerPrefs.GetInt("snapshotAgress")
snapshotAgress = Field(formatter=int, default=0, regex='snapshotAgress') snapshotAgress = Field(formatter=int, default=0, regex='snapshotAgress')
# /view/technology/selecttechnologymediator.lua
# PlayerPrefs.GetString("technology_day_mark", "")
technology_day_mark = Field(formatter=str, default='', regex='technology_day_mark')
# /view/technology/technologysettingslayer.lua # /view/technology/technologysettingslayer.lua
# PlayerPrefs.GetInt("isShowFinishCatchupVersion") # PlayerPrefs.GetInt("isShowFinishCatchupVersion")
isShowFinishCatchupVersion = Field(formatter=int, default=0, regex='isShowFinishCatchupVersion') isShowFinishCatchupVersion = Field(formatter=int, default=0, regex='isShowFinishCatchupVersion')
@ -715,6 +853,12 @@ class GameSettingsGenerated:
pass # Duplicate pass # Duplicate
# PlayerPrefs.GetInt("world_sub_call_line", 0) # PlayerPrefs.GetInt("world_sub_call_line", 0)
pass # Duplicate pass # Duplicate
# PlayerPrefs.GetInt("world_skip_precombat", 0)
pass # Duplicate
# PlayerPrefs.GetInt("auto_switch_mode", 0)
pass # Duplicate
# PlayerPrefs.GetInt("auto_switch_mode", 0)
pass # Duplicate
# PlayerPrefs.GetInt("auto_switch_mode", 0) # PlayerPrefs.GetInt("auto_switch_mode", 0)
pass # Duplicate pass # Duplicate
@ -727,11 +871,7 @@ class GameSettingsGenerated:
auto_switch_wait_2 = Field(formatter=int, default=0, regex='auto_switch_wait_2') auto_switch_wait_2 = Field(formatter=int, default=0, regex='auto_switch_wait_2')
# PlayerPrefs.GetInt("auto_switch_mode", 0) # PlayerPrefs.GetInt("auto_switch_mode", 0)
pass # Duplicate pass # Duplicate
# PlayerPrefs.GetString(slot6, slot7) # PlayerPrefs.GetString(slot4, slot5)
pass # Unknown
# PlayerPrefs.GetString(slot4, slot5)
pass # Unknown pass # Unknown
# /view/world/worldmediacollection/worldmediacollectionmemorygrouplayer.lua
# PlayerPrefs.GetInt("MEMORY_GROUP_NOTIFICATION" .. getProxy(PlayerProxy):getRawData().id .. " " .. slot3.id, 0)
pass # Duplicate
# PlayerPrefs.GetInt("MEMORY_GROUP_NOTIFICATION" .. slot2 .. " " .. slot7.id, 0)
pass # Duplicate

View File

@ -67,7 +67,7 @@ MAP_WALK_OUT_OF_STEP = Button(area={'cn': (654, 312, 704, 335), 'en': (454, 314,
MAP_WALK_SPEEDUP = Button(area={'cn': (1025, 406, 1055, 436), 'en': (1025, 406, 1055, 436), 'jp': (1025, 406, 1055, 436), 'tw': (1025, 406, 1055, 436)}, color={'cn': (62, 97, 72), 'en': (62, 97, 72), 'jp': (62, 97, 72), 'tw': (62, 97, 72)}, button={'cn': (1025, 406, 1055, 436), 'en': (1025, 406, 1055, 436), 'jp': (1025, 406, 1055, 436), 'tw': (1025, 406, 1055, 436)}, file={'cn': './assets/cn/handler/MAP_WALK_SPEEDUP.png', 'en': './assets/en/handler/MAP_WALK_SPEEDUP.png', 'jp': './assets/jp/handler/MAP_WALK_SPEEDUP.png', 'tw': './assets/tw/handler/MAP_WALK_SPEEDUP.png'}) MAP_WALK_SPEEDUP = Button(area={'cn': (1025, 406, 1055, 436), 'en': (1025, 406, 1055, 436), 'jp': (1025, 406, 1055, 436), 'tw': (1025, 406, 1055, 436)}, color={'cn': (62, 97, 72), 'en': (62, 97, 72), 'jp': (62, 97, 72), 'tw': (62, 97, 72)}, button={'cn': (1025, 406, 1055, 436), 'en': (1025, 406, 1055, 436), 'jp': (1025, 406, 1055, 436), 'tw': (1025, 406, 1055, 436)}, file={'cn': './assets/cn/handler/MAP_WALK_SPEEDUP.png', 'en': './assets/en/handler/MAP_WALK_SPEEDUP.png', 'jp': './assets/jp/handler/MAP_WALK_SPEEDUP.png', 'tw': './assets/tw/handler/MAP_WALK_SPEEDUP.png'})
MISSION_POPUP_ACK = Button(area={'cn': (432, 493, 543, 533), 'en': (413, 489, 566, 532), 'jp': (410, 482, 574, 539), 'tw': (413, 489, 566, 532)}, color={'cn': (181, 182, 184), 'en': (169, 170, 172), 'jp': (162, 164, 167), 'tw': (169, 170, 172)}, button={'cn': (432, 493, 543, 533), 'en': (413, 489, 566, 532), 'jp': (410, 482, 574, 539), 'tw': (413, 489, 566, 532)}, file={'cn': './assets/cn/handler/MISSION_POPUP_ACK.png', 'en': './assets/en/handler/MISSION_POPUP_ACK.png', 'jp': './assets/jp/handler/MISSION_POPUP_ACK.png', 'tw': './assets/tw/handler/MISSION_POPUP_ACK.png'}) MISSION_POPUP_ACK = Button(area={'cn': (432, 493, 543, 533), 'en': (413, 489, 566, 532), 'jp': (410, 482, 574, 539), 'tw': (413, 489, 566, 532)}, color={'cn': (181, 182, 184), 'en': (169, 170, 172), 'jp': (162, 164, 167), 'tw': (169, 170, 172)}, button={'cn': (432, 493, 543, 533), 'en': (413, 489, 566, 532), 'jp': (410, 482, 574, 539), 'tw': (413, 489, 566, 532)}, file={'cn': './assets/cn/handler/MISSION_POPUP_ACK.png', 'en': './assets/en/handler/MISSION_POPUP_ACK.png', 'jp': './assets/jp/handler/MISSION_POPUP_ACK.png', 'tw': './assets/tw/handler/MISSION_POPUP_ACK.png'})
MISSION_POPUP_GO = Button(area={'cn': (719, 493, 861, 534), 'en': (716, 488, 869, 533), 'jp': (711, 482, 874, 539), 'tw': (716, 488, 869, 533)}, color={'cn': (125, 164, 214), 'en': (89, 138, 201), 'jp': (93, 142, 204), 'tw': (89, 138, 201)}, button={'cn': (719, 493, 861, 534), 'en': (716, 488, 869, 533), 'jp': (711, 482, 874, 539), 'tw': (716, 488, 869, 533)}, file={'cn': './assets/cn/handler/MISSION_POPUP_GO.png', 'en': './assets/en/handler/MISSION_POPUP_GO.png', 'jp': './assets/jp/handler/MISSION_POPUP_GO.png', 'tw': './assets/tw/handler/MISSION_POPUP_GO.png'}) MISSION_POPUP_GO = Button(area={'cn': (719, 493, 861, 534), 'en': (716, 488, 869, 533), 'jp': (711, 482, 874, 539), 'tw': (716, 488, 869, 533)}, color={'cn': (125, 164, 214), 'en': (89, 138, 201), 'jp': (93, 142, 204), 'tw': (89, 138, 201)}, button={'cn': (719, 493, 861, 534), 'en': (716, 488, 869, 533), 'jp': (711, 482, 874, 539), 'tw': (716, 488, 869, 533)}, file={'cn': './assets/cn/handler/MISSION_POPUP_GO.png', 'en': './assets/en/handler/MISSION_POPUP_GO.png', 'jp': './assets/jp/handler/MISSION_POPUP_GO.png', 'tw': './assets/tw/handler/MISSION_POPUP_GO.png'})
MOB_MOVE_CANCEL = Button(area={'cn': (1162, 646, 1220, 674), 'en': (1162, 646, 1220, 674), 'jp': (1162, 644, 1222, 675), 'tw': (1162, 646, 1220, 674)}, color={'cn': (224, 176, 173), 'en': (224, 176, 173), 'jp': (207, 140, 136), 'tw': (224, 176, 173)}, button={'cn': (1162, 646, 1220, 674), 'en': (1162, 646, 1220, 674), 'jp': (1162, 644, 1222, 675), 'tw': (1162, 646, 1220, 674)}, file={'cn': './assets/cn/handler/MOB_MOVE_CANCEL.png', 'en': './assets/cn/handler/MOB_MOVE_CANCEL.png', 'jp': './assets/jp/handler/MOB_MOVE_CANCEL.png', 'tw': './assets/cn/handler/MOB_MOVE_CANCEL.png'}) MOB_MOVE_CANCEL = Button(area={'cn': (1162, 646, 1220, 674), 'en': (1162, 646, 1220, 674), 'jp': (1162, 644, 1222, 675), 'tw': (1164, 647, 1219, 673)}, color={'cn': (224, 176, 173), 'en': (224, 176, 173), 'jp': (207, 140, 136), 'tw': (230, 185, 181)}, button={'cn': (1162, 646, 1220, 674), 'en': (1162, 646, 1220, 674), 'jp': (1162, 644, 1222, 675), 'tw': (1164, 647, 1219, 673)}, file={'cn': './assets/cn/handler/MOB_MOVE_CANCEL.png', 'en': './assets/cn/handler/MOB_MOVE_CANCEL.png', 'jp': './assets/jp/handler/MOB_MOVE_CANCEL.png', 'tw': './assets/tw/handler/MOB_MOVE_CANCEL.png'})
MOB_MOVE_ENTER = Button(area={'cn': (1102, 504, 1157, 578), 'en': (1102, 504, 1157, 578), 'jp': (1102, 504, 1157, 578), 'tw': (1102, 504, 1157, 578)}, color={'cn': (122, 124, 131), 'en': (122, 124, 131), 'jp': (122, 124, 131), 'tw': (122, 124, 131)}, button={'cn': (1102, 504, 1157, 578), 'en': (1102, 504, 1157, 578), 'jp': (1102, 504, 1157, 578), 'tw': (1102, 504, 1157, 578)}, file={'cn': './assets/cn/handler/MOB_MOVE_ENTER.png', 'en': './assets/en/handler/MOB_MOVE_ENTER.png', 'jp': './assets/jp/handler/MOB_MOVE_ENTER.png', 'tw': './assets/tw/handler/MOB_MOVE_ENTER.png'}) MOB_MOVE_ENTER = Button(area={'cn': (1102, 504, 1157, 578), 'en': (1102, 504, 1157, 578), 'jp': (1102, 504, 1157, 578), 'tw': (1102, 504, 1157, 578)}, color={'cn': (122, 124, 131), 'en': (122, 124, 131), 'jp': (122, 124, 131), 'tw': (122, 124, 131)}, button={'cn': (1102, 504, 1157, 578), 'en': (1102, 504, 1157, 578), 'jp': (1102, 504, 1157, 578), 'tw': (1102, 504, 1157, 578)}, file={'cn': './assets/cn/handler/MOB_MOVE_ENTER.png', 'en': './assets/en/handler/MOB_MOVE_ENTER.png', 'jp': './assets/jp/handler/MOB_MOVE_ENTER.png', 'tw': './assets/tw/handler/MOB_MOVE_ENTER.png'})
MONTHLY_PASS_NOTICE = Button(area={'cn': (554, 505, 726, 561), 'en': (716, 488, 869, 533), 'jp': (554, 505, 726, 561), 'tw': (554, 505, 726, 561)}, color={'cn': (109, 153, 208), 'en': (89, 138, 201), 'jp': (109, 153, 208), 'tw': (109, 153, 208)}, button={'cn': (872, 152, 939, 196), 'en': (863, 173, 929, 217), 'jp': (872, 152, 939, 196), 'tw': (872, 152, 939, 196)}, file={'cn': './assets/cn/handler/MONTHLY_PASS_NOTICE.png', 'en': './assets/en/handler/MONTHLY_PASS_NOTICE.png', 'jp': './assets/cn/handler/MONTHLY_PASS_NOTICE.png', 'tw': './assets/cn/handler/MONTHLY_PASS_NOTICE.png'}) MONTHLY_PASS_NOTICE = Button(area={'cn': (554, 505, 726, 561), 'en': (716, 488, 869, 533), 'jp': (554, 505, 726, 561), 'tw': (554, 505, 726, 561)}, color={'cn': (109, 153, 208), 'en': (89, 138, 201), 'jp': (109, 153, 208), 'tw': (109, 153, 208)}, button={'cn': (872, 152, 939, 196), 'en': (863, 173, 929, 217), 'jp': (872, 152, 939, 196), 'tw': (872, 152, 939, 196)}, file={'cn': './assets/cn/handler/MONTHLY_PASS_NOTICE.png', 'en': './assets/en/handler/MONTHLY_PASS_NOTICE.png', 'jp': './assets/cn/handler/MONTHLY_PASS_NOTICE.png', 'tw': './assets/cn/handler/MONTHLY_PASS_NOTICE.png'})
MYSTERY_ITEM = Button(area={'cn': (589, 294, 691, 427), 'en': (589, 294, 691, 427), 'jp': (589, 294, 691, 427), 'tw': (589, 294, 691, 427)}, color={'cn': (144, 127, 83), 'en': (144, 127, 83), 'jp': (144, 127, 83), 'tw': (144, 127, 83)}, button={'cn': (588, 478, 698, 496), 'en': (588, 478, 698, 496), 'jp': (588, 478, 698, 496), 'tw': (588, 478, 698, 496)}, file={'cn': './assets/cn/handler/MYSTERY_ITEM.png', 'en': './assets/en/handler/MYSTERY_ITEM.png', 'jp': './assets/jp/handler/MYSTERY_ITEM.png', 'tw': './assets/tw/handler/MYSTERY_ITEM.png'}) MYSTERY_ITEM = Button(area={'cn': (589, 294, 691, 427), 'en': (589, 294, 691, 427), 'jp': (589, 294, 691, 427), 'tw': (589, 294, 691, 427)}, color={'cn': (144, 127, 83), 'en': (144, 127, 83), 'jp': (144, 127, 83), 'tw': (144, 127, 83)}, button={'cn': (588, 478, 698, 496), 'en': (588, 478, 698, 496), 'jp': (588, 478, 698, 496), 'tw': (588, 478, 698, 496)}, file={'cn': './assets/cn/handler/MYSTERY_ITEM.png', 'en': './assets/en/handler/MYSTERY_ITEM.png', 'jp': './assets/jp/handler/MYSTERY_ITEM.png', 'tw': './assets/tw/handler/MYSTERY_ITEM.png'})

View File

@ -148,12 +148,19 @@ class MeowfficerCollect(MeowfficerBase):
Handle skip transitions; proceeds slowly Handle skip transitions; proceeds slowly
with caution to prevent unintentional actions with caution to prevent unintentional actions
""" """
def additional():
if self.appear(MEOWFFICER_TRAIN_EVALUATE, offset=(20, 20), interval=3):
self.device.click(MEOWFFICER_TRAIN_EVALUATE)
return True
return False
# Trigger lock popup appearance to initiate sequence # Trigger lock popup appearance to initiate sequence
self.ui_click(MEOWFFICER_TRAIN_CLICK_SAFE_AREA, self.ui_click(MEOWFFICER_TRAIN_CLICK_SAFE_AREA,
appear_button=MEOWFFICER_GET_CHECK, check_button=MEOWFFICER_CONFIRM, appear_button=MEOWFFICER_GET_CHECK, check_button=MEOWFFICER_CONFIRM, additional=additional,
offset=(40, 40), retry_wait=3, skip_first_screenshot=True) offset=(40, 40), retry_wait=3, skip_first_screenshot=True)
self.ui_click(MEOWFFICER_CANCEL, check_button=self._meow_check_popup_exit, self.ui_click(MEOWFFICER_CANCEL, check_button=self._meow_check_popup_exit, additional=additional,
offset=(40, 20), retry_wait=3, skip_first_screenshot=True) offset=(40, 20), retry_wait=3, skip_first_screenshot=True)
self.device.click_record.pop() self.device.click_record.pop()
self.device.click_record.pop() self.device.click_record.pop()

View File

@ -872,7 +872,7 @@ class OperationSiren(OSMap):
if __name__ == '__main__': if __name__ == '__main__':
self = OperationSiren('month_test', task='OpsiMonthBoss') self = OperationSiren('alas', task='OpsiExplore')
from module.os.config import OSConfig from module.os.config import OSConfig
self.config = self.config.merge(OSConfig()) self.config = self.config.merge(OSConfig())
@ -880,5 +880,5 @@ if __name__ == '__main__':
self.device.screenshot() self.device.screenshot()
self.os_init() self.os_init()
logger.hr("OS clear Month Boss", level=1) # logger.hr("OS clear Month Boss", level=1)
self.clear_month_boss() self.os_shop()

View File

@ -24,6 +24,7 @@ ENTRANCE_3 = Button(area={'cn': (540, 135, 732, 265), 'en': (540, 135, 732, 265)
ENTRANCE_4 = Button(area={'cn': (782, 159, 951, 275), 'en': (782, 159, 951, 275), 'jp': (782, 159, 951, 275), 'tw': (782, 159, 951, 275)}, color={'cn': (80, 153, 218), 'en': (80, 153, 218), 'jp': (80, 153, 218), 'tw': (80, 153, 218)}, button={'cn': (782, 159, 951, 275), 'en': (782, 159, 951, 275), 'jp': (782, 159, 951, 275), 'tw': (782, 159, 951, 275)}, file={'cn': './assets/cn/research/ENTRANCE_4.png', 'en': './assets/en/research/ENTRANCE_4.png', 'jp': './assets/jp/research/ENTRANCE_4.png', 'tw': './assets/tw/research/ENTRANCE_4.png'}) ENTRANCE_4 = Button(area={'cn': (782, 159, 951, 275), 'en': (782, 159, 951, 275), 'jp': (782, 159, 951, 275), 'tw': (782, 159, 951, 275)}, color={'cn': (80, 153, 218), 'en': (80, 153, 218), 'jp': (80, 153, 218), 'tw': (80, 153, 218)}, button={'cn': (782, 159, 951, 275), 'en': (782, 159, 951, 275), 'jp': (782, 159, 951, 275), 'tw': (782, 159, 951, 275)}, file={'cn': './assets/cn/research/ENTRANCE_4.png', 'en': './assets/en/research/ENTRANCE_4.png', 'jp': './assets/jp/research/ENTRANCE_4.png', 'tw': './assets/tw/research/ENTRANCE_4.png'})
ENTRANCE_5 = Button(area={'cn': (1025, 186, 1169, 287), 'en': (1025, 186, 1169, 287), 'jp': (1025, 186, 1169, 287), 'tw': (1025, 186, 1169, 287)}, color={'cn': (80, 153, 218), 'en': (80, 153, 218), 'jp': (80, 153, 218), 'tw': (80, 153, 218)}, button={'cn': (1025, 186, 1169, 287), 'en': (1025, 186, 1169, 287), 'jp': (1025, 186, 1169, 287), 'tw': (1025, 186, 1169, 287)}, file={'cn': './assets/cn/research/ENTRANCE_5.png', 'en': './assets/en/research/ENTRANCE_5.png', 'jp': './assets/jp/research/ENTRANCE_5.png', 'tw': './assets/tw/research/ENTRANCE_5.png'}) ENTRANCE_5 = Button(area={'cn': (1025, 186, 1169, 287), 'en': (1025, 186, 1169, 287), 'jp': (1025, 186, 1169, 287), 'tw': (1025, 186, 1169, 287)}, color={'cn': (80, 153, 218), 'en': (80, 153, 218), 'jp': (80, 153, 218), 'tw': (80, 153, 218)}, button={'cn': (1025, 186, 1169, 287), 'en': (1025, 186, 1169, 287), 'jp': (1025, 186, 1169, 287), 'tw': (1025, 186, 1169, 287)}, file={'cn': './assets/cn/research/ENTRANCE_5.png', 'en': './assets/en/research/ENTRANCE_5.png', 'jp': './assets/jp/research/ENTRANCE_5.png', 'tw': './assets/tw/research/ENTRANCE_5.png'})
GET_ITEMS_RESEARCH_SAVE = Button(area={'cn': (357, 643, 497, 701), 'en': (357, 643, 497, 701), 'jp': (357, 643, 497, 701), 'tw': (357, 643, 497, 701)}, color={'cn': (54, 65, 83), 'en': (54, 65, 83), 'jp': (54, 65, 83), 'tw': (54, 65, 83)}, button={'cn': (357, 643, 497, 701), 'en': (357, 643, 497, 701), 'jp': (357, 643, 497, 701), 'tw': (357, 643, 497, 701)}, file={'cn': './assets/cn/research/GET_ITEMS_RESEARCH_SAVE.png', 'en': './assets/en/research/GET_ITEMS_RESEARCH_SAVE.png', 'jp': './assets/jp/research/GET_ITEMS_RESEARCH_SAVE.png', 'tw': './assets/tw/research/GET_ITEMS_RESEARCH_SAVE.png'}) GET_ITEMS_RESEARCH_SAVE = Button(area={'cn': (357, 643, 497, 701), 'en': (357, 643, 497, 701), 'jp': (357, 643, 497, 701), 'tw': (357, 643, 497, 701)}, color={'cn': (54, 65, 83), 'en': (54, 65, 83), 'jp': (54, 65, 83), 'tw': (54, 65, 83)}, button={'cn': (357, 643, 497, 701), 'en': (357, 643, 497, 701), 'jp': (357, 643, 497, 701), 'tw': (357, 643, 497, 701)}, file={'cn': './assets/cn/research/GET_ITEMS_RESEARCH_SAVE.png', 'en': './assets/en/research/GET_ITEMS_RESEARCH_SAVE.png', 'jp': './assets/jp/research/GET_ITEMS_RESEARCH_SAVE.png', 'tw': './assets/tw/research/GET_ITEMS_RESEARCH_SAVE.png'})
HAS_RESEARCH_QUEUE = Button(area={'cn': (44, 216, 64, 236), 'en': (44, 216, 64, 236), 'jp': (44, 216, 64, 236), 'tw': (44, 216, 64, 236)}, color={'cn': (50, 54, 82), 'en': (50, 54, 82), 'jp': (50, 54, 82), 'tw': (50, 54, 82)}, button={'cn': (44, 216, 64, 236), 'en': (44, 216, 64, 236), 'jp': (44, 216, 64, 236), 'tw': (44, 216, 64, 236)}, file={'cn': './assets/cn/research/HAS_RESEARCH_QUEUE.png', 'en': './assets/cn/research/HAS_RESEARCH_QUEUE.png', 'jp': './assets/cn/research/HAS_RESEARCH_QUEUE.png', 'tw': './assets/cn/research/HAS_RESEARCH_QUEUE.png'})
ITEMS_3_SWIPE = Button(area={'cn': (693, 219, 715, 503), 'en': (693, 219, 715, 503), 'jp': (693, 219, 715, 503), 'tw': (693, 219, 715, 503)}, color={'cn': (78, 70, 55), 'en': (78, 70, 55), 'jp': (78, 70, 55), 'tw': (78, 70, 55)}, button={'cn': (693, 219, 715, 503), 'en': (693, 219, 715, 503), 'jp': (693, 219, 715, 503), 'tw': (693, 219, 715, 503)}, file={'cn': './assets/cn/research/ITEMS_3_SWIPE.png', 'en': './assets/en/research/ITEMS_3_SWIPE.png', 'jp': './assets/jp/research/ITEMS_3_SWIPE.png', 'tw': './assets/tw/research/ITEMS_3_SWIPE.png'}) ITEMS_3_SWIPE = Button(area={'cn': (693, 219, 715, 503), 'en': (693, 219, 715, 503), 'jp': (693, 219, 715, 503), 'tw': (693, 219, 715, 503)}, color={'cn': (78, 70, 55), 'en': (78, 70, 55), 'jp': (78, 70, 55), 'tw': (78, 70, 55)}, button={'cn': (693, 219, 715, 503), 'en': (693, 219, 715, 503), 'jp': (693, 219, 715, 503), 'tw': (693, 219, 715, 503)}, file={'cn': './assets/cn/research/ITEMS_3_SWIPE.png', 'en': './assets/en/research/ITEMS_3_SWIPE.png', 'jp': './assets/jp/research/ITEMS_3_SWIPE.png', 'tw': './assets/tw/research/ITEMS_3_SWIPE.png'})
OCR_RESEARCH_1 = Button(area={'cn': (78, 277, 249, 330), 'en': (78, 277, 249, 330), 'jp': (78, 277, 249, 330), 'tw': (78, 277, 249, 330)}, color={'cn': (139, 160, 196), 'en': (139, 160, 196), 'jp': (139, 160, 196), 'tw': (139, 160, 196)}, button={'cn': (78, 277, 249, 330), 'en': (78, 277, 249, 330), 'jp': (78, 277, 249, 330), 'tw': (78, 277, 249, 330)}, file={'cn': './assets/cn/research/OCR_RESEARCH_1.png', 'en': './assets/en/research/OCR_RESEARCH_1.png', 'jp': './assets/jp/research/OCR_RESEARCH_1.png', 'tw': './assets/tw/research/OCR_RESEARCH_1.png'}) OCR_RESEARCH_1 = Button(area={'cn': (78, 277, 249, 330), 'en': (78, 277, 249, 330), 'jp': (78, 277, 249, 330), 'tw': (78, 277, 249, 330)}, color={'cn': (139, 160, 196), 'en': (139, 160, 196), 'jp': (139, 160, 196), 'tw': (139, 160, 196)}, button={'cn': (78, 277, 249, 330), 'en': (78, 277, 249, 330), 'jp': (78, 277, 249, 330), 'tw': (78, 277, 249, 330)}, file={'cn': './assets/cn/research/OCR_RESEARCH_1.png', 'en': './assets/en/research/OCR_RESEARCH_1.png', 'jp': './assets/jp/research/OCR_RESEARCH_1.png', 'tw': './assets/tw/research/OCR_RESEARCH_1.png'})
OCR_RESEARCH_2 = Button(area={'cn': (292, 263, 490, 325), 'en': (292, 263, 490, 325), 'jp': (292, 263, 490, 325), 'tw': (292, 263, 490, 325)}, color={'cn': (122, 153, 201), 'en': (122, 153, 201), 'jp': (122, 153, 201), 'tw': (122, 153, 201)}, button={'cn': (292, 263, 490, 325), 'en': (292, 263, 490, 325), 'jp': (292, 263, 490, 325), 'tw': (292, 263, 490, 325)}, file={'cn': './assets/cn/research/OCR_RESEARCH_2.png', 'en': './assets/en/research/OCR_RESEARCH_2.png', 'jp': './assets/jp/research/OCR_RESEARCH_2.png', 'tw': './assets/tw/research/OCR_RESEARCH_2.png'}) OCR_RESEARCH_2 = Button(area={'cn': (292, 263, 490, 325), 'en': (292, 263, 490, 325), 'jp': (292, 263, 490, 325), 'tw': (292, 263, 490, 325)}, color={'cn': (122, 153, 201), 'en': (122, 153, 201), 'jp': (122, 153, 201), 'tw': (122, 153, 201)}, button={'cn': (292, 263, 490, 325), 'en': (292, 263, 490, 325), 'jp': (292, 263, 490, 325), 'tw': (292, 263, 490, 325)}, file={'cn': './assets/cn/research/OCR_RESEARCH_2.png', 'en': './assets/en/research/OCR_RESEARCH_2.png', 'jp': './assets/jp/research/OCR_RESEARCH_2.png', 'tw': './assets/tw/research/OCR_RESEARCH_2.png'})
@ -32,7 +33,17 @@ OCR_RESEARCH_4 = Button(area={'cn': (752, 263, 950, 325), 'en': (752, 263, 950,
OCR_RESEARCH_5 = Button(area={'cn': (998, 276, 1169, 329), 'en': (998, 276, 1169, 329), 'jp': (998, 276, 1169, 329), 'tw': (998, 276, 1169, 329)}, color={'cn': (124, 156, 204), 'en': (124, 156, 204), 'jp': (124, 156, 204), 'tw': (124, 156, 204)}, button={'cn': (998, 276, 1169, 329), 'en': (998, 276, 1169, 329), 'jp': (998, 276, 1169, 329), 'tw': (998, 276, 1169, 329)}, file={'cn': './assets/cn/research/OCR_RESEARCH_5.png', 'en': './assets/en/research/OCR_RESEARCH_5.png', 'jp': './assets/jp/research/OCR_RESEARCH_5.png', 'tw': './assets/tw/research/OCR_RESEARCH_5.png'}) OCR_RESEARCH_5 = Button(area={'cn': (998, 276, 1169, 329), 'en': (998, 276, 1169, 329), 'jp': (998, 276, 1169, 329), 'tw': (998, 276, 1169, 329)}, color={'cn': (124, 156, 204), 'en': (124, 156, 204), 'jp': (124, 156, 204), 'tw': (124, 156, 204)}, button={'cn': (998, 276, 1169, 329), 'en': (998, 276, 1169, 329), 'jp': (998, 276, 1169, 329), 'tw': (998, 276, 1169, 329)}, file={'cn': './assets/cn/research/OCR_RESEARCH_5.png', 'en': './assets/en/research/OCR_RESEARCH_5.png', 'jp': './assets/jp/research/OCR_RESEARCH_5.png', 'tw': './assets/tw/research/OCR_RESEARCH_5.png'})
QUEUE_CHECK = Button(area={'cn': (118, 16, 227, 39), 'en': (117, 16, 215, 38), 'jp': (116, 14, 232, 42), 'tw': (118, 14, 227, 39)}, color={'cn': (149, 166, 205), 'en': (125, 139, 179), 'jp': (147, 163, 199), 'tw': (155, 171, 210)}, button={'cn': (118, 16, 227, 39), 'en': (117, 16, 215, 38), 'jp': (116, 14, 232, 42), 'tw': (118, 14, 227, 39)}, file={'cn': './assets/cn/research/QUEUE_CHECK.png', 'en': './assets/en/research/QUEUE_CHECK.png', 'jp': './assets/jp/research/QUEUE_CHECK.png', 'tw': './assets/tw/research/QUEUE_CHECK.png'}) QUEUE_CHECK = Button(area={'cn': (118, 16, 227, 39), 'en': (117, 16, 215, 38), 'jp': (116, 14, 232, 42), 'tw': (118, 14, 227, 39)}, color={'cn': (149, 166, 205), 'en': (125, 139, 179), 'jp': (147, 163, 199), 'tw': (155, 171, 210)}, button={'cn': (118, 16, 227, 39), 'en': (117, 16, 215, 38), 'jp': (116, 14, 232, 42), 'tw': (118, 14, 227, 39)}, file={'cn': './assets/cn/research/QUEUE_CHECK.png', 'en': './assets/en/research/QUEUE_CHECK.png', 'jp': './assets/jp/research/QUEUE_CHECK.png', 'tw': './assets/tw/research/QUEUE_CHECK.png'})
QUEUE_CLAIM_REWARD = Button(area={'cn': (1230, 275, 1272, 420), 'en': (1225, 258, 1270, 448), 'jp': (1219, 254, 1279, 460), 'tw': (1219, 253, 1280, 460)}, color={'cn': (249, 182, 121), 'en': (249, 171, 97), 'jp': (249, 170, 97), 'tw': (249, 174, 102)}, button={'cn': (1230, 275, 1272, 420), 'en': (1225, 258, 1270, 448), 'jp': (1219, 254, 1279, 460), 'tw': (1219, 253, 1280, 460)}, file={'cn': './assets/cn/research/QUEUE_CLAIM_REWARD.png', 'en': './assets/en/research/QUEUE_CLAIM_REWARD.png', 'jp': './assets/jp/research/QUEUE_CLAIM_REWARD.png', 'tw': './assets/tw/research/QUEUE_CLAIM_REWARD.png'}) QUEUE_CLAIM_REWARD = Button(area={'cn': (1230, 275, 1272, 420), 'en': (1225, 258, 1270, 448), 'jp': (1219, 254, 1279, 460), 'tw': (1219, 253, 1280, 460)}, color={'cn': (249, 182, 121), 'en': (249, 171, 97), 'jp': (249, 170, 97), 'tw': (249, 174, 102)}, button={'cn': (1230, 275, 1272, 420), 'en': (1225, 258, 1270, 448), 'jp': (1219, 254, 1279, 460), 'tw': (1219, 253, 1280, 460)}, file={'cn': './assets/cn/research/QUEUE_CLAIM_REWARD.png', 'en': './assets/en/research/QUEUE_CLAIM_REWARD.png', 'jp': './assets/jp/research/QUEUE_CLAIM_REWARD.png', 'tw': './assets/tw/research/QUEUE_CLAIM_REWARD.png'})
QUEUE_OCR_RESEARCH_1 = Button(area={'cn': (56, 280, 270, 346), 'en': (56, 280, 270, 346), 'jp': (56, 280, 270, 346), 'tw': (56, 280, 270, 346)}, color={'cn': (122, 154, 200), 'en': (122, 154, 200), 'jp': (122, 154, 200), 'tw': (122, 154, 200)}, button={'cn': (56, 280, 270, 346), 'en': (56, 280, 270, 346), 'jp': (56, 280, 270, 346), 'tw': (56, 280, 270, 346)}, file={'cn': './assets/cn/research/QUEUE_OCR_RESEARCH_1.png', 'en': './assets/cn/research/QUEUE_OCR_RESEARCH_1.png', 'jp': './assets/cn/research/QUEUE_OCR_RESEARCH_1.png', 'tw': './assets/cn/research/QUEUE_OCR_RESEARCH_1.png'})
QUEUE_OCR_RESEARCH_2 = Button(area={'cn': (283, 281, 497, 347), 'en': (283, 281, 497, 347), 'jp': (283, 281, 497, 347), 'tw': (283, 281, 497, 347)}, color={'cn': (202, 178, 142), 'en': (202, 178, 142), 'jp': (202, 178, 142), 'tw': (202, 178, 142)}, button={'cn': (283, 281, 497, 347), 'en': (283, 281, 497, 347), 'jp': (283, 281, 497, 347), 'tw': (283, 281, 497, 347)}, file={'cn': './assets/cn/research/QUEUE_OCR_RESEARCH_2.png', 'en': './assets/cn/research/QUEUE_OCR_RESEARCH_2.png', 'jp': './assets/cn/research/QUEUE_OCR_RESEARCH_2.png', 'tw': './assets/cn/research/QUEUE_OCR_RESEARCH_2.png'})
QUEUE_OCR_RESEARCH_3 = Button(area={'cn': (513, 280, 727, 346), 'en': (513, 280, 727, 346), 'jp': (513, 280, 727, 346), 'tw': (513, 280, 727, 346)}, color={'cn': (122, 155, 203), 'en': (122, 155, 203), 'jp': (122, 155, 203), 'tw': (122, 155, 203)}, button={'cn': (513, 280, 727, 346), 'en': (513, 280, 727, 346), 'jp': (513, 280, 727, 346), 'tw': (513, 280, 727, 346)}, file={'cn': './assets/cn/research/QUEUE_OCR_RESEARCH_3.png', 'en': './assets/cn/research/QUEUE_OCR_RESEARCH_3.png', 'jp': './assets/cn/research/QUEUE_OCR_RESEARCH_3.png', 'tw': './assets/cn/research/QUEUE_OCR_RESEARCH_3.png'})
QUEUE_OCR_RESEARCH_4 = Button(area={'cn': (739, 281, 953, 347), 'en': (739, 281, 953, 347), 'jp': (739, 281, 953, 347), 'tw': (739, 281, 953, 347)}, color={'cn': (202, 178, 143), 'en': (202, 178, 143), 'jp': (202, 178, 143), 'tw': (202, 178, 143)}, button={'cn': (739, 281, 953, 347), 'en': (739, 281, 953, 347), 'jp': (739, 281, 953, 347), 'tw': (739, 281, 953, 347)}, file={'cn': './assets/cn/research/QUEUE_OCR_RESEARCH_4.png', 'en': './assets/cn/research/QUEUE_OCR_RESEARCH_4.png', 'jp': './assets/cn/research/QUEUE_OCR_RESEARCH_4.png', 'tw': './assets/cn/research/QUEUE_OCR_RESEARCH_4.png'})
QUEUE_OCR_RESEARCH_5 = Button(area={'cn': (969, 280, 1183, 346), 'en': (969, 280, 1183, 346), 'jp': (969, 280, 1183, 346), 'tw': (969, 280, 1183, 346)}, color={'cn': (124, 156, 205), 'en': (124, 156, 205), 'jp': (124, 156, 205), 'tw': (124, 156, 205)}, button={'cn': (969, 280, 1183, 346), 'en': (969, 280, 1183, 346), 'jp': (969, 280, 1183, 346), 'tw': (969, 280, 1183, 346)}, file={'cn': './assets/cn/research/QUEUE_OCR_RESEARCH_5.png', 'en': './assets/cn/research/QUEUE_OCR_RESEARCH_5.png', 'jp': './assets/cn/research/QUEUE_OCR_RESEARCH_5.png', 'tw': './assets/cn/research/QUEUE_OCR_RESEARCH_5.png'})
QUEUE_REMAIN = Button(area={'cn': (156, 605, 272, 637), 'en': (151, 580, 278, 617), 'jp': (157, 605, 277, 636), 'tw': (165, 582, 275, 613)}, color={'cn': (193, 212, 240), 'en': (191, 210, 238), 'jp': (188, 208, 239), 'tw': (192, 211, 241)}, button={'cn': (156, 605, 272, 637), 'en': (151, 580, 278, 617), 'jp': (157, 605, 277, 636), 'tw': (165, 582, 275, 613)}, file={'cn': './assets/cn/research/QUEUE_REMAIN.png', 'en': './assets/en/research/QUEUE_REMAIN.png', 'jp': './assets/jp/research/QUEUE_REMAIN.png', 'tw': './assets/tw/research/QUEUE_REMAIN.png'}) QUEUE_REMAIN = Button(area={'cn': (156, 605, 272, 637), 'en': (151, 580, 278, 617), 'jp': (157, 605, 277, 636), 'tw': (165, 582, 275, 613)}, color={'cn': (193, 212, 240), 'en': (191, 210, 238), 'jp': (188, 208, 239), 'tw': (192, 211, 241)}, button={'cn': (156, 605, 272, 637), 'en': (151, 580, 278, 617), 'jp': (157, 605, 277, 636), 'tw': (165, 582, 275, 613)}, file={'cn': './assets/cn/research/QUEUE_REMAIN.png', 'en': './assets/en/research/QUEUE_REMAIN.png', 'jp': './assets/jp/research/QUEUE_REMAIN.png', 'tw': './assets/tw/research/QUEUE_REMAIN.png'})
QUEUE_SETIES_1 = Button(area={'cn': (66, 127, 99, 151), 'en': (66, 127, 99, 151), 'jp': (66, 127, 99, 151), 'tw': (66, 127, 99, 151)}, color={'cn': (196, 107, 90), 'en': (196, 107, 90), 'jp': (196, 107, 90), 'tw': (196, 107, 90)}, button={'cn': (66, 127, 99, 151), 'en': (66, 127, 99, 151), 'jp': (66, 127, 99, 151), 'tw': (66, 127, 99, 151)}, file={'cn': './assets/cn/research/QUEUE_SETIES_1.png', 'en': './assets/cn/research/QUEUE_SETIES_1.png', 'jp': './assets/cn/research/QUEUE_SETIES_1.png', 'tw': './assets/cn/research/QUEUE_SETIES_1.png'})
QUEUE_SETIES_2 = Button(area={'cn': (294, 127, 327, 151), 'en': (294, 127, 327, 151), 'jp': (294, 127, 327, 151), 'tw': (294, 127, 327, 151)}, color={'cn': (80, 98, 204), 'en': (80, 98, 204), 'jp': (80, 98, 204), 'tw': (80, 98, 204)}, button={'cn': (294, 127, 327, 151), 'en': (294, 127, 327, 151), 'jp': (294, 127, 327, 151), 'tw': (294, 127, 327, 151)}, file={'cn': './assets/cn/research/QUEUE_SETIES_2.png', 'en': './assets/cn/research/QUEUE_SETIES_2.png', 'jp': './assets/cn/research/QUEUE_SETIES_2.png', 'tw': './assets/cn/research/QUEUE_SETIES_2.png'})
QUEUE_SETIES_3 = Button(area={'cn': (523, 127, 556, 151), 'en': (523, 127, 556, 151), 'jp': (523, 127, 556, 151), 'tw': (523, 127, 556, 151)}, color={'cn': (200, 113, 98), 'en': (200, 113, 98), 'jp': (200, 113, 98), 'tw': (200, 113, 98)}, button={'cn': (523, 127, 556, 151), 'en': (523, 127, 556, 151), 'jp': (523, 127, 556, 151), 'tw': (523, 127, 556, 151)}, file={'cn': './assets/cn/research/QUEUE_SETIES_3.png', 'en': './assets/cn/research/QUEUE_SETIES_3.png', 'jp': './assets/cn/research/QUEUE_SETIES_3.png', 'tw': './assets/cn/research/QUEUE_SETIES_3.png'})
QUEUE_SETIES_4 = Button(area={'cn': (751, 127, 784, 151), 'en': (751, 127, 784, 151), 'jp': (751, 127, 784, 151), 'tw': (751, 127, 784, 151)}, color={'cn': (80, 101, 211), 'en': (80, 101, 211), 'jp': (80, 101, 211), 'tw': (80, 101, 211)}, button={'cn': (751, 127, 784, 151), 'en': (751, 127, 784, 151), 'jp': (751, 127, 784, 151), 'tw': (751, 127, 784, 151)}, file={'cn': './assets/cn/research/QUEUE_SETIES_4.png', 'en': './assets/cn/research/QUEUE_SETIES_4.png', 'jp': './assets/cn/research/QUEUE_SETIES_4.png', 'tw': './assets/cn/research/QUEUE_SETIES_4.png'})
QUEUE_SETIES_5 = Button(area={'cn': (979, 127, 1012, 151), 'en': (979, 127, 1012, 151), 'jp': (979, 127, 1012, 151), 'tw': (979, 127, 1012, 151)}, color={'cn': (200, 114, 100), 'en': (200, 114, 100), 'jp': (200, 114, 100), 'tw': (200, 114, 100)}, button={'cn': (979, 127, 1012, 151), 'en': (979, 127, 1012, 151), 'jp': (979, 127, 1012, 151), 'tw': (979, 127, 1012, 151)}, file={'cn': './assets/cn/research/QUEUE_SETIES_5.png', 'en': './assets/cn/research/QUEUE_SETIES_5.png', 'jp': './assets/cn/research/QUEUE_SETIES_5.png', 'tw': './assets/cn/research/QUEUE_SETIES_5.png'})
RESEARCH_COST_CHECKER = Button(area={'cn': (809, 365, 972, 386), 'en': (809, 365, 972, 386), 'jp': (809, 365, 972, 386), 'tw': (809, 365, 972, 386)}, color={'cn': (105, 114, 128), 'en': (105, 114, 128), 'jp': (105, 114, 128), 'tw': (105, 114, 128)}, button={'cn': (809, 365, 972, 386), 'en': (809, 365, 972, 386), 'jp': (809, 365, 972, 386), 'tw': (809, 365, 972, 386)}, file={'cn': './assets/cn/research/RESEARCH_COST_CHECKER.png', 'en': './assets/en/research/RESEARCH_COST_CHECKER.png', 'jp': './assets/jp/research/RESEARCH_COST_CHECKER.png', 'tw': './assets/tw/research/RESEARCH_COST_CHECKER.png'}) RESEARCH_COST_CHECKER = Button(area={'cn': (809, 365, 972, 386), 'en': (809, 365, 972, 386), 'jp': (809, 365, 972, 386), 'tw': (809, 365, 972, 386)}, color={'cn': (105, 114, 128), 'en': (105, 114, 128), 'jp': (105, 114, 128), 'tw': (105, 114, 128)}, button={'cn': (809, 365, 972, 386), 'en': (809, 365, 972, 386), 'jp': (809, 365, 972, 386), 'tw': (809, 365, 972, 386)}, file={'cn': './assets/cn/research/RESEARCH_COST_CHECKER.png', 'en': './assets/en/research/RESEARCH_COST_CHECKER.png', 'jp': './assets/jp/research/RESEARCH_COST_CHECKER.png', 'tw': './assets/tw/research/RESEARCH_COST_CHECKER.png'})
RESEARCH_DETAIL_QUIT = Button(area={'cn': (695, 656, 784, 707), 'en': (695, 656, 784, 707), 'jp': (695, 656, 784, 707), 'tw': (695, 656, 784, 707)}, color={'cn': (50, 57, 74), 'en': (50, 57, 74), 'jp': (50, 57, 74), 'tw': (50, 57, 74)}, button={'cn': (695, 656, 784, 707), 'en': (695, 656, 784, 707), 'jp': (695, 656, 784, 707), 'tw': (695, 656, 784, 707)}, file={'cn': './assets/cn/research/RESEARCH_DETAIL_QUIT.png', 'en': './assets/en/research/RESEARCH_DETAIL_QUIT.png', 'jp': './assets/jp/research/RESEARCH_DETAIL_QUIT.png', 'tw': './assets/tw/research/RESEARCH_DETAIL_QUIT.png'}) RESEARCH_DETAIL_QUIT = Button(area={'cn': (695, 656, 784, 707), 'en': (695, 656, 784, 707), 'jp': (695, 656, 784, 707), 'tw': (695, 656, 784, 707)}, color={'cn': (50, 57, 74), 'en': (50, 57, 74), 'jp': (50, 57, 74), 'tw': (50, 57, 74)}, button={'cn': (695, 656, 784, 707), 'en': (695, 656, 784, 707), 'jp': (695, 656, 784, 707), 'tw': (695, 656, 784, 707)}, file={'cn': './assets/cn/research/RESEARCH_DETAIL_QUIT.png', 'en': './assets/en/research/RESEARCH_DETAIL_QUIT.png', 'jp': './assets/jp/research/RESEARCH_DETAIL_QUIT.png', 'tw': './assets/tw/research/RESEARCH_DETAIL_QUIT.png'})
RESEARCH_FINISHED = Button(area={'cn': (384, 547, 502, 585), 'en': (382, 545, 504, 587), 'jp': (383, 546, 503, 586), 'tw': (384, 547, 502, 585)}, color={'cn': (233, 163, 69), 'en': (235, 174, 92), 'jp': (229, 159, 63), 'tw': (233, 163, 69)}, button={'cn': (384, 547, 502, 585), 'en': (382, 545, 504, 587), 'jp': (383, 546, 503, 586), 'tw': (384, 547, 502, 585)}, file={'cn': './assets/cn/research/RESEARCH_FINISHED.png', 'en': './assets/en/research/RESEARCH_FINISHED.png', 'jp': './assets/jp/research/RESEARCH_FINISHED.png', 'tw': './assets/tw/research/RESEARCH_FINISHED.png'}) RESEARCH_FINISHED = Button(area={'cn': (384, 547, 502, 585), 'en': (382, 545, 504, 587), 'jp': (383, 546, 503, 586), 'tw': (384, 547, 502, 585)}, color={'cn': (233, 163, 69), 'en': (235, 174, 92), 'jp': (229, 159, 63), 'tw': (233, 163, 69)}, button={'cn': (384, 547, 502, 585), 'en': (382, 545, 504, 587), 'jp': (383, 546, 503, 586), 'tw': (384, 547, 502, 585)}, file={'cn': './assets/cn/research/RESEARCH_FINISHED.png', 'en': './assets/en/research/RESEARCH_FINISHED.png', 'jp': './assets/jp/research/RESEARCH_FINISHED.png', 'tw': './assets/tw/research/RESEARCH_FINISHED.png'})
@ -60,6 +71,7 @@ STATUS_3 = Button(area={'cn': (549, 598, 556, 605), 'en': (549, 598, 556, 605),
STATUS_4 = Button(area={'cn': (790, 570, 796, 576), 'en': (790, 570, 796, 576), 'jp': (790, 570, 796, 576), 'tw': (790, 570, 796, 576)}, color={'cn': (115, 166, 222), 'en': (115, 166, 222), 'jp': (115, 166, 222), 'tw': (115, 166, 222)}, button={'cn': (790, 570, 796, 576), 'en': (790, 570, 796, 576), 'jp': (790, 570, 796, 576), 'tw': (790, 570, 796, 576)}, file={'cn': './assets/cn/research/STATUS_4.png', 'en': './assets/en/research/STATUS_4.png', 'jp': './assets/jp/research/STATUS_4.png', 'tw': './assets/tw/research/STATUS_4.png'}) STATUS_4 = Button(area={'cn': (790, 570, 796, 576), 'en': (790, 570, 796, 576), 'jp': (790, 570, 796, 576), 'tw': (790, 570, 796, 576)}, color={'cn': (115, 166, 222), 'en': (115, 166, 222), 'jp': (115, 166, 222), 'tw': (115, 166, 222)}, button={'cn': (790, 570, 796, 576), 'en': (790, 570, 796, 576), 'jp': (790, 570, 796, 576), 'tw': (790, 570, 796, 576)}, file={'cn': './assets/cn/research/STATUS_4.png', 'en': './assets/en/research/STATUS_4.png', 'jp': './assets/jp/research/STATUS_4.png', 'tw': './assets/tw/research/STATUS_4.png'})
STATUS_5 = Button(area={'cn': (1031, 541, 1037, 547), 'en': (1031, 541, 1037, 547), 'jp': (1031, 541, 1037, 547), 'tw': (1031, 541, 1037, 547)}, color={'cn': (115, 166, 222), 'en': (115, 166, 222), 'jp': (115, 166, 222), 'tw': (115, 166, 222)}, button={'cn': (1031, 541, 1037, 547), 'en': (1031, 541, 1037, 547), 'jp': (1031, 541, 1037, 547), 'tw': (1031, 541, 1037, 547)}, file={'cn': './assets/cn/research/STATUS_5.png', 'en': './assets/en/research/STATUS_5.png', 'jp': './assets/jp/research/STATUS_5.png', 'tw': './assets/tw/research/STATUS_5.png'}) STATUS_5 = Button(area={'cn': (1031, 541, 1037, 547), 'en': (1031, 541, 1037, 547), 'jp': (1031, 541, 1037, 547), 'tw': (1031, 541, 1037, 547)}, color={'cn': (115, 166, 222), 'en': (115, 166, 222), 'jp': (115, 166, 222), 'tw': (115, 166, 222)}, button={'cn': (1031, 541, 1037, 547), 'en': (1031, 541, 1037, 547), 'jp': (1031, 541, 1037, 547), 'tw': (1031, 541, 1037, 547)}, file={'cn': './assets/cn/research/STATUS_5.png', 'en': './assets/en/research/STATUS_5.png', 'jp': './assets/jp/research/STATUS_5.png', 'tw': './assets/tw/research/STATUS_5.png'})
TEMPLATE_DETAIL = Template(file={'cn': './assets/cn/research/TEMPLATE_DETAIL.png', 'en': './assets/en/research/TEMPLATE_DETAIL.png', 'jp': './assets/jp/research/TEMPLATE_DETAIL.png', 'tw': './assets/tw/research/TEMPLATE_DETAIL.png'}) TEMPLATE_DETAIL = Template(file={'cn': './assets/cn/research/TEMPLATE_DETAIL.png', 'en': './assets/en/research/TEMPLATE_DETAIL.png', 'jp': './assets/jp/research/TEMPLATE_DETAIL.png', 'tw': './assets/tw/research/TEMPLATE_DETAIL.png'})
TEMPLATE_FINISHED = Template(file={'cn': './assets/cn/research/TEMPLATE_FINISHED.png', 'en': './assets/cn/research/TEMPLATE_FINISHED.png', 'jp': './assets/cn/research/TEMPLATE_FINISHED.png', 'tw': './assets/cn/research/TEMPLATE_FINISHED.png'})
TEMPLATE_RUNNING = Template(file={'cn': './assets/cn/research/TEMPLATE_RUNNING.png', 'en': './assets/en/research/TEMPLATE_RUNNING.png', 'jp': './assets/jp/research/TEMPLATE_RUNNING.png', 'tw': './assets/tw/research/TEMPLATE_RUNNING.png'}) TEMPLATE_RUNNING = Template(file={'cn': './assets/cn/research/TEMPLATE_RUNNING.png', 'en': './assets/en/research/TEMPLATE_RUNNING.png', 'jp': './assets/jp/research/TEMPLATE_RUNNING.png', 'tw': './assets/tw/research/TEMPLATE_RUNNING.png'})
TEMPLATE_S1 = Template(file={'cn': './assets/cn/research/TEMPLATE_S1.png', 'en': './assets/en/research/TEMPLATE_S1.png', 'jp': './assets/jp/research/TEMPLATE_S1.png', 'tw': './assets/tw/research/TEMPLATE_S1.png'}) TEMPLATE_S1 = Template(file={'cn': './assets/cn/research/TEMPLATE_S1.png', 'en': './assets/en/research/TEMPLATE_S1.png', 'jp': './assets/jp/research/TEMPLATE_S1.png', 'tw': './assets/tw/research/TEMPLATE_S1.png'})
TEMPLATE_S2 = Template(file={'cn': './assets/cn/research/TEMPLATE_S2.png', 'en': './assets/en/research/TEMPLATE_S2.png', 'jp': './assets/jp/research/TEMPLATE_S2.png', 'tw': './assets/tw/research/TEMPLATE_S2.png'}) TEMPLATE_S2 = Template(file={'cn': './assets/cn/research/TEMPLATE_S2.png', 'en': './assets/en/research/TEMPLATE_S2.png', 'jp': './assets/jp/research/TEMPLATE_S2.png', 'tw': './assets/tw/research/TEMPLATE_S2.png'})

View File

@ -7,3 +7,4 @@ from module.base.template import Template
CAMPAIGN_BONUS = Button(area={'cn': (404, 149, 439, 166), 'en': (406, 150, 477, 162), 'jp': (404, 150, 476, 167), 'tw': (404, 149, 439, 166)}, color={'cn': (188, 195, 207), 'en': (199, 204, 212), 'jp': (207, 211, 218), 'tw': (188, 195, 207)}, button={'cn': (404, 149, 439, 166), 'en': (406, 150, 477, 162), 'jp': (404, 150, 476, 167), 'tw': (404, 149, 439, 166)}, file={'cn': './assets/cn/statistics/CAMPAIGN_BONUS.png', 'en': './assets/en/statistics/CAMPAIGN_BONUS.png', 'jp': './assets/jp/statistics/CAMPAIGN_BONUS.png', 'tw': './assets/cn/statistics/CAMPAIGN_BONUS.png'}) CAMPAIGN_BONUS = Button(area={'cn': (404, 149, 439, 166), 'en': (406, 150, 477, 162), 'jp': (404, 150, 476, 167), 'tw': (404, 149, 439, 166)}, color={'cn': (188, 195, 207), 'en': (199, 204, 212), 'jp': (207, 211, 218), 'tw': (188, 195, 207)}, button={'cn': (404, 149, 439, 166), 'en': (406, 150, 477, 162), 'jp': (404, 150, 476, 167), 'tw': (404, 149, 439, 166)}, file={'cn': './assets/cn/statistics/CAMPAIGN_BONUS.png', 'en': './assets/en/statistics/CAMPAIGN_BONUS.png', 'jp': './assets/jp/statistics/CAMPAIGN_BONUS.png', 'tw': './assets/cn/statistics/CAMPAIGN_BONUS.png'})
ENEMY_NAME = Button(area={'cn': (781, 283, 965, 322), 'en': (781, 283, 965, 322), 'jp': (781, 283, 965, 322), 'tw': (781, 283, 965, 322)}, color={'cn': (92, 102, 119), 'en': (92, 102, 119), 'jp': (92, 102, 119), 'tw': (92, 102, 119)}, button={'cn': (781, 283, 965, 322), 'en': (781, 283, 965, 322), 'jp': (781, 283, 965, 322), 'tw': (781, 283, 965, 322)}, file={'cn': './assets/cn/statistics/ENEMY_NAME.png', 'en': './assets/en/statistics/ENEMY_NAME.png', 'jp': './assets/jp/statistics/ENEMY_NAME.png', 'tw': './assets/tw/statistics/ENEMY_NAME.png'}) ENEMY_NAME = Button(area={'cn': (781, 283, 965, 322), 'en': (781, 283, 965, 322), 'jp': (781, 283, 965, 322), 'tw': (781, 283, 965, 322)}, color={'cn': (92, 102, 119), 'en': (92, 102, 119), 'jp': (92, 102, 119), 'tw': (92, 102, 119)}, button={'cn': (781, 283, 965, 322), 'en': (781, 283, 965, 322), 'jp': (781, 283, 965, 322), 'tw': (781, 283, 965, 322)}, file={'cn': './assets/cn/statistics/ENEMY_NAME.png', 'en': './assets/en/statistics/ENEMY_NAME.png', 'jp': './assets/jp/statistics/ENEMY_NAME.png', 'tw': './assets/tw/statistics/ENEMY_NAME.png'})
GET_ITEMS_ODD = Button(area={'cn': (628, 294, 653, 397), 'en': (628, 294, 653, 397), 'jp': (628, 294, 653, 397), 'tw': (628, 294, 653, 397)}, color={'cn': (98, 103, 121), 'en': (98, 103, 121), 'jp': (98, 103, 121), 'tw': (98, 103, 121)}, button={'cn': (628, 294, 653, 397), 'en': (628, 294, 653, 397), 'jp': (628, 294, 653, 397), 'tw': (628, 294, 653, 397)}, file={'cn': './assets/cn/statistics/GET_ITEMS_ODD.png', 'en': './assets/en/statistics/GET_ITEMS_ODD.png', 'jp': './assets/jp/statistics/GET_ITEMS_ODD.png', 'tw': './assets/tw/statistics/GET_ITEMS_ODD.png'}) GET_ITEMS_ODD = Button(area={'cn': (628, 294, 653, 397), 'en': (628, 294, 653, 397), 'jp': (628, 294, 653, 397), 'tw': (628, 294, 653, 397)}, color={'cn': (98, 103, 121), 'en': (98, 103, 121), 'jp': (98, 103, 121), 'tw': (98, 103, 121)}, button={'cn': (628, 294, 653, 397), 'en': (628, 294, 653, 397), 'jp': (628, 294, 653, 397), 'tw': (628, 294, 653, 397)}, file={'cn': './assets/cn/statistics/GET_ITEMS_ODD.png', 'en': './assets/en/statistics/GET_ITEMS_ODD.png', 'jp': './assets/jp/statistics/GET_ITEMS_ODD.png', 'tw': './assets/tw/statistics/GET_ITEMS_ODD.png'})
OPSI_REWARD = Button(area={'cn': (334, 149, 369, 165), 'en': (334, 149, 369, 165), 'jp': (334, 149, 369, 165), 'tw': (334, 149, 369, 165)}, color={'cn': (182, 193, 204), 'en': (182, 193, 204), 'jp': (182, 193, 204), 'tw': (182, 193, 204)}, button={'cn': (334, 149, 369, 165), 'en': (334, 149, 369, 165), 'jp': (334, 149, 369, 165), 'tw': (334, 149, 369, 165)}, file={'cn': './assets/cn/statistics/OPSI_REWARD.png', 'en': './assets/cn/statistics/OPSI_REWARD.png', 'jp': './assets/cn/statistics/OPSI_REWARD.png', 'tw': './assets/cn/statistics/OPSI_REWARD.png'})

View File

@ -1,5 +1,6 @@
import traceback import traceback
from module.coalition.assets import *
from module.ui.assets import * from module.ui.assets import *
from module.ui_white.assets import * from module.ui_white.assets import *
@ -125,10 +126,20 @@ page_sp.link(button=BACK_ARROW, destination=page_campaign)
page_campaign_menu.link(button=CAMPAIGN_MENU_GOTO_EVENT, destination=page_sp) page_campaign_menu.link(button=CAMPAIGN_MENU_GOTO_EVENT, destination=page_sp)
page_campaign.link(button=CAMPAIGN_GOTO_EVENT, destination=page_sp) page_campaign.link(button=CAMPAIGN_GOTO_EVENT, destination=page_sp)
page_coalition = Page(COALITION_CHECK) # Coalition
page_coalition.link(button=GOTO_MAIN, destination=page_main) # FROSTFALL
page_coalition.link(button=BACK_ARROW, destination=page_campaign) # page_coalition = Page(COALITION_CHECK)
# page_coalition.link(button=GOTO_MAIN, destination=page_main)
# page_coalition.link(button=BACK_ARROW, destination=page_campaign)
# page_campaign_menu.link(button=CAMPAIGN_MENU_GOTO_EVENT, destination=page_coalition)
# ACADEMY
page_coalition_menu = Page(COALITION_ACADEMY_MAIN_CHECK)
page_coalition_menu.link(button=COALITION_ACADEMY_HOME, destination=page_main)
page_coalition = Page(COALITION_ACADEMY_CAMPAIGN_CHECK)
page_coalition.link(button=COALITION_ACADEMY_HOME, destination=page_main)
page_coalition.link(button=COALITION_ACADEMY_BACK, destination=page_coalition_menu)
page_campaign_menu.link(button=CAMPAIGN_MENU_GOTO_EVENT, destination=page_coalition) page_campaign_menu.link(button=CAMPAIGN_MENU_GOTO_EVENT, destination=page_coalition)
page_coalition_menu.link(button=COALITION_ACADEMY_GOTO_CAMPAIGN, destination=page_coalition)
# Operation Siren # Operation Siren
page_os = Page(OS_CHECK) page_os = Page(OS_CHECK)

View File

@ -1,7 +1,6 @@
from module.base.button import Button from module.base.button import Button
from module.base.decorator import run_once from module.base.decorator import run_once
from module.base.timer import Timer from module.base.timer import Timer
from module.coalition.assets import FLEET_PREPARATION as COALITION_FLEET_PREPARATION
from module.combat.assets import GET_ITEMS_1, GET_ITEMS_2, GET_SHIP from module.combat.assets import GET_ITEMS_1, GET_ITEMS_2, GET_SHIP
from module.exception import (GameNotRunningError, GamePageUnknownError, from module.exception import (GameNotRunningError, GamePageUnknownError,
RequestHumanTakeover) RequestHumanTakeover)
@ -19,7 +18,7 @@ from module.ocr.ocr import Ocr
from module.os_handler.assets import (AUTO_SEARCH_REWARD, EXCHANGE_CHECK, RESET_FLEET_PREPARATION, RESET_TICKET_POPUP) from module.os_handler.assets import (AUTO_SEARCH_REWARD, EXCHANGE_CHECK, RESET_FLEET_PREPARATION, RESET_TICKET_POPUP)
from module.raid.assets import * from module.raid.assets import *
from module.ui.assets import * from module.ui.assets import *
from module.ui.page import (Page, page_campaign, page_event, page_main, page_sp, page_main_white) from module.ui.page import (Page, page_campaign, page_event, page_main, page_main_white, page_sp)
from module.ui_white.assets import * from module.ui_white.assets import *
@ -495,8 +494,7 @@ class UI(InfoHandler):
# Campaign preparation # Campaign preparation
if self.appear(MAP_PREPARATION, offset=(30, 30), interval=3) \ if self.appear(MAP_PREPARATION, offset=(30, 30), interval=3) \
or self.appear(FLEET_PREPARATION, offset=(20, 50), interval=3) \ or self.appear(FLEET_PREPARATION, offset=(20, 50), interval=3) \
or self.appear(RAID_FLEET_PREPARATION, offset=(30, 30), interval=3) \ or self.appear(RAID_FLEET_PREPARATION, offset=(30, 30), interval=3):
or self.appear(COALITION_FLEET_PREPARATION, offset=(30, 30), interval=3):
self.device.click(MAP_PREPARATION_CANCEL) self.device.click(MAP_PREPARATION_CANCEL)
return True return True
if self.appear_then_click(AUTO_SEARCH_MENU_EXIT, offset=(200, 30), interval=3): if self.appear_then_click(AUTO_SEARCH_MENU_EXIT, offset=(200, 30), interval=3):