diff --git a/kotonebot-resource/sprites/jp/daily/screenshot_shop_tip_purchased.png b/kotonebot-resource/sprites/jp/daily/screenshot_shop_tip_purchased.png new file mode 100644 index 0000000..463c9c8 Binary files /dev/null and b/kotonebot-resource/sprites/jp/daily/screenshot_shop_tip_purchased.png differ diff --git a/kotonebot-resource/sprites/jp/daily/screenshot_shop_tip_purchased.png.json b/kotonebot-resource/sprites/jp/daily/screenshot_shop_tip_purchased.png.json new file mode 100644 index 0000000..bc031d6 --- /dev/null +++ b/kotonebot-resource/sprites/jp/daily/screenshot_shop_tip_purchased.png.json @@ -0,0 +1 @@ +{"definitions":{"5d36b880-7b3f-49b1-a018-7de59867d376":{"name":"Daily.TextShopItemPurchased","displayName":"交換しました","type":"template","annotationId":"5d36b880-7b3f-49b1-a018-7de59867d376","useHintRect":false}},"annotations":[{"id":"5d36b880-7b3f-49b1-a018-7de59867d376","type":"rect","data":{"x1":275,"y1":626,"x2":432,"y2":655}}]} \ No newline at end of file diff --git a/kotonebot-resource/sprites/jp/daily/screenshot_shop_tip_sold_out.png b/kotonebot-resource/sprites/jp/daily/screenshot_shop_tip_sold_out.png new file mode 100644 index 0000000..e640d3f Binary files /dev/null and b/kotonebot-resource/sprites/jp/daily/screenshot_shop_tip_sold_out.png differ diff --git a/kotonebot-resource/sprites/jp/daily/screenshot_shop_tip_sold_out.png.json b/kotonebot-resource/sprites/jp/daily/screenshot_shop_tip_sold_out.png.json new file mode 100644 index 0000000..f813f70 --- /dev/null +++ b/kotonebot-resource/sprites/jp/daily/screenshot_shop_tip_sold_out.png.json @@ -0,0 +1 @@ +{"definitions":{"24dc7158-036c-4a66-9280-e934f470be53":{"name":"Daily.TextShopItemSoldOut","displayName":"交換済みです","type":"template","annotationId":"24dc7158-036c-4a66-9280-e934f470be53","useHintRect":false}},"annotations":[{"id":"24dc7158-036c-4a66-9280-e934f470be53","type":"rect","data":{"x1":287,"y1":625,"x2":434,"y2":655}}]} \ No newline at end of file diff --git a/kotonebot-resource/sprites/jp/daily/text_shop_purchased.png b/kotonebot-resource/sprites/jp/daily/text_shop_purchased.png deleted file mode 100644 index 0465de4..0000000 Binary files a/kotonebot-resource/sprites/jp/daily/text_shop_purchased.png and /dev/null differ diff --git a/kotonebot/kaa/tasks/daily/purchase.py b/kotonebot/kaa/tasks/daily/purchase.py index 6f27e0e..1e3283c 100644 --- a/kotonebot/kaa/tasks/daily/purchase.py +++ b/kotonebot/kaa/tasks/daily/purchase.py @@ -2,9 +2,11 @@ import logging from typing import Optional +from kotonebot.backend.loop import Loop from kotonebot.kaa.tasks import R from kotonebot.kaa.common import conf, DailyMoneyShopItems -from kotonebot.util import cropped +from kotonebot.primitives.geometry import Point +from kotonebot.util import Countdown, cropped from kotonebot import task, device, image, action, sleep from kotonebot.backend.dispatch import SimpleDispatcher from ..actions.scenes import goto_home, goto_shop, at_daily_shop @@ -37,10 +39,10 @@ def money_items2(items: Optional[list[DailyMoneyShopItems]] = None): scroll = 0 while items: for item in items: - if image.find(item.to_resource(), colored=True): + if ret := image.find(item.to_resource(), colored=True): logger.info(f'Purchasing {item.to_ui_text(item)}...') device.click() - handle_purchase_dialog() + confirm_purchase(ret.position) finished.append(item) items = [item for item in items if item not in finished] # 全都买完了 @@ -71,16 +73,17 @@ def dispatch_recommended_items(): while True: device.screenshot() - if image.find(R.Daily.TextShopRecommended): + if rec := image.find(R.Daily.TextShopRecommended): logger.info(f'Clicking on recommended item.') # TODO: 计数 device.click() - handle_purchase_dialog() + confirm_purchase(rec.position) + sleep(2.5) # elif image.find(R.Daily.IconTitleDailyShop) and not image.find(R.Daily.TextShopRecommended): logger.info(f'No recommended item found. Finished.') break @action('确认购买', screenshot_mode='manual-inherit') -def handle_purchase_dialog(): +def confirm_purchase(target_item_pos: Point | None = None): """ 确认购买 @@ -89,11 +92,27 @@ def handle_purchase_dialog(): """ # 前置条件:[screenshots\shop\dialog.png] # TODO: 需要有个更好的方式检测是否已购买 - purchased = (SimpleDispatcher('dispatch_purchase_dialog') - .until(R.Common.ButtonConfirm, result=False) - .until(R.Daily.TextShopPurchased, result=True) - .timeout(timeout=3, result=True) - ).run() + purchased = False + cd = Countdown(sec=3) + for _ in Loop(): + if cd.expired(): + purchased = True + break + if image.find(R.Daily.TextShopItemSoldOut): + logger.info('Item sold out.') + purchased = True + break + elif image.find(R.Daily.TextShopItemPurchased): + logger.info('Item already purchased.') + purchased = True + break + elif image.find(R.Common.ButtonConfirm): + logger.info('Confirming purchase...') + device.click() + sleep(0.5) + else: + if target_item_pos: + device.click(target_item_pos) if purchased: logger.info('Item sold out.') @@ -133,7 +152,7 @@ def ap_items(): device.click(results[index]) sleep(0.5) with cropped(device, y1=0.3): - purchased = image.wait_for(R.Daily.TextShopPurchased, timeout=1) + purchased = image.wait_for(R.Daily.TextShopItemSoldOut, timeout=1) if purchased is not None: logger.info(f'AP item #{index} already purchased.') continue @@ -158,8 +177,8 @@ def purchase(): if not conf().purchase.enabled: logger.info('Purchase is disabled.') return - if not at_daily_shop(): - goto_shop() + + goto_shop() # 进入每日商店 [screenshots\shop\shop.png] device.click(image.expect(R.Daily.ButtonDailyShop)) # TODO: memoable # 等待载入 diff --git a/submodules/gakumasu-diff b/submodules/gakumasu-diff index bca78ea..4328e2b 160000 --- a/submodules/gakumasu-diff +++ b/submodules/gakumasu-diff @@ -1 +1 @@ -Subproject commit bca78ea35b0883c24814c523cec1856615205199 +Subproject commit 4328e2b53dc6e3efa4fef691064f40ceb998c97a