public static Sprite GetTextureForLevel(Declarations.LevelData levelData) { int HexHeight = 10; var width = (int)HexToPoints(HexHeight, 1, levelData.MapSize.x - 1)[4].X; var height = (int)HexToPoints(HexHeight, levelData.MapSize.y - 1, 0)[0].Y; var pointForHexes = FillPointForHexes(levelData, HexHeight); Bitmap myBitmap = new Bitmap(width, height); var graphics = System.Drawing.Graphics.FromImage(myBitmap); graphics.Clear(System.Drawing.Color.Transparent); DrawHexGrid(graphics, pointForHexes, levelData); Texture2D texture = new Texture2D(width, height); for (int i = 0; i < width; i++) { for (int j = 0; j < height; j++) { var pixel = myBitmap.GetPixel(i, height - j - 1); texture.SetPixel(i, j, new UnityEngine.Color((float)pixel.R / 255, (float)pixel.G / 255, (float)pixel.B / 255, (float)pixel.A / 255)); } } texture.Apply(); return(Sprite.Create(texture, new Rect(0, 0, width, height), Vector2.zero)); }
public static bool ReadLevelData(XElement levelFile, out Declarations.LevelData levelData, bool canHaveEmptyTiles = false, bool readWaves = true) { var mapElement = levelFile.Element(Constants.cst_Map); var spawnData = levelFile.Element(Constants.cst_SpawnData); if (mapElement != null && spawnData != null) { int startMoney; int startHealth; string name; Declarations.IntVector2 mapSize; Declarations.TileType[,] map; List <Declarations.WaveData> waves; if (levelFile.Attribute(Constants.cst_StartMoney) != null && int.TryParse(levelFile.Attribute(Constants.cst_StartMoney).Value, out startMoney) && levelFile.Attribute(Constants.cst_StartHealth) != null && int.TryParse(levelFile.Attribute(Constants.cst_StartHealth).Value, out startHealth) && levelFile.Attribute(Constants.cst_Name) != null && ReadMapData(mapElement, out mapSize, out map, canHaveEmptyTiles)) { name = levelFile.Attribute(Constants.cst_Name).Value; waves = null; if (!readWaves || ReadWaveData(spawnData, out waves)) { levelData = new Declarations.LevelData(name, mapSize, map, waves, startMoney, startHealth); return(true); } } } levelData = null; return(false); }
public void SetData(Declarations.LevelData data) { NameText.text = data.Name; for (int i = 0; i < 3; i++) { if (i + 1 <= data.Stars) { Stars[i].sprite = FullStar; } else { Stars[i].sprite = EmptyStar; } } Preview.sprite = data.previewSprite; if (data.Unlocked || GameManager.instance.DeveloperMode) { Outline.effectColor = Color.green; Button.interactable = true; } else { Outline.effectColor = Color.red; Button.interactable = false; } }
public void LoadLevel(Declarations.LevelData level) { CurrentLevel = level; Health = level.StartHealth; Money = level.StartMoney; Time.timeScale = 1; GameSpedUp = false; Paused = false; SceneManager.LoadScene("Level", LoadSceneMode.Single); }
private static PointF[, ][] FillPointForHexes(Declarations.LevelData levelData, int HexHeight) { var pointForHexes = new PointF[levelData.MapSize.y, levelData.MapSize.x][]; // Loop until a hexagon won't fit. for (int row = 0; row < levelData.MapSize.y; row++) { // Draw the row. for (int col = 0; col < levelData.MapSize.x; col++) { var points = HexToPoints(HexHeight, row, col); pointForHexes[row, col] = points; } } return(pointForHexes); }
private void FileLoaded(string path) { var levelFile = XElement.Load(path); if (levelFile != null) { Declarations.LevelData levelData; DataReader.ReadLevelData(levelFile, out levelData, true); if (levelData != null) { currentlyLoadedLevel = levelData; LoadLevel(); } } else { Debug.Log("Cant load level!"); } EnableDisablePanels(true); }
private static void DrawHexGrid(System.Drawing.Graphics gr, PointF[, ][] pointForHexes, Declarations.LevelData levelData) { for (int row = 0; row < levelData.MapSize.y; row++) { for (int col = 0; col < levelData.MapSize.x; col++) { var points = pointForHexes[row, col]; var brush = Brushes.White; switch (levelData.Map[row, col]) { case Declarations.TileType.Spawn: brush = Brushes.Red; break; case Declarations.TileType.Objective: brush = Brushes.Yellow; break; case Declarations.TileType.Grass: brush = new SolidBrush(System.Drawing.Color.FromArgb(0, 100, 0)); break; case Declarations.TileType.Path: brush = new SolidBrush(System.Drawing.Color.FromArgb(147, 104, 31)); break; case Declarations.TileType.Environment: brush = new SolidBrush(System.Drawing.Color.FromArgb(0, 60, 0)); break; default: break; } gr.FillPolygon(brush, points); } } }
public void CreateLevelClicked() { bool error = false; var invalidSymbols = new List <char> { '\\', '/', ':', '*', '?', '"', '<', '>', '|' }; var name = newLevelPanel.transform.GetChild(2).GetChild(1).GetComponent <InputField>().text; int width; int height; int startMoney; int startHealth; if (string.IsNullOrEmpty(name) || name.Any(x => invalidSymbols.Contains(x))) { error = true; newLevelPanel.transform.GetChild(2).GetChild(1).GetComponent <Image>().sprite = TextFieldError; } else { newLevelPanel.transform.GetChild(2).GetChild(1).GetComponent <Image>().sprite = TextFieldNormal; } if (!int.TryParse(newLevelPanel.transform.GetChild(3).GetChild(1).GetComponent <InputField>().text, out startMoney) || startMoney <= 0) { error = true; newLevelPanel.transform.GetChild(3).GetChild(1).GetComponent <Image>().sprite = TextFieldError; } else { newLevelPanel.transform.GetChild(3).GetChild(1).GetComponent <Image>().sprite = TextFieldNormal; } if (!int.TryParse(newLevelPanel.transform.GetChild(4).GetChild(1).GetComponent <InputField>().text, out startHealth) || startHealth <= 0) { error = true; newLevelPanel.transform.GetChild(4).GetChild(1).GetComponent <Image>().sprite = TextFieldError; } else { newLevelPanel.transform.GetChild(4).GetChild(1).GetComponent <Image>().sprite = TextFieldNormal; } if (!int.TryParse(newLevelPanel.transform.GetChild(5).GetChild(1).GetComponent <InputField>().text, out width) || width < 10 || width > 50) { error = true; newLevelPanel.transform.GetChild(5).GetChild(1).GetComponent <Image>().sprite = TextFieldError; } else { newLevelPanel.transform.GetChild(5).GetChild(1).GetComponent <Image>().sprite = TextFieldNormal; } if (!int.TryParse(newLevelPanel.transform.GetChild(6).GetChild(1).GetComponent <InputField>().text, out height) || height < 10 || height > 50) { error = true; newLevelPanel.transform.GetChild(6).GetChild(1).GetComponent <Image>().sprite = TextFieldError; } else { newLevelPanel.transform.GetChild(6).GetChild(1).GetComponent <Image>().sprite = TextFieldNormal; } if (!error) { var map = new Declarations.TileType[height, width]; for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { map[i, j] = Declarations.TileType.Grass; } } currentlyLoadedLevel = new Declarations.LevelData(name, new Declarations.IntVector2(width, height), map, new List <Declarations.WaveData>(), startMoney, startHealth); LoadLevel(); newLevelPanel.SetActive(false); EnableDisablePanels(true); } }
public void GenerateMap(Declarations.LevelData levelData) { ClearMap(); var startTime = Time.realtimeSinceStartup; MapSize = new Declarations.IntVector2(levelData.MapSize.x + (LeftRightBorderSize * 2), levelData.MapSize.y + TopBorderSize + BotBorderSize); CurrentLevel = levelData; TileTypeMap = new Declarations.TileType[MapSize.y, MapSize.x]; for (int row = 0; row < levelData.MapSize.y; row++) { for (int col = 0; col < levelData.MapSize.x; col++) { TileTypeMap[row + TopBorderSize, col + LeftRightBorderSize] = levelData.Map[row, col]; } } int[,] heightMap = GenerateHeightMapForCurrentLevel(); var heightMapGeneration = Time.realtimeSinceStartup - startTime; Map = new Tile[MapSize.y, MapSize.x]; for (int row = 0; row < MapSize.y; row++) { for (int col = 0; col < MapSize.x; col++) { var tile = GetObjectByTileType(TileTypeMap[row, col]); var tilePosition = Helpers.GetPositionForTile(row - TopBorderSize, col - LeftRightBorderSize); var tileRealPosition = tilePosition; if (TileTypeMap[row, col] == Declarations.TileType.Grass || TileTypeMap[row, col] == Declarations.TileType.Environment) { var randomFactor = GetRandomFactor(heightMap[row, col]); var lift = heightMap[row, col] * 0.4f; lift += UnityEngine.Random.Range(-randomFactor, randomFactor); if (lift > 0) { tileRealPosition.y = lift; } } var tileObj = Instantiate(tile, tileRealPosition, Quaternion.identity, transform).GetComponent <Tile>(); tileObj.SetData(row, col, TileTypeMap[row, col]); tileObj.transform.rotation = Quaternion.Euler(new Vector3(0, (UnityEngine.Random.Range(0, 2) + UnityEngine.Random.Range(0, 2) + UnityEngine.Random.Range(0, 2) + UnityEngine.Random.Range(0, 2) + UnityEngine.Random.Range(0, 2)) * 60, 0)); Map[row, col] = tileObj; if (tileRealPosition.y > 0) { var lifterObj = Instantiate(Lifter, tilePosition, tileObj.transform.rotation, tileObj.transform).GetComponent <Lifter>(); lifterObj.transform.localScale = new Vector3(1, tileRealPosition.y, 1); tileObj.SetLifter(lifterObj); lifterObj.SetTile(tileObj); } } } var tilePlacement = Time.realtimeSinceStartup - startTime - heightMapGeneration; PutObjectives(); RotateSpawner(); var finishingTouches = Time.realtimeSinceStartup - startTime - heightMapGeneration - tilePlacement; Debug.Log("Total Seconds for new map generation: " + (Time.realtimeSinceStartup - startTime)); Debug.Log("Seconds for height map generation: " + heightMapGeneration); Debug.Log("Seconds for tile placement: " + tilePlacement); Debug.Log("Seconds for finishing touches: " + finishingTouches); }