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); } } } }
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; } }
public StateRequirement(string name = "", StateBehaviour script = null, StateTable stateTable = null) { this.Setup(name, script, stateTable); }
public override void Setup(string name = "", StateBehaviour script = null, StateTable stateTable = null) { this.requirements[0] = new StateRowData(); base.Setup(name, script, stateTable); }
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; } } } }