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) { GD.Print($"Fieldservice: Trying to add a new entry. SceneName: {sceneName} Position: {position}."); 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); GD.Print("Fieldservice: successfully added field to dictionary."); return true; } } GD.Print("Fieldservice: Either no outerdict found or there is already a field here!"); return false; } // Read public FieldBehaviour2D? TryGet(string key, Vector2I fieldPosition) { if (outerDict != null && outerDict.TryGetValue(key, out FieldsInScene? field)) { GD.Print($"Fieldservice: Successfully retrieved fieldsPerScene Dictionary. " + $"OuterDict Count: {outerDict.Count} InnerDict Count {outerDict[key].fields.Count}"); if (field.fields.TryGetValue(fieldPosition, out FieldBehaviour2D? fieldInstance)) { GD.Print($"Fieldservice: Successfully retrieved fieldInstance at position: {fieldPosition}."); return fieldInstance; } } GD.Print("Fieldservice TryGet: No field found."); return null; } //Update public void UpdateEntry(string key, Vector2I fieldPosition, FieldBehaviour2D state) { GD.Print($"FieldService: Updating entry at {fieldPosition}"); 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) { GD.Print($"FieldService: Removing entry at {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(); } }