public void BuildWorldObject(Coord2D mouseIsoFlatCoord, Coord2D mouseIsoCoord) { Coord3D mouseIsoCoord3D = new Coord3D(mouseIsoCoord, Altitude); if (BuildMode == BuildMode.Cube) { // Create cube and add it to the layer map. var cube = CubeFactory.CreateCurrentCube(mouseIsoFlatCoord, mouseIsoCoord3D); if (!LayerMap.ContainsKey(mouseIsoCoord3D)) { LayerMap.Add(mouseIsoCoord3D, cube); } // Deal with the walkable tile table. foreach (var coord in mouseIsoCoord.AdjacentCoords()) { // If there are no solid objects above us, if (!(LayerMap.ContainsKey(new Coord3D(mouseIsoCoord, Altitude + 1)) && LayerMap[new Coord3D(mouseIsoCoord, Altitude + 1)].IsSolid)) // not- contains key and sprite is solid { WalkableTileTable.Add(Altitude + 1, coord, mouseIsoCoord); } // Assuming the added cube is solid, the tile under us is no longer walkable. if (cube.IsSolid) { WalkableTileTable.Remove(Altitude, coord, mouseIsoCoord); } } } else if (BuildMode == BuildMode.Deco) { // Create deco and add it to the layer map. var deco = DecoFactory.CreateCurrentDeco(mouseIsoFlatCoord, mouseIsoCoord, Altitude); if (deco.OccupiedCoords.Any((c) => LayerMap.ContainsKey(c)) == false) { LayerMap.Add(mouseIsoCoord3D, deco); foreach (var coord in deco.OccupiedCoords) { if (coord != mouseIsoCoord3D) { LayerMap.Add(coord, new DecoReference(deco, mouseIsoCoord3D) { Coords = coord.To2D(), Altitude = coord.Z }); } foreach (var _coord in new Coord2D(coord.X, coord.Y).AdjacentCoords()) { // Assuming the added deco is solid, the tiles under us are no longer walkable. if (deco.IsSolid) { WalkableTileTable.Remove(Altitude, _coord, new Coord2D(coord.X, coord.Y)); } } } } } }
public void RemoveWorldObject(Coord2D mouseIsoFlatCoord, Coord2D mouseIsoCoord) { Coord3D mouseIsoCoord3D = new Coord3D(mouseIsoCoord, Altitude); if (BuildMode == BuildMode.Cube && LayerMap.ContainsKey(mouseIsoCoord3D)) { var sprite = LayerMap[mouseIsoCoord3D]; if (sprite is Cube) { LayerMap.Remove(mouseIsoCoord3D); foreach (var coord in mouseIsoCoord.AdjacentCoords()) { WalkableTileTable.Remove(Altitude + 1, coord, mouseIsoCoord); } // If there is a cube below, if (LayerMap.ContainsKey(new Coord3D(mouseIsoCoord, Altitude - 1)) && LayerMap[new Coord3D(mouseIsoCoord, Altitude - 1)] is Cube) { foreach (var coord in mouseIsoCoord.AdjacentCoords()) { WalkableTileTable.Add(Altitude, coord, mouseIsoCoord); } } } } else if (BuildMode == BuildMode.Deco && LayerMap.ContainsKey(mouseIsoCoord3D)) { var sprite = LayerMap[mouseIsoCoord3D]; if (sprite is Deco deco) { foreach (var coord in deco.OccupiedCoords) { LayerMap.Remove(coord); // If there are cubes below, var c = new Coord3D(new Coord2D(coord.X, coord.Y), Altitude - 1); if (LayerMap.ContainsKey(c) && LayerMap[c] is Cube) { foreach (var _coord in new Coord2D(coord.X, coord.Y).AdjacentCoords()) { WalkableTileTable.Add(Altitude, _coord, new Coord2D(coord.X, coord.Y)); } } } } } }
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 } }