public MutantCharacter SpawnRandomAnimalCharacter(string name, AISquad squad, Vector3 loc) { MutantCharacter character = GameObject.Instantiate(Resources.Load("MutantAnimal") as GameObject).GetComponent <MutantCharacter>(); character.CharacterID = name; character.Initialize(); character.CharacterType = CharacterType.Animal; character.MyNavAgent.enabled = false; character.Faction = squad.Faction; character.SquadID = squad.ID; GameManager.Inst.ItemManager.LoadNPCInventory(character.Inventory, squad.Faction, 0); character.MyAI.WeaponSystem.LoadWeaponsFromInventory(false); character.transform.position = loc; character.MyNavAgent.enabled = true; character.gameObject.name = character.gameObject.name + _counter.ToString(); _counter++; return(character); }
public bool Load(string saveGameName) { string fullPath = Application.persistentDataPath + "/" + saveGameName + ".dat"; BinaryFormatter bf = new BinaryFormatter(); FileStream file; if (File.Exists(fullPath)) { file = File.Open(fullPath, FileMode.Open); } else { return(false); } CurrentSave = (SaveGame)bf.Deserialize(file); //load level GameManager.Inst.WorldManager.AllLevels = CurrentSave.Levels; foreach (Level level in GameManager.Inst.WorldManager.AllLevels) { Debug.Log("Loading levels " + level.Name); if (level.Name == CurrentSave.LevelToLoad) { GameManager.Inst.WorldManager.CurrentLevel = level; break; } } GameManager.Inst.WorldManager.CurrentDay = CurrentSave.CurrentDay; GameManager.Inst.WorldManager.CurrentTime = CurrentSave.CurrentTime; GameManager.Inst.WorldManager.CurrentWeather = CurrentSave.CurrentWeather; GameManager.Inst.WorldManager.IsDayTime = CurrentSave.IsDayTime; GameManager.Inst.WorldManager.DayNightTransition = CurrentSave.DayNightTransition; GameManager.Inst.WorldManager.NightDayTransition = CurrentSave.NightDayTransition; GameManager.Inst.WorldManager.ChangeEnvironment(CurrentSave.CurrentEnvironmentName); //load player basics GameManager.Inst.PlayerProgress.PlayerFirstName = CurrentSave.PlayerFirstName; GameManager.Inst.PlayerProgress.PlayerLastName = CurrentSave.PlayerLastName; //load progress GameManager.Inst.PlayerProgress.DiscoveredTopics = new List <string>(CurrentSave.DiscoveredTopics); GameManager.Inst.PlayerProgress.JournalEntries = new List <List <string> >(CurrentSave.JournalEntries); GameManager.Inst.PlayerProgress.IncompleteTasks = new List <int>(CurrentSave.IncompleteTasks); GameManager.Inst.PlayerProgress.CompletedTasks = new List <int>(CurrentSave.CompletedTasks); //load player status GameManager.Inst.PlayerControl.SelectedPC.MyStatus.Data = CurrentSave.PlayerStatus; //load player boosts GameManager.Inst.PlayerControl.Survival.SetStatBoosts(CurrentSave.PlayerBoosts); //load player inventory GameManager.Inst.PlayerControl.SelectedPC.Inventory.ArmorSlot = CurrentSave.PlayerInventory.ArmorSlot; GameManager.Inst.PlayerControl.SelectedPC.Inventory.HeadSlot = CurrentSave.PlayerInventory.HeadSlot; GameManager.Inst.PlayerControl.SelectedPC.Inventory.RifleSlot = CurrentSave.PlayerInventory.RifleSlot; GameManager.Inst.PlayerControl.SelectedPC.Inventory.SideArmSlot = CurrentSave.PlayerInventory.SideArmSlot; GameManager.Inst.PlayerControl.SelectedPC.Inventory.ThrowSlot = CurrentSave.PlayerInventory.ThrowSlot; GameManager.Inst.PlayerControl.SelectedPC.Inventory.ToolSlot = CurrentSave.PlayerInventory.ToolSlot; GameManager.Inst.PlayerControl.SelectedPC.Inventory.BackpackCols = CurrentSave.PlayerInventory.BackpackCols; GameManager.Inst.PlayerControl.SelectedPC.Inventory.BackpackRows = CurrentSave.PlayerInventory.BackpackRows; GameManager.Inst.PlayerControl.SelectedPC.Inventory.Backpack = new List <GridItemData>(CurrentSave.PlayerInventory.Backpack); GameManager.Inst.PlayerControl.SelectedPC.Inventory.PostLoad(); GameManager.Inst.PlayerControl.SelectedPC.ArmorSystem.SwitchToArmor(GameManager.Inst.PlayerControl.SelectedPC.Inventory.ArmorSlot); GameManager.Inst.PlayerControl.SelectedPC.ArmorSystem.SwitchToHelmet(GameManager.Inst.PlayerControl.SelectedPC.Inventory.HeadSlot); GameManager.Inst.PlayerControl.SelectedPC.MyAI.WeaponSystem.LoadWeaponsFromInventory(false); //place player in last saved location GameManager.Inst.PlayerControl.SelectedPC.transform.position = new Vector3(CurrentSave.PlayerLocation[0], CurrentSave.PlayerLocation[1], CurrentSave.PlayerLocation[2]); //load story conditions GameManager.Inst.QuestManager.StoryConditions = new Dictionary <string, StoryCondition>(); foreach (StoryConditionItem condition in CurrentSave.ItemConditions) { GameManager.Inst.QuestManager.StoryConditions.Add(condition.ID, condition); } foreach (StoryConditionTrigger condition in CurrentSave.TriggerConditions) { GameManager.Inst.QuestManager.StoryConditions.Add(condition.ID, condition); } //load story event handler LinkedList <StoryEventListener> [] storyListenerLists = StoryEventHandler.Instance.AllListenerLists; for (int i = 0; i < storyListenerLists.Length; i++) { storyListenerLists[i].Clear(); for (int j = 0; j < CurrentSave.StoryListenerLists[i].Count; j++) { storyListenerLists[i].AddLast(CurrentSave.StoryListenerLists[i][j]); } } StoryEventHandler.Instance.StoryEventQueue = StoryEventHandler.Instance.ConvertListStoryEventToQueue(CurrentSave.StoryEventList); StoryEventHandler.Instance.CurrentStoryEvent = CurrentSave.CurrentStoryEvent; StoryEventHandler.Instance.IsCurrentEventDone = CurrentSave.IsCurrentEventDone; //load pickup items Level currentLevel = GameManager.Inst.WorldManager.CurrentLevel; //remove all existing pickup items GameObject [] objects = GameObject.FindGameObjectsWithTag("PickupItem"); foreach (GameObject o in objects) { GameObject.Destroy(o); } //create new ones foreach (PickupItemData pickupItemData in currentLevel.PickupItemDatas) { //create an Item from ItemID Item item = GameManager.Inst.ItemManager.LoadItem(pickupItemData.ItemID); var resource = Resources.Load(item.PrefabName + "Pickup"); if (resource != null) { GameObject pickup = GameObject.Instantiate(resource) as GameObject; pickup.transform.position = pickupItemData.Pos.ConvertToVector3(); pickup.transform.localEulerAngles = pickupItemData.EulerAngles.ConvertToVector3(); Transform parent = GameManager.Inst.ItemManager.FindPickupItemParent(pickup.transform); if (parent != null) { pickup.transform.parent = parent; } pickup.GetComponent <PickupItem>().Item = item; pickup.GetComponent <PickupItem>().Quantity = pickupItemData.Quantity; pickup.GetComponent <PickupItem>().Durability = pickupItemData.Durability; } } //load Chests //clear all existing chests in this level and then add new content objects = GameObject.FindGameObjectsWithTag("Chest"); foreach (GameObject o in objects) { Chest chest = o.GetComponent <Chest>(); chest.Items.Clear(); foreach (ChestData chestData in currentLevel.ChestDatas) { if (chest.ChestID == chestData.ChestID) { chest.Items = chestData.Items; chest.IsLocked = chestData.IsLocked; chest.KeyID = chestData.KeyID; chest.PostLoad(); } } } //load doors GameObject [] doors = GameObject.FindGameObjectsWithTag("Door"); foreach (GameObject o in doors) { Door door = o.GetComponent <Door>(); foreach (DoorSaveData doorData in currentLevel.Doors) { if (door.ID == "zsk_blockadedoor") { Debug.Log("blocade door unlocked? " + doorData.ID + " - " + doorData.IsLocked); } if (door.ID == doorData.ID) { door.IsLocked = doorData.IsLocked; door.IsOpen = doorData.IsOpen; } } } //load factions GameManager.Inst.NPCManager.AllFactions.Clear(); foreach (KeyValuePair <Faction, FactionData> factionData in CurrentSave.Factions) { GameManager.Inst.NPCManager.AllFactions.Add(factionData.Key, factionData.Value); factionData.Value.PostLoad(); } //load household GameManager.Inst.NPCManager.AllSquads.Clear(); Household [] households = (Household[])GameObject.FindObjectsOfType <Household>(); foreach (Household household in households) { foreach (HouseholdSaveData saveData in currentLevel.Households) { if (household.name == saveData.HouseholdName) { if (saveData.CurrentSquadID != "") { //create a new squad AISquad squad = new AISquad(); squad.ID = saveData.CurrentSquadID; squad.Tier = saveData.CurrentSquadTier; squad.Faction = saveData.OwningFaction; squad.Household = household; squad.Household.CurrentSquad = squad; if (!GameManager.Inst.NPCManager.AllSquads.ContainsKey(squad.ID)) { GameManager.Inst.NPCManager.AllSquads.Add(squad.ID, squad); } } household.IsMemberAlreadyAdded = true; household.SetScheduleData(saveData.IsRefilledToday, saveData.Expedition1SentToday, saveData.Expedition2SentToday, saveData.ExpeditionTime1, saveData.ExpeditionTime2); } } } //load characters //first remove all existing characters GameObject [] npcs = GameObject.FindGameObjectsWithTag("NPC"); foreach (GameObject npc in npcs) { npc.tag = "Untagged"; GameObject.Destroy(npc.gameObject); } //add new characters from save //then reinitialize NPCManager npcs = GameObject.FindGameObjectsWithTag("NPC"); Debug.Log("Number of loading NPC before loading " + npcs.Length); foreach (CharacterSaveData characterData in currentLevel.Characters) { if (characterData.CharacterType == CharacterType.Human) { HumanCharacter character = GameObject.Instantiate(Resources.Load("HumanCharacter") as GameObject).GetComponent <HumanCharacter>(); character.CharacterID = characterData.CharacterID; character.GoapID = characterData.GoapID; character.Initialize(); character.MyNavAgent.enabled = false; character.CharacterType = characterData.CharacterType; character.SquadID = characterData.SquadID; character.Faction = characterData.Faction; character.IsCommander = characterData.IsCommander; character.IsEssential = characterData.IsEssential; character.MyStatus.Data = characterData.StatusData; character.transform.position = characterData.Pos.ConvertToVector3(); character.transform.localEulerAngles = characterData.Angles.ConvertToVector3(); character.MyNavAgent.enabled = true; character.Name = characterData.Name; character.Title = characterData.Title; character.gameObject.name = characterData.GOName; //attach job components if (characterData.Jobs.Contains(NPCJobs.Trader)) { character.gameObject.AddComponent <Trader>(); } character.Inventory = new CharacterInventory(); character.Inventory.ArmorSlot = characterData.Inventory.ArmorSlot; character.Inventory.HeadSlot = characterData.Inventory.HeadSlot; character.Inventory.RifleSlot = characterData.Inventory.RifleSlot; character.Inventory.SideArmSlot = characterData.Inventory.SideArmSlot; character.Inventory.ThrowSlot = characterData.Inventory.ThrowSlot; character.Inventory.ToolSlot = characterData.Inventory.ToolSlot; character.Inventory.BackpackCols = characterData.Inventory.BackpackCols; character.Inventory.BackpackRows = characterData.Inventory.BackpackRows; character.Inventory.Backpack = new List <GridItemData>(characterData.Inventory.Backpack); character.Inventory.PostLoad(); } else if (characterData.CharacterType == CharacterType.Mutant) { MutantCharacter character = GameObject.Instantiate(Resources.Load("MutantCharacter") as GameObject).GetComponent <MutantCharacter>(); character.CharacterID = characterData.CharacterID; character.GoapID = characterData.GoapID; character.Initialize(); character.MyNavAgent.enabled = false; character.CharacterType = characterData.CharacterType; character.SquadID = characterData.SquadID; character.Faction = characterData.Faction; GameManager.Inst.ItemManager.LoadNPCInventory(character.Inventory, character.Faction, 0); character.Inventory.PostLoad(); character.MyStatus.Data = characterData.StatusData; character.transform.position = characterData.Pos.ConvertToVector3(); character.MyNavAgent.enabled = true; character.Name = characterData.Name; character.Title = characterData.Title; character.gameObject.name = characterData.GOName; } else if (characterData.CharacterType == CharacterType.Animal) { MutantCharacter character = GameObject.Instantiate(Resources.Load("MutantAnimal") as GameObject).GetComponent <MutantCharacter>(); character.CharacterID = characterData.CharacterID; character.GoapID = characterData.GoapID; character.Initialize(); character.MyNavAgent.enabled = false; character.CharacterType = characterData.CharacterType; character.SquadID = characterData.SquadID; character.Faction = characterData.Faction; GameManager.Inst.ItemManager.LoadNPCInventory(character.Inventory, character.Faction, 0); character.Inventory.PostLoad(); character.MyStatus.Data = characterData.StatusData; character.transform.position = characterData.Pos.ConvertToVector3(); character.MyNavAgent.enabled = true; character.Name = characterData.Name; character.Title = characterData.Title; character.gameObject.name = characterData.GOName; } } GameManager.Inst.NPCManager.Initialize(); //add player to NPC manager GameManager.Inst.NPCManager.AddHumanCharacter(GameManager.Inst.PlayerControl.SelectedPC); //load traders foreach (HumanCharacter character in GameManager.Inst.NPCManager.HumansInScene) { Trader trader = character.GetComponent <Trader>(); if (trader != null) { Debug.Log("loading trader, on character " + character.CharacterID); foreach (TraderData traderData in currentLevel.Traders) { if (traderData.CharacterID == character.CharacterID) { trader.Cash = traderData.Cash; trader.Tier = traderData.Tier; trader.TraderInventory = traderData.TraderInventory; trader.SupplyRenewTimer = traderData.SupplyRenewTimer; trader.PostLoad(); } } } } return(true); }