示例#1
0
    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);
        }
    }
示例#2
0
    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.");
    }