private void DrawEditorOverlay(CustomSpriteBatch g, MapLayer Owner, int LayerIndex, bool IsSubLayer) { if (Owner.IsVisible) { if (Map.ShowTerrainType) { int IndexOfLayer = LayerIndex; if (Map.ShowLayerIndex >= 0 && IndexOfLayer != -1) { IndexOfLayer = 0; } else if (IsSubLayer) { IndexOfLayer = 3; } float XOffset = (IndexOfLayer % 3) * Map.TileSize.X / 3; float YOffset = (IndexOfLayer / 3) * Map.TileSize.Y / 3; for (int Y = 0; Y < Map.MapSize.Y; Y++) { for (int X = 0; X < Map.MapSize.X; X++) { Color TextColor = Color.White; switch (Owner.ArrayTerrain[X, Y].TerrainTypeIndex) { case 0: TextColor = Color.DeepSkyBlue; break; case 1: TextColor = Color.White; break; case 2: TextColor = Color.Navy; break; case 3: TextColor = Color.DarkGray; break; case 4: TextColor = Color.Red; break; case 5: TextColor = Color.Yellow; break; } TextHelper.DrawText(g, Owner.ArrayTerrain[X, Y].TerrainTypeIndex.ToString(), new Vector2((X - Map.CameraPosition.X) * Map.TileSize.X + XOffset, (Y - Map.CameraPosition.Y) * Map.TileSize.Y + YOffset), TextColor); } } } if (Map.ShowTerrainHeight) { int IndexOfLayer = LayerIndex; if (IsSubLayer) { IndexOfLayer = 0; } float XOffset = (IndexOfLayer % 3) * Map.TileSize.X / 3; float YOffset = (IndexOfLayer / 3) * Map.TileSize.Y / 3; for (int Y = 0; Y < Map.MapSize.Y; Y++) { for (int X = 0; X < Map.MapSize.X; X++) { Color TextColor = Color.White; if (Owner.ArrayTerrain[X, Y].Position.Z >= 2) { TextColor = Color.Red; } else if (Owner.ArrayTerrain[X, Y].Position.Z >= 1) { TextColor = Color.Orange; } else if (Owner.ArrayTerrain[X, Y].Position.Z >= 0.75) { TextColor = Color.Yellow; } else if (Owner.ArrayTerrain[X, Y].Position.Z >= 0.5) { TextColor = Color.Green; } else if (Owner.ArrayTerrain[X, Y].Position.Z > 0) { TextColor = Color.SkyBlue; } TextHelper.DrawText(g, Owner.ArrayTerrain[X, Y].Position.Z.ToString(), new Vector2((X - Map.CameraPosition.X) * Map.TileSize.X + XOffset, (Y - Map.CameraPosition.Y) * Map.TileSize.Y + YOffset), TextColor); } } } foreach (SubMapLayer ActiveSubLayer in Owner.ListSubLayer) { DrawEditorOverlay(g, ActiveSubLayer, LayerIndex, true); } if (!Map.ShowUnits) { Color BrushPlayer = Color.FromNonPremultiplied(30, 144, 255, 180); Color BrushEnemy = Color.FromNonPremultiplied(255, 0, 0, 180); Color BrushNeutral = Color.FromNonPremultiplied(255, 255, 0, 180); Color BrushAlly = Color.FromNonPremultiplied(191, 255, 0, 180); Color BrushMapSwitchEventPoint = Color.FromNonPremultiplied(191, 255, 0, 180); Color BrushTeleportPoint = Color.FromNonPremultiplied(70, 13, 13, 180); for (int i = 0; i < Owner.ListSingleplayerSpawns.Count; i++) { g.Draw(GameScreen.sprPixel, new Rectangle((int)(Owner.ListSingleplayerSpawns[i].Position.X - Map.CameraPosition.X) * Map.TileSize.X, (int)(Owner.ListSingleplayerSpawns[i].Position.Y - Map.CameraPosition.Y) * Map.TileSize.Y, Map.TileSize.X, Map.TileSize.Y), null, BrushPlayer, 0f, Vector2.Zero, SpriteEffects.None, 0.001f); g.DrawString(Map.fntArial9, Owner.ListSingleplayerSpawns[i].Tag, new Vector2((Owner.ListSingleplayerSpawns[i].Position.X - Map.CameraPosition.X) * Map.TileSize.X + 10, (Owner.ListSingleplayerSpawns[i].Position.Y - Map.CameraPosition.Y) * Map.TileSize.Y + 10), Color.Black, 0f, Vector2.Zero, 1f, SpriteEffects.None, 0f); } for (int i = 0; i < Owner.ListMultiplayerSpawns.Count; i++) { g.Draw(GameScreen.sprPixel, new Rectangle((int)(Owner.ListMultiplayerSpawns[i].Position.X - Map.CameraPosition.X) * Map.TileSize.X, (int)(Owner.ListMultiplayerSpawns[i].Position.Y - Map.CameraPosition.Y) * Map.TileSize.Y, Map.TileSize.X, Map.TileSize.Y), null, BrushPlayer, 0f, Vector2.Zero, SpriteEffects.None, 0.001f); g.DrawString(Map.fntArial9, Owner.ListMultiplayerSpawns[i].Tag, new Vector2((Owner.ListMultiplayerSpawns[i].Position.X - Map.CameraPosition.X) * Map.TileSize.X + 10, (Owner.ListMultiplayerSpawns[i].Position.Y - Map.CameraPosition.Y) * Map.TileSize.Y + 10), Color.Black, 0f, Vector2.Zero, 1f, SpriteEffects.None, 0f); } for (int S = 0; S < Owner.ListMapSwitchPoint.Count; S++) { g.Draw(GameScreen.sprPixel, new Rectangle((int)(Owner.ListMapSwitchPoint[S].Position.X - Map.CameraPosition.X) * Map.TileSize.X, (int)(Owner.ListMapSwitchPoint[S].Position.Y - Map.CameraPosition.Y) * Map.TileSize.Y, Map.TileSize.X, Map.TileSize.Y), null, BrushMapSwitchEventPoint, 0f, Vector2.Zero, SpriteEffects.None, 0.001f); g.DrawString(Map.fntArial9, Owner.ListMapSwitchPoint[S].Tag, new Vector2((Owner.ListMapSwitchPoint[S].Position.X - Map.CameraPosition.X) * Map.TileSize.X + 10, (Owner.ListMapSwitchPoint[S].Position.Y - Map.CameraPosition.Y) * Map.TileSize.Y + 10), Color.Black, 0f, Vector2.Zero, 1f, SpriteEffects.None, 0f); } for (int T = 0; T < Owner.ListTeleportPoint.Count; T++) { g.Draw(GameScreen.sprPixel, new Rectangle((int)(Owner.ListTeleportPoint[T].Position.X - Map.CameraPosition.X) * Map.TileSize.X, (int)(Owner.ListTeleportPoint[T].Position.Y - Map.CameraPosition.Y) * Map.TileSize.Y, Map.TileSize.X, Map.TileSize.Y), null, BrushTeleportPoint, 0f, Vector2.Zero, SpriteEffects.None, 0.001f); g.DrawString(Map.fntArial9, Owner.ListTeleportPoint[T].Tag, new Vector2((Owner.ListTeleportPoint[T].Position.X - Map.CameraPosition.X) * Map.TileSize.X + 10, (Owner.ListTeleportPoint[T].Position.Y - Map.CameraPosition.Y) * Map.TileSize.Y + 10), Color.Black, 0f, Vector2.Zero, 1f, SpriteEffects.None, 0f); } } } }
public override int GetNextLayerIndex(Vector3 CurrentPosition, int NextX, int NextY, float MaxClearance, float ClimbValue, out List <int> ListLayerPossibility) { ListLayerPossibility = new List <int>(); if (NextX < 0 || NextX >= MapSize.X || NextY < 0 || NextY >= MapSize.Y) { return(-1); } Terrain CurrentTerrain = LayerManager.ListLayer[(int)CurrentPosition.Z].ArrayTerrain[(int)CurrentPosition.X, (int)CurrentPosition.Y]; string CurrentTerrainType = GetTerrainType(CurrentPosition.X, CurrentPosition.Y, (int)CurrentPosition.Z); float CurrentZ = CurrentTerrain.Position.Z + CurrentPosition.Z; int ClosestLayerIndexDown = -1; int ClosestLayerIndexUp = 0; float ClosestTerrainDistanceDown = float.MaxValue; float ClosestTerrainDistanceUp = float.MinValue; for (int L = 0; L < LayerManager.ListLayer.Count; L++) { MapLayer ActiveLayer = LayerManager.ListLayer[L]; Terrain NextTerrain = ActiveLayer.ArrayTerrain[NextX, NextY]; string NextTerrainType = GetTerrainType(NextX, NextY, L); float NextTerrainZ = NextTerrain.Position.Z + L; //Check lower or higher neighbors if on solid ground if (CurrentTerrainType != UnitStats.TerrainAir && CurrentTerrainType != UnitStats.TerrainVoid && CurrentTerrainType != UnitStats.TerrainWall) { if (NextTerrainType != UnitStats.TerrainAir && NextTerrainType != UnitStats.TerrainVoid && NextTerrainType != UnitStats.TerrainWall) { //Prioritize going downward if (NextTerrainZ <= CurrentZ) { float ZDiff = CurrentZ - NextTerrainZ; if (ZDiff <= ClosestTerrainDistanceDown && HasEnoughClearance(NextTerrainZ, NextX, NextY, L, MaxClearance)) { ClosestTerrainDistanceDown = ZDiff; ClosestLayerIndexDown = L; ListLayerPossibility.Add(L); } } else { float ZDiff = NextTerrainZ - CurrentZ; if (ZDiff >= ClosestTerrainDistanceUp && ZDiff <= ClimbValue) { ClosestTerrainDistanceUp = ZDiff; ClosestLayerIndexUp = L; ListLayerPossibility.Add(L); } } } } //Already in void, check for any neighbors else { if (NextTerrainZ == CurrentPosition.Z && NextTerrainType == CurrentTerrainType) { return(L); } //Prioritize going upward else if (NextTerrainZ > CurrentPosition.Z) { float ZDiff = NextTerrainZ - CurrentZ; if (ZDiff < ClosestTerrainDistanceUp && ZDiff <= ClimbValue) { ClosestTerrainDistanceUp = ZDiff; ClosestLayerIndexUp = L; ListLayerPossibility.Add(L); } } } } if (ClosestLayerIndexDown >= 0) { return(ClosestLayerIndexDown); } else { return(ClosestLayerIndexUp); } }