using System.Collections.Generic; using System.Linq; using UnityEngine; using System.Diagnostics.Contracts; // The round-robin assignment class assigns interceptors to the targets in a // round-robin order using the new paradigm. public class RoundRobinAssignment : IAssignment { // Previous target index that was assigned. private int prevTargetIndex = -1; // Assign a target to each interceptor that has not been assigned a target yet. [Pure] public IEnumerable Assign(in IReadOnlyList interceptors, in IReadOnlyList targets) { List assignments = new List(); // Get the list of interceptors that are available for assignment. List assignableInterceptors = IAssignment.GetAssignableInterceptors(interceptors); if (assignableInterceptors.Count == 0) { return assignments; } // Get the list of active threats that need to be addressed. List activeThreats = IAssignment.GetActiveThreats(targets); if (activeThreats.Count == 0) { return assignments; } // Perform round-robin assignment. foreach (Interceptor interceptor in assignableInterceptors) { // Determine the next target index in a round-robin fashion. int nextTargetIndex = (prevTargetIndex + 1) % activeThreats.Count; ThreatData selectedThreat = activeThreats[nextTargetIndex]; // Assign the interceptor to the selected threat. assignments.Add(new IAssignment.AssignmentItem(interceptor, selectedThreat.Threat)); // Update the previous target index. prevTargetIndex = nextTargetIndex; } return assignments; } }