private void GatherDoorsData() { QuestSystem questSystem = GameObject.Find("QuestSystem").GetComponent <QuestSystem>(); var gameDoors = GameObject.FindGameObjectsWithTag("Door"); doors = new DoorSaveData[gameDoors.Length]; for (int i = 0; i < doors.Length; i++) { doors[i] = new DoorSaveData(gameDoors[i].tag, gameDoors[i].name, gameDoors[i].GetComponent <DoorScript>().isAccessible, gameDoors[i].GetComponent <DoorScript>().isOpened); } }
public void Save(string saveGameName, string newLevelName) { CurrentSave = new SaveGame(); //save player location CurrentSave.PlayerLocation = new float[3]; CurrentSave.PlayerLocation[0] = GameManager.Inst.PlayerControl.SelectedPC.transform.position.x; CurrentSave.PlayerLocation[1] = GameManager.Inst.PlayerControl.SelectedPC.transform.position.y; CurrentSave.PlayerLocation[2] = GameManager.Inst.PlayerControl.SelectedPC.transform.position.z; //save player status CurrentSave.PlayerStatus = GameManager.Inst.PlayerControl.SelectedPC.MyStatus.Data; //save player inventory CurrentSave.PlayerInventory = new CharacterInventorySaveData(); CurrentSave.PlayerInventory.ArmorSlot = GameManager.Inst.PlayerControl.SelectedPC.Inventory.ArmorSlot; CurrentSave.PlayerInventory.HeadSlot = GameManager.Inst.PlayerControl.SelectedPC.Inventory.HeadSlot; CurrentSave.PlayerInventory.RifleSlot = GameManager.Inst.PlayerControl.SelectedPC.Inventory.RifleSlot; CurrentSave.PlayerInventory.SideArmSlot = GameManager.Inst.PlayerControl.SelectedPC.Inventory.SideArmSlot; CurrentSave.PlayerInventory.ThrowSlot = GameManager.Inst.PlayerControl.SelectedPC.Inventory.ThrowSlot; CurrentSave.PlayerInventory.ToolSlot = GameManager.Inst.PlayerControl.SelectedPC.Inventory.ToolSlot; CurrentSave.PlayerInventory.BackpackCols = GameManager.Inst.PlayerControl.SelectedPC.Inventory.BackpackCols; CurrentSave.PlayerInventory.BackpackRows = GameManager.Inst.PlayerControl.SelectedPC.Inventory.BackpackRows; CurrentSave.PlayerInventory.Backpack = new List <GridItemData>(GameManager.Inst.PlayerControl.SelectedPC.Inventory.Backpack); //save player boosts CurrentSave.PlayerBoosts = GameManager.Inst.PlayerControl.Survival.GetStatBoosts(); CurrentSave.PlayerFirstName = GameManager.Inst.PlayerProgress.PlayerFirstName; CurrentSave.PlayerLastName = GameManager.Inst.PlayerProgress.PlayerLastName; CurrentSave.DiscoveredTopics = new List <string>(GameManager.Inst.PlayerProgress.DiscoveredTopics); CurrentSave.JournalEntries = new List <List <string> >(GameManager.Inst.PlayerProgress.JournalEntries); CurrentSave.IncompleteTasks = new List <int>(GameManager.Inst.PlayerProgress.IncompleteTasks); CurrentSave.CompletedTasks = new List <int>(GameManager.Inst.PlayerProgress.CompletedTasks); //save story conditions CurrentSave.ItemConditions = new List <StoryConditionItem>(); CurrentSave.TriggerConditions = new List <StoryConditionTrigger>(); foreach (KeyValuePair <string, StoryCondition> storyCondition in GameManager.Inst.QuestManager.StoryConditions) { if (storyCondition.Value.Type == StoryConditionType.Item) { CurrentSave.ItemConditions.Add((StoryConditionItem)storyCondition.Value); } else if (storyCondition.Value.Type == StoryConditionType.Trigger) { CurrentSave.TriggerConditions.Add((StoryConditionTrigger)storyCondition.Value); } } //save story event handler LinkedList <StoryEventListener> [] storyListenerLists = StoryEventHandler.Instance.AllListenerLists; CurrentSave.StoryListenerLists = new List <StoryEventListener> [storyListenerLists.Length]; for (int i = 0; i < storyListenerLists.Length; i++) { List <StoryEventListener> list = StoryEventHandler.Instance.ConvertLinkedListenerToList(storyListenerLists[i]); CurrentSave.StoryListenerLists[i] = list; } CurrentSave.StoryEventList = StoryEventHandler.Instance.ConvertQueueStoryEventToList(StoryEventHandler.Instance.StoryEventQueue); CurrentSave.CurrentStoryEvent = StoryEventHandler.Instance.CurrentStoryEvent; CurrentSave.IsCurrentEventDone = StoryEventHandler.Instance.IsCurrentEventDone; //create new level data after removing existing one List <Level> allLevelsCopy = new List <Level>(GameManager.Inst.WorldManager.AllLevels); foreach (Level level in allLevelsCopy) { if (level.Name == GameManager.Inst.WorldManager.CurrentLevel.Name) { GameManager.Inst.WorldManager.AllLevels.Remove(level); } } Debug.Log("how many levels in AllLevels? " + GameManager.Inst.WorldManager.AllLevels.Count); CurrentSave.CurrentDay = GameManager.Inst.WorldManager.CurrentDay; CurrentSave.CurrentTime = GameManager.Inst.WorldManager.CurrentTime; CurrentSave.CurrentWeather = GameManager.Inst.WorldManager.CurrentWeather; CurrentSave.IsDayTime = GameManager.Inst.WorldManager.IsDayTime; CurrentSave.DayNightTransition = GameManager.Inst.WorldManager.DayNightTransition; CurrentSave.NightDayTransition = GameManager.Inst.WorldManager.NightDayTransition; Level currentLevel = new Level(); currentLevel.Name = GameManager.Inst.WorldManager.CurrentLevel.Name; //save pickup items in the scene //first remove all pickup items from list from current level List <PickupItemData> pickupDataList = new List <PickupItemData>(); //now go through all pickup items in the scene and create pickup data list GameObject [] objects = GameObject.FindGameObjectsWithTag("PickupItem"); foreach (GameObject o in objects) { PickupItem pickup = o.GetComponent <PickupItem>(); PickupItemData data = new PickupItemData(); data.ItemID = pickup.Item.ID; data.Quantity = pickup.Quantity; data.Durability = pickup.Durability; data.Pos = new SerVector3(pickup.transform.position); data.EulerAngles = new SerVector3(pickup.transform.localEulerAngles); pickupDataList.Add(data); } currentLevel.PickupItemDatas = pickupDataList; //save characters in this level currentLevel.Characters = new List <CharacterSaveData>(); GameObject [] characters = GameObject.FindGameObjectsWithTag("NPC"); foreach (GameObject o in characters) { //only save character who have household Character character = o.GetComponent <Character>(); if (character.MyAI.Squad == null || character.MyAI.Squad.Household == null || character.MyAI.Squad.Household.CurrentSquad.Faction != character.Faction) { continue; } CharacterSaveData saveData = new CharacterSaveData(); saveData.GoapID = character.GoapID; saveData.CharacterID = character.CharacterID; saveData.Name = character.Name; saveData.Title = character.Title; saveData.GOName = character.name; saveData.CharacterType = character.CharacterType; saveData.SquadID = character.MyAI.Squad.Household.CurrentSquad.ID; saveData.Faction = character.Faction; saveData.IsCommander = character.IsCommander; saveData.IsEssential = character.IsEssential; saveData.StatusData = character.MyStatus.Data; saveData.Jobs = character.MyJobs; saveData.Pos = new SerVector3(character.transform.position); saveData.Angles = new SerVector3(character.transform.localEulerAngles); saveData.Inventory = new CharacterInventorySaveData(); saveData.Inventory.ArmorSlot = character.Inventory.HeadSlot; saveData.Inventory.HeadSlot = character.Inventory.HeadSlot; saveData.Inventory.RifleSlot = character.Inventory.RifleSlot; saveData.Inventory.SideArmSlot = character.Inventory.SideArmSlot; saveData.Inventory.ThrowSlot = character.Inventory.ThrowSlot; saveData.Inventory.ToolSlot = character.Inventory.ToolSlot; saveData.Inventory.BackpackCols = character.Inventory.BackpackCols; saveData.Inventory.BackpackRows = character.Inventory.BackpackRows; saveData.Inventory.Backpack = new List <GridItemData>(character.Inventory.Backpack); currentLevel.Characters.Add(saveData); } //save traders for current level List <TraderData> traders = new List <TraderData>(); foreach (HumanCharacter character in GameManager.Inst.NPCManager.HumansInScene) { Trader trader = character.GetComponent <Trader>(); if (trader != null) { TraderData traderData = new TraderData(); traderData.CharacterID = character.CharacterID; traderData.Cash = trader.Cash; traderData.Tier = trader.Tier; traderData.TraderInventory = trader.TraderInventory; traderData.SupplyRenewTimer = trader.SupplyRenewTimer; traders.Add(traderData); } } currentLevel.Traders = traders; //save chests //first remove all chests from list from current level List <ChestData> chestDataList = new List <ChestData>(); //now go through all chests in the scene and create pickup data list GameObject [] chests = GameObject.FindGameObjectsWithTag("Chest"); foreach (GameObject o in chests) { Chest chest = o.GetComponent <Chest>(); ChestData data = new ChestData(); data.ChestID = chest.ChestID; data.ColSize = chest.ColSize; data.RowSize = chest.RowSize; data.Items = chest.Items; data.IsLocked = chest.IsLocked; data.KeyID = chest.KeyID; chestDataList.Add(data); } currentLevel.ChestDatas = chestDataList; //save households currentLevel.Households = new List <HouseholdSaveData>(); Household [] households = (Household[])GameObject.FindObjectsOfType <Household>(); foreach (Household household in households) { HouseholdSaveData saveData = new HouseholdSaveData(); saveData.HouseholdName = household.name; if (household.CurrentSquad != null) { saveData.CurrentSquadID = household.CurrentSquad.ID; saveData.CurrentSquadTier = household.CurrentSquad.Tier; saveData.OwningFaction = household.CurrentSquad.Faction; } else { saveData.CurrentSquadID = ""; saveData.CurrentSquadTier = 1; } saveData.IsRefilledToday = household.IsRefilledToday; saveData.Expedition1SentToday = household.Expedition1SentToday; saveData.Expedition2SentToday = household.Expedition2SentToday; saveData.ExpeditionTime1 = household.ExpeditionTime1; saveData.ExpeditionTime2 = household.ExpeditionTime2; currentLevel.Households.Add(saveData); } //save doors currentLevel.Doors = new List <DoorSaveData>(); GameObject [] doors = GameObject.FindGameObjectsWithTag("Door"); foreach (GameObject o in doors) { Door door = o.GetComponent <Door>(); DoorSaveData saveData = new DoorSaveData(); saveData.ID = door.ID; saveData.IsLocked = door.IsLocked; if (door.ID == "zsk_blockadedoor") { Debug.Log(door.ID + " is locked? " + saveData.IsLocked); } saveData.IsOpen = door.IsOpen; currentLevel.Doors.Add(saveData); } GameManager.Inst.WorldManager.AllLevels.Add(currentLevel); CurrentSave.Levels = new List <Level>(GameManager.Inst.WorldManager.AllLevels); CurrentSave.CurrentEnvironmentName = GameManager.Inst.WorldManager.CurrentEnvironment.Name; //save factions CurrentSave.Factions = new List <KeyValuePair <Faction, FactionData> >(); foreach (KeyValuePair <Faction, FactionData> factionData in GameManager.Inst.NPCManager.AllFactions) { factionData.Value.PrepareSave(); CurrentSave.Factions.Add(factionData); } //build the save file if (!String.IsNullOrEmpty(newLevelName)) { CurrentSave.LevelToLoad = newLevelName; saveGameName = "Autosave - " + newLevelName; } else { CurrentSave.LevelToLoad = GameManager.Inst.WorldManager.CurrentLevelName; } string fullPath = Application.persistentDataPath + "/" + saveGameName + ".dat"; BinaryFormatter bf = new BinaryFormatter(); FileStream file; if (File.Exists(fullPath)) { file = File.Open(fullPath, FileMode.Open); } else { file = File.Create(fullPath); } bf.Serialize(file, CurrentSave); Debug.Log(saveGameName + " has been saved"); GameManager.Inst.UIManager.SetConsoleText("Game saved."); }