private bool TryGetCheckpoint(LogParam logParam, bool isLatest, out GameStateCheckpoint checkpoint) { ulong nodeHistoryHash; if (isLatest) { nodeHistoryHash = gameState.nodeHistory.Hash; } else { var backNodeIndex = gameState.nodeHistory.FindLastIndex(x => x.Equals(logParam.nodeHistoryEntry)); nodeHistoryHash = gameState.nodeHistory.GetHashULong(0, backNodeIndex + 1, logParam.dialogueIndex + 1); } var entry = checkpointManager.GetReached(nodeHistoryHash, logParam.nodeHistoryEntry.Key, logParam.dialogueIndex); if (entry is GameStateCheckpoint _checkpoint) { checkpoint = _checkpoint; return(true); } else { checkpoint = null; return(false); } }
private void DialogueSaveCheckpoint(bool firstEntryOfNode, bool dialogueStepped, out bool isReached, out bool isReachedAnyHistory) { if (!firstEntryOfNode && dialogueStepped) { stepNumFromLastCheckpoint++; } var entry = checkpointManager.GetReached(nodeHistory, currentIndex); isReached = entry != null; isReachedAnyHistory = checkpointManager.IsReachedAnyHistory(currentNode.name, currentIndex); if (entry == null) { // Tell CheckpointManager that a new dialogue entry has been reached checkpointManager.SetReached(nodeHistory, currentIndex, GetRestoreEntry()); } // Change states after creating or restoring from checkpoint if (shouldSaveCheckpoint) { stepNumFromLastCheckpoint = 0; } if (entry != null) { this.RuntimeAssert(stepNumFromLastCheckpoint == entry.stepNumFromLastCheckpoint, $"stepNumFromLastCheckpoint mismatch: {stepNumFromLastCheckpoint} {entry.stepNumFromLastCheckpoint}. Try to clear save data."); this.RuntimeAssert(restrainCheckpointNum == entry.restrainCheckpointNum, $"restrainCheckpointNum mismatch: {restrainCheckpointNum} {entry.restrainCheckpointNum}. Try to clear save data."); } if (checkpointRestrained) { restrainCheckpointNum--; } // As the action for this dialogue will be re-run, it's fine to just reset forceCheckpoint to false forceCheckpoint = false; }