Example #1
0
        private void RepairUnmatched <T>(ref List <T> items) where T : StateBase
        {
            string typeName = typeof(T).ToString();

            foreach (T item in items.Copy())
            {
                if (this.controller.IsEnabled() && item.name == "@External")
                {
                    continue;
                }
                StateBehaviour match = this.scripts.Find(x => x.id == item.id);
                if (match == null)
                {
                    match = this.scripts.Find(x => x.alias == item.name);
                    if (match != null)
                    {
                        item.id     = match.id;
                        item.target = match;
                    }
                    else
                    {
                        items.Remove(item);
                    }
                    if (StateTable.debug)
                    {
                        string itemInfo = typeName + " -- " + item.name + " [" + item.id + "]";
                        string action   = match == null ? "Removing" : "Repairing";
                        Log.Show("[StateTable] " + action + " old " + itemInfo, this.gameObject);
                    }
                }
            }
        }
Example #2
0
 public virtual void Setup(string name, StateBehaviour script, StateTable stateTable)
 {
     this.name       = name;
     this.stateTable = stateTable;
     if (script != null)
     {
         this.id     = script.id;
         this.target = script;
     }
 }
Example #3
0
 public StateRequirement(string name = "", StateBehaviour script = null, StateTable stateTable = null)
 {
     this.Setup(name, script, stateTable);
 }
Example #4
0
 public override void Setup(string name = "", StateBehaviour script = null, StateTable stateTable = null)
 {
     this.requirements[0] = new StateRowData();
     base.Setup(name, script, stateTable);
 }
Example #5
0
        public void UpdateTable(StateRow[] table, bool endTable = false)
        {
            bool isOwnerUsable = this.controller.IsNull() || this.controller.IsEnabled() && this.external || this.manual;

            foreach (StateRow row in table)
            {
                bool           isUsable = false;
                bool           isEmpty  = isOwnerUsable;
                bool           isChild  = row.target is StateTable && row.target != this;
                StateBehaviour script   = row.target;
                if (!script.IsEnabled())
                {
                    continue;
                }
                if (isOwnerUsable)
                {
                    foreach (StateRowData requirements in row.requirements)
                    {
                        foreach (StateRequirement requirement in requirements.data)
                        {
                            if (!requirement.target.IsEnabled())
                            {
                                continue;
                            }
                            bool noRequirements = !requirement.requireOn && !requirement.requireOff && !requirement.requireUsed;
                            if (noRequirements)
                            {
                                continue;
                            }
                            bool isExternalColumn = requirement.name == "@External";
                            if (isExternalColumn && !this.manual)
                            {
                                continue;
                            }
                            bool state = requirement.target.active;
                            if (requirement.target.nextState != null)
                            {
                                state = (bool)requirement.target.nextState;
                            }
                            if (isExternalColumn)
                            {
                                state = this.external.Get();
                            }
                            bool mismatchOn   = requirement.requireOn && !state;
                            bool mismatchOff  = requirement.requireOff && state;
                            bool mismatchUsed = requirement.requireUsed && !this.scriptUsed.AddNew(requirement.target);
                            isUsable = !(mismatchOn || mismatchOff || mismatchUsed);
                            isEmpty  = false;
                            if (!isUsable)
                            {
                                break;
                            }
                        }
                        if (isUsable)
                        {
                            break;
                        }
                    }
                }
                var  usable       = isChild ? row.target.As <StateTable>().external : script.usable;
                bool automaticOff = endTable && !this.manual && !isOwnerUsable;
                bool wasUsable    = usable.Get();
                if (automaticOff)
                {
                    isUsable = true;
                }
                if (!endTable)
                {
                    isUsable = isUsable || isEmpty;
                }
                if ((this.advanced && isUsable) || !this.advanced)
                {
                    if (endTable)
                    {
                        isUsable = !isUsable;
                    }
                    usable.Set(isUsable);
                }
                bool changes = usable.Get() != wasUsable;
                if (changes && isChild)
                {
                    var tableTarget = row.target.As <StateTable>();
                    if (tableTarget.IsEnabled())
                    {
                        tableTarget.dirty = true;
                    }
                }
            }
        }