forked from Shardstone/trail-into-darkness
End of refactor for the Entities
This commit is contained in:
@@ -1,14 +1,26 @@
|
||||
using Jovian.InspectorTools;
|
||||
using Jovian.Logger;
|
||||
using Mono.Cecil;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Nox.Game {
|
||||
public interface IModfiersFactory {
|
||||
IReadOnlyCollection<ModifierDefinition> GetAll();
|
||||
ModifierDefinition GetById(Guid modifierId);
|
||||
IReadOnlyCollection<ModifierDefinition> GetModifiersFor(CharacterDefinition character);
|
||||
bool TryAddModifier(CharacterDefinition character, string modiferId);
|
||||
public interface IModifier {
|
||||
string Name { get; }
|
||||
Guid Id { get; }
|
||||
StatType StatType { get; }
|
||||
AttributeType AttributeType { get; }
|
||||
ModifierOperation Operation { get; }
|
||||
float Value { get; }
|
||||
}
|
||||
|
||||
public interface IModifiersFactory {
|
||||
IReadOnlyCollection<IModifier> GetAll();
|
||||
IModifier GetById(Guid modifierId);
|
||||
IReadOnlyCollection<IModifier> GetModifiersFor(IEntityDefinition character);
|
||||
bool TryAddModifier(IEntityDefinition character, Guid modiferId);
|
||||
}
|
||||
|
||||
public enum ModifierOperation {
|
||||
@@ -20,44 +32,65 @@ namespace Nox.Game {
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public sealed class ModifierDefinition {
|
||||
public string name;
|
||||
[ReadOnly]
|
||||
public Guid id = Guid.NewGuid();
|
||||
public StatType statType;
|
||||
public AttributeType attributeType;
|
||||
public ModifierOperation operation;
|
||||
public float value;
|
||||
public sealed class ModifierDefinition : IModifier {
|
||||
[field: SerializeField] public string Name { get; set; }
|
||||
public Guid Id { get; set; }
|
||||
[field: SerializeField] public StatType StatType { get; set; }
|
||||
[field: SerializeField] public AttributeType AttributeType { get; set; }
|
||||
[field: SerializeField] public ModifierOperation Operation { get; set; }
|
||||
[field: SerializeField] public float Value { get; set; }
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public sealed class ModifiersData {
|
||||
public ModifierDefinition[] modifiers;
|
||||
public List<ModifierDefinition> modifiers = new ();
|
||||
}
|
||||
|
||||
public class ModifiersFactory : IModfiersFactory {
|
||||
public class ModifiersFactory : IModifiersFactory {
|
||||
private readonly ModifiersRegistry modifiersRegistry;
|
||||
private readonly Dictionary<Guid, ModifierDefinition> modifierPool = new ();
|
||||
private readonly Dictionary<Guid, IModifier> modifierPool = new ();
|
||||
|
||||
public ModifiersFactory(ModifiersRegistry modifiersRegistry) {
|
||||
this.modifiersRegistry = modifiersRegistry;
|
||||
var allAvailableModifiers = modifiersRegistry.modifiersData;
|
||||
foreach(var modifier in allAvailableModifiers.modifiers) {
|
||||
modifierPool.Add(modifier.id, modifier);
|
||||
modifierPool.Add(modifier.Id, modifier);
|
||||
}
|
||||
}
|
||||
|
||||
public IReadOnlyCollection<ModifierDefinition> GetAll() {
|
||||
public IReadOnlyCollection<IModifier> GetAll() {
|
||||
return modifiersRegistry.modifiersData.modifiers;
|
||||
}
|
||||
public ModifierDefinition GetById(Guid modifierId) {
|
||||
return modifiersRegistry.modifiersData.modifiers.FirstOrDefault(m => m.id == modifierId);
|
||||
public IModifier GetById(Guid modifierId) {
|
||||
return modifiersRegistry.modifiersData.modifiers.FirstOrDefault(m => m.Id == modifierId);
|
||||
}
|
||||
public IReadOnlyCollection<ModifierDefinition> GetModifiersFor(CharacterDefinition character) {
|
||||
throw new NotImplementedException();
|
||||
public IReadOnlyCollection<IModifier> GetModifiersFor(IEntityDefinition character) {
|
||||
return character.Modifiers.modifiers;
|
||||
}
|
||||
public bool TryAddModifier(CharacterDefinition character, string modiferId) {
|
||||
throw new NotImplementedException();
|
||||
public bool TryAddModifier(IEntityDefinition character, Guid modifierId) {
|
||||
if(character == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if(modifierId == Guid.Empty) {
|
||||
GlobalLogger.LogException("Cannot add a modifier with an empty ID!", LogCategory.GameLogic);
|
||||
return false;
|
||||
}
|
||||
|
||||
if(character.Modifiers.modifiers.Any(p => p != null && p.Id == modifierId)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if(!modifierPool.TryGetValue(modifierId, out var modifier)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
character.Perks.perks.Add(new PerkDefinition {
|
||||
Id = modifier.Id,
|
||||
Name = modifier.Name
|
||||
});
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user