public AudioSource GeneralAudioSource; //The audio source where audio will be played generally unless the audio is local. In that case, it will be played void Awake() { //set the instance: if (Instance == null) { Instance = this; } else if (Instance != this) { Destroy(gameObject); } AllFactionsReady = false; //faction stats are not ready, yet //Randomize player controlled faction: RandomizePlayerFaction(); CamMov = FindObjectOfType(typeof(CameraMovement)) as CameraMovement; //Find the camera movement script. ResourceMgr = FindObjectOfType(typeof(ResourceManager)) as ResourceManager; //Find the resource manager script. if (ResourceMgr != null) { ResourceMgr.GameMgr = this; } UIMgr = FindObjectOfType(typeof(UIManager)) as UIManager; //Find the UI manager script. BuildingMgr = FindObjectOfType(typeof(BuildingPlacement)) as BuildingPlacement; Events = FindObjectOfType(typeof(CustomEvents)) as CustomEvents; TaskMgr = FindObjectOfType(typeof(TaskManager)) as TaskManager; if (TaskMgr != null) { TaskMgr.GameMgr = this; } UnitMgr = FindObjectOfType(typeof(UnitManager)) as UnitManager; SelectionMgr = FindObjectOfType(typeof(SelectionManager)) as SelectionManager; PlacementMgr = FindObjectOfType(typeof(BuildingPlacement)) as BuildingPlacement; TerrainMgr = FindObjectOfType(typeof(TerrainManager)) as TerrainManager; MvtMgr = FindObjectOfType(typeof(MovementManager)) as MovementManager; MultiplayerGame = false; //We start by assuming it's a simple single player game. //First check if there's a network manager component in the scene: NetworkMgr_UNET = NetworkManager_UNET.NetworkMgr; if (NetworkMgr_UNET != null) { //If there's actually a network map manager, it means that the map was loaded from the multiplayer menu, meaning that this is a MP game. ClearNPCManagers(); //clearing all the npc components in the map since it's a MP game. MultiplayerGame = true; //we now recongize that this a multiplayer game. //set the network type in the input manager InputManager.NetworkType = InputManager.NetworkTypes.UNET; List <MFactionLobby_UNET> FactionLobbyInfos = new List <MFactionLobby_UNET>(); FactionLobbyInfos.Clear(); //clear this list //we'll add the faction lobby components to it using the lobby slots array from the network manager foreach (NetworkLobbyPlayer NetworkPlayer in NetworkMgr_UNET.lobbySlots) //go through all the lobby slots { //if the slot is occupied: if (NetworkPlayer != null) { //add the faction lobby component attached to it to the list: FactionLobbyInfos.Add(NetworkPlayer.gameObject.GetComponent <MFactionLobby_UNET>()); } } //This where we will set the settings for all the players: //First check if we have enough faction slots available: if (FactionLobbyInfos.Count <= Factions.Count) { //Loop through all the current factions and set up each faction slot: for (int i = 0; i < FactionLobbyInfos.Count; i++) { MFactionLobby_UNET ThisFaction = FactionLobbyInfos[i]; //this is the faction info that we will get from the faction lobby info. //Set the info for the factions that we will use: Factions[i].Name = ThisFaction.FactionName; //get the faction name Factions[i].FactionColor = ThisFaction.FactionColor; //the faction color //get the initial max population from the network manager (making it the same for all the players). Factions[i].MaxPopulation = NetworkMgr_UNET.Maps[ThisFaction.MapID].InitialPopulation; Factions[i].Lost = false; Factions[i].MFactionLobby_UNET = ThisFaction; //linking the faction with its lobby info script. Factions[i].CapitalPos = Factions[i].CapitalBuilding.transform.position; //setting the capital pos to spawn the capital building object at later. Factions[i].FactionMgr = Factions[i].FactionMgr; //linking the faction with its faction manager. Factions[i].Code = ThisFaction.FactionCode; //Setting the local player faction ID: if (ThisFaction.isLocalPlayer) { //isLoclPlayer determines which lobby faction info script is owned by the player.. //therefore the faction linked to that script is the player controlled one. PlayerFactionID = i; Factions[i].PlayerControl = true; PlayerFactionMgr = Factions[i].FactionMgr; } else { //all other factions will be defined as NPC but in the reality, they are controlled by other players through the network. Factions[i].PlayerControl = false; } //Set the master faction ID: if (ThisFaction.IsServer) { MasterFactionID = i; } } //loop through all the factions and destroy the default capital buildings because the server will spawn new ones for each faction. for (int i = 0; i < Factions.Count; i++) { DestroyImmediate(Factions[i].CapitalBuilding.gameObject); } //if there are more slots than required. while (FactionLobbyInfos.Count < Factions.Count) { //remove the extra slots: Factions.RemoveAt(Factions.Count - 1); } } else { Debug.LogError("Not enough slots available for all the factions!"); } } SinglePlayerMgr = FindObjectOfType(typeof(SinglePlayerManager)) as SinglePlayerManager; //search for the map manager script. //If there's a map manager script in the scene, it means that we just came from the single player menu, so we need to set the NPC players settings! if (SinglePlayerMgr != null) { //This where we will set the NPC settings using the info from the map manager: //First check if we have enough faction slots available: if (SinglePlayerMgr.Factions.Count <= Factions.Count) { ClearNPCManagers(); //remove the current npc managers as they will be replaced by other ones. //loop through the factions slots of this map: for (int i = 0; i < SinglePlayerMgr.Factions.Count; i++) { //Set the info for the factions that we will use: Factions[i].Name = SinglePlayerMgr.Factions[i].FactionName; //name Factions[i].FactionColor = SinglePlayerMgr.Factions[i].FactionColor; //color Factions[i].PlayerControl = SinglePlayerMgr.Factions[i].ControlledByPlayer; //is this faction controlled by the player? Factions[i].MaxPopulation = SinglePlayerMgr.Factions[i].InitialPopulation; //initial maximum population (which can be increased in the game). Factions[i].Code = SinglePlayerMgr.Factions[i].FactionCode; //the faction's code. Factions[i].CapitalPos = Factions[i].CapitalBuilding.transform.position; //setting the capital pos to spawn the capital building object at later. Factions[i].Lost = false; int FactionTypeID = GetFactionTypeID(Factions[i].Code); if (FactionTypeID >= 0 && FactionDef[FactionTypeID].CapitalBuilding != null) { //if the faction to a certain type DestroyImmediate(Factions[i].CapitalBuilding.gameObject); //destroy the default capital and spawn another one: //we will spawn the capital building and remove the one that already came in the scene: GameObject Capital = Instantiate(FactionDef[FactionTypeID].CapitalBuilding.gameObject); //set the capital's settings: Capital.GetComponent <Building>().FactionID = i; Capital.GetComponent <Building>().FactionCapital = true; Capital.GetComponent <Building>().PlacedByDefault = true; Capital.transform.position = Factions[i].CapitalPos; //set the capital's position on the map. Factions[i].CapitalBuilding = Capital.GetComponent <Building>(); } //if this faction not controlled by the player if (Factions[i].PlayerControl == false) { //Spawn the NPC managers setinngs for this faction: GameObject NPCMgrObj = (GameObject)Instantiate(SinglePlayerMgr.DifficultyLevels[SinglePlayerMgr.Factions[i].NPCDifficulty], Vector3.zero, Quaternion.identity); //NPC Army manager: NPCMgrObj.GetComponent <NPCArmy>().FactionID = i; NPCMgrObj.GetComponent <NPCArmy>().FactionMgr = Factions[i].FactionMgr; Factions[i].FactionMgr.ArmyMgr = NPCMgrObj.GetComponent <NPCArmy>(); //NPC Building placement manager: NPCMgrObj.GetComponent <NPCBuildingPlacement>().FactionID = i; NPCMgrObj.GetComponent <NPCBuildingPlacement>().FactionMgr = Factions[i].FactionMgr; Factions[i].FactionMgr.BuildingMgr = NPCMgrObj.GetComponent <NPCBuildingPlacement>(); //NPC Resource manager: NPCMgrObj.GetComponent <NPCResource>().FactionID = i; NPCMgrObj.GetComponent <NPCResource>().FactionMgr = Factions[i].FactionMgr; Factions[i].FactionMgr.ResourceMgr = NPCMgrObj.GetComponent <NPCResource>(); //NPC Unit spawner: (optional) if (NPCMgrObj.GetComponent <NPCUnitSpawner>()) { NPCMgrObj.GetComponent <NPCUnitSpawner>().FactionID = i; NPCMgrObj.GetComponent <NPCUnitSpawner>().FactionMgr = Factions[i].FactionMgr; Factions[i].FactionMgr.UnitSpawner = NPCMgrObj.GetComponent <NPCUnitSpawner>(); } } } //if there are more slots than required. while (SinglePlayerMgr.Factions.Count < Factions.Count) { //remove the extra slots: DestroyImmediate(Factions[Factions.Count - 1].CapitalBuilding.gameObject); Factions.RemoveAt(Factions.Count - 1); } } else { Debug.LogError("Not enough slots available for all the factions!"); } //Destroy the map manager script because we don't really need it anymore: DestroyImmediate(SinglePlayerMgr.gameObject); } //If it's a multiplayer game, we still need to figure what's the local player faction ID. if (MultiplayerGame == false) { PlayerFactionID = -1; } if (Factions.Count > 0) { //Create as many resource info slots as the amount of the spawned factions. ResourceMgr.FactionResourcesInfo = new ResourceManager.FactionResourcesVars[Factions.Count]; //Loop through all the factions: for (int i = 0; i < Factions.Count; i++) { //if it's not a multiplayer game: if (MultiplayerGame == false) { //and this faction is controlled by the player: if (Factions[i].PlayerControl == true) { //then define this as the player faction: PlayerFactionID = i; PlayerFactionMgr = Factions[i].FactionMgr; } } //Only if it's a single player game we will be checking if the capital buildings have spawned, because in multiplayer, another script handles spawning these if (MultiplayerGame == false) { if (Factions[i].CapitalBuilding == null) { Debug.LogError("Faction ID: " + i + " is missing the 'Capital Building'"); } else { Factions[i].CapitalBuilding.FactionID = i; Factions[i].CapitalBuilding.FactionCapital = true; } } ResourceMgr.FactionResourcesInfo[i] = new ResourceManager.FactionResourcesVars(); //Associate each team with all available resources: ResourceMgr.FactionResourcesInfo[i].ResourcesTypes = new ResourceManager.ResourcesVars[ResourceMgr.ResourcesInfo.Length]; //Loop through all the available resources and define them for each team. for (int j = 0; j < ResourceMgr.FactionResourcesInfo[i].ResourcesTypes.Length; j++) { ResourceMgr.FactionResourcesInfo[i].ResourcesTypes[j] = new ResourceManager.ResourcesVars(); ResourceMgr.FactionResourcesInfo[i].ResourcesTypes[j].Name = ResourceMgr.ResourcesInfo[j].Name; //Name of the resource ResourceMgr.FactionResourcesInfo[i].ResourcesTypes[j].Amount = ResourceMgr.ResourcesInfo[j].StartingAmount; //Starting amount of the resource for each team. } } } ResourceMgr.UpdateResourcesUI(); //right after setting up the resource settings above, refresh the resource UI. //In order to avoid having buildings that are being placed by AI players and units collide, we will ignore physics between their two layers: Physics.IgnoreLayerCollision(LayerMask.NameToLayer("Hidden"), LayerMask.NameToLayer("Unit")); //Physics.IgnoreLayerCollision(LayerMask.NameToLayer("Unit"), LayerMask.NameToLayer("Unit")); if (PeaceTime <= 0.0f) { //If there's no peace make factions pick their targets early: SetFactionTargets(); } //Set the amount of the active factions: ActiveFactions = Factions.Count; GameState = GameStates.Running; //the game state is now set to running //reaching this point means that all faction info/stats in the game manager are ready: AllFactionsReady = true; }
public AudioSource GeneralAudioSource; //The audio source where audio will be played generally unless the audio is local. In that case, it will be played void Awake() { //set the instance: if (Instance == null) { Instance = this; } else if (Instance != this) { Destroy(gameObject); } Time.timeScale = 1.0f; //unfreeze game if it was frozen from a previous game. allFactionsReady = false; //faction stats are not ready, yet //Randomize player controlled faction: RandomizePlayerFaction(); //Get components: CamMov = FindObjectOfType(typeof(CameraMovement)) as CameraMovement; //Find the camera movement script. ResourceMgr = FindObjectOfType(typeof(ResourceManager)) as ResourceManager; //Find the resource manager script. if (ResourceMgr != null) { ResourceMgr.gameMgr = this; } UIMgr = FindObjectOfType(typeof(UIManager)) as UIManager; //Find the UI manager script. BuildingMgr = FindObjectOfType(typeof(BuildingPlacement)) as BuildingPlacement; Events = FindObjectOfType(typeof(CustomEvents)) as CustomEvents; TaskMgr = FindObjectOfType(typeof(TaskManager)) as TaskManager; UnitMgr = FindObjectOfType(typeof(UnitManager)) as UnitManager; SelectionMgr = FindObjectOfType(typeof(SelectionManager)) as SelectionManager; PlacementMgr = FindObjectOfType(typeof(BuildingPlacement)) as BuildingPlacement; TerrainMgr = FindObjectOfType(typeof(TerrainManager)) as TerrainManager; MvtMgr = FindObjectOfType(typeof(MovementManager)) as MovementManager; MultiplayerGame = false; //We start by assuming it's a single player game. InitFactionMgrs(); //create the faction managers components for the faction slots. InitMultiplayerGame(); //to initialize a multiplayer game. InitSinglePlayerGame(); //to initialize a single player game. SetPlayerFactionID(); //pick the player faction ID. InitFactionCapitals(); //init the faction capitals. ResourceMgr.InitFactionResources(); //init resources for factions. InitFactions(); //init the faction types. //In order to avoid having buildings that are being placed by AI players and units collide, we will ignore physics between their two layers: Physics.IgnoreLayerCollision(LayerMask.NameToLayer("Hidden"), LayerMask.NameToLayer("Unit")); //Set the amount of the active factions: activeFactionsAmount = Factions.Count; GameState = GameStates.Running; //the game state is now set to running //reaching this point means that all faction info/stats in the game manager are ready: allFactionsReady = true; }