puzzle flow

This commit is contained in:
2022-11-11 16:25:25 +01:00
parent c4f63ce3be
commit 990c7205ba
8 changed files with 128 additions and 23 deletions

View File

@@ -6,7 +6,7 @@ namespace Escape_Room_Engine.Engine.Scripts.Editor
{
public class EngineEditor : EditorWindow
{
private Button _generateRoomButton;
private Button _generateRoomButton, _skipCurrentRoomButton;
[MenuItem("Window/Engine/Engine Editor")]
public static void ShowEditor()
@@ -21,9 +21,13 @@ namespace Escape_Room_Engine.Engine.Scripts.Editor
{
text = "Generate Room"
};
rootVisualElement.Add(_generateRoomButton);
_skipCurrentRoomButton = new Button(SkipCurrentRoom)
{
text = "Skip Current Room"
};
rootVisualElement.Add(_skipCurrentRoomButton);
EditorApplication.playModeStateChanged += _ => UpdateUI();
UpdateUI();
}
@@ -38,9 +42,19 @@ namespace Escape_Room_Engine.Engine.Scripts.Editor
}
}
private void SkipCurrentRoom()
{
if (EditorApplication.isPlaying)
{
Engine.DefaultEngine.CurrentRoom.Match(some: room => room.SkipRoom());
UpdateUI();
}
}
private void UpdateUI()
{
_generateRoomButton.SetEnabled(EditorApplication.isPlaying);
_skipCurrentRoomButton.SetEnabled(EditorApplication.isPlaying && Engine.DefaultEngine.NumberOfRooms > 0);
}
}
}

View File

@@ -27,9 +27,10 @@ namespace Escape_Room_Engine.Engine.Scripts
[Required] public EngineConfiguration config;
private int NumberOfRooms => _rooms.Count;
public int NumberOfRooms => _rooms.Count;
public IOption<Room> CurrentRoom => NumberOfRooms > 0 ? Some<Room>.Of(_rooms[^1]) : None<Room>.New();
private readonly List<Room> _rooms = new(1);
private readonly List<Room> _rooms = new();
private GameObject _playSpaceOrigin;
private void Start()
@@ -59,7 +60,7 @@ namespace Escape_Room_Engine.Engine.Scripts
Logger.Log("Generating space...", LogType.RoomGeneration);
// create space
var space = new Space(entrance);
var space = new Space(room, entrance);
// add exit
var exitDoor = new DoorModule(space, config.exitDoorTypes.RandomElement());

View File

@@ -1,5 +1,6 @@
using System;
using UnityEngine;
using LogType = Escape_Room_Engine.Engine.Scripts.Utilities.LogType;
namespace Escape_Room_Engine.Engine.Scripts.Modules
{
@@ -13,12 +14,21 @@ namespace Escape_Room_Engine.Engine.Scripts.Modules
{
public bool IsEntrance => IsType((ModuleType)DoorType.Entrance);
public bool IsExit => IsType((ModuleType)DoorType.Exit);
private bool _unlocked;
internal DoorModule(Space space, DoorModuleDescription description) : base(space, description)
{
srDimensions.Size = Vector2Int.one; // door always has size 1x1
}
internal void Unlock()
{
_unlocked = true;
Utilities.Logger.Log($"{this} has been unlocked", LogType.PuzzleFlow);
}
public override string ToString()
{
return $"{(IsEntrance ? "Entrance" : IsExit ? "Exit" : "Unknown")} door";

View File

@@ -1,12 +1,57 @@
using UnityEngine;
using Escape_Room_Engine.Engine.Scripts.Utilities;
using UnityEngine;
using Logger = Escape_Room_Engine.Engine.Scripts.Utilities.Logger;
using LogType = Escape_Room_Engine.Engine.Scripts.Utilities.LogType;
namespace Escape_Room_Engine.Engine.Scripts.Modules
{
public enum PuzzleEventType
{
Reset, Solved
}
public delegate void PuzzleEventHandler(PuzzleModule source, PuzzleEventType e);
public class PuzzleModule : Module
{
internal event PuzzleEventHandler PuzzleEvent;
internal bool Solved
{
get => _solved;
private set
{
var type =
!_solved && value ? Some<PuzzleEventType>.Of(PuzzleEventType.Solved)
: _solved && value ? Some<PuzzleEventType>.Of(PuzzleEventType.Reset)
: None<PuzzleEventType>.New();
_solved = value;
type.Match(some: OnPuzzleEvent);
}
}
private bool _solved;
internal PuzzleModule(Space space, PuzzleModuleDescription description) : base(space, description)
{
srDimensions.Size = Vector2Int.one; // TODO: larger modules
}
protected virtual void OnPuzzleEvent(PuzzleEventType type)
{
Logger.Log($"{this} has been {type}", LogType.PuzzleFlow);
PuzzleEvent?.Invoke(this, type);
}
public void Solve()
{
Solved = true;
}
public override string ToString()
{
return $"Puzzle module ({(Solved ? "" : "not ")}solved)";
}
}
}

View File

@@ -1,5 +1,9 @@
using System.Collections.Generic;
using System.Linq;
using Escape_Room_Engine.Engine.Scripts.Modules;
using UnityEngine;
using Logger = Escape_Room_Engine.Engine.Scripts.Utilities.Logger;
using LogType = Escape_Room_Engine.Engine.Scripts.Utilities.LogType;
namespace Escape_Room_Engine.Engine.Scripts
{
@@ -8,7 +12,8 @@ namespace Escape_Room_Engine.Engine.Scripts
internal Passage entrance, exit;
internal GameObject roomObject;
private List<Space> _spaces = new();
private readonly List<Space> _spaces = new();
private readonly List<PuzzleModule> _puzzles = new();
internal Room(Passage entrance)
{
@@ -21,6 +26,33 @@ namespace Escape_Room_Engine.Engine.Scripts
exit = spaceExit;
}
internal void AddPuzzle(PuzzleModule puzzle)
{
_puzzles.Add(puzzle);
puzzle.PuzzleEvent += OnPuzzleEvent;
}
/// <summary>
/// Solves all puzzles in this room.
/// </summary>
public void SkipRoom()
{
Logger.Log($"Skipping {this}...", LogType.PuzzleFlow);
_puzzles.ForEach(puzzle => puzzle.Solve());
}
private void OnPuzzleEvent(PuzzleModule puzzle, PuzzleEventType type)
{
if (type == PuzzleEventType.Solved)
{
if (_puzzles.All(p => p.Solved))
{
exit.fromOut.Unlock();
}
}
}
internal void InstantiateRoom(Transform parent, string name)
{
roomObject = new GameObject($"Room {name}");
@@ -32,13 +64,9 @@ namespace Escape_Room_Engine.Engine.Scripts
}
}
internal void Destroy()
public override string ToString()
{
foreach (var space in _spaces)
{
space.Destroy();
}
Object.Destroy(roomObject);
return roomObject.name;
}
}
}

View File

@@ -17,9 +17,11 @@ namespace Escape_Room_Engine.Engine.Scripts
internal List<Module> Modules { get; } = new(2);
private GameObject _spaceObject;
private readonly Room _room;
internal Space(Passage entrance)
internal Space(Room room, Passage entrance)
{
_room = room;
rrDimensions = GenerateSpaceDimensions(
entrance,
Engine.DefaultEngine.config.minRoomSize,
@@ -34,6 +36,11 @@ namespace Escape_Room_Engine.Engine.Scripts
internal void AddModule(Module module)
{
Modules.Add(module);
if (module is PuzzleModule puzzleModule)
{
_room.AddPuzzle(puzzleModule);
}
}
internal bool AddModuleWithRequirements(Module module)
@@ -95,11 +102,6 @@ namespace Escape_Room_Engine.Engine.Scripts
/// <param name="rrPosition">The room relative (<i>RR</i>) position that should be converted to a space relative (<i>SR</i>) position.</param>
internal Vector2Int ToSpaceRelative(Vector2Int rrPosition) => rrPosition - rrDimensions.Position;
internal void Destroy()
{
Object.Destroy(_spaceObject);
}
/// <summary>
/// Generate space dimensions that fit the required size constraints and cover the position of the entrance.
/// </summary>

View File

@@ -5,7 +5,13 @@ namespace Escape_Room_Engine.Engine.Scripts.Utilities
{
public enum LogType
{
Important, ModulePlacement, PassageConnection, RoomGeneration, PuzzleGeneration, RequirementResolution
Important,
ModulePlacement,
PassageConnection,
RoomGeneration,
PuzzleGeneration,
RequirementResolution,
PuzzleFlow
}
public class Logger : MonoBehaviour