public void Simulate(List <AbstractBuffEvent> logs, long fightDuration) { if (GenerationSimulation.Any()) { return; } long firstTimeValue = logs.Count > 0 ? Math.Min(logs.First().Time, 0) : 0; long timeCur = firstTimeValue; long timePrev = firstTimeValue; foreach (AbstractBuffEvent log in logs) { timeCur = log.Time; if (timeCur - timePrev < 0) { throw new InvalidOperationException("Negative passed time in boon simulation"); } Update(timeCur - timePrev); log.UpdateSimulator(this); timePrev = timeCur; } Update(fightDuration - timePrev); GenerationSimulation.RemoveAll(x => x.Duration <= 0); Clear(); Trim(fightDuration); }
protected override void Update(long timePassed) { if (BuffStack.Any() && timePassed > 0) { long diff = timePassed; long leftOver = 0; if (_activeStack != null && _activeStack.Duration > 0) { var toAdd = new BuffSimulationItemDuration(_activeStack); GenerationSimulation.Add(toAdd); long timeDiff = _activeStack.Duration - timePassed; if (timeDiff < 0) { diff = _activeStack.Duration; leftOver = timePassed - diff; } if (toAdd.End > toAdd.Start + diff) { toAdd.OverrideEnd(toAdd.Start + diff); } _activeStack.Shift(0, diff); } foreach (BuffStackItemID buffStackItem in BuffStack) { buffStackItem.Shift(diff, 0); } Update(leftOver); } }
protected override void Update(long timePassed) { if (BuffStack.Count > 0 && timePassed > 0) { var toAdd = new BuffSimulationItemIntensity(BuffStack); GenerationSimulation.Add(toAdd); long diff = Math.Min(BuffStack.Min(x => x.Duration), timePassed); long leftOver = timePassed - diff; if (toAdd.End > toAdd.Start + diff) { toAdd.OverrideEnd(toAdd.Start + diff); } // Subtract from each for (int i = BuffStack.Count - 1; i >= 0; i--) { BuffStack[i].Shift(diff, diff); } for (int i = BuffStack.Count - 1; i >= 0; i--) { if (BuffStack[i].Duration == 0) { BuffStack[i].Shift(0, -leftOver); } } Update(leftOver); } }
// Public Methods protected override void Update(long timePassed) { if (BoonStack.Count > 0) { var toAdd = new BoonSimulationItemDuration(BoonStack[0]); if (GenerationSimulation.Count > 0) { var last = GenerationSimulation.Last(); if (last.End > toAdd.Start) { last.SetEnd(toAdd.Start); } } GenerationSimulation.Add(toAdd); BoonStack[0] = new BoonStackItem(BoonStack[0], timePassed, timePassed); long diff = timePassed - Math.Abs(Math.Min(BoonStack[0].BoonDuration, 0)); for (int i = 1; i < BoonStack.Count; i++) { BoonStack[i] = new BoonStackItem(BoonStack[i], diff, 0); } if (BoonStack[0].BoonDuration <= 0) { // Spend leftover time long leftover = Math.Abs(BoonStack[0].BoonDuration); BoonStack.RemoveAt(0); Update(leftover); } } }
// Public Methods protected override void Update(long timePassed) { if (BoonStack.Count > 0 && timePassed > 0) { _lastSrcRemoves.Clear(); var toAdd = new BoonSimulationItemIntensity(BoonStack); if (GenerationSimulation.Count > 0) { BoonSimulationItem last = GenerationSimulation.Last(); if (last.End > toAdd.Start) { last.SetEnd(toAdd.Start); } } GenerationSimulation.Add(toAdd); long diff = Math.Min(BoonStack.Min(x => x.BoonDuration), timePassed); long leftOver = timePassed - diff; // Subtract from each for (int i = BoonStack.Count - 1; i >= 0; i--) { var item = new BoonStackItem(BoonStack[i], diff, diff); BoonStack[i] = item; if (item.BoonDuration == 0) { _lastSrcRemoves.Add(item.SeedSrc); } } BoonStack.RemoveAll(x => x.BoonDuration == 0); Update(leftOver); } }
protected override void Update(long timePassed) { if (BuffStack.Any() && timePassed > 0) { long diff = timePassed; long leftOver = 0; var activeStacks = BuffStack.Where(x => x.Active && x.Duration > 0).Take(_capacity).ToList(); if (activeStacks.Any()) { var toAdd = new BuffSimulationItemIntensity(activeStacks); GenerationSimulation.Add(toAdd); long currentDur = activeStacks.Min(x => x.Duration); long timeDiff = currentDur - timePassed; if (timeDiff < 0) { diff = currentDur; leftOver = timePassed - diff; } if (toAdd.End > toAdd.Start + diff) { toAdd.OverrideEnd(toAdd.Start + diff); } foreach (BuffStackItemID buffStackItem in activeStacks) { buffStackItem.Shift(0, diff); } } foreach (BuffStackItemID buffStackItem in BuffStack) { buffStackItem.Shift(diff, 0); } Update(leftOver); } }
protected override void Update(long timePassed) { if (BuffStack.Any() && timePassed > 0) { long diff = timePassed; long leftOver = 0; if (_activeStack != null && _activeStack.Duration > 0) { var toAdd = new BuffSimulationItemDuration(BuffStack); GenerationSimulation.Add(toAdd); long timeDiff = _activeStack.Duration - timePassed; if (timeDiff < 0) { diff = _activeStack.Duration; leftOver = timePassed - diff; } if (toAdd.End > toAdd.Start + diff) { toAdd.OverrideEnd(toAdd.Start + diff); } _activeStack.Shift(0, diff); // keep current stack alive while waiting for stack active/ stack remove to arrive if (_activeStack.Duration == 0 && leftOver > 0 && leftOver < ParserHelper.BuffSimulatorStackActiveDelayConstant) { _activeStack.Shift(0, -leftOver); } } foreach (BuffStackItemID buffStackItem in BuffStack) { buffStackItem.Shift(diff, 0); } Update(leftOver); } }
protected override void Update(long timePassed) { if (BuffStack.Any() && timePassed > 0) { List <BuffStackItemID> BuffStackToUse = BuffStack; long diff = Math.Min(BuffStackToUse.Min(x => x.Duration), timePassed); if (diff == 0) { BuffStackToUse = BuffStack.Where(x => x.Duration > 0).ToList(); if (!BuffStackToUse.Any()) { return; } diff = Math.Min(BuffStackToUse.Min(x => x.Duration), timePassed); } var toAdd = new BuffSimulationItemIntensity(BuffStackToUse); GenerationSimulation.Add(toAdd); long leftOver = timePassed - diff; if (toAdd.End > toAdd.Start + diff) { toAdd.OverrideEnd(toAdd.Start + diff); } // Subtract from each from the original stack so that everyone's time start are shifted foreach (BuffStackItemID buffStackItem in BuffStack) { buffStackItem.Shift(diff, diff); } Update(leftOver); } }
// Abstract Methods /// <summary> /// Make sure the last element does not overflow the fight /// </summary> /// <param name="fightDuration">Duration of the fight</param> private void Trim(long fightDuration) { for (int i = GenerationSimulation.Count - 1; i >= 0; i--) { BuffSimulationItem data = GenerationSimulation[i]; if (data.End > fightDuration) { data.OverrideEnd(fightDuration); } else { break; } } GenerationSimulation.RemoveAll(x => x.Duration <= 0); }
// Use this for initialization void Start() { creaturesInfo = new int[population, 3, 6]; for (int i = 0; i < population; i++) { for (int j = 0; j < 6; j++) { int a = Random.Range(0, 64); int b = Random.Range(1, 16); creaturesInfo[i, 0, j] = a; creaturesInfo[i, 1, j] = b; } creaturesInfo[i, 2, 0] = 0; } genNum = 0; generationSim = GetComponent <GenerationSimulation>(); print("GEN: " + genNum); runGeneration(); }
// Public Methods protected override void Update(long timePassed) { if (BoonStack.Count > 0 && timePassed > 0) { _lastSrcRemove = 0; var toAdd = new BoonSimulationItemDuration(BoonStack[0]); if (GenerationSimulation.Count > 0) { var last = GenerationSimulation.Last(); if (last.End > toAdd.Start) { last.SetEnd(toAdd.Start); } } GenerationSimulation.Add(toAdd); long timeDiff = BoonStack[0].BoonDuration - timePassed; long diff = 0; long leftOver = 0; if (timeDiff < 0) { diff = BoonStack[0].BoonDuration; leftOver = timePassed - diff; } else { diff = timePassed; } BoonStack[0] = new BoonStackItem(BoonStack[0], diff, diff); for (int i = 1; i < BoonStack.Count; i++) { BoonStack[i] = new BoonStackItem(BoonStack[i], diff, 0); } if (BoonStack[0].BoonDuration == 0) { _lastSrcRemove = BoonStack[0].SeedSrc; BoonStack.RemoveAt(0); } Update(leftOver); } }
protected override void Update(long timePassed) { if (BuffStack.Count > 0 && timePassed > 0 && _activeStack != null) { var toAdd = new BuffSimulationItemDuration(_activeStack); GenerationSimulation.Add(toAdd); long timeDiff = _activeStack.Duration - timePassed; long diff; long leftOver = 0; if (timeDiff < 0) { diff = _activeStack.Duration; leftOver = timePassed - diff; } else { diff = timePassed; } if (toAdd.End > toAdd.Start + diff) { toAdd.OverrideEnd(toAdd.Start + diff); } BuffStackItem oldActive = _activeStack; _activeStack.Shift(diff, diff); for (int i = 0; i < BuffStack.Count; i++) { if (BuffStack[i] != oldActive) { BuffStack[i].Shift(diff, 0); } } // that means the stack was not an extension, extend duration to match time passed if (_activeStack.Duration == 0) { _activeStack.Shift(0, -leftOver); } Update(leftOver); } }
// Public Methods protected override void Update(long timePassed) { if (BoonStack.Count > 0) { var toAdd = new BoonSimulationItemIntensity(BoonStack); if (GenerationSimulation.Count > 0) { BoonSimulationItem last = GenerationSimulation.Last(); if (last.End > toAdd.Start) { last.SetEnd(toAdd.Start); } } GenerationSimulation.Add(toAdd); // Subtract from each for (int i = BoonStack.Count - 1; i >= 0; i--) { var item = new BoonStackItem(BoonStack[i], timePassed, timePassed); BoonStack[i] = item; } BoonStack.RemoveAll(x => x.BoonDuration < 1); } }