Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -74,11 +74,9 @@ zsim = "zsim.run:main"
[dependency-groups]
dev = [
"ipykernel>=6.29.5",
"openpyxl>=3.1.5",
"pyinstaller>=6.13.0",
"pytest>=8.3.5",
"viztracer>=1.0.3",
"cx-freeze>=6.15.0",
"objprint>=0.3.0",
"pytest-cov>=5.0.0",
"pytest-asyncio>=1.1.0",
Expand Down
1 change: 0 additions & 1 deletion tests/api/test_apl_database.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
"""

import os
import json
import pytest
import tempfile
import shutil
Expand Down
162 changes: 0 additions & 162 deletions uv.lock

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion zsim/api_src/models/apl.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
定义APL API请求和响应的数据模型
"""

from typing import List, Dict, Any, Optional, TypeVar, Generic
from typing import List, Optional, TypeVar, Generic
from pydantic import BaseModel, Field


Expand Down
14 changes: 6 additions & 8 deletions zsim/api_src/services/database/apl_db.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,15 @@
负责APL相关数据的数据库操作
"""

import asyncio
import os
import toml
import uuid
from typing import Any, Dict, List, Optional

import aiosqlite
import asyncio
from typing import Dict, List, Any, Optional
from zsim.define import DEFAULT_APL_DIR, COSTOM_APL_DIR, SQLITE_PATH
import toml

from zsim.define import COSTOM_APL_DIR, DEFAULT_APL_DIR, SQLITE_PATH


class APLDatabase:
Expand Down Expand Up @@ -240,11 +242,9 @@ def get_apl_file_content(self, file_id: str) -> Optional[Dict[str, Any]]:
# 解析file_id获取source和相对路径
try:
if file_id.startswith("default_"):
source = "default"
rel_path = file_id[len("default_") :]
base_dir = DEFAULT_APL_DIR
elif file_id.startswith("custom_"):
source = "custom"
rel_path = file_id[len("custom_") :]
base_dir = COSTOM_APL_DIR
else:
Expand Down Expand Up @@ -299,7 +299,6 @@ def update_apl_file(self, file_id: str, content: str) -> bool:
# 不允许更新默认文件
return False
elif file_id.startswith("custom_"):
source = "custom"
rel_path = file_id[len("custom_") :]
base_dir = COSTOM_APL_DIR
else:
Expand All @@ -326,7 +325,6 @@ def delete_apl_file(self, file_id: str) -> bool:
# 不允许删除默认文件
return False
elif file_id.startswith("custom_"):
source = "custom"
rel_path = file_id[len("custom_") :]
base_dir = COSTOM_APL_DIR
else:
Expand Down
3 changes: 1 addition & 2 deletions zsim/api_src/services/database/character_db.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import json
import aiosqlite
from typing import Any, List, Optional
from typing import Any, List
from zsim.define import SQLITE_PATH
from zsim.models.character.character_config import CharacterConfig
from datetime import datetime
Expand Down
2 changes: 1 addition & 1 deletion zsim/api_src/services/database/enemy_db.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import json
import aiosqlite
from typing import Any, List, Optional
from typing import Any, List
from zsim.define import SQLITE_PATH
from zsim.models.enemy.enemy_config import EnemyConfig
from datetime import datetime
Expand Down
6 changes: 2 additions & 4 deletions zsim/define.py
Original file line number Diff line number Diff line change
Expand Up @@ -96,17 +96,15 @@ def update_json_config(template: dict, user: dict) -> bool:
"Taction": 30, # 角色弹刀与闪避动作的持续时间,不开放给用户更改。
"Tbase": 273, # 人类反应时间大数据中位数,单位ms,不可更改!
"PlayerLevel": _config["apl_mode"]["player_level"], # 玩家水平系数,由用户自己填写。
"PerfectPlayer": _config["apl_mode"].get("perfect_player", True), # 是否是完美玩家(默认是)
"PerfectPlayer": _config["apl_mode"].get("perfect_player", True), # 是否是完美玩家(默认是)
"theta": 90, # θ,人类胜利最小反应时间(神经传导极限),为90ms,不可更改!
"c": 0.5, # 波动调节系数,暂取0.5,不开放给用户更改。
"delta": 30, # 玩家水平系数所导致的中位数波动单位,暂时取30ms,不开放给用户更改。
}
PARRY_BASE_PARAMETERS: dict[str, int | float] = {
"ChainParryActionTimeCost": 10, # 连续招架动作的时间消耗
}
CHAR_PARRY_STRATEGY_MAP: dict = {
1411: "1411_Assault_Aid_A"
}
CHAR_PARRY_STRATEGY_MAP: dict = {1411: "1411_Assault_Aid_A"}

# debug参数,用于检查APL在窗口期间的想法
APL_THOUGHT_CHECK: bool = _config["apl_mode"].get("apl_thought_check", False)
Expand Down
4 changes: 3 additions & 1 deletion zsim/lib_webui/process_dmg_result.py
Original file line number Diff line number Diff line change
Expand Up @@ -596,7 +596,9 @@ def prepare_dmg_data_and_cache(
char_chart_data = prepare_char_chart_data(uuid_df)
# st.write(char_chart_data)
calculate_and_save_anomaly_attribution(
int(rid) if isinstance(rid, int) else rid, char_chart_data["char_dmg_df"], char_chart_data["char_element_df"]
int(rid) if isinstance(rid, int) else rid,
char_chart_data["char_dmg_df"],
char_chart_data["char_element_df"],
)
return {
"dmg_result_df": dmg_result_df,
Expand Down
12 changes: 6 additions & 6 deletions zsim/models/event_enums.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,10 @@ class PostInitObjectType(Enum):

class ListenerBroadcastSignal(Enum):
"""监听器广播函数所涉及到的更新信号"""
SWITCHING_IN = "switching_in_event" # 角色切入前场
ENTER_BATTLE = "enter_battle_event" # 角色进入战斗
ANOMALY = "anomaly_event" # 属性异常事件
STUN = "stun_event" # 失衡事件
PARRY = "parry_event" # 招架事件
BLOCK = "block_event" # 格挡事件(其他具备格挡功能的技能响应进攻事件)

SWITCHING_IN = "switching_in_event" # 角色切入前场
ENTER_BATTLE = "enter_battle_event" # 角色进入战斗
ANOMALY = "anomaly_event" # 属性异常事件
STUN = "stun_event" # 失衡事件
PARRY = "parry_event" # 招架事件
BLOCK = "block_event" # 格挡事件(其他具备格挡功能的技能响应进攻事件)
18 changes: 9 additions & 9 deletions zsim/page_character_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ def page_character_config():
if "name_box" in saved_char_config:
default_chars = saved_char_config["name_box"]
from zsim.lib_webui.constants import (
char_options,
equip_set2_options,
equip_set4_options,
weapon_options,
Expand Down Expand Up @@ -97,20 +96,21 @@ def page_character_config():
]
else:
filtered_weapon_options = list(weapon_options)

# 根据稀有度筛选
filtered_weapon_options = [
w for w in filtered_weapon_options
if (show_rarity_s and weapon_rarity_map.get(w) == "S") or
(show_rarity_a and weapon_rarity_map.get(w) == "A") or
(show_rarity_b and weapon_rarity_map.get(w) == "B")
w
for w in filtered_weapon_options
if (show_rarity_s and weapon_rarity_map.get(w) == "S")
or (show_rarity_a and weapon_rarity_map.get(w) == "A")
or (show_rarity_b and weapon_rarity_map.get(w) == "B")
]
rarity_order = {"S": 0, "A": 1, "B": 2}
filtered_weapon_options = sorted(
filtered_weapon_options,
key=lambda w: (rarity_order.get(weapon_rarity_map.get(w), 3), w)
key=lambda w: (rarity_order.get(weapon_rarity_map.get(w), 3), w),
)

if name in saved_char_config:
current_weapon = saved_char_config[name].get("weapon")
else:
Expand All @@ -135,7 +135,7 @@ def page_character_config():
f"{' ' + weapon_char_map.get(x) if weapon_char_map.get(x) else ''}) {x}"
),
)

col_rarity = st.columns(4)
with col_rarity[0]:
show_adapted_weapon = st.checkbox(
Expand Down
3 changes: 1 addition & 2 deletions zsim/sim_progress/Buff/Buff0Manager/Buff0ManagerClass.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@

if TYPE_CHECKING:
from zsim.simulator.simulator_class import Simulator
from zsim.sim_progress.Character.character import Character


class Buff0Manager:
Expand All @@ -27,7 +26,7 @@ def __init__(
weapon_dict: dict[str, list],
cinema_dict: dict,
char_obj_dict: dict | None,
sim_instance: "Simulator",
sim_instance: "Simulator | None",
):
# 加载文件
self.EXIST_FILE = pd.read_csv(EXIST_FILE_PATH, index_col="BuffName")
Expand Down
5 changes: 2 additions & 3 deletions zsim/sim_progress/Buff/BuffXLogic/MetanukiMorphosisAPBonus.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from .. import Buff, JudgeTools, check_preparation
from typing import TYPE_CHECKING

if TYPE_CHECKING:
from zsim.sim_progress.Preload import SkillNode

Expand All @@ -20,9 +21,7 @@ def __init__(self, buff_instance):
self.record: MetanukiMorphosisAPBonusRecord | None = None

def get_prepared(self, **kwargs):
return check_preparation(
buff_instance=self.buff_instance, buff_0=self.buff_0, **kwargs
)
return check_preparation(buff_instance=self.buff_instance, buff_0=self.buff_0, **kwargs)

def check_record_module(self):
if self.equipper is None:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

from .. import Buff, JudgeTools, check_preparation
from typing import TYPE_CHECKING

if TYPE_CHECKING:
from zsim.sim_progress.Preload import SkillNode

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
from .. import Buff, JudgeTools, check_preparation
from ....define import YUZUHA_REPORT


class YuzuhaAdditionalAbilityAnomalyBuildupBonusRecord:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,4 +55,6 @@ def special_hit_logic(self, **kwargs):
self.buff_instance.update_to_buff_0(buff_0=self.buff_0)
if YUZUHA_REPORT:
self.buff_instance.sim_instance.schedule_data.change_process_state()
print(f"【柚叶组队被动】检测到【狸之愿】激活,当前柚叶的异常掌控为{am:.2f}点,共计提供{count * 0.2:.2f}%的异常积蓄效率以及属性异常/紊乱增伤")
print(
f"【柚叶组队被动】检测到【狸之愿】激活,当前柚叶的异常掌控为{am:.2f}点,共计提供{count * 0.2:.2f}%的异常积蓄效率以及属性异常/紊乱增伤"
)
10 changes: 3 additions & 7 deletions zsim/sim_progress/Buff/BuffXLogic/YuzuhaCinem1EleResReduce.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from .. import Buff, JudgeTools, check_preparation
from typing import TYPE_CHECKING

if TYPE_CHECKING:
from ...Preload import SkillNode

Expand All @@ -20,9 +21,7 @@ def __init__(self, buff_instance):
self.xjudge = self.special_judge_logic

def get_prepared(self, **kwargs):
return check_preparation(
buff_instance=self.buff_instance, buff_0=self.buff_0, **kwargs
)
return check_preparation(buff_instance=self.buff_instance, buff_0=self.buff_0, **kwargs)

def check_record_module(self):
if self.buff_0 is None:
Expand All @@ -36,9 +35,7 @@ def check_record_module(self):
def special_judge_logic(self, **kwargs):
"""只有两种强化E和大招的重攻击才能触发甜蜜惊吓效果"""
self.check_record_module()
self.get_prepared(
char_CID=1411, enemy=1
)
self.get_prepared(char_CID=1411, enemy=1)
skill_node: "SkillNode" = kwargs.get("skill_node")
if skill_node is None:
return False
Expand All @@ -48,4 +45,3 @@ def special_judge_logic(self, **kwargs):
return False
else:
return True

15 changes: 8 additions & 7 deletions zsim/sim_progress/Buff/BuffXLogic/YuzuhaCinema2Trigger.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from .. import Buff, JudgeTools, check_preparation
from zsim.define import YUZUHA_REPORT
from zsim.define import YUZUHA_REPORT
from typing import TYPE_CHECKING

if TYPE_CHECKING:
from zsim.sim_progress.Preload import SkillNode

Expand All @@ -25,9 +26,7 @@ def __init__(self, buff_instance):
self.record: YuzuhaCinema2TriggerRecord | None = None

def get_prepared(self, **kwargs):
return check_preparation(
buff_instance=self.buff_instance, buff_0=self.buff_0, **kwargs
)
return check_preparation(buff_instance=self.buff_instance, buff_0=self.buff_0, **kwargs)

def check_record_module(self):
if self.buff_0 is None:
Expand All @@ -42,7 +41,7 @@ def special_judge_logic(self, **kwargs):
self.check_record_module()
self.get_prepared(char_CID=1411, enemy=1)
if self.record.skill_node_be_changed is not None:
raise ValueError(f"【浮波柚叶2画触发器】存在尚未处理的更新信号!!")
raise ValueError("【浮波柚叶2画触发器】存在尚未处理的更新信号!!")
if self.record.enemy.dynamic.stun:
return False
skill_node: "SkillNode" = kwargs.get("skill_node")
Expand Down Expand Up @@ -73,11 +72,13 @@ def special_hit_logic(self, **kwargs):
self.check_record_module()
self.get_prepared(char_CID=1411)
if self.record.skill_node_be_changed is None:
raise ValueError(f"【浮波柚叶2画触发器】未发现更新信号!!")
raise ValueError("【浮波柚叶2画触发器】未发现更新信号!!")
skill_node: "SkillNode" = self.record.skill_node_be_changed
skill_node.force_qte_trigger = True
if YUZUHA_REPORT:
self.buff_instance.sim_instance.schedule_data.change_process_state()
print(f"【柚叶2画】检测到{skill_node.skill_tag}的重攻击即将命中非失衡敌人!修改参数使其能够触发QTE!")
print(
f"【柚叶2画】检测到{skill_node.skill_tag}的重攻击即将命中非失衡敌人!修改参数使其能够触发QTE!"
)
self.record.skill_node_be_changed = None
self.record.last_update_tick = self.buff_instance.sim_instance.tick
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from .. import Buff, JudgeTools, check_preparation
from zsim.define import YUZUHA_REPORT
from typing import TYPE_CHECKING

if TYPE_CHECKING:
from zsim.sim_progress.Preload import SkillNode
from zsim.sim_progress.data_struct.QuickAssistSystem import QuickAssistSystem
Expand All @@ -9,7 +10,11 @@
class YuzuhaCinema4QuickAssistTriggerRecord:
def __init__(self):
self.char = None
self.allowed_skill_tag_list = ["1411_Assault_Aid", "1411_Assault_Aid_A", "1411_Assault_Aid_B"]
self.allowed_skill_tag_list = [
"1411_Assault_Aid",
"1411_Assault_Aid_A",
"1411_Assault_Aid_B",
]
self.trigger_skill_node = None


Expand All @@ -23,9 +28,7 @@ def __init__(self, buff_instance):
self.record: YuzuhaCinema4QuickAssistTriggerRecord | None = None

def get_prepared(self, **kwargs):
return check_preparation(
buff_instance=self.buff_instance, buff_0=self.buff_0, **kwargs
)
return check_preparation(buff_instance=self.buff_instance, buff_0=self.buff_0, **kwargs)

def check_record_module(self):
if self.buff_0 is None:
Expand All @@ -41,7 +44,7 @@ def special_judge_logic(self, **kwargs):
self.check_record_module()
self.get_prepared(char_CID=1411)
if self.record.trigger_skill_node is not None:
raise ValueError(f"【柚叶4画触发器】存在尚未处理的快支触发事件!")
raise ValueError("【柚叶4画触发器】存在尚未处理的快支触发事件!")
skill_node: "SkillNode" = kwargs.get("skill_node")
if skill_node is None:
return False
Expand All @@ -59,8 +62,14 @@ def special_hit_logic(self, **kwargs):
sim_instance = self.buff_instance.sim_instance
QAS: "QuickAssistSystem" = sim_instance.preload.preload_data.quick_assist_system
target_char_obj = sim_instance.char_data.find_next_char_obj(char_now=1411, direction=1)
QAS.force_active_quick_assist(tick_now=sim_instance.tick, skill_node=self.record.trigger_skill_node, char_name=target_char_obj.NAME)
QAS.force_active_quick_assist(
tick_now=sim_instance.tick,
skill_node=self.record.trigger_skill_node,
char_name=target_char_obj.NAME,
)
if YUZUHA_REPORT:
sim_instance.schedule_data.change_process_state()
print(f"【柚叶4画】技能 {self.record.trigger_skill_node.skill_tag} 最后一击命中,并且成功激活了 {target_char_obj.NAME} 的快速支援!")
print(
f"【柚叶4画】技能 {self.record.trigger_skill_node.skill_tag} 最后一击命中,并且成功激活了 {target_char_obj.NAME} 的快速支援!"
)
self.record.trigger_skill_node = None
Loading