You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
263 lines
12 KiB
C#
263 lines
12 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using SiegeSong;
|
|
|
|
namespace SiegeSong
|
|
{
|
|
public class SaveFileLoader : MonoBehaviour
|
|
{
|
|
public GameObject PlayerTracker;
|
|
|
|
public InstanceManager InstanceManager;
|
|
public RuntimeManager RuntimeManager;
|
|
|
|
public SaveFile ActiveSaveFile;
|
|
public MetaData ActiveSaveFileMeta;
|
|
public string ActiveSaveFileLocation;
|
|
|
|
private float StartingPositionX = 106.979240417480470f;
|
|
private float StartingPositionY = 060.595188140869140f;
|
|
private float StartingPositionZ = 292.302947998046900f;
|
|
|
|
private float StartingRotationX = 007.244431018829346f;
|
|
private float StartingRotationY = 291.974426269531270f;
|
|
private float StartingRotationZ = 002.719870090484619f;
|
|
|
|
private int[] StartingPlayerInventoryItemIDs = new int[1] { 3 };
|
|
private int[] StartingPlayerInventoryItemQuantities = new int[1] { 1 };
|
|
private int[] StartingPlayerActiveInventoryItemIDs = new int[1] { 3 };
|
|
|
|
private int StartingMinute = 30;
|
|
private int StartingHour = 9;
|
|
private int StartingDay = 1;
|
|
private int StartingYear = 1136;
|
|
|
|
public string DirectoryName = "SaveGameData";
|
|
|
|
public MetaData[] GetSaveFilesMetaData(bool saving = false)
|
|
{
|
|
if (!System.IO.Directory.Exists($"{Application.persistentDataPath}\\{DirectoryName}\\"))
|
|
System.IO.Directory.CreateDirectory($"{Application.persistentDataPath}\\{DirectoryName}\\");
|
|
|
|
var metaDataList = new List<MetaData>();
|
|
var filePaths = System.IO.Directory.GetFiles($"{Application.persistentDataPath}\\{DirectoryName}\\");
|
|
for (var i = 0; i < filePaths.Length; i++)
|
|
{
|
|
var filePath = filePaths[i];
|
|
if (filePath.EndsWith(".sngm"))
|
|
{
|
|
metaDataList.Add(JsonUtility.FromJson<MetaData>(System.IO.File.ReadAllText(filePath)));
|
|
}
|
|
}
|
|
|
|
if (saving)
|
|
metaDataList.Insert(0, new MetaData());
|
|
|
|
return metaDataList.ToArray();
|
|
}
|
|
|
|
public void SaveGameFile(string overwrittenFilePath = "")
|
|
{
|
|
if (!System.IO.Directory.Exists($"{Application.persistentDataPath}\\{DirectoryName}\\"))
|
|
System.IO.Directory.CreateDirectory($"{Application.persistentDataPath}\\{DirectoryName}\\");
|
|
|
|
if (ActiveSaveFileMeta == null)
|
|
ActiveSaveFileMeta = new MetaData();
|
|
if (ActiveSaveFile == null)
|
|
ActiveSaveFile = new SaveFile();
|
|
|
|
var playerFriendlyFullName = "";
|
|
var actorList = new List<Statistics>();
|
|
for (var i = 0; i < InstanceManager.Instances.Length; i++)
|
|
{
|
|
var instance = InstanceManager.Instances[i];
|
|
var instanceID = InstanceManager.InstanceIDs[i];
|
|
if (instanceID == InstanceManager.CurrentPlayerInstanceID)
|
|
{
|
|
var actor = instance.GetComponent<StatisticsManager>();
|
|
actorList.Add(actor.Stats);
|
|
playerFriendlyFullName = $"{actor.Stats.FirstName} {actor.Stats.LastName}";
|
|
ActiveSaveFileMeta.PlayerFullName = $"{actor.Stats.FirstName} {actor.Stats.LastName}";
|
|
ActiveSaveFileMeta.PlayerLevel = actor.Stats.Level;
|
|
ActiveSaveFileMeta.PlayerActiveQuestFriendlyName = "None";
|
|
}
|
|
}
|
|
ActiveSaveFile.Actors = actorList;
|
|
|
|
//ActiveSaveFile.PreviewImage;
|
|
|
|
var systemDateTime = System.DateTime.Now;
|
|
ActiveSaveFileMeta.LastPlayedOn = $"{(systemDateTime.Hour >= 12 ? $"{(systemDateTime.Hour - (systemDateTime.Hour == 12 ? 0 : 12)).ToString("D2")}:{systemDateTime.Minute.ToString("D2")}PM" : $"{systemDateTime.Hour.ToString("D2")}:{systemDateTime.Minute.ToString("D2")}AM")} {systemDateTime.Day.ToString("D2")}/{systemDateTime.Month.ToString("D2")}/{systemDateTime.Year}";
|
|
ActiveSaveFileMeta.InGameDate = $"{(RuntimeManager.Calendar.Hour >= 12 ? $"{(RuntimeManager.Calendar.Hour - (systemDateTime.Hour == 12 ? 0 : 12)).ToString("D2")}:{RuntimeManager.Calendar.Minute.ToString("D2")}PM" : $"{RuntimeManager.Calendar.Hour.ToString("D2")}:{RuntimeManager.Calendar.Minute.ToString("D2")}AM")} {RuntimeManager.Calendar.Day}/{RuntimeManager.Calendar.Month.ToString("D2")}/{RuntimeManager.Calendar.Year}";
|
|
|
|
ActiveSaveFile.Year = RuntimeManager.Calendar.Year;
|
|
ActiveSaveFile.Day = RuntimeManager.Calendar.Day;
|
|
ActiveSaveFile.Minute = RuntimeManager.Calendar.Minute;
|
|
ActiveSaveFile.Hour = RuntimeManager.Calendar.Hour;
|
|
|
|
if (!string.IsNullOrEmpty(overwrittenFilePath))
|
|
{
|
|
System.IO.File.WriteAllText($"{overwrittenFilePath}", JsonUtility.ToJson(ActiveSaveFile));
|
|
}
|
|
else
|
|
{
|
|
ActiveSaveFileLocation = $"{Application.persistentDataPath}\\{DirectoryName}\\{ActiveSaveFileMeta.PlayerFullName}";
|
|
var saveFileNameSuffix = "00001";
|
|
var i = 1;
|
|
while (System.IO.File.Exists($"{ActiveSaveFileLocation}{saveFileNameSuffix}"))
|
|
{
|
|
i++;
|
|
saveFileNameSuffix = i.ToString("D5");
|
|
}
|
|
ActiveSaveFileLocation = $"{ActiveSaveFileLocation}_{saveFileNameSuffix}";
|
|
ActiveSaveFileMeta.Title = $"{playerFriendlyFullName} - Save Game {i}";
|
|
System.IO.File.WriteAllText($"{ActiveSaveFileLocation}.ssng", JsonUtility.ToJson(ActiveSaveFile));
|
|
System.IO.File.WriteAllText($"{ActiveSaveFileLocation}.sngm", JsonUtility.ToJson(ActiveSaveFileMeta));
|
|
}
|
|
}
|
|
|
|
public void LoadGameFile()
|
|
{
|
|
RuntimeManager.SetVolatileReferencesActiveState(false);
|
|
InstanceManager.ClearAndUnload();
|
|
//RuntimeManager.ClearAndUnload();
|
|
|
|
ActiveSaveFile = JsonUtility.FromJson<SaveFile>(System.IO.File.ReadAllText($"{ActiveSaveFileLocation}.ssng"));
|
|
GameObject instance = new GameObject();
|
|
foreach (var stats in ActiveSaveFile.Actors)
|
|
{
|
|
for(var i = 0; i < InstanceManager.SpeciesDefinitionsContainer.transform.childCount; i++)
|
|
{
|
|
var species = InstanceManager.SpeciesDefinitionsContainer.transform.GetChild(i);
|
|
if (species.gameObject.name == InstanceManager.HumanSpeciesKey)
|
|
instance = GameObject.Instantiate(species).gameObject;
|
|
}
|
|
|
|
if (instance.GetComponent<StatisticsManager>() == null)
|
|
instance.AddComponent<StatisticsManager>();
|
|
|
|
var actor = instance.GetComponent<StatisticsManager>();
|
|
|
|
if (actor.Stats == null)
|
|
actor.Stats = new Statistics();
|
|
|
|
if (!instance.active)
|
|
instance.active = true;
|
|
|
|
if (stats.IsPlayer)
|
|
{
|
|
for (var j = 0; j < instance.transform.childCount; j++)
|
|
{
|
|
if (instance.transform.GetChild(j).name == "PlayerAgent")
|
|
{
|
|
instance.transform.GetChild(j).gameObject.active = true;
|
|
|
|
PlayerTracker.transform.parent = instance.transform;
|
|
}
|
|
}
|
|
}
|
|
|
|
actor.Stats = stats;
|
|
instance.transform.eulerAngles = new Vector3(stats.RotationX, stats.RotationY, stats.RotationZ);
|
|
instance.transform.position = new Vector3(stats.LocationX, stats.LocationY, stats.LocationZ);
|
|
|
|
for (var i = 0; i < stats.InventoryItemIDs.Count; i++)
|
|
{
|
|
actor.Inventory.SelectedItemID = stats.InventoryItemIDs[i];
|
|
actor.Inventory.SelectedAmount = stats.InventoryItemQuantities[i];
|
|
actor.Inventory.AddItem();
|
|
actor.Inventory.SelectedItemID = 0;
|
|
actor.Inventory.SelectedAmount = 0;
|
|
actor.Inventory.SelectedItemIndex = 0;
|
|
}
|
|
foreach (var itemId in stats.ActiveInventoryItemIDs)
|
|
{
|
|
if (actor.Inventory.GetItemByID(itemId).GetComponent<Equipable>() != null)
|
|
actor.Inventory.EquipmentManager.AddEquipmentToSlots(actor.Inventory.GetItemByID(itemId));
|
|
}
|
|
actor.Inventory.ApparrelManager.CurrentlyActiveIDs = stats.ActiveInventoryItemIDs.ToArray();
|
|
actor.Inventory.ApparrelManager.UpdateApparrel();
|
|
|
|
|
|
actor.Stats.InstanceID = InstanceManager.GenerateInstanceID();
|
|
instance.gameObject.name = $"{actor.Stats.FirstName} {actor.Stats.LastName}";
|
|
InstanceManager.AddInstance(actor.Stats.InstanceID, instance);
|
|
if (stats.IsPlayer)
|
|
{
|
|
InstanceManager.CurrentPlayerInstanceID = actor.Stats.InstanceID;
|
|
RuntimeManager.PlayerInstance = instance;
|
|
}
|
|
}
|
|
|
|
RuntimeManager.Calendar.SetDateTime(ActiveSaveFile.Minute, ActiveSaveFile.Hour, ActiveSaveFile.Day, ActiveSaveFile.Year);
|
|
RuntimeManager.PopulateReferences();
|
|
RuntimeManager.SetVolatileReferencesActiveState(true);
|
|
}
|
|
|
|
public void RunNewGameSetup()
|
|
{
|
|
ActiveSaveFile = new SaveFile();
|
|
|
|
var playerInstance = new GameObject();
|
|
|
|
for (var i = 0; i < InstanceManager.SpeciesDefinitionsContainer.transform.childCount; i++)
|
|
{
|
|
var species = InstanceManager.SpeciesDefinitionsContainer.transform.GetChild(i);
|
|
if (species.gameObject.name == InstanceManager.HumanSpeciesKey)
|
|
playerInstance = GameObject.Instantiate(species).gameObject;
|
|
}
|
|
|
|
var actor = playerInstance.GetComponent<StatisticsManager>();
|
|
actor.Stats = new Statistics();
|
|
|
|
for (var i = 0; i < playerInstance.transform.childCount; i++)
|
|
{
|
|
var child = playerInstance.transform.GetChild(i);
|
|
if (child.gameObject.name == "PlayerAgent")
|
|
{
|
|
child.gameObject.active = true;
|
|
PlayerTracker.transform.parent = playerInstance.transform;
|
|
//playerInstance.transform.eulerAngles = new Vector3(StartingRotationX, StartingRotationY, StartingRotationZ);
|
|
playerInstance.transform.position = new Vector3(StartingPositionX, StartingPositionY, StartingPositionZ);
|
|
}
|
|
}
|
|
|
|
for (var i = 0; i < StartingPlayerInventoryItemIDs.Length; i++)
|
|
{
|
|
actor.Inventory.SelectedItemID = StartingPlayerInventoryItemIDs[i];
|
|
actor.Inventory.SelectedAmount = StartingPlayerInventoryItemQuantities[i];
|
|
actor.Inventory.AddItem();
|
|
actor.Inventory.SelectedItemID = 0;
|
|
actor.Inventory.SelectedAmount = 0;
|
|
actor.Inventory.SelectedItemIndex = 0;
|
|
}
|
|
|
|
foreach (var itemId in StartingPlayerActiveInventoryItemIDs)
|
|
{
|
|
if (actor.Inventory.GetItemByID(itemId).GetComponent<Equipable>() != null)
|
|
actor.Inventory.EquipmentManager.AddEquipmentToSlots(actor.Inventory.GetItemByID(itemId));
|
|
}
|
|
|
|
actor.Inventory.ApparrelManager.CurrentlyActiveIDs = StartingPlayerActiveInventoryItemIDs;
|
|
actor.Inventory.ApparrelManager.UpdateApparrel();
|
|
|
|
actor.Stats.InstanceID = InstanceManager.GenerateInstanceID();
|
|
playerInstance.gameObject.name = $"{actor.Stats.FirstName} {actor.Stats.LastName}";
|
|
InstanceManager.AddInstance(actor.Stats.InstanceID, playerInstance);
|
|
InstanceManager.CurrentPlayerInstanceID = actor.Stats.InstanceID;
|
|
RuntimeManager.PlayerInstance = playerInstance;
|
|
playerInstance.gameObject.active = true;
|
|
RuntimeManager.PopulateReferences();
|
|
RuntimeManager.Calendar.SetDateTime(StartingMinute, StartingHour, StartingDay, StartingYear);
|
|
RuntimeManager.SetVolatileReferencesActiveState(true);
|
|
//ActorEditor.ChangeAppearance(actor);
|
|
//StoryBeatManager.BeginNewTimeline();
|
|
}
|
|
|
|
void Start() { }
|
|
|
|
void Update() { }
|
|
}
|
|
}
|