namespace Theater_ECS; using System; using System.Reflection; using System.Collections; [AttributeUsage(.Method)] struct SystemMethodAttribute : Attribute, IOnTypeInit { private StringView _Name; private Span _Types; public this(StringView name, params Span types) { _Name = name; _Types = types; } [Comptime] public void OnTypeInit(Type type, Self* prev) { //InitializeFunction Compiler.EmitTypeBody(type, scope $""" public override bool IntializeSystem(ECS ecs) \{ {InitializeSystemTypes( .. scope .())} return true; \} """); Compiler.EmitTypeBody(type, scope $""" [System.DisableChecks] public override void RunSystem(ECS ecs) \{ Lock(ecs); Component lowest = System.int_cosize.MaxValue; System.int_cosize lowestAmount = System.int_cosize.MaxValue; for(var c in _ComponentMap) \{ if(ecs.[System.Friend]_ComponentsPacked[c.value].Count < lowestAmount) \{ lowest = c.value; lowestAmount = ecs.[System.Friend]_ComponentsPacked[c.value].Count; \} \} ecs.GetEntityFromComponent(lowest, _Target); {CacheComponentData(.. scope .())} for(var e in _Target) \{ {_Name}( {GetComponentData(.. scope .())} ); \} _Target.Clear(); Unlock(ecs); \} private void Lock(ECS ecs) \{ for(var i in _ComponentMap) ecs.[System.Friend]_ComponentsPacked[i.value].Use(); \} private void Unlock(ECS ecs) \{ for(var i in _ComponentMap) ecs.[System.Friend]_ComponentsPacked[i.value].StopUsing(); \} """); } private void InitializeSystemTypes(String buffer) { for(var i in _Types) { buffer.Append(scope $""" if(ecs.GetComponent<{i.GetName( .. scope .())}>() == -1) return false; _ComponentMap.Add(typeof({i.GetName(.. scope .())}), ecs.GetComponent<{i.GetName( .. scope .())}>()); """); } } private void GetComponentData(String buffer) { for(var i in _Types) { buffer.Append(scope $""" ref *ecs.[System.Friend]_ComponentsPacked[_{i.GetName(.. scope .())}].Get<{i.GetName(.. scope .())}>(ecs.[System.Friend]_EntityList[_{i.GetName(.. scope .())}][e]) """); if(@i.Index+1 < _Types.Length) buffer.Append(",\n"); } } private void CacheComponentData(String buffer) { for(var i in _Types) { buffer.Append(scope $"Component _{i.GetName(.. scope .())} = _ComponentMap[typeof({i.GetName(.. scope .())})];\n"); } } }