12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- package me.hammerle.supersnuvi.snuviscript;
- import java.util.ArrayList;
- import me.hammerle.snuviscript.code.ISnuviScheduler;
- import me.hammerle.supersnuvi.gamelogic.Level;
- public class SnuviScheduler implements ISnuviScheduler
- {
- private static class Task
- {
- private final Runnable r;
- private long ticks;
- private final Level owner;
-
- private Task(Runnable r, long ticks, Level owner)
- {
- this.r = r;
- this.ticks = ticks;
- this.owner = owner;
- }
-
- private boolean tick(Level current)
- {
- if(current != owner && owner != null)
- {
- return false;
- }
- ticks--;
- if(ticks <= 0)
- {
- r.run();
- return true;
- }
- return false;
- }
- }
-
- private int id = 0;
- private final ArrayList<Task> queue = new ArrayList<>();
-
- private Level currentLevel = null;
-
- public void setActiveLevel(Level l)
- {
- currentLevel = l;
- }
-
- @Override
- public int scheduleTask(Runnable r, long delay)
- {
- queue.add(new Task(r, Math.max(delay, 2), currentLevel));
- return id++;
- }
-
- @Override
- public int scheduleTask(Runnable r)
- {
- return scheduleTask(r, 2);
- }
-
- public void tick(Level current)
- {
- int i = 0;
- while(i < queue.size())
- {
- if(queue.get(i).tick(current))
- {
- if(i + 1 == queue.size())
- {
- // last element
- queue.remove(i);
- }
- else
- {
- // swap last
- queue.set(i, queue.get(queue.size() - 1));
- queue.remove(queue.size() - 1);
- // current element is a new one, skip i++
- continue;
- }
- }
- i++;
- }
- }
- }
|