Finish Puzzle C
This commit is contained in:
100
Assets/Desert/Runtime/Puzzle C/Dispenser.cs
Normal file
100
Assets/Desert/Runtime/Puzzle C/Dispenser.cs
Normal file
@@ -0,0 +1,100 @@
|
||||
using EscapeRoomEngine.Engine.Runtime.Modules;
|
||||
using EscapeRoomEngine.Engine.Runtime.Utilities;
|
||||
using NaughtyAttributes;
|
||||
using UnityEngine;
|
||||
using Logger = EscapeRoomEngine.Engine.Runtime.Utilities.Logger;
|
||||
using LogType = EscapeRoomEngine.Engine.Runtime.Utilities.LogType;
|
||||
|
||||
namespace EscapeRoomEngine.Desert.Runtime.Puzzle_C
|
||||
{
|
||||
[SelectionBase]
|
||||
[RequireComponent(typeof(Animator), typeof(Emission))]
|
||||
public class Dispenser : ModuleState
|
||||
{
|
||||
private static readonly int Open = Animator.StringToHash("Open");
|
||||
|
||||
public Transform dispensable;
|
||||
[SerializeField] [Min(0)]
|
||||
private float cooldown;
|
||||
[BoxGroup("Internal")] [SerializeField]
|
||||
private Transform dispenseOrigin;
|
||||
[BoxGroup("Internal")] [SerializeField]
|
||||
private Button dispenseButton;
|
||||
|
||||
public bool Solved
|
||||
{
|
||||
set
|
||||
{
|
||||
if (value)
|
||||
{
|
||||
CloseHatch();
|
||||
dispenseButton.Disable();
|
||||
_light.color = _solvedColor.hdr;
|
||||
}
|
||||
else
|
||||
{
|
||||
dispenseButton.Enable();
|
||||
_light.color = _puzzleColor.hdr;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private float _previousDispense = -1;
|
||||
private Animator _animator;
|
||||
private Emission _light;
|
||||
private DynamicColor _puzzleColor, _solvedColor;
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
_animator = GetComponent<Animator>();
|
||||
_light = GetComponent<Emission>();
|
||||
_puzzleColor = Engine.Runtime.Engine.DefaultEngine.theme.puzzleColor;
|
||||
_solvedColor = Engine.Runtime.Engine.DefaultEngine.theme.solvedColor;
|
||||
}
|
||||
|
||||
private void Start()
|
||||
{
|
||||
dispenseButton.ButtonEvent += (_, type) =>
|
||||
{
|
||||
if (type == ButtonEventType.Pressed)
|
||||
{
|
||||
Dispense();
|
||||
}
|
||||
};
|
||||
|
||||
_light.active = true;
|
||||
}
|
||||
|
||||
#region Debug Buttons
|
||||
|
||||
[Button(enabledMode: EButtonEnableMode.Playmode)]
|
||||
public void Dispense()
|
||||
{
|
||||
if (_previousDispense + cooldown <= Time.time)
|
||||
{
|
||||
Logger.Log($"{this} dispensing {dispensable.gameObject}", LogType.PuzzleDetail);
|
||||
|
||||
_animator.SetBool(Open, true);
|
||||
Instantiate(dispensable, dispenseOrigin.position, dispenseOrigin.rotation);
|
||||
|
||||
_previousDispense = Time.time;
|
||||
}
|
||||
}
|
||||
|
||||
[Button(enabledMode: EButtonEnableMode.Playmode)]
|
||||
public void CloseHatch()
|
||||
{
|
||||
_animator.SetBool(Open, false);
|
||||
}
|
||||
|
||||
[Button(enabledMode: EButtonEnableMode.Playmode)]
|
||||
public void Solve() => Solved = true;
|
||||
|
||||
[Button(enabledMode: EButtonEnableMode.Playmode)]
|
||||
public void Reset() => Solved = false;
|
||||
|
||||
#endregion
|
||||
|
||||
public override void SetModule(Module module) {}
|
||||
}
|
||||
}
|
||||
3
Assets/Desert/Runtime/Puzzle C/Dispenser.cs.meta
Normal file
3
Assets/Desert/Runtime/Puzzle C/Dispenser.cs.meta
Normal file
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3ca2acc9138242c59fbba68a62435318
|
||||
timeCreated: 1669991155
|
||||
39
Assets/Desert/Runtime/Puzzle C/DispenserLights.cs
Normal file
39
Assets/Desert/Runtime/Puzzle C/DispenserLights.cs
Normal file
@@ -0,0 +1,39 @@
|
||||
using System;
|
||||
using NaughtyAttributes;
|
||||
using UnityEngine;
|
||||
|
||||
namespace EscapeRoomEngine.Desert.Runtime.Puzzle_C
|
||||
{
|
||||
[Serializable]
|
||||
public struct DispenserLightRow
|
||||
{
|
||||
public bool[] lights;
|
||||
}
|
||||
|
||||
public class DispenserLights : MonoBehaviour
|
||||
{
|
||||
[SerializeField]
|
||||
private DispenserLightRow[] lights;
|
||||
[BoxGroup("Internal")] [SerializeField]
|
||||
private GameObject lightPrefab;
|
||||
[BoxGroup("Internal")] [SerializeField]
|
||||
private Vector2Int gridDimensions;
|
||||
[BoxGroup("Internal")] [SerializeField]
|
||||
private Vector2 lightOffset;
|
||||
|
||||
private void Start()
|
||||
{
|
||||
var position = transform.localPosition;
|
||||
for (var y = 0; y < gridDimensions.y; y++)
|
||||
{
|
||||
var row = lights[y].lights;
|
||||
for (var x = 0; x < gridDimensions.x; x++)
|
||||
{
|
||||
var instance = Instantiate(lightPrefab, transform, false);
|
||||
instance.transform.localPosition = new Vector3(-x * lightOffset.x, 0, y * lightOffset.y);
|
||||
instance.GetComponent<Emission>().active = row[x];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
3
Assets/Desert/Runtime/Puzzle C/DispenserLights.cs.meta
Normal file
3
Assets/Desert/Runtime/Puzzle C/DispenserLights.cs.meta
Normal file
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1b796efe5676490b81fe24366d556b18
|
||||
timeCreated: 1670273719
|
||||
@@ -35,8 +35,9 @@ namespace EscapeRoomEngine.Desert.Runtime.Puzzle_C
|
||||
{
|
||||
if (Active)
|
||||
{
|
||||
Press();
|
||||
orb.Color = _activeColor.hdr;
|
||||
Emission.color = _activeColor.hdr;
|
||||
Press();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -51,6 +52,7 @@ namespace EscapeRoomEngine.Desert.Runtime.Puzzle_C
|
||||
Release();
|
||||
Emission.color = _puzzleColor.hdr;
|
||||
}
|
||||
orb.Color = _puzzleColor.hdr;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,9 +2,24 @@
|
||||
|
||||
namespace EscapeRoomEngine.Desert.Runtime.Puzzle_C
|
||||
{
|
||||
[RequireComponent(typeof(Rigidbody), typeof(Collider))]
|
||||
[RequireComponent(typeof(Rigidbody), typeof(Collider), typeof(Emission))]
|
||||
public class HoleOrb : MonoBehaviour
|
||||
{
|
||||
|
||||
public Color Color
|
||||
{
|
||||
set => _emission.color = value;
|
||||
}
|
||||
|
||||
private Emission _emission;
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
_emission = GetComponent<Emission>();
|
||||
}
|
||||
|
||||
private void Start()
|
||||
{
|
||||
_emission.active = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -12,6 +12,7 @@ namespace EscapeRoomEngine.Desert.Runtime.Puzzle_C
|
||||
private Emission frameLight;
|
||||
|
||||
private List<Hole> _holes;
|
||||
private Dispenser _dispenser;
|
||||
private DynamicColor _puzzleColor, _solvedColor, _activeColor;
|
||||
|
||||
protected override void Awake()
|
||||
@@ -40,6 +41,7 @@ namespace EscapeRoomEngine.Desert.Runtime.Puzzle_C
|
||||
hole.Emission.color = _puzzleColor.hdr;
|
||||
});
|
||||
frameLight.color = _puzzleColor.hdr;
|
||||
_dispenser.Solved = false;
|
||||
break;
|
||||
case PuzzleEventType.Solved:
|
||||
_holes.ForEach(hole =>
|
||||
@@ -48,6 +50,7 @@ namespace EscapeRoomEngine.Desert.Runtime.Puzzle_C
|
||||
hole.Emission.color = solution[hole.number] == 1 ? _activeColor.hdr : _solvedColor.hdr;
|
||||
});
|
||||
frameLight.color = _solvedColor.hdr;
|
||||
_dispenser.Solved = true;
|
||||
break;
|
||||
}
|
||||
};
|
||||
@@ -68,5 +71,20 @@ namespace EscapeRoomEngine.Desert.Runtime.Puzzle_C
|
||||
|
||||
frameLight.active = true;
|
||||
}
|
||||
|
||||
public override void SetModule(Module module)
|
||||
{
|
||||
base.SetModule(module);
|
||||
|
||||
var firstRelatedModule = Module.relatedModules[0];
|
||||
if (firstRelatedModule.State is Dispenser dispenser)
|
||||
{
|
||||
_dispenser = dispenser;
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new EngineException("Terminal was not assigned a related Ball.");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user