namespace Theater_ECS; using Theater_ECS.Internal.Containers; using System; using System.Collections; abstract class System { public bool Paused = false; //Wether or not this service should be run public float RuntimeDelay = 0; //How many seconds should we wait after running this system private List _Components = new .(10) ~ delete _; ///Get the compoent id and cache it inside of this system public void RegisterComponent(ECS ecs) where T : struct => _Components.Add(ecs.Components.RegisterComponent(typeof(T).GetFullName(.. scope .()), strideof(T))); public abstract void RegisterSystem(ECS ecs); ///Yes surely this is a good idea public virtual void Run(void* p1) { }; public virtual void Run(void* p1, void* p2) { }; public virtual void Run(void* p1, void* p2, void* p3) { }; public virtual void Run(void* p1, void* p2, void* p3, void* p4) { }; public virtual void Run(void* p1, void* p2, void* p3, void* p4, void* p5) { }; public virtual void Run(void* p1, void* p2, void* p3, void* p4, void* p5, void* p6) { }; public virtual void Run(void* p1, void* p2, void* p3, void* p4, void* p5, void* p6, void* p7) { }; public virtual void Run(void* p1, void* p2, void* p3, void* p4, void* p5, void* p6, void* p7, void* p8) { }; public virtual void Run(void* p1, void* p2, void* p3, void* p4, void* p5, void* p6, void* p7, void* p8, void* p9) { }; public void RunSystem(ECS ecs) { int_cosize count = int_cosize.MaxValue; Component comp = _Components[0]; for (var c in _Components) if (ecs.Components.Components[c].Count() < count) { count = ecs.Components.Components[c].Count(); comp = c; } //We now have the list of entities to loop through Span entities = ecs.Components.Components[comp].GetAll(); UList main = ecs.Components.Components[comp].[Friend]_packedEntities; var cun = entities.Length - 1; #region DumbStatement switch (_Components.Count) { case 1: for (int ii < cun) this.Run(main[(.)entities[ii].Index]); case 2: if (comp == _Components[0]) for (int ii < cun) this.Run(main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[1])); else for (int ii < cun) this.Run(ecs.Components.GetData(entities[ii], _Components[0]), main[(.)entities[ii].Index]); case 3: if (comp == _Components[0]) for (int ii < cun) this.Run(main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2])); else if (comp == _Components[1]) for (int ii < cun) this.Run(ecs.Components.GetData(entities[ii], _Components[0]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[2])); else for (int ii < cun) this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), main[(.)entities[ii].Index]); case 4: if (comp == _Components[0]) for (int ii < cun) this.Run(main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3])); else if (comp == _Components[1]) for (int ii < cun) this.Run(ecs.Components.GetData(entities[ii], _Components[0]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[2])); else if (comp == _Components[2]) for (int ii < cun) this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[2])); else for (int ii < cun) this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), main[(.)entities[ii].Index]); case 5: if (comp == _Components[0]) for (int ii < cun) this.Run(main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4])); else if (comp == _Components[1]) for (int ii < cun) this.Run(ecs.Components.GetData(entities[ii], _Components[0]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[4])); else if (comp == _Components[2]) for (int ii < cun) this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[4])); else if (comp == _Components[3]) for (int ii < cun) this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[4])); else for (int ii < cun) this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), main[(.)entities[ii].Index]); case 6: if (comp == _Components[0]) for (int ii < cun) this.Run(main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5])); else if (comp == _Components[1]) for (int ii < cun) this.Run(ecs.Components.GetData(entities[ii], _Components[0]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5])); else if (comp == _Components[2]) for (int ii < cun) this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5])); else if (comp == _Components[3]) for (int ii < cun) this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5])); else if (comp == _Components[4]) for (int ii < cun) this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[5])); else for (int ii < cun) this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4]), main[(.)entities[ii].Index]); case 7: if (comp == _Components[0]) for (int ii < cun) this.Run(main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6])); else if (comp == _Components[1]) for (int ii < cun) this.Run(ecs.Components.GetData(entities[ii], _Components[0]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6])); else if (comp == _Components[2]) for (int ii < cun) this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6])); else if (comp == _Components[3]) for (int ii < cun) this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6])); else if (comp == _Components[4]) for (int ii < cun) this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6])); else if (comp == _Components[5]) for (int ii < cun) this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[6])); else for (int ii < cun) this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), main[(.)entities[ii].Index]); case 8: if (comp == _Components[0]) for (int ii < cun) this.Run(main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6]), ecs.Components.GetData(entities[ii], _Components[7])); else if (comp == _Components[1]) for (int ii < cun) this.Run(ecs.Components.GetData(entities[ii], _Components[0]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6]), ecs.Components.GetData(entities[ii], _Components[7])); else if (comp == _Components[2]) for (int ii < cun) this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6]), ecs.Components.GetData(entities[ii], _Components[7])); else if (comp == _Components[3]) for (int ii < cun) this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6]), ecs.Components.GetData(entities[ii], _Components[7])); else if (comp == _Components[4]) for (int ii < cun) this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6]), ecs.Components.GetData(entities[ii], _Components[7])); else if (comp == _Components[5]) for (int ii < cun) this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[7])); else if (comp == _Components[6]) for (int ii < cun) this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[7])); else for (int ii < cun) this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6]), main[(.)entities[ii].Index]); case 9: if (comp == _Components[0]) for (int ii < cun) this.Run(main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6]), ecs.Components.GetData(entities[ii], _Components[7]), ecs.Components.GetData(entities[ii], _Components[8])); else if (comp == _Components[1]) for (int ii < cun) this.Run(ecs.Components.GetData(entities[ii], _Components[0]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6]), ecs.Components.GetData(entities[ii], _Components[7]), ecs.Components.GetData(entities[ii], _Components[8])); else if (comp == _Components[2]) for (int ii < cun) this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6]), ecs.Components.GetData(entities[ii], _Components[7]), ecs.Components.GetData(entities[ii], _Components[8])); else if (comp == _Components[3]) for (int ii < cun) this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6]), ecs.Components.GetData(entities[ii], _Components[7]), ecs.Components.GetData(entities[ii], _Components[8])); else if (comp == _Components[4]) for (int ii < cun) this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6]), ecs.Components.GetData(entities[ii], _Components[7]), ecs.Components.GetData(entities[ii], _Components[8])); else if (comp == _Components[5]) for (int ii < cun) this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[7]), ecs.Components.GetData(entities[ii], _Components[8])); else if (comp == _Components[6]) for (int ii < cun) this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[7]), ecs.Components.GetData(entities[ii], _Components[8])); else if (comp == _Components[7]) for (int ii < cun) this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[8])); else for (int ii < cun) this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6]), ecs.Components.GetData(entities[ii], _Components[8]), main[(.)entities[ii].Index]); } } #endregion }