/// <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(); }
/// <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(); }
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))); }
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(); }
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; }
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); }
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(); }
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; } } }