using DG.Tweening;
using NaughtyBezierCurves;
using HeavenStudio.Util;
using System;
using System.Collections.Generic;
using UnityEngine;
namespace HeavenStudio.Games.Loaders
{
using static Minigames;
public static class NtrTunnelLoader
{
public static Minigame AddGame(EventCaller eventCaller)
{
return new Minigame("tunnel", "Tunnel \n[WIP]", "B4E6F6", false, false, new List()
{
new GameAction("cowbell", "Cowbell")
{
function = delegate { Tunnel.instance.StartCowbell(eventCaller.currentEntity.beat, eventCaller.currentEntity["toggle"], eventCaller.currentEntity.length); },
defaultLength = 1f,
resizable = true,
parameters = new List()
{
new Param("toggle", false, "Driver can stop", "Lets the driver stop if the player makes too many mistakes"),
}
},
new GameAction("countin", "Count In")
{
function = delegate { Tunnel.instance.CountIn(eventCaller.currentEntity.beat, eventCaller.currentEntity.length); },
defaultLength = 3f,
resizable = true,
}
}
//new List() {"ntr", "aim"},
//"ntrcoin", "en",
//new List() {}
);
}
}
}
namespace HeavenStudio.Games
{
public class Tunnel : Minigame
{
public static Tunnel instance { get; set; }
[Header("Backgrounds")]
public SpriteRenderer fg;
public SpriteRenderer bg;
Tween bgColorTween;
Tween fgColorTween;
[Header("References")]
public GameObject frontHand;
[Header("Animators")]
public Animator cowbellAnimator;
public Animator driverAnimator;
[Header("Curves")]
public BezierCurve3D handCurve;
public GameEvent cowbell = new GameEvent();
public int driverState;
public float handStart;
public float handProgress;
public bool started;
private void Awake()
{
instance = this;
}
private void Start()
{
driverState = 0;
handStart = -1f;
}
private void Update()
{
var cond = Conductor.instance;
if (cond.ReportBeat(ref cowbell.lastReportedBeat, cowbell.startBeat % 1))
{
if (cond.songPositionInBeats >= cowbell.startBeat && cond.songPositionInBeats < cowbell.startBeat + cowbell.length)
{
ScheduleInput(cond.songPositionInBeats, 1, InputType.STANDARD_DOWN, CowbellSuccess, CowbellMiss, CowbellEmpty);
}
}
if (PlayerInput.Pressed() && !IsExpectingInputNow())
{
HitCowbell();
//print("unexpected input");
driverAnimator.Play("Angry1", -1, 0);
}
//update hand position
handProgress = Math.Min(Conductor.instance.songPositionInBeats - handStart, 1);
frontHand.transform.position = handCurve.GetPoint(EasingFunction.EaseOutQuad(0, 1, handProgress));
}
private void LateUpdate()
{
//nothing
}
public void HitCowbell()
{
Jukebox.PlayOneShot("count-ins/cowbell");
handStart = Conductor.instance.songPositionInBeats;
cowbellAnimator.Play("Shake",-1,0);
}
public void StartCowbell(float beat, bool driverStops, float length)
{
started = true;
cowbell.length = length;
cowbell.startBeat = beat;
//for (int i = 1; i <= length; i++)
//{
//ScheduleInput(beat, i, InputType.STANDARD_DOWN, CowbellSuccess, CowbellMiss, CowbellEmpty);
//}
}
public void CowbellSuccess(PlayerActionEvent caller, float state)
{
HitCowbell();
//print(state);
if(Math.Abs(state) >= 0.5)
{
driverAnimator.Play("Disturbed", -1, 0);
}
else
{
driverAnimator.Play("Idle", -1, 0);
}
}
public void CowbellMiss(PlayerActionEvent caller)
{
//HitCowbell();
driverAnimator.Play("Angry1", -1, 0);
}
public void CowbellEmpty(PlayerActionEvent caller)
{
//HitCowbell();
}
public void CountIn(float beat, float length)
{
List cuelist = new List();
for (int i = 0; i <= length; i++)
{
if(i % 2 == 0)
{
//Jukebox.PlayOneShotGame("tunnel/en/one", beat+i);
//print("cueing one at " + (beat + i));
cuelist.Add(new MultiSound.Sound("tunnel/en/one", beat + i));
}
else
{
//Jukebox.PlayOneShotGame("tunnel/en/two", beat+i);
//print("cueing two at " + (beat + i));
cuelist.Add(new MultiSound.Sound("tunnel/en/two", beat + i));
}
}
MultiSound.Play(cuelist.ToArray());
}
}
}