mirror of
https://github.com/project-redbud/FunGame-Core.git
synced 2026-03-05 22:20:26 +00:00
添加职业规划模型
This commit is contained in:
parent
5f538987f7
commit
2b8395bcdc
863
Model/ClassPlanning.cs
Normal file
863
Model/ClassPlanning.cs
Normal file
@ -0,0 +1,863 @@
|
||||
using System.Runtime.Intrinsics.X86;
|
||||
using System.Text;
|
||||
using Milimoe.FunGame.Core.Entity;
|
||||
using Milimoe.FunGame.Core.Library.Constant;
|
||||
|
||||
namespace Milimoe.FunGame.Core.Model
|
||||
{
|
||||
/// <summary>
|
||||
/// 职业规划管理类
|
||||
/// 负责处理角色的职业点数分配、职业升级、流派选择、技能选择等逻辑
|
||||
/// </summary>
|
||||
public class ClassPlanning(Character character)
|
||||
{
|
||||
/// <summary>
|
||||
/// 所属的角色
|
||||
/// </summary>
|
||||
public Character Character => character;
|
||||
|
||||
/// <summary>
|
||||
/// 角色当前的职业点数
|
||||
/// </summary>
|
||||
public int ClassPoints { get; private set; } = 0;
|
||||
|
||||
/// <summary>
|
||||
/// 所有可用职业列表(全局静态池)
|
||||
/// </summary>
|
||||
public List<Class> AllClasses { get; private set; } = [];
|
||||
|
||||
/// <summary>
|
||||
/// 所有可用流派列表(全局静态池)
|
||||
/// </summary>
|
||||
public List<SubClass> AllSubClasses { get; private set; } = [];
|
||||
|
||||
/// <summary>
|
||||
/// 已选择的职业列表(运行时)
|
||||
/// </summary>
|
||||
public List<SelectedClass> SelectedClasses { get; private set; } = [];
|
||||
|
||||
/// <summary>
|
||||
/// 已选择的流派列表(运行时)
|
||||
/// </summary>
|
||||
public List<SelectedSubClass> SelectedSubClasses { get; private set; } = [];
|
||||
|
||||
/// <summary>
|
||||
/// 可选的战斗天赋池(按定位分类)
|
||||
/// </summary>
|
||||
public Dictionary<RoleType, List<Skill>> CombatTalentPool { get; private set; } = [];
|
||||
|
||||
/// <summary>
|
||||
/// 当前激活的战斗天赋
|
||||
/// </summary>
|
||||
public Skill? CurrentCombatTalent { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// 角色定位(最多3个)
|
||||
/// </summary>
|
||||
public List<RoleType> RoleTypes { get; private set; } = [];
|
||||
|
||||
/// <summary>
|
||||
/// 默认职业状态(角色1级时选择的职业和流派)
|
||||
/// </summary>
|
||||
public DefaultClassState DefaultState { get; private set; } = new();
|
||||
|
||||
/// <summary>
|
||||
/// 是否可以修改默认职业和流派(角色≥20级时可修改)
|
||||
/// </summary>
|
||||
public bool CanModifyDefault => Character.Level >= 20;
|
||||
|
||||
/// <summary>
|
||||
/// 已使用的总职业点数
|
||||
/// </summary>
|
||||
public int UsedClassPoints => SelectedClasses.Sum(c => c.Level);
|
||||
|
||||
/// <summary>
|
||||
/// 剩余可用的职业点数
|
||||
/// </summary>
|
||||
public int AvailableClassPoints => ClassPoints - UsedClassPoints;
|
||||
|
||||
/// <summary>
|
||||
/// 初始化职业规划器
|
||||
/// </summary>
|
||||
/// <param name="allClasses">所有职业池</param>
|
||||
/// <param name="allSubClasses">所有流派池</param>
|
||||
/// <param name="combatTalentPool">战斗天赋池</param>
|
||||
public void Initialize(List<Class> allClasses, List<SubClass> allSubClasses, Dictionary<RoleType, List<Skill>> combatTalentPool)
|
||||
{
|
||||
AllClasses = allClasses;
|
||||
AllSubClasses = allSubClasses;
|
||||
CombatTalentPool = combatTalentPool;
|
||||
|
||||
// 计算当前职业点数
|
||||
CalculateClassPoints();
|
||||
|
||||
// 加载角色当前的职业配置
|
||||
LoadCurrentConfiguration();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 计算角色当前可用的职业点数
|
||||
/// </summary>
|
||||
private void CalculateClassPoints()
|
||||
{
|
||||
ClassPoints = 0;
|
||||
foreach (int level in Character.GameplayEquilibriumConstant.ClassPointsGetterList)
|
||||
{
|
||||
if (Character.Level >= level)
|
||||
{
|
||||
ClassPoints++;
|
||||
}
|
||||
}
|
||||
|
||||
// 至少1点
|
||||
if (ClassPoints == 0) ClassPoints = 1;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 加载角色当前的职业配置
|
||||
/// </summary>
|
||||
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();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 加载已选择的职业技能
|
||||
/// </summary>
|
||||
private List<SelectedSkill> LoadSelectedSkillsForClass(Class @class)
|
||||
{
|
||||
// 这里需要从角色当前技能中筛选出属于该职业的技能
|
||||
// 简化实现:返回空列表
|
||||
return [];
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 加载默认的职业状态
|
||||
/// </summary>
|
||||
private void LoadDefaultState()
|
||||
{
|
||||
// 从角色数据中加载默认状态
|
||||
// 如果没有默认状态,则使用当前第一个职业和流派
|
||||
if (SelectedClasses.Count > 0 && SelectedSubClasses.Count > 0)
|
||||
{
|
||||
DefaultState = new DefaultClassState
|
||||
{
|
||||
DefaultClass = SelectedClasses[0].Class,
|
||||
DefaultSubClass = SelectedSubClasses[0].SubClass
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取指定职业的可用流派
|
||||
/// </summary>
|
||||
public List<SubClass> GetAvailableSubClasses(Class @class)
|
||||
{
|
||||
return AllSubClasses.Where(sc => sc.Class.Id == @class.Id).ToList();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 选择或升级职业
|
||||
/// </summary>
|
||||
/// <param name="classToSelect">要选择或升级的职业</param>
|
||||
/// <param name="isUpgrade">true: 升级现有职业, false: 添加新职业(兼职)</param>
|
||||
/// <returns>操作结果</returns>
|
||||
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级");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 选择流派
|
||||
/// </summary>
|
||||
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}");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 初始化职业技能(根据职业等级)
|
||||
/// </summary>
|
||||
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
|
||||
|
||||
// 这里需要根据具体的职业技能池来实现
|
||||
// 简化实现
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 更新职业技能(升级时)
|
||||
/// </summary>
|
||||
private void UpdateClassSkills(SelectedClass selectedClass)
|
||||
{
|
||||
int newLevel = selectedClass.Level;
|
||||
|
||||
// 根据新的等级解锁或升级技能
|
||||
// 实现逻辑依赖于具体的职业技能池
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 选择职业技能
|
||||
/// </summary>
|
||||
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}");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 检查技能是否在职业池中
|
||||
/// </summary>
|
||||
private bool IsSkillInClassPool(Class @class, Skill skill)
|
||||
{
|
||||
// 检查技能是否属于该职业的技能集合
|
||||
return @class.Skills.Contains(skill) ||
|
||||
@class.Magics.Contains(skill) ||
|
||||
@class.SuperSkills.Contains(skill) ||
|
||||
@class.PassiveSkills.Contains(skill);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 检查技能选择条件
|
||||
/// </summary>
|
||||
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;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 检查属性要求
|
||||
/// </summary>
|
||||
private bool CheckAttributeRequirements(Skill skill)
|
||||
{
|
||||
// 检查技能是否有属性要求(如力量≥15)
|
||||
// 这里需要技能对象有属性要求属性,暂时简化
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 计算技能等级
|
||||
/// </summary>
|
||||
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;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 应用数值提升
|
||||
/// </summary>
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 应用基础属性点
|
||||
/// </summary>
|
||||
private void ApplyAttributePoints(int points)
|
||||
{
|
||||
// 这里需要修改角色的基础属性
|
||||
// 简化实现
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 应用成长总值
|
||||
/// </summary>
|
||||
private void ApplyGrowthPoints(int points)
|
||||
{
|
||||
// 这里需要修改角色的成长值
|
||||
// 简化实现
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 选择角色定位
|
||||
/// </summary>
|
||||
public ClassOperationResult SelectRoleTypes(List<RoleType> roleTypes)
|
||||
{
|
||||
if (roleTypes.Count > 3)
|
||||
return new ClassOperationResult(false, "最多只能选择3个定位");
|
||||
|
||||
// 检查定位是否来自已选择的流派
|
||||
List<RoleType> 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, "定位选择成功");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 选择战斗天赋
|
||||
/// </summary>
|
||||
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}");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 检查战斗天赋是否可用
|
||||
/// </summary>
|
||||
private bool IsCombatTalentAvailable(Skill combatTalent)
|
||||
{
|
||||
// 检查战斗天赋是否在可用池中
|
||||
foreach (RoleType roleType in RoleTypes)
|
||||
{
|
||||
if (CombatTalentPool.TryGetValue(roleType, out List<Skill>? talents) && talents.Contains(combatTalent))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 应用核心天赋加成(所有自身主动技能等级+1)
|
||||
/// </summary>
|
||||
private void ApplyCoreTalentBonus()
|
||||
{
|
||||
// 这里需要为角色所有自身主动技能等级+1
|
||||
// 简化实现
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取转换战斗天赋的战技
|
||||
/// </summary>
|
||||
public Skill? GetSwitchCombatTalentSkill()
|
||||
{
|
||||
if (RoleTypes.Count <= 1 || CurrentCombatTalent == null)
|
||||
return null;
|
||||
|
||||
// 如果有次要定位,提供转换战斗天赋战技
|
||||
// 这里需要创建一个Skill对象
|
||||
return null; // 简化实现
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 洗点(重置职业规划)
|
||||
/// </summary>
|
||||
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, "职业规划已重置");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重置到默认状态
|
||||
/// </summary>
|
||||
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();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 更新角色对象的定位
|
||||
/// </summary>
|
||||
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;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 应用职业规划到角色
|
||||
/// </summary>
|
||||
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}");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 应用职业技能到角色
|
||||
/// </summary>
|
||||
private void ApplyClassSkillsToCharacter(SelectedClass selectedClass)
|
||||
{
|
||||
foreach (SelectedSkill selectedSkill in selectedClass.SelectedSkills)
|
||||
{
|
||||
// 设置技能等级
|
||||
selectedSkill.Skill.Level = selectedSkill.Level;
|
||||
|
||||
// 添加到角色
|
||||
selectedSkill.Skill.AddSkillToCharacter(Character);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 应用流派固有被动到角色
|
||||
/// </summary>
|
||||
private void ApplySubClassPassivesToCharacter(SelectedSubClass selectedSubClass)
|
||||
{
|
||||
// 根据流派等级应用对应的固有被动
|
||||
// 1级和6级获得不同的固有被动
|
||||
List<Skill> inherentPassives = GetInherentPassivesForLevel(selectedSubClass.SubClass, selectedSubClass.Level);
|
||||
|
||||
foreach (Skill passive in inherentPassives)
|
||||
{
|
||||
passive.AddSkillToCharacter(Character);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 根据流派等级获取固有被动
|
||||
/// </summary>
|
||||
private static List<Skill> GetInherentPassivesForLevel(SubClass subClass, int level)
|
||||
{
|
||||
List<Skill> 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;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 应用核心技能等级加成
|
||||
/// </summary>
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取职业规划详细信息
|
||||
/// </summary>
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 已选择的职业(包含等级和选择的技能)
|
||||
/// </summary>
|
||||
public class SelectedClass
|
||||
{
|
||||
public Class Class { get; set; } = null!;
|
||||
public int Level { get; set; } = 1;
|
||||
public List<SelectedSkill> SelectedSkills { get; set; } = [];
|
||||
public int NumericBoostCount { get; set; } = 0;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 已选择的流派
|
||||
/// </summary>
|
||||
public class SelectedSubClass
|
||||
{
|
||||
public SubClass SubClass { get; set; } = null!;
|
||||
public int Level { get; set; } = 1;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 已选择的技能
|
||||
/// </summary>
|
||||
public class SelectedSkill
|
||||
{
|
||||
public Skill Skill { get; set; } = null!;
|
||||
public SkillSelectionType SelectionType { get; set; }
|
||||
public int Level { get; set; } = 1;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 技能选择类型
|
||||
/// </summary>
|
||||
public enum SkillSelectionType
|
||||
{
|
||||
ActiveSkill,
|
||||
PassiveSkill,
|
||||
NumericBoost
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 默认职业状态(用于洗点)
|
||||
/// </summary>
|
||||
public class DefaultClassState
|
||||
{
|
||||
public Class? DefaultClass { get; set; }
|
||||
public SubClass? DefaultSubClass { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 职业操作结果
|
||||
/// </summary>
|
||||
public class ClassOperationResult(bool success, string message)
|
||||
{
|
||||
public bool Success { get; } = success;
|
||||
public string Message { get; } = message;
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user