Skip to content

Commit

Permalink
Merge branch 'main' into export_pdf
Browse files Browse the repository at this point in the history
  • Loading branch information
DoctorReid committed Dec 23, 2023
2 parents 2697a00 + 5202bc6 commit 318d726
Show file tree
Hide file tree
Showing 45 changed files with 1,012 additions and 583 deletions.
39 changes: 25 additions & 14 deletions src/basic/__init__.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,19 @@
from pydantic import BaseModel
from typing import Union


class Point(BaseModel):
"""坐标 会转化成整数"""
class Point:

x: int
y: int
def __init__(self, x: Union[int, float], y: Union[int, float]):
"""
一个点 坐标会转化成整数
:param x: 横坐标
:param y: 纵坐标
"""

def __init__(self, x, y):
super().__init__(x=int(x), y=int(y))
self.x: int = int(x)
"""横坐标"""
self.y: int = int(y)
"""纵坐标"""

def tuple(self):
return self.x, self.y
Expand All @@ -20,15 +25,21 @@ def __add__(self, other):
return Point(self.x + other.x, self.y + other.y)


class Rect(BaseModel):
class Rect:

x1: int
y1: int
x2: int
y2: int
def __init__(self, x1: Union[int, float], y1: Union[int, float], x2: Union[int, float], y2: Union[int, float]):
"""
一个矩形 坐标会转化成整数
:param x1: 左上角 横坐标
:param y1: 左上角 纵坐标
:param x2: 右下角 横坐标
:param y2: 右下角 纵坐标
"""

def __init__(self, x1, y1, x2, y2):
super().__init__(x1=x1, y1=y1, x2=x2, y2=y2)
self.x1: int = int(x1)
self.y1: int = int(y1)
self.x2: int = int(x2)
self.y2: int = int(y2)

@property
def center(self) -> Point:
Expand Down
110 changes: 108 additions & 2 deletions src/sr/app/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
from sr.const import game_config_const
from sr.context import Context
from sr.operation import Operation, OperationResult
from sr.operation.combine import StatusCombineOperation2, StatusCombineOperationEdge2, StatusCombineOperationNode
from sr.operation.unit.enter_game import EnterGame


Expand Down Expand Up @@ -86,10 +87,18 @@ def __init__(self, ctx: Context, op_name: str = None,
init_context_before_start: bool = True,
stop_context_after_stop: bool = True,
run_record: Optional[AppRunRecord] = None):
super().__init__(ctx, try_times=1, op_name=op_name) # 应用只是组装指令 不应该有重试
super().__init__(ctx, try_times=1, # 应用只是组装指令 不应该有重试
op_name=op_name,
)

self.run_record: Optional[AppRunRecord] = run_record
"""运行记录"""

self.init_context_before_start: bool = init_context_before_start
"""运行前是否初始化上下文 一条龙只有第一个应用需要"""

self.stop_context_after_stop: bool = stop_context_after_stop
self.run_record: Optional[AppRunRecord] = run_record
"""运行后是否停止上下文 一条龙只有最后一个应用需要"""

def _init_context(self) -> bool:
"""
Expand Down Expand Up @@ -156,6 +165,103 @@ def next_execution_desc(self) -> str:
return ''


class Application2(StatusCombineOperation2):

def __init__(self, ctx: Context, op_name: str = None,
edges: Optional[List[StatusCombineOperationEdge2]] = None,
specified_start_node: Optional[StatusCombineOperationNode] = None,
init_context_before_start: bool = True,
stop_context_after_stop: bool = True,
run_record: Optional[AppRunRecord] = None):
StatusCombineOperation2.__init__(self, ctx, op_name=op_name,
edges=edges, specified_start_node=specified_start_node)

self.run_record: Optional[AppRunRecord] = run_record
"""运行记录"""

self.init_context_before_start: bool = init_context_before_start
"""运行前是否初始化上下文 一条龙只有第一个应用需要"""

self.stop_context_after_stop: bool = stop_context_after_stop
"""运行后是否停止上下文 一条龙只有最后一个应用需要"""

def _init_context(self) -> bool:
"""
上下文的初始化
:return: 是否初始化成功
"""
if not self.init_context_before_start:
return True

if not self.ctx.start_running():
return False

if self.ctx.open_game_by_script:
op = EnterGame(self.ctx)
result = op.execute()
if not result.success:
log.error('进入游戏失败')
self.ctx.stop_running()
return False

return True

def _init_before_execute(self):
StatusCombineOperation2._init_before_execute(self)
self.run_record.update_status(AppRunRecord.STATUS_RUNNING)

def execute(self) -> OperationResult:
if not self._init_context():
return Operation.op_fail('初始化失败')
result: OperationResult = StatusCombineOperation2.execute(self)
return result

def on_resume(self):
StatusCombineOperation2.on_resume(self)
self.ctx.controller.init()

def _stop_context(self):
if self.stop_context_after_stop:
self.ctx.stop_running()

def _after_operation_done(self, result: OperationResult):
"""
停止后的处理
:return:
"""
StatusCombineOperation2._after_operation_done(self, result)
self._update_record_stop(result)
self._stop_context()

def _update_record_stop(self, result: OperationResult):
"""
应用停止后的对运行记录的更新
:param result: 运行结果
:return:
"""
if self.run_record is not None:
if result.success:
self.run_record.update_status(AppRunRecord.STATUS_SUCCESS)
else:
self.run_record.update_status(AppRunRecord.STATUS_FAIL)

@property
def current_execution_desc(self) -> str:
"""
当前运行的描述 用于UI展示
:return:
"""
return ''

@property
def next_execution_desc(self) -> str:
"""
下一步运行的描述 用于UI展示
:return:
"""
return ''


def app_record_now_time_str() -> str:
"""
返回当前时间字符串
Expand Down
138 changes: 63 additions & 75 deletions src/sr/app/routine/daily_training_app.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,17 @@
from typing import Optional
from typing import Optional, List

from basic.i18_utils import gt
from sr.app import Application, AppRunRecord, AppDescription, register_app
from sr.app import Application, AppRunRecord, AppDescription, register_app, Application2
from sr.const import phone_menu_const
from sr.const.traing_mission_const import MISSION_SALVAGE_RELIC, MISSION_DESTRUCTIBLE_OBJECTS, MISSION_USE_TECHNIQUE
from sr.const.traing_mission_const import MISSION_SALVAGE_RELIC, MISSION_DESTRUCTIBLE_OBJECTS, MISSION_USE_TECHNIQUE, \
MISSION_DAILY_MISSION, MISSION_TAKE_PHOTO, MISSION_SYNTHESIZE_CONSUMABLE
from sr.context import Context
from sr.operation import Operation, OperationSuccess, OperationOneRoundResult
from sr.operation.combine import StatusCombineOperationEdge, StatusCombineOperation
from sr.operation.combine import StatusCombineOperationEdge, StatusCombineOperation, StatusCombineOperationNode, \
StatusCombineOperationEdge2
from sr.operation.combine.destory_objects import DestroyObjects
from sr.operation.combine.dt_synthesize_consumable import DtSynthesizeConsumable
from sr.operation.combine.dt_take_photo import DtTakePhoto
from sr.operation.combine.dt_use_2_technique import Use2Technique
from sr.operation.combine.salvage_relic import SalvageRelic
from sr.operation.unit.guide import GUIDE_TAB_2
Expand Down Expand Up @@ -55,83 +59,67 @@ def get_record() -> DailyTrainingRecord:
return _daily_training_record


class DailyTrainingApp(Application):
class DailyTrainingApp(Application2):

run_record: DailyTrainingRecord

def __init__(self, ctx: Context):
edges: List[StatusCombineOperationEdge2] = []

open_menu = StatusCombineOperationNode(node_id='open_menu', op=OpenPhoneMenu(ctx)) # 打开菜单
click_guide = StatusCombineOperationNode(node_id='click_guide', op=ClickPhoneMenuItem(ctx, phone_menu_const.INTERASTRAL_GUIDE)) # 点击【指南】
edges.append(StatusCombineOperationEdge2(node_from=open_menu, node_to=click_guide))

choose_daily_training = StatusCombineOperationNode(node_id='choose_daily_training', op=ChooseGuideTab(ctx, GUIDE_TAB_2)) # 选择每日实训
edges.append(StatusCombineOperationEdge2(node_from=click_guide, node_to=choose_daily_training))

claim_score = StatusCombineOperationNode(node_id='claim_score', op=ClaimTrainingScore(ctx)) # 领取分数
edges.append(StatusCombineOperationEdge2(node_from=choose_daily_training, node_to=claim_score))

check_score = StatusCombineOperationNode(node_id='check_score', op=GetTrainingScore(ctx, score_callback=self._update_training_score)) # 检查目前点数
edges.append(StatusCombineOperationEdge2(node_from=claim_score, node_to=check_score))

final_claim_reward = StatusCombineOperationNode(node_id='final_claim_reward', op=ClaimTrainingReward(ctx)) # 领取奖励
edges.append(StatusCombineOperationEdge2(node_from=check_score, node_to=final_claim_reward, status='500')) # 满分退出

back_to = StatusCombineOperationNode(node_id='back_to', op=OpenPhoneMenu(ctx)) # 返回菜单
edges.append(StatusCombineOperationEdge2(node_from=final_claim_reward, node_to=back_to))

get_mission = StatusCombineOperationNode(node_id='get_mission', op=GetTrainingUnfinishedMission(ctx)) # 获取一个可执行的任务
edges.append(StatusCombineOperationEdge2(node_from=check_score, node_to=get_mission, ignore_status=True))

edges.append(StatusCombineOperationEdge2(node_from=get_mission, node_to=final_claim_reward, success=False, ignore_status=True)) # 没有可执行的任务

salvage_relic = StatusCombineOperationNode(node_id='salvage_relic', op=SalvageRelic(ctx)) # 遗器分解
edges.append(StatusCombineOperationEdge2(node_from=get_mission, node_to=salvage_relic, status=MISSION_SALVAGE_RELIC.id_cn))
edges.append(StatusCombineOperationEdge2(node_from=salvage_relic, node_to=back_to, success=False)) # 执行失败
edges.append(StatusCombineOperationEdge2(node_from=salvage_relic, node_to=open_menu)) # 执行成功 从头开始

destroy_objects = StatusCombineOperationNode(node_id='destroy_objects', op=DestroyObjects(ctx)) # 可破坏物
edges.append(StatusCombineOperationEdge2(node_from=get_mission, node_to=destroy_objects, status=MISSION_DESTRUCTIBLE_OBJECTS.id_cn))
edges.append(StatusCombineOperationEdge2(node_from=destroy_objects, node_to=final_claim_reward, success=False)) # 执行失败
edges.append(StatusCombineOperationEdge2(node_from=destroy_objects, node_to=open_menu)) # 执行成功 从头开始

use_2_technique = StatusCombineOperationNode(node_id='use_2_technique', op=Use2Technique(ctx)) # 施放秘技
edges.append(StatusCombineOperationEdge2(node_from=get_mission, node_to=use_2_technique, status=MISSION_USE_TECHNIQUE.id_cn))
edges.append(StatusCombineOperationEdge2(node_from=use_2_technique, node_to=final_claim_reward, success=False)) # 执行失败
edges.append(StatusCombineOperationEdge2(node_from=use_2_technique, node_to=open_menu)) # 执行成功 从头开始

take_photo = StatusCombineOperationNode(node_id='take_photo', op=DtTakePhoto(ctx)) # 拍照
edges.append(StatusCombineOperationEdge2(node_from=get_mission, node_to=take_photo, status=MISSION_TAKE_PHOTO.id_cn))
edges.append(StatusCombineOperationEdge2(node_from=take_photo, node_to=final_claim_reward, success=False)) # 执行失败
edges.append(StatusCombineOperationEdge2(node_from=take_photo, node_to=open_menu)) # 执行成功 从头开始

synthesize_consumable = StatusCombineOperationNode('合成消耗品', DtSynthesizeConsumable(ctx))
edges.append(StatusCombineOperationEdge2(node_from=get_mission, node_to=synthesize_consumable, status=MISSION_SYNTHESIZE_CONSUMABLE.id_cn))
edges.append(StatusCombineOperationEdge2(node_from=synthesize_consumable, node_to=final_claim_reward, success=False)) # 执行失败
edges.append(StatusCombineOperationEdge2(node_from=synthesize_consumable, node_to=open_menu)) # 执行成功 从头开始

super().__init__(ctx,
op_name='%s %s' % (gt('每日实训', 'ui'), gt('应用', 'ui')),
run_record=get_record())

self.phase: int = 0
self.op: Operation = OperationSuccess(ctx)

def _init_before_execute(self):
super()._init_before_execute()
self.phase = 0

ops = []
edges = []

open_menu = OpenPhoneMenu(self.ctx) # 打开菜单
ops.append(open_menu)

click_guide = ClickPhoneMenuItem(self.ctx, phone_menu_const.INTERASTRAL_GUIDE) # 点击【指南】
ops.append(click_guide)
edges.append(StatusCombineOperationEdge(open_menu, click_guide))

choose_daily_training = ChooseGuideTab(self.ctx, GUIDE_TAB_2) # 选择每日实训
ops.append(choose_daily_training)
edges.append(StatusCombineOperationEdge(click_guide, choose_daily_training))

claim_score = ClaimTrainingScore(self.ctx) # 领取分数
ops.append(claim_score)
edges.append(StatusCombineOperationEdge(choose_daily_training, claim_score))

check_score = GetTrainingScore(self.ctx, score_callback=self._update_training_score) # 检查目前点数
ops.append(check_score)
edges.append(StatusCombineOperationEdge(claim_score, check_score))

final_claim_reward = ClaimTrainingReward(self.ctx) # 领取奖励
ops.append(final_claim_reward)
edges.append(StatusCombineOperationEdge(check_score, final_claim_reward, status='500')) # 满分退出

back_to = OpenPhoneMenu(self.ctx) # 返回菜单
ops.append(back_to)
edges.append(StatusCombineOperationEdge(final_claim_reward, back_to))

get_mission = GetTrainingUnfinishedMission(self.ctx) # 获取一个可执行的任务
ops.append(get_mission)
edges.append(StatusCombineOperationEdge(check_score, get_mission, ignore_status=True))

salvage_relic = SalvageRelic(self.ctx) # 遗器分解
ops.append(salvage_relic)
edges.append(StatusCombineOperationEdge(get_mission, salvage_relic, status=MISSION_SALVAGE_RELIC.id_cn))
edges.append(StatusCombineOperationEdge(salvage_relic, back_to, success=False)) # 执行失败
edges.append(StatusCombineOperationEdge(salvage_relic, open_menu)) # 执行成功 从头开始

destroy_objects = DestroyObjects(self.ctx) # 可破坏物
ops.append(destroy_objects)
edges.append(StatusCombineOperationEdge(get_mission, destroy_objects, status=MISSION_DESTRUCTIBLE_OBJECTS.id_cn))
edges.append(StatusCombineOperationEdge(destroy_objects, final_claim_reward, success=False)) # 执行失败
edges.append(StatusCombineOperationEdge(destroy_objects, open_menu)) # 执行成功 从头开始

use_2_technique = Use2Technique(self.ctx) # 施放秘技
ops.append(use_2_technique)
edges.append(StatusCombineOperationEdge(get_mission, use_2_technique, status=MISSION_USE_TECHNIQUE.id_cn))
edges.append(StatusCombineOperationEdge(use_2_technique, final_claim_reward, success=False)) # 执行失败
edges.append(StatusCombineOperationEdge(use_2_technique, open_menu)) # 执行成功 从头开始

self.op = StatusCombineOperation(self.ctx, ops, edges, start_op=open_menu,
op_name='%s %s' % (gt('每日实训', 'ui'), gt('执行', 'ui')))

def _execute_one_round(self) -> OperationOneRoundResult:
op_result = self.op.execute()
if op_result.success:
return Operation.round_success(op_result.status)
else:
return Operation.round_retry(op_result.status)
run_record=get_record(),
edges=edges,
specified_start_node=open_menu)

def _update_training_score(self, score: int):
"""
Expand Down
Loading

0 comments on commit 318d726

Please sign in to comment.