HeavenStudio/Assets/Scripts/Games/BoardMeeting/BMExecutive.cs
minenice55 b1fab52ad9
Integration of Jukebox Library (#451) (#457)
* add Jukebox library

todo:
- saving / loading of new format
- inferrence of unknown data like past versions
- move the temporary float casts to proper use of double
- make sound related functions take double for timing
- inform people that the Jukebox sound player was renamed to SoundByte lol

* make sound, input scheduling, and super curve use double precision

* successfully load charts

* editor works again

v1 riqs can be saved and loaded

* first tempo and volume markers are unmovable

fix loading of charts' easing values

* use gsync / freesync

* update Jukebox refs to SoundByte

* game events use double part 1

Air Rally - Glee Club converted

* don't load song if chart load fails

* finish conversion of all minigames

* remove editor waveform toggle

* timeline now respects added song offset length

clear cache files on app close
prepped notes for dsp sync

* update timeline length when offset changed

* update to latest Jukebox

* make error panel object in global game manager

* improve conductor music scheduling

* added error message box

fix first game events sometimes not playing
2023-06-10 19:17:06 +00:00

102 lines
3.1 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using HeavenStudio.Util;
namespace HeavenStudio.Games.Scripts_BoardMeeting
{
public class BMExecutive : MonoBehaviour
{
public BoardMeeting game;
public bool player;
public Animator anim;
bool canBop = true;
int smileCounter = 0;
public bool spinning;
bool preparing;
Sound rollLoop = null;
private void Awake()
{
anim = GetComponent<Animator>();
game = BoardMeeting.instance;
}
public void Prepare()
{
if (spinning) return;
preparing = true;
anim.DoScaledAnimationAsync("Prepare", 0.5f);
canBop = false;
}
public void Spin(string soundToPlay = "A", bool forceStart = false)
{
if (spinning) return;
spinning = true;
preparing = false;
string animToPlay = game.firstSpinner.anim.GetCurrentAnimatorStateInfo(0).IsName("Spin") ? "Spin" : "LoopSpin";
if (this == game.firstSpinner) anim.DoUnscaledAnimation("Spin", 0);
else anim.DoUnscaledAnimation(forceStart ? "Spin" : animToPlay, forceStart ? 0 : game.firstSpinner.anim.GetCurrentAnimatorStateInfo(0).normalizedTime);
canBop = false;
SoundByte.PlayOneShotGame("boardMeeting/rollPrepare" + soundToPlay);
float offset = 0;
switch (soundToPlay)
{
case "A":
case "B":
offset = 0.01041666666f;
break;
case "C":
case "Player":
offset = 0.02083333333f;
break;
default:
offset = 0;
break;
}
rollLoop = SoundByte.PlayOneShotGame("boardMeeting/roll" + soundToPlay, Conductor.instance.songPositionInBeatsAsDouble + 0.5f - Conductor.instance.GetRestFromRealTime(offset), 1, 1, true);
}
public void Stop(bool hit = true)
{
if (!spinning) return;
spinning = false;
anim.DoScaledAnimationAsync(hit ? "Stop" : "Miss", hit ? 0.5f : 0.25f);
if (rollLoop != null)
{
rollLoop.KillLoop(0);
rollLoop = null;
}
BeatAction.New(game.gameObject, new List<BeatAction.Action>()
{
new BeatAction.Action(Conductor.instance.songPositionInBeatsAsDouble + 1.5f, delegate { canBop = true; })
});
}
public void Bop()
{
if (!canBop || spinning || !anim.IsAnimationNotPlaying() || preparing) return;
if (smileCounter > 0)
{
anim.DoScaledAnimationAsync("SmileBop", 0.5f);
smileCounter--;
}
else
{
anim.DoScaledAnimationAsync("Bop", 0.5f);
}
}
public void Smile()
{
if (spinning) return;
if (!preparing) anim.Play("SmileIdle");
smileCounter = 2;
}
}
}