Auto Bop Internal Rework + Bug Fixes (#589)

* fixed blue bear

* fixed tap trial bug

* see saw fix

* Auto bop rework
This commit is contained in:
Rapandrasmus 2023-12-05 23:38:52 +01:00 committed by GitHub
parent 15ab4b0447
commit 2abfaf87bb
29 changed files with 353 additions and 268 deletions

View file

@ -20,17 +20,17 @@ AnimationClip:
m_Curve: m_Curve:
- serializedVersion: 3 - serializedVersion: 3
time: 0 time: 0
value: {x: 1.258, y: 0.542, z: 0} value: {x: 1.4, y: 0.68, z: 0}
inSlope: {x: -1.4679999, y: -0, z: -0} inSlope: {x: -1.184, y: -0, z: -0}
outSlope: {x: 0, y: 0.17200005, z: 0} outSlope: {x: 0, y: 0, z: 0}
tangentMode: 0 tangentMode: 0
weightedMode: 0 weightedMode: 0
inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
- serializedVersion: 3 - serializedVersion: 3
time: 0.5 time: 0.5
value: {x: 1.258, y: 0.628, z: 0} value: {x: 1.4, y: 0.89, z: 0}
inSlope: {x: -0, y: 0.17200005, z: -0} inSlope: {x: -0, y: 0.41999996, z: -0}
outSlope: {x: 0, y: 0, z: 0} outSlope: {x: 0, y: 0, z: 0}
tangentMode: 0 tangentMode: 0
weightedMode: 0 weightedMode: 0
@ -49,8 +49,8 @@ AnimationClip:
time: 0 time: 0
value: 1 value: 1
inSlope: 2 inSlope: 2
outSlope: -2 outSlope: 0
tangentMode: 69 tangentMode: 5
weightedMode: 0 weightedMode: 0
inWeight: 0.33333334 inWeight: 0.33333334
outWeight: 0.33333334 outWeight: 0.33333334
@ -134,16 +134,16 @@ AnimationClip:
m_Curve: m_Curve:
- serializedVersion: 3 - serializedVersion: 3
time: 0 time: 0
value: 1.258 value: 1.4
inSlope: -1.4679999 inSlope: -1.184
outSlope: 0 outSlope: 0
tangentMode: 69 tangentMode: 5
weightedMode: 0 weightedMode: 0
inWeight: 0.33333334 inWeight: 0.33333334
outWeight: 0.33333334 outWeight: 0.33333334
- serializedVersion: 3 - serializedVersion: 3
time: 0.5 time: 0.5
value: 1.258 value: 1.4
inSlope: -0 inSlope: -0
outSlope: 0 outSlope: 0
tangentMode: 69 tangentMode: 69
@ -162,17 +162,17 @@ AnimationClip:
m_Curve: m_Curve:
- serializedVersion: 3 - serializedVersion: 3
time: 0 time: 0
value: 0.542 value: 0.68
inSlope: -0 inSlope: -0
outSlope: 0.17200005 outSlope: 0
tangentMode: 69 tangentMode: 5
weightedMode: 0 weightedMode: 0
inWeight: 0.33333334 inWeight: 0.33333334
outWeight: 0.33333334 outWeight: 0.33333334
- serializedVersion: 3 - serializedVersion: 3
time: 0.5 time: 0.5
value: 0.628 value: 0.89
inSlope: 0.17200005 inSlope: 0.41999996
outSlope: 0 outSlope: 0
tangentMode: 69 tangentMode: 69
weightedMode: 0 weightedMode: 0
@ -193,7 +193,7 @@ AnimationClip:
value: 0 value: 0
inSlope: -0 inSlope: -0
outSlope: 0 outSlope: 0
tangentMode: 69 tangentMode: 5
weightedMode: 0 weightedMode: 0
inWeight: 0.33333334 inWeight: 0.33333334
outWeight: 0.33333334 outWeight: 0.33333334
@ -220,8 +220,8 @@ AnimationClip:
time: 0 time: 0
value: 1 value: 1
inSlope: 2 inSlope: 2
outSlope: -2 outSlope: 0
tangentMode: 69 tangentMode: 5
weightedMode: 0 weightedMode: 0
inWeight: 0.33333334 inWeight: 0.33333334
outWeight: 0.33333334 outWeight: 0.33333334

View file

@ -6701,7 +6701,7 @@ AnimationClip:
m_PostInfinity: 2 m_PostInfinity: 2
m_RotationOrder: 4 m_RotationOrder: 4
attribute: m_LocalEulerAngles.z attribute: m_LocalEulerAngles.z
path: HandL path: FootR
classID: 4 classID: 4
script: {fileID: 0} script: {fileID: 0}
- curve: - curve:
@ -6711,7 +6711,7 @@ AnimationClip:
m_PostInfinity: 2 m_PostInfinity: 2
m_RotationOrder: 4 m_RotationOrder: 4
attribute: m_LocalEulerAngles.y attribute: m_LocalEulerAngles.y
path: HandL path: FootR
classID: 4 classID: 4
script: {fileID: 0} script: {fileID: 0}
- curve: - curve:
@ -6721,7 +6721,37 @@ AnimationClip:
m_PostInfinity: 2 m_PostInfinity: 2
m_RotationOrder: 4 m_RotationOrder: 4
attribute: m_LocalEulerAngles.x attribute: m_LocalEulerAngles.x
path: HandL path: FootR
classID: 4
script: {fileID: 0}
- curve:
serializedVersion: 2
m_Curve: []
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalEulerAngles.z
path: LegLowR
classID: 4
script: {fileID: 0}
- curve:
serializedVersion: 2
m_Curve: []
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalEulerAngles.y
path: LegLowR
classID: 4
script: {fileID: 0}
- curve:
serializedVersion: 2
m_Curve: []
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalEulerAngles.x
path: LegLowR
classID: 4 classID: 4
script: {fileID: 0} script: {fileID: 0}
- curve: - curve:
@ -6761,7 +6791,7 @@ AnimationClip:
m_PostInfinity: 2 m_PostInfinity: 2
m_RotationOrder: 4 m_RotationOrder: 4
attribute: m_LocalEulerAngles.z attribute: m_LocalEulerAngles.z
path: LegUpR path: LegLowL
classID: 4 classID: 4
script: {fileID: 0} script: {fileID: 0}
- curve: - curve:
@ -6771,7 +6801,7 @@ AnimationClip:
m_PostInfinity: 2 m_PostInfinity: 2
m_RotationOrder: 4 m_RotationOrder: 4
attribute: m_LocalEulerAngles.y attribute: m_LocalEulerAngles.y
path: LegUpR path: LegLowL
classID: 4 classID: 4
script: {fileID: 0} script: {fileID: 0}
- curve: - curve:
@ -6781,7 +6811,7 @@ AnimationClip:
m_PostInfinity: 2 m_PostInfinity: 2
m_RotationOrder: 4 m_RotationOrder: 4
attribute: m_LocalEulerAngles.x attribute: m_LocalEulerAngles.x
path: LegUpR path: LegLowL
classID: 4 classID: 4
script: {fileID: 0} script: {fileID: 0}
- curve: - curve:
@ -6911,7 +6941,7 @@ AnimationClip:
m_PostInfinity: 2 m_PostInfinity: 2
m_RotationOrder: 4 m_RotationOrder: 4
attribute: m_LocalEulerAngles.z attribute: m_LocalEulerAngles.z
path: EyeL path: EyeR
classID: 4 classID: 4
script: {fileID: 0} script: {fileID: 0}
- curve: - curve:
@ -6921,7 +6951,7 @@ AnimationClip:
m_PostInfinity: 2 m_PostInfinity: 2
m_RotationOrder: 4 m_RotationOrder: 4
attribute: m_LocalEulerAngles.y attribute: m_LocalEulerAngles.y
path: EyeL path: EyeR
classID: 4 classID: 4
script: {fileID: 0} script: {fileID: 0}
- curve: - curve:
@ -6931,7 +6961,7 @@ AnimationClip:
m_PostInfinity: 2 m_PostInfinity: 2
m_RotationOrder: 4 m_RotationOrder: 4
attribute: m_LocalEulerAngles.x attribute: m_LocalEulerAngles.x
path: EyeL path: EyeR
classID: 4 classID: 4
script: {fileID: 0} script: {fileID: 0}
- curve: - curve:
@ -6971,7 +7001,7 @@ AnimationClip:
m_PostInfinity: 2 m_PostInfinity: 2
m_RotationOrder: 4 m_RotationOrder: 4
attribute: m_LocalEulerAngles.z attribute: m_LocalEulerAngles.z
path: FootR path: LegUpR
classID: 4 classID: 4
script: {fileID: 0} script: {fileID: 0}
- curve: - curve:
@ -6981,7 +7011,7 @@ AnimationClip:
m_PostInfinity: 2 m_PostInfinity: 2
m_RotationOrder: 4 m_RotationOrder: 4
attribute: m_LocalEulerAngles.y attribute: m_LocalEulerAngles.y
path: FootR path: LegUpR
classID: 4 classID: 4
script: {fileID: 0} script: {fileID: 0}
- curve: - curve:
@ -6991,7 +7021,97 @@ AnimationClip:
m_PostInfinity: 2 m_PostInfinity: 2
m_RotationOrder: 4 m_RotationOrder: 4
attribute: m_LocalEulerAngles.x attribute: m_LocalEulerAngles.x
path: FootR path: LegUpR
classID: 4
script: {fileID: 0}
- curve:
serializedVersion: 2
m_Curve: []
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalEulerAngles.z
path: EyeL
classID: 4
script: {fileID: 0}
- curve:
serializedVersion: 2
m_Curve: []
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalEulerAngles.y
path: EyeL
classID: 4
script: {fileID: 0}
- curve:
serializedVersion: 2
m_Curve: []
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalEulerAngles.x
path: EyeL
classID: 4
script: {fileID: 0}
- curve:
serializedVersion: 2
m_Curve: []
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalEulerAngles.z
path: Head
classID: 4
script: {fileID: 0}
- curve:
serializedVersion: 2
m_Curve: []
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalEulerAngles.y
path: Head
classID: 4
script: {fileID: 0}
- curve:
serializedVersion: 2
m_Curve: []
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalEulerAngles.x
path: Head
classID: 4
script: {fileID: 0}
- curve:
serializedVersion: 2
m_Curve: []
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalEulerAngles.z
path: HandL
classID: 4
script: {fileID: 0}
- curve:
serializedVersion: 2
m_Curve: []
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalEulerAngles.y
path: HandL
classID: 4
script: {fileID: 0}
- curve:
serializedVersion: 2
m_Curve: []
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalEulerAngles.x
path: HandL
classID: 4 classID: 4
script: {fileID: 0} script: {fileID: 0}
- curve: - curve:
@ -7024,66 +7144,6 @@ AnimationClip:
path: Mouth path: Mouth
classID: 4 classID: 4
script: {fileID: 0} script: {fileID: 0}
- curve:
serializedVersion: 2
m_Curve: []
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalEulerAngles.z
path: EyeR
classID: 4
script: {fileID: 0}
- curve:
serializedVersion: 2
m_Curve: []
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalEulerAngles.y
path: EyeR
classID: 4
script: {fileID: 0}
- curve:
serializedVersion: 2
m_Curve: []
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalEulerAngles.x
path: EyeR
classID: 4
script: {fileID: 0}
- curve:
serializedVersion: 2
m_Curve: []
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalEulerAngles.z
path: LegLowL
classID: 4
script: {fileID: 0}
- curve:
serializedVersion: 2
m_Curve: []
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalEulerAngles.y
path: LegLowL
classID: 4
script: {fileID: 0}
- curve:
serializedVersion: 2
m_Curve: []
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalEulerAngles.x
path: LegLowL
classID: 4
script: {fileID: 0}
- curve: - curve:
serializedVersion: 2 serializedVersion: 2
m_Curve: [] m_Curve: []
@ -7120,7 +7180,7 @@ AnimationClip:
m_PreInfinity: 2 m_PreInfinity: 2
m_PostInfinity: 2 m_PostInfinity: 2
m_RotationOrder: 4 m_RotationOrder: 4
attribute: m_LocalEulerAngles.z attribute: m_LocalEulerAngles.x
path: Woosh path: Woosh
classID: 4 classID: 4
script: {fileID: 0} script: {fileID: 0}
@ -7140,70 +7200,10 @@ AnimationClip:
m_PreInfinity: 2 m_PreInfinity: 2
m_PostInfinity: 2 m_PostInfinity: 2
m_RotationOrder: 4 m_RotationOrder: 4
attribute: m_LocalEulerAngles.x attribute: m_LocalEulerAngles.z
path: Woosh path: Woosh
classID: 4 classID: 4
script: {fileID: 0} script: {fileID: 0}
- curve:
serializedVersion: 2
m_Curve: []
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalEulerAngles.z
path: Head
classID: 4
script: {fileID: 0}
- curve:
serializedVersion: 2
m_Curve: []
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalEulerAngles.y
path: Head
classID: 4
script: {fileID: 0}
- curve:
serializedVersion: 2
m_Curve: []
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalEulerAngles.x
path: Head
classID: 4
script: {fileID: 0}
- curve:
serializedVersion: 2
m_Curve: []
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalEulerAngles.x
path: LegLowR
classID: 4
script: {fileID: 0}
- curve:
serializedVersion: 2
m_Curve: []
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalEulerAngles.y
path: LegLowR
classID: 4
script: {fileID: 0}
- curve:
serializedVersion: 2
m_Curve: []
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalEulerAngles.z
path: LegLowR
classID: 4
script: {fileID: 0}
m_HasGenericRootTransform: 0 m_HasGenericRootTransform: 0
m_HasMotionFloatCurves: 0 m_HasMotionFloatCurves: 0
m_Events: [] m_Events: []

View file

@ -406,11 +406,11 @@ namespace HeavenStudio
public void LateUpdate() public void LateUpdate()
{ {
if (metronome && isPlaying) if (isPlaying)
{ {
if (songPositionInBeatsAsDouble >= Math.Ceiling(startBeat) + _metronomeTally) if (songPositionInBeatsAsDouble >= Math.Ceiling(startBeat) + _metronomeTally)
{ {
metronomeSound = Util.SoundByte.PlayOneShot("metronome", Math.Ceiling(startBeat) + _metronomeTally); if (metronome) metronomeSound = Util.SoundByte.PlayOneShot("metronome", Math.Ceiling(startBeat) + _metronomeTally);
_metronomeTally++; _metronomeTally++;
} }
} }

View file

@ -29,7 +29,7 @@ namespace HeavenStudio.Games.Loaders
}, },
new GameAction("setEmotion", "Emotion") new GameAction("setEmotion", "Emotion")
{ {
function = delegate { var e = eventCaller.currentEntity; BlueBear.instance.SetEmotion(e["type"]); }, function = delegate { var e = eventCaller.currentEntity; BlueBear.instance.SetEmotion(e.beat, e["type"]); },
parameters = new List<Param>() parameters = new List<Param>()
{ {
new Param("type", BlueBear.EmotionType.ClosedEyes, "Emotion", "Which emotion should the blue bear use?") new Param("type", BlueBear.EmotionType.ClosedEyes, "Emotion", "Which emotion should the blue bear use?")
@ -274,18 +274,18 @@ namespace HeavenStudio.Games
headAndBodyAnim.SetBool("ShouldOpenMouth", foodHolder.childCount != 0); headAndBodyAnim.SetBool("ShouldOpenMouth", foodHolder.childCount != 0);
if (headAndBodyAnim.GetBool("ShouldOpenMouth")) if (headAndBodyAnim.GetBool("ShouldOpenMouth"))
{ {
_emotionCancelled = true; _emotionCancelledBeat = Conductor.instance.songPositionInBeatsAsDouble;
} }
if (PlayerInput.GetIsAction(InputAction_Left) && !IsExpectingInputNow(InputAction_Left.inputLockCategory)) if (PlayerInput.GetIsAction(InputAction_Left) && !IsExpectingInputNow(InputAction_Left.inputLockCategory))
{ {
SoundByte.PlayOneShotGame("blueBear/whiff", -1, SoundByte.GetPitchFromSemiTones(UnityEngine.Random.Range(-1, 2), false)); SoundByte.PlayOneShotGame("blueBear/whiff", -1, SoundByte.GetPitchFromSemiTones(UnityEngine.Random.Range(-1, 2), false));
Bite(true); Bite(Conductor.instance.songPositionInBeatsAsDouble, true);
} }
else if (PlayerInput.GetIsAction(InputAction_Right) && !IsExpectingInputNow(InputAction_Right.inputLockCategory)) else if (PlayerInput.GetIsAction(InputAction_Right) && !IsExpectingInputNow(InputAction_Right.inputLockCategory))
{ {
SoundByte.PlayOneShotGame("blueBear/whiff", -1, SoundByte.GetPitchFromSemiTones(UnityEngine.Random.Range(-1, 2), false)); SoundByte.PlayOneShotGame("blueBear/whiff", -1, SoundByte.GetPitchFromSemiTones(UnityEngine.Random.Range(-1, 2), false));
Bite(false); Bite(Conductor.instance.songPositionInBeatsAsDouble, false);
} }
UpdateEmotions(); UpdateEmotions();
@ -298,7 +298,7 @@ namespace HeavenStudio.Games
windAnim.SetScaledAnimationSpeed(); windAnim.SetScaledAnimationSpeed();
} }
private bool _emotionCancelled = false; private double _emotionCancelledBeat = -1;
private int _emotionIndex = 0; private int _emotionIndex = 0;
private List<RiqEntity> _allEmotionsStretch = new(); private List<RiqEntity> _allEmotionsStretch = new();
private EmotionStretchType _lastEmotion = EmotionStretchType.LookUp; private EmotionStretchType _lastEmotion = EmotionStretchType.LookUp;
@ -317,12 +317,11 @@ namespace HeavenStudio.Games
_emotionIndex++; _emotionIndex++;
_lastEmotion = (EmotionStretchType)_allEmotionsStretch[_emotionIndex - 1]["type"]; _lastEmotion = (EmotionStretchType)_allEmotionsStretch[_emotionIndex - 1]["type"];
crying = _lastEmotion == EmotionStretchType.StartCrying; crying = _lastEmotion == EmotionStretchType.StartCrying;
_emotionCancelled = false;
UpdateEmotions(); UpdateEmotions();
return; return;
} }
if (beat >= e.beat && beat < e.beat + e.length && !_emotionCancelled) if (beat >= e.beat && beat < e.beat + e.length && !(_emotionCancelledBeat >= e.beat && _emotionCancelledBeat < e.beat + e.length))
{ {
_lastEmotion = (EmotionStretchType)e["type"]; _lastEmotion = (EmotionStretchType)e["type"];
crying = _lastEmotion == EmotionStretchType.StartCrying; crying = _lastEmotion == EmotionStretchType.StartCrying;
@ -388,9 +387,9 @@ namespace HeavenStudio.Games
windAnim.DoScaledAnimationAsync("Wind", 0.5f); windAnim.DoScaledAnimationAsync("Wind", 0.5f);
} }
public void Bite(bool left) public void Bite(double beat, bool left)
{ {
_emotionCancelled = true; _emotionCancelledBeat = beat;
if (crying) if (crying)
{ {
headAndBodyAnim.DoScaledAnimationAsync(left ? "CryBiteL" : "CryBiteR", 0.5f); headAndBodyAnim.DoScaledAnimationAsync(left ? "CryBiteL" : "CryBiteR", 0.5f);
@ -456,14 +455,15 @@ namespace HeavenStudio.Games
} }
} }
public void SetEmotion(int emotion) public void SetEmotion(double beat, int emotion)
{ {
_emotionCancelled = true; _emotionCancelledBeat = beat;
switch (emotion) switch (emotion)
{ {
case (int)EmotionType.Neutral: case (int)EmotionType.Neutral:
//check if smiling then play "StopSmile"
headAndBodyAnim.DoScaledAnimationAsync("Idle", 0.5f); headAndBodyAnim.DoScaledAnimationAsync("Idle", 0.5f);
if (_allEmotionsStretch.Count == 0 || _lastEmotion != EmotionStretchType.Smile) return;
headAndBodyAnim.DoScaledAnimationAsync("StopSmile", 0.5f);
crying = false; crying = false;
break; break;
case (int)EmotionType.ClosedEyes: case (int)EmotionType.ClosedEyes:

View file

@ -68,7 +68,7 @@ namespace HeavenStudio.Games.Scripts_BlueBear
SoundByte.PlayOneShotGame("blueBear/chompDonut"); SoundByte.PlayOneShotGame("blueBear/chompDonut");
} }
game.Bite(isCake); game.Bite(Conductor.instance.songPositionInBeatsAsDouble, isCake);
game.EatTreat(); game.EatTreat();
SpawnCrumbs(); SpawnCrumbs();

View file

@ -91,10 +91,8 @@ namespace HeavenStudio.Games
[SerializeField] List<BMExecutive> executives = new List<BMExecutive>(); [SerializeField] List<BMExecutive> executives = new List<BMExecutive>();
public BMExecutive firstSpinner; public BMExecutive firstSpinner;
[SerializeField] float shakeIntensity = 0.5f; [SerializeField] float shakeIntensity = 0.5f;
public bool shouldBop = true;
private bool assistantCanBop = true; private bool assistantCanBop = true;
private bool executivesCanBop = true; private bool executivesCanBop = true;
public GameEvent bop = new GameEvent();
[NonSerialized] public Sound chairLoopSound = null; [NonSerialized] public Sound chairLoopSound = null;
int missCounter = 0; int missCounter = 0;
private Tween shakeTween; private Tween shakeTween;
@ -104,6 +102,7 @@ namespace HeavenStudio.Games
private void Awake() private void Awake()
{ {
instance = this; instance = this;
SetupBopRegion("boardMeeting", "bop", "auto");
InitExecutives(); InitExecutives();
} }
@ -145,7 +144,7 @@ namespace HeavenStudio.Games
public override void OnBeatPulse(double beat) public override void OnBeatPulse(double beat)
{ {
if (!shouldBop) return; if (!BeatIsInBopRegion(beat)) return;
SingleBop(); SingleBop();
} }
@ -166,7 +165,6 @@ namespace HeavenStudio.Games
public void Bop(double beat, float length, bool goBop, bool autoBop) public void Bop(double beat, float length, bool goBop, bool autoBop)
{ {
shouldBop = autoBop;
if (goBop) if (goBop)
{ {
for (int i = 0; i < length; i++) for (int i = 0; i < length; i++)

View file

@ -80,10 +80,10 @@ namespace HeavenStudio.Games
public enum WhoBops public enum WhoBops
{ {
Alalin, Alalin = 1,
Plalin, Plalin = 2,
Both, Both = 0,
None None = 3
} }
public enum Background public enum Background
@ -111,10 +111,6 @@ namespace HeavenStudio.Games
private double startSmile = 0; private double startSmile = 0;
private double stopSmile = 0; private double stopSmile = 0;
private bool bopLeft = true;
private bool bopRight = true;
public GameEvent bop = new GameEvent();
public static CatchyTune instance; public static CatchyTune instance;
static List<QueuedFruit> queuedFruits = new List<QueuedFruit>(); static List<QueuedFruit> queuedFruits = new List<QueuedFruit>();
struct QueuedFruit struct QueuedFruit
@ -184,6 +180,7 @@ namespace HeavenStudio.Games
private void Awake() private void Awake()
{ {
instance = this; instance = this;
SetupBopRegion("catchyTune", "bop", "bopAuto", false);
} }
const float orangeoffset = 0.5f; const float orangeoffset = 0.5f;
@ -249,6 +246,9 @@ namespace HeavenStudio.Games
public override void OnBeatPulse(double beat) public override void OnBeatPulse(double beat)
{ {
int whoBopsAuto = BeatIsInBopRegionInt(beat);
bool bopLeft = whoBopsAuto == (int)WhoBops.Plalin || whoBopsAuto == (int)WhoBops.Both;
bool bopRight = whoBopsAuto == (int)WhoBops.Alalin || whoBopsAuto == (int)WhoBops.Both;
if (bopLeft && stopCatchLeft == 0) if (bopLeft && stopCatchLeft == 0)
{ {
plalinAnim.DoScaledAnimationAsync("bop", 0.5f); plalinAnim.DoScaledAnimationAsync("bop", 0.5f);
@ -323,8 +323,6 @@ namespace HeavenStudio.Games
public void Bop(double beat, float length, int whoBops, int whoBopsAuto) public void Bop(double beat, float length, int whoBops, int whoBopsAuto)
{ {
bopLeft = whoBopsAuto == (int)WhoBops.Plalin || whoBopsAuto == (int)WhoBops.Both;
bopRight = whoBopsAuto == (int)WhoBops.Alalin || whoBopsAuto == (int)WhoBops.Both;
for (int i = 0; i < length; i++) for (int i = 0; i < length; i++)
{ {
BeatAction.New(instance, new List<BeatAction.Action>() BeatAction.New(instance, new List<BeatAction.Action>()

View file

@ -163,7 +163,6 @@ namespace HeavenStudio.Games
Sound SpinningLoop; Sound SpinningLoop;
[Header("Variables")] [Header("Variables")]
[SerializeField] List<PosterImages> posters = new List<PosterImages>(); [SerializeField] List<PosterImages> posters = new List<PosterImages>();
bool shouldBop = true;
bool canBop = true; bool canBop = true;
public bool doingCue; public bool doingCue;
double cueLength; double cueLength;
@ -171,7 +170,6 @@ namespace HeavenStudio.Games
bool shouldYay; bool shouldYay;
bool shouldDoSuccessZoom; bool shouldDoSuccessZoom;
public bool shouldBeBlack = false; public bool shouldBeBlack = false;
public GameEvent bop = new GameEvent();
int currentZoomIndex; int currentZoomIndex;
double currentZoomCamBeat; double currentZoomCamBeat;
float currentZoomCamLength; float currentZoomCamLength;
@ -230,6 +228,7 @@ namespace HeavenStudio.Games
void Awake() void Awake()
{ {
instance = this; instance = this;
SetupBopRegion("cheerReaders", "bop", "toggle2");
for (int i = 0; i < topMasks.Count; i++) for (int i = 0; i < topMasks.Count; i++)
{ {
firstRow[i].posterBook = topMasks[i]; firstRow[i].posterBook = topMasks[i];
@ -264,7 +263,7 @@ namespace HeavenStudio.Games
public override void OnBeatPulse(double beat) public override void OnBeatPulse(double beat)
{ {
if (!shouldBop) return; if (!BeatIsInBopRegion(beat)) return;
BopSingle(); BopSingle();
} }
@ -482,7 +481,6 @@ namespace HeavenStudio.Games
public void BopToggle(double beat, float length, bool startBop, bool bopAuto) public void BopToggle(double beat, float length, bool startBop, bool bopAuto)
{ {
shouldBop = bopAuto;
if (startBop) if (startBop)
{ {
for (int i = 0; i < length; i++) for (int i = 0; i < length; i++)

View file

@ -113,14 +113,12 @@ namespace HeavenStudio.Games
[SerializeField] private Student student; [SerializeField] private Student student;
[SerializeField] private GameObject djYellow; [SerializeField] private GameObject djYellow;
private Animator djYellowAnim; private Animator djYellowAnim;
private double lastReportedBeat = 0f;
public DJYellow djYellowScript; public DJYellow djYellowScript;
[Header("Properties")] [Header("Properties")]
public GameEvent bop = new GameEvent(); public GameEvent bop = new GameEvent();
public bool djYellowHolding; public bool djYellowHolding;
public bool andStop; public bool andStop;
public bool goBop;
public double beatOfInstance; public double beatOfInstance;
private bool djYellowBopLeft; private bool djYellowBopLeft;
public bool shouldBeHolding = false; public bool shouldBeHolding = false;
@ -138,7 +136,7 @@ namespace HeavenStudio.Games
djYellowAnim = djYellow.GetComponent<Animator>(); djYellowAnim = djYellow.GetComponent<Animator>();
djYellowScript = djYellow.GetComponent<DJYellow>(); djYellowScript = djYellow.GetComponent<DJYellow>();
student.Init(); student.Init();
goBop = true; SetupBopRegion("djSchool", "bop", "toggle");
} }
//For inactive game purposes //For inactive game purposes
@ -167,7 +165,7 @@ namespace HeavenStudio.Games
public override void OnBeatPulse(double beat) public override void OnBeatPulse(double beat)
{ {
if (!goBop) return; if (!BeatIsInBopRegion(beat)) return;
if (student.isHolding) if (student.isHolding)
{ {
student.anim.DoScaledAnimationAsync("HoldBop", 0.5f); student.anim.DoScaledAnimationAsync("HoldBop", 0.5f);
@ -243,7 +241,6 @@ namespace HeavenStudio.Games
public void Bop(double beat, float length, bool isBopping, bool autoBop) public void Bop(double beat, float length, bool isBopping, bool autoBop)
{ {
goBop = autoBop;
if (isBopping) if (isBopping)
{ {
for (int i = 0; i < length; i++) for (int i = 0; i < length; i++)

View file

@ -258,7 +258,7 @@ namespace HeavenStudio.Games.Scripts_DJSchool
{ {
new BeatAction.Action(caller.timer + caller.startBeat + 1, delegate new BeatAction.Action(caller.timer + caller.startBeat + 1, delegate
{ {
if (game.goBop) if (game.BeatIsInBopRegion(caller.timer + caller.startBeat + 1))
{ {
game.djYellowScript.ChangeHeadSprite(DJYellow.DJExpression.CrossEyed); game.djYellowScript.ChangeHeadSprite(DJYellow.DJExpression.CrossEyed);
if (game.djYellowHolding) game.djYellowScript.Reverse(); if (game.djYellowHolding) game.djYellowScript.Reverse();
@ -278,7 +278,7 @@ namespace HeavenStudio.Games.Scripts_DJSchool
{ {
new BeatAction.Action(beat, delegate new BeatAction.Action(beat, delegate
{ {
if (game.goBop) if (game.BeatIsInBopRegion(beat))
{ {
game.djYellowScript.ChangeHeadSprite(DJYellow.DJExpression.CrossEyed); game.djYellowScript.ChangeHeadSprite(DJYellow.DJExpression.CrossEyed);
if (game.djYellowHolding) game.djYellowScript.Reverse(); if (game.djYellowHolding) game.djYellowScript.Reverse();

View file

@ -140,9 +140,7 @@ namespace HeavenStudio.Games
[SerializeField] Sprite[] ObjectTypes; [SerializeField] Sprite[] ObjectTypes;
private double lastReportedBeat = 0f;
private bool birdOnScreen = false; private bool birdOnScreen = false;
bool dontBop = false;
private const string sfxNum = "dogNinja/"; private const string sfxNum = "dogNinja/";
public static DogNinja instance; public static DogNinja instance;
@ -200,6 +198,7 @@ namespace HeavenStudio.Games
private void Awake() private void Awake()
{ {
instance = this; instance = this;
SetupBopRegion("dogNinja", "Bop", "auto");
} }
void OnDestroy() void OnDestroy()
@ -216,7 +215,7 @@ namespace HeavenStudio.Games
public override void OnBeatPulse(double beat) public override void OnBeatPulse(double beat)
{ {
if (dontBop) return; if (!BeatIsInBopRegion(beat)) return;
DogAnim.DoScaledAnimationAsync("Bop", 0.5f); DogAnim.DoScaledAnimationAsync("Bop", 0.5f);
} }
@ -267,7 +266,6 @@ namespace HeavenStudio.Games
public void Bop(double beat, float length, bool auto, bool bop) public void Bop(double beat, float length, bool auto, bool bop)
{ {
dontBop = !auto;
if (!bop) return; if (!bop) return;
List<BeatAction.Action> actions = new(); List<BeatAction.Action> actions = new();

View file

@ -76,9 +76,7 @@ namespace HeavenStudio.Games
[SerializeField] public float shadowDepthScaleMax; [SerializeField] public float shadowDepthScaleMax;
[SerializeField] SuperCurveObject.Path[] ballBouncePaths; [SerializeField] SuperCurveObject.Path[] ballBouncePaths;
double lastGirlGacha = double.MinValue; double lastGirlGacha = double.MinValue;
bool shouldBop = true;
bool canBop = true; bool canBop = true;
GameEvent bop = new GameEvent();
public static DoubleDate instance; public static DoubleDate instance;
public static List<QueuedBall> queuedBalls = new List<QueuedBall>(); public static List<QueuedBall> queuedBalls = new List<QueuedBall>();
[NonSerialized] public double lastHitWeasel = double.MinValue; [NonSerialized] public double lastHitWeasel = double.MinValue;
@ -132,6 +130,7 @@ namespace HeavenStudio.Games
private void Awake() private void Awake()
{ {
instance = this; instance = this;
SetupBopRegion("doubleDate", "bop", "autoBop");
} }
private void Start() { private void Start() {
@ -140,7 +139,7 @@ namespace HeavenStudio.Games
public override void OnBeatPulse(double beat) public override void OnBeatPulse(double beat)
{ {
if (shouldBop) SingleBop(); if (BeatIsInBopRegion(beat)) SingleBop();
} }
void Update() void Update()
@ -198,7 +197,6 @@ namespace HeavenStudio.Games
public void Bop(double beat, float length, bool goBop, bool autoBop) public void Bop(double beat, float length, bool goBop, bool autoBop)
{ {
shouldBop = autoBop;
if (goBop) if (goBop)
{ {
for (int i = 0; i < length; i++) for (int i = 0; i < length; i++)

View file

@ -21,7 +21,7 @@ namespace HeavenStudio.Games.Loaders
parameters = new List<Param>() parameters = new List<Param>()
{ {
new Param("bop", true, "Bop", "Should the drummers bop?"), new Param("bop", true, "Bop", "Should the drummers bop?"),
new Param("autoBop", true, "Bop (Auto)", "Should the drummers auto bop?") new Param("autoBop", false, "Bop (Auto)", "Should the drummers auto bop?")
} }
}, },
new GameAction("drum", "Hit Drum") new GameAction("drum", "Hit Drum")
@ -121,9 +121,6 @@ namespace HeavenStudio.Games
bool isMoving; bool isMoving;
string moveAnim; string moveAnim;
EasingFunction.Ease lastEase; EasingFunction.Ease lastEase;
bool goBop = true;
public GameEvent bop = new GameEvent();
public int count = 0; public int count = 0;
public static DrummingPractice instance; public static DrummingPractice instance;
@ -132,6 +129,7 @@ namespace HeavenStudio.Games
{ {
instance = this; instance = this;
SetMiis(); SetMiis();
SetupBopRegion("drummingPractice", "bop", "autoBop");
} }
public override void OnGameSwitch(double beat) public override void OnGameSwitch(double beat)
@ -146,7 +144,7 @@ namespace HeavenStudio.Games
public override void OnBeatPulse(double beat) public override void OnBeatPulse(double beat)
{ {
if (goBop) if (BeatIsInBopRegion(beat))
{ {
Bop(); Bop();
} }
@ -191,7 +189,6 @@ namespace HeavenStudio.Games
public void SetBop(double beat, float length, bool shouldBop, bool autoBop) public void SetBop(double beat, float length, bool shouldBop, bool autoBop)
{ {
goBop = autoBop;
if (shouldBop) if (shouldBop)
{ {
for (int i = 0; i < length; i++) for (int i = 0; i < length; i++)

View file

@ -218,8 +218,6 @@ namespace HeavenStudio.Games
private static bool wantKamoneAlt = false; private static bool wantKamoneAlt = false;
private static double wantBigReady = double.MinValue; private static double wantBigReady = double.MinValue;
private bool hasJumped = false; private bool hasJumped = false;
private bool goBopIdol = true;
private bool goBopSpec = true;
private bool noJudgement = false; private bool noJudgement = false;
private bool noJudgementInput = false; private bool noJudgementInput = false;
@ -235,6 +233,8 @@ namespace HeavenStudio.Games
private void Awake() private void Awake()
{ {
instance = this; instance = this;
SetupBopRegion("fanClub", "bop", "type2", false);
AddBopRegionEventsInt("fanClub", "finish", 3);
Spectators = new List<GameObject>(); Spectators = new List<GameObject>();
idolAnimator = Arisa.GetComponent<Animator>(); idolAnimator = Arisa.GetComponent<Animator>();
backupRAnimator = Blue.GetComponent<Animator>(); backupRAnimator = Blue.GetComponent<Animator>();
@ -357,6 +357,9 @@ namespace HeavenStudio.Games
public override void OnBeatPulse(double beat) public override void OnBeatPulse(double beat)
{ {
var cond = Conductor.instance; var cond = Conductor.instance;
int whoBops = BeatIsInBopRegionInt(beat);
bool goBopIdol = whoBops == (int)IdolBopType.Both || whoBops == (int)IdolBopType.Idol;
bool goBopSpec = whoBops == (int)IdolBopType.Both || whoBops == (int)IdolBopType.Spectators;
if (goBopIdol) if (goBopIdol)
{ {
if (!(cond.songPositionInBeatsAsDouble >= noBop.startBeat && cond.songPositionInBeatsAsDouble < noBop.startBeat + noBop.length)) if (!(cond.songPositionInBeatsAsDouble >= noBop.startBeat && cond.songPositionInBeatsAsDouble < noBop.startBeat + noBop.length))
@ -398,8 +401,6 @@ namespace HeavenStudio.Games
public void Bop(double beat, float length, int target = (int) IdolBopType.Both, int targetAuto = (int)IdolBopType.Both) public void Bop(double beat, float length, int target = (int) IdolBopType.Both, int targetAuto = (int)IdolBopType.Both)
{ {
goBopIdol = targetAuto == (int)IdolBopType.Both || targetAuto == (int)IdolBopType.Idol;
goBopSpec = targetAuto == (int)IdolBopType.Both || targetAuto == (int)IdolBopType.Spectators;
for (int i = 0; i < length; i++) for (int i = 0; i < length; i++)
{ {
BeatAction.New(instance, new List<BeatAction.Action>() BeatAction.New(instance, new List<BeatAction.Action>()
@ -934,7 +935,6 @@ namespace HeavenStudio.Games
if (noJudgement) return; if (noJudgement) return;
noJudgement = true; noJudgement = true;
noJudgementInput = false; noJudgementInput = false;
goBopSpec = false;
// recreation of sub61 // recreation of sub61
BeatAction.New(this, new List<BeatAction.Action>() BeatAction.New(this, new List<BeatAction.Action>()

View file

@ -692,6 +692,7 @@ namespace HeavenStudio.Games
private void Awake() private void Awake()
{ {
instance = this; instance = this;
SetupBopRegion("karateman", "bop", "toggle");
KarateManPot.ResetLastCombo(); KarateManPot.ResetLastCombo();
@ -1168,13 +1169,13 @@ namespace HeavenStudio.Games
public override void OnBeatPulse(double beat) public override void OnBeatPulse(double beat)
{ {
bool autoBop = BeatIsInBopRegion(beat);
Joe.bop.length = autoBop ? float.MaxValue : 0;
Joe.RequestBop(); Joe.RequestBop();
} }
public void ToggleBop(double beat, float length, bool toggle, bool autoBop) public void ToggleBop(double beat, float length, bool toggle, bool autoBop)
{ {
Joe.bop.length = autoBop ? float.MaxValue : 0;
if (toggle) if (toggle)
{ {
var actions = new List<BeatAction.Action>(); var actions = new List<BeatAction.Action>();

View file

@ -94,10 +94,8 @@ namespace HeavenStudio.Games
[Header("Variables")] [Header("Variables")]
bool intervalStarted; bool intervalStarted;
double intervalStartBeat; double intervalStartBeat;
bool bossBop = true;
public double beatInterval = 4f; public double beatInterval = 4f;
public bool bossAnnoyed = false; public bool bossAnnoyed = false;
private double lastReportedBeat = 0f;
const string sfxName = "meatGrinder/"; const string sfxName = "meatGrinder/";
public static MeatGrinder instance; public static MeatGrinder instance;
@ -124,6 +122,7 @@ namespace HeavenStudio.Games
private void Awake() private void Awake()
{ {
instance = this; instance = this;
SetupBopRegion("meatGrinder", "bop", "bossBop");
} }
void OnDestroy() void OnDestroy()
@ -161,7 +160,7 @@ namespace HeavenStudio.Games
{ {
if (!BossAnim.IsPlayingAnimationName("BossCall") if (!BossAnim.IsPlayingAnimationName("BossCall")
&& !BossAnim.IsPlayingAnimationName("BossSignal") && !BossAnim.IsPlayingAnimationName("BossSignal")
&& bossBop) && BeatIsInBopRegion(beat))
{ {
BossAnim.DoScaledAnimationAsync(bossAnnoyed ? "BossMiss" : "Bop", 0.5f); BossAnim.DoScaledAnimationAsync(bossAnnoyed ? "BossMiss" : "Bop", 0.5f);
} }
@ -169,7 +168,6 @@ namespace HeavenStudio.Games
public void Bop(double beat, double length, bool doesBop, bool autoBop) public void Bop(double beat, double length, bool doesBop, bool autoBop)
{ {
bossBop = autoBop;
if (doesBop) if (doesBop)
{ {
for (int i = 0; i < length; i++) for (int i = 0; i < length; i++)

View file

@ -6,6 +6,7 @@ using HeavenStudio.Util;
using HeavenStudio.Common; using HeavenStudio.Common;
using HeavenStudio.InputSystem; using HeavenStudio.InputSystem;
using System; using System;
using System.Linq;
namespace HeavenStudio.Games namespace HeavenStudio.Games
{ {
@ -448,6 +449,82 @@ namespace HeavenStudio.Games
} }
#region Bop
protected enum DefaultBopEnum
{
Off = 0,
On = 1,
}
private Dictionary<double, int> bopRegion = new();
public bool BeatIsInBopRegion(double beat)
{
if (bopRegion.Count == 0) return true;
int bop = 0;
foreach (var item in bopRegion)
{
if (beat < item.Key) break;
if (beat >= item.Key) bop = item.Value;
}
return (DefaultBopEnum)bop == DefaultBopEnum.On;
}
public int BeatIsInBopRegionInt(double beat)
{
if (bopRegion.Count == 0) return 0;
int bop = 0;
foreach (var item in bopRegion)
{
if (beat < item.Key) break;
if (beat >= item.Key) bop = item.Value;
}
return bop;
}
protected void SetupBopRegion(string gameName, string eventName, string toggleName, bool isBool = true)
{
var allEvents = EventCaller.GetAllInGameManagerList(gameName, new string[] { eventName });
allEvents.Sort((x, y) => x.beat.CompareTo(y.beat));
foreach (var e in allEvents)
{
if (isBool)
{
bopRegion.Add(e.beat, e[toggleName] ? 1 : 0);
}
else
{
bopRegion.Add(e.beat, e[toggleName]);
}
}
}
protected void AddBopRegionEvents(string gameName, string eventName, bool allowBop)
{
var allEvents = EventCaller.GetAllInGameManagerList(gameName, new string[] { eventName });
foreach (var e in allEvents)
{
bopRegion.Add(e.beat, allowBop ? 1 : 0);
}
bopRegion = bopRegion.OrderBy(pair => pair.Value).ToDictionary(pair => pair.Key, pair => pair.Value);
}
protected void AddBopRegionEventsInt(string gameName, string eventName, int allowBop)
{
var allEvents = EventCaller.GetAllInGameManagerList(gameName, new string[] { eventName });
foreach (var e in allEvents)
{
bopRegion.Add(e.beat, allowBop);
}
bopRegion = bopRegion.OrderBy(pair => pair.Value).ToDictionary(pair => pair.Key, pair => pair.Value);
}
#endregion
private void OnDestroy() private void OnDestroy()
{ {
foreach (var evt in scheduledInputs) foreach (var evt in scheduledInputs)

View file

@ -17,14 +17,14 @@ namespace HeavenStudio.Games.Loaders
{ {
function = delegate { function = delegate {
var e = eventCaller.currentEntity; var e = eventCaller.currentEntity;
MunchyMonk.instance.Bop(e.beat, e["bop"], e["autoBop"]); MunchyMonk.instance.Bop(e.beat, e.length, e["bop"]);
}, },
parameters = new List<Param>() parameters = new List<Param>()
{ {
new Param("bop", true, "Monk Bops?", "Does the monk bop?"), new Param("bop", true, "Monk Bops?", "Does the monk bop?"),
new Param("autoBop", false, "Monk Bops? (Auto)", "Does the monk auto bop?"), new Param("autoBop", false, "Monk Bops? (Auto)", "Does the monk auto bop?"),
}, },
defaultLength = 0.5f, resizable = true
}, },
new GameAction("MonkMove", "Monk Move") new GameAction("MonkMove", "Monk Move")
{ {
@ -209,7 +209,6 @@ namespace HeavenStudio.Games
public double lastReportedBeat = 0f; public double lastReportedBeat = 0f;
public bool needBlush; public bool needBlush;
public bool isStaring; public bool isStaring;
bool monkBop = true;
// these variables are static so that they can be set outside of the game/stay the same between game switches // these variables are static so that they can be set outside of the game/stay the same between game switches
static public int howManyGulps; static public int howManyGulps;
@ -241,6 +240,7 @@ namespace HeavenStudio.Games
{ {
instance = this; instance = this;
Baby.SetActive(!disableBaby); Baby.SetActive(!disableBaby);
SetupBopRegion("munchyMonk", "Bop", "autoBop");
} }
private void Start() private void Start()
@ -352,7 +352,7 @@ namespace HeavenStudio.Games
public override void OnBeatPulse(double beat) public override void OnBeatPulse(double beat)
{ {
if ((MonkAnim.IsAnimationNotPlaying() || MonkAnim.IsPlayingAnimationName("Bop") || MonkAnim.IsPlayingAnimationName("Idle")) if ((MonkAnim.IsAnimationNotPlaying() || MonkAnim.IsPlayingAnimationName("Bop") || MonkAnim.IsPlayingAnimationName("Idle"))
&& monkBop && BeatIsInBopRegion(beat)
&& !isStaring) && !isStaring)
{ {
MonkAnim.DoScaledAnimationAsync("Bop", 0.5f); MonkAnim.DoScaledAnimationAsync("Bop", 0.5f);
@ -370,15 +370,23 @@ namespace HeavenStudio.Games
} }
} }
public void Bop(double beat, bool bop, bool autoBop) public void Bop(double beat, double length, bool bop)
{
if (!bop) return;
List<BeatAction.Action> actions = new();
for (int i = 0; i < length; i++)
{
actions.Add(new(beat + i, delegate
{ {
monkBop = autoBop;
if (bop) {
needBlush = false; needBlush = false;
MonkAnim.DoScaledAnimationAsync("Bop", 0.5f); MonkAnim.DoScaledAnimationAsync("Bop", 0.5f);
if (growLevel == 4) BrowAnim.DoScaledAnimationAsync("Bop", 0.5f); if (growLevel == 4) BrowAnim.DoScaledAnimationAsync("Bop", 0.5f);
if (growLevel > 0) StacheAnim.DoScaledAnimationAsync($"Bop{growLevel}", 0.5f); if (growLevel > 0) StacheAnim.DoScaledAnimationAsync($"Bop{growLevel}", 0.5f);
}));
} }
if (actions.Count > 0) BeatAction.New(this, actions);
} }
public void InputFunctions(int whichVar, float state = 0) public void InputFunctions(int whichVar, float state = 0)

View file

@ -229,6 +229,7 @@ namespace HeavenStudio.Games
void Awake() void Awake()
{ {
instance = this; instance = this;
SetupBopRegion("octopusMachine", "bop", "keepBop");
} }
private void Start() private void Start()
@ -263,8 +264,11 @@ namespace HeavenStudio.Games
if (autoAction) bopIterate++; if (autoAction) bopIterate++;
bool keepBop = BeatIsInBopRegion(beat);
foreach (var octo in octopodes) foreach (var octo in octopodes)
{ {
octo.cantBop = !keepBop;
octo.RequestBop(); octo.RequestBop();
} }
} }
@ -339,7 +343,6 @@ namespace HeavenStudio.Games
foreach (var octo in octopodes) { foreach (var octo in octopodes) {
if (singleBop) octo.PlayAnimation(whichBop); if (singleBop) octo.PlayAnimation(whichBop);
if (keepBop) bopStatus = whichBop; if (keepBop) bopStatus = whichBop;
octo.cantBop = !keepBop;
} }
} }

View file

@ -152,8 +152,6 @@ namespace HeavenStudio.Games
public Paddlers paddlers; public Paddlers paddlers;
private bool goBop = true;
public static RhythmRally instance; public static RhythmRally instance;
private void Awake() private void Awake()
@ -166,6 +164,7 @@ namespace HeavenStudio.Games
playerAnim.Play("Idle", 0, 0); playerAnim.Play("Idle", 0, 0);
opponentAnim.Play("Idle", 0, 0); opponentAnim.Play("Idle", 0, 0);
SetupBopRegion("rhythmRally", "bop", "bopAuto");
} }
const float tableHitTime = 0.58f; const float tableHitTime = 0.58f;
@ -366,7 +365,7 @@ namespace HeavenStudio.Games
public override void OnBeatPulse(double beat) public override void OnBeatPulse(double beat)
{ {
if (goBop && !inPose) if (BeatIsInBopRegion(beat) && !inPose)
{ {
BopSingle(); BopSingle();
} }
@ -374,7 +373,6 @@ namespace HeavenStudio.Games
public void Bop(double beat, float length, bool bop, bool bopAuto) public void Bop(double beat, float length, bool bop, bool bopAuto)
{ {
goBop = bopAuto;
if (bop) if (bop)
{ {
for (int i = 0; i < length; i++) for (int i = 0; i < length; i++)

View file

@ -70,23 +70,21 @@ namespace HeavenStudio.Games
public Animator CloseCrane; public Animator CloseCrane;
public Animator FarCrane; public Animator FarCrane;
public GameObject Player; public GameObject Player;
private bool shouldBop = true;
private bool missed; private bool missed;
private bool hasSlurped; private bool hasSlurped;
public GameEvent bop = new GameEvent();
public static RhythmSomen instance; public static RhythmSomen instance;
// Start is called before the first frame update // Start is called before the first frame update
void Awake() void Awake()
{ {
instance = this; instance = this;
SetupBopRegion("rhythmSomen", "bop", "toggle");
} }
public override void OnBeatPulse(double beat) public override void OnBeatPulse(double beat)
{ {
if (shouldBop) SomenPlayer.DoScaledAnimationAsync("HeadBob", 0.5f); if (BeatIsInBopRegion(beat)) SomenPlayer.DoScaledAnimationAsync("HeadBob", 0.5f);
} }
void Update() void Update()
@ -125,7 +123,6 @@ namespace HeavenStudio.Games
public void ToggleBop(double beat, float length, bool bopOrNah, bool autoBop) public void ToggleBop(double beat, float length, bool bopOrNah, bool autoBop)
{ {
shouldBop = autoBop;
if (bopOrNah) if (bopOrNah)
{ {
for (int i = 0; i < length; i++) for (int i = 0; i < length; i++)

View file

@ -143,7 +143,6 @@ namespace HeavenStudio.Games
private float currentZoomCamBeat; private float currentZoomCamBeat;
private Vector3 lastCamPos = new Vector3(0, 0, -10); private Vector3 lastCamPos = new Vector3(0, 0, -10);
private Vector3 currentCamPos = new Vector3(0, 0, -10); private Vector3 currentCamPos = new Vector3(0, 0, -10);
private bool shouldBop = true;
private bool missedBigGuy; private bool missedBigGuy;
private bool reporterShouldHeart; private bool reporterShouldHeart;
private bool hitPose; private bool hitPose;
@ -201,6 +200,7 @@ namespace HeavenStudio.Games
void Awake() void Awake()
{ {
instance = this; instance = this;
SetupBopRegion("ringside", "toggleBop", "bop");
var camEvents = EventCaller.GetAllInGameManagerList("ringside", new string[] { "poseForTheFans" }); var camEvents = EventCaller.GetAllInGameManagerList("ringside", new string[] { "poseForTheFans" });
List<RiqEntity> tempEvents = new List<RiqEntity>(); List<RiqEntity> tempEvents = new List<RiqEntity>();
for (int i = 0; i < camEvents.Count; i++) for (int i = 0; i < camEvents.Count; i++)
@ -220,7 +220,7 @@ namespace HeavenStudio.Games
public override void OnBeatPulse(double beat) public override void OnBeatPulse(double beat)
{ {
if (shouldBop && canBop) if (BeatIsInBopRegion(beat) && canBop)
{ {
if (UnityEngine.Random.Range(1, 18) == 1) if (UnityEngine.Random.Range(1, 18) == 1)
{ {
@ -331,7 +331,6 @@ namespace HeavenStudio.Games
public void ToggleBop(double beat, float length, bool startBopping, bool autoBop) public void ToggleBop(double beat, float length, bool startBopping, bool autoBop)
{ {
shouldBop = autoBop;
if (startBopping) if (startBopping)
{ {
for (int i = 0; i < length; i++) for (int i = 0; i < length; i++)
@ -510,7 +509,7 @@ namespace HeavenStudio.Games
new BeatAction.Action(beat + 1, delegate { PoseCheck(beat); }), new BeatAction.Action(beat + 1, delegate { PoseCheck(beat); }),
new BeatAction.Action(beat + 4f, delegate new BeatAction.Action(beat + 4f, delegate
{ {
if (shouldBop) if (BeatIsInBopRegion(beat + 4f))
{ {
if (UnityEngine.Random.Range(1, 18) == 1) if (UnityEngine.Random.Range(1, 18) == 1)
{ {

View file

@ -89,6 +89,7 @@ namespace HeavenStudio.Games.Loaders
namespace HeavenStudio.Games namespace HeavenStudio.Games
{ {
using JetBrains.Annotations;
using Scripts_NtrSamurai; using Scripts_NtrSamurai;
public class SamuraiSliceNtr : Minigame public class SamuraiSliceNtr : Minigame
@ -102,15 +103,12 @@ namespace HeavenStudio.Games
public enum WhoBops public enum WhoBops
{ {
Samurai = 0, Samurai = 2,
Children = 1, Children = 1,
Both = 2, Both = 0,
None = 3 None = 3
} }
private bool goBopSamurai = true;
private bool goBopChild = true;
[Header("References")] [Header("References")]
public NtrSamurai player; public NtrSamurai player;
public GameObject launcher; public GameObject launcher;
@ -167,10 +165,15 @@ namespace HeavenStudio.Games
private void Awake() private void Awake()
{ {
instance = this; instance = this;
SetupBopRegion("samuraiSliceNtr", "bop", "whoBopsAuto", false);
} }
public override void OnBeatPulse(double beat) public override void OnBeatPulse(double beat)
{ {
int whoBopsAuto = BeatIsInBopRegionInt(beat);
bool goBopSamurai = whoBopsAuto == (int)WhoBops.Samurai || whoBopsAuto == (int)WhoBops.Both;
bool goBopChild = whoBopsAuto == (int)WhoBops.Children || whoBopsAuto == (int)WhoBops.Both;
if (goBopSamurai) player.Bop(); if (goBopSamurai) player.Bop();
if (goBopChild) childParent.GetComponent<NtrSamuraiChild>().Bop(); if (goBopChild) childParent.GetComponent<NtrSamuraiChild>().Bop();
} }
@ -187,8 +190,6 @@ namespace HeavenStudio.Games
public void Bop(double beat, float length, int whoBops, int whoBopsAuto) public void Bop(double beat, float length, int whoBops, int whoBopsAuto)
{ {
goBopSamurai = whoBopsAuto == (int)WhoBops.Samurai || whoBopsAuto == (int)WhoBops.Both;
goBopChild = whoBopsAuto == (int)WhoBops.Children || whoBopsAuto == (int)WhoBops.Both;
for (int i = 0; i < length; i++) for (int i = 0; i < length; i++)
{ {
BeatAction.New(instance, new List<BeatAction.Action>() BeatAction.New(instance, new List<BeatAction.Action>()

View file

@ -136,9 +136,34 @@ namespace HeavenStudio.Games.Scripts_SeeSaw
transform.position = GetPathPositionFromBeat(currentPath, Math.Max(startBeat, currentBeat), startBeat); transform.position = GetPathPositionFromBeat(currentPath, Math.Max(startBeat, currentBeat), startBeat);
break; break;
case JumpState.HighOutOut: case JumpState.HighOutOut:
if (currentBeat >= startBeat + 1 && !hasChangedAnimMidAir && see)
{
if (!hasChangedAnimMidAir) anim.Play("Jump_OutOut_Fall", 0, 0);
hasChangedAnimMidAir = true;
}
transform.position = GetPathPositionFromBeat(currentPath, Math.Max(startBeat, currentBeat), startBeat);
break;
case JumpState.HighOutIn: case JumpState.HighOutIn:
if (currentBeat >= startBeat + 1 && !hasChangedAnimMidAir && see)
{
if (!hasChangedAnimMidAir) anim.Play("Jump_OutIn_Tuck", 0, 0);
hasChangedAnimMidAir = true;
}
transform.position = GetPathPositionFromBeat(currentPath, Math.Max(startBeat, currentBeat), startBeat);
break;
case JumpState.HighInOut: case JumpState.HighInOut:
if (currentBeat >= startBeat + 1 && !hasChangedAnimMidAir && see)
{
if (!hasChangedAnimMidAir) anim.Play("Jump_InOut_Tuck", 0, 0);
hasChangedAnimMidAir = true;
}
break;
case JumpState.HighInIn: case JumpState.HighInIn:
if (currentBeat >= startBeat + 1 && !hasChangedAnimMidAir && see)
{
if (!hasChangedAnimMidAir) anim.Play("Jump_InIn_Fall", 0, 0);
hasChangedAnimMidAir = true;
}
transform.position = GetPathPositionFromBeat(currentPath, Math.Max(startBeat, currentBeat), startBeat); transform.position = GetPathPositionFromBeat(currentPath, Math.Max(startBeat, currentBeat), startBeat);
break; break;
} }

View file

@ -144,7 +144,6 @@ namespace HeavenStudio.Games
public Animator Gramps; public Animator Gramps;
public Animator Hit; public Animator Hit;
public GameObject Player; public GameObject Player;
[NonSerialized] public bool shouldBop = true;
bool canBop = true; bool canBop = true;
bool grampsCanBop = true; bool grampsCanBop = true;
public bool spaceGrampsShouldBop = false; public bool spaceGrampsShouldBop = false;
@ -226,11 +225,12 @@ namespace HeavenStudio.Games
instance = this; instance = this;
colorStart = defaultBGColor; colorStart = defaultBGColor;
colorEnd = defaultBGColor; colorEnd = defaultBGColor;
SetupBopRegion("spaceDance", "bop", "auto");
} }
public override void OnBeatPulse(double beat) public override void OnBeatPulse(double beat)
{ {
if (shouldBop) if (BeatIsInBopRegion(beat))
{ {
Bop(); Bop();
} }
@ -656,7 +656,6 @@ namespace HeavenStudio.Games
public void EpicBop(double beat, float length, bool autoDancers, bool dancers, bool autoGramps, bool gramps) public void EpicBop(double beat, float length, bool autoDancers, bool dancers, bool autoGramps, bool gramps)
{ {
shouldBop = autoDancers;
spaceGrampsShouldBop = autoGramps; spaceGrampsShouldBop = autoGramps;
if (dancers || gramps) if (dancers || gramps)
{ {

View file

@ -110,9 +110,7 @@ namespace HeavenStudio.Games
[SerializeField] private float monkeyJumpHeight = 3f; [SerializeField] private float monkeyJumpHeight = 3f;
[SerializeField] private float maxFlashOpacity = 0.8f; [SerializeField] private float maxFlashOpacity = 0.8f;
private GameEvent bop = new();
private bool canBop = true; private bool canBop = true;
private bool shouldBop = true;
private double jumpStartBeat = double.MinValue; private double jumpStartBeat = double.MinValue;
@ -121,11 +119,12 @@ namespace HeavenStudio.Games
private void Awake() private void Awake()
{ {
instance = this; instance = this;
SetupBopRegion("tapTrial", "bop", "toggle2");
} }
public override void OnBeatPulse(double beat) public override void OnBeatPulse(double beat)
{ {
if (shouldBop) SingleBop(); if (BeatIsInBopRegion(beat)) SingleBop();
} }
private void Update() private void Update()
@ -253,7 +252,6 @@ namespace HeavenStudio.Games
public void Bop(double beat, float length, bool bop, bool autoBop) public void Bop(double beat, float length, bool bop, bool autoBop)
{ {
shouldBop = autoBop;
if (bop) if (bop)
{ {
List<BeatAction.Action> actions = new(); List<BeatAction.Action> actions = new();
@ -443,14 +441,14 @@ namespace HeavenStudio.Games
private void MissJump(PlayerActionEvent caller) private void MissJump(PlayerActionEvent caller)
{ {
player.JumpTapMiss(false); player.JumpTapMiss(false);
if (giraffe.IsAnimationNotPlaying()) giraffe.DoScaledAnimationAsync("Miss", 0.5f); if (giraffe.IsAnimationNotPlaying() && currentAnim != GiraffeAnimation.Exit) giraffe.DoScaledAnimationAsync("Miss", 0.5f);
ResetScroll(); ResetScroll();
} }
private void MissJumpFinal(PlayerActionEvent caller) private void MissJumpFinal(PlayerActionEvent caller)
{ {
player.JumpTapMiss(true); player.JumpTapMiss(true);
if (giraffe.IsAnimationNotPlaying()) giraffe.DoScaledAnimationAsync("Miss", 0.5f); if (giraffe.IsAnimationNotPlaying() && currentAnim != GiraffeAnimation.Exit) giraffe.DoScaledAnimationAsync("Miss", 0.5f);
ResetScroll(); ResetScroll();
} }

View file

@ -228,8 +228,6 @@ namespace HeavenStudio.Games
bool doingPoses = false; bool doingPoses = false;
bool shouldHold = false; bool shouldHold = false;
double crouchEndBeat; double crouchEndBeat;
public bool shouldBop = true;
public GameEvent bop = new GameEvent();
static List<QueuedPose> queuedPoses = new List<QueuedPose>(); static List<QueuedPose> queuedPoses = new List<QueuedPose>();
static List<QueuedCrouch> queuedCrouches = new List<QueuedCrouch>(); static List<QueuedCrouch> queuedCrouches = new List<QueuedCrouch>();
[Header("Components")] [Header("Components")]
@ -255,11 +253,12 @@ namespace HeavenStudio.Games
void Awake() void Awake()
{ {
instance = this; instance = this;
SetupBopRegion("theDazzles", "bop", "toggle");
} }
public override void OnBeatPulse(double beat) public override void OnBeatPulse(double beat)
{ {
if (shouldBop) if (BeatIsInBopRegion(beat))
{ {
foreach (var girl in npcGirls) foreach (var girl in npcGirls)
{ {
@ -353,7 +352,6 @@ namespace HeavenStudio.Games
public void Bop(double beat, float length, bool goBop, bool autoBop) public void Bop(double beat, float length, bool goBop, bool autoBop)
{ {
shouldBop = autoBop;
if (goBop) if (goBop)
{ {
for (int i = 0; i < length; i++) for (int i = 0; i < length; i++)

View file

@ -147,8 +147,6 @@ namespace HeavenStudio.Games
Dictionary<double, RiqEntity> passBallDict = new(); Dictionary<double, RiqEntity> passBallDict = new();
string currentPassType; string currentPassType;
public static TossBoys instance; public static TossBoys instance;
bool shouldBop = true;
public GameEvent bop = new GameEvent();
float currentEventLength; float currentEventLength;
const int IAAka = IAMAXCAT; const int IAAka = IAMAXCAT;
@ -236,6 +234,7 @@ namespace HeavenStudio.Games
instance = this; instance = this;
colorStart = defaultBGColor; colorStart = defaultBGColor;
colorEnd = defaultBGColor; colorEnd = defaultBGColor;
SetupBopRegion("tossBoys", "bop", "auto");
} }
new void OnDrawGizmos() new void OnDrawGizmos()
@ -264,7 +263,7 @@ namespace HeavenStudio.Games
public override void OnBeatPulse(double beat) public override void OnBeatPulse(double beat)
{ {
if (shouldBop) if (BeatIsInBopRegion(beat))
{ {
SingleBop(); SingleBop();
} }
@ -352,7 +351,6 @@ namespace HeavenStudio.Games
public void Bop(double beat, float length, bool auto, bool goBop) public void Bop(double beat, float length, bool auto, bool goBop)
{ {
shouldBop = auto;
if (goBop) if (goBop)
{ {
List<BeatAction.Action> bops = new List<BeatAction.Action>(); List<BeatAction.Action> bops = new List<BeatAction.Action>();

View file

@ -114,12 +114,13 @@ namespace HeavenStudio.Games
private void Awake() private void Awake()
{ {
instance = this; instance = this;
SetupBopRegion("trickClass", "bop", "autoBop");
} }
public override void OnBeatPulse(double beat) public override void OnBeatPulse(double beat)
{ {
var cond = Conductor.instance; var cond = Conductor.instance;
if (!goBop) return; if (!BeatIsInBopRegion(beat)) return;
if ((!playerReady) && cond.songPositionInBeatsAsDouble > playerBopStart) if ((!playerReady) && cond.songPositionInBeatsAsDouble > playerBopStart)
playerAnim.DoScaledAnimationAsync("Bop"); playerAnim.DoScaledAnimationAsync("Bop");