flash/inputs actually working, create SlotButton.cs

flash now lerps in the SlotButton class, which makes things so. so much easier.
This commit is contained in:
AstrlJelly 2024-02-11 22:17:13 -05:00
parent 7c8dc8603f
commit e2309e014c
5 changed files with 232 additions and 89 deletions

View file

@ -876,6 +876,7 @@ GameObject:
m_Component:
- component: {fileID: 6713427547028951939}
- component: {fileID: 3765927633667635310}
- component: {fileID: 8493640715844712253}
m_Layer: 0
m_Name: Button3
m_TagString: Untagged
@ -921,6 +922,24 @@ Animator:
m_AllowConstantClipSamplingOptimization: 1
m_KeepAnimatorStateOnDisable: 0
m_WriteDefaultValuesOnDisable: 0
--- !u!114 &8493640715844712253
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3468298043875673060}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 824e4674e220b544991c5311c2d90ff1, type: 3}
m_Name:
m_EditorClassIdentifier:
pressed: 0
color: {r: 0.86274517, g: 0, b: 0, a: 0}
anim: {fileID: 3765927633667635310}
srs:
- {fileID: 2877045166871582979}
- {fileID: 4449036682437390073}
--- !u!1 &3502234333494748245
GameObject:
m_ObjectHideFlags: 0
@ -1184,6 +1203,7 @@ GameObject:
m_Component:
- component: {fileID: 6816887475717257767}
- component: {fileID: 8656164449290761354}
- component: {fileID: 7161291887338607999}
m_Layer: 0
m_Name: Button2
m_TagString: Untagged
@ -1229,6 +1249,24 @@ Animator:
m_AllowConstantClipSamplingOptimization: 1
m_KeepAnimatorStateOnDisable: 0
m_WriteDefaultValuesOnDisable: 0
--- !u!114 &7161291887338607999
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4661475570310962003}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 824e4674e220b544991c5311c2d90ff1, type: 3}
m_Name:
m_EditorClassIdentifier:
pressed: 0
color: {r: 0.8000001, g: 0.2784314, b: 0.95294124, a: 0}
anim: {fileID: 8656164449290761354}
srs:
- {fileID: 6069226680631927887}
- {fileID: 2214261874876006399}
--- !u!1 &4687682230392877706
GameObject:
m_ObjectHideFlags: 0
@ -1323,6 +1361,7 @@ GameObject:
m_Component:
- component: {fileID: 2864234776698747384}
- component: {fileID: 8588887349593004598}
- component: {fileID: 5051449585850381948}
m_Layer: 0
m_Name: Button1
m_TagString: Untagged
@ -1368,6 +1407,24 @@ Animator:
m_AllowConstantClipSamplingOptimization: 1
m_KeepAnimatorStateOnDisable: 0
m_WriteDefaultValuesOnDisable: 0
--- !u!114 &5051449585850381948
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5076257341597419496}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 824e4674e220b544991c5311c2d90ff1, type: 3}
m_Name:
m_EditorClassIdentifier:
pressed: 0
color: {r: 0.3803922, g: 0.9843138, b: 0.25490198, a: 0}
anim: {fileID: 8588887349593004598}
srs:
- {fileID: 4790761080377207371}
- {fileID: 6479832831682828701}
--- !u!1 &5449113805416087283
GameObject:
m_ObjectHideFlags: 0
@ -1502,29 +1559,15 @@ MonoBehaviour:
SoundSequences: []
scheduledInputs: []
smAnim: {fileID: 8395666848120559718}
eyeSprites:
- {fileID: 1032231447, guid: 878a62db1eeb38d46a0db8e2b67b9730, type: 3}
- {fileID: 90921217, guid: 878a62db1eeb38d46a0db8e2b67b9730, type: 3}
- {fileID: -108380036, guid: 878a62db1eeb38d46a0db8e2b67b9730, type: 3}
- {fileID: -1768230940, guid: 878a62db1eeb38d46a0db8e2b67b9730, type: 3}
- {fileID: -867298969, guid: 878a62db1eeb38d46a0db8e2b67b9730, type: 3}
- {fileID: 1609057261, guid: 878a62db1eeb38d46a0db8e2b67b9730, type: 3}
- {fileID: -1628350790, guid: 878a62db1eeb38d46a0db8e2b67b9730, type: 3}
- {fileID: 1306426365, guid: 878a62db1eeb38d46a0db8e2b67b9730, type: 3}
- {fileID: 811989312, guid: 878a62db1eeb38d46a0db8e2b67b9730, type: 3}
- {fileID: -1260976779, guid: 878a62db1eeb38d46a0db8e2b67b9730, type: 3}
eyeAnims:
- {fileID: 7955005190241873031}
- {fileID: 2460964828755838947}
- {fileID: 5491330272697201237}
eyeSRs:
- {fileID: 2787758216707421360}
- {fileID: 1775810850113365420}
- {fileID: 8454085075965419430}
buttonAnims:
- {fileID: 8588887349593004598}
- {fileID: 8656164449290761354}
- {fileID: 3765927633667635310}
buttons:
- {fileID: 5051449585850381948}
- {fileID: 7161291887338607999}
- {fileID: 8493640715844712253}
buttonFlashColor: {r: 1, g: 1, b: 0.68235296, a: 0}
--- !u!1 &5849268409563499564
GameObject:
m_ObjectHideFlags: 0
@ -2567,7 +2610,7 @@ Transform:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 9212153283773584803}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0.179, y: 0.2550001, z: 0}
m_LocalPosition: {x: 0.17900002, y: 0.2550001, z: 0}
m_LocalScale: {x: 0.8024, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []

View file

@ -127,7 +127,7 @@ AnimationClip:
m_AdditiveReferencePoseClip: {fileID: 0}
m_AdditiveReferencePoseTime: 0
m_StartTime: 0
m_StopTime: 0.05
m_StopTime: 0.06666667
m_OrientationOffsetY: 0
m_Level: 0
m_CycleOffset: 0
@ -398,4 +398,39 @@ AnimationClip:
m_EulerEditorCurves: []
m_HasGenericRootTransform: 0
m_HasMotionFloatCurves: 0
m_Events: []
m_Events:
- time: 0
functionName: AnimateColor
data:
objectReferenceParameter: {fileID: 0}
floatParameter: 0
intParameter: 0
messageOptions: 0
- time: 0.016666668
functionName: AnimateColor
data:
objectReferenceParameter: {fileID: 0}
floatParameter: 0
intParameter: 1
messageOptions: 0
- time: 0.033333335
functionName: AnimateColor
data:
objectReferenceParameter: {fileID: 0}
floatParameter: 0
intParameter: 2
messageOptions: 0
- time: 0.05
functionName: AnimateColor
data:
objectReferenceParameter: {fileID: 0}
floatParameter: 0
intParameter: 3
messageOptions: 0
- time: 0.06666667
functionName: AnimateColor
data:
objectReferenceParameter: {fileID: 0}
floatParameter: 0
intParameter: 4
messageOptions: 0

View file

@ -0,0 +1,73 @@
using System.Collections;
using System.Collections.Generic;
using System;
using UnityEngine;
using HeavenStudio.Util;
namespace HeavenStudio.Games.Scripts_SlotMonster
{
public class SlotButton : MonoBehaviour
{
public bool pressed;
public Color color; // used to ease between button colors and button flash colors! wow
public Animator anim;
public SpriteRenderer[] srs;
public bool flashing;
const int FLASH_FRAMES = 4;
public int currentFrame;
private SlotMonster game;
public void Init(SlotMonster instance)
{
color = srs[0].color;
game = instance;
}
private void LateUpdate()
{
if (flashing) {
foreach (var sr in srs) {
// sr.color = Color.Lerp(color, game.buttonFlashColor, currentFrame / FRAMES);
var normalized = currentFrame / FLASH_FRAMES;
float newR = EasingFunction.Linear(game.buttonFlashColor.r, color.r, normalized);
float newG = EasingFunction.Linear(game.buttonFlashColor.g, color.g, normalized);
float newB = EasingFunction.Linear(game.buttonFlashColor.b, color.b, normalized);
sr.color = new Color(newR, newG, newB);
Debug.Log("sr.color : " + sr.color);
Debug.Log("currentFrame : " + currentFrame);
}
} else {
foreach (var sr in srs) {
sr.color = color;
}
}
}
public void Press()
{
anim.DoScaledAnimationAsync("Press", 0.5f);
pressed = true;
}
public void TryFlash()
{
if (!pressed) {
anim.DoScaledAnimationAsync("Flash", 0.5f);
}
}
// animation events
public void AnimateColor(int frame)
{
currentFrame = frame;
flashing = frame < FLASH_FRAMES;
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 824e4674e220b544991c5311c2d90ff1
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -20,17 +20,10 @@ namespace HeavenStudio.Games.Loaders
{
new GameAction("startInterval", "Start Interval")
{
preFunction = delegate {
var e = eventCaller.currentEntity;
SoundByte.PlayOneShotGame("slotMonster/start_touch", e.beat - 1, forcePlay: true);
if (eventCaller.gameManager.minigameObj.TryGetComponent(out SlotMonster instance)) {
instance.PreStartInterval(e.beat);
}
},
function = delegate {
if (eventCaller.gameManager.minigameObj.TryGetComponent(out SlotMonster instance)) {
var e = eventCaller.currentEntity;
instance.StartInterval(e.beat, e.length, e["auto"], e["eyeType"], e, 0);
instance.StartInterval(e.beat, e.length, e["auto"], e["eyeType"], 0);
}
},
defaultLength = 3f,
@ -79,10 +72,18 @@ namespace HeavenStudio.Games.Loaders
priority = 1,
parameters = new List<Param>()
{
new Param("button1", new Color(), "Button 1 Color", "Set the color of the first button."),
new Param("button2", new Color(), "Button 2 Color", "Set the color of the second button."),
new Param("button3", new Color(), "Button 3 Color", "Set the color of the third button."),
new Param("flash", new Color(), "Button Flash Color", "Set the color of the flash of the buttons."),
new Param("button1", new Color(0.38f, 0.98f, 0.25f), "Button 1 Color", "Set the color of the first button."),
new Param("button2", new Color(0.8f, 0.28f, 0.95f), "Button 2 Color", "Set the color of the second button."),
new Param("button3", new Color(0.87f, 0f, 0f), "Button 3 Color", "Set the color of the third button."),
new Param("flash", new Color(1f, 1f, 0.68f), "Button Flash Color", "Set the color of the flash of the buttons."),
},
},
new GameAction("test", "Test")
{
function = delegate {
if (eventCaller.gameManager.minigameObj.TryGetComponent(out SlotMonster instance)) {
instance.ScheduleInput(eventCaller.currentEntity.beat, 1, Games.Minigame.InputAction_BasicPress, null, null, null);
}
},
},
}
@ -93,6 +94,7 @@ namespace HeavenStudio.Games.Loaders
namespace HeavenStudio.Games
{
using Scripts_SlotMonster;
public class SlotMonster : Minigame
{
public enum DrumTypes
@ -119,40 +121,31 @@ namespace HeavenStudio.Games
[Header("Animators")]
[SerializeField] Animator smAnim;
[SerializeField] Sprite[] eyeSprites;
[SerializeField] Animator[] eyeAnims;
[SerializeField] SpriteRenderer[] eyeSRs;
[SerializeField] Animator[] buttonAnims;
private double[] buttonstartBeats;
// used to ease between button colors and button flash colors! wow
private Color[] buttonColors;
private Color buttonFlashColor;
[SerializeField] SlotButton[] buttons;
public Color buttonFlashColor;
private List<RiqEntity> gameEntities;
private Sound rollingSound;
private int currentEyeSprite = 1;
private int maxButtons;
private int currentButton { get => currentButton %= 3; set => currentButton = value; }
// private double smPrepareBeat;
private int currentButton;
private void Awake()
{
// eyeSRs = eyeAnims.Where(x => x.GetComponent<SpriteRenderer>()).ToArray();
foreach (var button in buttons) {
button.Init(this);
}
}
private void Update()
{
if (PlayerInput.GetIsAction(InputAction_BasicPress) && !IsExpectingInputNow(InputAction_BasicPress) && !buttonAnims[GetCurrentButton()].IsPlayingAnimationNames("Press")) {
if (PlayerInput.GetIsAction(InputAction_BasicPress) && !IsExpectingInputNow(InputAction_BasicPress)) {
_ = HitButton();
ScoreMiss();
}
// if (smPrepareBeat <= conductor.songPositionInBeatsAsDouble) {
// }
}
public override void OnPlay(double beat)
@ -163,32 +156,24 @@ namespace HeavenStudio.Games
public override void OnGameSwitch(double beat)
{
gameEntities = GameManager.instance.Beatmap.Entities.FindAll(c => c.datamodel.Split('/')[0] == "slotMonster");
foreach (RiqEntity e in gameEntities.FindAll(e => e.datamodel == "slotMonster/startInterval" && e.beat - 1 < beat && e.beat + e.length > beat))
{
Debug.Log("im gonna explode : " + (e.beat - 0.5 > beat));
if (e.beat - 0.5 > beat) {
PreStartInterval(beat);
}
if (e.beat < beat) {
StartInterval(e.beat, e.length, e["auto"], e["eyeType"], e, beat);
}
// StartInterval(e.beat, e.length, e["auto"], e["eyeType"], e, beat);
foreach (RiqEntity e in gameEntities.FindAll(e => e.datamodel == "slotMonster/startInterval" && e.beat < beat && e.beat + e.length > beat)) {
StartInterval(e.beat, e.length, e["auto"], e["eyeType"], beat);
}
}
// make sure the current button is always between 0 and 2 (buttons 1-3)
private int GetCurrentButton() => currentButton %= 3;
private int GetCurrentButton() => Array.FindIndex(buttons, button => !button.pressed);
private bool HitButton(bool isHit = false) // returns true if it's the last one
{
int thisButton = GetCurrentButton();
// Debug.Log("BUTTON HIT : " + thisButton);
if (thisButton == -1) return false;
bool lastButton = thisButton == maxButtons - 1;
string hitSfx = "slotMonster/stop_" + (lastButton && isHit ? "hit" : (thisButton + 1));
SoundByte.PlayOneShotGame(hitSfx, forcePlay: true);
for (int i = thisButton; i < (lastButton ? 3 : thisButton + 1); i++)
{
buttonAnims[thisButton].DoScaledAnimationAsync("Press", 0.5f);
buttons[thisButton].Press();
if (eyeAnims[thisButton].IsPlayingAnimationNames("Spin")) {
int eyeSprite = currentEyeSprite;
if (!isHit) {
@ -200,30 +185,29 @@ namespace HeavenStudio.Games
eyeAnims[thisButton].Play("EyeItem" + eyeSprite, 0, 0);
}
}
if (lastButton) {
if (rollingSound != null) rollingSound.Stop();
}
currentButton++;
return lastButton && isHit;
}
public void PreStartInterval(double beat)
public void StartInterval(double beat, float length, bool autoPass, int eyeSprite, double gameSwitchBeat)
{
// smPrepareBeat
smAnim.DoScaledAnimationFromBeatAsync("Prepare", 0.5f, beat - 1);
foreach (var anim in buttonAnims)
{
anim.Play("PopUp", 0, 1);
}
}
List<RiqEntity> slotActions = gameEntities.FindAll(e => e.datamodel == "slotMonster/slot" && e.beat >= beat && e.beat < beat + length);
public void StartInterval(double beat, float length, bool autoPass, int eyeSprite, RiqEntity startInterval, double gameSwitchBeat)
{
List<RiqEntity> slotActions = gameEntities.FindAll(e => e.datamodel == "slotMonster/slot" && e.beat >= startInterval.beat && e.beat < startInterval.beat + startInterval.length);
SoundByte.PlayOneShotGame("slotMonster/start_touch", forcePlay: true);
smAnim.DoScaledAnimationFromBeatAsync("Prepare", 0.5f, beat);
foreach (var button in buttons) {
button.anim.Play("PopUp", 0, 1);
}
List<MultiSound.Sound> sounds = new();
List<BeatAction.Action> actions = new();
maxButtons = Mathf.Min(slotActions.Count, 3);
for (int i = 0; i < maxButtons; i++) // limit to 3 actions
{
buttonAnims[i].Play("PopUp", 0, 0);
buttons[i].anim.Play("PopUp", 0, 0);
int whichSlot = i;
RiqEntity slot = slotActions[whichSlot];
if (slot.beat < gameSwitchBeat) continue;
@ -236,9 +220,7 @@ namespace HeavenStudio.Games
// Debug.Log(sfx);
sounds.Add(new(sfx + "DrumNTR", slot.beat));
actions.Add(new(slot.beat, delegate {
if (buttonAnims[whichSlot].IsAnimationNotPlaying()) {
buttonAnims[whichSlot].DoScaledAnimationAsync("Flash", 0.5f);
}
buttons[whichSlot].TryFlash();
}));
}
MultiSound.Play(sounds.ToArray(), false);
@ -255,8 +237,7 @@ namespace HeavenStudio.Games
public void PassTurn(double beat, float length, double startBeat = -1, List<RiqEntity> slotActions = null)
{
smAnim.DoScaledAnimationFromBeatAsync("Release", 0.5f, beat);
for (int i = 0; i < eyeAnims.Length; i++)
{
for (int i = 0; i < eyeAnims.Length; i++) {
eyeAnims[i].DoScaledAnimationAsync("Spin", 0.5f);
}
SoundByte.PlayOneShotGame("slotMonster/start_rolling", forcePlay: true);
@ -274,17 +255,15 @@ namespace HeavenStudio.Games
double slotBeat = slotActions[i].beat;
actions.Add(new(beat + length + slotBeat - startBeat, delegate {
if (!buttonAnims[whichSlot].IsPlayingAnimationNames("Press")) {
buttonAnims[whichSlot].DoScaledAnimationAsync("Flash");
}
buttons[whichSlot].TryFlash();
}));
// Debug.Log("input scheduled at : " + (beat + length + slotBeat - startBeat));
PlayerActionEvent input = ScheduleInput(beat, slotBeat - startBeat + length, InputAction_BasicPress, ButtonHit, null, null);
input.IsHittable = () => {
int currentButton = GetCurrentButton();
return currentButton == whichSlot && !buttonAnims[whichSlot].IsPlayingAnimationNames("Press");
};
// input.IsHittable = () => {
// int currentButton = GetCurrentButton();
// return currentButton == whichSlot && !buttonsPressed[whichSlot];
// };
}
BeatAction.New(this, actions);
}
@ -304,9 +283,11 @@ namespace HeavenStudio.Games
//
// }
public void ButtonColor(Color[] baseColors, Color flashColor)
public void ButtonColor(Color[] colors, Color flashColor)
{
buttonColors = baseColors;
for (int i = 0; i < buttons.Length; i++) {
buttons[i].color = colors[i];
}
buttonFlashColor = flashColor;
}
}