From b8a844530f2bcb05418df4bd32a82bece709c309 Mon Sep 17 00:00:00 2001 From: Rapandrasmus <78219215+Rapandrasmus@users.noreply.github.com> Date: Sun, 4 Feb 2024 14:57:50 +0100 Subject: [PATCH] bear bop + cut + whiff visuals implemented --- Assets/Resources/Games/lumbearjack.prefab | 2 +- .../Lumbearjack/Animations/Beast.controller | 158 +++++++++++------- .../Lumbearjack/Animations/BeastBop.anim | 2 +- .../Lumbearjack/Animations/BeastCut.anim | 2 +- .../Lumbearjack/Animations/BeastCutMid.anim | 2 +- .../Lumbearjack/Animations/BeastHalfCut.anim | 2 +- .../Lumbearjack/Animations/BeastHuhL.anim | 2 +- .../Lumbearjack/Animations/BeastHuhR.anim | 2 +- .../Lumbearjack/Animations/BeastIdle.anim | 2 +- .../Lumbearjack/Animations/BeastRest.anim | 2 +- .../Lumbearjack/Animations/BeastWhiff.anim | 2 +- Assets/Scripts/Games/LumBEARjack/LBJBear.cs | 30 +++- .../Scripts/Games/LumBEARjack/LBJBigObject.cs | 8 +- .../Games/LumBEARjack/LBJHugeObject.cs | 8 +- .../Games/LumBEARjack/LBJSmallObject.cs | 4 +- .../Scripts/Games/LumBEARjack/LumBEARjack.cs | 119 ++++++++++++- 16 files changed, 267 insertions(+), 80 deletions(-) diff --git a/Assets/Resources/Games/lumbearjack.prefab b/Assets/Resources/Games/lumbearjack.prefab index 187972d31..c15578ec9 100644 --- a/Assets/Resources/Games/lumbearjack.prefab +++ b/Assets/Resources/Games/lumbearjack.prefab @@ -1774,7 +1774,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 32640a26a175a5d4baa5ba61b5446e33, type: 3} m_Name: m_EditorClassIdentifier: - _anim: {fileID: 0} + _anim: {fileID: 4680509007873141790} --- !u!95 &4680509007873141790 Animator: serializedVersion: 5 diff --git a/Assets/Resources/Sprites/Games/Lumbearjack/Animations/Beast.controller b/Assets/Resources/Sprites/Games/Lumbearjack/Animations/Beast.controller index 1548604c0..04fe422d6 100644 --- a/Assets/Resources/Sprites/Games/Lumbearjack/Animations/Beast.controller +++ b/Assets/Resources/Sprites/Games/Lumbearjack/Animations/Beast.controller @@ -36,7 +36,8 @@ AnimatorState: m_Name: BeastCut m_Speed: 1 m_CycleOffset: 0 - m_Transitions: [] + m_Transitions: + - {fileID: -310257695249618307} m_StateMachineBehaviours: [] m_Position: {x: 50, y: 50, z: 0} m_IKOnFeet: 0 @@ -52,32 +53,28 @@ AnimatorState: m_MirrorParameter: m_CycleOffsetParameter: m_TimeParameter: ---- !u!1102 &-6629927776154218313 -AnimatorState: - serializedVersion: 6 +--- !u!1101 &-7380376842307841197 +AnimatorStateTransition: m_ObjectHideFlags: 1 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_Name: BeastHuh - m_Speed: 1 - m_CycleOffset: 0 - m_Transitions: [] - m_StateMachineBehaviours: [] - m_Position: {x: 50, y: 50, z: 0} - m_IKOnFeet: 0 - m_WriteDefaultValues: 1 - m_Mirror: 0 - m_SpeedParameterActive: 0 - m_MirrorParameterActive: 0 - m_CycleOffsetParameterActive: 0 - m_TimeParameterActive: 0 - m_Motion: {fileID: 0} - m_Tag: - m_SpeedParameter: - m_MirrorParameter: - m_CycleOffsetParameter: - m_TimeParameter: + m_Name: + m_Conditions: [] + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: 5837131744991549186} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 1 + m_HasExitTime: 1 + m_HasFixedDuration: 1 + m_InterruptionSource: 0 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 --- !u!1107 &-1674582069573944675 AnimatorStateMachine: serializedVersion: 6 @@ -92,34 +89,28 @@ AnimatorStateMachine: m_Position: {x: 200, y: 0, z: 0} - serializedVersion: 1 m_State: {fileID: 4188533250333047070} - m_Position: {x: 235, y: 65, z: 0} + m_Position: {x: 320, y: -130, z: 0} - serializedVersion: 1 m_State: {fileID: -8280373705725307176} - m_Position: {x: 270, y: 130, z: 0} + m_Position: {x: 500, y: -60, z: 0} - serializedVersion: 1 m_State: {fileID: 149483240485607696} - m_Position: {x: 305, y: 195, z: 0} + m_Position: {x: 510, y: 20, z: 0} - serializedVersion: 1 m_State: {fileID: 1406334409964640660} - m_Position: {x: 340, y: 260, z: 0} + m_Position: {x: 320, y: 80, z: 0} - serializedVersion: 1 m_State: {fileID: -8311457463122348759} - m_Position: {x: 375, y: 325, z: 0} - - serializedVersion: 1 - m_State: {fileID: -6629927776154218313} - m_Position: {x: 410, y: 390, z: 0} + m_Position: {x: 570, y: 180, z: 0} - serializedVersion: 1 m_State: {fileID: 6337212225718637190} - m_Position: {x: 445, y: 455, z: 0} + m_Position: {x: 340, y: 360, z: 0} - serializedVersion: 1 m_State: {fileID: 3952486420741322194} - m_Position: {x: 480, y: 520, z: 0} - - serializedVersion: 1 - m_State: {fileID: 9178769677766401103} - m_Position: {x: 515, y: 585, z: 0} + m_Position: {x: 570, y: 360, z: 0} - serializedVersion: 1 m_State: {fileID: 7127408352164357007} - m_Position: {x: 550, y: 650, z: 0} + m_Position: {x: 570, y: 260, z: 0} m_ChildStateMachines: [] m_AnyStateTransitions: [] m_EntryTransitions: [] @@ -130,6 +121,28 @@ AnimatorStateMachine: m_ExitPosition: {x: 800, y: 120, z: 0} m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} m_DefaultState: {fileID: 5837131744991549186} +--- !u!1101 &-310257695249618307 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: [] + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: 5837131744991549186} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 1 + m_HasExitTime: 1 + m_HasFixedDuration: 1 + m_InterruptionSource: 0 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 --- !u!91 &9100000 AnimatorController: m_ObjectHideFlags: 0 @@ -162,7 +175,8 @@ AnimatorState: m_Name: BeastWhiff m_Speed: 1 m_CycleOffset: 0 - m_Transitions: [] + m_Transitions: + - {fileID: 8103048759882901255} m_StateMachineBehaviours: [] m_Position: {x: 50, y: 50, z: 0} m_IKOnFeet: 0 @@ -188,7 +202,8 @@ AnimatorState: m_Name: BeastCutMid m_Speed: 1 m_CycleOffset: 0 - m_Transitions: [] + m_Transitions: + - {fileID: 3711997017831868963} m_StateMachineBehaviours: [] m_Position: {x: 50, y: 50, z: 0} m_IKOnFeet: 0 @@ -204,6 +219,28 @@ AnimatorState: m_MirrorParameter: m_CycleOffsetParameter: m_TimeParameter: +--- !u!1101 &3711997017831868963 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: [] + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: 5837131744991549186} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 1 + m_HasExitTime: 1 + m_HasFixedDuration: 1 + m_InterruptionSource: 0 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 --- !u!1102 &3952486420741322194 AnimatorState: serializedVersion: 6 @@ -240,7 +277,8 @@ AnimatorState: m_Name: BeastBop m_Speed: 1 m_CycleOffset: 0 - m_Transitions: [] + m_Transitions: + - {fileID: -7380376842307841197} m_StateMachineBehaviours: [] m_Position: {x: 50, y: 50, z: 0} m_IKOnFeet: 0 @@ -334,29 +372,25 @@ AnimatorState: m_MirrorParameter: m_CycleOffsetParameter: m_TimeParameter: ---- !u!1102 &9178769677766401103 -AnimatorState: - serializedVersion: 6 +--- !u!1101 &8103048759882901255 +AnimatorStateTransition: m_ObjectHideFlags: 1 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_Name: BeastSigh - m_Speed: 1 - m_CycleOffset: 0 - m_Transitions: [] - m_StateMachineBehaviours: [] - m_Position: {x: 50, y: 50, z: 0} - m_IKOnFeet: 0 - m_WriteDefaultValues: 1 - m_Mirror: 0 - m_SpeedParameterActive: 0 - m_MirrorParameterActive: 0 - m_CycleOffsetParameterActive: 0 - m_TimeParameterActive: 0 - m_Motion: {fileID: 7400000, guid: 7764ee7dc8d498148b01e4d98ce2bc84, type: 2} - m_Tag: - m_SpeedParameter: - m_MirrorParameter: - m_CycleOffsetParameter: - m_TimeParameter: + m_Name: + m_Conditions: [] + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: 5837131744991549186} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 1 + m_HasExitTime: 1 + m_HasFixedDuration: 1 + m_InterruptionSource: 0 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 diff --git a/Assets/Resources/Sprites/Games/Lumbearjack/Animations/BeastBop.anim b/Assets/Resources/Sprites/Games/Lumbearjack/Animations/BeastBop.anim index 3bde026b8..d9438c987 100644 --- a/Assets/Resources/Sprites/Games/Lumbearjack/Animations/BeastBop.anim +++ b/Assets/Resources/Sprites/Games/Lumbearjack/Animations/BeastBop.anim @@ -307,7 +307,7 @@ AnimationClip: m_Level: 0 m_CycleOffset: 0 m_HasAdditiveReferencePose: 0 - m_LoopTime: 1 + m_LoopTime: 0 m_LoopBlend: 0 m_LoopBlendOrientation: 0 m_LoopBlendPositionY: 0 diff --git a/Assets/Resources/Sprites/Games/Lumbearjack/Animations/BeastCut.anim b/Assets/Resources/Sprites/Games/Lumbearjack/Animations/BeastCut.anim index 84bca9194..2414f819a 100644 --- a/Assets/Resources/Sprites/Games/Lumbearjack/Animations/BeastCut.anim +++ b/Assets/Resources/Sprites/Games/Lumbearjack/Animations/BeastCut.anim @@ -797,7 +797,7 @@ AnimationClip: m_Level: 0 m_CycleOffset: 0 m_HasAdditiveReferencePose: 0 - m_LoopTime: 1 + m_LoopTime: 0 m_LoopBlend: 0 m_LoopBlendOrientation: 0 m_LoopBlendPositionY: 0 diff --git a/Assets/Resources/Sprites/Games/Lumbearjack/Animations/BeastCutMid.anim b/Assets/Resources/Sprites/Games/Lumbearjack/Animations/BeastCutMid.anim index 61ee033d7..e6f189d47 100644 --- a/Assets/Resources/Sprites/Games/Lumbearjack/Animations/BeastCutMid.anim +++ b/Assets/Resources/Sprites/Games/Lumbearjack/Animations/BeastCutMid.anim @@ -908,7 +908,7 @@ AnimationClip: m_Level: 0 m_CycleOffset: 0 m_HasAdditiveReferencePose: 0 - m_LoopTime: 1 + m_LoopTime: 0 m_LoopBlend: 0 m_LoopBlendOrientation: 0 m_LoopBlendPositionY: 0 diff --git a/Assets/Resources/Sprites/Games/Lumbearjack/Animations/BeastHalfCut.anim b/Assets/Resources/Sprites/Games/Lumbearjack/Animations/BeastHalfCut.anim index a221eac75..3e3c79e96 100644 --- a/Assets/Resources/Sprites/Games/Lumbearjack/Animations/BeastHalfCut.anim +++ b/Assets/Resources/Sprites/Games/Lumbearjack/Animations/BeastHalfCut.anim @@ -641,7 +641,7 @@ AnimationClip: m_Level: 0 m_CycleOffset: 0 m_HasAdditiveReferencePose: 0 - m_LoopTime: 1 + m_LoopTime: 0 m_LoopBlend: 0 m_LoopBlendOrientation: 0 m_LoopBlendPositionY: 0 diff --git a/Assets/Resources/Sprites/Games/Lumbearjack/Animations/BeastHuhL.anim b/Assets/Resources/Sprites/Games/Lumbearjack/Animations/BeastHuhL.anim index ea9e43a7a..f374eadde 100644 --- a/Assets/Resources/Sprites/Games/Lumbearjack/Animations/BeastHuhL.anim +++ b/Assets/Resources/Sprites/Games/Lumbearjack/Animations/BeastHuhL.anim @@ -406,7 +406,7 @@ AnimationClip: m_Level: 0 m_CycleOffset: 0 m_HasAdditiveReferencePose: 0 - m_LoopTime: 1 + m_LoopTime: 0 m_LoopBlend: 0 m_LoopBlendOrientation: 0 m_LoopBlendPositionY: 0 diff --git a/Assets/Resources/Sprites/Games/Lumbearjack/Animations/BeastHuhR.anim b/Assets/Resources/Sprites/Games/Lumbearjack/Animations/BeastHuhR.anim index 566926684..45cfc2937 100644 --- a/Assets/Resources/Sprites/Games/Lumbearjack/Animations/BeastHuhR.anim +++ b/Assets/Resources/Sprites/Games/Lumbearjack/Animations/BeastHuhR.anim @@ -406,7 +406,7 @@ AnimationClip: m_Level: 0 m_CycleOffset: 0 m_HasAdditiveReferencePose: 0 - m_LoopTime: 1 + m_LoopTime: 0 m_LoopBlend: 0 m_LoopBlendOrientation: 0 m_LoopBlendPositionY: 0 diff --git a/Assets/Resources/Sprites/Games/Lumbearjack/Animations/BeastIdle.anim b/Assets/Resources/Sprites/Games/Lumbearjack/Animations/BeastIdle.anim index 052e8e7b2..b63647c37 100644 --- a/Assets/Resources/Sprites/Games/Lumbearjack/Animations/BeastIdle.anim +++ b/Assets/Resources/Sprites/Games/Lumbearjack/Animations/BeastIdle.anim @@ -36,7 +36,7 @@ AnimationClip: m_Level: 0 m_CycleOffset: 0 m_HasAdditiveReferencePose: 0 - m_LoopTime: 1 + m_LoopTime: 0 m_LoopBlend: 0 m_LoopBlendOrientation: 0 m_LoopBlendPositionY: 0 diff --git a/Assets/Resources/Sprites/Games/Lumbearjack/Animations/BeastRest.anim b/Assets/Resources/Sprites/Games/Lumbearjack/Animations/BeastRest.anim index 8892b67ab..c294c8a1f 100644 --- a/Assets/Resources/Sprites/Games/Lumbearjack/Animations/BeastRest.anim +++ b/Assets/Resources/Sprites/Games/Lumbearjack/Animations/BeastRest.anim @@ -996,7 +996,7 @@ AnimationClip: m_Level: 0 m_CycleOffset: 0 m_HasAdditiveReferencePose: 0 - m_LoopTime: 1 + m_LoopTime: 0 m_LoopBlend: 0 m_LoopBlendOrientation: 0 m_LoopBlendPositionY: 0 diff --git a/Assets/Resources/Sprites/Games/Lumbearjack/Animations/BeastWhiff.anim b/Assets/Resources/Sprites/Games/Lumbearjack/Animations/BeastWhiff.anim index 9cc8780da..107951b63 100644 --- a/Assets/Resources/Sprites/Games/Lumbearjack/Animations/BeastWhiff.anim +++ b/Assets/Resources/Sprites/Games/Lumbearjack/Animations/BeastWhiff.anim @@ -725,7 +725,7 @@ AnimationClip: m_Level: 0 m_CycleOffset: 0 m_HasAdditiveReferencePose: 0 - m_LoopTime: 1 + m_LoopTime: 0 m_LoopBlend: 0 m_LoopBlendOrientation: 0 m_LoopBlendPositionY: 0 diff --git a/Assets/Scripts/Games/LumBEARjack/LBJBear.cs b/Assets/Scripts/Games/LumBEARjack/LBJBear.cs index 92f36c199..f81bfa12a 100644 --- a/Assets/Scripts/Games/LumBEARjack/LBJBear.cs +++ b/Assets/Scripts/Games/LumBEARjack/LBJBear.cs @@ -10,9 +10,35 @@ namespace HeavenStudio.Games.Scripts_LumBEARjack [Header("Components")] [SerializeField] private Animator _anim; - public void SwingWhiff() + public void SwingWhiff(bool sound = true, bool force = false) { - SoundByte.PlayOneShotGame("lumbearjack/swing", -1, SoundByte.GetPitchFromCents(Random.Range(-200, 201), false)); + if (_anim.IsPlayingAnimationNames("BeastWhiff", "BeastCut", "BeastCutMid", "BeastHalfCut") && !force) return; + if (sound) SoundByte.PlayOneShotGame("lumbearjack/swing", -1, SoundByte.GetPitchFromCents(Random.Range(-200, 201), false)); + _anim.DoScaledAnimationAsync("BeastWhiff", 0.5f); + } + + public void Cut(double beat, bool huh, bool huhL) + { + _anim.DoScaledAnimationAsync(huh ? "BeastHalfCut" : "BeastCut", 0.5f); + if (!huh) return; + BeatAction.New(this, new() + { + new(beat + 1, delegate + { + _anim.DoScaledAnimationAsync(huhL ? "BeastHuhL" : "BeastHuhR", 0.5f); + }) + }); + } + + public void CutMid() + { + _anim.DoScaledAnimationAsync("BeastCutMid", 0.5f); + } + + public void Bop() + { + if (_anim.IsPlayingAnimationNames("BeastWhiff")) return; + _anim.DoScaledAnimationAsync("BeastBop", 0.5f); } } diff --git a/Assets/Scripts/Games/LumBEARjack/LBJBigObject.cs b/Assets/Scripts/Games/LumBEARjack/LBJBigObject.cs index 8f9bc8390..8da4e3220 100644 --- a/Assets/Scripts/Games/LumBEARjack/LBJBigObject.cs +++ b/Assets/Scripts/Games/LumBEARjack/LBJBigObject.cs @@ -24,7 +24,8 @@ namespace HeavenStudio.Games.Scripts_LumBEARjack { if (state >= 1f || state <= -1f) { - // Barely + _bear.SwingWhiff(false, true); + Miss(caller); return; } @@ -37,13 +38,15 @@ namespace HeavenStudio.Games.Scripts_LumBEARjack _ => throw new System.NotImplementedException(), }; SoundByte.PlayOneShotGame("lumbearjack/" + hitSound); + _bear.CutMid(); } private void JustCut(PlayerActionEvent caller, float state) { if (state >= 1f || state <= -1f) { - // Barely + _bear.SwingWhiff(false, true); + Miss(caller); return; } @@ -55,6 +58,7 @@ namespace HeavenStudio.Games.Scripts_LumBEARjack _ => throw new System.NotImplementedException(), }; SoundByte.PlayOneShotGame("lumbearjack/" + cutSound); + _bear.Cut(caller.startBeat + caller.timer, false, false); Destroy(gameObject); } diff --git a/Assets/Scripts/Games/LumBEARjack/LBJHugeObject.cs b/Assets/Scripts/Games/LumBEARjack/LBJHugeObject.cs index d2e65d92a..d828ff7fc 100644 --- a/Assets/Scripts/Games/LumBEARjack/LBJHugeObject.cs +++ b/Assets/Scripts/Games/LumBEARjack/LBJHugeObject.cs @@ -41,7 +41,8 @@ namespace HeavenStudio.Games.Scripts_LumBEARjack { if (state >= 1f || state <= -1f) { - // Barely + _bear.SwingWhiff(false, true); + Miss(caller); return; } @@ -56,13 +57,15 @@ namespace HeavenStudio.Games.Scripts_LumBEARjack _ => throw new System.NotImplementedException(), }; SoundByte.PlayOneShotGame("lumbearjack/" + hitSound); + _bear.CutMid(); } private void JustCut(PlayerActionEvent caller, float state) { if (state >= 1f || state <= -1f) { - // Barely + _bear.SwingWhiff(false, true); + Miss(caller); return; } @@ -76,6 +79,7 @@ namespace HeavenStudio.Games.Scripts_LumBEARjack _ => throw new System.NotImplementedException(), }; SoundByte.PlayOneShotGame("lumbearjack/" + cutSound); + _bear.Cut(caller.startBeat + caller.timer, false, false); Destroy(gameObject); } diff --git a/Assets/Scripts/Games/LumBEARjack/LBJSmallObject.cs b/Assets/Scripts/Games/LumBEARjack/LBJSmallObject.cs index 242ba23c1..ef1c8d880 100644 --- a/Assets/Scripts/Games/LumBEARjack/LBJSmallObject.cs +++ b/Assets/Scripts/Games/LumBEARjack/LBJSmallObject.cs @@ -22,7 +22,8 @@ namespace HeavenStudio.Games.Scripts_LumBEARjack { if (state >= 1f || state <= -1f) { - // Barely + _bear.SwingWhiff(false, true); + Miss(caller); return; } @@ -39,6 +40,7 @@ namespace HeavenStudio.Games.Scripts_LumBEARjack SoundByte.PlayOneShotGame("lumbearjack/" + cutSound); if (_type != LumBEARjack.SmallType.log) SoundByte.PlayOneShotGame("lumbearjack/huh", caller.startBeat + caller.timer + 1); + _bear.Cut(caller.startBeat + caller.timer, _type != LumBEARjack.SmallType.log, false); // Add proper logic for direction Destroy(gameObject); } diff --git a/Assets/Scripts/Games/LumBEARjack/LumBEARjack.cs b/Assets/Scripts/Games/LumBEARjack/LumBEARjack.cs index 1e070bf32..960d0f2d4 100644 --- a/Assets/Scripts/Games/LumBEARjack/LumBEARjack.cs +++ b/Assets/Scripts/Games/LumBEARjack/LumBEARjack.cs @@ -20,6 +20,20 @@ namespace HeavenStudio.Games.Loaders { return new Minigame("lumbearjack", "LumBEARjack", "ffffff", false, false, new List() { + new("bop", "Bop") + { + function = delegate + { + var e = eventCaller.currentEntity; + LumBEARjack.instance.Bop(e.beat, e.length, (LumBEARjack.WhoBops)e["bop"]); + }, + resizable = true, + parameters = new() + { + new("bop", LumBEARjack.WhoBops.Both, "Bop"), + new("auto", LumBEARjack.WhoBops.None, "Bop (Auto)") + } + }, new("small", "Small Object") { preFunction = delegate @@ -80,7 +94,7 @@ namespace HeavenStudio.Games.Loaders new("sound", true, "Cue Sound") } }, - new("sigh", "Sigh") + new("sigh", "Rest") { preFunction = delegate { @@ -185,17 +199,28 @@ namespace HeavenStudio.Games peach } + public enum WhoBops + { + Both = 0, + Bear = 1, + Cats = 2, + None = 3 + } + [Header("Components")] [SerializeField] private LBJBear _bear; [SerializeField] private LBJSmallObject _smallObjectPrefab; [SerializeField] private LBJBigObject _bigObjectPrefab; [SerializeField] private LBJHugeObject _hugeObjectPrefab; + private List _bearNoBopBeats = new(); + public static LumBEARjack instance; private void Awake() { instance = this; + SetupBopRegion("lumbearjack", "bop", "auto", false); } #region Update @@ -255,11 +280,13 @@ namespace HeavenStudio.Games public override void OnGameSwitch(double beat) { PersistObjects(beat); + HandleBops(beat); } public override void OnPlay(double beat) { PersistObjects(beat); + HandleBops(beat); } private void PersistObjects(double beat) @@ -291,6 +318,96 @@ namespace HeavenStudio.Games } } + private void HandleBops(double beat) + { + List allCutEvents = EventCaller.GetAllInGameManagerList("lumbearjack", new string[] { "small", "big", "huge", "smallS", "bigS", "hugeS" }); + + for (int i = 0; i < allCutEvents.Count; i++) + { + var e = allCutEvents[i]; + + switch (e.datamodel.Split(1)) + { + case "small": + case "smallS": + _bearNoBopBeats.Add(e.beat + (e.length / 3 * 2)); + if ((SmallType)e["type"] != SmallType.log) _bearNoBopBeats.Add(e.beat + e.length); + break; + case "big": + case "bigS": + _bearNoBopBeats.Add(e.beat + (e.length / 4 * 2)); + _bearNoBopBeats.Add(e.beat + (e.length / 4 * 3)); + break; + case "huge": + case "hugeS": + _bearNoBopBeats.Add(e.beat + (e.length / 6 * 2)); + _bearNoBopBeats.Add(e.beat + (e.length / 6 * 3)); + _bearNoBopBeats.Add(e.beat + (e.length / 6 * 4)); + _bearNoBopBeats.Add(e.beat + (e.length / 6 * 5)); + break; + } + } + + List allEligibleBops = EventCaller.GetAllInGameManagerList("lumbearjack", new string[] { "bop" }).FindAll(x => x.beat < beat && x.beat + x.length > beat); + + foreach (var e in allEligibleBops) + { + Bop(e.beat, e.length, (WhoBops)e["bop"], beat); + } + } + + #endregion + + #region Bop + + public override void OnLateBeatPulse(double beat) + { + switch ((WhoBops)BeatIsInBopRegionInt(beat)) + { + case WhoBops.Both: + if (!_bearNoBopBeats.Contains(beat)) _bear.Bop(); + break; + case WhoBops.Bear: + if (!_bearNoBopBeats.Contains(beat)) _bear.Bop(); + break; + case WhoBops.Cats: + break; + default: + break; + } + } + + public void Bop(double beat, float length, WhoBops who, double startUpBeat = -1) + { + if (who == WhoBops.None) return; + + List actions = new(); + + for (int i = 0; i < length; i++) + { + if (beat + i < startUpBeat) continue; + + actions.Add(new(beat + i, delegate + { + switch (who) + { + case WhoBops.Both: + _bear.Bop(); + break; + case WhoBops.Bear: + _bear.Bop(); + break; + case WhoBops.Cats: + break; + default: + break; + } + })); + } + + if (actions.Count > 0) BeatAction.New(this, actions); + } + #endregion #region PreSounds