"""阵营技能树系统 - 允许阵营通过累积能量解锁技能""" from typing import List, Optional from .models import ( WorldState, FactionSkill, FactionSkillTree, FactionSkills ) def get_default_faction_skills() -> FactionSkills: """返回默认技能树配置""" return FactionSkills( optimists=FactionSkillTree( skills={ "festival_boost": FactionSkill( unlocked=False, cost=10, effect="increase_positive_emotion", requires=[] ), "unity": FactionSkill( unlocked=False, cost=20, effect="reduce_conflict", requires=["festival_boost"] ) } ), fearful=FactionSkillTree( skills={ "panic_spread": FactionSkill( unlocked=False, cost=10, effect="increase_fear", requires=[] ), "control": FactionSkill( unlocked=False, cost=20, effect="suppress_others", requires=["panic_spread"] ) } ) ) def _check_requires_met(skill_tree: FactionSkillTree, requires: List[str]) -> bool: """检查前置技能是否已解锁""" for req in requires: if req not in skill_tree.skills: return False if not skill_tree.skills[req].unlocked: return False return True def check_and_unlock_skills(state: WorldState) -> List[str]: """检查并解锁技能 规则: 1. faction.power >= skill.cost 2. 技能尚未解锁 3. 所有 requires 已解锁 返回:本次解锁的技能列表 """ unlocked = [] # 检查乐观派技能 for skill_id, skill in state.faction_skills.optimists.skills.items(): if skill.unlocked: continue if state.factions.optimists.power < skill.cost: continue if not _check_requires_met(state.faction_skills.optimists, skill.requires): continue # 解锁技能 skill.unlocked = True state.factions.optimists.power -= skill.cost unlocked.append(f"optimists:{skill_id}") # 检查恐惧派技能 for skill_id, skill in state.faction_skills.fearful.skills.items(): if skill.unlocked: continue if state.factions.fearful.power < skill.cost: continue if not _check_requires_met(state.faction_skills.fearful, skill.requires): continue # 解锁技能 skill.unlocked = True state.factions.fearful.power -= skill.cost unlocked.append(f"fearful:{skill_id}") return unlocked def apply_skill_effects(state: WorldState) -> None: """应用已解锁技能的持续效果 效果说明: - increase_positive_emotion: 每 tick 提升 town_mood +1 - reduce_conflict: 降低恐惧派能量增长(每 tick -1) - increase_fear: 每 tick 降低 town_mood -1 - suppress_others: 降低乐观派能量增长(每 tick -1) """ # 乐观派技能效果 for skill_id, skill in state.faction_skills.optimists.skills.items(): if not skill.unlocked: continue if skill.effect == "increase_positive_emotion": state.town_mood = min(10, state.town_mood + 1) elif skill.effect == "reduce_conflict": state.factions.fearful.power = max(0, state.factions.fearful.power - 1) # 恐惧派技能效果 for skill_id, skill in state.faction_skills.fearful.skills.items(): if not skill.unlocked: continue if skill.effect == "increase_fear": state.town_mood = max(-10, state.town_mood - 1) elif skill.effect == "suppress_others": state.factions.optimists.power = max(0, state.factions.optimists.power - 1)