Interactables documentaiton
This commit is contained in:
@@ -560,6 +560,15 @@ namespace AppleHills.Editor.PuzzleSystem
|
||||
|
||||
EditorGUILayout.BeginHorizontal(EditorStyles.toolbar);
|
||||
EditorGUILayout.LabelField($"Current Level: {_runtimeLevelData.levelId}", EditorStyles.boldLabel);
|
||||
|
||||
GUILayout.FlexibleSpace();
|
||||
|
||||
// Unlock All button
|
||||
if (GUILayout.Button("Unlock All", EditorStyles.toolbarButton, GUILayout.Width(100)))
|
||||
{
|
||||
UnlockAllPuzzles();
|
||||
}
|
||||
|
||||
EditorGUILayout.EndHorizontal();
|
||||
|
||||
_debugScrollPosition = EditorGUILayout.BeginScrollView(_debugScrollPosition);
|
||||
@@ -870,6 +879,121 @@ namespace AppleHills.Editor.PuzzleSystem
|
||||
UpdateRuntimeData();
|
||||
}
|
||||
|
||||
private void UnlockAllPuzzles()
|
||||
{
|
||||
if (!_isPlaying || _runtimeLevelData == null) return;
|
||||
|
||||
PuzzleManager puzzleManager = Object.FindFirstObjectByType<PuzzleManager>();
|
||||
if (puzzleManager == null)
|
||||
{
|
||||
Debug.LogError("[Puzzle Editor] Cannot find PuzzleManager in scene");
|
||||
return;
|
||||
}
|
||||
|
||||
Debug.Log("[Puzzle Editor] Starting to unlock all puzzles...");
|
||||
|
||||
// Get all steps from the level data
|
||||
List<PuzzleStepSO> allSteps = new List<PuzzleStepSO>(_runtimeLevelData.allSteps);
|
||||
|
||||
// Track which steps we've processed
|
||||
HashSet<string> processedSteps = new HashSet<string>();
|
||||
bool madeProgress = true;
|
||||
int maxIterations = 100; // Safety limit to prevent infinite loops
|
||||
int iteration = 0;
|
||||
|
||||
// Keep iterating until no more steps can be unlocked/completed
|
||||
while (madeProgress && iteration < maxIterations)
|
||||
{
|
||||
madeProgress = false;
|
||||
iteration++;
|
||||
|
||||
foreach (var step in allSteps)
|
||||
{
|
||||
if (step == null || processedSteps.Contains(step.stepId))
|
||||
continue;
|
||||
|
||||
// Check if already completed
|
||||
if (puzzleManager.IsPuzzleStepCompleted(step.stepId))
|
||||
{
|
||||
processedSteps.Add(step.stepId);
|
||||
continue;
|
||||
}
|
||||
|
||||
// Check if step is unlocked or can be unlocked
|
||||
bool isUnlocked = puzzleManager.IsStepUnlocked(step);
|
||||
|
||||
if (!isUnlocked)
|
||||
{
|
||||
// Try to unlock it if dependencies are met
|
||||
// We need to check if all dependencies are completed
|
||||
bool canUnlock = CanUnlockStep(step, puzzleManager);
|
||||
|
||||
if (canUnlock)
|
||||
{
|
||||
// Unlock the step using reflection
|
||||
System.Type managerType = puzzleManager.GetType();
|
||||
System.Reflection.MethodInfo unlockMethod = managerType.GetMethod("UnlockStep",
|
||||
System.Reflection.BindingFlags.Instance |
|
||||
System.Reflection.BindingFlags.Public |
|
||||
System.Reflection.BindingFlags.NonPublic);
|
||||
|
||||
if (unlockMethod != null)
|
||||
{
|
||||
unlockMethod.Invoke(puzzleManager, new object[] { step });
|
||||
Debug.Log($"[Puzzle Editor] Unlocked step: {step.stepId}");
|
||||
isUnlocked = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// If unlocked, complete it
|
||||
if (isUnlocked && !puzzleManager.IsPuzzleStepCompleted(step.stepId))
|
||||
{
|
||||
puzzleManager.MarkPuzzleStepCompleted(step);
|
||||
Debug.Log($"[Puzzle Editor] Completed step: {step.stepId}");
|
||||
processedSteps.Add(step.stepId);
|
||||
madeProgress = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (iteration >= maxIterations)
|
||||
{
|
||||
Debug.LogWarning($"[Puzzle Editor] Reached maximum iterations ({maxIterations}). Some steps may not have been completed.");
|
||||
}
|
||||
|
||||
Debug.Log($"[Puzzle Editor] Unlock all complete. Processed {processedSteps.Count} steps in {iteration} iterations.");
|
||||
|
||||
// Update runtime data to reflect all changes
|
||||
UpdateRuntimeData();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Checks if a step can be unlocked by verifying all its dependencies are completed
|
||||
/// </summary>
|
||||
private bool CanUnlockStep(PuzzleStepSO step, PuzzleManager puzzleManager)
|
||||
{
|
||||
if (step == null || _runtimeLevelData == null) return false;
|
||||
|
||||
// Initial steps can always be unlocked
|
||||
if (_runtimeLevelData.IsInitialStep(step))
|
||||
return true;
|
||||
|
||||
// Check if all dependencies are completed
|
||||
if (_runtimeLevelData.stepDependencies.TryGetValue(step.stepId, out string[] dependencies))
|
||||
{
|
||||
foreach (var depId in dependencies)
|
||||
{
|
||||
if (!puzzleManager.IsPuzzleStepCompleted(depId))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user