HeavenStudio/Assets/Scripts/Games/MeatGrinder/MeatGrinder.cs

227 lines
7.2 KiB
C#
Raw Normal View History

Meat Grinder (#314) * 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 --------- Co-authored-by: Seanski2 <seanbenedit@gmail.com>
2023-02-23 00:25:14 +00:00
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", "f1492e", 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,
},
new GameAction("StartInterval", "Start Interval")
{
function = delegate {
var e = eventCaller.currentEntity;
MeatGrinder.instance.StartInterval(e.beat, e.length);
},
defaultLength = 4f,
resizable = true,
priority = 1,
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["bossBop"]);
},
parameters = new List<Param>()
{
new Param("bossBop", false, "Boss Bops?", "Does Boss bop?"),
},
defaultLength = 0.5f,
priority = 4,
},
});
}
}
}
namespace HeavenStudio.Games
{
using Scripts_MeatGrinder;
public class MeatGrinder : Minigame
{
static List<QueuedMeatInput> queuedInputs = new List<QueuedMeatInput>();
struct QueuedMeatInput
{
public float beatAwayFromStart;
}
[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;
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, bool doesBop)
{
bossBop = doesBop;
}
public static void PreInterval(float beat, float interval)
{
MeatGrinder.instance.beatInterval = interval;
BeatAction.New(instance.gameObject, new List<BeatAction.Action>()
{
new BeatAction.Action(beat - 1, delegate { instance.BossAnim.DoScaledAnimationAsync("BossSignal", 0.5f); }),
});
MultiSound.Play(new MultiSound.Sound[] {
new MultiSound.Sound(sfxName+"startSignal", beat - 1f),
}, forcePlay: true);
}
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 void MeatCall(float beat)
{
BossAnim.DoScaledAnimationAsync("BossCall", 0.5f);
Jukebox.PlayOneShotGame(sfxName+"signal");
if (!intervalStarted)
{
StartInterval(beat, beatInterval);
}
queuedInputs.Add(new QueuedMeatInput()
{
beatAwayFromStart = beat - intervalStartBeat,
});
}
public void PassTurn(float beat)
{
intervalStarted = false;
foreach (var input in queuedInputs)
{
BeatAction.New(instance.gameObject, new List<BeatAction.Action>()
{
new BeatAction.Action(input.beatAwayFromStart + beat, delegate {
MeatToss Meat = Instantiate(MeatBase).GetComponent<MeatToss>();
Meat.startBeat = beat;
Meat.cueLength = beatInterval + input.beatAwayFromStart;
Meat.cueBased = false;
Meat.meatType = "LightMeat";
}),
});
}
queuedInputs.Clear();
}
}
}