Untitled
unknown
csharp
6 months ago
12 kB
2
Indexable
static class Scheduler { public static float ticksPerSecond = 120; // public static bool _HOLD_ { get; private set; } = false; // public static int totalTickTimer { get; private set; } = 0; static bool clock = false; static int pulseCalculationsRunning = 0; //Dictionary< startTick, Dictionary< precedence, List<PulseGroupGroup> > > static Dictionary<int, Dictionary< int, List<PulseGroupGroup> >> scheduledPulseGroupGroups = new Dictionary<int, Dictionary< int, List<PulseGroupGroup> >>(6); //Dictionary< startTick, Dictionary< precedence, List<PulseGroup> > > static Dictionary<int, Dictionary< int, List<PulseGroup> >> scheduledPulseGroups = new Dictionary<int, Dictionary< int, List<PulseGroup> >>(9); //Dictionary< startTick, Dictionary< precedence, List<Pulse> > > static Dictionary<int, Dictionary< int, List<Pulse> >> scheduledPulses = new Dictionary<int, Dictionary< int, List<Pulse> >>(512); static Dictionary<Vector2, ( Pulse, int endframe, int precedence )> runningPulses = new Dictionary<Vector2, ( Pulse, int endframe, int precedence )>(64); public static async void AwaitPulseCalcDoneThenCycle() { if (_HOLD_) while (_HOLD_) { await Task.Delay(1); } if ( pulseCalculationsRunning != 0 ) { _HOLD_ = true; while ( pulseCalculationsRunning != 0 ) { await Task.Delay(1); } _HOLD_ = false; } _Cycle(); } static void _Cycle() { _HOLD_ = true; clock = !clock; totalTickTimer++; _FrameUpdate(); } static void _FrameUpdate() { bool tickHasScheduledPulseGG = scheduledPulseGroupGroups.TryGetValue(totalTickTimer, out var pGGPrecedenceDict); if (tickHasScheduledPulseGG) { for (int precedence = 0; precedence < 10; precedence++) { if (!scheduledPulseGroupGroups.ContainsKey(precedence)) continue; List<PulseGroupGroup> pulseGGList = pGGPrecedenceDict[precedence]; foreach (var pulseGG in pulseGGList) { GroupConfig pulseGGConfig = pulseGG.groupConfig; int tickTimerCalc = pulseGGConfig.framesBeforeStarting; foreach (var pulseG in pulseGG.GetPulseGroups()) { GroupConfig pulseGConfig = pulseG.groupConfig; SchedulePulseGroup(pulseG, tickTimerCalc); tickTimerCalc += pulseGGConfig.framesBetweenElements; } scheduledPulseGroupGroups[totalTickTimer][precedence].Remove(pulseGG); } } } bool tickHasScheduledPulseG = scheduledPulseGroups.TryGetValue(totalTickTimer, out var pGPrecedenceDict); if (tickHasScheduledPulseG) { for (int precedence = 0; precedence < 10; precedence++) { if (!scheduledPulseGroups.ContainsKey(precedence)) continue; List<PulseGroup> pulseGList = pGPrecedenceDict[precedence]; foreach (var pulseG in pulseGList) { GroupConfig pulseGConfig = pulseG.groupConfig; int tickTimerCalc = pulseGConfig.framesBeforeStarting; foreach (var pulse in pulseG.GetPulses()) { PulseConfig pulseConfig = pulse.config; SchedulePulse(pulse, tickTimerCalc); tickTimerCalc += pulseGConfig.framesBetweenElements; } scheduledPulseGroups[totalTickTimer][precedence].Remove(pulseG); } } } bool tickHasScheduledPulse = scheduledPulses.TryGetValue(totalTickTimer, out var pPrecedenceDict); if (tickHasScheduledPulse) { for (int precedence = 0; precedence < 10; precedence++) { if (!scheduledPulseGroups.ContainsKey(precedence)) continue; List<Pulse> pulseList = pPrecedenceDict[precedence]; foreach (var pulse in pulseList) { PulseConfig pulseConfig = pulse.config; SchedulePulse(pulse, tickTimerCalc); tickTimerCalc += pulseGConfig.framesBetweenElements; } scheduledPulseGroups[totalTickTimer][precedence].Remove(pulseG); } } } _HOLD_ = false; } public static void SchedulePulse( Pulse pulse, int startInXTicks ) { PulseConfig config = pulse.config; int startOnTick = (totalTickTimer + 1) + startInXTicks; scheduledPulses.TryAdd( startOnTick, new Dictionary< int, List<Pulse> >(10) ); scheduledPulses[startOnTick].TryAdd( config.precedence, new List<Pulse>(128) ); scheduledPulses[startOnTick][config.precedence].Add(pulse); } public static void SchedulePulseGroup( PulseGroup pulseGroup, int startInXTicks ) { GroupConfig config = pulseGroup.groupConfig; int startOnTick = (totalTickTimer + 1) + startInXTicks; scheduledPulseGroups.TryAdd( startOnTick, new Dictionary< int, List<PulseGroup> >(10) ); scheduledPulseGroups[startOnTick].TryAdd(config.precedence, new List<PulseGroup>(32) ); scheduledPulseGroups[startOnTick][config.precedence].Add(pulseGroup); } public static void SchedulePulseGroupGroup( PulseGroupGroup pulseGroupGroup, int startInXTicks ) { GroupConfig config = pulseGroupGroup.groupConfig; int startOnTick = (totalTickTimer + 1) + startInXTicks; scheduledPulseGroupGroups.TryAdd( startOnTick, new Dictionary< int, List<PulseGroupGroup> >(10) ); scheduledPulseGroupGroups[startOnTick].TryAdd(config.precedence, new List<PulseGroupGroup>(8) ); scheduledPulseGroupGroups[startOnTick][config.precedence].Add(pulseGroupGroup); } } class PulseGroup { public GroupConfig groupConfig; List<Pulse> pulseGroup; public HashSet< Vector2 > pulsePositions; public PulseGroup( List<Pulse> pulses, GroupConfig config ) { pulseGroup = pulses; groupConfig = config; pulsePositions = new HashSet<Vector2>(pulses.Count); foreach (var pulse in pulses) { pulsePositions.Add( pulse.config.position ); } } public PulseGroup( int size, GroupConfig config ) { pulseGroup = new List<Pulse>(size); groupConfig = config; pulsePositions = new HashSet<Vector2>(size); } public PulseGroup( int size ) { pulseGroup = new List<Pulse>(size); pulsePositions = new HashSet<Vector2>(size); } public void SetConfig( GroupConfig config ) { groupConfig = config; } public void Add( Pulse pulse ) { pulseGroup.Add(pulse); pulsePositions.Add(pulse.config.position); } public List<Pulse> GetPulses() { if (groupConfig is null) throw new Exception("GroupConfig was null, you must set it before attempting to get the list of pulses"); //this don't diggidy dang work because you set the size beforehand- remember that if it comes up and maybe fix it too if (pulsePositions.Count != pulseGroup.Count) throw new Exception("Count of pulsePositions does not match count of pulses in pulseGroup"); return pulseGroup; } } public class GroupConfig { public int precedence { get; private set; } = 4; public int framesBeforeStarting { get; private set; } = 0; public int framesBetweenElements { get; private set; } = 0; public GroupConfig( int _precedenceLevel, int _framesBetweenElements, int _framesBeforeStarting ) { precedence = _precedenceLevel; framesBeforeStarting = _framesBeforeStarting; framesBetweenElements = _framesBetweenElements; } } class PulseGroupGroup { public GroupConfig groupConfig; List<PulseGroup> pulseGroupGroup; public PulseGroupGroup( int size, GroupConfig config ) { pulseGroupGroup = new List<PulseGroup>(size); groupConfig = config; } public void Add( PulseGroup pulseGroup ) { pulseGroupGroup.Add(pulseGroup); } public List<PulseGroup> GetPulseGroups() { if (groupConfig is null) throw new Exception("GroupConfig was null"); return pulseGroupGroup; } } public class PulseConfig { public enum BreakMode { BreakDuringTick, BreakAfterCycle, NeverBreak }; public int precedence = 4; public Color resetColour = new Color(0, 0, 0, 0); public Color cachedColour = new Color(0, 0, 0, 0); public Vector2 position { get; private set; } public Color colour { get; private set; } public int holdColourForXFrames { get; private set; } public int lerpInXFrames { get; private set; } public int runXTimes { get; private set; } public BreakMode breakMode { get; private set; } = BreakMode.BreakDuringTick; public PulseConfig( Vector2 _position, Color _colour, Color _resetColour, int _precedenceLevel, int _holdColourForXFrames, int _lerpInXFrames, int _howManyTimes ) { position = _position; precedence = _precedenceLevel; colour = _colour; resetColour = _resetColour; holdColourForXFrames = _holdColourForXFrames; lerpInXFrames = _lerpInXFrames; runXTimes = _howManyTimes; } public PulseConfig( Vector2 _position, Color _colour, int _precedenceLevel, int _holdColourForXFrames, int _lerpInXFrames, int _howManyTimes ) { position = _position; colour = _colour; precedence = _precedenceLevel; holdColourForXFrames = _holdColourForXFrames; lerpInXFrames = _lerpInXFrames; runXTimes = _howManyTimes; } public PulseConfig( Vector2 _position, Color _colour, int _precedenceLevel, int _holdColourForXFrames, int _lerpInXFrames, int _howManyTimes, BreakMode _breakMode ) { position = _position; precedence = _precedenceLevel; colour = _colour; holdColourForXFrames = _holdColourForXFrames; lerpInXFrames = _lerpInXFrames; runXTimes = _howManyTimes; breakMode = _breakMode; } public PulseConfig( Vector2 _position, Color _colour, Color _resetColour, int _precedenceLevel, int _holdColourForXFrames, int _lerpInXFrames, int _howManyTimes, BreakMode _breakMode ) { position = _position; precedence = _precedenceLevel; colour = _colour; resetColour = _resetColour; holdColourForXFrames = _holdColourForXFrames; lerpInXFrames = _lerpInXFrames; runXTimes = _howManyTimes; breakMode = _breakMode; } } public class Pulse { public PulseConfig config; public int pulseFrameDuration; public int pulseFramesRan; //OLD SHITTY UNUSED SHIT FROM BEFORE REWRITE//// //public bool __clearQueueWhenBreak = false; //public bool __clearQueueWhenEnd = false; //public bool __forceInsertAtQueueStart = false; //public bool __clearOtherQueuePulsesWhenCyclesEnd__ = false; //public bool forceStart = false; //public bool __forceEnd__ = false; //public bool __forceBreak__ = false; //// //// public Pulse( PulseConfig _config ) { config = _config; } public void Break() { } }
Editor is loading...
Leave a Comment