update treasure to weapon and auxiliary

This commit is contained in:
bridge
2025-11-13 01:34:09 +08:00
parent e760ba107d
commit 125d7891e5
16 changed files with 132 additions and 132 deletions

View File

@@ -32,6 +32,7 @@ from .help_mortals import HelpMortals
from .devour_mortals import DevourMortals
from .self_heal import SelfHeal
from .catch import Catch
from .nurture_weapon import NurtureWeapon
# 注册到 ActionRegistry标注是否为实际可执行动作
register_action(actual=False)(Action)
@@ -60,6 +61,7 @@ register_action(actual=True)(HelpMortals)
register_action(actual=True)(DevourMortals)
register_action(actual=True)(SelfHeal)
register_action(actual=True)(Catch)
register_action(actual=True)(NurtureWeapon)
# Talk 已移动到 mutual_action 模块,在那里注册
__all__ = [

View File

@@ -35,6 +35,14 @@ class Battle(InstantAction):
# 应用双方伤害
loser.hp.reduce(loser_damage)
winner.hp.reduce(winner_damage)
# 增加双方兵器熟练度(战斗经验)
import random
proficiency_gain = random.uniform(1.0, 3.0)
self.avatar.increase_weapon_proficiency(proficiency_gain)
if target is not None:
target.increase_weapon_proficiency(proficiency_gain)
self._last_result = (winner.name, loser.name, loser_damage, winner_damage)
def can_start(self, avatar_name: str | None = None) -> tuple[bool, str]:

View File

@@ -0,0 +1,46 @@
from __future__ import annotations
from src.classes.action import TimedAction
from src.classes.event import Event
import random
class NurtureWeapon(TimedAction):
"""
温养兵器:花时间温养兵器,可以较多增加熟练度
"""
COMMENT = "温养兵器,增加兵器熟练度"
DOABLES_REQUIREMENTS = "任何时候都可以执行"
PARAMS = {}
duration_months = 3
def _execute(self) -> None:
# 温养兵器增加较多熟练度5-10
proficiency_gain = random.uniform(5.0, 10.0)
self.avatar.increase_weapon_proficiency(proficiency_gain)
def can_start(self) -> tuple[bool, str]:
# 任何时候都可以温养兵器
return (True, "")
def start(self) -> Event:
weapon_name = self.avatar.weapon.name if self.avatar.weapon else "兵器"
return Event(
self.world.month_stamp,
f"{self.avatar.name} 开始温养{weapon_name}",
related_avatars=[self.avatar.id]
)
def finish(self) -> list[Event]:
weapon_name = self.avatar.weapon.name if self.avatar.weapon else "兵器"
proficiency = self.avatar.weapon_proficiency
return [
Event(
self.world.month_stamp,
f"{self.avatar.name} 完成温养{weapon_name},熟练度提升至{proficiency:.1f}%",
related_avatars=[self.avatar.id]
)
]

View File

@@ -102,6 +102,8 @@ class Avatar(AvatarSaveMixin, AvatarLoadMixin):
appearance: Appearance = field(default_factory=get_random_appearance)
# 兵器(必有,无则分配普通兵器)
weapon: Optional[Weapon] = None
# 兵器熟练度0-100更换兵器归零
weapon_proficiency: float = 0.0
# 辅助装备(可选)
auxiliary: Optional[Auxiliary] = None
# 灵兽:最多一个;若再次捕捉则覆盖
@@ -144,10 +146,21 @@ class Avatar(AvatarSaveMixin, AvatarLoadMixin):
from src.classes.alignment import Alignment as _Alignment
self.alignment = random.choice(list(_Alignment))
# 兵器初始化:如果无兵器,分配一个随机的普通兵器
# 兵器初始化:如果无兵器,分配一个普通兵器
# 有宗门且宗门有倾向兵器时80%概率使用宗门兵器,否则随机
if self.weapon is None:
weapon_type = random.choice(list(WeaponType))
self.weapon = get_common_weapon(weapon_type)
if self.sect is not None and self.sect.preferred_weapon:
# 有宗门倾向兵器80%概率使用
if random.random() < 0.8:
# 尝试根据宗门倾向兵器类型获取
for wt in WeaponType:
if wt.value == self.sect.preferred_weapon:
self.weapon = get_common_weapon(wt)
break
# 如果还没有兵器无宗门、无倾向、或20%随机),随机分配
if self.weapon is None:
weapon_type = random.choice(list(WeaponType))
self.weapon = get_common_weapon(weapon_type)
# effects 改为实时属性,不在此初始化
@@ -202,7 +215,7 @@ class Avatar(AvatarSaveMixin, AvatarLoadMixin):
from src.classes.sect import get_sect_info_with_rank
if detailed:
weapon_info = self.weapon.get_detailed_info() if self.weapon is not None else ""
weapon_info = f"{self.weapon.get_detailed_info()},熟练度:{self.weapon_proficiency:.1f}%"
auxiliary_info = self.auxiliary.get_detailed_info() if self.auxiliary is not None else ""
sect_info = get_sect_info_with_rank(self, detailed=True)
alignment_info = self.alignment.get_detailed_info() if self.alignment is not None else "未知"
@@ -721,4 +734,23 @@ class Avatar(AvatarSaveMixin, AvatarLoadMixin):
"""
return self.cultivation_progress.get_move_step()
def change_weapon(self, new_weapon: Weapon) -> None:
"""
更换兵器,熟练度归零
Args:
new_weapon: 新的兵器
"""
self.weapon = new_weapon
self.weapon_proficiency = 0.0
def increase_weapon_proficiency(self, amount: float) -> None:
"""
增加兵器熟练度上限100
Args:
amount: 增加的熟练度值
"""
self.weapon_proficiency = min(100.0, self.weapon_proficiency + amount)

View File

@@ -10,7 +10,7 @@ Effect 来源:
- 功法 (technique)
- 灵根 (root)
- 特质 (persona)
- 法宝 (treasure)
- 兵器和辅助装备 (weapon, auxiliary)
"""
# =============================================================================
@@ -143,7 +143,7 @@ Effects 通过 src/classes/effect.py 中的 _merge_effects() 函数合并。
2. 功法 (technique)
3. 灵根 (root)
4. 特质 (persona) - 遍历所有 personas
5. 法宝 (treasure)
5. 兵器和辅助装备 (weapon, auxiliary)
最终结果通过 Avatar.effects 属性获取(实时计算)。
"""

View File

@@ -20,7 +20,7 @@ class EquipmentGrade(Enum):
# 装备等级颜色映射
_grade_colors = {
EquipmentGrade.COMMON: (150, 150, 150), #
EquipmentGrade.COMMON: (255, 255, 255), #
EquipmentGrade.TREASURE: (138, 43, 226), # 紫色
EquipmentGrade.ARTIFACT: (255, 215, 0), # 金色
}

View File

@@ -34,14 +34,13 @@ class Sect:
desc: str
member_act_style: str
alignment: Alignment
sect_surnames: list[str]
male_sect_given_names: list[str]
female_sect_given_names: list[str]
headquarter: SectHeadQuarter
# 本宗关联的功法名称(来自 technique.csv 的 sect 列)
technique_names: list[str]
# 随机选择宗门时使用的权重默认1
weight: float = 1.0
# 宗门倾向的兵器类型(字符串,如"剑"、"刀"等)
preferred_weapon: str = ""
# 影响角色或系统的效果
effects: dict[str, object] = field(default_factory=dict)
# 宗门自定义职位名称可选SectRank -> 名称
@@ -100,8 +99,6 @@ def _load_sects() -> tuple[dict[int, Sect], dict[str, Sect]]:
assets_base = Path("assets/sects")
for _, row in df.iterrows():
image_path = assets_base / f"{row['name']}.png"
male_given_names = _split_names(row["male_sect_given_names"])
female_given_names = _split_names(row["female_sect_given_names"])
# 收集该宗门下配置的功法名称
technique_names: list[str] = []
@@ -119,6 +116,10 @@ def _load_sects() -> tuple[dict[int, Sect], dict[str, Sect]]:
# 读取 effects兼容 JSON/单引号字面量/空)
effects = load_effect_from_str(row.get("effects", ""))
# 读取倾向兵器类型
preferred_weapon_val = row.get("preferred_weapon", "")
preferred_weapon = str(preferred_weapon_val).strip() if str(preferred_weapon_val) != "nan" else ""
# 从 sect_region.csv 中优先取驻地名称/描述;否则兼容旧列或退回宗门名
csv_hq = hq_by_sect_id.get(int(row["id"]))
hq_name_from_csv = (csv_hq[0] if csv_hq else "").strip() if csv_hq else ""
@@ -130,9 +131,6 @@ def _load_sects() -> tuple[dict[int, Sect], dict[str, Sect]]:
desc=str(row["desc"]),
member_act_style=str(row["member_act_style"]),
alignment=Alignment.from_str(row["alignment"]),
sect_surnames=_split_names(row["sect_surnames"]),
male_sect_given_names=male_given_names,
female_sect_given_names=female_given_names,
# 驻地:优先 sect_region.csv否则兼容旧列最终回退宗门名
headquarter=SectHeadQuarter(
name=(hq_name_from_csv or str(row.get("headquarter_name", "")).strip() or str(row["name"])) ,
@@ -141,6 +139,7 @@ def _load_sects() -> tuple[dict[int, Sect], dict[str, Sect]]:
),
technique_names=technique_names,
weight=weight,
preferred_weapon=preferred_weapon,
effects=effects,
)
sects_by_id[sect.id] = sect

View File

@@ -1,80 +0,0 @@
from __future__ import annotations
from dataclasses import dataclass, field
from typing import Optional, Dict
from src.utils.df import game_configs
from src.classes.effect import load_effect_from_str
from src.classes.sect import Sect, sects_by_id
@dataclass
class Treasure:
"""
法宝:配置驱动,暂不挂接到 Avatar。
字段与 static/game_configs/treasure.csv 对应:
- sect_id对应宗门ID见 sect.csv允许为空表示无特定宗门归属
- effects解析为 dict用于未来与 Avatar.effects 合并
"""
id: int
name: str
sect_id: Optional[int]
desc: str
effects: dict[str, object] = field(default_factory=dict)
sect: Optional[Sect] = None
# 万魂幡专用吞噬魂魄计数0~10000
devoured_souls: int = 0
def get_info(self) -> str:
suffix = f"(吞噬魂魄:{self.devoured_souls}" if self.name == "万魂幡" and self.devoured_souls > 0 else ""
return f"{self.name}{suffix}"
def get_detailed_info(self) -> str:
souls = f" 吞噬魂魄:{self.devoured_souls}" if self.name == "万魂幡" and self.devoured_souls > 0 else ""
return f"{self.name}{self.desc}{souls}"
def _load_treasures() -> tuple[Dict[int, Treasure], Dict[str, Treasure], Dict[int, Treasure]]:
"""从配表加载 treasure 数据。
返回:(按ID、按名称、按宗门ID 的映射)。
若同一宗门配置多个法宝,按首次出现保留(每门至多一个)。
"""
treasures_by_id: Dict[int, Treasure] = {}
treasures_by_name: Dict[str, Treasure] = {}
treasures_by_sect_id: Dict[int, Treasure] = {}
df = game_configs.get("treasure")
if df is None:
return treasures_by_id, treasures_by_name, treasures_by_sect_id
for _, row in df.iterrows():
raw_sect = row.get("sect_id")
sect_id: Optional[int] = None
if raw_sect is not None and str(raw_sect).strip() and str(raw_sect).strip() != "nan":
sect_id = int(float(raw_sect))
raw_effects_val = row.get("effects", "")
effects = load_effect_from_str(raw_effects_val)
sect_obj: Optional[Sect] = sects_by_id.get(int(sect_id)) if sect_id is not None else None
t = Treasure(
id=int(row["id"]),
name=str(row["name"]),
sect_id=sect_id,
desc=str(row.get("desc", "")),
effects=effects,
sect=sect_obj,
)
# no-op
treasures_by_id[t.id] = t
treasures_by_name[t.name] = t
if t.sect_id is not None and t.sect_id not in treasures_by_sect_id:
treasures_by_sect_id[t.sect_id] = t
return treasures_by_id, treasures_by_name, treasures_by_sect_id
treasures_by_id, treasures_by_name, treasures_by_sect_id = _load_treasures()

View File

@@ -72,12 +72,15 @@ def _load_weapons() -> tuple[Dict[int, Weapon], Dict[str, Weapon], Dict[int, Wea
sect_obj: Optional[Sect] = sects_by_id.get(int(sect_id)) if sect_id is not None else None
# 解析weapon_type
weapon_type_str = str(row.get("weapon_type", "其他"))
weapon_type = WeaponType.OTHER
weapon_type_str = str(row.get("weapon_type", ""))
weapon_type = None
for wt in WeaponType:
if wt.value == weapon_type_str:
weapon_type = wt
break
if weapon_type is None:
raise ValueError(f"武器 {row['name']} 的weapon_type '{weapon_type_str}' 无效,必须是有效的兵器类型")
# 解析grade
grade_str = str(row.get("grade", "普通"))

View File

@@ -13,6 +13,7 @@ class WeaponType(Enum):
WHIP = ""
ZITHER = "" # 音律武器
FLUTE = "" # 包括箫
HIDDEN_WEAPON = "暗器" # 暗器,如飞针、袖箭等
def __str__(self) -> str:
return self.value

View File

@@ -106,6 +106,9 @@ class AvatarLoadMixin:
avatar.weapon = copy.deepcopy(weapons_by_id[weapon_id])
avatar.weapon.special_data = data.get("weapon_special_data", {})
# 恢复兵器熟练度
avatar.weapon_proficiency = float(data.get("weapon_proficiency", 0.0))
# 重建auxiliary深拷贝因为special_data是实例特有的
auxiliary_id = data.get("auxiliary_id")
if auxiliary_id is not None and auxiliary_id in auxiliaries_by_id:

View File

@@ -399,8 +399,6 @@ def build_avatars_from_plan(
avatars_by_index: list[Avatar] = [None] * n # type: ignore
avatars_by_id: dict[str, Avatar] = {}
sect_treasure_assigned: Dict[int, bool] = {}
for i in range(n):
gender = planned_gender[i] or random_gender()
sect = planned_sect[i]

View File

@@ -78,6 +78,7 @@ class AvatarSaveMixin:
"items": items_dict,
"weapon_id": self.weapon.id if self.weapon else None,
"weapon_special_data": self.weapon.special_data if self.weapon else {},
"weapon_proficiency": self.weapon_proficiency,
"auxiliary_id": self.auxiliary.id if self.auxiliary else None,
"auxiliary_special_data": self.auxiliary.special_data if self.auxiliary else {},
"spirit_animal": spirit_animal_dict,

View File

@@ -1,11 +1,11 @@
id,name,desc,member_act_style,alignment,sect_surnames,male_sect_given_names,female_sect_given_names,weight,effects
,,宗门名称与描述,宗门成员行事风格,阵营(正/中/邪),宗门常用姓氏(分号分隔),男性常用名(分号分隔),女性常用名(分号分隔),权重(默认1),effects(JSON)
1,明心剑宗,通玄界东方第一宗,以无上剑道称雄于世。云纹禁制为不传心法。,清明克己,行止如一。重剑与心法并重,讲究明心见性。,,明;心;剑;霄;玄;霁;衡;孤;徽;肃,澄川;宏石;磐岳;霆岱;寂岚;久安;宸秋;烁离;沧岳;砺锋;炎洲;远歌,采微;霏岚;韶华;绮澜;珠影;远岫;若水;凝香;雪瑶;南絮;轻萝;宛竹,1,
2,百兽宗,以驯养灵兽闻名,豢养各种妖兽灵怪为战力。,你言语直接,重视力量与血性,崇尚狩猎与搏斗。,,,驼王;飞熊;虎魄;狼行;熊罡;白猿;石坚;山岚;青鬃;玄爪;金瞳;裂爪;破角;狂鬃;赤鬣;苍隼;啸风;裂岩,狐绮;白貂;青翎;雪牙;赤羽;玄狸;灵爪;月狐;银鳞;霜蹄;云貉;绒尾;锦狐;轻蹄,1,
3,水镜宗,正道十宗之一,实则严守中立。拥有仙界异宝"彻天水镜"可预知未来。,你处事冷静圆融,喜以柔克刚,擅借力与反制。,,水;镜;寒;霜;冰;清;沐;澜;渊;泉,涟光;沧浪;泽远;浩川;泊舟;涓石;溪原;涵舟;泠曜;漪岑;淞岳;涔雨,漫霖;洛漪;潋月;涵烟;沁波;翠波;漫葭;汀兰;潭歌;涓玥;澧宁;潇然,1,
4,冥王宗,行走幽冥之道,术法阴冷狠厉。,你言辞冷厉少情,敬畏因果而不惧杀伐,偏向效率与结果。,,冥;王;玄;幽;夜;白;冷;狱;魇;阴,血燎;焚魄;灰灭;殁川;绝尘;厌离;朔寒;邪风;归墟;朽骨;朔月;止戈,寒绫;霜瑶;凄歌;素鸢;祭宁;黛魂;夙梦;绫雪;凛珑;霁月;旷音;凝岚,1,
5,朱勾宗,邪宗大派。以炼器、机关、暗杀闻名于世,素来阴毒冷僻。,你直面欲望与代价,不惧黑暗,以攻伐见长。,,朱;绯;刃;戮;蚀;渊;钧;鸦;墨;殷,暗阑;机括;鬼匣;夜禁;幻锁;残锋;暗弦;影栅;幽钩;断线;潜匿;迷踪,玄簪;霜绡;纤罗;碎玉;影裳;轻弦;凝黛;凝烟;冷珥;素纱;凛钗;寒袖,1,
6,合欢宗,以情入道,靠双修增进修为,善驭人心,长于权变。,你辞令婉转,善于拿捏人欲与局势,以柔制刚。,,合;欢;苏;陆;柳;花;月;楚;顾;白,流烟;迟夜;长陌;归舟;暮成;远辞;行止;轻寒;沉香;野鹤;乘风,婉心;轻柔;疏影;如梦;绮念;惜香;慕雪;倾城;绯烟;晚晴;素袖;霁眉;绸缪;静妍,1,"{""legal_actions"": [""DualCultivation""]}"
7,镇魂宗,铁血风格,擅安魂、封邪、渡厄,兼有刚烈镇压之术。,你肃穆沉稳,重安魂镇邪,少言而果决。,,厉;卢;镇;魂;钟;青;凌;白;楚;顾,安魄;靖川;霁阳;季衡;砺甲;烁锋;昊戈;祁光;漠石;启封;殷策;定魄,清宁;素铃;靖霜;澄心;霁雪;安祈;净月;宁枝;祷绫;明槐;采霁;定寒,1,
8,幽魂噬影宗,镇宗典籍《幽冥录》。幽明气为根基。,你行事隐秘果断,重结果轻虚名,擅潜行与出其不意。,,冥;阎;鬼;幽;归;应;阴;碧;夜;魅,噬影;无藏;绝响;断痕;影渊;暗行;潜踪;魄隐;迷雾;空蝉;断念;裂隙,影绫;暗萝;霜绡;素鹭;玄绮;凝灯;绫岚;凛铃;朔华;漠音;宵岑;泠歌,1,
9,千帆城,炼器大宗,巧匠云集。著名法宝有灵灭丝、定魂蓝星、天罗网、万里极光壁、飞翼等。商旅云集,自成体系。,你务实精明,重交易与信誉,崇尚规则与秩序。,,商;楚;顾;白;苏;林;叶;秦;赵;魏,持衡;清评;问价;立契;通衡;问道;理市;衡准;守约;筑匠;铸衡;估算,素蓝;明衡;巧心;青帆;绫舟;观星;衡绫;星槎;织霓;采绫;芸巧;霁行;砚秋;镶玑;绘蓝;银梭;珩心,1,
id,name,desc,member_act_style,alignment,weight,preferred_weapon,effects
,,宗门名称与描述,宗门成员行事风格,阵营(正/中/邪),权重(默认1),倾向兵器类型,effects(JSON)
1,明心剑宗,通玄界东方第一宗,以无上剑道称雄于世。云纹禁制为不传心法。,清明克己,行止如一。重剑与心法并重,讲究明心见性。,,1,,
2,百兽宗,以驯养灵兽闻名,豢养各种妖兽灵怪为战力。,你言语直接,重视力量与血性,崇尚狩猎与搏斗。,,1,,
3,水镜宗,正道十宗之一,实则严守中立。拥有仙界异宝"彻天水镜"可预知未来。,你处事冷静圆融,喜以柔克刚,擅借力与反制。,,1,,
4,冥王宗,行走幽冥之道,术法阴冷狠厉。,你言辞冷厉少情,敬畏因果而不惧杀伐,偏向效率与结果。,,1,,
5,朱勾宗,邪宗大派。以炼器、机关、暗杀闻名于世,素来阴毒冷僻。,你直面欲望与代价,不惧黑暗,以攻伐见长。,,1,暗器,
6,合欢宗,以情入道,靠双修增进修为,善驭人心,长于权变。,你辞令婉转,善于拿捏人欲与局势,以柔制刚。,,1,,"{""legal_actions"": [""DualCultivation""]}"
7,镇魂宗,铁血风格,擅安魂、封邪、渡厄,兼有刚烈镇压之术。,你肃穆沉稳,重安魂镇邪,少言而果决。,,1,,
8,幽魂噬影宗,镇宗典籍《幽冥录》。幽明气为根基。,你行事隐秘果断,重结果轻虚名,擅潜行与出其不意。,,1,,
9,千帆城,炼器大宗,巧匠云集。著名法宝有灵灭丝、定魂蓝星、天罗网、万里极光壁、飞翼等。商旅云集,自成体系。,你务实精明,重交易与信誉,崇尚规则与秩序。,,1,,
Can't render this file because it contains an unexpected character in line 5 and column 73.

View File

@@ -1,14 +0,0 @@
id,name,sect_id,desc,effects
,名称,所属宗门ID(见sect.csv),描述/提示词,"JSON形式"
1,本命剑匣,1,以心御剑,匣启如霆,剑意随心破万法.,"{""extra_battle_strength_points"": 3}"
2,灵舟,9,小舟承灵气,御风渡海,千里一瞬.,"{""extra_move_step"": 1}"
3,千里镜,3,澄澈如镜,观千里之外,洞察先机.,"{""extra_observation_radius"": 2}"
4,镇魂钟,7,钟鸣摄魄,定魂镇邪,护心安魂.,"{""extra_battle_strength_points"": 2, ""extra_observation_radius"": 1}"
5,聚灵阵盘,5,刻阵成盘,聚纳灵机,修行事半功倍.,"{""extra_cultivate_exp"": 50}"
6,万魂幡,4,幡起万魂啾啾,阴风过境.,"{""legal_actions"": [""DevourMortals""], ""extra_battle_strength_points"": ""eval(avatar.treasure.devoured_souls // 100 * 0.1)""}"
7,万欲同心结,6,情意同心,双修之道相互映照,修为更精进.,"{""extra_dual_cultivation_exp"": 100}"
8,影遁披风,8,融身影界,来去无踪,伏击出其不意.,"{""extra_move_step"": 1, ""extra_observation_radius"": 1}"
9,百兽驭兽符,2,以兽纹灵符加持,唤引兽心,御兽更易.,"{""extra_catch_success_rate"": 0.1}"
1 id name sect_id desc effects
2 名称 所属宗门ID(见sect.csv) 描述/提示词 JSON形式
3 1 本命剑匣 1 以心御剑,匣启如霆,剑意随心破万法. {"extra_battle_strength_points": 3}
4 2 灵舟 9 小舟承灵气,御风渡海,千里一瞬. {"extra_move_step": 1}
5 3 千里镜 3 澄澈如镜,观千里之外,洞察先机. {"extra_observation_radius": 2}
6 4 镇魂钟 7 钟鸣摄魄,定魂镇邪,护心安魂. {"extra_battle_strength_points": 2, "extra_observation_radius": 1}
7 5 聚灵阵盘 5 刻阵成盘,聚纳灵机,修行事半功倍. {"extra_cultivate_exp": 50}
8 6 万魂幡 4 幡起万魂啾啾,阴风过境. {"legal_actions": ["DevourMortals"], "extra_battle_strength_points": "eval(avatar.treasure.devoured_souls // 100 * 0.1)"}
9 7 万欲同心结 6 情意同心,双修之道相互映照,修为更精进. {"extra_dual_cultivation_exp": 100}
10 8 影遁披风 8 融身影界,来去无踪,伏击出其不意. {"extra_move_step": 1, "extra_observation_radius": 1}
11 9 百兽驭兽符 2 以兽纹灵符加持,唤引兽心,御兽更易. {"extra_catch_success_rate": 0.1}

View File

@@ -3,12 +3,13 @@ id,name,weapon_type,grade,sect_id,desc,effects
1,本命剑匣,,法宝,1,以心御剑,匣启如霆,剑意随心破万法.,"{""extra_battle_strength_points"": 3}"
4,镇魂钟,,法宝,7,钟鸣摄魄,定魂镇邪,护心安魂.,"{""extra_battle_strength_points"": 2, ""extra_observation_radius"": 1}"
6,万魂幡,,法宝,4,幡起万魂啾啾,阴风过境.,"{""legal_actions"": [""DevourMortals""], ""extra_battle_strength_points"": ""eval(avatar.weapon.special_data.get('devoured_souls', 0) // 100 * 0.1)""}"
1001,普通剑,,普通,,平凡无奇的剑,修仙者人手一把,"{}"
1002,普通刀,,普通,,平凡无奇的刀。,"{}"
1003,普通枪,,普通,,平凡无奇的枪。,"{}"
1004,普通棍,,普通,,平凡无奇的棍。,"{}"
1005,普通扇,,普通,,平凡无奇的扇。,"{}"
1006,普通鞭,,普通,,平凡无奇的鞭。,"{}"
1007,普通琴,,普通,,平凡无奇的琴。,"{}"
1008,普通笛,,普通,,平凡无奇的笛。,"{}"
1001,普通剑,,普通,,平凡无奇的剑。,"{""extra_battle_strength_points"": 1}"
1002,普通刀,,普通,,平凡无奇的刀。,"{""extra_battle_strength_points"": 1}"
1003,普通枪,,普通,,平凡无奇的枪。,"{""extra_battle_strength_points"": 1}"
1004,普通棍,,普通,,平凡无奇的棍。,"{""extra_battle_strength_points"": 1}"
1005,普通扇,,普通,,平凡无奇的扇。,"{""extra_battle_strength_points"": 1}"
1006,普通鞭,,普通,,平凡无奇的鞭。,"{""extra_battle_strength_points"": 1}"
1007,普通琴,,普通,,平凡无奇的琴。,"{""extra_battle_strength_points"": 1}"
1008,普通笛,,普通,,平凡无奇的笛。,"{""extra_battle_strength_points"": 1}"
1009,普通暗器,暗器,普通,,平凡无奇的暗器。,"{""extra_battle_strength_points"": 1}"
1 id name weapon_type grade sect_id desc effects
3 1 本命剑匣 法宝 1 以心御剑,匣启如霆,剑意随心破万法. {"extra_battle_strength_points": 3}
4 4 镇魂钟 法宝 7 钟鸣摄魄,定魂镇邪,护心安魂. {"extra_battle_strength_points": 2, "extra_observation_radius": 1}
5 6 万魂幡 法宝 4 幡起万魂啾啾,阴风过境. {"legal_actions": ["DevourMortals"], "extra_battle_strength_points": "eval(avatar.weapon.special_data.get('devoured_souls', 0) // 100 * 0.1)"}
6 1001 普通剑 普通 平凡无奇的剑,修仙者人手一把。 平凡无奇的剑。 {} {"extra_battle_strength_points": 1}
7 1002 普通刀 普通 平凡无奇的刀。 {} {"extra_battle_strength_points": 1}
8 1003 普通枪 普通 平凡无奇的枪。 {} {"extra_battle_strength_points": 1}
9 1004 普通棍 普通 平凡无奇的棍。 {} {"extra_battle_strength_points": 1}
10 1005 普通扇 普通 平凡无奇的扇。 {} {"extra_battle_strength_points": 1}
11 1006 普通鞭 普通 平凡无奇的鞭。 {} {"extra_battle_strength_points": 1}
12 1007 普通琴 普通 平凡无奇的琴。 {} {"extra_battle_strength_points": 1}
13 1008 普通笛 普通 平凡无奇的笛。 {} {"extra_battle_strength_points": 1}
14 1009 普通暗器 暗器 普通 平凡无奇的暗器。 {"extra_battle_strength_points": 1}
15