diff --git a/assets/bargain_altar.png b/assets/bargain_altar.png new file mode 100644 index 0000000..854d8cd Binary files /dev/null and b/assets/bargain_altar.png differ diff --git a/assets/bargain_button.png b/assets/bargain_button.png new file mode 100644 index 0000000..f84abbf Binary files /dev/null and b/assets/bargain_button.png differ diff --git a/assets/bargain_dismiss.png b/assets/bargain_dismiss.png new file mode 100644 index 0000000..fea668d Binary files /dev/null and b/assets/bargain_dismiss.png differ diff --git a/assets/bargain_reward.png b/assets/bargain_reward.png new file mode 100644 index 0000000..ff23714 Binary files /dev/null and b/assets/bargain_reward.png differ diff --git a/assets/guild_page_title.png b/assets/guild_page_title.png new file mode 100644 index 0000000..6b87f5a Binary files /dev/null and b/assets/guild_page_title.png differ diff --git a/automation/guild_bargain.py b/automation/guild_bargain.py new file mode 100644 index 0000000..fd2e322 --- /dev/null +++ b/automation/guild_bargain.py @@ -0,0 +1,23 @@ +"""公会右下红珍珠祭坛砍价流程。""" +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()=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' diff --git a/claim_guild_bargain.py b/claim_guild_bargain.py new file mode 100644 index 0000000..be9b292 --- /dev/null +++ b/claim_guild_bargain.py @@ -0,0 +1,14 @@ +import argparse,sys,time +from pathlib import Path +from automation.engine import Matcher,load_flow +from automation.guild_bargain import GuildBargainRunner +from automation.offers import MacGameDesktop +ROOT=Path(__file__).resolve().parent +def main(): + p=argparse.ArgumentParser(description='公会红珍珠祭坛:砍价一次并返回首页');p.add_argument('--dry-run',action='store_true');a=p.parse_args() + if sys.platform!='darwin':return 2 + try: + d=MacGameDesktop();d.activate();print('3 秒后开始;请保持游戏在前台。',flush=True);time.sleep(3) + GuildBargainRunner(d,Matcher(ROOT/'assets'),load_flow(ROOT/'workflows/guild_bargain.json'),d.region_for).run(a.dry_run);return 0 + except Exception as e:print('流程停止:'+str(e),file=sys.stderr);return 1 +if __name__=='__main__':raise SystemExit(main()) diff --git a/workflows/guild_bargain.json b/workflows/guild_bargain.json new file mode 100644 index 0000000..09e7dbf --- /dev/null +++ b/workflows/guild_bargain.json @@ -0,0 +1 @@ +{"name":"公会砍价","states":{"home":[{"template":"home.png","search":[150,730,410,865]}],"guild":[{"template":"guild_page_title.png","search":[120,110,350,200]}],"bargain":[{"template":"bargain_button.png","search":[160,480,410,640]}],"reward":[{"template":"bargain_reward.png","search":[120,180,440,390],"threshold":0.8},{"template":"bargain_dismiss.png","search":[145,600,420,730]}]},"clicks":{"guild":[0.90,0.94],"altar":[0.84,0.72],"bargain":[0.50,0.55],"dismiss_reward":[0.50,0.67],"altar_back":[0.12,0.94],"guild_back":[0.90,0.94]}}