Ejemplo n.º 1
0
        protected override void OnEraseTile(Vector2Int tileXY)
        {
            // Add game coordinates
            tileXY += Vector2Int.one;

            // Find structure on tile
            int playerIndex = 0;
            int unitIndex   = -1;

            for (playerIndex = 0; playerIndex < UserData.current.selectedVariant.players.Count; ++playerIndex)
            {
                PlayerData.ResourceData resData = UserData.current.GetPlayerResourceData(playerIndex);

                for (int i = 0; i < resData.units.Count; ++i)
                {
                    UnitData unit = resData.units[i];

                    RectInt structureArea = StructureData.GetStructureArea(new Vector2Int(unit.position.x, unit.position.y), unit.typeID);
                    if (structureArea.Contains(tileXY))
                    {
                        unitIndex = i;
                        break;
                    }
                }

                if (unitIndex >= 0)
                {
                    break;
                }
            }

            if (unitIndex < 0)
            {
                return;
            }

            PlayerData.ResourceData playerResData = UserData.current.GetPlayerResourceData(playerIndex);

            UnitData structureToRemove = playerResData.units[unitIndex];

            // Remove structure from tile
            playerResData.units.RemoveAt(unitIndex);
            UserData.current.SetUnsaved();

            m_UnitRenderer.RemoveUnit(structureToRemove);
            m_MapRenderer.RefreshTiles(StructureData.GetBulldozedStructureArea(new Vector2Int(structureToRemove.position.x - 1, structureToRemove.position.y - 1), structureToRemove.typeID));
        }
Ejemplo n.º 2
0
        private bool AreUnitsInArea(RectInt area)
        {
            MissionVariant variant = UserData.current.GetCombinedVariant();

            foreach (PlayerData player in variant.players)
            {
                foreach (UnitData unit in UserData.current.GetCombinedResourceData(player).units)
                {
                    // Subtract game coordinates
                    RectInt otherArea = StructureData.GetStructureArea(new Vector2Int(unit.position.x - 1, unit.position.y - 1), unit.typeID);

                    if (RectIntersect(area, otherArea))
                    {
                        return(true);
                    }
                }
            }

            return(false);
        }
Ejemplo n.º 3
0
        private bool AreUnitsOnTile(Vector2Int tileXY)
        {
            // Add game coordinates
            tileXY += Vector2Int.one;

            MissionVariant variant = UserData.current.GetCombinedVariant();

            foreach (PlayerData player in variant.players)
            {
                foreach (UnitData unit in UserData.current.GetCombinedResourceData(player).units)
                {
                    RectInt otherArea = StructureData.GetStructureArea(new Vector2Int(unit.position.x, unit.position.y), unit.typeID);
                    if (otherArea.Contains(tileXY))
                    {
                        return(true);
                    }
                }
            }

            return(false);
        }
Ejemplo n.º 4
0
        protected override void OnPaintTile(Vector2Int tileXY)
        {
            UnitData structure = GetStructureData();

            structure.position = new LOCATION(tileXY.x + 1, tileXY.y + 1);             // Add game coordinates

            RectInt structureArea = StructureData.GetStructureArea(tileXY, structure.typeID);
            RectInt bulldozedArea = structureArea;

            bulldozedArea.min -= Vector2Int.one;
            bulldozedArea.max += Vector2Int.one;

            // Check if area is not buildable
            if (!TileMapData.IsAreaPassable(bulldozedArea))
            {
                return;
            }

            // Check if area is blocked by units or structures
            if (AreUnitsInArea(structureArea))
            {
                return;
            }

            // Check if area is blocked by walls
            if (AreWallsInArea(structureArea))
            {
                return;
            }

            // Add structure to tile
            PlayerData player = UserData.current.selectedVariant.players[m_DropdownPlayer.value];

            UserData.current.GetPlayerResourceData(player.id).units.Add(structure);
            UserData.current.SetUnsaved();

            m_UnitRenderer.AddUnit(player, structure);
            m_MapRenderer.RefreshTiles(bulldozedArea);
        }
Ejemplo n.º 5
0
        /// <summary>
        /// Generates a minimap texture and assigns it as an image.
        /// </summary>
        /// <param name="map">The map to to generate a minimap from.</param>
        /// <param name="missionVariant">The mission variant to generate a minimap from. (optional)</param>
        public void SetMap(Map map, MissionVariant missionVariant = null)
        {
            uint mapWidth  = map.GetWidthInTiles();
            uint mapHeight = map.GetHeightInTiles();

            // Create minimap texture
            Texture2D minimapTexture = new Texture2D((int)mapWidth * TextureManager.minimapScale, (int)mapHeight * TextureManager.minimapScale, TextureFormat.ARGB32, false);

            CellTypeMap cellTypeMap = new CellTypeMap(map, missionVariant);

            for (uint x = 0; x < mapWidth; ++x)
            {
                for (uint y = 0; y < mapHeight; ++y)
                {
                    ulong       tileMappingIndex = GetTileMappingIndex(map, cellTypeMap, new Vector2Int((int)x, (int)y));
                    TileMapping mapping          = map.GetTileMapping(tileMappingIndex);

                    ulong tileSetIndex   = mapping.tilesetIndex;
                    int   tileImageIndex = mapping.tileGraphicIndex;

                    string tileSetPath     = map.GetTilesetSourceFilename(tileSetIndex);
                    int    tileSetNumTiles = (int)map.GetTilesetSourceNumTiles(tileSetIndex);

                    // Get image offset
                    int inverseTileIndex = tileSetNumTiles - tileImageIndex - 1;

                    Vector3Int cellPosition = new Vector3Int((int)x, (int)(mapHeight - y - 1), 0);

                    ++cellPosition.y;

                    // Set minimap pixel
                    Texture2D mTexture = TextureManager.LoadMinimapTileset(tileSetPath, tileSetNumTiles);
                    for (int my = 0; my < TextureManager.minimapScale; ++my)
                    {
                        for (int mx = 0; mx < TextureManager.minimapScale; ++mx)
                        {
                            Color color = mTexture.GetPixel(mx, inverseTileIndex * TextureManager.minimapScale + my);
                            minimapTexture.SetPixel(cellPosition.x * TextureManager.minimapScale + mx, cellPosition.y * TextureManager.minimapScale + my - 1, color);
                        }
                    }
                }
            }

            // Apply mission units to minimap
            if (missionVariant != null)
            {
                foreach (GameData.Beacon beacon in missionVariant.tethysGame.beacons)
                {
                    SetMinimapTile(minimapTexture, new Vector2Int(beacon.position.x, beacon.position.y) - Vector2Int.one, Color.white);
                }

                foreach (GameData.Marker marker in missionVariant.tethysGame.markers)
                {
                    SetMinimapTile(minimapTexture, new Vector2Int(marker.position.x, marker.position.y) - Vector2Int.one, Color.white);
                }

                foreach (GameData.Wreckage wreckage in missionVariant.tethysGame.wreckage)
                {
                    SetMinimapTile(minimapTexture, new Vector2Int(wreckage.position.x, wreckage.position.y) - Vector2Int.one, Color.white);
                }

                foreach (PlayerData player in missionVariant.players)
                {
                    foreach (UnitData unit in player.resources.units)
                    {
                        RectInt unitArea = StructureData.GetStructureArea(new Vector2Int(unit.position.x, unit.position.y) - Vector2Int.one, unit.typeID);

                        for (int x = unitArea.xMin; x < unitArea.xMax; ++x)
                        {
                            for (int y = unitArea.yMin; y < unitArea.yMax; ++y)
                            {
                                SetMinimapTile(minimapTexture, new Vector2Int(x, y), GetPlayerColor(player));
                            }
                        }
                    }
                }
            }

            // Apply minimap texture
            minimapTexture.Apply();

            // Update image
            RefreshImage(map, minimapTexture);
        }