DynamicColor, Crystal prefab, Finish Puzzle B

This commit is contained in:
2022-11-28 23:31:00 +01:00
parent 60e390a993
commit 450c16c94f
63 changed files with 2915 additions and 361 deletions

View File

@@ -1,27 +1,110 @@
using System.Collections.Generic;
using System;
using System.Collections.Generic;
using EscapeRoomEngine.Engine.Runtime;
using EscapeRoomEngine.Engine.Runtime.Modules;
using EscapeRoomEngine.Engine.Runtime.Utilities;
using JetBrains.Annotations;
using NaughtyAttributes;
using UnityEngine;
namespace EscapeRoomEngine.Desert.Runtime.Puzzle_B
{
[Serializable]
internal struct ButtonAction
{
public SymbolButton button;
public List<int> stateIndices;
}
public class PuzzleB : StatePuzzle
{
[ValidateInput("CorrectRotatorCount")]
public List<Transform> rotators;
public List<Rotator> rotators;
[InfoBox("Every button action will toggle the states at the given indices between 0 and 90 degrees.")]
[SerializeField]
private List<ButtonAction> buttonActions;
[BoxGroup("Internal")] [SerializeField]
private List<Emission> lights;
[BoxGroup("Internal")] [SerializeField]
private Crystal crystal;
private DynamicColor _puzzleColor, _solvedColor;
protected override void StatesUpdate()
protected override void Awake()
{
base.StatesUpdate();
base.Awake();
_puzzleColor = Engine.Runtime.Engine.DefaultEngine.theme.puzzleColor;
_solvedColor = Engine.Runtime.Engine.DefaultEngine.theme.solvedColor;
}
protected override void Start()
{
base.Start();
PuzzleEvent += (_, type) =>
{
switch (type)
{
case PuzzleEventType.Restarted:
crystal.Color = _puzzleColor;
lights.ForEach(emission => emission.color = _puzzleColor.hdr);
rotators.ForEach(rotator => rotator.Emission.color = _puzzleColor.hdr);
buttonActions.ForEach(action => action.button.Enable());
break;
case PuzzleEventType.Solved:
crystal.Color = _solvedColor;
lights.ForEach(emission => emission.color = _solvedColor.hdr);
rotators.ForEach(rotator => rotator.Emission.color = _solvedColor.hdr);
buttonActions.ForEach(action => action.button.Disable());
break;
case PuzzleEventType.WrongInput:
break;
default:
throw new ArgumentOutOfRangeException(nameof(type), type, null);
}
};
foreach (var buttonAction in buttonActions)
{
buttonAction.button.ButtonEvent += (_, type) =>
{
if (type == ButtonEventType.Pressed)
{
Switch(buttonAction);
}
};
}
crystal.Active = true;
lights.ForEach(emission => emission.active = true);
rotators.ForEach(rotator => rotator.Emission.active = true);
}
protected override void SetState(int index, int value, bool checkSolution)
{
base.SetState(index, value, checkSolution);
for (var i = 0; i < stateCount; i++)
{
rotators[i].localRotation = Quaternion.AngleAxis(states[i], Vector3.up);
rotators[i].angle = states[i];
}
}
private void Switch(ButtonAction action)
{
for (var i = 0; i < action.stateIndices.Count; i++)
{
var stateIndex = action.stateIndices[i];
var current = OrientationExtensions.FromAngle(states[stateIndex]);
current = current == Orientation.North ? current.Rotated(1) : current.Rotated(-1);
// set state but only check solution on the last change
SetState(stateIndex, current.AngleInt(), i == action.stateIndices.Count - 1);
}
}
[UsedImplicitly]
private bool CorrectRotatorCount(List<Transform> list) => list != null && list.Count == stateCount;
private bool CorrectRotatorCount(List<Rotator> list) => list != null && list.Count == stateCount;
}
}

View File

@@ -0,0 +1,29 @@
using System;
using UnityEngine;
namespace EscapeRoomEngine.Desert.Runtime.Puzzle_B
{
[RequireComponent(typeof(Emission))]
public class Rotator : MonoBehaviour
{
[Range(0, 359)] public int angle;
[Range(0, 1)] public float speed;
public Emission Emission { get; private set; }
private void Awake()
{
Emission = GetComponent<Emission>();
}
private void Update()
{
angle %= 360;
var angleDifference = angle - transform.localEulerAngles.y;
if (Math.Abs(angleDifference) >= 0.1)
{
transform.Rotate(0, angleDifference*Mathf.Pow(speed, 2), 0, Space.Self);
}
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: c4596ccc5a8dcfb4294f3932f43e1847
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: