24 lines
1.7 KiB
Python
24 lines
1.7 KiB
Python
"""公会右下红珍珠祭坛砍价流程。"""
|
|
import time
|
|
from .engine import WorkflowError
|
|
class GuildBargainRunner:
|
|
def __init__(self,desktop,matcher,flow,region_provider,log=print,timeout=12):self.desktop,self.matcher,self.flow=desktop,matcher,flow;self.region_provider,self.log,self.timeout=region_provider,log,timeout
|
|
def wait(self,*names):
|
|
end=time.monotonic()+self.timeout;prev=None;stable=0
|
|
while time.monotonic()<end:
|
|
shot=self.desktop.screenshot();region=self.region_provider(shot);frame=self.matcher.frame(shot,region);found=next((n for n in names if self.matcher.matches(frame,self.flow['states'][n])),None)
|
|
stable=stable+1 if found and found==prev else (1 if found else 0);prev=found
|
|
if stable>=2:return found,shot,region,frame
|
|
time.sleep(.25)
|
|
raise WorkflowError('未识别到预期页面 '+ '/'.join(names)+',已停止。')
|
|
def action(self,name,obs):
|
|
_,shot,region,_=obs
|
|
if self.region_provider(shot)!=region:raise WorkflowError('识别后游戏窗口移动,已停止,请重新运行。')
|
|
self.desktop.click(self.flow['clicks'][name],region,shot.size,hold=.8);self.log('已执行:'+name)
|
|
def run(self,dry_run=False):
|
|
home=self.wait('home')
|
|
if dry_run:self.log('首页识别通过。计划:公会 → 红珍珠祭坛 → 砍价 → 返回首页。未点击。');return 'preview'
|
|
self.action('guild',home);guild=self.wait('guild');self.action('altar',guild);page=self.wait('bargain')
|
|
self.action('bargain',page);reward=self.wait('reward');self.action('dismiss_reward',reward)
|
|
self.action('altar_back',self.wait('bargain'));self.action('guild_back',self.wait('guild'));self.wait('home');self.log('已确认返回首页。');return 'claimed'
|