revival/game/Assets/Scripts/Dialogue/BazFinalSequence.cs

101 lines
2.8 KiB
C#

using System;
using System.Collections;
using Cinemachine;
using DG.Tweening;
using Google.Apis.Util;
using UnityEngine;
using UnityEngine.InputSystem;
public class BazFinalSequence : MonoBehaviour
{
[Serializable]
private struct Baz
{
public Door door;
public Animator anim;
public float pauseTime;
public float scaleFactor;
public GameObject graphics;
public Transform scaleTarget;
public float hoverHeight;
}
[Serializable]
private struct Flickers
{
public float intensity;
public float period;
}
[SerializeField] private GameObject _player;
[SerializeField] private CinemachineFreeLook _camera;
[SerializeField] private Baz _baz;
[SerializeField] private GameObject _statue;
[SerializeField] private Flickers _flickers;
private WaitForSeconds _bazPauseForEffect;
private WaitForSeconds _bazWalk;
private void Awake()
{
_bazPauseForEffect = new WaitForSeconds(_baz.pauseTime);
_bazWalk = new WaitForSeconds(_baz.door.AnimTime);
}
public void Trigger()
{
StartCoroutine(BazCR());
}
private IEnumerator BazCR()
{
// TODO: disable player movement/abilities
var input = _player.GetComponent<PlayerInput>();
input.enabled = false;
// _camera.LookAt = _baz.scaleTarget;
// _camera.Follow = _baz.scaleTarget;
var elapsed = 0f;
while (elapsed < _flickers.period)
{
elapsed += Time.deltaTime;
var t = Time.time * _flickers.intensity;
var p = Mathf.PerlinNoise(t, Mathf.Sin(t));
_statue.SetActive(p > elapsed/_flickers.period);
_baz.graphics.SetActive(!_statue.activeSelf);
yield return null;
}
// there is no xandar only baz
_statue.SetActive(false);
_baz.graphics.SetActive(true);
// wait a couple of moments
yield return _bazPauseForEffect;
// baz float-walks to the player
_baz.door.Open();
_baz.anim.SetBool("moving", true);
var ogScale = _baz.scaleTarget.localScale;
_baz.scaleTarget.DOScale(ogScale * _baz.scaleFactor, _baz.door.AnimTime);
yield return _bazWalk;
_baz.anim.SetBool("moving", false);
var pos = _baz.scaleTarget.position;
var playerPos = _player.transform.position;
pos.y = playerPos.y + _baz.hoverHeight;
_baz.scaleTarget.position = pos;
_baz.scaleTarget.LookAt(playerPos + _baz.hoverHeight * Vector3.up);
// roll credits!
}
}