From 775d830ec3408938c86e913cb0cf7fc80715ccb3 Mon Sep 17 00:00:00 2001 From: bridge Date: Sat, 3 Jan 2026 23:25:38 +0800 Subject: [PATCH] add cast --- src/classes/action/__init__.py | 3 + src/classes/action/cast.py | 157 ++++++++++++++++++++++++++++++ src/classes/effects.py | 28 ++++++ src/classes/fortune.py | 97 ++++++------------ src/classes/kill_and_grab.py | 54 +++------- src/classes/single_choice.py | 131 ++++++++++++++++++++----- src/utils/effect_desc.py | 1 + static/config.yml | 5 + static/game_configs/auxiliary.csv | 4 +- static/game_configs/persona.csv | 9 +- static/game_configs/sect.csv | 4 +- static/game_configs/technique.csv | 4 +- 12 files changed, 355 insertions(+), 142 deletions(-) create mode 100644 src/classes/action/cast.py diff --git a/src/classes/action/__init__.py b/src/classes/action/__init__.py index 6dfa348..a3e6fe4 100644 --- a/src/classes/action/__init__.py +++ b/src/classes/action/__init__.py @@ -36,6 +36,7 @@ from .nurture_weapon import NurtureWeapon from .switch_weapon import SwitchWeapon from .assassinate import Assassinate from .move_to_direction import MoveToDirection +from .cast import Cast # 注册到 ActionRegistry(标注是否为实际可执行动作) register_action(actual=False)(Action) @@ -68,6 +69,7 @@ register_action(actual=True)(NurtureWeapon) register_action(actual=True)(SwitchWeapon) register_action(actual=True)(Assassinate) register_action(actual=True)(MoveToDirection) +register_action(actual=True)(Cast) # Talk 已移动到 mutual_action 模块,在那里注册 __all__ = [ @@ -103,6 +105,7 @@ __all__ = [ "SwitchWeapon", "Assassinate", "MoveToDirection", + "Cast", # Talk 已移动到 mutual_action 模块 # Occupy 已移动到 mutual_action 模块 ] diff --git a/src/classes/action/cast.py b/src/classes/action/cast.py new file mode 100644 index 0000000..4b7b124 --- /dev/null +++ b/src/classes/action/cast.py @@ -0,0 +1,157 @@ +from __future__ import annotations + +import random +from typing import Optional, TYPE_CHECKING, List + +from src.classes.action import TimedAction +from src.classes.cultivation import Realm +from src.classes.event import Event +from src.classes.item import Item +from src.classes.weapon import get_random_weapon_by_realm +from src.classes.auxiliary import get_random_auxiliary_by_realm +from src.classes.single_choice import handle_item_exchange +from src.utils.config import CONFIG + +if TYPE_CHECKING: + from src.classes.avatar import Avatar + +class Cast(TimedAction): + """ + 铸造动作:消耗同阶材料,尝试打造同阶宝物(兵器或辅助装备)。 + 持续时间:3个月 + """ + ACTION_NAME = "铸造" + EMOJI = "🔥" + DESC = "消耗材料尝试铸造法宝" + DOABLES_REQUIREMENTS = f"拥有{getattr(CONFIG.action.cast, 'cost', 10)}个同阶材料" + PARAMS = {"target_realm": "目标境界名称('练气'、'筑基'、'金丹'、'元婴')"} + IS_MAJOR = False + + duration_months = 3 + + def __init__(self, avatar: Avatar, world): + super().__init__(avatar, world) + self.target_realm: Optional[Realm] = None + + def _get_cost(self) -> int: + # 从配置读取消耗数量,默认为10 + return getattr(CONFIG.action.cast, "cost", 10) + + def _count_materials(self, realm: Realm) -> int: + """ + 统计符合条件的材料数量。 + 注意:仅统计 Item 类的直接实例,不统计 Weapon/Auxiliary 等子类(它们也是 Item,但通常不作为铸造原材料)。 + """ + count = 0 + for item, qty in self.avatar.items.items(): + # 这里使用 type(item) is Item 来严格限制必须是基础材料 + # 如果项目里有其他继承自 Item 的材料类,可能需要放宽这个限制 + if type(item).__name__ == "Item" and item.realm == realm: + count += qty + return count + + def can_start(self, target_realm: str = "") -> tuple[bool, str]: + if not target_realm: + return False, "未指定目标境界" + + try: + realm = Realm(target_realm) + except ValueError: + return False, f"无效的境界: {target_realm}" + + cost = self._get_cost() + count = self._count_materials(realm) + + if count < cost: + return False, f"材料不足,需要 {cost} 个{target_realm}阶材料,当前拥有 {count} 个" + + return True, "" + + def start(self, target_realm: str = "") -> Event: + self.target_realm = Realm(target_realm) + cost = self._get_cost() + + # 扣除材料逻辑 + to_deduct = cost + items_to_modify = [] + + # 再次遍历寻找材料进行扣除 + for item, qty in self.avatar.items.items(): + if to_deduct <= 0: + break + if type(item).__name__ == "Item" and item.realm == self.target_realm: + take = min(qty, to_deduct) + items_to_modify.append((item, take)) + to_deduct -= take + + for item, take in items_to_modify: + self.avatar.remove_item(item, take) + + return Event( + self.world.month_stamp, + f"{self.avatar.name} 开始闭关铸造{target_realm}阶法宝,投入了大量材料。", + related_avatars=[self.avatar.id] + ) + + def _execute(self) -> None: + # 持续过程中无特殊逻辑 + pass + + async def finish(self) -> list[Event]: + if self.target_realm is None: + return [] + + # 1. 计算成功率 + base_rate = float(getattr(CONFIG.action.cast, "base_success_rate", 0.3)) + extra_rate = float(self.avatar.effects.get("extra_cast_success_rate", 0.0)) + success_rate = base_rate + extra_rate + + events = [] + + # 2. 判定结果 + if random.random() > success_rate: + # 失败 + fail_event = Event( + self.world.month_stamp, + f"{self.avatar.name} 铸造{self.target_realm.value}阶法宝失败,所有材料化为灰烬。", + related_avatars=[self.avatar.id], + is_major=False + ) + events.append(fail_event) + return events + + # 3. 成功:生成物品 + # 50% 兵器,50% 辅助装备 + is_weapon = random.random() < 0.5 + new_item = None + item_type = "" + item_label = "" + + if is_weapon: + new_item = get_random_weapon_by_realm(self.target_realm) + item_type = "weapon" + item_label = "兵器" + else: + new_item = get_random_auxiliary_by_realm(self.target_realm) + item_type = "auxiliary" + item_label = "辅助装备" + + # 4. 决策:保留还是卖出 + base_desc = f"铸造成功!获得了{self.target_realm.value}{item_label}『{new_item.name}』。" + + _, result_text = await handle_item_exchange( + avatar=self.avatar, + new_item=new_item, + item_type=item_type, + context_intro=base_desc, + can_sell_new=True + ) + + events.append(Event( + self.world.month_stamp, + result_text, + related_avatars=[self.avatar.id], + is_major=True + )) + + return events diff --git a/src/classes/effects.py b/src/classes/effects.py index dd01b90..9c68e0c 100644 --- a/src/classes/effects.py +++ b/src/classes/effects.py @@ -194,6 +194,31 @@ EXTRA_FORTUNE_PROBABILITY = "extra_fortune_probability" - 极高: 0.01 (1%,不少了) """ +EXTRA_MISFORTUNE_PROBABILITY = "extra_misfortune_probability" +""" +额外霉运概率 +类型: float +结算: src/classes/misfortune.py +数值参考: + - 基础概率通常极低 (<0.01) + - 微量: 0.001 (0.1%,有) + - 中量: 0.002~0.005 (高) + - 极高: 0.01 (1%,不少了) +""" + +# --- 铸造相关 --- +EXTRA_CAST_SUCCESS_RATE = "extra_cast_success_rate" +""" +额外铸造成功率 +类型: float +结算: src/classes/action/cast.py +说明: 铸造(Cast)动作的成功率加成。 +数值参考: + - 微量: 0.05 (+5%) + - 中量: 0.1 (+10%) + - 大量: 0.2+ (+20%) +""" + # --- 兵器相关 --- EXTRA_WEAPON_PROFICIENCY_GAIN = "extra_weapon_proficiency_gain" """ @@ -391,6 +416,9 @@ ALL_EFFECTS = [ "extra_fortune_probability", # float - 额外奇遇概率 "extra_misfortune_probability", # float - 额外霉运概率 + # 铸造相关 + "extra_cast_success_rate", # float - 额外铸造成功率 + # 兵器相关 "extra_weapon_proficiency_gain", # float - 额外兵器熟练度增长倍率 "extra_weapon_upgrade_chance", # float - 额外兵器升华概率 diff --git a/src/classes/fortune.py b/src/classes/fortune.py index 9edb1fb..a324b50 100644 --- a/src/classes/fortune.py +++ b/src/classes/fortune.py @@ -394,49 +394,8 @@ async def try_trigger_fortune(avatar: Avatar) -> list[Event]: actors_for_story = [avatar] # 用于生成故事的角色列表 - # 导入单选决策模块 - from src.classes.single_choice import make_decision, format_swap_choice_desc - - async def _resolve_choice( - new_obj: Any, - old_obj: Optional[Any], - type_label: str, - extra_context: str = "" - ) -> tuple[bool, str]: - """ - 通用决策辅助函数 - Returns: (should_replace, result_text) - """ - new_name = new_obj.name - new_grade_val = getattr(new_obj, "grade", getattr(new_obj, "realm", None)).value - - if old_obj is None: - return True, f"{avatar.name} 获得{new_grade_val}{type_label}『{new_name}』" - - old_name = old_obj.name - - swap_desc = format_swap_choice_desc(new_obj, old_obj, type_label) - - options = [ - { - "key": "A", - "desc": f"保留原{type_label}『{old_name}』,放弃新{type_label}『{new_name}』。" - }, - { - "key": "B", - "desc": f"卖掉原{type_label}『{old_name}』换取灵石,接受新{type_label}『{new_name}』。\n{swap_desc}" - } - ] - - base_context = f"你在奇遇中发现了{new_grade_val}{type_label}『{new_name}』,但你手中已有『{old_name}』。" - context = f"{base_context} {extra_context}".strip() - - choice = await make_decision(avatar, context, options) - - if choice == "A": - return False, f"{avatar.name} 放弃了{new_grade_val}{type_label}『{new_name}』,保留了『{old_name}』" - else: - return True, f"{avatar.name} 获得了{new_grade_val}{type_label}『{new_name}』,卖掉了『{old_name}』" + # 导入通用决策模块 + from src.classes.single_choice import handle_item_exchange if kind == FortuneKind.WEAPON: weapon = _get_weapon_for_avatar(avatar) @@ -445,14 +404,17 @@ async def try_trigger_fortune(avatar: Avatar) -> list[Event]: kind = FortuneKind.TECHNIQUE theme = _pick_theme(kind) else: - should_equip, res_text = await _resolve_choice( - weapon, avatar.weapon, "兵器" + intro = f"你在奇遇中发现了{weapon.realm.value}兵器『{weapon.name}』。" + if avatar.weapon: + intro += f" 但你手中已有『{avatar.weapon.name}』。" + + _, res_text = await handle_item_exchange( + avatar=avatar, + new_item=weapon, + item_type="weapon", + context_intro=intro, + can_sell_new=False ) - if should_equip: - # 自动卖掉旧武器 - if avatar.weapon is not None: - avatar.sell_weapon(avatar.weapon) - avatar.change_weapon(weapon) if kind == FortuneKind.AUXILIARY: auxiliary = _get_auxiliary_for_avatar(avatar) @@ -461,29 +423,34 @@ async def try_trigger_fortune(avatar: Avatar) -> list[Event]: kind = FortuneKind.TECHNIQUE theme = _pick_theme(kind) else: - should_equip, res_text = await _resolve_choice( - auxiliary, avatar.auxiliary, "辅助装备" + intro = f"你在奇遇中发现了{auxiliary.realm.value}辅助装备『{auxiliary.name}』。" + if avatar.auxiliary: + intro += f" 但你手中已有『{avatar.auxiliary.name}』。" + + _, res_text = await handle_item_exchange( + avatar=avatar, + new_item=auxiliary, + item_type="auxiliary", + context_intro=intro, + can_sell_new=False ) - if should_equip: - # 自动卖掉旧辅助装备 - if avatar.auxiliary is not None: - avatar.sell_auxiliary(avatar.auxiliary) - avatar.change_auxiliary(auxiliary) if kind == FortuneKind.TECHNIQUE: tech = _get_fortune_technique_for_avatar(avatar) if tech is None: return [] - should_learn, res_text = await _resolve_choice( - tech, avatar.technique, "功法", - extra_context=f"这与你当前主修的『{avatar.technique.name if avatar.technique else ''}』冲突。" + intro = f"你在奇遇中领悟了上品功法『{tech.name}』。" + if avatar.technique: + intro += f" 这与你当前主修的『{avatar.technique.name}』冲突。" + + _, res_text = await handle_item_exchange( + avatar=avatar, + new_item=tech, + item_type="technique", + context_intro=intro, + can_sell_new=False ) - - if should_learn: - avatar.technique = tech - - elif kind == FortuneKind.FIND_MASTER: master = _find_potential_master(avatar) diff --git a/src/classes/kill_and_grab.py b/src/classes/kill_and_grab.py index 64c7406..4b72977 100644 --- a/src/classes/kill_and_grab.py +++ b/src/classes/kill_and_grab.py @@ -2,7 +2,7 @@ from __future__ import annotations from typing import TYPE_CHECKING import random -from src.classes.single_choice import make_decision, format_swap_choice_desc +from src.classes.single_choice import handle_item_exchange if TYPE_CHECKING: from src.classes.avatar import Avatar @@ -27,7 +27,7 @@ async def kill_and_grab(winner: Avatar, loser: Avatar) -> str: # 检查辅助装备 if loser.auxiliary: - loot_candidates.append(("auxiliary", loser.auxiliary)) + loot_candidates.append(("auxiliary", loser.auxiliary)) if not loot_candidates: return "" @@ -39,50 +39,24 @@ async def kill_and_grab(winner: Avatar, loser: Avatar) -> str: best_candidates = [c for c in loot_candidates if c[1].realm == best_realm] loot_type, loot_item = random.choice(best_candidates) - should_loot = False - # 判定是否夺取 - # 1. 如果winner当前部位为空,直接夺取 - winner_current = getattr(winner, loot_type) - if winner_current is None : - should_loot = True - else: - # 其他情况下都让 AI 决策 - # 构建详细描述,包含效果 - item_label = '兵器' if loot_type == 'weapon' else '辅助装备' - context = f"战斗胜利,{loser.name} 身死道消,留下了一件{loot_item.realm.value}{item_label}『{loot_item.name}』。" - - swap_desc = format_swap_choice_desc(loot_item, winner_current, item_label) - - options = [ - { - "key": "A", - "desc": f"夺取『{loot_item.name}』,卖掉身上的『{winner_current.name}』换取灵石。\n{swap_desc}" - }, - { - "key": "B", - "desc": f"放弃『{loot_item.name}』,保留身上的『{winner_current.name}』。" - } - ] - choice = await make_decision(winner, context, options) - if choice == "A": - should_loot = True + item_label = '兵器' if loot_type == 'weapon' else '辅助装备' + context = f"战斗胜利,{loser.name} 身死道消,留下了一件{loot_item.realm.value}{item_label}『{loot_item.name}』。" - if should_loot: + swapped, log_text = await handle_item_exchange( + avatar=winner, + new_item=loot_item, + item_type=loot_type, + context_intro=context, + can_sell_new=False + ) + + if swapped: if loot_type == "weapon": - # 自动卖掉旧武器 - if winner.weapon is not None: - winner.sell_weapon(winner.weapon) - winner.change_weapon(loot_item) loser.change_weapon(None) else: - # 自动卖掉旧辅助装备 - if winner.auxiliary is not None: - winner.sell_auxiliary(winner.auxiliary) - winner.change_auxiliary(loot_item) loser.change_auxiliary(None) - return f"{winner.name}夺取了对方的{loot_item.realm.value}『{loot_item.name}』!" + return log_text return "" - diff --git a/src/classes/single_choice.py b/src/classes/single_choice.py index 76ae220..b8ceef1 100644 --- a/src/classes/single_choice.py +++ b/src/classes/single_choice.py @@ -1,4 +1,4 @@ -from typing import Any, Dict, List, TYPE_CHECKING +from typing import Any, Dict, List, TYPE_CHECKING, Tuple, Optional, Callable from src.utils.llm import call_llm_with_task_name from src.utils.config import CONFIG import json @@ -13,15 +13,6 @@ async def make_decision( ) -> str: """ 让角色在多个选项中做出单选决策。 - - Args: - avatar: 做出决策的角色 - context_desc: 决策背景描述 - options: 选项列表,每个选项是一个字典,必须包含 'key' 和 'desc' 字段 - 例如: [{'key': 'A', 'desc': '...'}, {'key': 'B', 'desc': '...'}] - - Returns: - str: AI 选择的选项 Key (如 'A' 或 'B') """ # 1. 获取角色信息 (详细模式) avatar_infos = str(avatar.get_info(detailed=True)) @@ -60,15 +51,13 @@ async def make_decision( data = json.loads(json_str) choice = data.get("choice", "").strip() except (json.JSONDecodeError, ValueError): - # 如果 JSON 解析失败,直接看字符串内容是否就是选项 key choice = clean_result - # 有时候 llm 会输出 "choice: A",这里做个兼容 else: choice = clean_result # 验证 choice 是否在 options key 中 valid_keys = {opt["key"] for opt in options} - # 简单的容错:如果返回的是 "A." 或者 "A " + # 简单的容错 if choice not in valid_keys: for k in valid_keys: if k in choice: @@ -76,29 +65,117 @@ async def make_decision( break if choice not in valid_keys: - # 兜底:默认选第一个 choice = options[0]["key"] return choice -def format_swap_choice_desc(new_item: Any, old_item: Any | None, item_type_name: str) -> str: +def _get_item_ops(avatar: "Avatar", item_type: str) -> dict: + """根据物品类型返回对应的操作函数和标签""" + if item_type == "weapon": + return { + "label": "兵器", + "get_current": lambda: avatar.weapon, + "equip": avatar.change_weapon, + "sell": avatar.sell_weapon + } + elif item_type == "auxiliary": + return { + "label": "辅助装备", + "get_current": lambda: avatar.auxiliary, + "equip": avatar.change_auxiliary, + "sell": avatar.sell_auxiliary + } + elif item_type == "technique": + return { + "label": "功法", + "get_current": lambda: avatar.technique, + "equip": lambda x: setattr(avatar, 'technique', x), + "sell": None # 功法通常不能卖 + } + else: + raise ValueError(f"Unsupported item type: {item_type}") + + +async def handle_item_exchange( + avatar: "Avatar", + new_item: Any, + item_type: str, # "weapon", "auxiliary", "technique" + context_intro: str, + can_sell_new: bool = False +) -> Tuple[bool, str]: """ - 生成替换装备/功法时的决策描述文本。 + 通用处理物品(装备/功法)的获取、替换与决策逻辑。 Args: - new_item: 新获得的物品对象(必须实现 get_info(detailed=True)) - old_item: 当前持有的物品对象(可能为 None) - item_type_name: 物品类型名称(如"兵器"、"功法") + avatar: 角色对象 + new_item: 新获得的物品 + item_type: 物品类型键值 ("weapon", "auxiliary", "technique") + context_intro: 决策背景描述 + can_sell_new: 如果拒绝装备,是否允许卖掉新物品换灵石 + + Returns: + (swapped, result_text) """ + ops = _get_item_ops(avatar, item_type) + label = ops["label"] + current_item = ops["get_current"]() + + new_name = new_item.name + new_grade = getattr(new_item, "realm", getattr(new_item, "grade", None)).value + + # 1. 自动装备:当前无装备且不强制考虑卖新 + if current_item is None and not can_sell_new: + ops["equip"](new_item) + return True, f"{avatar.name} 获得了{new_grade}{label}『{new_name}』并装备。" + + # 2. 需要决策:准备描述 + old_name = current_item.name if current_item else "" new_info = new_item.get_info(detailed=True) - if old_item: - old_info = old_item.get_info(detailed=True) - return ( - f"现有{item_type_name}:{old_info}\n" - f"新{item_type_name}:{new_info}\n" - f"(选择替换将卖出旧{item_type_name})" - ) + swap_desc = f"新{label}:{new_info}" + if current_item: + old_info = current_item.get_info(detailed=True) + swap_desc = f"现有{label}:{old_info}\n{swap_desc}" + if ops["sell"]: + swap_desc += f"\n(选择替换将卖出旧{label})" + + # 3. 构建选项 + # Option A: 装备新物品 + opt_a_text = f"装备新{label}『{new_name}』" + if current_item and ops["sell"]: + opt_a_text += f",卖掉旧{label}『{old_name}』" + elif current_item: + opt_a_text += f",替换旧{label}『{old_name}』" + + # Option B: 拒绝新物品 + if can_sell_new and ops["sell"]: + opt_b_text = f"卖掉新{label}『{new_name}』换取灵石,保留现状" else: - return f"新{item_type_name}:{new_info}" \ No newline at end of file + opt_b_text = f"放弃『{new_name}』" + if current_item: + opt_b_text += f",保留身上的『{old_name}』" + + options = [ + {"key": "A", "desc": opt_a_text}, + {"key": "B", "desc": opt_b_text} + ] + + full_context = f"{context_intro}\n{swap_desc}" + choice = await make_decision(avatar, full_context, options) + + # 4. 执行决策 + if choice == "A": + # 卖旧(如果有且能卖) + if current_item and ops["sell"]: + ops["sell"](current_item) + # 装新 + ops["equip"](new_item) + return True, f"{avatar.name} 换上了{new_grade}{label}『{new_name}』。" + else: + # 卖新(如果被要求且能卖) + if can_sell_new and ops["sell"]: + sold_price = ops["sell"](new_item) + return False, f"{avatar.name} 卖掉了新获得的{new_name},获利 {sold_price} 灵石。" + else: + return False, f"{avatar.name} 放弃了{new_name}。" diff --git a/src/utils/effect_desc.py b/src/utils/effect_desc.py index 5158c38..4b09267 100644 --- a/src/utils/effect_desc.py +++ b/src/utils/effect_desc.py @@ -26,6 +26,7 @@ EFFECT_DESC_MAP = { "damage_reduction": "伤害减免", "realm_suppression_bonus": "境界压制", "cultivate_duration_reduction": "修炼时长缩减", + "extra_cast_success_rate": "铸造成功率", } ACTION_DESC_MAP = { diff --git a/static/config.yml b/static/config.yml index 979e74c..689b442 100644 --- a/static/config.yml +++ b/static/config.yml @@ -27,6 +27,11 @@ game: fortune_probability: 0.005 misfortune_probability: 0.005 +action: + cast: + cost: 10 + base_success_rate: 0.3 + df: ids_separator: ";" diff --git a/static/game_configs/auxiliary.csv b/static/game_configs/auxiliary.csv index c4ed120..bb4e9de 100644 --- a/static/game_configs/auxiliary.csv +++ b/static/game_configs/auxiliary.csv @@ -18,9 +18,9 @@ id,name,grade,desc,effects 3005,隐形披风,金丹,披上后身形尽隐,连神识也难以察觉.,"{extra_move_step: 1, extra_escape_success_rate: 0.2}" 3006,御兽环,金丹,套在妖兽颈上,任其凶焰滔天,也要乖乖听命.,{extra_catch_success_rate: 0.1} 3007,太虚甲,金丹,太虚幻境所化,万法不沾,防御力惊人.,"{damage_reduction: 0.2, extra_max_hp: 200}" -3008,八卦炉,金丹,仿太上老君炼丹炉,丹成九转,药效倍增.,"{extra_max_lifespan: 150, extra_hp_recovery_rate: 0.5}" +3008,八卦炉,金丹,仿太上老君炼丹炉,丹成九转,药效倍增.,"{extra_hp_recovery_rate: 0.5, extra_cast_success_rate: 0.2}" 3009,聚宝盆,金丹,沈万三的宝物,放入一文,取出万贯,财源滚滚.,"{extra_item_sell_price_multiplier: 0.5, extra_fortune_probability: 0.01}" -3010,天地烘炉,金丹,以天地为炉,造化为工,炼制万物.,"{extra_weapon_upgrade_chance: 0.15, extra_weapon_proficiency_gain: 0.5}" +3010,天地烘炉,金丹,以天地为炉,造化为工,炼制万物.,"{extra_weapon_upgrade_chance: 0.15, extra_cast_success_rate: 0.3}" 3011,六道剑匣,金丹,背负六道,剑出轮回,悟剑良伴.,"{extra_breakthrough_success_rate: 0.2, extra_cultivate_exp: 100}" 3012,传国玉玺,元婴,受命于天,既寿永昌。皇威浩荡,震慑宵小.,{realm_suppression_bonus: 0.15} 3013,灵眼之泉,金丹,可移动的灵气之源,随身携带的洞天福地.,"{cultivate_duration_reduction: 0.3, extra_cultivate_exp: 50}" diff --git a/static/game_configs/persona.csv b/static/game_configs/persona.csv index 8207e30..4d50975 100644 --- a/static/game_configs/persona.csv +++ b/static/game_configs/persona.csv @@ -1,8 +1,8 @@ id,name,exclusion_names,desc,rarity,condition,effects -,,和本persona互斥的persona的名称,描述/用于LLM输入的文本,稀有度(N/R/SR/SSR),选取条件(可用avatar字段/Alignment中文或英文等),JSON形式(支持宽松格式,见effects.py说明) +,名称,和本persona互斥的persona的名称,描述/用于LLM输入的文本,稀有度(N/R/SR/SSR),选取条件(可用avatar字段/Alignment中文或英文等),JSON形式(支持宽松格式,见effects.py说明) 1,理性,无常;随性,你总是会用逻辑来思考问题,做事会谋定而后动。,N, 2,无常,理性;极端正义;极端邪恶;沉思,目标飘忽不定,不会长期坚持一个目标。,N, -3,怠惰,冒险;极端正义;极端邪恶,你总是会拖延,不想努力,更热衷于享受人生。,N, +3,怠惰,冒险;极端正义;极端邪恶,你总是会拖延,不想努力,更热衷于享受人生。,N,,{extra_cast_success_rate: -0.05} 4,冒险,怠惰;惜命,你总是会冒险,喜欢刺激,总想放手一搏。,N, 5,随性,理性;极端正义;极端邪恶,你总是会随机应变,性子到哪里了就是哪里,没有一定之规。,N, 6,贪财,,你对灵石和财富有着强烈的渴望。,N, @@ -15,7 +15,7 @@ id,name,exclusion_names,desc,rarity,condition,effects 13,孤僻,友爱,你喜欢独处,避免与人深交,更信赖自己的判断与行动。,N, 14,淡漠,友爱;复仇;好斗;极端正义;极端邪恶,你情感克制,对外界冷静疏离,不轻易被他人或事件影响。,N, 15,好斗,友爱;淡漠;惜命;胆小,你直面冲突,偏好以力量与对抗解决问题,并格外热衷增加己身战力。,R,,{extra_battle_strength_points: 1} -16,鲁莽,理性;沉思;惜命,你行事冲动、少考虑后果,常凭直觉立刻行动。,N, +16,鲁莽,理性;沉思;惜命,你行事冲动、少考虑后果,常凭直觉立刻行动。,N,,{extra_cast_success_rate: -0.05} 17,胆小,冒险;好斗;复仇;极端正义;极端邪恶,你谨小慎微,容易畏惧风险,倾向回避正面冲突。,N,,{extra_escape_success_rate: 0.1} 18,霸道,友爱;胆小,你行事强势,不讲道理,习惯以自己的利益为先,倾向多吃多占、压人一步,对他人的反对不以为意。,N, 19,修行痴迷,无常;怠惰;随性,你将绝大多数时间用于修炼,厌恶与修行无关的社交与享乐。,R,,{extra_cultivate_exp: 30} @@ -53,10 +53,11 @@ id,name,exclusion_names,desc,rarity,condition,effects 51,棍圣,怠惰;胆小,以棍入道,棍即是命。棍法通神,一棍在手,天下无敌,但对棍道之外的事物兴趣寥寥。,SR,,"[{when: 'avatar.weapon.type == WeaponType.STAFF', extra_weapon_proficiency_gain: 1.0, extra_battle_strength_points: 3}]" 52,扇痴,怠惰;胆小,以扇入道,扇即是命。你认为扇法至上,战力强悍,但对扇道之外的事物兴趣寥寥。,SR,,"[{when: 'avatar.weapon.type == WeaponType.FAN', extra_weapon_proficiency_gain: 1.0, extra_battle_strength_points: 3}]" 53,鞭痴,怠惰;胆小,以鞭入道,鞭即是命。你认为鞭法至上,战力强悍,但对鞭道之外的事物兴趣寥寥。,SR,,"[{when: 'avatar.weapon.type == WeaponType.WHIP', extra_weapon_proficiency_gain: 1.0, extra_battle_strength_points: 3}]" -54,暗影宗师,怠惰;胆小,暗器之道登峰造极,杀人于无形。出手必见血,战力惊人,但对暗器之外的事物兴趣寥寥。,SR,,"[{when: 'avatar.weapon.type == WeaponType.HIDDEN_WEAPON', extra_weapon_proficiency_gain: 1.0, extra_battle_strength_points: 3}]" +54,刺客宗师,怠惰;胆小,暗器之道登峰造极,杀人于无形。出手必见血,战力惊人,但对暗器之外的事物兴趣寥寥。,SR,,"[{when: 'avatar.weapon.type == WeaponType.HIDDEN_WEAPON', extra_weapon_proficiency_gain: 1.0, extra_battle_strength_points: 3}]" 55,好色,无欲,你对美色有着强烈的渴求,容易被外貌出众的异性吸引,行事往往受欲望驱使。,N,, 56,无欲,好色,你清心寡欲,对男女之事毫无兴趣,面对美色心如止水,不为所动。,N,, 57,探险家,死宅,你对未知的世界充满好奇,热衷于探索地图上未被点亮的区域,难以忍受长时间待在同一个地方。,SR,, 58,死宅,探险家;冒险,你认为外面的世界充满危险且麻烦,除了必要的宗门任务,你极度排斥长途跋涉,更喜欢待在熟悉的区域修炼。,N,, 59,扫把星,福缘深厚;气运之子,天生霉运缠身,喝凉水都塞牙。虽然活着不易,但也磨练了心性。,N,,{extra_misfortune_probability: 0.005} 60,大器晚成,,早年修行多舛,霉运连连;但若能坚持至金丹元婴,便可否极泰来,气运亨通。,SR,,"[{when: 'avatar.cultivation_progress.realm.value in [""练气"", ""筑基""]', extra_misfortune_probability: 0.005}, {when: 'avatar.cultivation_progress.realm.value in [""金丹"", ""元婴""]', extra_fortune_probability: 0.01}]" +61,炼器师,好斗,精通炼器之道,对材料敏锐,擅长铸造法宝。你认为法宝是修行的关键,战斗并非你的专长。,R,,{extra_cast_success_rate: 0.15} diff --git a/static/game_configs/sect.csv b/static/game_configs/sect.csv index 5583edc..c5045ba 100644 --- a/static/game_configs/sect.csv +++ b/static/game_configs/sect.csv @@ -4,11 +4,11 @@ id,name,desc,member_act_style,alignment,weight,preferred_weapon,effects,rank_nam 2,百兽宗,"以驯养灵兽闻名,豢养各种妖兽灵怪为战力。【御兽大师】你拥有独特的御兽天赋,捕捉妖兽对你来说轻而易举,善于驱使兽群为你而战。",言语直接,重视力量与血性,崇尚狩猎与搏斗。,邪,1,鞭,"{extra_catch_success_rate: 0.25, extra_hunt_items: 1}",谷主;供奉;驭兽师;扈从 3,水镜宗,"正道十宗之一,实则严守中立。拥有仙界异宝""彻天水镜""可预知未来。【趋吉避凶】你拥有超乎常人的直觉,视野开阔,且极易在探索中发现奇遇。",处事冷静圆融,喜以柔克刚,擅借力与反制。,中立,1,扇,"{extra_observation_radius: 2, extra_fortune_probability: 0.002}",镜主;掌镜人;传人;侍镜 4,冥王宗,"行走幽冥之道,术法阴冷狠厉。【通幽】你修行幽冥之法,心志坚定,突破瓶颈时心无杂念,成功率更高。",言辞冷厉少情,敬畏因果而不惧杀伐,偏向效率与结果。,邪,1,扇,"{extra_breakthrough_success_rate: 0.1}",殿主;判官;无常;鬼卒 -5,朱勾宗,"邪宗大派。以炼器、机关、暗杀闻名于世,素来阴毒冷僻。【暗杀专家】你精通潜伏与刺杀,对于强敌,避开正面交锋、伺机暗杀往往是你最佳的制胜之道。",直面欲望与代价,不惧黑暗,以攻伐见长。,邪,1,暗器,"{extra_assassinate_success_rate: 0.15, extra_battle_strength_points: 1}",楼主;掌刑使;影刺;探子 +5,朱勾宗,"邪宗大派。以炼器、机关、暗杀闻名于世,素来阴毒冷僻。【暗杀专家】你精通潜伏与刺杀,对于强敌,避开正面交锋、伺机暗杀往往是你最佳的制胜之道。",直面欲望与代价,不惧黑暗,以攻伐见长。,邪,1,暗器,"{extra_assassinate_success_rate: 0.15, extra_battle_strength_points: 1, extra_cast_success_rate: 0.05}",楼主;掌刑使;影刺;探子 6,合欢宗,"以情入道,靠双修增进修为,善驭人心,长于权变。【双修秘术】你的体质特殊,通过双修能获得远超常人的修为提升,这是你提升境界的最佳捷径。",辞令婉转,善于拿捏人欲与局势,以柔制刚。,中立,1,琴,"{extra_dual_cultivation_exp: 150}",宫主;护法;媚仙;侍童 7,镇魂宗,"铁血风格,擅安魂、封邪、渡厄,兼有刚烈镇压之术。【金刚不坏】你修习护体神功,拥有极强的肉身防御与伤害减免能力,如山岳般不可撼动。",肃穆沉稳,重安魂镇邪,少言而果决。,正,1,棍,"{extra_max_hp: 100, damage_reduction: 0.15}",住持;首座;行者;居士 8,幽魂噬影宗,"镇宗典籍《幽冥录》。幽明气为根基。【如影随形】你极擅身法与遁术,遇到危险时总能全身而退,亦能伺机刺杀落单之敌。",行事隐秘果断,重结果轻虚名,擅潜行与出其不意。,邪,1,刀,"{extra_escape_success_rate: 0.4, extra_assassinate_success_rate: 0.15}",门主;护法;影卫;探子 -9,千帆城,"炼器大宗,巧匠云集。著名法宝有灵灭丝、定魂蓝星等。商旅云集,自成体系。【巧夺天工】你深谙炼器与经商之道,温养兵器时常能使其脱胎换骨,且在交易中总能获利。",务实精明,重交易与信誉,崇尚规则与秩序。,中立,1,枪,"{extra_item_sell_price_multiplier: 0.2, extra_weapon_upgrade_chance: 0.15}",城主;大供奉;执事;学徒 +9,千帆城,"炼器大宗,巧匠云集。著名法宝有灵灭丝、定魂蓝星等。商旅云集,自成体系。【巧夺天工】你深谙炼器与经商之道,温养兵器时常能使其脱胎换骨,且在交易中总能获利。",务实精明,重交易与信誉,崇尚规则与秩序。,中立,1,枪,"{extra_item_sell_price_multiplier: 0.2, extra_weapon_upgrade_chance: 0.15, extra_cast_success_rate: 0.05}",城主;大供奉;执事;学徒 10,妙化宗,"精擅音律杀伐与精神操控,功法诡谲阴柔,以无形琴音乱人心智,杀人于无形。【魔音贯耳】你擅长以音律乱人心智,灵力深厚绵长,虽不擅肉搏,但手段诡谲。",文雅缥缈中深藏算计,喜用言语与音律掌控局势,杀伐不沾烟火气。,邪,1,琴,"{extra_escape_success_rate: 0.5, extra_misfortune_probability: -0.005}", 11,回玄宗,"当世第一阵法大派,以禁制阵诀独步天下,讲究阵法推演与巧思妙用。【阵法聚灵】你善用阵法辅助修炼,能够聚集天地灵气,修炼速度快于常人,且常有意外收获。",严谨细致,追求技术极致,战斗中擅长以后手禁制反制敌人,步步为营。,正,1,暗器,"{cultivate_duration_reduction: 0.1, extra_fortune_probability: 0.005}", 12,不夜城,"修习极光玄真法,以万里极光壁的绝对防御闻名于世。【生生不息】你的生命力极其顽强,疗伤效果倍增,寿元亦远超同阶修士。",坚韧顽强,在逆境中图强,行事光明磊落但也深谋远虑,极其护短。,正,1,扇,"{extra_hp_recovery_rate: 0.5, extra_max_lifespan: 20}",城主;阁老;执令;守夜人 diff --git a/static/game_configs/technique.csv b/static/game_configs/technique.csv index 0ed3b62..11cd74f 100644 --- a/static/game_configs/technique.csv +++ b/static/game_configs/technique.csv @@ -32,7 +32,7 @@ id,name,technique_root,grade,desc,weight,condition,sect,effects 39,吞天魔功,暗,上品,狠人大帝所创,吞噬万千体质,铸就混沌体。,10,,冥王宗,"{""extra_battle_strength_points"": 6}" 40,天魔策,邪,上品,魔门至高宝典,包罗万象,直指破碎虚空。,10,,冥王宗,"{""extra_breakthrough_success_rate"": -0.1, ""extra_cultivate_exp"": 50, ""extra_battle_strength_points"": 6}" 41,冥河真经,冰,上品,血海不枯,冥河不死。演化四亿八千万血神子。,10,,冥王宗,"{""extra_battle_strength_points"": 6}" -42,焚诀,火,上品,通过吞噬异火进化功法,潜力无限,号令万火。,10,,朱勾宗,"{""extra_battle_strength_points"": 6}" +42,焚诀,火,上品,通过吞噬异火进化功法,潜力无限,号令万火。,10,,朱勾宗,"{""extra_battle_strength_points"": 6, ""extra_cast_success_rate"": 0.1}" 43,道心种魔大法,暗,上品,以他人为炉鼎,种魔种,夺天地造化。,10,,朱勾宗,"{""extra_battle_strength_points"": 6}" 44,大衍决,金,上品,专修神识,能分心多用,操控万千傀儡。,10,,朱勾宗,"{""extra_battle_strength_points"": 6}" 45,大乐赋,水,上品,阴阳大道,极乐飞升。双修之至高法门。,10,,合欢宗,"{""extra_battle_strength_points"": 6}" @@ -44,6 +44,6 @@ id,name,technique_root,grade,desc,weight,condition,sect,effects 51,幽冥鬼爪,暗,上品,阴损毒辣,专破内家真气,触之即死。,10,,幽魂噬影宗,"{""extra_battle_strength_points"": 6}" 52,三千雷动,风,上品,身化雷霆,瞬息千里,残影重重。,10,,幽魂噬影宗,"{""extra_battle_strength_points"": 6}" 53,血神经,邪,上品,人皮为纸,鲜血为墨。修炼者必先剥皮噬血。,10,,幽魂噬影宗,"{""extra_breakthrough_success_rate"": -0.1, ""extra_cultivate_exp"": 50, ""extra_battle_strength_points"": 6}" -54,神机百炼,金,上品,炼器极致,化腐朽为神奇,万物皆可为兵。,10,,千帆城,"{""extra_battle_strength_points"": 6}" +54,神机百炼,金,上品,炼器极致,化腐朽为神奇,万物皆可为兵。,10,,千帆城,"{""extra_battle_strength_points"": 4, ""extra_cast_success_rate"": 0.2}" 55,周天星斗大阵,土,上品,引周天星力,演化宇宙洪荒,攻防一体。,10,,千帆城,"{""extra_battle_strength_points"": 6}" 56,纵地金光,风,上品,阐教绝学,化作一道金光,瞬息万里。,10,,千帆城,"{""extra_battle_strength_points"": 6, ""extra_move_step"": 2}"