diff --git a/src/classes/action/__init__.py b/src/classes/action/__init__.py index 2984e9f..aabfcdf 100644 --- a/src/classes/action/__init__.py +++ b/src/classes/action/__init__.py @@ -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__ = [ diff --git a/src/classes/action/battle.py b/src/classes/action/battle.py index e42c9e0..cfb0148 100644 --- a/src/classes/action/battle.py +++ b/src/classes/action/battle.py @@ -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]: diff --git a/src/classes/action/nurture_weapon.py b/src/classes/action/nurture_weapon.py new file mode 100644 index 0000000..35fb92f --- /dev/null +++ b/src/classes/action/nurture_weapon.py @@ -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] + ) + ] + diff --git a/src/classes/avatar.py b/src/classes/avatar.py index d9bf17a..64225a4 100644 --- a/src/classes/avatar.py +++ b/src/classes/avatar.py @@ -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) + diff --git a/src/classes/effects.py b/src/classes/effects.py index 7079f57..c15ae64 100644 --- a/src/classes/effects.py +++ b/src/classes/effects.py @@ -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 属性获取(实时计算)。 """ diff --git a/src/classes/equipment_grade.py b/src/classes/equipment_grade.py index 924e54a..edf7f5b 100644 --- a/src/classes/equipment_grade.py +++ b/src/classes/equipment_grade.py @@ -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), # 金色 } diff --git a/src/classes/sect.py b/src/classes/sect.py index edf06c1..32b1e89 100644 --- a/src/classes/sect.py +++ b/src/classes/sect.py @@ -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 diff --git a/src/classes/treasure.py b/src/classes/treasure.py deleted file mode 100644 index e720b58..0000000 --- a/src/classes/treasure.py +++ /dev/null @@ -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() \ No newline at end of file diff --git a/src/classes/weapon.py b/src/classes/weapon.py index c76e077..112501e 100644 --- a/src/classes/weapon.py +++ b/src/classes/weapon.py @@ -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", "普通")) diff --git a/src/classes/weapon_type.py b/src/classes/weapon_type.py index 3c84cab..71fa912 100644 --- a/src/classes/weapon_type.py +++ b/src/classes/weapon_type.py @@ -13,6 +13,7 @@ class WeaponType(Enum): WHIP = "鞭" ZITHER = "琴" # 音律武器 FLUTE = "笛" # 包括箫 + HIDDEN_WEAPON = "暗器" # 暗器,如飞针、袖箭等 def __str__(self) -> str: return self.value diff --git a/src/sim/load/avatar_load_mixin.py b/src/sim/load/avatar_load_mixin.py index ee9c76e..96cce92 100644 --- a/src/sim/load/avatar_load_mixin.py +++ b/src/sim/load/avatar_load_mixin.py @@ -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: diff --git a/src/sim/new_avatar.py b/src/sim/new_avatar.py index d22cd4a..aa81682 100644 --- a/src/sim/new_avatar.py +++ b/src/sim/new_avatar.py @@ -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] diff --git a/src/sim/save/avatar_save_mixin.py b/src/sim/save/avatar_save_mixin.py index 68db0ff..5572ee0 100644 --- a/src/sim/save/avatar_save_mixin.py +++ b/src/sim/save/avatar_save_mixin.py @@ -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, diff --git a/static/game_configs/sect.csv b/static/game_configs/sect.csv index 3bc3ea9..6ec1045 100644 --- a/static/game_configs/sect.csv +++ b/static/game_configs/sect.csv @@ -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,枪, diff --git a/static/game_configs/treasure.csv b/static/game_configs/treasure.csv deleted file mode 100644 index b2e895d..0000000 --- a/static/game_configs/treasure.csv +++ /dev/null @@ -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}" - - diff --git a/static/game_configs/weapon.csv b/static/game_configs/weapon.csv index 4d37339..54c9027 100644 --- a/static/game_configs/weapon.csv +++ b/static/game_configs/weapon.csv @@ -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}"