mirror of
https://github.com/RHeavenStudioPlus/HeavenStudioPlus.git
synced 2024-11-25 11:05:16 +00:00
Quiz Show and Tambourine Reworks (#505)
* Tambourine fully reworked * quiz show rework part 1 * quiz show rework part 2 * oopsie doopsie * el fix numbah two
This commit is contained in:
parent
242b810282
commit
d1affc9501
5 changed files with 508 additions and 304 deletions
|
@ -11105,7 +11105,7 @@ Transform:
|
||||||
- {fileID: 9173994276591170219}
|
- {fileID: 9173994276591170219}
|
||||||
- {fileID: 5713690912794439839}
|
- {fileID: 5713690912794439839}
|
||||||
m_Father: {fileID: 2914604841386194871}
|
m_Father: {fileID: 2914604841386194871}
|
||||||
m_RootOrder: 2
|
m_RootOrder: 1
|
||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
--- !u!1 &1573044212073166694
|
--- !u!1 &1573044212073166694
|
||||||
GameObject:
|
GameObject:
|
||||||
|
@ -11275,90 +11275,6 @@ SpriteRenderer:
|
||||||
m_WasSpriteAssigned: 1
|
m_WasSpriteAssigned: 1
|
||||||
m_MaskInteraction: 0
|
m_MaskInteraction: 0
|
||||||
m_SpriteSortPoint: 0
|
m_SpriteSortPoint: 0
|
||||||
--- !u!1 &1857446645930225069
|
|
||||||
GameObject:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
serializedVersion: 6
|
|
||||||
m_Component:
|
|
||||||
- component: {fileID: 782001516241619819}
|
|
||||||
- component: {fileID: 8341195154447761180}
|
|
||||||
m_Layer: 0
|
|
||||||
m_Name: QuizShowRef
|
|
||||||
m_TagString: Untagged
|
|
||||||
m_Icon: {fileID: 0}
|
|
||||||
m_NavMeshLayer: 0
|
|
||||||
m_StaticEditorFlags: 0
|
|
||||||
m_IsActive: 0
|
|
||||||
--- !u!4 &782001516241619819
|
|
||||||
Transform:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 1857446645930225069}
|
|
||||||
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
|
|
||||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
|
||||||
m_LocalScale: {x: 1.4, y: 1.4, z: 1}
|
|
||||||
m_ConstrainProportionsScale: 0
|
|
||||||
m_Children: []
|
|
||||||
m_Father: {fileID: 2914604841386194871}
|
|
||||||
m_RootOrder: 0
|
|
||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
|
||||||
--- !u!212 &8341195154447761180
|
|
||||||
SpriteRenderer:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 1857446645930225069}
|
|
||||||
m_Enabled: 1
|
|
||||||
m_CastShadows: 0
|
|
||||||
m_ReceiveShadows: 0
|
|
||||||
m_DynamicOccludee: 1
|
|
||||||
m_StaticShadowCaster: 0
|
|
||||||
m_MotionVectors: 1
|
|
||||||
m_LightProbeUsage: 1
|
|
||||||
m_ReflectionProbeUsage: 1
|
|
||||||
m_RayTracingMode: 0
|
|
||||||
m_RayTraceProcedural: 0
|
|
||||||
m_RenderingLayerMask: 1
|
|
||||||
m_RendererPriority: 0
|
|
||||||
m_Materials:
|
|
||||||
- {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0}
|
|
||||||
m_StaticBatchInfo:
|
|
||||||
firstSubMesh: 0
|
|
||||||
subMeshCount: 0
|
|
||||||
m_StaticBatchRoot: {fileID: 0}
|
|
||||||
m_ProbeAnchor: {fileID: 0}
|
|
||||||
m_LightProbeVolumeOverride: {fileID: 0}
|
|
||||||
m_ScaleInLightmap: 1
|
|
||||||
m_ReceiveGI: 1
|
|
||||||
m_PreserveUVs: 0
|
|
||||||
m_IgnoreNormalsForChartDetection: 0
|
|
||||||
m_ImportantGI: 0
|
|
||||||
m_StitchLightmapSeams: 1
|
|
||||||
m_SelectedEditorRenderState: 0
|
|
||||||
m_MinimumChartSize: 4
|
|
||||||
m_AutoUVMaxDistance: 0.5
|
|
||||||
m_AutoUVMaxAngle: 89
|
|
||||||
m_LightmapParameters: {fileID: 0}
|
|
||||||
m_SortingLayerID: 0
|
|
||||||
m_SortingLayer: 0
|
|
||||||
m_SortingOrder: 99
|
|
||||||
m_Sprite: {fileID: 21300000, guid: fe5389622580b704ba776a001533f3ed, type: 3}
|
|
||||||
m_Color: {r: 1, g: 1, b: 1, a: 1}
|
|
||||||
m_FlipX: 0
|
|
||||||
m_FlipY: 0
|
|
||||||
m_DrawMode: 0
|
|
||||||
m_Size: {x: 12.84, y: 7.22}
|
|
||||||
m_AdaptiveModeThreshold: 0.5
|
|
||||||
m_SpriteTileMode: 0
|
|
||||||
m_WasSpriteAssigned: 1
|
|
||||||
m_MaskInteraction: 0
|
|
||||||
m_SpriteSortPoint: 0
|
|
||||||
--- !u!1 &2039454163144846836
|
--- !u!1 &2039454163144846836
|
||||||
GameObject:
|
GameObject:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
|
@ -11812,7 +11728,6 @@ Transform:
|
||||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||||
m_ConstrainProportionsScale: 0
|
m_ConstrainProportionsScale: 0
|
||||||
m_Children:
|
m_Children:
|
||||||
- {fileID: 782001516241619819}
|
|
||||||
- {fileID: 3543715666523522543}
|
- {fileID: 3543715666523522543}
|
||||||
- {fileID: 8851031114052297755}
|
- {fileID: 8851031114052297755}
|
||||||
- {fileID: 5068496854343157036}
|
- {fileID: 5068496854343157036}
|
||||||
|
@ -11846,7 +11761,7 @@ MonoBehaviour:
|
||||||
hostHead: {fileID: 4158127813318533208}
|
hostHead: {fileID: 4158127813318533208}
|
||||||
signAnim: {fileID: 2616971115842020331}
|
signAnim: {fileID: 2616971115842020331}
|
||||||
timerTransform: {fileID: 2908387998248567546}
|
timerTransform: {fileID: 2908387998248567546}
|
||||||
stopWatch: {fileID: 6447998919017828740}
|
stopWatchRef: {fileID: 624264686619249452}
|
||||||
blackOut: {fileID: 3849979597205832390}
|
blackOut: {fileID: 3849979597205832390}
|
||||||
firstDigitSr: {fileID: 4365226235382245994}
|
firstDigitSr: {fileID: 4365226235382245994}
|
||||||
secondDigitSr: {fileID: 8225777099540804890}
|
secondDigitSr: {fileID: 8225777099540804890}
|
||||||
|
@ -22094,7 +22009,7 @@ Transform:
|
||||||
- {fileID: 6747383677754197943}
|
- {fileID: 6747383677754197943}
|
||||||
- {fileID: 2301657995609138378}
|
- {fileID: 2301657995609138378}
|
||||||
m_Father: {fileID: 2914604841386194871}
|
m_Father: {fileID: 2914604841386194871}
|
||||||
m_RootOrder: 6
|
m_RootOrder: 5
|
||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
--- !u!1 &4016391727385232918
|
--- !u!1 &4016391727385232918
|
||||||
GameObject:
|
GameObject:
|
||||||
|
@ -22658,7 +22573,7 @@ Transform:
|
||||||
- {fileID: 8933642563102961015}
|
- {fileID: 8933642563102961015}
|
||||||
- {fileID: 8281692494763879698}
|
- {fileID: 8281692494763879698}
|
||||||
m_Father: {fileID: 2914604841386194871}
|
m_Father: {fileID: 2914604841386194871}
|
||||||
m_RootOrder: 4
|
m_RootOrder: 3
|
||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
--- !u!1 &4478159210902822598
|
--- !u!1 &4478159210902822598
|
||||||
GameObject:
|
GameObject:
|
||||||
|
@ -28473,6 +28388,7 @@ GameObject:
|
||||||
serializedVersion: 6
|
serializedVersion: 6
|
||||||
m_Component:
|
m_Component:
|
||||||
- component: {fileID: 8035163085009309331}
|
- component: {fileID: 8035163085009309331}
|
||||||
|
- component: {fileID: 624264686619249452}
|
||||||
m_Layer: 0
|
m_Layer: 0
|
||||||
m_Name: Timer
|
m_Name: Timer
|
||||||
m_TagString: Untagged
|
m_TagString: Untagged
|
||||||
|
@ -28494,8 +28410,21 @@ Transform:
|
||||||
m_Children:
|
m_Children:
|
||||||
- {fileID: 3799935971409172323}
|
- {fileID: 3799935971409172323}
|
||||||
m_Father: {fileID: 2914604841386194871}
|
m_Father: {fileID: 2914604841386194871}
|
||||||
m_RootOrder: 5
|
m_RootOrder: 4
|
||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
|
--- !u!114 &624264686619249452
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 6447998919017828740}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: 0b23b8169f8d2c54ebcd060a25262373, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
timerTrans: {fileID: 2908387998248567546}
|
||||||
--- !u!1 &6766078402962959061
|
--- !u!1 &6766078402962959061
|
||||||
GameObject:
|
GameObject:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
|
@ -44210,7 +44139,7 @@ Transform:
|
||||||
- {fileID: 1551030855227117807}
|
- {fileID: 1551030855227117807}
|
||||||
- {fileID: 1359309479053844248}
|
- {fileID: 1359309479053844248}
|
||||||
m_Father: {fileID: 2914604841386194871}
|
m_Father: {fileID: 2914604841386194871}
|
||||||
m_RootOrder: 1
|
m_RootOrder: 0
|
||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
--- !u!95 &2616971115842020331
|
--- !u!95 &2616971115842020331
|
||||||
Animator:
|
Animator:
|
||||||
|
@ -55082,7 +55011,7 @@ Transform:
|
||||||
- {fileID: 7221935209627571158}
|
- {fileID: 7221935209627571158}
|
||||||
- {fileID: 8225487404640725788}
|
- {fileID: 8225487404640725788}
|
||||||
m_Father: {fileID: 2914604841386194871}
|
m_Father: {fileID: 2914604841386194871}
|
||||||
m_RootOrder: 3
|
m_RootOrder: 2
|
||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
--- !u!1 &9191679787071732581
|
--- !u!1 &9191679787071732581
|
||||||
GameObject:
|
GameObject:
|
||||||
|
|
30
Assets/Scripts/Games/QuizShow/QSTimer.cs
Normal file
30
Assets/Scripts/Games/QuizShow/QSTimer.cs
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEngine;
|
||||||
|
using HeavenStudio.Util;
|
||||||
|
|
||||||
|
namespace HeavenStudio.Games.Scripts_QuizShow
|
||||||
|
{
|
||||||
|
public class QSTimer : MonoBehaviour
|
||||||
|
{
|
||||||
|
[Header("Components")]
|
||||||
|
[SerializeField] private Transform timerTrans;
|
||||||
|
|
||||||
|
private double startBeat = double.MaxValue;
|
||||||
|
private float length = 0;
|
||||||
|
|
||||||
|
public void Init(double beat, float interval)
|
||||||
|
{
|
||||||
|
startBeat = beat;
|
||||||
|
length = interval;
|
||||||
|
Update();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Update()
|
||||||
|
{
|
||||||
|
var cond = Conductor.instance;
|
||||||
|
float normalizedBeat = cond.GetPositionFromBeat(startBeat, length);
|
||||||
|
if (normalizedBeat >= 0 && normalizedBeat <= 1) timerTrans.rotation = Quaternion.Euler(0, 0, normalizedBeat * -360);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
11
Assets/Scripts/Games/QuizShow/QSTimer.cs.meta
Normal file
11
Assets/Scripts/Games/QuizShow/QSTimer.cs.meta
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 0b23b8169f8d2c54ebcd060a25262373
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
|
@ -15,9 +15,18 @@ namespace HeavenStudio.Games.Loaders
|
||||||
{
|
{
|
||||||
new GameAction("intervalStart", "Start Interval")
|
new GameAction("intervalStart", "Start Interval")
|
||||||
{
|
{
|
||||||
function = delegate {var e = eventCaller.currentEntity; QuizShow.instance.StartInterval(e.beat, e.length); },
|
preFunction = delegate { var e = eventCaller.currentEntity; QuizShow.PreInterval(e.beat, e.length,
|
||||||
|
e["auto"], e["sound"], e["con"], e["visual"], e["audio"]); },
|
||||||
defaultLength = 8f,
|
defaultLength = 8f,
|
||||||
resizable = true
|
resizable = true,
|
||||||
|
parameters = new List<Param>()
|
||||||
|
{
|
||||||
|
new Param("auto", true, "Auto Pass Turn"),
|
||||||
|
new Param("sound", true, "Play Time-Up Sound?", "Should the Time-Up sound play at the end of the interval?"),
|
||||||
|
new Param("con", false, "Consecutive", "Disables everything that happens at the end of the interval if ticked on."),
|
||||||
|
new Param("visual", true, "Stopwatch (Visual)", "Should the stopwatch visually appear?"),
|
||||||
|
new Param("audio", QuizShow.ClockAudio.Both, "Stopwatch (Audio)", "Should the sounds of the stopwatch play?")
|
||||||
|
}
|
||||||
},
|
},
|
||||||
new GameAction("prepare", "Prepare Host Hands")
|
new GameAction("prepare", "Prepare Host Hands")
|
||||||
{
|
{
|
||||||
|
@ -25,17 +34,14 @@ namespace HeavenStudio.Games.Loaders
|
||||||
},
|
},
|
||||||
new GameAction("dPad", "DPad Press")
|
new GameAction("dPad", "DPad Press")
|
||||||
{
|
{
|
||||||
function = delegate {var e = eventCaller.currentEntity; QuizShow.instance.HostPressButton(e.beat, true); },
|
|
||||||
defaultLength = 0.5f
|
defaultLength = 0.5f
|
||||||
},
|
},
|
||||||
new GameAction("aButton", "A Button Press")
|
new GameAction("aButton", "A Button Press")
|
||||||
{
|
{
|
||||||
function = delegate {var e = eventCaller.currentEntity; QuizShow.instance.HostPressButton(e.beat, false); },
|
|
||||||
defaultLength = 0.5f
|
defaultLength = 0.5f
|
||||||
},
|
},
|
||||||
new GameAction("randomPresses", "Random Presses")
|
new GameAction("randomPresses", "Random Presses")
|
||||||
{
|
{
|
||||||
function = delegate { var e = eventCaller.currentEntity; QuizShow.instance.RandomPress(e.beat, e.length, e["min"], e["max"], e["random"], e["con"]); },
|
|
||||||
parameters = new List<Param>()
|
parameters = new List<Param>()
|
||||||
{
|
{
|
||||||
new Param("min", new EntityTypes.Integer(0, 666, 0), "Minimum", "The minimum number of presses this block will do."),
|
new Param("min", new EntityTypes.Integer(0, 666, 0), "Minimum", "The minimum number of presses this block will do."),
|
||||||
|
@ -47,7 +53,7 @@ namespace HeavenStudio.Games.Loaders
|
||||||
},
|
},
|
||||||
new GameAction("passTurn", "Pass Turn")
|
new GameAction("passTurn", "Pass Turn")
|
||||||
{
|
{
|
||||||
function = delegate {var e = eventCaller.currentEntity; QuizShow.instance.PassTurn(e.beat, e.length, e["sound"], e["con"], e["visual"], e["audio"]); },
|
preFunction = delegate {var e = eventCaller.currentEntity; QuizShow.PrePassTurn(e.beat, e["sound"], e["con"], e["visual"], e["audio"]); },
|
||||||
defaultLength = 1f,
|
defaultLength = 1f,
|
||||||
resizable = true,
|
resizable = true,
|
||||||
parameters = new List<Param>()
|
parameters = new List<Param>()
|
||||||
|
@ -112,6 +118,9 @@ namespace HeavenStudio.Games.Loaders
|
||||||
|
|
||||||
namespace HeavenStudio.Games
|
namespace HeavenStudio.Games
|
||||||
{
|
{
|
||||||
|
using Jukebox;
|
||||||
|
using Scripts_QuizShow;
|
||||||
|
|
||||||
public class QuizShow : Minigame
|
public class QuizShow : Minigame
|
||||||
{
|
{
|
||||||
public enum ClockAudio
|
public enum ClockAudio
|
||||||
|
@ -152,7 +161,7 @@ namespace HeavenStudio.Games
|
||||||
[SerializeField] Animator hostHead;
|
[SerializeField] Animator hostHead;
|
||||||
[SerializeField] Animator signAnim;
|
[SerializeField] Animator signAnim;
|
||||||
[SerializeField] Transform timerTransform;
|
[SerializeField] Transform timerTransform;
|
||||||
[SerializeField] GameObject stopWatch;
|
[SerializeField] QSTimer stopWatchRef;
|
||||||
[SerializeField] GameObject blackOut;
|
[SerializeField] GameObject blackOut;
|
||||||
[SerializeField] SpriteRenderer firstDigitSr;
|
[SerializeField] SpriteRenderer firstDigitSr;
|
||||||
[SerializeField] SpriteRenderer secondDigitSr;
|
[SerializeField] SpriteRenderer secondDigitSr;
|
||||||
|
@ -167,54 +176,53 @@ namespace HeavenStudio.Games
|
||||||
[SerializeField] List<Sprite> contestantNumberSprites = new List<Sprite>();
|
[SerializeField] List<Sprite> contestantNumberSprites = new List<Sprite>();
|
||||||
[SerializeField] List<Sprite> hostNumberSprites = new List<Sprite>();
|
[SerializeField] List<Sprite> hostNumberSprites = new List<Sprite>();
|
||||||
[SerializeField] Sprite explodedCounter;
|
[SerializeField] Sprite explodedCounter;
|
||||||
bool intervalStarted;
|
|
||||||
bool shouldResetCount;
|
bool shouldResetCount;
|
||||||
bool doingConsectiveIntervals;
|
bool doingConsectiveIntervals;
|
||||||
double intervalStartBeat;
|
|
||||||
double playerIntervalStartBeat;
|
|
||||||
float playerBeatInterval;
|
|
||||||
float beatInterval = 8f;
|
|
||||||
int currentStage;
|
int currentStage;
|
||||||
bool shouldPrepareArms = true;
|
bool shouldPrepareArms = true;
|
||||||
bool contExploded;
|
bool contExploded;
|
||||||
bool hostExploded;
|
bool hostExploded;
|
||||||
bool signExploded;
|
bool signExploded;
|
||||||
struct QueuedInput
|
|
||||||
{
|
|
||||||
public double beat;
|
|
||||||
public bool dpad;
|
|
||||||
}
|
|
||||||
static List<QueuedInput> queuedInputs = new List<QueuedInput>();
|
|
||||||
int pressCount;
|
int pressCount;
|
||||||
int countToMatch;
|
int countToMatch;
|
||||||
|
private double playerStartBeat = -1;
|
||||||
|
private float playerLength;
|
||||||
public static QuizShow instance;
|
public static QuizShow instance;
|
||||||
|
private struct RandomPress
|
||||||
|
{
|
||||||
|
public List<RiqEntity> randomPresses;
|
||||||
|
public double beat;
|
||||||
|
}
|
||||||
|
|
||||||
void OnDestroy()
|
private List<RandomPress> randomPresses = new();
|
||||||
{
|
|
||||||
if (!Conductor.instance.isPlaying || Conductor.instance.isPaused)
|
|
||||||
{
|
|
||||||
if (queuedInputs.Count > 0) queuedInputs.Clear();
|
|
||||||
}
|
|
||||||
foreach (var evt in scheduledInputs)
|
|
||||||
{
|
|
||||||
evt.Disable();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Awake()
|
void Awake()
|
||||||
{
|
{
|
||||||
instance = this;
|
instance = this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void OnPlay(double beat)
|
||||||
|
{
|
||||||
|
var allRandomEvents = EventCaller.GetAllInGameManagerList("quizShow", new string[] { "randomPresses" });
|
||||||
|
foreach (var randomEvent in allRandomEvents)
|
||||||
|
{
|
||||||
|
randomPresses.Add(new RandomPress()
|
||||||
|
{
|
||||||
|
beat = randomEvent.beat,
|
||||||
|
randomPresses = GetRandomPress(randomEvent.beat, randomEvent.length,
|
||||||
|
randomEvent["min"], randomEvent["max"], randomEvent["random"], randomEvent["con"])
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Update()
|
void Update()
|
||||||
{
|
{
|
||||||
var cond = Conductor.instance;
|
var cond = Conductor.instance;
|
||||||
if (cond.isPlaying && !cond.isPaused)
|
if (cond.isPlaying && !cond.isPaused)
|
||||||
{
|
{
|
||||||
float normalizedBeat = cond.GetPositionFromBeat(playerIntervalStartBeat, playerBeatInterval);
|
float normalizedBeat = cond.GetPositionFromBeat(playerStartBeat, playerLength);
|
||||||
if (normalizedBeat >= 0 && normalizedBeat <= 1)
|
if (normalizedBeat >= 0f && normalizedBeat <= 1f)
|
||||||
{
|
{
|
||||||
timerTransform.rotation = Quaternion.Euler(0, 0, normalizedBeat * -360);
|
|
||||||
if (PlayerInput.Pressed())
|
if (PlayerInput.Pressed())
|
||||||
{
|
{
|
||||||
ContesteePressButton(false);
|
ContesteePressButton(false);
|
||||||
|
@ -225,6 +233,37 @@ namespace HeavenStudio.Games
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (passedTurns.Count > 0)
|
||||||
|
{
|
||||||
|
foreach (var pass in passedTurns)
|
||||||
|
{
|
||||||
|
PassTurnStandalone(pass.beat, pass.timeUpSound, pass.consecutive, pass.visualClock, pass.audioClock);
|
||||||
|
}
|
||||||
|
passedTurns.Clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<RiqEntity> GetInputsBetweenBeat(double beat, double endBeat)
|
||||||
|
{
|
||||||
|
List<RiqEntity> allEvents = new();
|
||||||
|
List<RiqEntity> nonRandoms = EventCaller.GetAllInGameManagerList("quizShow", new string[] { "dPad", "aButton" }).FindAll(x => x.beat >= beat && x.beat < endBeat);
|
||||||
|
List<RiqEntity> randoms = new();
|
||||||
|
foreach (var rand in randomPresses)
|
||||||
|
{
|
||||||
|
if (rand.beat >= beat && rand.beat < endBeat)
|
||||||
|
{
|
||||||
|
randoms.AddRange(rand.randomPresses);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
allEvents.AddRange(nonRandoms);
|
||||||
|
allEvents.AddRange(randoms);
|
||||||
|
return allEvents;
|
||||||
|
}
|
||||||
|
|
||||||
|
private RiqEntity GetLastIntervalBeforeBeat(double beat)
|
||||||
|
{
|
||||||
|
return EventCaller.GetAllInGameManagerList("quizShow", new string[] { "intervalStart" }).FindLast(x => x.beat <= beat);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void CountModifier(bool shouldReset)
|
public void CountModifier(bool shouldReset)
|
||||||
|
@ -237,12 +276,12 @@ namespace HeavenStudio.Games
|
||||||
currentStage = stage;
|
currentStage = stage;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RandomPress(double beat, float length, int min, int max, int whichButtons, bool consecutive)
|
private List<RiqEntity> GetRandomPress(double beat, float length, int min, int max, int whichButtons, bool consecutive)
|
||||||
{
|
{
|
||||||
if (min > max) return;
|
if (min > max) return new();
|
||||||
int pressAmount = UnityEngine.Random.Range(min, max + 1);
|
int pressAmount = UnityEngine.Random.Range(min, max + 1);
|
||||||
if (pressAmount < 1) return;
|
if (pressAmount < 1) return new();
|
||||||
List<BeatAction.Action> buttonEvents = new List<BeatAction.Action>();
|
List<RiqEntity> buttonEntities = new();
|
||||||
if (consecutive)
|
if (consecutive)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < pressAmount; i++)
|
for (int i = 0; i < pressAmount; i++)
|
||||||
|
@ -266,7 +305,11 @@ namespace HeavenStudio.Games
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
double spawnBeat = beat + i * length;
|
double spawnBeat = beat + i * length;
|
||||||
buttonEvents.Add(new BeatAction.Action(spawnBeat, delegate { HostPressButton(spawnBeat, dpad); }));
|
buttonEntities.Add(new RiqEntity(new RiqEntityData()
|
||||||
|
{
|
||||||
|
beat = spawnBeat,
|
||||||
|
datamodel = dpad ? "dPad" : "aButton"
|
||||||
|
}));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -294,20 +337,19 @@ namespace HeavenStudio.Games
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
double spawnBeat = beat + i * length;
|
double spawnBeat = beat + i * length;
|
||||||
buttonEvents.Add(new BeatAction.Action(spawnBeat, delegate { HostPressButton(spawnBeat, dpad); }));
|
buttonEntities.Add(new RiqEntity(new RiqEntityData()
|
||||||
|
{
|
||||||
|
beat = spawnBeat,
|
||||||
|
datamodel = dpad ? "dPad" : "aButton"
|
||||||
|
}));
|
||||||
pressAmount--;
|
pressAmount--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return buttonEntities;
|
||||||
BeatAction.New(instance.gameObject, buttonEvents);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void HostPressButton(double beat, bool dpad)
|
public void HostPressButton(double beat, bool dpad)
|
||||||
{
|
{
|
||||||
if (!intervalStarted)
|
|
||||||
{
|
|
||||||
StartInterval(beat, beatInterval);
|
|
||||||
}
|
|
||||||
if (currentStage == 0)
|
if (currentStage == 0)
|
||||||
{
|
{
|
||||||
contesteeHead.Play("ContesteeHeadIdle", -1, 0);
|
contesteeHead.Play("ContesteeHeadIdle", -1, 0);
|
||||||
|
@ -326,11 +368,6 @@ namespace HeavenStudio.Games
|
||||||
{
|
{
|
||||||
hostLeftArmAnim.DoScaledAnimationAsync("HostLeftHit", 0.5f);
|
hostLeftArmAnim.DoScaledAnimationAsync("HostLeftHit", 0.5f);
|
||||||
}
|
}
|
||||||
queuedInputs.Add(new QueuedInput
|
|
||||||
{
|
|
||||||
beat = beat - intervalStartBeat,
|
|
||||||
dpad = dpad,
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void HostPrepareHands()
|
public void HostPrepareHands()
|
||||||
|
@ -339,9 +376,70 @@ namespace HeavenStudio.Games
|
||||||
instance.hostRightArmAnim.DoScaledAnimationAsync("HostPrepare", 0.5f);
|
instance.hostRightArmAnim.DoScaledAnimationAsync("HostPrepare", 0.5f);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void StartInterval(double beat, float interval)
|
public static void PreInterval(double beat, float interval,
|
||||||
|
bool autoPassTurn, bool timeUpSound, bool consecutive, bool visualClock, int audioClock)
|
||||||
{
|
{
|
||||||
if (!intervalStarted)
|
if (GameManager.instance.currentGame == "quizShow")
|
||||||
|
{
|
||||||
|
instance.StartInterval(beat, interval, beat, autoPassTurn, timeUpSound, consecutive, visualClock, audioClock);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
queuedIntervals.Add(new QueuedInterval()
|
||||||
|
{
|
||||||
|
beat = beat,
|
||||||
|
interval = interval,
|
||||||
|
autoPassTurn = autoPassTurn,
|
||||||
|
timeUpSound = timeUpSound,
|
||||||
|
consecutive = consecutive,
|
||||||
|
visualClock = visualClock,
|
||||||
|
audioClock = audioClock
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private struct QueuedInterval
|
||||||
|
{
|
||||||
|
public double beat;
|
||||||
|
public float interval;
|
||||||
|
public bool autoPassTurn;
|
||||||
|
public bool timeUpSound;
|
||||||
|
public bool consecutive;
|
||||||
|
public bool visualClock;
|
||||||
|
public int audioClock;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static List<QueuedInterval> queuedIntervals = new();
|
||||||
|
|
||||||
|
public override void OnGameSwitch(double beat)
|
||||||
|
{
|
||||||
|
if (queuedIntervals.Count > 0)
|
||||||
|
{
|
||||||
|
foreach (var interval in queuedIntervals)
|
||||||
|
{
|
||||||
|
StartInterval(interval.beat, interval.interval, beat, interval.autoPassTurn,
|
||||||
|
interval.timeUpSound, interval.consecutive, interval.visualClock, interval.audioClock);
|
||||||
|
}
|
||||||
|
queuedIntervals.Clear();
|
||||||
|
}
|
||||||
|
var allRandomEvents = EventCaller.GetAllInGameManagerList("quizShow", new string[] { "randomPresses" });
|
||||||
|
foreach (var randomEvent in allRandomEvents)
|
||||||
|
{
|
||||||
|
randomPresses.Add(new RandomPress()
|
||||||
|
{
|
||||||
|
beat = randomEvent.beat,
|
||||||
|
randomPresses = GetRandomPress(randomEvent.beat, randomEvent.length,
|
||||||
|
randomEvent["min"], randomEvent["max"], randomEvent["random"], randomEvent["con"])
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void StartInterval(double beat, float interval,
|
||||||
|
double gameSwitchBeat, bool autoPassTurn, bool timeUpSound, bool consecutive, bool visualClock, int audioClock)
|
||||||
|
{
|
||||||
|
List<BeatAction.Action> actions = new()
|
||||||
|
{
|
||||||
|
new BeatAction.Action(beat, delegate
|
||||||
{
|
{
|
||||||
if (shouldPrepareArms)
|
if (shouldPrepareArms)
|
||||||
{
|
{
|
||||||
|
@ -354,15 +452,115 @@ namespace HeavenStudio.Games
|
||||||
secondDigitSr.sprite = contestantNumberSprites[0];
|
secondDigitSr.sprite = contestantNumberSprites[0];
|
||||||
hostFirstDigitSr.sprite = hostNumberSprites[10];
|
hostFirstDigitSr.sprite = hostNumberSprites[10];
|
||||||
hostSecondDigitSr.sprite = hostNumberSprites[10];
|
hostSecondDigitSr.sprite = hostNumberSprites[10];
|
||||||
|
})
|
||||||
|
};
|
||||||
|
|
||||||
|
var relevantInputs = GetInputsBetweenBeat(beat, beat + interval);
|
||||||
|
relevantInputs.Sort((x, y) => x.beat.CompareTo(y.beat));
|
||||||
|
for (int i = 0; i < relevantInputs.Count; i++)
|
||||||
|
{
|
||||||
|
var input = relevantInputs[i];
|
||||||
|
double inputBeat = input.beat;
|
||||||
|
if (inputBeat < gameSwitchBeat) continue;
|
||||||
|
bool isDpad = input.datamodel == "quizShow/dPad";
|
||||||
|
bool isRandom = input.datamodel == "quizShow/randomPresses";
|
||||||
|
actions.Add(new BeatAction.Action(inputBeat, delegate
|
||||||
|
{
|
||||||
|
HostPressButton(inputBeat, isDpad);
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
BeatAction.New(gameObject, actions);
|
||||||
|
|
||||||
|
if (autoPassTurn)
|
||||||
|
{
|
||||||
|
PassTurn(beat + interval, beat, interval, timeUpSound, consecutive, visualClock, audioClock);
|
||||||
}
|
}
|
||||||
intervalStartBeat = beat;
|
|
||||||
beatInterval = interval;
|
|
||||||
intervalStarted = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void PassTurn(double beat, float length, bool timeUpSound, bool consecutive, bool visualClock, int audioClock)
|
public static void PrePassTurn(double beat, bool timeUpSound, bool consecutive, bool visualClock, int audioClock)
|
||||||
|
{
|
||||||
|
if (GameManager.instance.currentGame == "quizShow")
|
||||||
|
{
|
||||||
|
instance.PassTurnStandalone(beat, timeUpSound, consecutive, visualClock, audioClock);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
passedTurns.Add(new PassedTurn()
|
||||||
|
{
|
||||||
|
beat = beat,
|
||||||
|
timeUpSound = timeUpSound,
|
||||||
|
consecutive = consecutive,
|
||||||
|
visualClock = visualClock,
|
||||||
|
audioClock = audioClock
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private struct PassedTurn
|
||||||
|
{
|
||||||
|
public double beat;
|
||||||
|
public bool timeUpSound;
|
||||||
|
public bool consecutive;
|
||||||
|
public bool visualClock;
|
||||||
|
public int audioClock;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static List<PassedTurn> passedTurns = new();
|
||||||
|
|
||||||
|
private void PassTurnStandalone(double beat, bool timeUpSound, bool consecutive, bool visualClock, int audioClock)
|
||||||
|
{
|
||||||
|
var lastInterval = GetLastIntervalBeforeBeat(beat);
|
||||||
|
if (lastInterval != null)
|
||||||
|
{
|
||||||
|
PassTurn(beat, lastInterval.beat, lastInterval.length, timeUpSound, consecutive, visualClock, audioClock);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void PassTurn(double beat, double intervalBeat, float intervalLength, bool timeUpSound, bool consecutive, bool visualClock, int audioClock)
|
||||||
|
{
|
||||||
|
playerStartBeat = beat + 1;
|
||||||
|
playerLength = intervalLength;
|
||||||
|
var relevantInputs = GetInputsBetweenBeat(intervalBeat, intervalBeat + intervalLength);
|
||||||
|
relevantInputs.Sort((x, y) => x.beat.CompareTo(y.beat));
|
||||||
|
|
||||||
|
for (int i = 0; i < relevantInputs.Count; i++)
|
||||||
|
{
|
||||||
|
double inputBeat = relevantInputs[i].beat - intervalBeat;
|
||||||
|
bool isDpad = relevantInputs[i].datamodel == "quizShow/dPad";
|
||||||
|
if (isDpad)
|
||||||
|
{
|
||||||
|
ScheduleAutoplayInput(beat, 1 + inputBeat, InputType.DIRECTION_DOWN, AutoplayDPad, Nothing, Nothing);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ScheduleAutoplayInput(beat, 1 + inputBeat, InputType.STANDARD_DOWN, AutoplayAButton, Nothing, Nothing);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (doingConsectiveIntervals)
|
||||||
|
{
|
||||||
|
countToMatch += relevantInputs.Count;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
countToMatch = relevantInputs.Count;
|
||||||
|
}
|
||||||
|
int hundredLoops = Mathf.FloorToInt(countToMatch / 100);
|
||||||
|
countToMatch -= hundredLoops * 100;
|
||||||
|
doingConsectiveIntervals = consecutive;
|
||||||
|
float timeUpBeat = 0f;
|
||||||
|
if (audioClock == (int)ClockAudio.Both || audioClock == (int)ClockAudio.Start)
|
||||||
|
{
|
||||||
|
SoundByte.PlayOneShotGame("quizShow/timerStart", beat);
|
||||||
|
timeUpBeat = 0.5f;
|
||||||
|
}
|
||||||
|
if (audioClock == (int)ClockAudio.End) timeUpBeat = 0.5f;
|
||||||
|
QSTimer spawnedTimer = Instantiate(stopWatchRef, transform);
|
||||||
|
if (!visualClock) Destroy(spawnedTimer.gameObject);
|
||||||
|
List<BeatAction.Action> actions = new()
|
||||||
|
{
|
||||||
|
new BeatAction.Action(beat, delegate
|
||||||
{
|
{
|
||||||
if (queuedInputs.Count == 0) return;
|
|
||||||
if (shouldPrepareArms)
|
if (shouldPrepareArms)
|
||||||
{
|
{
|
||||||
contesteeLeftArmAnim.DoScaledAnimationAsync("LeftPrepare", 0.5f);
|
contesteeLeftArmAnim.DoScaledAnimationAsync("LeftPrepare", 0.5f);
|
||||||
|
@ -374,32 +572,13 @@ namespace HeavenStudio.Games
|
||||||
hostRightArmAnim.DoScaledAnimationAsync("HostRightRest", 0.5f);
|
hostRightArmAnim.DoScaledAnimationAsync("HostRightRest", 0.5f);
|
||||||
}
|
}
|
||||||
shouldPrepareArms = false;
|
shouldPrepareArms = false;
|
||||||
if (visualClock) stopWatch.SetActive(true);
|
if (visualClock)
|
||||||
intervalStarted = false;
|
|
||||||
if (doingConsectiveIntervals)
|
|
||||||
{
|
{
|
||||||
countToMatch += queuedInputs.Count;
|
spawnedTimer.gameObject.SetActive(true);
|
||||||
|
spawnedTimer.Init(beat + 1, intervalLength);
|
||||||
}
|
}
|
||||||
else
|
}),
|
||||||
{
|
new BeatAction.Action(beat + 1 + intervalLength, delegate
|
||||||
countToMatch = queuedInputs.Count;
|
|
||||||
}
|
|
||||||
int hundredLoops = Mathf.FloorToInt(countToMatch / 100);
|
|
||||||
countToMatch -= hundredLoops * 100;
|
|
||||||
doingConsectiveIntervals = consecutive;
|
|
||||||
playerBeatInterval = beatInterval;
|
|
||||||
playerIntervalStartBeat = beat + length;
|
|
||||||
float timeUpBeat = 0f;
|
|
||||||
if (audioClock == (int)ClockAudio.Both || audioClock == (int)ClockAudio.Start)
|
|
||||||
{
|
|
||||||
SoundByte.PlayOneShotGame("quizShow/timerStart");
|
|
||||||
timeUpBeat = 0.5f;
|
|
||||||
}
|
|
||||||
if (audioClock == (int)ClockAudio.End) timeUpBeat = 0.5f;
|
|
||||||
|
|
||||||
BeatAction.New(instance.gameObject, new List<BeatAction.Action>()
|
|
||||||
{
|
|
||||||
new BeatAction.Action(beat + length + beatInterval, delegate
|
|
||||||
{
|
{
|
||||||
if (!consecutive)
|
if (!consecutive)
|
||||||
{
|
{
|
||||||
|
@ -407,24 +586,13 @@ namespace HeavenStudio.Games
|
||||||
contesteeLeftArmAnim.DoScaledAnimationAsync("LeftRest", 0.5f);
|
contesteeLeftArmAnim.DoScaledAnimationAsync("LeftRest", 0.5f);
|
||||||
contesteeRightArmAnim.DoScaledAnimationAsync("RightRest", 0.5f);
|
contesteeRightArmAnim.DoScaledAnimationAsync("RightRest", 0.5f);
|
||||||
shouldPrepareArms = true;
|
shouldPrepareArms = true;
|
||||||
stopWatch.SetActive(false);
|
|
||||||
}
|
}
|
||||||
|
if (visualClock) Destroy(spawnedTimer.gameObject);
|
||||||
}
|
}
|
||||||
),
|
),
|
||||||
new BeatAction.Action(beat + length + beatInterval + timeUpBeat, delegate { if (timeUpSound && !consecutive) SoundByte.PlayOneShotGame("quizShow/timeUp"); })
|
new BeatAction.Action(beat + 1 + intervalLength + timeUpBeat, delegate { if (timeUpSound && !consecutive) SoundByte.PlayOneShotGame("quizShow/timeUp"); }),
|
||||||
});
|
};
|
||||||
foreach (var input in queuedInputs)
|
BeatAction.New(instance.gameObject, actions);
|
||||||
{
|
|
||||||
if (input.dpad)
|
|
||||||
{
|
|
||||||
ScheduleAutoplayInput(beat, length + input.beat, InputType.DIRECTION_DOWN, AutoplayDPad, Nothing, Nothing);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ScheduleAutoplayInput(beat, length + input.beat, InputType.STANDARD_DOWN, AutoplayAButton, Nothing, Nothing);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
queuedInputs.Clear();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ContesteePressButton(bool dpad)
|
void ContesteePressButton(bool dpad)
|
||||||
|
|
|
@ -3,6 +3,7 @@ using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using DG.Tweening;
|
using DG.Tweening;
|
||||||
|
using Jukebox;
|
||||||
|
|
||||||
namespace HeavenStudio.Games.Loaders
|
namespace HeavenStudio.Games.Loaders
|
||||||
{
|
{
|
||||||
|
@ -15,29 +16,30 @@ namespace HeavenStudio.Games.Loaders
|
||||||
{
|
{
|
||||||
new GameAction("beat intervals", "Start Interval")
|
new GameAction("beat intervals", "Start Interval")
|
||||||
{
|
{
|
||||||
function = delegate {var e = eventCaller.currentEntity; Tambourine.instance.StartInterval(e.beat, e.length); },
|
preFunction = delegate {var e = eventCaller.currentEntity; Tambourine.PreInterval(e.beat, e.length, e["auto"]); },
|
||||||
defaultLength = 8f,
|
defaultLength = 8f,
|
||||||
resizable = true,
|
resizable = true,
|
||||||
priority = 1
|
parameters = new List<Param>()
|
||||||
|
{
|
||||||
|
new Param("auto", true, "Auto Pass Turn")
|
||||||
|
}
|
||||||
},
|
},
|
||||||
new GameAction("shake", "Shake")
|
new GameAction("shake", "Shake")
|
||||||
{
|
{
|
||||||
function = delegate {var e = eventCaller.currentEntity; Tambourine.instance.MonkeyInput(e.beat, false); },
|
|
||||||
defaultLength = 0.5f,
|
defaultLength = 0.5f,
|
||||||
priority = 2
|
|
||||||
},
|
},
|
||||||
new GameAction("hit", "Hit")
|
new GameAction("hit", "Hit")
|
||||||
{
|
{
|
||||||
function = delegate {var e = eventCaller.currentEntity; Tambourine.instance.MonkeyInput(e.beat, true); },
|
|
||||||
defaultLength = 0.5f,
|
defaultLength = 0.5f,
|
||||||
priority = 2
|
|
||||||
},
|
},
|
||||||
new GameAction("pass turn", "Pass Turn")
|
new GameAction("pass turn", "Pass Turn")
|
||||||
{
|
{
|
||||||
function = delegate {var e = eventCaller.currentEntity; Tambourine.instance.PassTurn(e.beat, e.length); },
|
preFunction = delegate
|
||||||
|
{
|
||||||
|
Tambourine.PrePassTurn(eventCaller.currentEntity.beat);
|
||||||
|
},
|
||||||
defaultLength = 1f,
|
defaultLength = 1f,
|
||||||
resizable = true,
|
preFunctionLength = 1f
|
||||||
priority = 3
|
|
||||||
},
|
},
|
||||||
new GameAction("bop", "Bop")
|
new GameAction("bop", "Bop")
|
||||||
{
|
{
|
||||||
|
@ -113,9 +115,6 @@ namespace HeavenStudio.Games
|
||||||
[SerializeField] Animator frogAnimator;
|
[SerializeField] Animator frogAnimator;
|
||||||
|
|
||||||
[Header("Variables")]
|
[Header("Variables")]
|
||||||
bool intervalStarted;
|
|
||||||
double intervalStartBeat;
|
|
||||||
float beatInterval = 8f;
|
|
||||||
float misses;
|
float misses;
|
||||||
bool frogPresent;
|
bool frogPresent;
|
||||||
bool monkeyGoBop;
|
bool monkeyGoBop;
|
||||||
|
@ -132,13 +131,6 @@ namespace HeavenStudio.Games
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
static List<QueuedTambourineInput> queuedInputs = new List<QueuedTambourineInput>();
|
|
||||||
struct QueuedTambourineInput
|
|
||||||
{
|
|
||||||
public bool hit;
|
|
||||||
public double beatAwayFromStart;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Tambourine instance;
|
public static Tambourine instance;
|
||||||
|
|
||||||
void Awake()
|
void Awake()
|
||||||
|
@ -150,18 +142,6 @@ namespace HeavenStudio.Games
|
||||||
monkeyAnimator.Play("MonkeyIdle", 0, 0);
|
monkeyAnimator.Play("MonkeyIdle", 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void OnDestroy()
|
|
||||||
{
|
|
||||||
if (!Conductor.instance.isPlaying || Conductor.instance.isPaused)
|
|
||||||
{
|
|
||||||
if (queuedInputs.Count > 0) queuedInputs.Clear();
|
|
||||||
}
|
|
||||||
foreach (var evt in scheduledInputs)
|
|
||||||
{
|
|
||||||
evt.Disable();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Update()
|
void Update()
|
||||||
{
|
{
|
||||||
if (Conductor.instance.ReportBeat(ref bop.lastReportedBeat, bop.startBeat % 1))
|
if (Conductor.instance.ReportBeat(ref bop.lastReportedBeat, bop.startBeat % 1))
|
||||||
|
@ -175,14 +155,6 @@ namespace HeavenStudio.Games
|
||||||
handsAnimator.Play("Bop", 0, 0);
|
handsAnimator.Play("Bop", 0, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!Conductor.instance.isPlaying || Conductor.instance.isPaused)
|
|
||||||
{
|
|
||||||
if (queuedInputs.Count > 0) queuedInputs.Clear();
|
|
||||||
}
|
|
||||||
if (!Conductor.instance.isPlaying && !Conductor.instance.isPaused && intervalStarted)
|
|
||||||
{
|
|
||||||
intervalStarted = false;
|
|
||||||
}
|
|
||||||
if (PlayerInput.Pressed() && !IsExpectingInputNow(InputType.STANDARD_DOWN))
|
if (PlayerInput.Pressed() && !IsExpectingInputNow(InputType.STANDARD_DOWN))
|
||||||
{
|
{
|
||||||
handsAnimator.Play("Shake", 0, 0);
|
handsAnimator.Play("Shake", 0, 0);
|
||||||
|
@ -190,7 +162,7 @@ namespace HeavenStudio.Games
|
||||||
sweatAnimator.Play("Sweating", 0, 0);
|
sweatAnimator.Play("Sweating", 0, 0);
|
||||||
SummonFrog();
|
SummonFrog();
|
||||||
ScoreMiss();
|
ScoreMiss();
|
||||||
if (!intervalStarted)
|
if (!IntervalIsGoingOn())
|
||||||
{
|
{
|
||||||
sadFace.SetActive(true);
|
sadFace.SetActive(true);
|
||||||
}
|
}
|
||||||
|
@ -202,77 +174,171 @@ namespace HeavenStudio.Games
|
||||||
sweatAnimator.Play("Sweating", 0, 0);
|
sweatAnimator.Play("Sweating", 0, 0);
|
||||||
SummonFrog();
|
SummonFrog();
|
||||||
ScoreMiss();
|
ScoreMiss();
|
||||||
if (!intervalStarted)
|
if (!IntervalIsGoingOn())
|
||||||
{
|
{
|
||||||
sadFace.SetActive(true);
|
sadFace.SetActive(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (passedTurns.Count > 0)
|
||||||
|
{
|
||||||
|
foreach (var pass in passedTurns)
|
||||||
|
{
|
||||||
|
PassTurnStandalone(pass);
|
||||||
|
}
|
||||||
|
passedTurns.Clear();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void StartInterval(double beat, float interval)
|
private bool IntervalIsGoingOn()
|
||||||
{
|
{
|
||||||
intervalStartBeat = beat;
|
double beat = Conductor.instance.songPositionInBeats;
|
||||||
beatInterval = interval;
|
return EventCaller.GetAllInGameManagerList("tambourine", new string[] { "beat intervals" }).Find(x => beat >= x.beat && beat < x.beat + x.length) != null;
|
||||||
if (!intervalStarted)
|
}
|
||||||
|
|
||||||
|
private List<RiqEntity> GetAllInputsBetweenBeat(double beat, double endBeat)
|
||||||
|
{
|
||||||
|
return EventCaller.GetAllInGameManagerList("tambourine", new string[] { "shake", "hit" }).FindAll(x => x.beat >= beat && x.beat < endBeat);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void PreInterval(double beat, float interval, bool autoPassTurn)
|
||||||
|
{
|
||||||
|
if (GameManager.instance.currentGame == "tambourine")
|
||||||
|
{
|
||||||
|
instance.StartInterval(beat, interval, beat, autoPassTurn);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
queuedIntervals.Add(new QueuedInterval()
|
||||||
|
{
|
||||||
|
beat = beat,
|
||||||
|
interval = interval,
|
||||||
|
autoPassTurn = autoPassTurn
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void OnGameSwitch(double beat)
|
||||||
|
{
|
||||||
|
if (queuedIntervals.Count > 0)
|
||||||
|
{
|
||||||
|
foreach (var interval in queuedIntervals)
|
||||||
|
{
|
||||||
|
StartInterval(interval.beat, interval.interval, beat, interval.autoPassTurn);
|
||||||
|
}
|
||||||
|
queuedIntervals.Clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private struct QueuedInterval
|
||||||
|
{
|
||||||
|
public double beat;
|
||||||
|
public float interval;
|
||||||
|
public bool autoPassTurn;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static List<QueuedInterval> queuedIntervals = new();
|
||||||
|
|
||||||
|
private void StartInterval(double beat, float interval, double gameSwitchBeat, bool autoPassTurn)
|
||||||
|
{
|
||||||
|
List<BeatAction.Action> actions = new()
|
||||||
|
{
|
||||||
|
new BeatAction.Action(beat, delegate
|
||||||
{
|
{
|
||||||
DesummonFrog();
|
DesummonFrog();
|
||||||
sadFace.SetActive(false);
|
sadFace.SetActive(false);
|
||||||
//queuedInputs.Clear();
|
})
|
||||||
misses = 0;
|
};
|
||||||
intervalStarted = true;
|
|
||||||
|
var relevantInputs = GetAllInputsBetweenBeat(beat, beat + interval);
|
||||||
|
relevantInputs.Sort((x, y) => x.beat.CompareTo(y.beat));
|
||||||
|
|
||||||
|
for (int i = 0; i < relevantInputs.Count; i++)
|
||||||
|
{
|
||||||
|
bool isHit = relevantInputs[i].datamodel == "tambourine/hit";
|
||||||
|
double inputBeat = relevantInputs[i].beat;
|
||||||
|
if (inputBeat >= gameSwitchBeat)
|
||||||
|
{
|
||||||
|
actions.Add(new BeatAction.Action(inputBeat, delegate
|
||||||
|
{
|
||||||
|
MonkeyInput(inputBeat, isHit);
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BeatAction.New(gameObject, actions);
|
||||||
|
|
||||||
|
if (autoPassTurn)
|
||||||
|
{
|
||||||
|
PassTurn(beat + interval, beat, interval);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void MonkeyInput(double beat, bool hit)
|
public void MonkeyInput(double beat, bool hit)
|
||||||
{
|
{
|
||||||
if (!intervalStarted)
|
|
||||||
{
|
|
||||||
StartInterval(beat, beatInterval);
|
|
||||||
}
|
|
||||||
if (hit)
|
if (hit)
|
||||||
{
|
{
|
||||||
monkeyAnimator.Play("MonkeySmack", 0, 0);
|
monkeyAnimator.DoScaledAnimationAsync("MonkeySmack", 0.5f);
|
||||||
SoundByte.PlayOneShotGame($"tambourine/monkey/hit/{UnityEngine.Random.Range(1, 6)}");
|
SoundByte.PlayOneShotGame($"tambourine/monkey/hit/{UnityEngine.Random.Range(1, 6)}");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
monkeyAnimator.Play("MonkeyShake", 0, 0);
|
monkeyAnimator.DoScaledAnimationAsync("MonkeyShake", 0.5f);
|
||||||
SoundByte.PlayOneShotGame($"tambourine/monkey/shake/{UnityEngine.Random.Range(1, 6)}");
|
SoundByte.PlayOneShotGame($"tambourine/monkey/shake/{UnityEngine.Random.Range(1, 6)}");
|
||||||
}
|
}
|
||||||
queuedInputs.Add(new QueuedTambourineInput()
|
|
||||||
{
|
|
||||||
hit = hit,
|
|
||||||
beatAwayFromStart = beat - intervalStartBeat,
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void PassTurn(double beat, float length)
|
private RiqEntity GetLastIntervalBeforeBeat(double beat)
|
||||||
{
|
{
|
||||||
if (queuedInputs.Count == 0) return;
|
return EventCaller.GetAllInGameManagerList("tambourine", new string[] { "beat intervals" }).FindLast(x => x.beat <= beat);
|
||||||
monkeyAnimator.Play("MonkeyPassTurn", 0, 0);
|
}
|
||||||
SoundByte.PlayOneShotGame($"tambourine/monkey/turnPass/{UnityEngine.Random.Range(1, 6)}");
|
|
||||||
happyFace.SetActive(true);
|
public static void PrePassTurn(double beat)
|
||||||
intervalStarted = false;
|
|
||||||
BeatAction.New(instance.gameObject, new List<BeatAction.Action>()
|
|
||||||
{
|
{
|
||||||
new BeatAction.Action(beat + 0.3f, delegate { happyFace.SetActive(false); })
|
if (GameManager.instance.currentGame == "tambourine")
|
||||||
});
|
|
||||||
foreach (var input in queuedInputs)
|
|
||||||
{
|
{
|
||||||
if (input.hit)
|
instance.PassTurnStandalone(beat);
|
||||||
{
|
|
||||||
ScheduleInput(beat, length + input.beatAwayFromStart, InputType.STANDARD_ALT_DOWN , JustHit, Miss , Nothing);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ScheduleInput(beat, length + input.beatAwayFromStart, InputType.STANDARD_DOWN, JustShake, Miss, Nothing);
|
passedTurns.Add(beat);
|
||||||
}
|
}
|
||||||
BeatAction.New(instance.gameObject, new List<BeatAction.Action>()
|
}
|
||||||
|
|
||||||
|
private static List<double> passedTurns = new();
|
||||||
|
|
||||||
|
private void PassTurnStandalone(double beat)
|
||||||
{
|
{
|
||||||
new BeatAction.Action(beat + length + input.beatAwayFromStart, delegate { Bop(beat + length + input.beatAwayFromStart, 1, (int)WhoBops.Monkey, (int)WhoBops.None); })
|
var lastInterval = GetLastIntervalBeforeBeat(beat);
|
||||||
});
|
if (lastInterval != null) PassTurn(beat, lastInterval.beat, lastInterval.length);
|
||||||
}
|
}
|
||||||
queuedInputs.Clear();
|
|
||||||
|
private void PassTurn(double beat, double intervalBeat, float intervalLength)
|
||||||
|
{
|
||||||
|
SoundByte.PlayOneShotGame($"tambourine/monkey/turnPass/{UnityEngine.Random.Range(1, 6)}", beat);
|
||||||
|
List<BeatAction.Action> actions = new()
|
||||||
|
{
|
||||||
|
new BeatAction.Action(beat, delegate
|
||||||
|
{
|
||||||
|
monkeyAnimator.DoScaledAnimationAsync("MonkeyPassTurn", 0.5f);
|
||||||
|
happyFace.SetActive(true);
|
||||||
|
}),
|
||||||
|
new BeatAction.Action(beat + 0.3f, delegate { happyFace.SetActive(false); })
|
||||||
|
};
|
||||||
|
var relevantInputs = GetAllInputsBetweenBeat(intervalBeat, intervalBeat + intervalLength);
|
||||||
|
relevantInputs.Sort((x, y) => x.beat.CompareTo(y.beat));
|
||||||
|
for (int i = 0; i < relevantInputs.Count; i++)
|
||||||
|
{
|
||||||
|
bool isHit = relevantInputs[i].datamodel == "tambourine/hit";
|
||||||
|
double inputBeat = relevantInputs[i].beat - intervalBeat;
|
||||||
|
actions.Add(new BeatAction.Action(inputBeat, delegate
|
||||||
|
{
|
||||||
|
if (isHit) ScheduleInput(beat + 1, inputBeat, InputType.STANDARD_ALT_DOWN, JustHit, Miss, Nothing);
|
||||||
|
else ScheduleInput(beat + 1, inputBeat, InputType.STANDARD_DOWN, JustShake, Miss, Nothing);
|
||||||
|
Bop(beat + 1 + inputBeat, 1, (int)WhoBops.Monkey, (int)WhoBops.None);
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
BeatAction.New(gameObject, actions);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Bop(double beat, float length, int whoBops, int whoBopsAuto)
|
public void Bop(double beat, float length, int whoBops, int whoBopsAuto)
|
||||||
|
@ -288,14 +354,14 @@ namespace HeavenStudio.Games
|
||||||
switch (whoBops)
|
switch (whoBops)
|
||||||
{
|
{
|
||||||
case (int) WhoBops.Monkey:
|
case (int) WhoBops.Monkey:
|
||||||
monkeyAnimator.Play("MonkeyBop", 0, 0);
|
monkeyAnimator.DoScaledAnimationAsync("MonkeyBop", 0.5f);
|
||||||
break;
|
break;
|
||||||
case (int) WhoBops.Player:
|
case (int) WhoBops.Player:
|
||||||
handsAnimator.Play("Bop", 0, 0);
|
handsAnimator.DoScaledAnimationAsync("Bop", 0.5f);
|
||||||
break;
|
break;
|
||||||
case (int) WhoBops.Both:
|
case (int) WhoBops.Both:
|
||||||
monkeyAnimator.Play("MonkeyBop", 0, 0);
|
monkeyAnimator.DoScaledAnimationAsync("MonkeyBop", 0.5f);
|
||||||
handsAnimator.Play("Bop", 0, 0);
|
handsAnimator.DoScaledAnimationAsync("Bop", 0.5f);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -330,12 +396,12 @@ namespace HeavenStudio.Games
|
||||||
{
|
{
|
||||||
if (state >= 1f || state <= -1f)
|
if (state >= 1f || state <= -1f)
|
||||||
{
|
{
|
||||||
handsAnimator.Play("Smack", 0, 0);
|
handsAnimator.DoScaledAnimationAsync("Smack", 0.5f);
|
||||||
SoundByte.PlayOneShotGame($"tambourine/player/hit/{UnityEngine.Random.Range(1, 6)}");
|
SoundByte.PlayOneShotGame($"tambourine/player/hit/{UnityEngine.Random.Range(1, 6)}");
|
||||||
SoundByte.PlayOneShotGame("tambourine/miss");
|
SoundByte.PlayOneShotGame("tambourine/miss");
|
||||||
sweatAnimator.Play("Sweating", 0, 0);
|
sweatAnimator.DoScaledAnimationAsync("Sweating", 0.5f);
|
||||||
misses++;
|
misses++;
|
||||||
if (!intervalStarted)
|
if (!IntervalIsGoingOn())
|
||||||
{
|
{
|
||||||
sadFace.SetActive(true);
|
sadFace.SetActive(true);
|
||||||
}
|
}
|
||||||
|
@ -348,12 +414,12 @@ namespace HeavenStudio.Games
|
||||||
{
|
{
|
||||||
if (state >= 1f || state <= -1f)
|
if (state >= 1f || state <= -1f)
|
||||||
{
|
{
|
||||||
handsAnimator.Play("Shake", 0, 0);
|
handsAnimator.DoScaledAnimationAsync("Shake", 0.5f);
|
||||||
SoundByte.PlayOneShotGame($"tambourine/player/shake/{UnityEngine.Random.Range(1, 6)}");
|
SoundByte.PlayOneShotGame($"tambourine/player/shake/{UnityEngine.Random.Range(1, 6)}");
|
||||||
SoundByte.PlayOneShotGame("tambourine/miss");
|
SoundByte.PlayOneShotGame("tambourine/miss");
|
||||||
sweatAnimator.Play("Sweating", 0, 0);
|
sweatAnimator.DoScaledAnimationAsync("Sweating", 0.5f);
|
||||||
misses++;
|
misses++;
|
||||||
if (!intervalStarted)
|
if (!IntervalIsGoingOn())
|
||||||
{
|
{
|
||||||
sadFace.SetActive(true);
|
sadFace.SetActive(true);
|
||||||
}
|
}
|
||||||
|
@ -367,12 +433,12 @@ namespace HeavenStudio.Games
|
||||||
sadFace.SetActive(false);
|
sadFace.SetActive(false);
|
||||||
if (hit)
|
if (hit)
|
||||||
{
|
{
|
||||||
handsAnimator.Play("Smack", 0, 0);
|
handsAnimator.DoScaledAnimationAsync("Smack", 0.5f);
|
||||||
SoundByte.PlayOneShotGame($"tambourine/player/hit/{UnityEngine.Random.Range(1, 6)}");
|
SoundByte.PlayOneShotGame($"tambourine/player/hit/{UnityEngine.Random.Range(1, 6)}");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
handsAnimator.Play("Shake", 0, 0);
|
handsAnimator.DoScaledAnimationAsync("Shake", 0.5f);
|
||||||
SoundByte.PlayOneShotGame($"tambourine/player/shake/{UnityEngine.Random.Range(1, 6)}");
|
SoundByte.PlayOneShotGame($"tambourine/player/shake/{UnityEngine.Random.Range(1, 6)}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -380,9 +446,9 @@ namespace HeavenStudio.Games
|
||||||
public void Miss(PlayerActionEvent caller)
|
public void Miss(PlayerActionEvent caller)
|
||||||
{
|
{
|
||||||
SummonFrog();
|
SummonFrog();
|
||||||
sweatAnimator.Play("Sweating", 0, 0);
|
sweatAnimator.DoScaledAnimationAsync("Sweating", 0.5f);
|
||||||
misses++;
|
misses++;
|
||||||
if (!intervalStarted)
|
if (!IntervalIsGoingOn())
|
||||||
{
|
{
|
||||||
sadFace.SetActive(true);
|
sadFace.SetActive(true);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue