public void EneqeueEffect(EffectExecution execution) { EffectExecutionOrderEntry entry = new EffectExecutionOrderEntry { Effect = execution.Effect, ExecutingAction = execution.Context.ExecutingAction, ExecutingRole = execution.Context.ExecutingRole, }; int key = Mode.ExecutionOrder.IndexOf(entry); if (key < 0) { return; } if (!effectQueue.ContainsKey(key) || effectQueue[key] == null) { effectQueue[key] = new List <EffectExecution>(); } effectQueue[key].Add(execution); }
private void OnValidate() { // Build Execution Order List List <EffectExecutionOrderEntry> toRemove = new List <EffectExecutionOrderEntry>(ExecutionOrder); foreach (Role role in Roles) { foreach (Action action in role.Actions) { foreach (BaseEffect effect in action.Effects) { EffectExecutionOrderEntry entry = new EffectExecutionOrderEntry { ExecutingRole = role, ExecutingAction = action, Effect = effect, }; if (!ExecutionOrder.Contains(entry)) { ExecutionOrder.Add(entry); } toRemove.Remove(entry); } } } foreach (EffectExecutionOrderEntry entry in toRemove) { ExecutionOrder.Remove(entry); } // Ensure Roles are Unique HashSet <Role> uniqueRoles = new HashSet <Role>(); List <Role> rolesToRemove = new List <Role>(); foreach (Role role in Roles) { if (!uniqueRoles.Contains(role)) { uniqueRoles.Add(role); } else { rolesToRemove.Add(role); } } foreach (Role role in rolesToRemove) { Roles.Remove(role); } // Ensure variants has entry for each role and no more foreach (Variant variant in Variants) { Dictionary <Role, int> roleCounts = new Dictionary <Role, int>(); List <Variant.Entry> entryRemove = new List <Variant.Entry>(); foreach (Variant.Entry entry in variant.RoleCounts) { if (!Roles.Contains(entry.Role)) { entryRemove.Add(entry); } if (!roleCounts.ContainsKey(entry.Role)) { roleCounts[entry.Role] = 0; } roleCounts[entry.Role]++; } foreach (Variant.Entry entry in entryRemove) { variant.RoleCounts.Remove(entry); } foreach (Role role in Roles) { if (!roleCounts.ContainsKey(role) || roleCounts[role] <= 0) { variant.RoleCounts.Add(new Variant.Entry { Role = role, Count = 0, }); } else if (roleCounts[role] > 1) { for (int i = 0; i < roleCounts[role] - 1; i++) { variant.RoleCounts.RemoveAt(variant.RoleCounts.FindLastIndex((Variant.Entry entry) => entry.Role == role)); } } } } // Ensure there's always at least one variant if (Variants.Count <= 0) { CreateVariant("Default Variant"); } }