diff --git a/assets/cn/campaign/REMOVE_SHIP.png b/assets/cn/campaign/REMOVE_SHIP.png new file mode 100644 index 000000000..151fdf567 Binary files /dev/null and b/assets/cn/campaign/REMOVE_SHIP.png differ diff --git a/bin/Lua/ShipChanger.lua b/bin/Lua/ShipChanger.lua new file mode 100644 index 000000000..bcde29f6f --- /dev/null +++ b/bin/Lua/ShipChanger.lua @@ -0,0 +1,52 @@ +function string.split(s, p) + local Result= {} + string.gsub(s, '[^'..p..']+', function(w) table.insert(Result, w) end) + return Result +end + +function ChangeShip() + local Result = gg.prompt({"舰船Id", "当前舰种Id", "目标舰种Id"} + ,{} + ,{"number", "number", "number"}) + + local ShipIdList = string.split(tostring(Result[1]), ";") + local ShipTypeIdList = string.split(tostring(Result[2]), ";") + local TargetShipTypeIdList = string.split(tostring(Result[3]), ";") + + if #ShipIdList ~= #ShipTypeIdList or #ShipIdList ~= #TargetShipTypeIdList then + Exit("参数数量不匹配!") + end + + for i = 1, #ShipIdList do + -- | here is the shar of ship + -- v + gg.searchNumber(ShipIdList[i]..";1;"..ShipTypeIdList[i].."::610", gg.TYPE_DOUBLE) + gg.refineNumber(ShipTypeIdList[i], gg.TYPE_AUTO) + gg.getResults(1024) + gg.editAll(TargetShipTypeIdList[i], gg.TYPE_DOUBLE) + gg.clearResults() + end + Exit("修改成功!") +end + +function Exit(Message) + gg.alert(Message) + os.exit() +end + +function Main() + Choice = gg.choice({ + "改船", + "退出", + }, nil, nil) + if Choice == 1 then + ChangeShip() + end + if Choice == 2 then + Exit("退出成功!") + end + FX=false +end + +gg.clearResults() +Main() \ No newline at end of file diff --git a/config/template.json b/config/template.json index 8b8f60b15..5c1c5396e 100644 --- a/config/template.json +++ b/config/template.json @@ -1953,6 +1953,12 @@ "Raid": 16500, "Ash": 16500 }, + "ChangeShip": { + "Enable": false, + "PushLua": false, + "TargetType": "BB", + "ShipData": "106021;1;6\n107041;1;6\n206011;1;6\n107011;1;6\n" + }, "Storage": { "Storage": {} } diff --git a/module/campaign/assets.py b/module/campaign/assets.py index 0cb30d7f3..a35da497c 100644 --- a/module/campaign/assets.py +++ b/module/campaign/assets.py @@ -15,6 +15,7 @@ OCR_GEM = Button(area={'cn': (1024, 23, 1137, 51), 'en': (1024, 23, 1137, 51), ' OCR_OIL = Button(area={'cn': (614, 23, 714, 51), 'en': (614, 23, 714, 51), 'jp': (614, 23, 714, 51), 'tw': (614, 23, 714, 51)}, color={'cn': (64, 65, 79), 'en': (64, 65, 79), 'jp': (64, 65, 79), 'tw': (64, 65, 79)}, button={'cn': (614, 23, 714, 51), 'en': (614, 23, 714, 51), 'jp': (614, 23, 714, 51), 'tw': (614, 23, 714, 51)}, file={'cn': './assets/cn/campaign/OCR_OIL.png', 'en': './assets/en/campaign/OCR_OIL.png', 'jp': './assets/jp/campaign/OCR_OIL.png', 'tw': './assets/tw/campaign/OCR_OIL.png'}) OCR_OIL_CHECK = Button(area={'cn': (573, 30, 592, 49), 'en': (573, 30, 592, 49), 'jp': (573, 30, 592, 49), 'tw': (573, 30, 592, 49)}, color={'cn': (82, 82, 82), 'en': (82, 82, 82), 'jp': (82, 82, 82), 'tw': (82, 82, 82)}, button={'cn': (573, 30, 592, 49), 'en': (573, 30, 592, 49), 'jp': (573, 30, 592, 49), 'tw': (573, 30, 592, 49)}, file={'cn': './assets/cn/campaign/OCR_OIL_CHECK.png', 'en': './assets/en/campaign/OCR_OIL_CHECK.png', 'jp': './assets/jp/campaign/OCR_OIL_CHECK.png', 'tw': './assets/tw/campaign/OCR_OIL_CHECK.png'}) OCR_OIL_LIMIT = Button(area={'cn': (608, 0, 736, 19), 'en': (608, 0, 736, 19), 'jp': (608, 0, 736, 19), 'tw': (608, 0, 736, 19)}, color={'cn': (202, 202, 202), 'en': (202, 202, 202), 'jp': (202, 202, 202), 'tw': (202, 202, 202)}, button={'cn': (608, 0, 736, 19), 'en': (608, 0, 736, 19), 'jp': (608, 0, 736, 19), 'tw': (608, 0, 736, 19)}, file={'cn': './assets/cn/campaign/OCR_OIL_LIMIT.png', 'en': './assets/en/campaign/OCR_OIL_LIMIT.png', 'jp': './assets/jp/campaign/OCR_OIL_LIMIT.png', 'tw': './assets/tw/campaign/OCR_OIL_LIMIT.png'}) +REMOVE_SHIP = Button(area={'cn': (161, 148, 223, 211), 'en': (161, 148, 223, 211), 'jp': (161, 148, 223, 211), 'tw': (161, 148, 223, 211)}, color={'cn': (127, 128, 129), 'en': (127, 128, 129), 'jp': (127, 128, 129), 'tw': (127, 128, 129)}, button={'cn': (161, 148, 223, 211), 'en': (161, 148, 223, 211), 'jp': (161, 148, 223, 211), 'tw': (161, 148, 223, 211)}, file={'cn': './assets/cn/campaign/REMOVE_SHIP.png', 'en': './assets/cn/campaign/REMOVE_SHIP.png', 'jp': './assets/cn/campaign/REMOVE_SHIP.png', 'tw': './assets/cn/campaign/REMOVE_SHIP.png'}) SWITCH_1_HARD = Button(area={'cn': (82, 641, 148, 675), 'en': (87, 642, 148, 676), 'jp': (24, 645, 150, 697), 'tw': (82, 641, 148, 675)}, color={'cn': (233, 141, 128), 'en': (234, 139, 124), 'jp': (219, 116, 106), 'tw': (236, 159, 148)}, button={'cn': (82, 641, 148, 675), 'en': (87, 642, 148, 676), 'jp': (24, 645, 150, 697), 'tw': (82, 641, 148, 675)}, file={'cn': './assets/cn/campaign/SWITCH_1_HARD.png', 'en': './assets/en/campaign/SWITCH_1_HARD.png', 'jp': './assets/jp/campaign/SWITCH_1_HARD.png', 'tw': './assets/tw/campaign/SWITCH_1_HARD.png'}) SWITCH_1_NORMAL = Button(area={'cn': (80, 641, 148, 675), 'en': (79, 638, 147, 675), 'jp': (24, 644, 150, 697), 'tw': (79, 641, 148, 675)}, color={'cn': (157, 180, 227), 'en': (157, 180, 227), 'jp': (143, 169, 222), 'tw': (156, 179, 227)}, button={'cn': (80, 641, 148, 675), 'en': (79, 638, 147, 675), 'jp': (24, 644, 150, 697), 'tw': (79, 641, 148, 675)}, file={'cn': './assets/cn/campaign/SWITCH_1_NORMAL.png', 'en': './assets/en/campaign/SWITCH_1_NORMAL.png', 'jp': './assets/jp/campaign/SWITCH_1_NORMAL.png', 'tw': './assets/tw/campaign/SWITCH_1_NORMAL.png'}) SWITCH_2_EX = Button(area={'cn': (241, 642, 311, 690), 'en': (251, 644, 313, 697), 'jp': (186, 638, 314, 692), 'tw': (241, 640, 312, 692)}, color={'cn': (254, 161, 74), 'en': (254, 163, 80), 'jp': (205, 136, 64), 'tw': (254, 161, 72)}, button={'cn': (241, 642, 311, 690), 'en': (251, 644, 313, 697), 'jp': (186, 638, 314, 692), 'tw': (241, 640, 312, 692)}, file={'cn': './assets/cn/campaign/SWITCH_2_EX.png', 'en': './assets/en/campaign/SWITCH_2_EX.png', 'jp': './assets/jp/campaign/SWITCH_2_EX.png', 'tw': './assets/tw/campaign/SWITCH_2_EX.png'}) diff --git a/module/campaign/gems_farming.py b/module/campaign/gems_farming.py index ab0ec296c..1e8346790 100644 --- a/module/campaign/gems_farming.py +++ b/module/campaign/gems_farming.py @@ -1,4 +1,5 @@ from module.campaign.campaign_base import CampaignBase +from module.campaign.assets import REMOVE_SHIP from module.campaign.run import CampaignRun from module.combat.assets import BATTLE_PREPARATION from module.equipment.assets import * @@ -14,6 +15,7 @@ from module.retire.dock import Dock from module.retire.scanner import ShipScanner from module.ui.page import page_fleet, page_event from module.ui.assets import BACK_ARROW +from module.config.config import deep_get import inflection SIM_VALUE = 0.95 @@ -142,7 +144,7 @@ class GemsFarming(CampaignRun, Dock, EquipmentChange): from module.retire.retirement import Retirement if Retirement(config=self.config, device=self.device).handle_retirement(): continue - if self.appear(button=FLEET_PREPARATION, offset=(50,50)): + if self.appear(button=FLEET_PREPARATION, offset=(50, 50)): return from module.exception import RequestHumanTakeover raise RequestHumanTakeover @@ -332,8 +334,20 @@ class GemsFarming(CampaignRun, Dock, EquipmentChange): """ self.ui_click(self.FLEET_ENTER_FLAGSHIP, appear_button=self.page_fleet_check_button, check_button=DOCK_CHECK, skip_first_screenshot=True) - self.dock_filter_set( - index='cv', rarity='common', extra='enhanceable', sort='total') + self.wait_until_appear_then_click(REMOVE_SHIP) + + self._fleet_detail_enter() + self.ui_click(self.FLEET_ENTER_FLAGSHIP, + appear_button=self.page_fleet_check_button, check_button=DOCK_CHECK, skip_first_screenshot=True) + if deep_get(self.config.data, "GameManager.ChangeShip.Enable") \ + and deep_get(self.config.data, "GemsFarming.Campaign.Name").upper() in ["C1", "C2", "C3", "D1", + "D2", "D3"]: + self.dock_filter_set( + index=deep_get(self.config.data, "GameManager.ChangeShip.TargetType").lower(), rarity='common', + extra='enhanceable', sort='total') + else: + self.dock_filter_set( + index='cv', rarity='common', extra='enhanceable', sort='total') self.dock_favourite_set(False) ship = self.get_common_rarity_cv() diff --git a/module/config/argument/args.json b/module/config/argument/args.json index b53cec390..bd56c7d25 100644 --- a/module/config/argument/args.json +++ b/module/config/argument/args.json @@ -9392,6 +9392,28 @@ "value": 16500 } }, + "ChangeShip": { + "Enable": { + "type": "checkbox", + "value": false + }, + "PushLua": { + "type": "checkbox", + "value": false + }, + "TargetType": { + "type": "select", + "value": "BB", + "option": [ + "CV", + "BB" + ] + }, + "ShipData": { + "type": "textarea", + "value": "106021;1;6\n107041;1;6\n206011;1;6\n107011;1;6\n" + } + }, "Storage": { "Storage": { "type": "storage", diff --git a/module/config/argument/argument.yaml b/module/config/argument/argument.yaml index 2a19f01db..b5618f4c8 100644 --- a/module/config/argument/argument.yaml +++ b/module/config/argument/argument.yaml @@ -727,6 +727,21 @@ PowerLimit: Exercise: 16500 Raid: 16500 Ash: 16500 +ChangeShip: + Enable: false + PushLua: false + TargetType: + value: BB + option: + - CV #正航 + - BB #战列 + ShipData: + type: textarea + value: | + 106021;1;6 + 107041;1;6 + 206011;1;6 + 107011;1;6 InfiniteDelay: Commission: diff --git a/module/config/argument/default.yaml b/module/config/argument/default.yaml index 1721c5969..6a2d5e91d 100644 --- a/module/config/argument/default.yaml +++ b/module/config/argument/default.yaml @@ -58,3 +58,13 @@ Freebies: # ==================== DailyMission ==================== # ==================== Opsi ==================== + +# ==================== ChangeShip ==================== +ChangeShip: + ShipData: + ShipData: | + 106021;1;6 + 107041;1;6 + 206011;1;6 + 107011;1;6 + diff --git a/module/config/argument/task.yaml b/module/config/argument/task.yaml index a04ad4107..cf0856e2b 100644 --- a/module/config/argument/task.yaml +++ b/module/config/argument/task.yaml @@ -341,6 +341,7 @@ Tool: - GameManager - GGHandler - PowerLimit + - ChangeShip SomethingSpecial: - InfiniteDelay - TurnOffForcedOnSettings diff --git a/module/config/config_generated.py b/module/config/config_generated.py index b76805a24..f886c647c 100644 --- a/module/config/config_generated.py +++ b/module/config/config_generated.py @@ -448,6 +448,12 @@ class GeneratedConfig: PowerLimit_Raid = 16500 PowerLimit_Ash = 16500 + # Group `ChangeShip` + ChangeShip_Enable = False + ChangeShip_PushLua = False + ChangeShip_TargetType = 'BB' # CV, BB + ChangeShip_ShipData = '106021;1;6\n107041;1;6\n206011;1;6\n107011;1;6\n' + # Group `InfiniteDelay` InfiniteDelay_Commission = False InfiniteDelay_Research = False diff --git a/module/config/i18n/en-US.json b/module/config/i18n/en-US.json index 2d4c83ed9..4e89e51d8 100644 --- a/module/config/i18n/en-US.json +++ b/module/config/i18n/en-US.json @@ -2513,6 +2513,30 @@ "help": "" } }, + "ChangeShip": { + "_info": { + "name": "ChangeShip._info.name", + "help": "ChangeShip._info.help" + }, + "Enable": { + "name": "ChangeShip.Enable.name", + "help": "ChangeShip.Enable.help" + }, + "PushLua": { + "name": "ChangeShip.PushLua.name", + "help": "ChangeShip.PushLua.help" + }, + "TargetType": { + "name": "ChangeShip.TargetType.name", + "help": "ChangeShip.TargetType.help", + "CV": "CV", + "BB": "BB" + }, + "ShipData": { + "name": "ChangeShip.ShipData.name", + "help": "ChangeShip.ShipData.help" + } + }, "InfiniteDelay": { "_info": { "name": "InfiniteDelay._info.name", diff --git a/module/config/i18n/ja-JP.json b/module/config/i18n/ja-JP.json index 96f66d043..d5a2e44da 100644 --- a/module/config/i18n/ja-JP.json +++ b/module/config/i18n/ja-JP.json @@ -2513,6 +2513,30 @@ "help": "PowerLimit.Ash.help" } }, + "ChangeShip": { + "_info": { + "name": "ChangeShip._info.name", + "help": "ChangeShip._info.help" + }, + "Enable": { + "name": "ChangeShip.Enable.name", + "help": "ChangeShip.Enable.help" + }, + "PushLua": { + "name": "ChangeShip.PushLua.name", + "help": "ChangeShip.PushLua.help" + }, + "TargetType": { + "name": "ChangeShip.TargetType.name", + "help": "ChangeShip.TargetType.help", + "CV": "CV", + "BB": "BB" + }, + "ShipData": { + "name": "ChangeShip.ShipData.name", + "help": "ChangeShip.ShipData.help" + } + }, "InfiniteDelay": { "_info": { "name": "InfiniteDelay._info.name", diff --git a/module/config/i18n/zh-CN.json b/module/config/i18n/zh-CN.json index 45a2ddb59..d874ea32a 100644 --- a/module/config/i18n/zh-CN.json +++ b/module/config/i18n/zh-CN.json @@ -2513,6 +2513,30 @@ "help": "" } }, + "ChangeShip": { + "_info": { + "name": "改船(高危功能,未经过充分测试,封号概不负责)", + "help": "只在紧急委托中并且设置为活动里的CD图时生效\n需要和倍率一起使用" + }, + "Enable": { + "name": "启用", + "help": "" + }, + "PushLua": { + "name": "始终推送Lua", + "help": "有时推送时会失败,视情况开启或者关闭" + }, + "TargetType": { + "name": "目标舰种", + "help": "困难图中后排锁定的舰种", + "CV": "正航", + "BB": "战列" + }, + "ShipData": { + "name": "舰船数据", + "help": "格式为\"舰船Id;星级;舰种Id\"\n参考https://github.com/0O0o0oOoO00/SmallKai中的数据\n清空会恢复默认" + } + }, "InfiniteDelay": { "_info": { "name": "无限推迟", diff --git a/module/config/i18n/zh-TW.json b/module/config/i18n/zh-TW.json index 28bf32d0f..41818a6ed 100644 --- a/module/config/i18n/zh-TW.json +++ b/module/config/i18n/zh-TW.json @@ -2513,6 +2513,30 @@ "help": "" } }, + "ChangeShip": { + "_info": { + "name": "ChangeShip._info.name", + "help": "ChangeShip._info.help" + }, + "Enable": { + "name": "ChangeShip.Enable.name", + "help": "ChangeShip.Enable.help" + }, + "PushLua": { + "name": "ChangeShip.PushLua.name", + "help": "ChangeShip.PushLua.help" + }, + "TargetType": { + "name": "ChangeShip.TargetType.name", + "help": "ChangeShip.TargetType.help", + "CV": "CV", + "BB": "BB" + }, + "ShipData": { + "name": "ChangeShip.ShipData.name", + "help": "ChangeShip.ShipData.help" + } + }, "InfiniteDelay": { "_info": { "name": "InfiniteDelay._info.name", diff --git a/module/gg_handler/change_ship.py b/module/gg_handler/change_ship.py new file mode 100644 index 000000000..16b34a54d --- /dev/null +++ b/module/gg_handler/change_ship.py @@ -0,0 +1,107 @@ +from enum import Enum +from module.logger import logger +from module.gg_handler.gg_data import GGData +from module.config.config import deep_get +from module.base.base import ModuleBase +import uiautomator2 as u2 + + +class ShipType(Enum): + CV = 7 + BB = 5 + + +class ShipData: + def __init__(self, DataStr: str): + DataList = DataStr.split(";") + self.ShipId = DataList[0] + self.Star = DataList[1] + self.ShipType = DataList[2] + + +class ChangeShip(ModuleBase): + + def __init__(self, config, device): + super().__init__(config, device) + self.d = u2.connect(self.device.serial) + self.gg_package_name = deep_get(self.config.data, keys='GameManager.GGHandler.GGPackageName') + + def GetShipData(self): + DataList = list() + for i in deep_get(self.config.data, "GameManager.ChangeShip.ShipData").split("\n"): + if i: + DataList.append(ShipData(i)) + return DataList + + def PushLua(self): + IsPush = deep_get(self.config.data, keys='GameManager.ChangeShip.PushLua') + if IsPush: + import os + os.popen(f'"toolkit/Lib/site-packages/adbutils/binaries/adb.exe" -s' + f' {self.device.serial} shell mkdir /sdcard/Notes') + self.device.sleep(0.5) + os.popen(f'"toolkit/Lib/site-packages/adbutils/binaries/adb.exe" -s' + f' {self.device.serial} shell rm /sdcard/Notes/ShipChanger.lua') + self.device.sleep(0.5) + os.popen(f'"toolkit/Lib/site-packages/adbutils/binaries/adb.exe" -s' + f' {self.device.serial} push "bin/Lua/ShipChanger.lua" /sdcard/Notes/ShipChanger.lua') + self.device.sleep(0.5) + logger.info('Lua Pushed') + + def ChangeShipType(self): + if not self.config.is_task_enabled("GemsFarming") \ + or deep_get(self.config.data, "GemsFarming.Campaign.Name").upper() not in ["C1", "C2", "C3", "D1", "D2", + "D3"]: + return 0 + _set = False + _confirmed = False + while 1: + if self.d(resourceId=f"{self.gg_package_name}:id/search_toolbar").exists: + self.d.xpath( + f'//*[@resource-id="{self.gg_package_name}' + f':id/search_toolbar"]/android.widget.ImageView[last()]' + ).click() + self.device.sleep(1) + if self.d(resourceId=f"{self.gg_package_name}:id/file").exists: + self.d(resourceId=f"{self.gg_package_name}:id/file").send_keys("/sdcard/Notes/ShipChanger.lua") + logger.info('Lua path set') + if self.d.xpath('//*[@text="执行"]').exists: + self.d.xpath('//*[@text="执行"]').click() + logger.info('Click Run') + self.device.sleep(0.5) + if self.d.xpath('//*[contains(@text,"改船")]').exists: + self.d.xpath('//*[contains(@text,"改船")]').click() + logger.info('Click Change Statistic') + self.device.sleep(0.5) + if self.d(resourceId=f"{self.gg_package_name}:id/edit").exists: + ShipDataList = self.GetShipData() + ShipIdStr = ";".join([str(i.ShipId) for i in ShipDataList]) + ShipStarStr = ";".join([str(i.Star) for i in ShipDataList]) + CurrentShipTypeStr = ";".join([str(i.ShipType) for i in ShipDataList]) + TargetShipTypeStr = ";".join([str(ShipType[deep_get(self.config.data, "GameManager.ChangeShip.TargetType")].value)] * len(ShipDataList)) + self.d(resourceId=f"{self.gg_package_name}:id/edit")[0].send_keys(ShipIdStr) + self.d(resourceId=f"{self.gg_package_name}:id/edit")[1].send_keys(ShipStarStr) + self.d(resourceId=f"{self.gg_package_name}:id/edit")[2].send_keys(CurrentShipTypeStr) + self.d(resourceId=f"{self.gg_package_name}:id/edit")[3].send_keys(TargetShipTypeStr) + self.device.sleep(0.5) + _set = True + if _set and self.d.xpath('//*[@text="确定"]').exists: + self.d.xpath('//*[@text="确定"]').click() + logger.info("Click confirm") + self.device.sleep(0.5) + _confirmed = True + self.d.wait_timeout = 90.0 + + if _set and _confirmed: + try: + self.d.xpath('//*[@text="确定"]').click() + self.device.sleep(0.5) + self.d.xpath('//*[@text="确定"]').click() + finally: + pass + self.d.wait_timeout = 3 + if _set and _confirmed: + break + else: + return 0 + diff --git a/module/gg_handler/gg_u2.py b/module/gg_handler/gg_u2.py index bc296bc83..9aaf915bf 100644 --- a/module/gg_handler/gg_u2.py +++ b/module/gg_handler/gg_u2.py @@ -3,6 +3,7 @@ from module.gg_handler.gg_data import GGData from module.config.config import deep_get from module.base.base import ModuleBase as Base import uiautomator2 as u2 +from module.gg_handler.change_ship import ChangeShip class GGU2(Base): @@ -129,6 +130,8 @@ class GGU2(Base): _confirmed = False import os _repush = deep_get(self.config.data, keys='GameManager.GGHandler.RepushLua') + ShipChanger = ChangeShip(self.config, self.device) + ShipChanger.PushLua() if _repush: os.popen(f'"toolkit/Lib/site-packages/adbutils/binaries/adb.exe" -s' f' {self.device.serial} shell mkdir /sdcard/Notes') @@ -140,8 +143,16 @@ class GGU2(Base): f' {self.device.serial} push "bin/Lua/Multiplier.lua" /sdcard/Notes/Multiplier.lua') self.device.sleep(0.5) logger.info('Lua Pushed') + ShipChanger.ChangeShipType() while 1: self.device.sleep(1) + if self.d(resourceId=f"{self.gg_package_name}:id/search_toolbar").exists: + self.d.xpath( + f'//*[@resource-id="{self.gg_package_name}' + f':id/search_toolbar"]/android.widget.ImageView[last()]' + ).click() + logger.info('Click run Scripts') + self.device.sleep(0.3) if self.d(resourceId=f"{self.gg_package_name}:id/file").exists: self.d(resourceId=f"{self.gg_package_name}:id/file").send_keys("/sdcard/Notes/Multiplier.lua") logger.info('Lua path set') diff --git a/module/retire/assets.py b/module/retire/assets.py index a192a665e..9239308a4 100644 --- a/module/retire/assets.py +++ b/module/retire/assets.py @@ -52,7 +52,7 @@ TEMPLATE_FLEET_6 = Template(file={'cn': './assets/cn/retire/TEMPLATE_FLEET_6.png TEMPLATE_HERMES = Template(file={'cn': './assets/cn/retire/TEMPLATE_HERMES.png', 'en': './assets/en/retire/TEMPLATE_HERMES.png', 'jp': './assets/jp/retire/TEMPLATE_HERMES.png', 'tw': './assets/tw/retire/TEMPLATE_HERMES.png'}) TEMPLATE_IN_BATTLE = Template(file={'cn': './assets/cn/retire/TEMPLATE_IN_BATTLE.png', 'en': './assets/en/retire/TEMPLATE_IN_BATTLE.png', 'jp': './assets/jp/retire/TEMPLATE_IN_BATTLE.png', 'tw': './assets/cn/retire/TEMPLATE_IN_BATTLE.png'}) TEMPLATE_IN_COMMISSION = Template(file={'cn': './assets/cn/retire/TEMPLATE_IN_COMMISSION.png', 'en': './assets/en/retire/TEMPLATE_IN_COMMISSION.png', 'jp': './assets/jp/retire/TEMPLATE_IN_COMMISSION.png', 'tw': './assets/cn/retire/TEMPLATE_IN_COMMISSION.png'}) -TEMPLATE_IN_HARD = Template(file={'cn': './assets/cn/retire/TEMPLATE_IN_HARD.png', 'en': './assets/cn/retire/TEMPLATE_IN_HARD.png', 'jp': './assets/cn/retire/TEMPLATE_IN_HARD.png', 'tw': './assets/cn/retire/TEMPLATE_IN_HARD.png'}) TEMPLATE_IN_EVENT_FLEET = Template(file={'cn': './assets/cn/retire/TEMPLATE_IN_EVENT_FLEET.png', 'en': './assets/cn/retire/TEMPLATE_IN_EVENT_FLEET.png', 'jp': './assets/cn/retire/TEMPLATE_IN_EVENT_FLEET.png', 'tw': './assets/cn/retire/TEMPLATE_IN_EVENT_FLEET.png'}) +TEMPLATE_IN_HARD = Template(file={'cn': './assets/cn/retire/TEMPLATE_IN_HARD.png', 'en': './assets/cn/retire/TEMPLATE_IN_HARD.png', 'jp': './assets/cn/retire/TEMPLATE_IN_HARD.png', 'tw': './assets/cn/retire/TEMPLATE_IN_HARD.png'}) TEMPLATE_LANGLEY = Template(file={'cn': './assets/cn/retire/TEMPLATE_LANGLEY.png', 'en': './assets/en/retire/TEMPLATE_LANGLEY.png', 'jp': './assets/jp/retire/TEMPLATE_LANGLEY.png', 'tw': './assets/tw/retire/TEMPLATE_LANGLEY.png'}) TEMPLATE_RANGER = Template(file={'cn': './assets/cn/retire/TEMPLATE_RANGER.png', 'en': './assets/en/retire/TEMPLATE_RANGER.png', 'jp': './assets/jp/retire/TEMPLATE_RANGER.png', 'tw': './assets/tw/retire/TEMPLATE_RANGER.png'})