440 lines
12 KiB
Python
440 lines
12 KiB
Python
from typing import Literal
|
|
|
|
from pydantic import BaseModel, model_validator
|
|
from pydantic_core import PydanticUndefined
|
|
|
|
|
|
class ConfModel(BaseModel):
|
|
@model_validator(mode="before")
|
|
@classmethod
|
|
def nested_defaults(cls, data):
|
|
for name, field in cls.model_fields.items():
|
|
if name not in data:
|
|
if field.default is PydanticUndefined:
|
|
data[name] = field.annotation()
|
|
else:
|
|
data[name] = field.default
|
|
return data
|
|
|
|
|
|
class CluePart(ConfModel):
|
|
class CreditFightConf(ConfModel):
|
|
direction: str = "Right"
|
|
"部署方向"
|
|
operator: str = "风笛"
|
|
"使用干员"
|
|
skill: int = 1
|
|
"技能"
|
|
squad: int = 1
|
|
"编队序号"
|
|
x: int = 5
|
|
"横坐标"
|
|
y: int = 3
|
|
"纵坐标"
|
|
|
|
maa_credit_fight: bool = True
|
|
"信用作战开关"
|
|
credit_fight: CreditFightConf
|
|
"信用作战设置"
|
|
enable_party: int = 1
|
|
"线索收集"
|
|
leifeng_mode: int = 1
|
|
"雷锋模式"
|
|
maa_mall_blacklist: str = "加急许可,碳,碳素,家具零件"
|
|
"黑名单"
|
|
maa_mall_buy: str = "招聘许可,技巧概要·卷2"
|
|
"优先购买"
|
|
maa_mall_ignore_blacklist_when_full: bool = False
|
|
"信用溢出时无视黑名单"
|
|
|
|
|
|
class EmailPart(ConfModel):
|
|
class CustomSMTPServerConf(ConfModel):
|
|
enable: bool = False
|
|
"启用自定义邮箱"
|
|
server: str = ""
|
|
"SMTP服务器"
|
|
encryption: str = "starttls"
|
|
"加密方式"
|
|
ssl_port: int = 587
|
|
"端口号"
|
|
|
|
mail_enable: int = 0
|
|
"邮件提醒"
|
|
account: str = ""
|
|
"邮箱用户名"
|
|
pass_code: str = ""
|
|
"邮箱密码"
|
|
recipient: list[str] = []
|
|
"收件人"
|
|
custom_smtp_server: CustomSMTPServerConf
|
|
"自定义邮箱"
|
|
mail_subject: str = "[Mower通知]"
|
|
"标题前缀"
|
|
notification_level: str = "INFO"
|
|
"邮件通知等级"
|
|
|
|
|
|
class ExtraPart(ConfModel):
|
|
class WebViewConf(ConfModel):
|
|
port: int = 58000
|
|
"端口号"
|
|
width: int = 1450
|
|
"窗口宽度"
|
|
height: int = 850
|
|
"窗口高度"
|
|
token: str = ""
|
|
"远程连接密钥"
|
|
scale: float = 1
|
|
"网页缩放"
|
|
tray: bool = True
|
|
"托盘图标"
|
|
|
|
class WaitingSceneConf(ConfModel):
|
|
CONNECTING: tuple[int, int] = (1000, 15)
|
|
UNKNOWN: tuple[int, int] = (0, 10)
|
|
UNKNOWN_WITH_NAVBAR: tuple[int, int] = (0, 5)
|
|
LOADING: tuple[int, int] = (3000, 60)
|
|
LOGIN_LOADING: tuple[int, int] = (3000, 30)
|
|
LOGIN_MAIN_NOENTRY: tuple[int, int] = (3000, 30)
|
|
OPERATOR_ONGOING: tuple[int, int] = (10000, 300)
|
|
|
|
start_automatically: bool = False
|
|
"启动后自动开始任务"
|
|
webview: WebViewConf
|
|
"GUI相关设置"
|
|
theme: Literal["light", "dark"] = "light"
|
|
"界面主题"
|
|
screenshot_interval: int = 500
|
|
"截图最短间隔(毫秒)"
|
|
screenshot: float = 24
|
|
"截图保留时长(小时)"
|
|
waiting_scene_v2: WaitingSceneConf
|
|
"等待时间"
|
|
|
|
|
|
class FightPart(ConfModel):
|
|
class ChooseConf(ConfModel):
|
|
add_low_trust_opers: bool = False
|
|
"补充低信赖干员"
|
|
|
|
class SupportConf(ConfModel):
|
|
elite: int = 2
|
|
"精英化"
|
|
level: int = 60
|
|
"等级"
|
|
refresh: int = 10
|
|
"最大刷新次数"
|
|
|
|
class WorkConf(ConfModel):
|
|
class WorkItem(ConfModel):
|
|
stage: str = ""
|
|
"关卡"
|
|
retry_times: int = 2
|
|
"重试次数"
|
|
|
|
squad: int = 0
|
|
"作战编队"
|
|
use_medicine: bool = True
|
|
"是否使用理智药"
|
|
enemy_breach_strategy: Literal["overlook", "give_up", "restart_game"] = (
|
|
"give_up"
|
|
)
|
|
"被敌人进入时采取的策略"
|
|
intelligent_select: bool = True
|
|
"智能选择"
|
|
works: list[WorkItem] = []
|
|
"自动作战列表"
|
|
|
|
work_enable: bool = False
|
|
"是否执行自动作战列表"
|
|
avatar_recog_pause: bool = False
|
|
"作战中识别干员时暂停"
|
|
first_swipe_duration: int = 400
|
|
"部署干员第一段滑动持续时间"
|
|
second_swipe_duration: int = 200
|
|
"部署干员第二段滑动(滑方向)持续时间"
|
|
choose: ChooseConf
|
|
"自动选干员设置"
|
|
support: SupportConf
|
|
"借助战要求"
|
|
work: WorkConf
|
|
"自动作战列表设置"
|
|
|
|
|
|
class LongTaskPart(ConfModel):
|
|
class RogueConf(ConfModel):
|
|
squad: str = ""
|
|
"分队"
|
|
roles: str = ""
|
|
"职业"
|
|
core_char: str = ""
|
|
"干员"
|
|
use_support: bool = False
|
|
"开局干员使用助战"
|
|
use_nonfriend_support: bool = False
|
|
"开局干员使用非好友助战"
|
|
mode: int = 1
|
|
"策略"
|
|
refresh_trader_with_dice: bool = False
|
|
"刷新商店(指路鳞)"
|
|
expected_collapsal_paradigms: list[str] = [
|
|
"目空一些",
|
|
"睁眼瞎",
|
|
"图像损坏",
|
|
"一抹黑",
|
|
]
|
|
"需要刷的坍缩范式"
|
|
|
|
class ReclamationAlgorithmConf(ConfModel):
|
|
timeout: int = 30
|
|
"生息演算和隐秘战线的超时时间"
|
|
|
|
class SecretFrontConf(ConfModel):
|
|
target: str = "结局A"
|
|
"隐秘战线结局"
|
|
|
|
class SSSConf(ConfModel):
|
|
choose_agent: bool = True
|
|
"自动编队"
|
|
mode: str = "normal"
|
|
"难度:正常为normal,应急为ex"
|
|
finish_while_full: bool = True
|
|
"模组刷满时直接结束"
|
|
|
|
maa_rg_enable: int = 0
|
|
"大型任务"
|
|
maa_long_task_type: str = "rogue"
|
|
"大型任务类型"
|
|
maa_rg_sleep_max: str = "0:00"
|
|
"开始时间"
|
|
maa_rg_sleep_min: str = "0:00"
|
|
"停止时间"
|
|
maa_rg_theme: str = "Mizuki"
|
|
"肉鸽主题"
|
|
rogue: RogueConf
|
|
"肉鸽设置"
|
|
reclamation_algorithm: ReclamationAlgorithmConf
|
|
"生息演算"
|
|
secret_front: SecretFrontConf
|
|
"隐秘战线"
|
|
sss: SSSConf
|
|
"保全派驻"
|
|
|
|
|
|
class MaaPart(ConfModel):
|
|
maa_path: str = "D:\\MAA-v4.13.0-win-x64"
|
|
maa_conn_preset: str = "General"
|
|
maa_touch_option: str = "maatouch"
|
|
|
|
|
|
class RecruitPart(ConfModel):
|
|
recruit_enable: bool = True
|
|
"公招开关"
|
|
recruit_robot: bool = True
|
|
"保留支援机械标签"
|
|
recruitment_permit: int = 30
|
|
"三星招募阈值"
|
|
recruit_gap: float = 9
|
|
"启动间隔"
|
|
recruit_auto_5: int = 1
|
|
"五星招募策略,1自动,2手动"
|
|
recruit_auto_only5: bool = False
|
|
"五星词条组合唯一时自动选择"
|
|
|
|
|
|
class RegularTaskPart(ConfModel):
|
|
class WeeklyConf(BaseModel):
|
|
general: list[str]
|
|
"常驻关卡"
|
|
custom: list[str]
|
|
"自定义关卡"
|
|
|
|
class SignInConf(ConfModel):
|
|
enable: bool = True
|
|
"签到活动开关"
|
|
|
|
check_mail_enable: bool = True
|
|
"领取邮件奖励"
|
|
delete_read_mail: bool = False
|
|
"删除已读邮件"
|
|
maa_enable: bool = True
|
|
"日常任务"
|
|
maa_gap: float = 3
|
|
"日常任务间隔"
|
|
maa_expiring_medicine: bool = True
|
|
"自动使用将要过期(约3天)的理智药"
|
|
exipring_medicine_on_weekend: bool = False
|
|
"仅在周末使用将要过期的理智药"
|
|
weekly_plan: list[WeeklyConf] = [{"general": [], "custom": []}] * 7
|
|
"刷理智周计划,周一开始"
|
|
custom_stages: list[str | None] = [None] * 3
|
|
"刷理智自定义关卡"
|
|
maa_depot_enable: bool = False
|
|
"仓库物品混合读取"
|
|
visit_friend: bool = True
|
|
"访问好友"
|
|
report_enable: bool = True
|
|
"读取基报"
|
|
switch_assistants: bool = True
|
|
"切换高信赖基建副手"
|
|
sign_in: SignInConf
|
|
"签到活动"
|
|
trade_token: bool = False
|
|
"兑换溢出信物"
|
|
|
|
|
|
class RIICPart(ConfModel):
|
|
class RunOrderGrandetModeConf(ConfModel):
|
|
enable: bool = True
|
|
"葛朗台跑单开关"
|
|
buffer_time: int = 15
|
|
"缓冲时间"
|
|
back_to_index: bool = False
|
|
"跑单前返回基建首页"
|
|
|
|
drone_count_limit: int = 100
|
|
"无人机使用阈值"
|
|
drone_room: str = ""
|
|
"无人机使用房间"
|
|
drone_interval: float = 3
|
|
"无人机加速间隔"
|
|
free_blacklist: str = ""
|
|
"宿舍黑名单"
|
|
reload_room: str = ""
|
|
"搓玉补货房间"
|
|
run_order_delay: float = 3
|
|
"跑单前置延时"
|
|
resting_threshold: float = 0.65
|
|
"心情阈值"
|
|
run_order_grandet_mode: RunOrderGrandetModeConf
|
|
"葛朗台跑单"
|
|
free_room: bool = False
|
|
"宿舍不养闲人模式"
|
|
trust_limit: int = 200
|
|
"信赖值阈值"
|
|
|
|
|
|
class EmulatorPart(ConfModel):
|
|
class EmulatorConf(ConfModel):
|
|
name: str = "MuMu12"
|
|
"名称"
|
|
index: str | int = "0"
|
|
"多开编号"
|
|
emulator_folder: str = ""
|
|
"文件夹"
|
|
wait_time: int = 30
|
|
"启动时间"
|
|
hotkey: str = ""
|
|
"老板键"
|
|
|
|
class CustomScreenshotConf(ConfModel):
|
|
command: str = "adb -s 127.0.0.1:5555 shell screencap -p 2>/dev/null"
|
|
"截图命令"
|
|
|
|
class TapToLaunchGameConf(ConfModel):
|
|
enable: bool = False
|
|
"点击屏幕启动游戏"
|
|
x: int = 0
|
|
"横坐标"
|
|
y: int = 0
|
|
"纵坐标"
|
|
|
|
class DroidCastConf(ConfModel):
|
|
rotate: bool = False
|
|
"将截图旋转180度"
|
|
|
|
adb: str = "127.0.0.1:16384"
|
|
"ADB连接地址"
|
|
emulator: EmulatorConf
|
|
"模拟器"
|
|
maa_adb_path: str = "D:\\Program Files\\Netease\\MuMu Player 12\\shell\\adb.exe"
|
|
"ADB路径"
|
|
package_type: int = 1
|
|
"游戏服务器"
|
|
droidcast: DroidCastConf
|
|
"DroidCast截图设置"
|
|
custom_screenshot: CustomScreenshotConf
|
|
"自定义截图"
|
|
tap_to_launch_game: TapToLaunchGameConf
|
|
"点击屏幕启动游戏"
|
|
strategy_when_idle: Literal[
|
|
"do_nothing", "switch_to_home", "exit_game", "close_emulator"
|
|
] = "switch_to_home"
|
|
fix_mumu12_adb_disconnect: bool = False
|
|
"关闭MuMu模拟器12时结束adb进程"
|
|
screencap_strategy: Literal["adb", "droidcast", "mumuipc", "diy"] = "droidcast"
|
|
"截图方案"
|
|
control_strategy: Literal["scrcpy"] = "scrcpy"
|
|
"触控方案"
|
|
app_control_strategy: Literal["adb"] = "adb"
|
|
"应用控制方案"
|
|
|
|
|
|
class SKLandPart(ConfModel):
|
|
class SKLandAccount(BaseModel):
|
|
account: str = ""
|
|
"账号"
|
|
password: str = ""
|
|
"密码"
|
|
cultivate_select: bool = True
|
|
"服务器"
|
|
isCheck: bool = True
|
|
"签到"
|
|
sign_in_bilibili: bool = False
|
|
"官服签到"
|
|
sign_in_official: bool = False
|
|
"B服签到"
|
|
|
|
skland_enable: bool = False
|
|
"森空岛签到"
|
|
skland_info: list[SKLandAccount] = []
|
|
"森空岛账号"
|
|
|
|
|
|
class Conf(
|
|
CluePart,
|
|
EmailPart,
|
|
ExtraPart,
|
|
FightPart,
|
|
LongTaskPart,
|
|
MaaPart,
|
|
RecruitPart,
|
|
RegularTaskPart,
|
|
RIICPart,
|
|
EmulatorPart,
|
|
SKLandPart,
|
|
):
|
|
@property
|
|
def APPNAME(self):
|
|
return (
|
|
"com.hypergryph.arknights"
|
|
if self.package_type == 1
|
|
else "com.hypergryph.arknights.bilibili"
|
|
)
|
|
|
|
@property
|
|
def RG(self):
|
|
return self.maa_rg_enable == 1 and self.maa_long_task_type == "rogue"
|
|
|
|
@property
|
|
def SSS(self):
|
|
return self.maa_rg_enable == 1 and self.maa_long_task_type == "sss"
|
|
|
|
@property
|
|
def RA(self):
|
|
return self.maa_rg_enable == 1 and self.maa_long_task_type == "ra"
|
|
|
|
@property
|
|
def SF(self):
|
|
return self.maa_rg_enable == 1 and self.maa_long_task_type == "sf"
|
|
|
|
@property
|
|
def run_order_buffer_time(self):
|
|
"""
|
|
> 0 葛朗台跑单的缓冲时间
|
|
<= 0 无人机跑单
|
|
"""
|
|
if self.run_order_grandet_mode.enable:
|
|
return self.run_order_grandet_mode.buffer_time
|
|
return -1
|