浏览代码

Added save Questline status

/main
uChema 3 年前
当前提交
d3f9b548
共有 9 个文件被更改,包括 162 次插入21 次删除
  1. 108
      UOP1_Project/Assets/Scripts/Quests/QuestManagerSO.cs
  2. 8
      UOP1_Project/Assets/Scripts/Quests/ScriptableObjects/QuestSO.cs
  3. 8
      UOP1_Project/Assets/Scripts/Quests/ScriptableObjects/QuestlineSO.cs
  4. 8
      UOP1_Project/Assets/Scripts/Quests/ScriptableObjects/StepSO.cs
  5. 4
      UOP1_Project/Assets/Scripts/Quests/StepController.cs.meta
  6. 2
      UOP1_Project/Assets/Scripts/SaveSystem/Save.cs
  7. 30
      UOP1_Project/Assets/Scripts/SaveSystem/SaveSystem.cs
  8. 8
      UOP1_Project/Assets/Scripts/SceneManagement/StartGame.cs
  9. 7
      UOP1_Project/Assets/Scripts/UI/Dialogue/UIDialogueManager.cs

108
UOP1_Project/Assets/Scripts/Quests/QuestManagerSO.cs


_playLosingQuest.OnEventRaised -= SetLosingSteps;
}
public void StartGame()
{//Add code for saved information
{
//Add code for saved information
StartQuestline();
StartQuestline();
}
void StartQuestline()
{

{
_currentQuestlineIndex = _questlines.FindIndex(o => !o.IsDone);
if (_currentQuestlineIndex >= 0)
_currentQuestline = _questlines.Find(o => !o.IsDone);
}

//start Step
_currentStepIndex = 0;
_currentStepIndex = _currentQuest.Steps.FindIndex(o => o.IsDone == false);
Debug.Log("Step " + _currentStepIndex);
Debug.Log("Step done" + _currentQuest.Steps.FindIndex(o => o.IsDone));
if (_currentStepIndex >= 0)
StartStep();
}

}
void SetLosingSteps()
void SetLosingSteps()
{
for (int i = 0; i < _losingQuest.Steps.Count; i++)
_currentQuest.Steps.Add(_losingQuest.Steps[i]);

Debug.Log("StartStep");
if (_currentQuest.Steps != null)
if (_currentQuest.Steps.Count > _currentStepIndex)
{

{
if (_currentStep != null)
{
{
switch (_currentStep.Type)
{
case StepType.CheckItem:

}
public List<string> GetFinishedQuestlineItemsGUIds()
{
List<string> finishedItemsGUIds = new List<string>();
foreach (var questline in _questlines)
{
if (questline.IsDone)
{
finishedItemsGUIds.Add(questline.Guid);
}
foreach (var quest in questline.Quests)
{
if (quest.IsDone)
{
finishedItemsGUIds.Add(quest.Guid);
}
foreach (var step in quest.Steps)
{
if (step.IsDone)
{
finishedItemsGUIds.Add(step.Guid);
}
}
}
}
return finishedItemsGUIds;
}
public void SetFinishedQuestlineItemsFromSave(List<string> finishedItemsGUIds)
{
foreach (var questline in _questlines)
{
questline.IsDone = finishedItemsGUIds.Exists(o => o == questline.Guid);
foreach (var quest in questline.Quests)
{
quest.IsDone = finishedItemsGUIds.Exists(o => o == quest.Guid);
foreach (var step in quest.Steps)
{
step.IsDone = finishedItemsGUIds.Exists(o => o == step.Guid);
}
}
}
//Start Questline with the new data
StartQuestline();
}
public void ResetQuestlines()
{
foreach (var questline in _questlines)
{
questline.IsDone = false;
foreach (var quest in questline.Quests)
{
quest.IsDone = false;
foreach (var step in quest.Steps)
{
step.IsDone = false;
}
}
}
_currentQuest = null;
_currentQuestline = null;
_currentStep = null;
_currentQuestIndex = 0;
_currentQuestlineIndex = 0;
_currentStepIndex = 0;
//Start Questline with the new data
StartQuestline();
}
}

8
UOP1_Project/Assets/Scripts/Quests/ScriptableObjects/QuestSO.cs


using UnityEngine;
[CreateAssetMenu(fileName = "Quest", menuName = "Quests/Quest", order = 51)]
public class QuestSO : ScriptableObject
public class QuestSO : SerializableScriptableObject
{
[SerializeField]
private int _idQuest = 0;

public int IdQuest => _idQuest;
public List<StepSO> Steps => _steps;
public bool IsDone => _isDone;
public bool IsDone
{
get => _isDone;
set => _isDone = value;
}
public VoidEventChannelSO EndQuestEvent => _endQuestEvent;
public void FinishQuest()
{

8
UOP1_Project/Assets/Scripts/Quests/ScriptableObjects/QuestlineSO.cs


using UnityEngine;
[CreateAssetMenu(fileName = "Questline", menuName = "Quests/Questline", order = 51)]
public class QuestlineSO : ScriptableObject
public class QuestlineSO : SerializableScriptableObject
{
[SerializeField]
private int _idQuestLine = 0;

public List<QuestSO> Quests => _quests;
public VoidEventChannelSO EndQuestlineEvent => _endQuestlineEvent;
public bool IsDone => _isDone;
public bool IsDone
{
get => _isDone;
set => _isDone = value;
}
public void FinishQuestline()
{
if(_endQuestlineEvent!=null)

8
UOP1_Project/Assets/Scripts/Quests/ScriptableObjects/StepSO.cs


RewardItem
}
[CreateAssetMenu(fileName = "step", menuName = "Quests/step", order = 51)]
public class StepSO : ScriptableObject
public class StepSO : SerializableScriptableObject
{
[Tooltip("The Character this mission will need interaction with")]

public VoidEventChannelSO EndStepEvent => _endStepEvent;
public StepType Type => _type;
public bool IsDone => _isDone;
public bool IsDone
{
get => _isDone;
set => _isDone = value;
}
public ActorSO Actor => _actor;
public void FinishStep()

4
UOP1_Project/Assets/Scripts/Quests/StepController.cs.meta


- _interactionEvent: {instanceID: 0}
- _winDialogueEvent: {instanceID: 0}
- _loseDialogueEvent: {instanceID: 0}
- _endDialogueEvent: {instanceID: 0}
- _endDialogueEvent: {fileID: 11400000, guid: 53a7f1f01ef364704b1d45d01f2421ae,
type: 2}
- dialogueShot: {instanceID: 0}
executionOrder: 0
icon: {instanceID: 0}
userData:

2
UOP1_Project/Assets/Scripts/SaveSystem/Save.cs


// The variables need to be public, else we would have to write trivial getter/setter functions.
public string _locationId;
public List<SerializedItemStack> _itemStacks = new List<SerializedItemStack>();
public List<string> _finishedQuestlineItemsGUIds = new List<string>();
public string ToJson()
{
return JsonUtility.ToJson(this);

30
UOP1_Project/Assets/Scripts/SaveSystem/SaveSystem.cs


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;

[SerializeField] private LoadEventChannelSO _loadLocation = default;
[SerializeField] private Inventory _playerInventory;
public string saveFilename = "save.chop";
[SerializeField] private Inventory _playerInventory=default;
[SerializeField]
private QuestManagerSO _questManagerSO = default;
public string saveFilename = "save.chop";
public string backupSaveFilename = "save.chop.bak";
public Save saveData = new Save();

}
}
}
public void LoadSavedQuestlineStatus()
{
_questManagerSO.SetFinishedQuestlineItemsFromSave(saveData._finishedQuestlineItemsGUIds);
}
public void SaveDataToDisk()
{

// saveData._itemStacks.Add(new SerializedItemStack(itemStack.Item.Guid, itemStack.Amount));
saveData._itemStacks.Add(new SerializedItemStack(itemStack.Item.Guid, itemStack.Amount));
saveData._finishedQuestlineItemsGUIds.Clear();
foreach (var item in _questManagerSO.GetFinishedQuestlineItemsGUIds())
{
saveData._finishedQuestlineItemsGUIds.Add(item);
}
if (FileManager.MoveFile(saveFilename, backupSaveFilename))
{
if (FileManager.WriteToFile(saveFilename, saveData.ToJson()))

public void WriteEmptySaveFile()
{
FileManager.WriteToFile(saveFilename, "");
}
public void SetNewGameData()
{
FileManager.WriteToFile(saveFilename, "");
_playerInventory.Items.Clear();
_questManagerSO.ResetQuestlines();
SaveDataToDisk();
}
}

8
UOP1_Project/Assets/Scripts/SceneManagement/StartGame.cs


void StartNewGame()
{
_hasSaveData = false;
_saveSystem.WriteEmptySaveFile();
//Start new game
_saveSystem. WriteEmptySaveFile();
_saveSystem.SetNewGameData();
//Start new game
_startGameEvent.RaiseEvent(_locationsToLoad, _showLoadScreen);

IEnumerator LoadSaveGame()
{
yield return StartCoroutine(_saveSystem.LoadSavedInventory());
_saveSystem.LoadSavedQuestlineStatus();
var locationGuid = _saveSystem.saveData._locationId;
var asyncOperationHandle = Addressables.LoadAssetAsync<LocationSO>(locationGuid);
yield return asyncOperationHandle;

7
UOP1_Project/Assets/Scripts/UI/Dialogue/UIDialogueManager.cs


[SerializeField] private UIDialogueChoicesManager _choicesManager = default;
[SerializeField] private DialogueChoicesChannelSO _showChoicesEvent = default;
private void Start()
private void OnEnable ()
}
private void OnDisable()
{
_showChoicesEvent.OnEventRaised -= ShowChoices;
}
public void SetDialogue(LocalizedString dialogueLine, ActorSO actor)

正在加载...
取消
保存