private void CheckBuilding() { //if (!Input.GetKeyDown(KeyCode.N)) return; if (isWin) { return; } bool changed = false; //Find next map to update. (for not just go linearly) LevelMoment prevMoment = FindOldMoment(); if (prevMoment == null) { updating = false; return; } LevelMoment nextMoment = prevMoment.DeepCopyLevelMoment(); if (prevMoment.terminalBuffer == 0) { prevMoment.terminalBuffer++; } nextMoment.Age(); //Keep track of saved and dead lemming count Vector2Int lemCounts = new Vector2Int(nextMoment.savedLemmings.Count, nextMoment.deadLemmings.Count); //Go one past the last moment if ((lemCounts.x > 0) || (lemCounts.y > 0)) { changed = true; } nextMoment.goal -= lemCounts.x; nextMoment.fail -= lemCounts.y; List <Lemming> movingLemmings = new List <Lemming>(); movingLemmings.AddRange(nextMoment.lemmings); movingLemmings.AddRange(nextMoment.phasedLemmings); nextMoment.lemmings = new List <Lemming>(); nextMoment.savedLemmings = new List <Lemming>(); nextMoment.deadLemmings = new List <Lemming>(); nextMoment.phasedLemmings = new List <Lemming>(); foreach (Lemming lem in movingLemmings) { Vector3Int pos = lem.position; Vector3Int forwardIndex = lem.position + lem.direction; Vector3Int belowIndex = new Vector3Int(pos.x, pos.y - 1, pos.z); GameBlock current = null; GameBlock move = null; GameBlock below = null; current = GetBlock(prevMoment, pos); changed |= true; move = GetBlock(prevMoment, forwardIndex); below = GetBlock(prevMoment, belowIndex); Vector3Int prevPos = lem.position; if (below != null) { below.overMoveBehaviour.Move(nextMoment, prevMoment, lem, below); } if ((move != null) && (prevPos == lem.position)) { move.enterMoveBehaviour.Move(nextMoment, prevMoment, lem, move); } current.exitMoveBehaviour.Move(nextMoment, prevMoment, lem, below); Vector3Int lPos = lem.position;; char key = nextMoment.level[lPos.x, lPos.y, lPos.z]; if (key == GameBoardCubeDictionary.END_ZONE) { nextMoment.savedLemmings.Add(lem); } else if (CheckDead(lem)) { if (nextMoment.LemmingInPhase(lem)) { nextMoment.deadLemmings.Add(lem); } } else { if (nextMoment.LemmingInPhase(lem)) { nextMoment.lemmings.Add(lem); } else { nextMoment.phasedLemmings.Add(lem); } } } if (changed) { if (nextMoment.HasTimeTraveler()) { nextMoment.lemmings.Remove(nextMoment.timeTraveler); } } ProcessSpawners(nextMoment); nextMoment.RecieveTimeTraveler(); LevelData.Instance.CheckPast(nextMoment); //If a new moment was created, add it to the timeline, call event if ((MomentBuiltEvent != null)) { List <LevelMoment> timeline = levelData.moments[nextMoment.phase]; Vector2Int i = new Vector2Int(nextMoment.phase, nextMoment.time); timeline.Add(nextMoment); MomentBuiltEvent(i); } }