Пример #1
0
        /// <summary>
        /// Clones a difficulty index and adds it to all players in all mission variants.
        /// </summary>
        public void AddDifficulty(int cloneIndex)
        {
            if (cloneIndex < 0 || cloneIndex >= selectedVariant.players[0].difficulties.Count)
            {
                throw new System.IndexOutOfRangeException("index: " + cloneIndex);
            }

            // Add to master
            GameData tethysGame = mission.masterVariant.tethysDifficulties[cloneIndex];

            mission.masterVariant.tethysDifficulties.Add(new GameData(tethysGame));

            for (int i = 0; i < mission.masterVariant.players.Count; ++i)
            {
                PlayerData.ResourceData resData = mission.masterVariant.players[i].difficulties[cloneIndex];
                mission.masterVariant.players[i].difficulties.Add(new PlayerData.ResourceData(resData));
            }

            // Add to variants
            foreach (MissionVariant variant in mission.missionVariants)
            {
                tethysGame = variant.tethysDifficulties[cloneIndex];
                variant.tethysDifficulties.Add(new GameData(tethysGame));

                for (int i = 0; i < variant.players.Count; ++i)
                {
                    PlayerData.ResourceData resData = variant.players[i].difficulties[cloneIndex];
                    variant.players[i].difficulties.Add(new PlayerData.ResourceData(resData));
                }
            }

            SetUnsaved();
        }
Пример #2
0
        /// <summary>
        /// Add new difficulty based on master resource data.
        /// </summary>
        public void AddDifficulty()
        {
            // Add to master
            GameData tethysGame = new GameData(mission.masterVariant.tethysGame);

            tethysGame.beacons.Clear();
            tethysGame.markers.Clear();
            tethysGame.wreckage.Clear();
            mission.masterVariant.tethysDifficulties.Add(tethysGame);

            foreach (PlayerData player in mission.masterVariant.players)
            {
                PlayerData.ResourceData resData = new PlayerData.ResourceData(player.resources);
                ClearPlayerResourceData(resData);

                player.difficulties.Add(resData);
            }

            // Add to variants
            foreach (MissionVariant variant in mission.missionVariants)
            {
                variant.tethysDifficulties.Add(new GameData(mission.masterVariant.tethysGame));

                foreach (PlayerData player in variant.players)
                {
                    PlayerData.ResourceData resData = new PlayerData.ResourceData(player.resources);
                    ClearPlayerResourceData(resData);

                    player.difficulties.Add(resData);
                }
            }

            SetUnsaved();
        }
Пример #3
0
        private bool GetWallTubeOnTile(Vector2Int tileXY, out int playerIndex, out int wallTubeIndex)
        {
            // Add game coordinates
            tileXY += Vector2Int.one;

            wallTubeIndex = -1;

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

                for (int i = 0; i < playerResData.wallTubes.Count; ++i)
                {
                    WallTubeData wallTube = playerResData.wallTubes[i];

                    if (wallTube.position.x == tileXY.x && wallTube.position.y == tileXY.y)
                    {
                        wallTubeIndex = i;
                        return(true);
                    }
                }
            }

            playerIndex = -1;
            return(false);
        }
        private void OnChanged_MissionData(UserData src)
        {
            // Check if player was destroyed
            bool foundPlayer = false;

            foreach (PlayerData pData in UserData.current.selectedVariant.players)
            {
                if (pData == player)
                {
                    foundPlayer = true;
                    break;
                }
            }

            if (!foundPlayer)
            {
                // Unit is no longer tied to a player. Destroy it.
                Destroy(gameObject);
                return;
            }

            // Update player color
            m_ColorOverlay.color = GetPlayerColor();

            PlayerData.ResourceData resData = UserData.current.GetPlayerResourceData(player);
            m_UnitMinimap.MoveUnit(this, GetMapCoordinates(new Vector2Int(resData.centerView.x, resData.centerView.y)));
        }
Пример #5
0
 private void ClearPlayerResourceData(PlayerData.ResourceData resData)
 {
     resData.commonOre         = 0;
     resData.completedResearch = new int[0];
     resData.food            = 0;
     resData.kids            = 0;
     resData.rareOre         = 0;
     resData.scientists      = 0;
     resData.solarSatellites = 0;
     resData.workers         = 0;
     resData.units.Clear();
     resData.wallTubes.Clear();
 }
        public void Initialize(PlayerData player)
        {
            this.player = player;

            UserData.current.onChangedValuesCB += OnChanged_MissionData;

            m_ColorOverlay.color = GetPlayerColor();

            // Add to minimap
            PlayerData.ResourceData resData = UserData.current.GetPlayerResourceData(player);
            m_UnitMinimap.AddUnit(this, GetMapCoordinates(new Vector2Int(resData.centerView.x, resData.centerView.y)), 4);

            RefreshOverlay();
        }
Пример #7
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));
        }
        private void OnSelect_Player(ListBoxItem item)
        {
            PlayerData player = (PlayerData)item.userData;

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

            m_CanSave = false;

            m_SelectedPlayer = player;

            if (UserData.current.selectedVariant.players.Count > 1)
            {
                m_BtnRemovePlayer.interactable = true;
            }

            m_DropdownColonyType.value = player.isEden ? 0 : 1;
            m_DropdownColor.value      = (int)player.color;
            if (player.isHuman)
            {
                m_DropdownControlType.value = player.botType == BotType.None ? 0 : 2;
            }
            else
            {
                m_DropdownControlType.value = 1;                                     // OP2 AI
            }
            m_InputTechLevel.text       = playerResData.techLevel.ToString();
            m_DropdownMoraleLevel.value = (int)playerResData.moraleLevel;
            m_ToggleFreeMorale.isOn     = playerResData.freeMorale;

            m_Allies        = new List <int>(player.allies);
            m_CompletedTech = new List <int>(playerResData.completedResearch);

            PopulateAllyList();
            PopulateCompletedTechList();

            m_InputSolarSats.text   = playerResData.solarSatellites.ToString();
            m_InputKids.text        = playerResData.kids.ToString();
            m_InputWorkers.text     = playerResData.workers.ToString();
            m_InputScientists.text  = playerResData.scientists.ToString();
            m_InputCommonMetal.text = playerResData.commonOre.ToString();
            m_InputRareMetal.text   = playerResData.rareOre.ToString();
            m_InputFood.text        = playerResData.food.ToString();

            m_CanSave = true;
        }
Пример #9
0
        private UnitData GetUnitOnTile(int tileX, int tileY)
        {
            // Search for a unit on this tile
            foreach (PlayerData player in UserData.current.selectedVariant.players)
            {
                PlayerData.ResourceData resData = UserData.current.GetPlayerResourceData(player);

                foreach (UnitData unit in resData.units)
                {
                    if (unit.position.x == tileX && unit.position.y == tileY)
                    {
                        return(unit);
                    }
                }
            }

            return(null);
        }
Пример #10
0
        protected override void OnEraseTile(Vector2Int tileXY)
        {
            // Add game coordinates
            tileXY += Vector2Int.one;

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

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

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

                    if (unit.position.x == tileXY.x && unit.position.y == tileXY.y)
                    {
                        unitIndex = i;
                        break;
                    }
                }

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

            if (unitIndex < 0)
            {
                return;
            }

            UnitData vehicleToRemove = UserData.current.GetPlayerResourceData(playerIndex).units[unitIndex];

            // Remove vehicle from tile
            UserData.current.GetPlayerResourceData(playerIndex).units.RemoveAt(unitIndex);
            UserData.current.SetUnsaved();

            m_UnitRenderer.RemoveUnit(vehicleToRemove);
        }
        public void Save()
        {
            if (!m_CanSave)
            {
                return;
            }

            UserData.current.mission.levelDetails.numPlayers = UserData.current.selectedVariant.players.Count;

            if (m_SelectedPlayer == null)
            {
                UserData.current.Dirty();
                return;
            }

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

            m_SelectedPlayer.isEden   = m_DropdownColonyType.value == 0;
            m_SelectedPlayer.color    = (PlayerColor)m_DropdownColor.value;
            m_SelectedPlayer.isHuman  = m_DropdownControlType.value != 1;                                           // OP2 AI
            m_SelectedPlayer.botType  = m_DropdownControlType.value == 0 ? BotType.None : BotType.Balanced;
            playerResData.techLevel   = GetValueFromInputField(m_InputTechLevel, "Tech Level", playerResData.techLevel);
            playerResData.moraleLevel = (MoraleLevel)m_DropdownMoraleLevel.value;
            playerResData.freeMorale  = m_ToggleFreeMorale.isOn;

            m_SelectedPlayer.allies         = m_Allies.ToArray();
            playerResData.completedResearch = m_CompletedTech.ToArray();

            playerResData.solarSatellites = GetValueFromInputField(m_InputSolarSats, "Solar Satellites", playerResData.solarSatellites);
            playerResData.kids            = GetValueFromInputField(m_InputKids, "Kids", playerResData.kids);
            playerResData.workers         = GetValueFromInputField(m_InputWorkers, "Workers", playerResData.workers);
            playerResData.scientists      = GetValueFromInputField(m_InputScientists, "Scientists", playerResData.scientists);
            playerResData.commonOre       = GetValueFromInputField(m_InputCommonMetal, "Common Metal", playerResData.commonOre);
            playerResData.rareOre         = GetValueFromInputField(m_InputRareMetal, "Rare Metal", playerResData.rareOre);
            playerResData.food            = GetValueFromInputField(m_InputFood, "Food", playerResData.food);

            UserData.current.Dirty();
        }
Пример #12
0
        private void Update()
        {
            m_txtHeaders.text = "";
            m_txtInfo.text    = "";

            // If mouse is over UI, we should not get unit info
            if (EventSystem.current.IsPointerOverGameObject())
            {
                return;
            }

            // Get the tile that we are over
            Vector2    worldMousePt = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            Vector3Int cell         = m_Tilemap.WorldToCell(worldMousePt);

            // Don't do anything out of bounds
            if (cell.x < 0 || cell.y < 0 || cell.x >= m_Tilemap.size.x || cell.y >= m_Tilemap.size.y)
            {
                return;
            }

            // Invert Y to match data storage instead of render value
            cell.y = m_Tilemap.size.y - (cell.y + 1);

            // Add game coordinates
            cell += Vector3Int.one;

            // Get unit on tile
            UnitData unitOnTile = GetUnitOnTile(cell.x, cell.y);

            if (unitOnTile != null)
            {
                // Display info for unit on tile
                System.Text.StringBuilder headers = new System.Text.StringBuilder();
                System.Text.StringBuilder info    = new System.Text.StringBuilder();

                string type = unitOnTile.typeID.ToString();

                // Add weapon to type
                if (unitOnTile.typeID == map_id.GuardPost || unitOnTile.typeID == map_id.Lynx || unitOnTile.typeID == map_id.Panther || unitOnTile.typeID == map_id.Tiger)
                {
                    type += " " + ((map_id)unitOnTile.cargoType).ToString();
                }

                headers.AppendLine("ID:");              info.AppendLine(unitOnTile.id.ToString());
                headers.AppendLine("Type:");    info.AppendLine(type);
                if (IsVehicle(unitOnTile.typeID) || IsStructure(unitOnTile.typeID))
                {
                    headers.AppendLine("Health:");        info.AppendLine((unitOnTile.health * 100).ToString("N2") + "%");
                }
                if (IsVehicle(unitOnTile.typeID))
                {
                    headers.AppendLine("Direction:");     info.AppendLine(unitOnTile.direction.ToString());
                }
                if (IsVehicle(unitOnTile.typeID))
                {
                    headers.AppendLine("Lights:");        info.AppendLine(unitOnTile.lights ? "On" : "Off");
                }
                if (IsMine(unitOnTile.typeID) || Isbeacon(unitOnTile.typeID))
                {
                    headers.AppendLine("Yield:");         info.AppendLine(unitOnTile.barYield.ToString());
                }
                if (IsMine(unitOnTile.typeID) || Isbeacon(unitOnTile.typeID))
                {
                    headers.AppendLine("Variant:");       info.AppendLine(unitOnTile.barVariant.ToString());
                }
                string cargoText = GetCargoText(unitOnTile);
                if (cargoText != null)
                {
                    string[] typeAmount = cargoText.Split(':');

                    headers.AppendLine("Cargo:");           info.AppendLine(typeAmount[0]);
                    if (typeAmount.Length >= 2)
                    {
                        headers.AppendLine("Amount:");          info.AppendLine(typeAmount[1]);
                    }
                }
                headers.AppendLine("Position:");        info.AppendLine(unitOnTile.position.x.ToString() + ", " + unitOnTile.position.y.ToString());

                m_txtHeaders.text = headers.ToString();
                m_txtInfo.text    = info.ToString();
                return;
            }

            // Get beacon on tile
            GameData.Beacon beacon = UserData.current.selectedVariant.tethysGame.beacons.Find((b) => b.position.x == cell.x && b.position.y == cell.y);
            if (beacon != null)
            {
                // Display info for beacon on tile
                System.Text.StringBuilder headers = new System.Text.StringBuilder();
                System.Text.StringBuilder info    = new System.Text.StringBuilder();

                headers.AppendLine("ID:");                      info.AppendLine(beacon.id.ToString());
                headers.AppendLine("Type:");            info.AppendLine(beacon.mapID.ToString());
                if (beacon.mapID == map_id.MiningBeacon)
                {
                    headers.AppendLine("Ore Type:");        info.AppendLine(beacon.oreType.ToString());
                    headers.AppendLine("Yield:");           info.AppendLine(beacon.barYield.ToString());
                    headers.AppendLine("Variant:");         info.AppendLine(beacon.barVariant.ToString());
                }
                headers.AppendLine("Position:");        info.AppendLine(beacon.position.x.ToString() + ", " + beacon.position.y.ToString());

                m_txtHeaders.text = headers.ToString();
                m_txtInfo.text    = info.ToString();
                return;
            }

            // Get marker on tile
            GameData.Marker marker = UserData.current.selectedVariant.tethysGame.markers.Find((m) => m.position.x == cell.x && m.position.y == cell.y);
            if (marker != null)
            {
                // Display info for marker on tile
                System.Text.StringBuilder headers = new System.Text.StringBuilder();
                System.Text.StringBuilder info    = new System.Text.StringBuilder();

                headers.AppendLine("ID:");                      info.AppendLine(marker.id.ToString());
                headers.AppendLine("Type:");            info.AppendLine(marker.markerType.ToString());
                headers.AppendLine("Position:");        info.AppendLine(marker.position.x.ToString() + ", " + marker.position.y.ToString());

                m_txtHeaders.text = headers.ToString();
                m_txtInfo.text    = info.ToString();
                return;
            }

            // Get wreckage on tile
            GameData.Wreckage wreckage = UserData.current.selectedVariant.tethysGame.wreckage.Find((w) => w.position.x == cell.x && w.position.y == cell.y);
            if (wreckage != null)
            {
                // Display info for wreckage on tile
                System.Text.StringBuilder headers = new System.Text.StringBuilder();
                System.Text.StringBuilder info    = new System.Text.StringBuilder();

                headers.AppendLine("ID:");                      info.AppendLine(wreckage.id.ToString());
                headers.AppendLine("Type:");            info.AppendLine(wreckage.techID.ToString());
                headers.AppendLine("Visible:");         info.AppendLine(wreckage.isVisible ? "Yes" : "No");
                headers.AppendLine("Position:");        info.AppendLine(wreckage.position.x.ToString() + ", " + wreckage.position.y.ToString());

                m_txtHeaders.text = headers.ToString();
                m_txtInfo.text    = info.ToString();
                return;
            }

            // Get start location on tile
            foreach (PlayerData player in UserData.current.selectedVariant.players)
            {
                PlayerData.ResourceData resData = UserData.current.GetPlayerResourceData(player);

                if (resData.centerView.x == cell.x && resData.centerView.y == cell.y)
                {
                    // Display info for start location
                    System.Text.StringBuilder headers = new System.Text.StringBuilder();
                    System.Text.StringBuilder info    = new System.Text.StringBuilder();

                    headers.AppendLine("Player:");          info.AppendLine(player.id.ToString());
                    headers.AppendLine("Type:");            info.AppendLine("Start Location");
                    headers.AppendLine("Position:");        info.AppendLine(resData.centerView.x.ToString() + ", " + resData.centerView.y.ToString());

                    m_txtHeaders.text = headers.ToString();
                    m_txtInfo.text    = info.ToString();
                    return;
                }
            }
        }