using System.Runtime.Intrinsics.X86; using System.Text; using Milimoe.FunGame.Core.Entity; using Milimoe.FunGame.Core.Library.Constant; namespace Milimoe.FunGame.Core.Model { /// /// 职业规划管理类 /// 负责处理角色的职业点数分配、职业升级、流派选择、技能选择等逻辑 /// public class ClassPlanning(Character character) { /// /// 所属的角色 /// public Character Character => character; /// /// 角色当前的职业点数 /// public int ClassPoints { get; private set; } = 0; /// /// 所有可用职业列表(全局静态池) /// public List AllClasses { get; private set; } = []; /// /// 所有可用流派列表(全局静态池) /// public List AllSubClasses { get; private set; } = []; /// /// 已选择的职业列表(运行时) /// public List SelectedClasses { get; private set; } = []; /// /// 已选择的流派列表(运行时) /// public List SelectedSubClasses { get; private set; } = []; /// /// 可选的战斗天赋池(按定位分类) /// public Dictionary> CombatTalentPool { get; private set; } = []; /// /// 当前激活的战斗天赋 /// public Skill? CurrentCombatTalent { get; private set; } /// /// 角色定位(最多3个) /// public List RoleTypes { get; private set; } = []; /// /// 默认职业状态(角色1级时选择的职业和流派) /// public DefaultClassState DefaultState { get; private set; } = new(); /// /// 是否可以修改默认职业和流派(角色≥20级时可修改) /// public bool CanModifyDefault => Character.Level >= 20; /// /// 已使用的总职业点数 /// public int UsedClassPoints => SelectedClasses.Sum(c => c.Level); /// /// 剩余可用的职业点数 /// public int AvailableClassPoints => ClassPoints - UsedClassPoints; /// /// 初始化职业规划器 /// /// 所有职业池 /// 所有流派池 /// 战斗天赋池 public void Initialize(List allClasses, List allSubClasses, Dictionary> combatTalentPool) { AllClasses = allClasses; AllSubClasses = allSubClasses; CombatTalentPool = combatTalentPool; // 计算当前职业点数 CalculateClassPoints(); // 加载角色当前的职业配置 LoadCurrentConfiguration(); } /// /// 计算角色当前可用的职业点数 /// private void CalculateClassPoints() { ClassPoints = 0; foreach (int level in Character.GameplayEquilibriumConstant.ClassPointsGetterList) { if (Character.Level >= level) { ClassPoints++; } } // 至少1点 if (ClassPoints == 0) ClassPoints = 1; } /// /// 加载角色当前的职业配置 /// private void LoadCurrentConfiguration() { CharacterClass charClass = Character.Class; // 加载已选择的职业 foreach (Class c in charClass.Classes) { SelectedClasses.Add(new SelectedClass { Class = c, Level = c.Level, SelectedSkills = LoadSelectedSkillsForClass(c) }); } // 加载已选择的流派 foreach (SubClass sc in charClass.SubClasses) { SelectedSubClasses.Add(new SelectedSubClass { SubClass = sc, Level = sc.Level }); } // 加载当前战斗天赋 CurrentCombatTalent = charClass.CombatTalent; // 加载角色定位 if (Character.FirstRoleType != RoleType.None) RoleTypes.Add(Character.FirstRoleType); if (Character.SecondRoleType != RoleType.None) RoleTypes.Add(Character.SecondRoleType); if (Character.ThirdRoleType != RoleType.None) RoleTypes.Add(Character.ThirdRoleType); // 加载默认状态(从数据库或配置文件) LoadDefaultState(); } /// /// 加载已选择的职业技能 /// private List LoadSelectedSkillsForClass(Class @class) { // 这里需要从角色当前技能中筛选出属于该职业的技能 // 简化实现:返回空列表 return []; } /// /// 加载默认的职业状态 /// private void LoadDefaultState() { // 从角色数据中加载默认状态 // 如果没有默认状态,则使用当前第一个职业和流派 if (SelectedClasses.Count > 0 && SelectedSubClasses.Count > 0) { DefaultState = new DefaultClassState { DefaultClass = SelectedClasses[0].Class, DefaultSubClass = SelectedSubClasses[0].SubClass }; } } /// /// 获取指定职业的可用流派 /// public List GetAvailableSubClasses(Class @class) { return AllSubClasses.Where(sc => sc.Class.Id == @class.Id).ToList(); } /// /// 选择或升级职业 /// /// 要选择或升级的职业 /// true: 升级现有职业, false: 添加新职业(兼职) /// 操作结果 public ClassOperationResult SelectOrUpgradeClass(Class classToSelect, bool isUpgrade = false) { // 检查职业点数 if (AvailableClassPoints < 1) return new ClassOperationResult(false, "职业点数不足"); // 检查是否已选择相同职业 SelectedClass? existingClass = SelectedClasses.FirstOrDefault(c => c.Class.Id == classToSelect.Id); if (existingClass != null) { if (isUpgrade) { // 升级现有职业 if (existingClass.Level >= 10) return new ClassOperationResult(false, "职业已满级(最高10级)"); existingClass.Level++; UpdateClassSkills(existingClass); return new ClassOperationResult(true, $"职业 {classToSelect.Name} 升级到 {existingClass.Level} 级"); } else { return new ClassOperationResult(false, "不能选择重复的职业"); } } else { // 添加新职业(兼职) if (isUpgrade) return new ClassOperationResult(false, "未找到该职业,无法升级"); if (AvailableClassPoints < 1) return new ClassOperationResult(false, "职业点数不足"); SelectedClass newClass = new() { Class = classToSelect, Level = 1, SelectedSkills = [] }; SelectedClasses.Add(newClass); InitializeClassSkills(newClass); return new ClassOperationResult(true, $"添加新职业: {classToSelect.Name} 1级"); } } /// /// 选择流派 /// public ClassOperationResult SelectSubClass(SubClass subClass) { SelectedSubClass newSubClass = new() { SubClass = subClass, Level = 1 }; SelectedSubClasses.Add(newSubClass); // 如果是主要流派且角色<20级,保存为默认状态 if (DefaultState.DefaultSubClass is null && !CanModifyDefault) { DefaultState.DefaultClass = subClass.Class; DefaultState.DefaultSubClass = subClass; } return new ClassOperationResult(true, $"选择流派: {subClass.Name}"); } /// /// 初始化职业技能(根据职业等级) /// private void InitializeClassSkills(SelectedClass selectedClass) { // 根据职业等级和升级路线图初始化技能 // 1级: 获得流派固有被动*1 (需要先选择流派) // 2级: 职业技能选择权*2 // 3级: 职业技能等级+1 // 4级: 职业技能选择权*1(被动)或数值提升 // 5级: 职业技能选择权*2,职业技能等级+1 // 6级: 获得流派固有被动*1 // 7级: 职业技能等级+1 // 8级: 职业技能选择权*2,职业技能等级+1 // 9级: 职业技能选择权*2(被动)或数值提升 // 10级: 职业技能选择权*2,职业技能等级+1 // 这里需要根据具体的职业技能池来实现 // 简化实现 } /// /// 更新职业技能(升级时) /// private void UpdateClassSkills(SelectedClass selectedClass) { int newLevel = selectedClass.Level; // 根据新的等级解锁或升级技能 // 实现逻辑依赖于具体的职业技能池 } /// /// 选择职业技能 /// public ClassOperationResult SelectClassSkill(Class @class, Skill skill, SkillSelectionType selectionType) { SelectedClass? selectedClass = SelectedClasses.FirstOrDefault(c => c.Class.Id == @class.Id); if (selectedClass == null) return new ClassOperationResult(false, "未选择该职业"); // 检查技能是否属于该职业的技能池 if (!IsSkillInClassPool(@class, skill)) return new ClassOperationResult(false, "该技能不属于此职业的技能池"); // 检查流派和属性限制 if (!CheckSkillRequirements(skill, selectedClass)) return new ClassOperationResult(false, "不满足技能选择条件"); // 根据选择类型处理 switch (selectionType) { case SkillSelectionType.ActiveSkill: // 检查是否已达到技能选择上限 int activeSkillCount = selectedClass.SelectedSkills.Count(s => s.Skill.SkillType == SkillType.Skill || s.Skill.SkillType == SkillType.Magic || s.Skill.SkillType == SkillType.SuperSkill); if (activeSkillCount >= 8) // 最多8个自选技能 return new ClassOperationResult(false, "已达到主动技能选择上限"); break; case SkillSelectionType.PassiveSkill: // 检查被动技能选择 int passiveCount = selectedClass.SelectedSkills.Count(s => s.Skill.SkillType == SkillType.Passive); if (passiveCount >= 3) // 最多3个自选被动 return new ClassOperationResult(false, "已达到被动技能选择上限"); break; case SkillSelectionType.NumericBoost: // 数值提升选择 if (selectedClass.NumericBoostCount >= 2) // 最多2次数值提升 return new ClassOperationResult(false, "已达到数值提升选择上限"); // 应用数值提升 ApplyNumericBoost(selectedClass); selectedClass.NumericBoostCount++; return new ClassOperationResult(true, "选择数值提升"); } // 添加技能 SelectedSkill selectedSkill = new() { Skill = skill, SelectionType = selectionType, Level = CalculateSkillLevel(selectedClass.Level, skill.SkillType) }; selectedClass.SelectedSkills.Add(selectedSkill); return new ClassOperationResult(true, $"选择技能: {skill.Name}"); } /// /// 检查技能是否在职业池中 /// private bool IsSkillInClassPool(Class @class, Skill skill) { // 检查技能是否属于该职业的技能集合 return @class.Skills.Contains(skill) || @class.Magics.Contains(skill) || @class.SuperSkills.Contains(skill) || @class.PassiveSkills.Contains(skill); } /// /// 检查技能选择条件 /// private bool CheckSkillRequirements(Skill skill, SelectedClass selectedClass) { // 检查流派限制 SelectedSubClass? subClass = SelectedSubClasses.FirstOrDefault(sc => sc.SubClass.Class.Id == selectedClass.Class.Id); if (subClass != null) { // 检查技能是否有流派限制 // 这里需要技能对象有流派限制属性,暂时简化 } // 检查属性要求 if (!CheckAttributeRequirements(skill)) return false; return true; } /// /// 检查属性要求 /// private bool CheckAttributeRequirements(Skill skill) { // 检查技能是否有属性要求(如力量≥15) // 这里需要技能对象有属性要求属性,暂时简化 return true; } /// /// 计算技能等级 /// private int CalculateSkillLevel(int classLevel, SkillType skillType) { // 根据职业等级计算技能等级 int baseLevel = classLevel switch { 1 => 1, 2 => 1, 3 => 2, 4 => 2, 5 => 3, 6 => 3, 7 => 4, 8 => 5, 9 => 5, 10 => 6, _ => 1 }; // 魔法技能额外+1 if (skillType == SkillType.Magic) baseLevel++; return baseLevel; } /// /// 应用数值提升 /// private void ApplyNumericBoost(SelectedClass selectedClass) { // 根据职业等级应用数值提升 if (selectedClass.Level >= 4 && selectedClass.Level < 7) { // 4级数值提升: 6基础属性点 + 1成长总值 ApplyAttributePoints(6); ApplyGrowthPoints(1); } else if (selectedClass.Level >= 9) { // 9级数值提升: 12基础属性点 + 2成长总值 ApplyAttributePoints(12); ApplyGrowthPoints(2); } } /// /// 应用基础属性点 /// private void ApplyAttributePoints(int points) { // 这里需要修改角色的基础属性 // 简化实现 } /// /// 应用成长总值 /// private void ApplyGrowthPoints(int points) { // 这里需要修改角色的成长值 // 简化实现 } /// /// 选择角色定位 /// public ClassOperationResult SelectRoleTypes(List roleTypes) { if (roleTypes.Count > 3) return new ClassOperationResult(false, "最多只能选择3个定位"); // 检查定位是否来自已选择的流派 List availableRoleTypes = [.. SelectedSubClasses.SelectMany(sc => sc.SubClass.RoleTypes).Distinct()]; foreach (RoleType roleType in roleTypes) { if (!availableRoleTypes.Contains(roleType)) return new ClassOperationResult(false, $"定位 {roleType} 不可用"); } RoleTypes = roleTypes; // 更新角色对象的定位 UpdateCharacterRoleTypes(); return new ClassOperationResult(true, "定位选择成功"); } /// /// 选择战斗天赋 /// public ClassOperationResult SelectCombatTalent(Skill combatTalent) { // 检查战斗天赋是否可用 if (!IsCombatTalentAvailable(combatTalent)) return new ClassOperationResult(false, "战斗天赋不可用"); CurrentCombatTalent = combatTalent; // 如果是核心定位的战斗天赋,应用技能等级+1效果 if (RoleTypes.Contains(RoleType.Core)) { ApplyCoreTalentBonus(); } return new ClassOperationResult(true, $"选择战斗天赋: {combatTalent.Name}"); } /// /// 检查战斗天赋是否可用 /// private bool IsCombatTalentAvailable(Skill combatTalent) { // 检查战斗天赋是否在可用池中 foreach (RoleType roleType in RoleTypes) { if (CombatTalentPool.TryGetValue(roleType, out List? talents) && talents.Contains(combatTalent)) { return true; } } return false; } /// /// 应用核心天赋加成(所有自身主动技能等级+1) /// private void ApplyCoreTalentBonus() { // 这里需要为角色所有自身主动技能等级+1 // 简化实现 } /// /// 获取转换战斗天赋的战技 /// public Skill? GetSwitchCombatTalentSkill() { if (RoleTypes.Count <= 1 || CurrentCombatTalent == null) return null; // 如果有次要定位,提供转换战斗天赋战技 // 这里需要创建一个Skill对象 return null; // 简化实现 } /// /// 洗点(重置职业规划) /// public ClassOperationResult Reset(bool resetToDefault = false) { if (resetToDefault && !CanModifyDefault) { // 20级前只能重置到默认状态 ResetToDefaultState(); return new ClassOperationResult(true, "已重置到默认职业状态"); } else { // 完全重置 SelectedClasses.Clear(); SelectedSubClasses.Clear(); CurrentCombatTalent = null; RoleTypes.Clear(); return new ClassOperationResult(true, "职业规划已重置"); } } /// /// 重置到默认状态 /// private void ResetToDefaultState() { SelectedClasses.Clear(); SelectedSubClasses.Clear(); if (DefaultState.DefaultClass != null) { SelectedClasses.Add(new SelectedClass { Class = DefaultState.DefaultClass, Level = 1, SelectedSkills = [] }); InitializeClassSkills(SelectedClasses[0]); } if (DefaultState.DefaultSubClass != null) { SelectedSubClasses.Add(new SelectedSubClass { SubClass = DefaultState.DefaultSubClass, Level = 1 }); } // 重置定位和天赋 RoleTypes.Clear(); CurrentCombatTalent = null; UpdateCharacterRoleTypes(); } /// /// 更新角色对象的定位 /// private void UpdateCharacterRoleTypes() { Character.FirstRoleType = RoleTypes.Count > 0 ? RoleTypes[0] : RoleType.None; Character.SecondRoleType = RoleTypes.Count > 1 ? RoleTypes[1] : RoleType.None; Character.ThirdRoleType = RoleTypes.Count > 2 ? RoleTypes[2] : RoleType.None; } /// /// 应用职业规划到角色 /// public ClassOperationResult ApplyToCharacter() { try { // 创建ClassObject ClassObject classObject = new([.. SelectedClasses.Select(sc => sc.Class)], [.. SelectedSubClasses.Select(ssc => ssc.SubClass)]) { FirstRoleType = RoleTypes.Count > 0 ? RoleTypes[0] : RoleType.None, SecondRoleType = RoleTypes.Count > 1 ? RoleTypes[1] : RoleType.None, ThirdRoleType = RoleTypes.Count > 2 ? RoleTypes[2] : RoleType.None, CurrentCombatTalent = CurrentCombatTalent }; // 应用职业技能 foreach (SelectedClass selectedClass in SelectedClasses) { ApplyClassSkillsToCharacter(selectedClass); } // 应用流派固有被动 foreach (SelectedSubClass selectedSubClass in SelectedSubClasses) { ApplySubClassPassivesToCharacter(selectedSubClass); } // 通过CharacterClass重建角色职业 Character.Class.ReBuildCharacterClass(classObject); // 如果是核心定位,应用技能等级加成 if (RoleTypes.Contains(RoleType.Core) && CurrentCombatTalent != null) { ApplyCoreSkillLevelBonus(); } return new ClassOperationResult(true, "职业规划应用成功"); } catch (Exception ex) { return new ClassOperationResult(false, $"应用失败: {ex.Message}"); } } /// /// 应用职业技能到角色 /// private void ApplyClassSkillsToCharacter(SelectedClass selectedClass) { foreach (SelectedSkill selectedSkill in selectedClass.SelectedSkills) { // 设置技能等级 selectedSkill.Skill.Level = selectedSkill.Level; // 添加到角色 selectedSkill.Skill.AddSkillToCharacter(Character); } } /// /// 应用流派固有被动到角色 /// private void ApplySubClassPassivesToCharacter(SelectedSubClass selectedSubClass) { // 根据流派等级应用对应的固有被动 // 1级和6级获得不同的固有被动 List inherentPassives = GetInherentPassivesForLevel(selectedSubClass.SubClass, selectedSubClass.Level); foreach (Skill passive in inherentPassives) { passive.AddSkillToCharacter(Character); } } /// /// 根据流派等级获取固有被动 /// private static List GetInherentPassivesForLevel(SubClass subClass, int level) { List passives = []; // 1级固有被动 if (level >= 1) { // 获取1级固有被动(第一个) if (subClass.InherentPassives.Count > 0) passives.Add(subClass.InherentPassives.First()); } // 6级固有被动 if (level >= 6) { // 获取6级固有被动(第二个) if (subClass.InherentPassives.Count > 1) passives.Add(subClass.InherentPassives.Skip(1).First()); } return passives; } /// /// 应用核心技能等级加成 /// private void ApplyCoreSkillLevelBonus() { // 为所有自身主动技能等级+1 foreach (Skill skill in Character.Skills) { if (skill.SkillType != SkillType.Passive) { skill.ExLevel += 1; } } // 为职业技能等级+1 foreach (SelectedClass selectedClass in SelectedClasses) { foreach (SelectedSkill selectedSkill in selectedClass.SelectedSkills) { selectedSkill.Level += 1; selectedSkill.Skill.ExLevel += 1; } } } /// /// 获取职业规划详细信息 /// public string GetPlanningInfo() { StringBuilder sb = new(); sb.AppendLine("=== 职业规划信息 ==="); sb.AppendLine($"角色: {Character.Name}"); sb.AppendLine($"等级: {Character.Level}"); sb.AppendLine($"职业点数: {ClassPoints} (已用: {UsedClassPoints}, 剩余: {AvailableClassPoints})"); sb.AppendLine(); sb.AppendLine("=== 已选择职业 ==="); foreach (SelectedClass sc in SelectedClasses) { sb.AppendLine($"- {sc.Class.Name} Lv.{sc.Level}"); foreach (SelectedSkill skill in sc.SelectedSkills) { sb.AppendLine($" {skill.SelectionType}: {skill.Skill.Name} Lv.{skill.Level}"); } if (sc.NumericBoostCount > 0) sb.AppendLine($" 数值提升次数: {sc.NumericBoostCount}"); } sb.AppendLine(); sb.AppendLine("=== 已选择流派 ==="); foreach (SelectedSubClass ssc in SelectedSubClasses) { sb.AppendLine($"- {ssc.SubClass.Name} Lv.{ssc.Level}"); } sb.AppendLine(); sb.AppendLine("=== 角色定位 ==="); sb.AppendLine(string.Join(", ", RoleTypes.Select(rt => rt.ToString()))); sb.AppendLine(); sb.AppendLine("=== 战斗天赋 ==="); sb.AppendLine(CurrentCombatTalent?.Name ?? "未选择"); if (RoleTypes.Contains(RoleType.Core) && CurrentCombatTalent != null) { sb.AppendLine("(核心天赋激活: 所有自身主动技能等级+1)"); } return sb.ToString(); } } /// /// 已选择的职业(包含等级和选择的技能) /// public class SelectedClass { public Class Class { get; set; } = null!; public int Level { get; set; } = 1; public List SelectedSkills { get; set; } = []; public int NumericBoostCount { get; set; } = 0; } /// /// 已选择的流派 /// public class SelectedSubClass { public SubClass SubClass { get; set; } = null!; public int Level { get; set; } = 1; } /// /// 已选择的技能 /// public class SelectedSkill { public Skill Skill { get; set; } = null!; public SkillSelectionType SelectionType { get; set; } public int Level { get; set; } = 1; } /// /// 技能选择类型 /// public enum SkillSelectionType { ActiveSkill, PassiveSkill, NumericBoost } /// /// 默认职业状态(用于洗点) /// public class DefaultClassState { public Class? DefaultClass { get; set; } public SubClass? DefaultSubClass { get; set; } } /// /// 职业操作结果 /// public class ClassOperationResult(bool success, string message) { public bool Success { get; } = success; public string Message { get; } = message; } }