1
0
mirror of https://gitee.com/sui-feng-cb/AzurLaneAutoScript1 synced 2026-03-24 11:19:03 +08:00

Fix: merge conflict reward/assets.py

This commit is contained in:
nEEtdo0d
2021-07-22 18:41:57 -04:00
15 changed files with 143 additions and 80 deletions

View File

@@ -90,7 +90,10 @@ class AzurLaneAutoScript:
def setting(self): def setting(self):
for key, value in self.config.config['Setting'].items(): for key, value in self.config.config['Setting'].items():
print(f'{key} = {value}') if key == 'azurstat_id':
print(f'{key} = <sensitive_infomation>')
else:
print(f'{key} = {value}')
logger.hr('Settings saved') logger.hr('Settings saved')
self.update_check() self.update_check()
@@ -113,7 +116,7 @@ class AzurLaneAutoScript:
def emulator(self): def emulator(self):
for key, value in self.config.config['Emulator'].items(): for key, value in self.config.config['Emulator'].items():
if key == 'github_token': if key == 'github_token':
print(f'{key} = {"<sensitive_infomation>"}') print(f'{key} = <sensitive_infomation>')
else: else:
print(f'{key} = {value}') print(f'{key} = {value}')

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.8 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.5 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.2 KiB

After

Width:  |  Height:  |  Size: 21 KiB

View File

@@ -4,7 +4,7 @@ from module.base.template import Template
# This file was automatically generated by dev_tools.button_extract. # This file was automatically generated by dev_tools.button_extract.
# Don't modify it manually. # Don't modify it manually.
AMBUSH_AVOID = Button(area={'cn': (753, 444, 927, 502), 'en': (753, 443, 927, 503), 'jp': (753, 444, 927, 502), 'tw': (753, 444, 927, 502)}, color={'cn': (87, 129, 189), 'en': (94, 136, 195), 'jp': (87, 129, 189), 'tw': (87, 129, 189)}, button={'cn': (979, 444, 1152, 502), 'en': (978, 443, 1153, 503), 'jp': (979, 444, 1152, 502), 'tw': (979, 444, 1152, 502)}, file={'cn': './assets/cn/daemon/AMBUSH_AVOID.png', 'en': './assets/en/daemon/AMBUSH_AVOID.png', 'jp': './assets/jp/daemon/AMBUSH_AVOID.png', 'tw': './assets/tw/daemon/AMBUSH_AVOID.png'}) AMBUSH_AVOID = Button(area={'cn': (753, 444, 927, 502), 'en': (753, 443, 927, 503), 'jp': (753, 444, 927, 502), 'tw': (762, 443, 927, 499)}, color={'cn': (87, 129, 189), 'en': (94, 136, 195), 'jp': (87, 129, 189), 'tw': (92, 133, 192)}, button={'cn': (979, 444, 1152, 502), 'en': (978, 443, 1153, 503), 'jp': (979, 444, 1152, 502), 'tw': (979, 444, 1152, 502)}, file={'cn': './assets/cn/daemon/AMBUSH_AVOID.png', 'en': './assets/en/daemon/AMBUSH_AVOID.png', 'jp': './assets/jp/daemon/AMBUSH_AVOID.png', 'tw': './assets/tw/daemon/AMBUSH_AVOID.png'})
AT_SEA = Button(area={'cn': (749, 654, 921, 707), 'en': (748, 652, 922, 702), 'jp': (748, 653, 921, 707), 'tw': (749, 654, 921, 707)}, color={'cn': (213, 124, 124), 'en': (211, 124, 124), 'jp': (210, 122, 122), 'tw': (213, 124, 124)}, button={'cn': (749, 654, 921, 707), 'en': (748, 652, 922, 702), 'jp': (748, 653, 921, 707), 'tw': (749, 654, 921, 707)}, file={'cn': './assets/cn/daemon/AT_SEA.png', 'en': './assets/en/daemon/AT_SEA.png', 'jp': './assets/jp/daemon/AT_SEA.png', 'tw': './assets/tw/daemon/AT_SEA.png'}) AT_SEA = Button(area={'cn': (749, 654, 921, 707), 'en': (748, 652, 922, 702), 'jp': (748, 653, 921, 707), 'tw': (749, 654, 921, 707)}, color={'cn': (213, 124, 124), 'en': (211, 124, 124), 'jp': (210, 122, 122), 'tw': (213, 124, 124)}, button={'cn': (749, 654, 921, 707), 'en': (748, 652, 922, 702), 'jp': (748, 653, 921, 707), 'tw': (749, 654, 921, 707)}, file={'cn': './assets/cn/daemon/AT_SEA.png', 'en': './assets/en/daemon/AT_SEA.png', 'jp': './assets/jp/daemon/AT_SEA.png', 'tw': './assets/tw/daemon/AT_SEA.png'})
FLEET_PREPARATION = Button(area={'cn': (981, 575, 1180, 636), 'en': (978, 572, 1179, 635), 'jp': (1040, 604, 1242, 670), 'tw': (981, 575, 1180, 636)}, color={'cn': (235, 185, 114), 'en': (234, 177, 90), 'jp': (233, 181, 99), 'tw': (235, 185, 114)}, button={'cn': (981, 575, 1180, 636), 'en': (978, 572, 1179, 635), 'jp': (1040, 604, 1242, 670), 'tw': (981, 575, 1180, 636)}, file={'cn': './assets/cn/daemon/FLEET_PREPARATION.png', 'en': './assets/en/daemon/FLEET_PREPARATION.png', 'jp': './assets/jp/daemon/FLEET_PREPARATION.png', 'tw': './assets/tw/daemon/FLEET_PREPARATION.png'}) FLEET_PREPARATION = Button(area={'cn': (981, 575, 1180, 636), 'en': (978, 572, 1179, 635), 'jp': (1040, 604, 1242, 670), 'tw': (981, 575, 1180, 636)}, color={'cn': (235, 185, 114), 'en': (234, 177, 90), 'jp': (233, 181, 99), 'tw': (235, 185, 114)}, button={'cn': (981, 575, 1180, 636), 'en': (978, 572, 1179, 635), 'jp': (1040, 604, 1242, 670), 'tw': (981, 575, 1180, 636)}, file={'cn': './assets/cn/daemon/FLEET_PREPARATION.png', 'en': './assets/en/daemon/FLEET_PREPARATION.png', 'jp': './assets/jp/daemon/FLEET_PREPARATION.png', 'tw': './assets/tw/daemon/FLEET_PREPARATION.png'})
GET_EMERGENCY_REPAIR = Button(area={'cn': (645, 352, 666, 360), 'en': (645, 352, 666, 360), 'jp': (645, 352, 666, 360), 'tw': (645, 352, 666, 360)}, color={'cn': (255, 255, 255), 'en': (255, 255, 255), 'jp': (255, 255, 255), 'tw': (255, 255, 255)}, button={'cn': (645, 352, 666, 360), 'en': (645, 352, 666, 360), 'jp': (645, 352, 666, 360), 'tw': (645, 352, 666, 360)}, file={'cn': './assets/cn/daemon/GET_EMERGENCY_REPAIR.png', 'en': './assets/en/daemon/GET_EMERGENCY_REPAIR.png', 'jp': './assets/jp/daemon/GET_EMERGENCY_REPAIR.png', 'tw': './assets/tw/daemon/GET_EMERGENCY_REPAIR.png'}) GET_EMERGENCY_REPAIR = Button(area={'cn': (645, 352, 666, 360), 'en': (645, 352, 666, 360), 'jp': (645, 352, 666, 360), 'tw': (645, 352, 666, 360)}, color={'cn': (255, 255, 255), 'en': (255, 255, 255), 'jp': (255, 255, 255), 'tw': (255, 255, 255)}, button={'cn': (645, 352, 666, 360), 'en': (645, 352, 666, 360), 'jp': (645, 352, 666, 360), 'tw': (645, 352, 666, 360)}, file={'cn': './assets/cn/daemon/GET_EMERGENCY_REPAIR.png', 'en': './assets/en/daemon/GET_EMERGENCY_REPAIR.png', 'jp': './assets/jp/daemon/GET_EMERGENCY_REPAIR.png', 'tw': './assets/tw/daemon/GET_EMERGENCY_REPAIR.png'})

View File

@@ -46,7 +46,7 @@ LOGIN_RETURN_SIGN = Button(area={'cn': (1, 7, 104, 47), 'en': (1, 7, 118, 39), '
MAINTENANCE_ANNOUNCE = Button(area={'cn': (923, 141, 990, 186), 'en': (923, 141, 990, 186), 'jp': (923, 141, 990, 186), 'tw': (923, 141, 990, 186)}, color={'cn': (207, 95, 91), 'en': (207, 95, 91), 'jp': (207, 95, 91), 'tw': (207, 95, 91)}, button={'cn': (923, 141, 990, 186), 'en': (923, 141, 990, 186), 'jp': (923, 141, 990, 186), 'tw': (923, 141, 990, 186)}, file={'cn': './assets/cn/handler/MAINTENANCE_ANNOUNCE.png', 'en': './assets/en/handler/MAINTENANCE_ANNOUNCE.png', 'jp': './assets/jp/handler/MAINTENANCE_ANNOUNCE.png', 'tw': './assets/tw/handler/MAINTENANCE_ANNOUNCE.png'}) MAINTENANCE_ANNOUNCE = Button(area={'cn': (923, 141, 990, 186), 'en': (923, 141, 990, 186), 'jp': (923, 141, 990, 186), 'tw': (923, 141, 990, 186)}, color={'cn': (207, 95, 91), 'en': (207, 95, 91), 'jp': (207, 95, 91), 'tw': (207, 95, 91)}, button={'cn': (923, 141, 990, 186), 'en': (923, 141, 990, 186), 'jp': (923, 141, 990, 186), 'tw': (923, 141, 990, 186)}, file={'cn': './assets/cn/handler/MAINTENANCE_ANNOUNCE.png', 'en': './assets/en/handler/MAINTENANCE_ANNOUNCE.png', 'jp': './assets/jp/handler/MAINTENANCE_ANNOUNCE.png', 'tw': './assets/tw/handler/MAINTENANCE_ANNOUNCE.png'})
MAP_AIR_RAID = Button(area={'cn': (350, 447, 1280, 472), 'en': (350, 447, 1280, 472), 'jp': (350, 447, 1280, 472), 'tw': (350, 447, 1280, 472)}, color={'cn': (154, 43, 46), 'en': (154, 43, 46), 'jp': (154, 43, 46), 'tw': (154, 43, 46)}, button={'cn': (350, 447, 1280, 472), 'en': (350, 447, 1280, 472), 'jp': (350, 447, 1280, 472), 'tw': (350, 447, 1280, 472)}, file={'cn': './assets/cn/handler/MAP_AIR_RAID.png', 'en': './assets/en/handler/MAP_AIR_RAID.png', 'jp': './assets/jp/handler/MAP_AIR_RAID.png', 'tw': './assets/tw/handler/MAP_AIR_RAID.png'}) MAP_AIR_RAID = Button(area={'cn': (350, 447, 1280, 472), 'en': (350, 447, 1280, 472), 'jp': (350, 447, 1280, 472), 'tw': (350, 447, 1280, 472)}, color={'cn': (154, 43, 46), 'en': (154, 43, 46), 'jp': (154, 43, 46), 'tw': (154, 43, 46)}, button={'cn': (350, 447, 1280, 472), 'en': (350, 447, 1280, 472), 'jp': (350, 447, 1280, 472), 'tw': (350, 447, 1280, 472)}, file={'cn': './assets/cn/handler/MAP_AIR_RAID.png', 'en': './assets/en/handler/MAP_AIR_RAID.png', 'jp': './assets/jp/handler/MAP_AIR_RAID.png', 'tw': './assets/tw/handler/MAP_AIR_RAID.png'})
MAP_AMBUSH = Button(area={'cn': (261, 433, 1280, 449), 'en': (261, 433, 1280, 449), 'jp': (261, 433, 1280, 449), 'tw': (261, 433, 1280, 449)}, color={'cn': (161, 41, 43), 'en': (161, 41, 43), 'jp': (161, 41, 43), 'tw': (161, 41, 43)}, button={'cn': (261, 433, 1280, 449), 'en': (261, 433, 1280, 449), 'jp': (261, 433, 1280, 449), 'tw': (261, 433, 1280, 449)}, file={'cn': './assets/cn/handler/MAP_AMBUSH.png', 'en': './assets/en/handler/MAP_AMBUSH.png', 'jp': './assets/jp/handler/MAP_AMBUSH.png', 'tw': './assets/tw/handler/MAP_AMBUSH.png'}) MAP_AMBUSH = Button(area={'cn': (261, 433, 1280, 449), 'en': (261, 433, 1280, 449), 'jp': (261, 433, 1280, 449), 'tw': (261, 433, 1280, 449)}, color={'cn': (161, 41, 43), 'en': (161, 41, 43), 'jp': (161, 41, 43), 'tw': (161, 41, 43)}, button={'cn': (261, 433, 1280, 449), 'en': (261, 433, 1280, 449), 'jp': (261, 433, 1280, 449), 'tw': (261, 433, 1280, 449)}, file={'cn': './assets/cn/handler/MAP_AMBUSH.png', 'en': './assets/en/handler/MAP_AMBUSH.png', 'jp': './assets/jp/handler/MAP_AMBUSH.png', 'tw': './assets/tw/handler/MAP_AMBUSH.png'})
MAP_AMBUSH_ATTACK = Button(area={'cn': (755, 446, 925, 501), 'en': (753, 443, 927, 503), 'jp': (757, 447, 925, 501), 'tw': (755, 446, 925, 501)}, color={'cn': (87, 130, 190), 'en': (94, 136, 195), 'jp': (93, 134, 191), 'tw': (87, 130, 190)}, button={'cn': (755, 446, 925, 501), 'en': (753, 443, 927, 503), 'jp': (757, 447, 925, 501), 'tw': (755, 446, 925, 501)}, file={'cn': './assets/cn/handler/MAP_AMBUSH_ATTACK.png', 'en': './assets/en/handler/MAP_AMBUSH_ATTACK.png', 'jp': './assets/jp/handler/MAP_AMBUSH_ATTACK.png', 'tw': './assets/tw/handler/MAP_AMBUSH_ATTACK.png'}) MAP_AMBUSH_ATTACK = Button(area={'cn': (755, 446, 925, 501), 'en': (753, 443, 927, 503), 'jp': (757, 447, 925, 501), 'tw': (762, 443, 927, 499)}, color={'cn': (87, 130, 190), 'en': (94, 136, 195), 'jp': (93, 134, 191), 'tw': (92, 133, 192)}, button={'cn': (755, 446, 925, 501), 'en': (753, 443, 927, 503), 'jp': (757, 447, 925, 501), 'tw': (762, 443, 927, 499)}, file={'cn': './assets/cn/handler/MAP_AMBUSH_ATTACK.png', 'en': './assets/en/handler/MAP_AMBUSH_ATTACK.png', 'jp': './assets/jp/handler/MAP_AMBUSH_ATTACK.png', 'tw': './assets/tw/handler/MAP_AMBUSH_ATTACK.png'})
MAP_AMBUSH_EVADE = Button(area={'cn': (325, 393, 1280, 395), 'en': (325, 393, 1280, 395), 'jp': (325, 393, 1280, 395), 'tw': (325, 393, 1280, 395)}, color={'cn': (255, 255, 255), 'en': (255, 255, 255), 'jp': (255, 255, 255), 'tw': (255, 255, 255)}, button={'cn': (979, 444, 1152, 502), 'en': (978, 443, 1153, 503), 'jp': (979, 444, 1151, 502), 'tw': (979, 444, 1152, 502)}, file={'cn': './assets/cn/handler/MAP_AMBUSH_EVADE.png', 'en': './assets/en/handler/MAP_AMBUSH_EVADE.png', 'jp': './assets/jp/handler/MAP_AMBUSH_EVADE.png', 'tw': './assets/tw/handler/MAP_AMBUSH_EVADE.png'}) MAP_AMBUSH_EVADE = Button(area={'cn': (325, 393, 1280, 395), 'en': (325, 393, 1280, 395), 'jp': (325, 393, 1280, 395), 'tw': (325, 393, 1280, 395)}, color={'cn': (255, 255, 255), 'en': (255, 255, 255), 'jp': (255, 255, 255), 'tw': (255, 255, 255)}, button={'cn': (979, 444, 1152, 502), 'en': (978, 443, 1153, 503), 'jp': (979, 444, 1151, 502), 'tw': (979, 444, 1152, 502)}, file={'cn': './assets/cn/handler/MAP_AMBUSH_EVADE.png', 'en': './assets/en/handler/MAP_AMBUSH_EVADE.png', 'jp': './assets/jp/handler/MAP_AMBUSH_EVADE.png', 'tw': './assets/tw/handler/MAP_AMBUSH_EVADE.png'})
MAP_BUFF = Button(area={'cn': (145, 115, 437, 159), 'en': (145, 115, 437, 159), 'jp': (145, 115, 437, 159), 'tw': (145, 115, 437, 159)}, color={'cn': (103, 118, 118), 'en': (103, 118, 118), 'jp': (103, 118, 118), 'tw': (103, 118, 118)}, button={'cn': (145, 115, 437, 159), 'en': (145, 115, 437, 159), 'jp': (145, 115, 437, 159), 'tw': (145, 115, 437, 159)}, file={'cn': './assets/cn/handler/MAP_BUFF.png', 'en': './assets/en/handler/MAP_BUFF.png', 'jp': './assets/jp/handler/MAP_BUFF.png', 'tw': './assets/tw/handler/MAP_BUFF.png'}) MAP_BUFF = Button(area={'cn': (145, 115, 437, 159), 'en': (145, 115, 437, 159), 'jp': (145, 115, 437, 159), 'tw': (145, 115, 437, 159)}, color={'cn': (103, 118, 118), 'en': (103, 118, 118), 'jp': (103, 118, 118), 'tw': (103, 118, 118)}, button={'cn': (145, 115, 437, 159), 'en': (145, 115, 437, 159), 'jp': (145, 115, 437, 159), 'tw': (145, 115, 437, 159)}, file={'cn': './assets/cn/handler/MAP_BUFF.png', 'en': './assets/en/handler/MAP_BUFF.png', 'jp': './assets/jp/handler/MAP_BUFF.png', 'tw': './assets/tw/handler/MAP_BUFF.png'})
MAP_CLEAR_PERCENTAGE = Button(area={'cn': (626, 185, 970, 190), 'en': (626, 185, 970, 190), 'jp': (626, 185, 970, 190), 'tw': (626, 185, 970, 190)}, color={'cn': (245, 213, 88), 'en': (245, 213, 88), 'jp': (245, 213, 88), 'tw': (245, 213, 88)}, button={'cn': (626, 185, 970, 190), 'en': (626, 185, 970, 190), 'jp': (626, 185, 970, 190), 'tw': (626, 185, 970, 190)}, file={'cn': './assets/cn/handler/MAP_CLEAR_PERCENTAGE.png', 'en': './assets/en/handler/MAP_CLEAR_PERCENTAGE.png', 'jp': './assets/jp/handler/MAP_CLEAR_PERCENTAGE.png', 'tw': './assets/tw/handler/MAP_CLEAR_PERCENTAGE.png'}) MAP_CLEAR_PERCENTAGE = Button(area={'cn': (626, 185, 970, 190), 'en': (626, 185, 970, 190), 'jp': (626, 185, 970, 190), 'tw': (626, 185, 970, 190)}, color={'cn': (245, 213, 88), 'en': (245, 213, 88), 'jp': (245, 213, 88), 'tw': (245, 213, 88)}, button={'cn': (626, 185, 970, 190), 'en': (626, 185, 970, 190), 'jp': (626, 185, 970, 190), 'tw': (626, 185, 970, 190)}, file={'cn': './assets/cn/handler/MAP_CLEAR_PERCENTAGE.png', 'en': './assets/en/handler/MAP_CLEAR_PERCENTAGE.png', 'jp': './assets/jp/handler/MAP_CLEAR_PERCENTAGE.png', 'tw': './assets/tw/handler/MAP_CLEAR_PERCENTAGE.png'})

View File

@@ -21,4 +21,4 @@ ZONE_OBSCURE = Button(area={'cn': (85, 302, 172, 322), 'en': (90, 301, 165, 319)
ZONE_PINNED = Button(area={'cn': (503, 419, 514, 430), 'en': (503, 419, 514, 430), 'jp': (503, 419, 514, 430), 'tw': (503, 419, 514, 430)}, color={'cn': (224, 239, 250), 'en': (224, 239, 250), 'jp': (224, 239, 250), 'tw': (224, 239, 250)}, button={'cn': (503, 419, 514, 430), 'en': (503, 419, 514, 430), 'jp': (503, 419, 514, 430), 'tw': (503, 419, 514, 430)}, file={'cn': './assets/cn/os/ZONE_PINNED.png', 'en': './assets/en/os/ZONE_PINNED.png', 'jp': './assets/jp/os/ZONE_PINNED.png', 'tw': './assets/tw/os/ZONE_PINNED.png'}) ZONE_PINNED = Button(area={'cn': (503, 419, 514, 430), 'en': (503, 419, 514, 430), 'jp': (503, 419, 514, 430), 'tw': (503, 419, 514, 430)}, color={'cn': (224, 239, 250), 'en': (224, 239, 250), 'jp': (224, 239, 250), 'tw': (224, 239, 250)}, button={'cn': (503, 419, 514, 430), 'en': (503, 419, 514, 430), 'jp': (503, 419, 514, 430), 'tw': (503, 419, 514, 430)}, file={'cn': './assets/cn/os/ZONE_PINNED.png', 'en': './assets/en/os/ZONE_PINNED.png', 'jp': './assets/jp/os/ZONE_PINNED.png', 'tw': './assets/tw/os/ZONE_PINNED.png'})
ZONE_SAFE = Button(area={'cn': (85, 301, 172, 322), 'en': (85, 302, 171, 319), 'jp': (84, 301, 172, 322), 'tw': (85, 301, 172, 322)}, color={'cn': (131, 180, 184), 'en': (144, 190, 190), 'jp': (134, 183, 187), 'tw': (131, 180, 184)}, button={'cn': (85, 301, 172, 322), 'en': (85, 302, 171, 319), 'jp': (84, 301, 172, 322), 'tw': (85, 301, 172, 322)}, file={'cn': './assets/cn/os/ZONE_SAFE.png', 'en': './assets/en/os/ZONE_SAFE.png', 'jp': './assets/jp/os/ZONE_SAFE.png', 'tw': './assets/cn/os/ZONE_SAFE.png'}) ZONE_SAFE = Button(area={'cn': (85, 301, 172, 322), 'en': (85, 302, 171, 319), 'jp': (84, 301, 172, 322), 'tw': (85, 301, 172, 322)}, color={'cn': (131, 180, 184), 'en': (144, 190, 190), 'jp': (134, 183, 187), 'tw': (131, 180, 184)}, button={'cn': (85, 301, 172, 322), 'en': (85, 302, 171, 319), 'jp': (84, 301, 172, 322), 'tw': (85, 301, 172, 322)}, file={'cn': './assets/cn/os/ZONE_SAFE.png', 'en': './assets/en/os/ZONE_SAFE.png', 'jp': './assets/jp/os/ZONE_SAFE.png', 'tw': './assets/cn/os/ZONE_SAFE.png'})
ZONE_STRONGHOLD = Button(area={'cn': (85, 301, 171, 322), 'en': (67, 302, 188, 319), 'jp': (83, 301, 172, 322), 'tw': (85, 301, 171, 322)}, color={'cn': (154, 114, 123), 'en': (180, 138, 142), 'jp': (155, 114, 124), 'tw': (154, 114, 123)}, button={'cn': (85, 301, 171, 322), 'en': (67, 302, 188, 319), 'jp': (83, 301, 172, 322), 'tw': (85, 301, 171, 322)}, file={'cn': './assets/cn/os/ZONE_STRONGHOLD.png', 'en': './assets/en/os/ZONE_STRONGHOLD.png', 'jp': './assets/jp/os/ZONE_STRONGHOLD.png', 'tw': './assets/cn/os/ZONE_STRONGHOLD.png'}) ZONE_STRONGHOLD = Button(area={'cn': (85, 301, 171, 322), 'en': (67, 302, 188, 319), 'jp': (83, 301, 172, 322), 'tw': (85, 301, 171, 322)}, color={'cn': (154, 114, 123), 'en': (180, 138, 142), 'jp': (155, 114, 124), 'tw': (154, 114, 123)}, button={'cn': (85, 301, 171, 322), 'en': (67, 302, 188, 319), 'jp': (83, 301, 172, 322), 'tw': (85, 301, 171, 322)}, file={'cn': './assets/cn/os/ZONE_STRONGHOLD.png', 'en': './assets/en/os/ZONE_STRONGHOLD.png', 'jp': './assets/jp/os/ZONE_STRONGHOLD.png', 'tw': './assets/cn/os/ZONE_STRONGHOLD.png'})
ZONE_SWITCH = Button(area={'cn': (94, 336, 165, 354), 'en': (108, 343, 169, 352), 'jp': (69, 335, 88, 354), 'tw': (69, 335, 88, 354)}, color={'cn': (101, 106, 109), 'en': (90, 95, 98), 'jp': (126, 120, 119), 'tw': (126, 120, 119)}, button={'cn': (94, 336, 165, 354), 'en': (108, 343, 169, 352), 'jp': (69, 335, 88, 354), 'tw': (69, 335, 88, 354)}, file={'cn': './assets/cn/os/ZONE_SWITCH.png', 'en': './assets/en/os/ZONE_SWITCH.png', 'jp': './assets/jp/os/ZONE_SWITCH.png', 'tw': './assets/tw/os/ZONE_SWITCH.png'}) ZONE_SWITCH = Button(area={'cn': (94, 336, 165, 354), 'en': (108, 343, 169, 352), 'jp': (94, 336, 156, 353), 'tw': (69, 335, 88, 354)}, color={'cn': (101, 106, 109), 'en': (90, 95, 98), 'jp': (91, 94, 97), 'tw': (126, 120, 119)}, button={'cn': (94, 336, 165, 354), 'en': (108, 343, 169, 352), 'jp': (94, 336, 156, 353), 'tw': (69, 335, 88, 354)}, file={'cn': './assets/cn/os/ZONE_SWITCH.png', 'en': './assets/en/os/ZONE_SWITCH.png', 'jp': './assets/jp/os/ZONE_SWITCH.png', 'tw': './assets/tw/os/ZONE_SWITCH.png'})

View File

@@ -163,10 +163,6 @@ class MapEventHandler(EnemySearchingHandler):
Returns: Returns:
bool: If clicked. bool: If clicked.
""" """
if self.appear(AUTO_SEARCH_OS_MAP_OPTION_OFF, offset=(5, 50), interval=3) \
and AUTO_SEARCH_OS_MAP_OPTION_OFF.match_appear_on(self.device.image):
self.device.click(AUTO_SEARCH_OS_MAP_OPTION_OFF)
return True
if self.appear(AUTO_SEARCH_OS_MAP_OPTION_OFF, offset=(5, 50)) \ if self.appear(AUTO_SEARCH_OS_MAP_OPTION_OFF, offset=(5, 50)) \
and AUTO_SEARCH_OS_MAP_OPTION_OFF.match_appear_on(self.device.image) \ and AUTO_SEARCH_OS_MAP_OPTION_OFF.match_appear_on(self.device.image) \
and self.info_bar_count() >= 2: and self.info_bar_count() >= 2:
@@ -174,3 +170,7 @@ class MapEventHandler(EnemySearchingHandler):
if self.appear(AUTO_SEARCH_REWARD, offset=(20, 50)): if self.appear(AUTO_SEARCH_REWARD, offset=(20, 50)):
self.os_auto_search_quit() self.os_auto_search_quit()
raise CampaignEnd raise CampaignEnd
if self.appear(AUTO_SEARCH_OS_MAP_OPTION_OFF, offset=(5, 50), interval=3) \
and AUTO_SEARCH_OS_MAP_OPTION_OFF.match_appear_on(self.device.image):
self.device.click(AUTO_SEARCH_OS_MAP_OPTION_OFF)
return True

View File

@@ -17,6 +17,7 @@ from module.ui.ui import UI
RESEARCH_ENTRANCE = [ENTRANCE_1, ENTRANCE_2, ENTRANCE_3, ENTRANCE_4, ENTRANCE_5] RESEARCH_ENTRANCE = [ENTRANCE_1, ENTRANCE_2, ENTRANCE_3, ENTRANCE_4, ENTRANCE_5]
RESEARCH_SERIES = [SERIES_1, SERIES_2, SERIES_3, SERIES_4, SERIES_5] RESEARCH_SERIES = [SERIES_1, SERIES_2, SERIES_3, SERIES_4, SERIES_5]
RESEARCH_STATUS = [STATUS_1, STATUS_2, STATUS_3, STATUS_4, STATUS_5]
OCR_RESEARCH = [OCR_RESEARCH_1, OCR_RESEARCH_2, OCR_RESEARCH_3, OCR_RESEARCH_4, OCR_RESEARCH_5] OCR_RESEARCH = [OCR_RESEARCH_1, OCR_RESEARCH_2, OCR_RESEARCH_3, OCR_RESEARCH_4, OCR_RESEARCH_5]
OCR_RESEARCH = Ocr(OCR_RESEARCH, name='RESEARCH', threshold=64, alphabet='0123456789BCDEGHQTMIULRF-') OCR_RESEARCH = Ocr(OCR_RESEARCH, name='RESEARCH', threshold=64, alphabet='0123456789BCDEGHQTMIULRF-')
RESEARCH_DETAIL_GENRE = [DETAIL_GENRE_B, DETAIL_GENRE_C, DETAIL_GENRE_D, DETAIL_GENRE_E, DETAIL_GENRE_G, RESEARCH_DETAIL_GENRE = [DETAIL_GENRE_B, DETAIL_GENRE_C, DETAIL_GENRE_D, DETAIL_GENRE_E, DETAIL_GENRE_G,
@@ -87,12 +88,36 @@ def get_research_name(image):
""" """
names = [] names = []
for name in OCR_RESEARCH.ocr(image): for name in OCR_RESEARCH.ocr(image):
# S3 D-022-MI (S3-Drake-0.5) detected as 'D-022-ML', because of Drake's white cloth.
name = name.replace('ML', 'MI').replace('MIL', 'MI')
names.append(name) names.append(name)
return names return names
def get_research_finished(image):
"""
Args:
image: Pillow image
Returns:
int: Index of the finished project, 0 to 4. Return None if no project finished.
"""
for index in [2, 1, 3, 0, 4]:
button = RESEARCH_STATUS[index]
color = get_color(image, button.area)
if max(color) - min(color) < 40:
logger.warning(f'Unexpected color: {color}')
continue
color_index = np.argmax(color) # R, G, B
if color_index == 1:
return index # Green
elif color_index == 2:
continue # Blue
else:
logger.warning(f'Unexpected color: {color}')
continue
return None
def parse_time(string): def parse_time(string):
""" """
Args: Args:
@@ -304,6 +329,8 @@ class ResearchProject:
self.valid = True self.valid = True
# self.config = config # self.config = config
self.name = self.check_name(name) self.name = self.check_name(name)
if self.name != name:
logger.info(f'Research name {name} is revised to {self.name}')
self.series = f'S{series}' self.series = f'S{series}'
self.genre = '' self.genre = ''
self.duration = '24' self.duration = '24'
@@ -341,8 +368,7 @@ class ResearchProject:
else: else:
return f'{self.series} {self.name} (Invalid)' return f'{self.series} {self.name} (Invalid)'
@staticmethod def check_name(self, name):
def check_name(name):
""" """
Args: Args:
name (str): name (str):
@@ -356,7 +382,15 @@ class ResearchProject:
prefix, number, suffix = parts prefix, number, suffix = parts
number = number.replace('D', '0').replace('O', '0').replace('S', '5') number = number.replace('D', '0').replace('O', '0').replace('S', '5')
prefix = prefix.strip('I1') prefix = prefix.strip('I1')
# S3 D-022-MI (S3-Drake-0.5) detected as 'D-022-ML', because of Drake's white cloth.
suffix = suffix.replace('ML', 'MI').replace('MIL', 'MI')
# S4 D-063-UL (S4-hakuryu-0.5) detected as 'D-063-0C'
suffix = suffix.replace('0C', 'UL').replace('UC', 'UL')
return '-'.join([prefix, number, suffix]) return '-'.join([prefix, number, suffix])
elif len(parts) == 2:
# Trying to insert '-', for results like H339-MI
if name[0].isalpha() and name[1].isdigit():
return self.check_name(f'{name[0]}-{name[1:]}')
return name return name
def get_data(self, name, series): def get_data(self, name, series):

View File

@@ -1,16 +1,13 @@
import numpy as np import numpy as np
from module.base.timer import Timer from module.base.timer import Timer
from module.base.utils import get_color, rgb2gray from module.base.utils import rgb2gray
from module.combat.assets import GET_ITEMS_1, GET_ITEMS_2, GET_ITEMS_3 from module.combat.assets import GET_ITEMS_1, GET_ITEMS_2, GET_ITEMS_3
from module.logger import logger from module.logger import logger
from module.research.assets import * from module.research.assets import *
from module.research.project import ResearchSelector from module.research.project import ResearchSelector, RESEARCH_ENTRANCE, get_research_finished
from module.ui.page import * from module.ui.page import *
RESEARCH_ENTRANCE = [ENTRANCE_1, ENTRANCE_2, ENTRANCE_3, ENTRANCE_4, ENTRANCE_5]
RESEARCH_STATUS = [STATUS_1, STATUS_2, STATUS_3, STATUS_4, STATUS_5]
class RewardResearch(ResearchSelector): class RewardResearch(ResearchSelector):
_research_project_offset = 0 _research_project_offset = 0
@@ -22,25 +19,16 @@ class RewardResearch(ResearchSelector):
def _in_research(self): def _in_research(self):
return self.appear(RESEARCH_CHECK, offset=(20, 20)) return self.appear(RESEARCH_CHECK, offset=(20, 20))
def _research_has_finished_at(self, button): def _research_has_finished_at(self, index):
""" """
Args: Args:
button (Button): index (int): Index of research project, 0 to 4
Returns: Returns:
bool: True if a research finished bool: True if a research finished
""" """
color = get_color(self.device.image, button.area) finish = get_research_finished(self.device.image)
if np.max(color) - np.min(color) < 40: return finish == index
logger.warning(f'Unexpected color: {color}')
index = np.argmax(color) # R, G, B
if index == 1:
return True # Green
elif index == 2:
return False # Blue
else:
logger.warning(f'Unexpected color: {color}')
return False
def research_has_finished(self): def research_has_finished(self):
""" """
@@ -50,13 +38,13 @@ class RewardResearch(ResearchSelector):
Returns: Returns:
bool: True if a research finished bool: True if a research finished
""" """
for index, button in enumerate(RESEARCH_STATUS): index = get_research_finished(self.device.image)
if self._research_has_finished_at(button): if index is not None:
logger.attr('Research_finished', index) logger.attr('Research_finished', index)
self._research_finished_index = index self._research_finished_index = index
return True return True
else:
return False return False
def research_reset(self, skip_first_screenshot=True, save_get_items=False): def research_reset(self, skip_first_screenshot=True, save_get_items=False):
""" """
@@ -219,7 +207,7 @@ class RewardResearch(ResearchSelector):
self.device.screenshot() self.device.screenshot()
if self.appear(RESEARCH_CHECK, interval=10): if self.appear(RESEARCH_CHECK, interval=10):
if self._research_has_finished_at(RESEARCH_STATUS[self._research_finished_index]): if self._research_has_finished_at(self._research_finished_index):
self.device.click(RESEARCH_ENTRANCE[self._research_finished_index]) self.device.click(RESEARCH_ENTRANCE[self._research_finished_index])
appear_button = get_items() appear_button = get_items()

View File

@@ -8,7 +8,7 @@ ITEM_GROUP = ItemGrid(None, {}, template_area=(40, 21, 89, 70), amount_area=(60,
ITEM_GRIDS_1_ODD = ButtonGrid(origin=(336, 298), delta=(128, 0), button_shape=(96, 96), grid_shape=(5, 1)) ITEM_GRIDS_1_ODD = ButtonGrid(origin=(336, 298), delta=(128, 0), button_shape=(96, 96), grid_shape=(5, 1))
ITEM_GRIDS_1_EVEN = ButtonGrid(origin=(400, 298), delta=(128, 0), button_shape=(96, 96), grid_shape=(4, 1)) ITEM_GRIDS_1_EVEN = ButtonGrid(origin=(400, 298), delta=(128, 0), button_shape=(96, 96), grid_shape=(4, 1))
ITEM_GRIDS_2 = ButtonGrid(origin=(336, 227), delta=(128, 142), button_shape=(96, 96), grid_shape=(5, 2)) ITEM_GRIDS_2 = ButtonGrid(origin=(336, 227), delta=(128, 142), button_shape=(96, 96), grid_shape=(5, 2))
ITEM_GRIDS_3 = ButtonGrid(origin=(332, 227), delta=(128, 142), button_shape=(96, 96), grid_shape=(5, 2)) ITEM_GRIDS_3 = ButtonGrid(origin=(336, 223), delta=(128, 149), button_shape=(96, 96), grid_shape=(5, 2))
def merge_get_items(item_list_1, item_list_2): def merge_get_items(item_list_1, item_list_2):
@@ -20,7 +20,7 @@ def merge_get_items(item_list_1, item_list_2):
Returns: Returns:
list[Item]: list[Item]:
""" """
pass return list(set(item_list_1 + item_list_2))
class GetItemsStatistics: class GetItemsStatistics:
@@ -44,16 +44,16 @@ class GetItemsStatistics:
ITEM_GROUP.grids = None ITEM_GROUP.grids = None
if INFO_BAR_1.appear_on(image): if INFO_BAR_1.appear_on(image):
raise ImageError('Stat image has info_bar') raise ImageError('Stat image has info_bar')
elif GET_ITEMS_1.appear_on(image): elif GET_ITEMS_1.match(image, offset=(5, 0)):
ITEM_GROUP.grids = ITEM_GRIDS_1_ODD if self._stats_get_items_is_odd(image) else ITEM_GRIDS_1_EVEN ITEM_GROUP.grids = ITEM_GRIDS_1_ODD if self._stats_get_items_is_odd(image) else ITEM_GRIDS_1_EVEN
elif GET_ITEMS_2.appear_on(image): elif GET_ITEMS_2.match(image, offset=(5, 0)):
ITEM_GROUP.grids = ITEM_GRIDS_2 ITEM_GROUP.grids = ITEM_GRIDS_2
elif GET_ITEMS_3.appear_on(image): elif GET_ITEMS_3.match(image, offset=(5, 0)):
ITEM_GROUP.grids = ITEM_GRIDS_3 ITEM_GROUP.grids = ITEM_GRIDS_3
else: else:
raise ImageError('Stat image is not a get_items image') raise ImageError('Stat image is not a get_items image')
def stats_get_items(self, image): def stats_get_items(self, image, **kwargs):
""" """
Args: Args:
image: Pillow image. image: Pillow image.
@@ -66,7 +66,7 @@ class GetItemsStatistics:
if ITEM_GROUP.grids is None: if ITEM_GROUP.grids is None:
return [] return []
else: else:
ITEM_GROUP.predict(image) ITEM_GROUP.predict(image, **kwargs)
return ITEM_GROUP.items return ITEM_GROUP.items
def load_template_folder(self, folder): def load_template_folder(self, folder):

View File

@@ -45,6 +45,7 @@ class Item:
self.amount = 1 self.amount = 1
self.cost = 'DefaultCost' self.cost = 'DefaultCost'
self.price = 0 self.price = 0
self.tag = None
@property @property
def name(self): def name(self):
@@ -63,11 +64,16 @@ class Item:
def __str__(self): def __str__(self):
if self.name != 'DefaultItem' and self.cost == 'DefaultCost': if self.name != 'DefaultItem' and self.cost == 'DefaultCost':
return f'{self.name}_x{self.amount}' name = f'{self.name}_x{self.amount}'
elif self.name == 'DefaultItem' and self.cost != 'DefaultCost': elif self.name == 'DefaultItem' and self.cost != 'DefaultCost':
return f'{self.cost}_x{self.price}' name = f'{self.cost}_x{self.price}'
else: else:
return f'{self.name}_x{self.amount}_{self.cost}_x{self.price}' name = f'{self.name}_x{self.amount}_{self.cost}_x{self.price}'
if self.tag is not None:
name = f'{name}_{self.tag}'
return name
@property @property
def button(self): def button(self):
@@ -76,13 +82,19 @@ class Item:
def crop(self, area): def crop(self, area):
return self.image_raw.crop(area_offset(area, offset=self._button.area[:2])) return self.image_raw.crop(area_offset(area, offset=self._button.area[:2]))
def __eq__(self, other):
return self.name == other
def __hash__(self):
return hash(self.name)
class ItemGrid: class ItemGrid:
similarity = 0.92 similarity = 0.92
cost_similarity = 0.75 cost_similarity = 0.75
def __init__(self, grids, templates, template_area=(40, 21, 89, 70), amount_area=(60, 71, 91, 92), def __init__(self, grids, templates, template_area=(40, 21, 89, 70), amount_area=(60, 71, 91, 92),
cost_area=(6, 123, 84, 166), price_area=(52, 132, 132, 156)): cost_area=(6, 123, 84, 166), price_area=(52, 132, 132, 156), tag_area=(81, 4, 91, 8)):
""" """
Args: Args:
grids (ButtonGrid): grids (ButtonGrid):
@@ -91,6 +103,7 @@ class ItemGrid:
amount_area (tuple): amount_area (tuple):
cost_area (tuple): cost_area (tuple):
price_area (tuple): price_area (tuple):
tag_area (tuple):
""" """
self.amount_ocr = AMOUNT_OCR self.amount_ocr = AMOUNT_OCR
self.price_ocr = PRICE_OCR self.price_ocr = PRICE_OCR
@@ -99,7 +112,9 @@ class ItemGrid:
self.amount_area = amount_area self.amount_area = amount_area
self.cost_area = cost_area self.cost_area = cost_area
self.price_area = price_area self.price_area = price_area
self.tag_area = tag_area
self.colors = {}
self.templates = {} self.templates = {}
self.templates_hit = {} self.templates_hit = {}
self.next_template_index = len(self.templates.keys()) self.next_template_index = len(self.templates.keys())
@@ -136,7 +151,9 @@ class ItemGrid:
if name in self.templates: if name in self.templates:
continue continue
image = load_image(image) image = load_image(image)
self.templates[name] = crop(np.array(image), area=self.template_area) image = crop(np.array(image), area=self.template_area)
self.colors[name] = cv2.mean(image)[:3]
self.templates[name] = image
self.templates_hit[name] = 0 self.templates_hit[name] = 0
self.next_template_index += 1 self.next_template_index += 1
@@ -165,18 +182,22 @@ class ItemGrid:
str: Template name. str: Template name.
""" """
image = np.array(image) image = np.array(image)
color = cv2.mean(crop(image, self.template_area))[:3]
names = np.array(list(self.templates.keys()))[np.argsort(list(self.templates_hit.values()))][::-1] names = np.array(list(self.templates.keys()))[np.argsort(list(self.templates_hit.values()))][::-1]
for name in names: for name in names:
res = cv2.matchTemplate(image, self.templates[name], cv2.TM_CCOEFF_NORMED) if color_similar(color1=color, color2=self.colors[name], threshold=30):
_, similarity, _, _ = cv2.minMaxLoc(res) res = cv2.matchTemplate(image, self.templates[name], cv2.TM_CCOEFF_NORMED)
if similarity > self.similarity: _, similarity, _, _ = cv2.minMaxLoc(res)
self.templates_hit[name] += 1 if similarity > self.similarity:
return name self.templates_hit[name] += 1
return name
self.next_template_index += 1 self.next_template_index += 1
name = str(self.next_template_index) name = str(self.next_template_index)
logger.info(f'New template: {name}') logger.info(f'New template: {name}')
self.templates[name] = crop(image, self.template_area) image = crop(image, self.template_area)
self.colors[name] = cv2.mean(image)[:3]
self.templates[name] = image
self.templates_hit[name] = self.templates_hit.get(name, 0) + 1 self.templates_hit[name] = self.templates_hit.get(name, 0) + 1
return name return name
@@ -228,7 +249,19 @@ class ItemGrid:
# If not cost template matched, consider this item is empty. # If not cost template matched, consider this item is empty.
return None return None
def predict(self, image, name=True, amount=True, cost=False, price=False): @staticmethod
def predict_tag(image):
"""
Args:
image: Pillow image. tag_area of the item.
Replace this method to predict tags.
Returns:
str: Tags are like `catchup`, `bonus`. Default to None
"""
return None
def predict(self, image, name=True, amount=True, cost=False, price=False, tag=False):
""" """
Args: Args:
image: Pillow image image: Pillow image
@@ -236,6 +269,7 @@ class ItemGrid:
amount (bool): If predict item amount. amount (bool): If predict item amount.
cost (bool): If predict the cost to buy item. cost (bool): If predict the cost to buy item.
price (bool): If predict item price. price (bool): If predict item price.
tag (bool): If predict item tag. Tags are like `catchup`, `bonus`.
Returns: Returns:
list[Item]: list[Item]:
@@ -261,6 +295,10 @@ class ItemGrid:
price_list = self.price_ocr.ocr(price_list, direct_ocr=True) price_list = self.price_ocr.ocr(price_list, direct_ocr=True)
for item, p in zip(self.items, price_list): for item, p in zip(self.items, price_list):
item.price = p item.price = p
if tag:
tag_list = [self.predict_tag(item.crop(self.tag_area)) for item in self.items]
for item, t in zip(self.items, tag_list):
item.tag = t
# Delete wrong results # Delete wrong results
items = [item for item in self.items if not (price and item.price <= 0)] items = [item for item in self.items if not (price and item.price <= 0)]

View File

@@ -24,7 +24,7 @@ DORMMENU_GOTO_DORM = Button(area={'cn': (568, 289, 725, 423), 'en': (568, 289, 7
DORMMENU_GOTO_MAIN = Button(area={'cn': (568, 289, 725, 423), 'en': (568, 289, 725, 423), 'jp': (568, 289, 725, 423), 'tw': (568, 289, 725, 423)}, color={'cn': (167, 153, 158), 'en': (167, 153, 158), 'jp': (167, 153, 158), 'tw': (167, 153, 158)}, button={'cn': (401, 608, 889, 686), 'en': (401, 608, 889, 686), 'jp': (401, 608, 889, 686), 'tw': (401, 608, 889, 686)}, file={'cn': './assets/cn/ui/DORMMENU_GOTO_MAIN.png', 'en': './assets/en/ui/DORMMENU_GOTO_MAIN.png', 'jp': './assets/jp/ui/DORMMENU_GOTO_MAIN.png', 'tw': './assets/tw/ui/DORMMENU_GOTO_MAIN.png'}) DORMMENU_GOTO_MAIN = Button(area={'cn': (568, 289, 725, 423), 'en': (568, 289, 725, 423), 'jp': (568, 289, 725, 423), 'tw': (568, 289, 725, 423)}, color={'cn': (167, 153, 158), 'en': (167, 153, 158), 'jp': (167, 153, 158), 'tw': (167, 153, 158)}, button={'cn': (401, 608, 889, 686), 'en': (401, 608, 889, 686), 'jp': (401, 608, 889, 686), 'tw': (401, 608, 889, 686)}, file={'cn': './assets/cn/ui/DORMMENU_GOTO_MAIN.png', 'en': './assets/en/ui/DORMMENU_GOTO_MAIN.png', 'jp': './assets/jp/ui/DORMMENU_GOTO_MAIN.png', 'tw': './assets/tw/ui/DORMMENU_GOTO_MAIN.png'})
DORMMENU_GOTO_MEOWFFICER = Button(area={'cn': (964, 273, 1061, 426), 'en': (983, 280, 1073, 348), 'jp': (867, 254, 1078, 450), 'tw': (964, 273, 1061, 426)}, color={'cn': (199, 178, 153), 'en': (199, 182, 163), 'jp': (192, 164, 136), 'tw': (199, 178, 153)}, button={'cn': (964, 273, 1061, 426), 'en': (983, 280, 1073, 348), 'jp': (867, 254, 1078, 450), 'tw': (964, 273, 1061, 426)}, file={'cn': './assets/cn/ui/DORMMENU_GOTO_MEOWFFICER.png', 'en': './assets/en/ui/DORMMENU_GOTO_MEOWFFICER.png', 'jp': './assets/jp/ui/DORMMENU_GOTO_MEOWFFICER.png', 'tw': './assets/tw/ui/DORMMENU_GOTO_MEOWFFICER.png'}) DORMMENU_GOTO_MEOWFFICER = Button(area={'cn': (964, 273, 1061, 426), 'en': (983, 280, 1073, 348), 'jp': (867, 254, 1078, 450), 'tw': (964, 273, 1061, 426)}, color={'cn': (199, 178, 153), 'en': (199, 182, 163), 'jp': (192, 164, 136), 'tw': (199, 178, 153)}, button={'cn': (964, 273, 1061, 426), 'en': (983, 280, 1073, 348), 'jp': (867, 254, 1078, 450), 'tw': (964, 273, 1061, 426)}, file={'cn': './assets/cn/ui/DORMMENU_GOTO_MEOWFFICER.png', 'en': './assets/en/ui/DORMMENU_GOTO_MEOWFFICER.png', 'jp': './assets/jp/ui/DORMMENU_GOTO_MEOWFFICER.png', 'tw': './assets/tw/ui/DORMMENU_GOTO_MEOWFFICER.png'})
DORM_CHECK = Button(area={'cn': (916, 623, 970, 680), 'en': (914, 623, 973, 676), 'jp': (910, 627, 974, 684), 'tw': (916, 623, 970, 680)}, color={'cn': (211, 191, 164), 'en': (214, 198, 170), 'jp': (210, 187, 165), 'tw': (211, 191, 164)}, button={'cn': (916, 623, 970, 680), 'en': (914, 623, 973, 676), 'jp': (910, 627, 974, 684), 'tw': (916, 623, 970, 680)}, file={'cn': './assets/cn/ui/DORM_CHECK.png', 'en': './assets/en/ui/DORM_CHECK.png', 'jp': './assets/jp/ui/DORM_CHECK.png', 'tw': './assets/tw/ui/DORM_CHECK.png'}) DORM_CHECK = Button(area={'cn': (916, 623, 970, 680), 'en': (914, 623, 973, 676), 'jp': (910, 627, 974, 684), 'tw': (916, 623, 970, 680)}, color={'cn': (211, 191, 164), 'en': (214, 198, 170), 'jp': (210, 187, 165), 'tw': (211, 191, 164)}, button={'cn': (916, 623, 970, 680), 'en': (914, 623, 973, 676), 'jp': (910, 627, 974, 684), 'tw': (916, 623, 970, 680)}, file={'cn': './assets/cn/ui/DORM_CHECK.png', 'en': './assets/en/ui/DORM_CHECK.png', 'jp': './assets/jp/ui/DORM_CHECK.png', 'tw': './assets/tw/ui/DORM_CHECK.png'})
DORM_FEED_CANCEL = Button(area={'cn': (494, 510, 547, 536), 'en': (445, 491, 594, 552), 'jp': (439, 501, 599, 546), 'tw': (494, 510, 547, 536)}, color={'cn': (196, 161, 109), 'en': (240, 200, 125), 'jp': (237, 195, 120), 'tw': (196, 161, 109)}, button={'cn': (494, 510, 547, 536), 'en': (445, 491, 594, 552), 'jp': (439, 501, 599, 546), 'tw': (494, 510, 547, 536)}, file={'cn': './assets/cn/ui/DORM_FEED_CANCEL.png', 'en': './assets/en/ui/DORM_FEED_CANCEL.png', 'jp': './assets/jp/ui/DORM_FEED_CANCEL.png', 'tw': './assets/tw/ui/DORM_FEED_CANCEL.png'}) DORM_FEED_CANCEL = Button(area={'cn': (494, 510, 547, 536), 'en': (445, 491, 594, 552), 'jp': (439, 501, 599, 546), 'tw': (484, 509, 557, 540)}, color={'cn': (196, 161, 109), 'en': (240, 200, 125), 'jp': (237, 195, 120), 'tw': (212, 174, 110)}, button={'cn': (494, 510, 547, 536), 'en': (445, 491, 594, 552), 'jp': (439, 501, 599, 546), 'tw': (484, 509, 557, 540)}, file={'cn': './assets/cn/ui/DORM_FEED_CANCEL.png', 'en': './assets/en/ui/DORM_FEED_CANCEL.png', 'jp': './assets/jp/ui/DORM_FEED_CANCEL.png', 'tw': './assets/tw/ui/DORM_FEED_CANCEL.png'})
DORM_GOTO_MAIN = Button(area={'cn': (28, 20, 50, 51), 'en': (28, 20, 50, 51), 'jp': (22, 14, 61, 56), 'tw': (28, 20, 50, 51)}, color={'cn': (248, 224, 157), 'en': (248, 224, 157), 'jp': (246, 237, 209), 'tw': (248, 224, 157)}, button={'cn': (28, 20, 50, 51), 'en': (28, 20, 50, 51), 'jp': (22, 14, 61, 56), 'tw': (28, 20, 50, 51)}, file={'cn': './assets/cn/ui/DORM_GOTO_MAIN.png', 'en': './assets/en/ui/DORM_GOTO_MAIN.png', 'jp': './assets/jp/ui/DORM_GOTO_MAIN.png', 'tw': './assets/tw/ui/DORM_GOTO_MAIN.png'}) DORM_GOTO_MAIN = Button(area={'cn': (28, 20, 50, 51), 'en': (28, 20, 50, 51), 'jp': (22, 14, 61, 56), 'tw': (28, 20, 50, 51)}, color={'cn': (248, 224, 157), 'en': (248, 224, 157), 'jp': (246, 237, 209), 'tw': (248, 224, 157)}, button={'cn': (28, 20, 50, 51), 'en': (28, 20, 50, 51), 'jp': (22, 14, 61, 56), 'tw': (28, 20, 50, 51)}, file={'cn': './assets/cn/ui/DORM_GOTO_MAIN.png', 'en': './assets/en/ui/DORM_GOTO_MAIN.png', 'jp': './assets/jp/ui/DORM_GOTO_MAIN.png', 'tw': './assets/tw/ui/DORM_GOTO_MAIN.png'})
DORM_INFO = Button(area={'cn': (1071, 609, 1142, 640), 'en': (1071, 609, 1142, 640), 'jp': (1074, 609, 1139, 641), 'tw': (1069, 608, 1144, 641)}, color={'cn': (155, 182, 220), 'en': (150, 181, 221), 'jp': (145, 175, 214), 'tw': (144, 174, 216)}, button={'cn': (1071, 609, 1142, 640), 'en': (1071, 609, 1142, 640), 'jp': (1074, 609, 1139, 641), 'tw': (1069, 608, 1144, 641)}, file={'cn': './assets/cn/ui/DORM_INFO.png', 'en': './assets/en/ui/DORM_INFO.png', 'jp': './assets/jp/ui/DORM_INFO.png', 'tw': './assets/tw/ui/DORM_INFO.png'}) DORM_INFO = Button(area={'cn': (1071, 609, 1142, 640), 'en': (1071, 609, 1142, 640), 'jp': (1074, 609, 1139, 641), 'tw': (1069, 608, 1144, 641)}, color={'cn': (155, 182, 220), 'en': (150, 181, 221), 'jp': (145, 175, 214), 'tw': (144, 174, 216)}, button={'cn': (1071, 609, 1142, 640), 'en': (1071, 609, 1142, 640), 'jp': (1074, 609, 1139, 641), 'tw': (1069, 608, 1144, 641)}, file={'cn': './assets/cn/ui/DORM_INFO.png', 'en': './assets/en/ui/DORM_INFO.png', 'jp': './assets/jp/ui/DORM_INFO.png', 'tw': './assets/tw/ui/DORM_INFO.png'})
DORM_TROPHY_CONFIRM = Button(area={'cn': (590, 473, 690, 508), 'en': (589, 470, 689, 510), 'jp': (588, 472, 689, 509), 'tw': (590, 473, 690, 508)}, color={'cn': (245, 167, 88), 'en': (233, 161, 87), 'jp': (243, 166, 89), 'tw': (245, 167, 88)}, button={'cn': (590, 473, 690, 508), 'en': (589, 470, 689, 510), 'jp': (588, 472, 689, 509), 'tw': (590, 473, 690, 508)}, file={'cn': './assets/cn/ui/DORM_TROPHY_CONFIRM.png', 'en': './assets/en/ui/DORM_TROPHY_CONFIRM.png', 'jp': './assets/jp/ui/DORM_TROPHY_CONFIRM.png', 'tw': './assets/tw/ui/DORM_TROPHY_CONFIRM.png'}) DORM_TROPHY_CONFIRM = Button(area={'cn': (590, 473, 690, 508), 'en': (589, 470, 689, 510), 'jp': (588, 472, 689, 509), 'tw': (590, 473, 690, 508)}, color={'cn': (245, 167, 88), 'en': (233, 161, 87), 'jp': (243, 166, 89), 'tw': (245, 167, 88)}, button={'cn': (590, 473, 690, 508), 'en': (589, 470, 689, 510), 'jp': (588, 472, 689, 509), 'tw': (590, 473, 690, 508)}, file={'cn': './assets/cn/ui/DORM_TROPHY_CONFIRM.png', 'en': './assets/en/ui/DORM_TROPHY_CONFIRM.png', 'jp': './assets/jp/ui/DORM_TROPHY_CONFIRM.png', 'tw': './assets/tw/ui/DORM_TROPHY_CONFIRM.png'})