using System.Collections.Generic; using UnityEngine; public class ReceptorArray { public string name; public Cluster parent { get; set; } public NucleusArray nuclei; public int size => nuclei.nuclei.Length; public Dictionary thingReceivers = new(); public ReceptorArray(Cluster parent, NucleusArray nuclei) { this.parent = parent; this.nuclei = nuclei; } public virtual void ProcessStimulus(int thingId, Vector3 newLocalPositionVector, string thingName = null) { if (!thingReceivers.TryGetValue(thingId, out INucleus selectedReceiver)) { foreach (IReceptor receptor in this.nuclei.nuclei) { if (receptor is not INucleus receiver) continue; if (thingReceivers.ContainsValue(receiver)) continue; // receiver is not used yet thingReceivers.Add(thingId, receiver); selectedReceiver = receiver; } } //selectedReceiver.outputValue = newLocalPositionVector; /* int receiverIx = 0; INucleus selectedReceiver = null; int selectedReceiverIx = 0; foreach (INucleus receiver in this.receivers) { if (thingIds[receiverIx] == thingId) { // We found an existing receiver for this thing selectedReceiver = receiver; selectedReceiverIx = receiverIx; // Do not look any further break; } else if (receiver.isSleeping) { // A sleeping receiver is not active and can therefore always be used selectedReceiver = receiver; selectedReceiverIx = receiverIx; // Look further because we may find an existing receiver for this thing } else if (selectedReceiver == null) { // If we haven't found a receiver yet, just start by taking the first selectedReceiver = receiver; selectedReceiverIx = receiverIx; } else if (selectedReceiver.isSleeping == false) { // If no existing or sleeping receiver is found, we look for // the receiver with the furthest/least interesting stimulus if (length(receiver.outputValue) < length(selectedReceiver.outputValue)) { // Debug.Log($"{selectedReceiver.name}[{selectedReceiverIx}] {length(selectedReceiver.outputValue)}" + // $" {receiver.name}[{receiverIx}] {length(receiver.outputValue)} "); selectedReceiver = receiver; selectedReceiverIx = receiverIx; } } receiverIx++; } if (selectedReceiverIx >= thingIds.Length) return; thingIds[selectedReceiverIx] = thingId; if (thingName != null) { string baseName = selectedReceiver.name; int colonPos = selectedReceiver.name.IndexOf(":"); if (colonPos > 0) baseName = selectedReceiver.name.Substring(0, colonPos); selectedReceiver.name = baseName + ": " + thingName; } Debug.Log($"Receiver {selectedReceiver.name}[{selectedReceiverIx}] for thing {thingId}"); selectedReceiver.parent.UpdateStateIsolated(); */ } }