Refactor: Separate dorm to standalone module

This commit is contained in:
LmeSzinc 2021-09-20 22:39:06 +08:00
parent cd2a932de0
commit ca5a14a2dd
23 changed files with 57 additions and 74 deletions

View File

@ -12,6 +12,7 @@ from module.commission.commission import RewardCommission
from module.config.config import AzurLaneConfig, TaskEnd
from module.config.db import Database
from module.device.device import Device
from module.dorm.dorm import RewardDorm
from module.exception import *
from module.handler.login import LoginHandler
from module.handler.sensitive_info import handle_sensitive_image, handle_sensitive_logs
@ -108,6 +109,9 @@ class AzurLaneAutoScript:
def tactical(self):
RewardTacticalClass(config=self.config, device=self.device).run()
def dorm(self):
RewardDorm(config=self.config, device=self.device).run()
def reward(self):
Reward(config=self.config, device=self.device).run()

View File

Before

Width:  |  Height:  |  Size: 9.0 KiB

After

Width:  |  Height:  |  Size: 9.0 KiB

View File

Before

Width:  |  Height:  |  Size: 9.2 KiB

After

Width:  |  Height:  |  Size: 9.2 KiB

View File

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

View File

Before

Width:  |  Height:  |  Size: 7.5 KiB

After

Width:  |  Height:  |  Size: 7.5 KiB

View File

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

View File

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

View File

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

View File

Before

Width:  |  Height:  |  Size: 8.6 KiB

After

Width:  |  Height:  |  Size: 8.6 KiB

View File

Before

Width:  |  Height:  |  Size: 6.1 KiB

After

Width:  |  Height:  |  Size: 6.1 KiB

View File

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

View File

Before

Width:  |  Height:  |  Size: 5.4 KiB

After

Width:  |  Height:  |  Size: 5.4 KiB

View File

Before

Width:  |  Height:  |  Size: 6.6 KiB

After

Width:  |  Height:  |  Size: 6.6 KiB

View File

Before

Width:  |  Height:  |  Size: 7.0 KiB

After

Width:  |  Height:  |  Size: 7.0 KiB

View File

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

View File

Before

Width:  |  Height:  |  Size: 7.5 KiB

After

Width:  |  Height:  |  Size: 7.5 KiB

View File

@ -228,6 +228,18 @@ Research:
UsePart: true
PresetFilter: series_4
CustomFilter: 0.5 > reset > shortest
Dorm:
Scheduler:
Enable: true
NextRun: 2020-01-01 00:00:00
Command: Dorm
SuccessInterval: 278-360
FailureInterval: 278-360
ServerUpdate: 00:00
Dorm:
Collect: true
Feed: true
FeedFilter: 20000 > 10000 > 5000 > 3000 > 2000 > 1000
Reward:
Scheduler:
Enable: true

View File

@ -332,6 +332,20 @@ Research:
- series_3
- series_3_than_2
CustomFilter: 0.5 > reset > shortest
Dorm:
_info:
Menu: Reward
Scheduler:
Enable: true
NextRun: 2020-01-01 00:00:00
Command: Dorm
SuccessInterval: 278-360
FailureInterval: 278-360
ServerUpdate: 00:00
Dorm:
Collect: true
Feed: true
FeedFilter: 20000 > 10000 > 5000 > 3000 > 2000 > 1000
Reward:
_info:
Menu: Reward

View File

@ -115,6 +115,11 @@ class GeneratedConfig:
Research_PresetFilter = 'series_4' # custom, series_4, series_3, series_3_than_2
Research_CustomFilter = '0.5 > reset > shortest'
# Func `Dorm`
Dorm_Collect = True
Dorm_Feed = True
Dorm_FeedFilter = '20000 > 10000 > 5000 > 3000 > 2000 > 1000'
# Func `Reward`
Reward_CollectOil = True
Reward_CollectCoin = True

10
module/dorm/assets.py Normal file
View File

@ -0,0 +1,10 @@
from module.base.button import Button
from module.base.template import Template
# This file was automatically generated by dev_tools.button_extract.
# Don't modify it manually.
DORM_FEED_CHECK = Button(area={'cn': (328, 247, 390, 279), 'en': (307, 248, 410, 278), 'jp': (323, 245, 393, 281), 'tw': (326, 246, 391, 282)}, color={'cn': (173, 124, 121), 'en': (211, 186, 114), 'jp': (183, 143, 142), 'tw': (181, 133, 131)}, button={'cn': (328, 247, 390, 279), 'en': (307, 248, 410, 278), 'jp': (323, 245, 393, 281), 'tw': (326, 246, 391, 282)}, file={'cn': './assets/cn/dorm/DORM_FEED_CHECK.png', 'en': './assets/en/dorm/DORM_FEED_CHECK.png', 'jp': './assets/jp/dorm/DORM_FEED_CHECK.png', 'tw': './assets/tw/dorm/DORM_FEED_CHECK.png'})
DORM_FEED_ENTER = Button(area={'cn': (64, 623, 127, 655), 'en': (59, 649, 138, 671), 'jp': (66, 626, 129, 659), 'tw': (63, 623, 128, 657)}, color={'cn': (182, 142, 136), 'en': (193, 158, 158), 'jp': (197, 155, 149), 'tw': (179, 144, 139)}, button={'cn': (64, 623, 127, 655), 'en': (59, 649, 138, 671), 'jp': (66, 626, 129, 659), 'tw': (63, 623, 128, 657)}, file={'cn': './assets/cn/dorm/DORM_FEED_ENTER.png', 'en': './assets/en/dorm/DORM_FEED_ENTER.png', 'jp': './assets/jp/dorm/DORM_FEED_ENTER.png', 'tw': './assets/tw/dorm/DORM_FEED_ENTER.png'})
DORM_RED_DOT = Button(area={'cn': (734, 215, 767, 248), 'en': (734, 215, 767, 248), 'jp': (734, 215, 767, 248), 'tw': (734, 215, 767, 248)}, color={'cn': (130, 89, 94), 'en': (130, 89, 94), 'jp': (130, 89, 94), 'tw': (130, 89, 94)}, button={'cn': (734, 215, 767, 248), 'en': (734, 215, 767, 248), 'jp': (734, 215, 767, 248), 'tw': (734, 215, 767, 248)}, file={'cn': './assets/cn/dorm/DORM_RED_DOT.png', 'en': './assets/en/dorm/DORM_RED_DOT.png', 'jp': './assets/jp/dorm/DORM_RED_DOT.png', 'tw': './assets/tw/dorm/DORM_RED_DOT.png'})
OCR_DORM_FILL = Button(area={'cn': (653, 255, 793, 279), 'en': (641, 257, 781, 281), 'jp': (646, 259, 806, 277), 'tw': (653, 255, 793, 279)}, color={'cn': (156, 152, 149), 'en': (158, 154, 152), 'jp': (225, 189, 148), 'tw': (156, 152, 149)}, button={'cn': (653, 255, 793, 279), 'en': (641, 257, 781, 281), 'jp': (646, 259, 806, 277), 'tw': (653, 255, 793, 279)}, file={'cn': './assets/cn/dorm/OCR_DORM_FILL.png', 'en': './assets/en/dorm/OCR_DORM_FILL.png', 'jp': './assets/jp/dorm/OCR_DORM_FILL.png', 'tw': './assets/tw/dorm/OCR_DORM_FILL.png'})

View File

@ -1,17 +1,15 @@
import re
from datetime import datetime, timedelta
from PIL import Image
from module.base.button import ButtonGrid
from module.base.decorator import cached_property
from module.base.filter import Filter
from module.base.mask import Mask
from module.base.timer import Timer
from module.base.utils import *
from module.dorm.assets import *
from module.logger import logger
from module.ocr.ocr import Digit, DigitCounter
from module.reward.assets import *
from module.template.assets import TEMPLATE_DORM_COIN, TEMPLATE_DORM_LOVE
from module.ui.assets import DORM_CHECK, DORM_TROPHY_CONFIRM, DORM_INFO
from module.ui.page import page_dorm, page_dormmenu
@ -186,7 +184,7 @@ class RewardDorm(UI):
_, fill, _ = OCR_FILL.ocr(self.device.image)
logger.info(f'Dorm food: {[f.amount for f in food]}, to fill: {fill}')
FOOD_FILTER.load(self.config.DORM_FEED_FILTER)
FOOD_FILTER.load(self.config.Dorm_FeedFilter)
for selected in FOOD_FILTER.apply(food):
button = FOOD.buttons[food.index(selected)]
if selected.amount > 0 and fill > selected.feed:
@ -218,10 +216,9 @@ class RewardDorm(UI):
"""
Pages:
in: Any page
out: page_main
out: page_dorm
"""
if not feed and not collect:
self.ui_goto_main()
return
self.ui_ensure(page_dormmenu)
@ -229,7 +226,6 @@ class RewardDorm(UI):
logger.info('Nothing to collect. Dorm collecting skipped.')
collect = False
if not feed:
self.ui_goto_main()
return
self.ui_goto(page_dorm, skip_first_screenshot=True)
@ -243,69 +239,15 @@ class RewardDorm(UI):
self.ui_click(click_button=DORM_FEED_ENTER, appear_button=DORM_FEED_CHECK, check_button=DORM_CHECK,
skip_first_screenshot=True)
self.ui_goto_main()
@cached_property
def dorm_feed_interval(self):
return int(ensure_time(self.config.DORM_FEED_INTERVAL, precision=3) * 60)
def dorm_feed_interval_reset(self):
""" Call this method after dorm feed executed """
del self.__dict__['dorm_feed_interval']
@cached_property
def dorm_collect_interval(self):
return int(ensure_time(self.config.DORM_COLLECT_INTERVAL, precision=3) * 60)
def dorm_collect_interval_reset(self):
""" Call this method after dorm collect executed """
del self.__dict__['dorm_collect_interval']
def handle_dorm(self):
def run(self):
"""
Returns:
bool: If executed.
Pages:
in: Any page
out: page_dorm
"""
# Base case check
if not self.config.ENABLE_DORM_REWARD:
return False
if not self.config.Dorm_Feed and not self.config.Dorm_Collect:
self.config.Scheduler_Enable = False
self.config.task_stop()
# Record check, create configured flags for dorm_run
now = datetime.now()
do_collect = False
collect_record = datetime.strptime(self.config.config.get(*COLLECT_RECORD), self.config.TIME_FORMAT)
update = collect_record + timedelta(seconds=self.dorm_collect_interval)
attr = f'{COLLECT_RECORD[0]}_{COLLECT_RECORD[1]}'
logger.attr(f'{attr}', f'Record time: {collect_record}')
logger.attr(f'{attr}', f'Next update: {update}')
if now > update:
do_collect = True
do_feed = False
if self.config.ENABLE_DORM_FEED:
feed_record = datetime.strptime(self.config.config.get(*FEED_RECORD), self.config.TIME_FORMAT)
update = feed_record + timedelta(seconds=self.dorm_feed_interval)
attr = f'{FEED_RECORD[0]}_{FEED_RECORD[1]}'
logger.attr(f'{attr}', f'Record time: {feed_record}')
logger.attr(f'{attr}', f'Next update: {update}')
if now > update:
do_feed = True
# Neither, no need to do dorm_run
if not do_collect and not do_feed:
return False
# Execute dorm_run with configured flags
self.dorm_run(feed=do_feed, collect=do_collect)
# Record into config if executed
if do_collect:
self.dorm_collect_interval_reset()
self.config.record_save(COLLECT_RECORD)
if do_feed:
self.dorm_feed_interval_reset()
self.config.record_save(FEED_RECORD)
return True
self.dorm_run(feed=self.config.Dorm_Feed, collect=self.config.Dorm_Collect)
self.config.task_delay(success=True)

View File

@ -7,9 +7,6 @@ from module.base.template import Template
COIN = Button(area={'cn': (403, 64, 436, 88), 'en': (403, 64, 436, 88), 'jp': (403, 64, 436, 88), 'tw': (403, 64, 436, 88)}, color={'cn': (226, 173, 72), 'en': (226, 173, 72), 'jp': (226, 173, 72), 'tw': (226, 173, 72)}, button={'cn': (403, 64, 436, 88), 'en': (403, 64, 436, 88), 'jp': (403, 64, 436, 88), 'tw': (403, 64, 436, 88)}, file={'cn': './assets/cn/reward/COIN.png', 'en': './assets/en/reward/COIN.png', 'jp': './assets/jp/reward/COIN.png', 'tw': './assets/tw/reward/COIN.png'})
DATA_KEY_COLLECT = Button(area={'cn': (251, 38, 339, 73), 'en': (256, 42, 337, 68), 'jp': (251, 38, 339, 73), 'tw': (251, 38, 339, 73)}, color={'cn': (144, 116, 77), 'en': (145, 109, 72), 'jp': (144, 116, 77), 'tw': (144, 116, 77)}, button={'cn': (251, 38, 339, 73), 'en': (256, 42, 337, 68), 'jp': (251, 38, 339, 73), 'tw': (251, 38, 339, 73)}, file={'cn': './assets/cn/reward/DATA_KEY_COLLECT.png', 'en': './assets/en/reward/DATA_KEY_COLLECT.png', 'jp': './assets/jp/reward/DATA_KEY_COLLECT.png', 'tw': './assets/tw/reward/DATA_KEY_COLLECT.png'})
DATA_KEY_COLLECTED = Button(area={'cn': (251, 38, 339, 73), 'en': (255, 42, 338, 68), 'jp': (251, 38, 339, 73), 'tw': (251, 38, 339, 73)}, color={'cn': (102, 103, 103), 'en': (113, 113, 115), 'jp': (102, 103, 103), 'tw': (102, 103, 103)}, button={'cn': (251, 38, 339, 73), 'en': (255, 42, 338, 68), 'jp': (251, 38, 339, 73), 'tw': (251, 38, 339, 73)}, file={'cn': './assets/cn/reward/DATA_KEY_COLLECTED.png', 'en': './assets/en/reward/DATA_KEY_COLLECTED.png', 'jp': './assets/jp/reward/DATA_KEY_COLLECTED.png', 'tw': './assets/tw/reward/DATA_KEY_COLLECTED.png'})
DORM_FEED_CHECK = Button(area={'cn': (328, 247, 390, 279), 'en': (307, 248, 410, 278), 'jp': (323, 245, 393, 281), 'tw': (326, 246, 391, 282)}, color={'cn': (173, 124, 121), 'en': (211, 186, 114), 'jp': (183, 143, 142), 'tw': (181, 133, 131)}, button={'cn': (328, 247, 390, 279), 'en': (307, 248, 410, 278), 'jp': (323, 245, 393, 281), 'tw': (326, 246, 391, 282)}, file={'cn': './assets/cn/reward/DORM_FEED_CHECK.png', 'en': './assets/en/reward/DORM_FEED_CHECK.png', 'jp': './assets/jp/reward/DORM_FEED_CHECK.png', 'tw': './assets/tw/reward/DORM_FEED_CHECK.png'})
DORM_FEED_ENTER = Button(area={'cn': (64, 623, 127, 655), 'en': (59, 649, 138, 671), 'jp': (66, 626, 129, 659), 'tw': (63, 623, 128, 657)}, color={'cn': (182, 142, 136), 'en': (193, 158, 158), 'jp': (197, 155, 149), 'tw': (179, 144, 139)}, button={'cn': (64, 623, 127, 655), 'en': (59, 649, 138, 671), 'jp': (66, 626, 129, 659), 'tw': (63, 623, 128, 657)}, file={'cn': './assets/cn/reward/DORM_FEED_ENTER.png', 'en': './assets/en/reward/DORM_FEED_ENTER.png', 'jp': './assets/jp/reward/DORM_FEED_ENTER.png', 'tw': './assets/tw/reward/DORM_FEED_ENTER.png'})
DORM_RED_DOT = Button(area={'cn': (734, 215, 767, 248), 'en': (734, 215, 767, 248), 'jp': (734, 215, 767, 248), 'tw': (734, 215, 767, 248)}, color={'cn': (130, 89, 94), 'en': (130, 89, 94), 'jp': (130, 89, 94), 'tw': (130, 89, 94)}, button={'cn': (734, 215, 767, 248), 'en': (734, 215, 767, 248), 'jp': (734, 215, 767, 248), 'tw': (734, 215, 767, 248)}, file={'cn': './assets/cn/reward/DORM_RED_DOT.png', 'en': './assets/en/reward/DORM_RED_DOT.png', 'jp': './assets/jp/reward/DORM_RED_DOT.png', 'tw': './assets/tw/reward/DORM_RED_DOT.png'})
MEOWFFICER_BUY = Button(area={'cn': (864, 461, 957, 493), 'en': (864, 460, 957, 492), 'jp': (863, 460, 957, 494), 'tw': (881, 465, 938, 492)}, color={'cn': (241, 217, 105), 'en': (231, 207, 105), 'jp': (241, 216, 107), 'tw': (222, 196, 94)}, button={'cn': (864, 461, 957, 493), 'en': (864, 460, 957, 492), 'jp': (863, 460, 957, 494), 'tw': (881, 465, 938, 492)}, file={'cn': './assets/cn/reward/MEOWFFICER_BUY.png', 'en': './assets/en/reward/MEOWFFICER_BUY.png', 'jp': './assets/jp/reward/MEOWFFICER_BUY.png', 'tw': './assets/tw/reward/MEOWFFICER_BUY.png'})
MEOWFFICER_BUY_ENTER = Button(area={'cn': (995, 588, 1104, 657), 'en': (1008, 623, 1072, 655), 'jp': (999, 600, 1102, 658), 'tw': (1016, 618, 1079, 652)}, color={'cn': (206, 177, 135), 'en': (199, 163, 137), 'jp': (200, 172, 130), 'tw': (190, 159, 144)}, button={'cn': (995, 588, 1104, 657), 'en': (1008, 623, 1072, 655), 'jp': (999, 600, 1102, 658), 'tw': (1016, 618, 1079, 652)}, file={'cn': './assets/cn/reward/MEOWFFICER_BUY_ENTER.png', 'en': './assets/en/reward/MEOWFFICER_BUY_ENTER.png', 'jp': './assets/jp/reward/MEOWFFICER_BUY_ENTER.png', 'tw': './assets/tw/reward/MEOWFFICER_BUY_ENTER.png'})
MEOWFFICER_BUY_NEXT = Button(area={'cn': (937, 281, 961, 302), 'en': (937, 281, 961, 302), 'jp': (932, 280, 958, 304), 'tw': (937, 281, 961, 302)}, color={'cn': (246, 220, 140), 'en': (246, 220, 140), 'jp': (254, 226, 139), 'tw': (246, 220, 140)}, button={'cn': (937, 281, 961, 302), 'en': (937, 281, 961, 302), 'jp': (932, 280, 958, 304), 'tw': (937, 281, 961, 302)}, file={'cn': './assets/cn/reward/MEOWFFICER_BUY_NEXT.png', 'en': './assets/en/reward/MEOWFFICER_BUY_NEXT.png', 'jp': './assets/jp/reward/MEOWFFICER_BUY_NEXT.png', 'tw': './assets/tw/reward/MEOWFFICER_BUY_NEXT.png'})
@ -34,7 +31,6 @@ MISSION_NOTICE = Button(area={'cn': (940, 670, 945, 681), 'en': (940, 670, 945,
MISSION_SINGLE = Button(area={'cn': (1093, 118, 1179, 177), 'en': (1093, 118, 1179, 177), 'jp': (1102, 120, 1166, 149), 'tw': (1097, 116, 1176, 181)}, color={'cn': (115, 155, 218), 'en': (106, 147, 215), 'jp': (136, 176, 226), 'tw': (105, 147, 215)}, button={'cn': (1093, 118, 1179, 177), 'en': (1093, 118, 1179, 177), 'jp': (1102, 120, 1166, 149), 'tw': (1097, 116, 1176, 181)}, file={'cn': './assets/cn/reward/MISSION_SINGLE.png', 'en': './assets/en/reward/MISSION_SINGLE.png', 'jp': './assets/jp/reward/MISSION_SINGLE.png', 'tw': './assets/tw/reward/MISSION_SINGLE.png'})
MISSION_WEEKLY_RED_DOT = Button(area={'cn': (82, 506, 96, 525), 'en': (82, 506, 96, 525), 'jp': (82, 506, 96, 525), 'tw': (82, 506, 96, 525)}, color={'cn': (209, 107, 89), 'en': (209, 107, 89), 'jp': (209, 107, 89), 'tw': (209, 107, 89)}, button={'cn': (82, 506, 96, 525), 'en': (82, 506, 96, 525), 'jp': (82, 506, 96, 525), 'tw': (82, 506, 96, 525)}, file={'cn': './assets/cn/reward/MISSION_WEEKLY_RED_DOT.png', 'en': './assets/en/reward/MISSION_WEEKLY_RED_DOT.png', 'jp': './assets/jp/reward/MISSION_WEEKLY_RED_DOT.png', 'tw': './assets/tw/reward/MISSION_WEEKLY_RED_DOT.png'})
OCR_DATA_KEY = Button(area={'cn': (132, 42, 233, 70), 'en': (132, 42, 233, 70), 'jp': (132, 42, 233, 70), 'tw': (132, 42, 233, 70)}, color={'cn': (74, 75, 86), 'en': (74, 75, 86), 'jp': (74, 75, 86), 'tw': (74, 75, 86)}, button={'cn': (132, 42, 233, 70), 'en': (132, 42, 233, 70), 'jp': (132, 42, 233, 70), 'tw': (132, 42, 233, 70)}, file={'cn': './assets/cn/reward/OCR_DATA_KEY.png', 'en': './assets/en/reward/OCR_DATA_KEY.png', 'jp': './assets/jp/reward/OCR_DATA_KEY.png', 'tw': './assets/tw/reward/OCR_DATA_KEY.png'})
OCR_DORM_FILL = Button(area={'cn': (653, 255, 793, 279), 'en': (641, 257, 781, 281), 'jp': (646, 259, 806, 277), 'tw': (653, 255, 793, 279)}, color={'cn': (156, 152, 149), 'en': (158, 154, 152), 'jp': (225, 189, 148), 'tw': (156, 152, 149)}, button={'cn': (653, 255, 793, 279), 'en': (641, 257, 781, 281), 'jp': (646, 259, 806, 277), 'tw': (653, 255, 793, 279)}, file={'cn': './assets/cn/reward/OCR_DORM_FILL.png', 'en': './assets/en/reward/OCR_DORM_FILL.png', 'jp': './assets/jp/reward/OCR_DORM_FILL.png', 'tw': './assets/tw/reward/OCR_DORM_FILL.png'})
OCR_MEOWFFICER = Button(area={'cn': (1046, 672, 1092, 693), 'en': (1054, 673, 1097, 692), 'jp': (1052, 674, 1094, 690), 'tw': (1055, 673, 1098, 694)}, color={'cn': (217, 203, 192), 'en': (210, 194, 182), 'jp': (201, 183, 171), 'tw': (215, 200, 188)}, button={'cn': (1046, 672, 1092, 693), 'en': (1054, 673, 1097, 692), 'jp': (1052, 674, 1094, 690), 'tw': (1055, 673, 1098, 694)}, file={'cn': './assets/cn/reward/OCR_MEOWFFICER.png', 'en': './assets/en/reward/OCR_MEOWFFICER.png', 'jp': './assets/jp/reward/OCR_MEOWFFICER.png', 'tw': './assets/tw/reward/OCR_MEOWFFICER.png'})
OCR_MEOWFFICER_CAPACITY = Button(area={'cn': (739, 563, 849, 597), 'en': (742, 565, 817, 594), 'jp': (741, 565, 831, 595), 'tw': (735, 562, 813, 597)}, color={'cn': (227, 225, 225), 'en': (201, 198, 198), 'jp': (211, 208, 208), 'tw': (219, 217, 217)}, button={'cn': (739, 563, 849, 597), 'en': (742, 565, 817, 594), 'jp': (741, 565, 831, 595), 'tw': (735, 562, 813, 597)}, file={'cn': './assets/cn/reward/OCR_MEOWFFICER_CAPACITY.png', 'en': './assets/en/reward/OCR_MEOWFFICER_CAPACITY.png', 'jp': './assets/jp/reward/OCR_MEOWFFICER_CAPACITY.png', 'tw': './assets/tw/reward/OCR_MEOWFFICER_CAPACITY.png'})
OCR_MEOWFFICER_CHOOSE = Button(area={'cn': (858, 280, 918, 305), 'en': (858, 280, 918, 305), 'jp': (858, 280, 918, 305), 'tw': (864, 280, 909, 305)}, color={'cn': (243, 240, 237), 'en': (243, 240, 237), 'jp': (243, 240, 237), 'tw': (239, 235, 231)}, button={'cn': (858, 280, 918, 305), 'en': (858, 280, 918, 305), 'jp': (858, 280, 918, 305), 'tw': (864, 280, 909, 305)}, file={'cn': './assets/cn/reward/OCR_MEOWFFICER_CHOOSE.png', 'en': './assets/en/reward/OCR_MEOWFFICER_CHOOSE.png', 'jp': './assets/jp/reward/OCR_MEOWFFICER_CHOOSE.png', 'tw': './assets/tw/reward/OCR_MEOWFFICER_CHOOSE.png'})