added full characte creation support

This commit is contained in:
Sebastian Bularca
2026-04-06 01:05:20 +02:00
parent 419201f2a5
commit 50832c491c
20 changed files with 1037 additions and 265 deletions

View File

@@ -9,10 +9,11 @@ namespace Nox.Game {
public interface IModifier {
string Name { get; }
Guid Id { get; }
StatType StatType { get; }
AttributeType AttributeType { get; }
ModifierTarget Target { get; }
ModifierTarget ScalingSource { get; }
ModifierOperation Operation { get; }
float Value { get; }
IReadOnlyList<ModifierRequirement> Requirements { get; }
}
public interface IModifiersFactory {
@@ -30,20 +31,73 @@ namespace Nox.Game {
Percentage
}
public enum ModifierTargetType {
None,
Attribute,
Stat,
CombatScore
}
[Serializable]
public sealed class ModifierTarget {
[field: SerializeField] public ModifierTargetType Type { get; set; }
[field: SerializeField] public AttributeType AttributeType { get; set; }
[field: SerializeField] public StatType StatType { get; set; }
[field: SerializeField] public CombatScoreType CombatScoreType { get; set; }
public bool Matches(StatType statType) {
return Type == ModifierTargetType.Stat && StatType == statType;
}
public bool Matches(AttributeType attributeType) {
return Type == ModifierTargetType.Attribute && AttributeType == attributeType;
}
public bool Matches(CombatScoreType combatScoreType) {
return Type == ModifierTargetType.CombatScore && CombatScoreType == combatScoreType;
}
public bool IsSet => Type != ModifierTargetType.None;
public override string ToString() {
return Type switch {
ModifierTargetType.Attribute => AttributeType.ToString(),
ModifierTargetType.Stat => StatType.ToString(),
ModifierTargetType.CombatScore => CombatScoreType.ToString(),
_ => "None"
};
}
}
[Serializable]
public sealed class ModifierRequirement {
[field: SerializeField] public AttributeType Attribute { get; set; }
[field: SerializeField] public int MinimumValue { get; set; }
public bool IsMet(EntityAttributes attributes) {
if(Attribute == AttributeType.None || attributes?.attributes == null) {
return true;
}
return attributes.GetValue(Attribute) >= MinimumValue;
}
}
[Serializable]
public sealed class ModifierDefinition : IModifier {
[field: SerializeField] public string Name { get; set; }
public Guid Id { get; set; } = Guid.NewGuid();
[field: SerializeField] public StatType StatType { get; set; }
[field: SerializeField] public AttributeType AttributeType { get; set; }
[field: SerializeField] public ModifierTarget Target { get; set; }
[field: SerializeField] public ModifierTarget ScalingSource { get; set; }
[field: SerializeField] public ModifierOperation Operation { get; set; }
[field: SerializeField] public CombatScoreType CombatScoreType { get; set; }
[field: SerializeField] public float Value { get; set; }
[field: SerializeField] public List<ModifierRequirement> Requirements { get; set; } = new();
IReadOnlyList<ModifierRequirement> IModifier.Requirements => Requirements;
}
[Serializable]
public sealed class ModifiersData {
public List<ModifierDefinition> modifiers = new ();
public List<ModifierDefinition> modifiers = new();
public override string ToString() {
return $"Modifiers: {string.Join(", ", modifiers.Select(modifier => $"{modifier.Name}"))}";
@@ -52,7 +106,7 @@ namespace Nox.Game {
public class ModifiersFactory : IModifiersFactory {
private readonly ModifiersRegistry modifiersRegistry;
private readonly Dictionary<Guid, IModifier> modifierPool = new ();
private readonly Dictionary<Guid, IModifier> modifierPool = new();
public ModifiersFactory(ModifiersRegistry modifiersRegistry) {
this.modifiersRegistry = modifiersRegistry;
@@ -92,10 +146,11 @@ namespace Nox.Game {
character.Modifiers.modifiers.Add(new ModifierDefinition {
Id = modifier.Id,
Name = modifier.Name,
StatType = modifier.StatType,
AttributeType = modifier.AttributeType,
Target = modifier.Target,
ScalingSource = modifier.ScalingSource,
Operation = modifier.Operation,
Value = modifier.Value
Value = modifier.Value,
Requirements = modifier.Requirements?.ToList() ?? new List<ModifierRequirement>()
});
return true;