public override void Update(GameTime gameTime) { if (!IsLoading) { // Defined with respect to current mouse position. Coord2D mouseIsoFlatCoord = World.MousePositionToIsoFlatCoord(MainGame); Coord2D mouseIsoCoord = World.MousePositionToIsoCoord(MainGame, Altitude); // User input actions. if (Peripherals.KeyTapped(Keys.Q) && MainGame.IsActive) { var i = (int)Authorization + 1; if (i >= Enum.GetNames(typeof(Authorization)).Length) { i = 0; } Authorization = (Authorization)(i); } if (Peripherals.KeyTapped(Keys.L) && MainGame.IsActive) { $"Altitude = {Altitude}".Log(); mouseIsoCoord.ToString().Log(); } if (Authorization == Authorization.Builder) { if (Peripherals.LeftButtonPressed() && MainGame.IsActive) { BuildWorldObject(mouseIsoFlatCoord, mouseIsoCoord); } if (Peripherals.RightButtonPressed() && MainGame.IsActive) { RemoveWorldObject(mouseIsoFlatCoord, mouseIsoCoord); } } // Ghost marker management. if (Authorization == Authorization.Builder) { GhostMarker.Altitude = Altitude; GhostMarker.Coords = mouseIsoCoord; } else if (Authorization == Authorization.None) { // Top down look. for (int i = 30; i > -30; i--) { var targetedCoord = World.GetIsoCoord(mouseIsoFlatCoord, i); if (LayerMap.ContainsKey(new Coord3D(targetedCoord, i)) && !(LayerMap[new Coord3D(targetedCoord, i)] is Deco)) { Altitude = i; GhostMarker.Altitude = Altitude; break; } } GhostMarker.Coords = World.MousePositionToIsoCoord(MainGame, Altitude); } // Test GhostMarker.Position = World.IsoFlatCoordToWorldPosition(mouseIsoFlatCoord); if (LayerMap.ContainsKey(new Coord3D(mouseIsoCoord, Altitude)) || Authorization == Authorization.None) { GhostMarker.DrawDefaultMarker = true; } else if (Authorization == Authorization.Builder) { GhostMarker.DrawDefaultMarker = false; } if (LayerMap.ContainsKey(new Coord3D(mouseIsoCoord, Altitude))) { GhostMarker.DrawPriority = 1; } else if (Authorization == Authorization.Builder) { GhostMarker.DrawPriority = 0; } else if (Authorization == Authorization.None) { // If !LayerMap[Altitude].OccupiedCoords.Contains(mouseIsoCoord), we are in empty space // and always draw last. GhostMarker.DrawPriority = -1000; } GhostMarker.IsHidden = !MainGame.IsMouseOver; if (Authorization == Authorization.None) { if (Peripherals.LeftButtonTapped()) { ClickAnimation.Position = GhostMarker.Position; ClickAnimation.Coords = GhostMarker.Coords; ClickAnimation.Altitude = GhostMarker.Altitude; ClickAnimation.DrawPriority = GhostMarker.DrawPriority; ClickAnimation.Animator.AnimationFinished = false; ClickAnimation.Animator.Reconfigure(new AnimArgs(1, 7, 0.066f, AnimationState.Once)); } } ClickAnimation.Update(gameTime); // Player management. //Player.Altitude = 1; #region Pre Loop // Rearrange sprites into their correct altitude layer. //var altitudeList = LayerMap.Keys.ToList(); //altitudeList.Sort(); //foreach (var altitude in altitudeList) //{ // for (int i = 0; i < LayerMap[altitude].Count(); i++) // { // var sprite = LayerMap[altitude][i]; // if (sprite.Altitude != altitude) // { // LayerMap[altitude].Remove(sprite); i--; // if (!LayerMap.ContainsKey(sprite.Altitude)) // { // LayerMap.Add(sprite.Altitude, new SpriteList<Sprite>() { sprite }); // } // else // { // if (!(sprite is IWorldObject)) // { // LayerMap[sprite.Altitude].Add(sprite); // } // else // { // throw new NotImplementedException("Cube/Deco trying to move between layers, is this correct? Use AddCheck if so."); // } // } // } // } //} #endregion #region Main Loop Sort(); foreach (var sprite in OrderedLayerMap) { sprite.Update(gameTime); } #endregion } }