using System.Collections.Generic; using Godot; namespace Babushka.scripts.CSharp.Common.Farming; public partial class FieldService : Node { private Dictionary? _outerDict = null!; public static FieldService Instance { get; private set; } = null!; public override void _EnterTree() { Instance = this; _outerDict = new Dictionary(); } public override void _ExitTree() { Instance = null; _outerDict = null; } //Create public bool TryAddEntry(string sceneName, Vector2I position, FieldBehaviour2D field) { GD.Print("Trying to add a field at: " + position); if (_outerDict != null ) { FieldsInScene innerDict; bool outerDictEntryExists = _outerDict.TryGetValue(sceneName, out innerDict); if (!outerDictEntryExists) { innerDict = new FieldsInScene(); _outerDict.Add(sceneName, innerDict); } if (!innerDict.fields.ContainsKey(position)) { innerDict.fields.Add(position, field); 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(); } }