33253e3c27
* meat grinder prefab + sprite cutting/naming done + icon
title :)
* Boss Bop, Miss, & Signal Anims
can you read
* Boss Call Anim
self-explanatory
* fix the z axis + new sprite
still working on getting those bops working. they're a bit weird (not the anim itself)
* Restored Meat Grinder Animations
i have no idea what just happened with github but the animations are back
* All Tack Animations Complete
just missing the meat anims
* Literally two lines changed
skull emoji (forgot to set the light meat for the miss anim to inactive by default)
* Meat Grinder Anims (should be) Done
Added the Meat Hit anims
* goodnight
* bopping every beat
* tons of sfx
* meat calls with their corresponding sfx/animations have been added
* prefunctions...
* inputs + sfx + prefunction
making swift progress here :)
* little commit
more cues and animation stuff so that i can have new animations
* Meat Toss Anims
also fixed up some of tack's hit anims to make the smear more consistent
* night night
* moved all the meat stuff to a new script
-this should help with instantiating the meat
* animations are a bit more comprehensive
* man, barelies are way easier than i thought they were gonna be
* instantiating works now
committing to work on my pc instead of my laptop
but i have been getting a lot done with the meat! it's just that most of that stuff is learning what i can't do...
* Boss Animation Tweaks
Adjusted Boss' bop and miss animations
* woohoo animation!
hi sean this is for u. tell me anything to tweak :)
* Quick Meat Toss Anim Fix
Prevents meat from playing the toss animation twice
* meat hit animation works!
sometimes there's a frame where the first frame of its animation pops up but i should be able to fix that
also just general improvements + framework for different meats
* it's done! or at least out of wip!
* you can select which meat type is tossed (defaults to random)
* ghost meat has been busted (it looped back to its first frame of anim sometimes right before being destroyed; i just added a single frame idle.)
* overall just optimized code
* removed WIP from game name
* a few touch-ups
* change all sfx to ogg
-also amplified toss.ogg by 4db, was hard to hear at the same time as hitting a cue
* fixed boss not bopping a beat after a signal
-a very small bit hacky but it really works fine. will fix if any problems come up (but i added a check so that there shouldn't be)
* i have stashed changes :P
* new bg + remove references
title
* boss weird bopping fixed + game switches fixed
* final touch-ups
* random things just broke
* for whatever reason animation controller for boss got reverted, breaking an animation
* and we forgot to merge two spritesheets instead of just replacing one with the other. oops
* sfx volume lowerd
* ok cool commit time
* added superscroll (MADE BY STARPELLY)
* fixed dog ninja backwards compatibility
* fixed meat grinder's startinterval need
* added d pad controls to dog ninja and meat grinder
* oops forgot to add dpad for dog ninja
* remove d-pad from meat grinder 😢
---------
Co-authored-by: Seanski2 <seanbenedit@gmail.com>
248 lines
8.5 KiB
C#
248 lines
8.5 KiB
C#
using HeavenStudio.Util;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
using NaughtyBezierCurves;
|
|
|
|
namespace HeavenStudio.Games.Loaders
|
|
{
|
|
using static Minigames;
|
|
public static class pcoMeatLoader
|
|
{
|
|
public static Minigame AddGame(EventCaller eventCaller) {
|
|
return new Minigame("meatGrinder", "Meat Grinder", "501d18", false, false, new List<GameAction>()
|
|
{
|
|
new GameAction("MeatToss", "Meat Toss")
|
|
{
|
|
function = delegate {
|
|
var e = eventCaller.currentEntity;
|
|
MeatGrinder.instance.MeatToss(e.beat);
|
|
},
|
|
defaultLength = 2f,
|
|
priority = 2,
|
|
},
|
|
new GameAction("MeatCall", "Meat Call")
|
|
{
|
|
function = delegate {
|
|
var e = eventCaller.currentEntity;
|
|
MeatGrinder.instance.MeatCall(e.beat);
|
|
},
|
|
defaultLength = 0.5f,
|
|
priority = 2,
|
|
preFunctionLength = 1f,
|
|
preFunction = delegate {
|
|
var e = eventCaller.currentEntity;
|
|
MeatGrinder.PreMeatCall(e.beat);
|
|
},
|
|
},
|
|
new GameAction("StartInterval", "Start Interval")
|
|
{
|
|
function = delegate {
|
|
var e = eventCaller.currentEntity;
|
|
MeatGrinder.instance.StartInterval(e.beat, e.length);
|
|
},
|
|
defaultLength = 4f,
|
|
resizable = true,
|
|
priority = 1,
|
|
preFunctionLength = 2f,
|
|
preFunction = delegate {
|
|
var e = eventCaller.currentEntity;
|
|
MeatGrinder.PreInterval(e.beat, e.length);
|
|
},
|
|
},
|
|
new GameAction("bop", "Bop")
|
|
{
|
|
function = delegate {
|
|
var e = eventCaller.currentEntity;
|
|
MeatGrinder.instance.Bop(e.beat, e.length, e["bop"], e["bossBop"]);
|
|
},
|
|
parameters = new List<Param>()
|
|
{
|
|
new Param("bop", true, "Boss Bops?", "Does Boss bop?"),
|
|
new Param("bossBop", false, "Boss Bops? (Auto)", "Does Boss Auto bop?"),
|
|
},
|
|
resizable = true,
|
|
priority = 4,
|
|
},
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|
|
namespace HeavenStudio.Games
|
|
{
|
|
using Scripts_MeatGrinder;
|
|
public class MeatGrinder : Minigame
|
|
{
|
|
static List<float> queuedInputs = new List<float>();
|
|
|
|
[Header("Objects")]
|
|
public GameObject MeatBase;
|
|
|
|
[Header("Animators")]
|
|
public Animator BossAnim;
|
|
public Animator TackAnim;
|
|
|
|
[Header("Variables")]
|
|
bool intervalStarted;
|
|
float intervalStartBeat;
|
|
float beatInterval = 4f;
|
|
bool bossBop = true;
|
|
bool dontCall = false;
|
|
public bool bossAnnoyed = false;
|
|
private float lastReportedBeat = 0f;
|
|
const string sfxName = "meatGrinder/";
|
|
|
|
public static MeatGrinder instance;
|
|
|
|
public enum MeatType
|
|
{
|
|
Dark,
|
|
Light,
|
|
}
|
|
|
|
private void Awake()
|
|
{
|
|
instance = this;
|
|
}
|
|
|
|
void OnDestroy()
|
|
{
|
|
if (!Conductor.instance.isPlaying || Conductor.instance.isPaused) {
|
|
if (queuedInputs.Count > 0) queuedInputs.Clear();
|
|
}
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
if (!Conductor.instance.isPlaying || Conductor.instance.isPaused) {
|
|
if (queuedInputs.Count > 0) queuedInputs.Clear();
|
|
}
|
|
|
|
if (!Conductor.instance.isPlaying && !Conductor.instance.isPaused && intervalStarted) {
|
|
intervalStarted = false;
|
|
}
|
|
|
|
if (PlayerInput.Pressed() && !IsExpectingInputNow(InputType.STANDARD_DOWN)) {
|
|
ScoreMiss();
|
|
TackAnim.DoScaledAnimationAsync("TackEmptyHit", 0.5f);
|
|
TackAnim.SetBool("tackMeated", false);
|
|
Jukebox.PlayOneShotGame(sfxName+"whiff");
|
|
if (bossAnnoyed) BossAnim.DoScaledAnimationAsync("Bop", 0.5f);
|
|
}
|
|
|
|
if (bossAnnoyed) BossAnim.SetBool("bossAnnoyed", true);
|
|
}
|
|
|
|
private void LateUpdate()
|
|
{
|
|
if (Conductor.instance.ReportBeat(ref lastReportedBeat)
|
|
&& !BossAnim.IsPlayingAnimationName("BossCall")
|
|
&& !BossAnim.IsPlayingAnimationName("BossSignal")
|
|
&& bossBop)
|
|
{
|
|
BossAnim.DoScaledAnimationAsync(bossAnnoyed ? "BossMiss" : "Bop", 0.5f);
|
|
};
|
|
}
|
|
|
|
public void Bop(float beat, float length, bool doesBop, bool autoBop)
|
|
{
|
|
bossBop = autoBop;
|
|
if (doesBop)
|
|
{
|
|
for (int i = 0; i < length; i++)
|
|
{
|
|
BeatAction.New(instance.gameObject, new List<BeatAction.Action>()
|
|
{
|
|
new BeatAction.Action(beat + i, delegate
|
|
{
|
|
if (!BossAnim.IsPlayingAnimationName("BossCall") && !BossAnim.IsPlayingAnimationName("BossSignal"))
|
|
{
|
|
BossAnim.DoScaledAnimationAsync(bossAnnoyed ? "BossMiss" : "Bop", 0.5f);
|
|
};
|
|
})
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|
|
public static void PreInterval(float beat, float interval)
|
|
{
|
|
if (!MeatGrinder.instance.intervalStarted && !MeatGrinder.instance.dontCall) {
|
|
MultiSound.Play(new MultiSound.Sound[] { new MultiSound.Sound(sfxName+"startSignal", beat - 1f), }, forcePlay: true);
|
|
|
|
BeatAction.New(instance.gameObject, new List<BeatAction.Action>() {
|
|
new BeatAction.Action(beat - 1, delegate { instance.BossAnim.DoScaledAnimationAsync("BossSignal", 0.5f); }), });
|
|
}
|
|
|
|
MeatGrinder.instance.dontCall = true;
|
|
MeatGrinder.instance.beatInterval = interval;
|
|
}
|
|
|
|
public void StartInterval(float beat, float interval)
|
|
{
|
|
intervalStartBeat = beat;
|
|
if (!intervalStarted) { intervalStarted = true; }
|
|
|
|
BeatAction.New(gameObject, new List<BeatAction.Action>()
|
|
{
|
|
new BeatAction.Action(beat + interval - 1, delegate { PassTurn(beat); }),
|
|
});
|
|
}
|
|
|
|
public void MeatToss(float beat)
|
|
{
|
|
Jukebox.PlayOneShotGame(sfxName+"toss");
|
|
|
|
MeatToss Meat = Instantiate(MeatBase).GetComponent<MeatToss>();
|
|
Meat.startBeat = beat;
|
|
Meat.cueLength = 1f;
|
|
Meat.cueBased = true;
|
|
Meat.meatType = "DarkMeat";
|
|
}
|
|
|
|
public static void PreMeatCall(float beat)
|
|
{
|
|
if (!MeatGrinder.instance.dontCall) {
|
|
BeatAction.New(instance.gameObject, new List<BeatAction.Action>() {
|
|
new BeatAction.Action(beat - 1, delegate { MeatGrinder.PreInterval(beat, instance.beatInterval); }),
|
|
});
|
|
}
|
|
}
|
|
|
|
public void MeatCall(float beat)
|
|
{
|
|
BossAnim.DoScaledAnimationAsync("BossCall", 0.5f);
|
|
Jukebox.PlayOneShotGame(sfxName+"signal");
|
|
|
|
if (!intervalStarted)
|
|
{
|
|
StartInterval(beat, beatInterval);
|
|
}
|
|
|
|
queuedInputs.Add(beat - intervalStartBeat);
|
|
}
|
|
|
|
public void PassTurn(float beat)
|
|
{
|
|
dontCall = false;
|
|
intervalStarted = false;
|
|
foreach (var input in queuedInputs)
|
|
{
|
|
BeatAction.New(instance.gameObject, new List<BeatAction.Action>()
|
|
{
|
|
new BeatAction.Action(input + beat, delegate {
|
|
MeatToss Meat = Instantiate(MeatBase).GetComponent<MeatToss>();
|
|
Meat.startBeat = beat;
|
|
Meat.cueLength = beatInterval + input;
|
|
Meat.cueBased = false;
|
|
Meat.meatType = "LightMeat";
|
|
}),
|
|
});
|
|
|
|
}
|
|
queuedInputs.Clear();
|
|
}
|
|
}
|
|
} |