Example #1
0
        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);
        }
Example #2
0
        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");
            }
        }