using System.Collections.Generic; using Godot; namespace Babushka.scripts.CSharp.Common.Farming; public partial class FieldService : Node { private Dictionary? outerDict; [Signal] public delegate void FieldCreatedEventHandler(); public static FieldService Instance { get; private set; } = null!; public override void _EnterTree() { Instance = this; outerDict = new Dictionary(); } //Create public bool TryAddEntry(string sceneName, Vector2I position, FieldBehaviour2D field) { if (outerDict != null ) { FieldsInScene fieldsInScene; bool outerDictEntryExists = outerDict.TryGetValue(sceneName, out fieldsInScene); if (!outerDictEntryExists) { fieldsInScene = new FieldsInScene(); outerDict.Add(sceneName, fieldsInScene); } if (!fieldsInScene.fields.ContainsKey(position)) { fieldsInScene.fields.Add(position, field); EmitSignal(SignalName.FieldCreated); return true; } } return false; } // Read public FieldBehaviour2D? TryGet(string key, Vector2I fieldPosition) { if (outerDict != null && outerDict.TryGetValue(key, out FieldsInScene? field)) { if (field.fields.TryGetValue(fieldPosition, out FieldBehaviour2D? fieldInstance)) { return fieldInstance; } } return null; } //Update public void UpdateEntry(string key, Vector2I fieldPosition, FieldBehaviour2D state) { if (outerDict != null && outerDict.TryGetValue(key, out FieldsInScene? field)) { if (field.fields.ContainsKey(fieldPosition)) { field.fields[fieldPosition] = state; } else { TryAddEntry(key, fieldPosition, state); } } } //Delete public void RemoveEntry(string key, Vector2I fieldPosition) { if (outerDict != null && outerDict.TryGetValue(key, out FieldsInScene? field)) { if (field.fields.ContainsKey(fieldPosition)) { field.fields.Remove(fieldPosition); } } } } internal class FieldsInScene { public Dictionary fields; public FieldsInScene() { fields = new Dictionary(); } }