Miscellaneous Tweaks + New Scroll Script (#350)

* 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>
This commit is contained in:
AstrlJelly 2023-03-18 00:40:20 -04:00 committed by GitHub
parent a9b2d254a7
commit 3a84c7c9bd
8 changed files with 128 additions and 47 deletions

View file

@ -509,7 +509,7 @@ SpriteRenderer:
m_LightmapParameters: {fileID: 0} m_LightmapParameters: {fileID: 0}
m_SortingLayerID: 0 m_SortingLayerID: 0
m_SortingLayer: 0 m_SortingLayer: 0
m_SortingOrder: 180 m_SortingOrder: -12
m_Sprite: {fileID: -1966485124414453226, guid: 1c59b9cd0adef0941bc4bd4bde66a759, type: 3} m_Sprite: {fileID: -1966485124414453226, guid: 1c59b9cd0adef0941bc4bd4bde66a759, type: 3}
m_Color: {r: 1, g: 1, b: 1, a: 1} m_Color: {r: 1, g: 1, b: 1, a: 1}
m_FlipX: 0 m_FlipX: 0
@ -1312,7 +1312,7 @@ Transform:
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2488711815545919274} m_GameObject: {fileID: 2488711815545919274}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 13.030002, y: -0.67999995, z: 0} m_LocalPosition: {x: 13.030002, y: -0.94, z: 0}
m_LocalScale: {x: 1, y: 1, z: 0} m_LocalScale: {x: 1, y: 1, z: 0}
m_Children: m_Children:
- {fileID: 2559293408959807264} - {fileID: 2559293408959807264}
@ -1960,7 +1960,7 @@ Transform:
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3645160475886178620} m_GameObject: {fileID: 3645160475886178620}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 11.33, y: -1.42, z: 0} m_LocalPosition: {x: 11.33, y: -1.6800001, z: 0}
m_LocalScale: {x: 1, y: 1, z: 0} m_LocalScale: {x: 1, y: 1, z: 0}
m_Children: m_Children:
- {fileID: 5591757540497211147} - {fileID: 5591757540497211147}
@ -2673,7 +2673,7 @@ Transform:
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5441481875736147362} m_GameObject: {fileID: 5441481875736147362}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 2.04, y: -0.67999995, z: 0} m_LocalPosition: {x: 2.04, y: -0.94, z: 0}
m_LocalScale: {x: 1, y: 1, z: 0} m_LocalScale: {x: 1, y: 1, z: 0}
m_Children: m_Children:
- {fileID: 2024227379699074830} - {fileID: 2024227379699074830}
@ -3364,7 +3364,7 @@ Transform:
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7029759971272808179} m_GameObject: {fileID: 7029759971272808179}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0.33999994, y: -1.42, z: 0} m_LocalPosition: {x: 0.33999994, y: -1.6800001, z: 0}
m_LocalScale: {x: 1, y: 1, z: 0} m_LocalScale: {x: 1, y: 1, z: 0}
m_Children: m_Children:
- {fileID: 3764752037029567640} - {fileID: 3764752037029567640}

View file

@ -0,0 +1,66 @@
using UnityEngine;
namespace HeavenStudio.Common
{
public class SuperScroll : MonoBehaviour
{
#region Private
[SerializeField]
private Renderer _renderer;
[SerializeField]
private Sprite _sprite;
#endregion
#region Public
public float NormalizedX = 0.0f;
public float NormalizedY = 0.0f;
public Vector2 Normalized { get { return new Vector2(NormalizedX, NormalizedY); } set { NormalizedX = value.x; NormalizedY = value.y; } }
public float TileX = 1.0f;
public float TileY = 1.0f;
public Vector2 Tile { get { return new Vector2(TileX, TileY); } set { TileX = value.x; TileY = value.y; } }
public Material Material => _renderer.material;
#endregion
#region MonoBehaviour
private void Start()
{
_renderer.material = new Material(Shader.Find("Unlit/Transparent"));
var spriteRect = _sprite.rect;
var tex = CropTexture(_sprite.texture, new Rect(spriteRect.x, spriteRect.y, spriteRect.width, spriteRect .height));
tex.wrapMode = TextureWrapMode.Repeat;
Material.mainTexture = tex;
}
public void LateUpdate()
{
_renderer.material.mainTextureScale = Tile;
_renderer.material.mainTextureOffset = new Vector2(NormalizedX, -NormalizedY) * Tile;
}
#endregion
#region Custom
private Texture2D CropTexture(Texture2D original, Rect rect)
{
var colors = original.GetPixels((int)rect.x, (int)rect.y, (int)rect.width, (int)rect.height);
var newTex = new Texture2D((int)rect.width - (int)rect.x, (int)rect.height - (int)rect.y);
newTex.SetPixels(colors);
newTex.Apply();
return newTex;
}
#endregion
}
}

View file

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

View file

@ -12,7 +12,7 @@ namespace HeavenStudio.Games.Loaders
// minigame menu items // minigame menu items
public static Minigame AddGame(EventCaller eventCaller) public static Minigame AddGame(EventCaller eventCaller)
{ {
return new Minigame("catchyTune", "Catchy Tune", "00b3ff", false, false, new List<GameAction>() return new Minigame("catchyTune", "Catchy Tune", "f2f2f2", false, false, new List<GameAction>()
{ {
new GameAction("orange", "Orange") new GameAction("orange", "Orange")
{ {

View file

@ -78,7 +78,7 @@ namespace HeavenStudio.Games.Loaders
}, },
new GameAction("ThrowObjectBoth", "Throw Object Both") new GameAction("ThrowObjectBoth", "Throw Object Both")
{ {
function = delegate { var e = eventCaller.currentEntity; DogNinja.instance.ThrowBothObject(e.beat, e["typeL"], e["typeR"]); }, function = delegate { var e = eventCaller.currentEntity; DogNinja.instance.ThrowObject(e.beat, 2, e["typeL"], e["typeR"]); },
defaultLength = 2, defaultLength = 2,
hidden = true, hidden = true,
parameters = new List<Param>() parameters = new List<Param>()
@ -186,7 +186,7 @@ namespace HeavenStudio.Games
DogAnim.SetBool("needPrepare", true); DogAnim.SetBool("needPrepare", true);
} }
if (PlayerInput.Pressed() && !IsExpectingInputNow(InputType.STANDARD_DOWN)) if (PlayerInput.Pressed(true) && !IsExpectingInputNow(InputType.STANDARD_DOWN))
{ {
System.Random rd = new System.Random(); System.Random rd = new System.Random();
string slice; string slice;
@ -224,7 +224,7 @@ namespace HeavenStudio.Games
|| ((typeL == 0 || typeR == 0) && direction == 2)) { || ((typeL == 0 || typeR == 0) && direction == 2)) {
// random object code. it makes a random number from 1-6 and sets that as the sprite // random object code. it makes a random number from 1-6 and sets that as the sprite
System.Random rd = new System.Random(); System.Random rd = new System.Random();
ObjSprite = rd.Next(1, 6); ObjSprite = rd.Next(1, 7);
WhichObject.sprite = ObjectTypes[ObjSprite]; WhichObject.sprite = ObjectTypes[ObjSprite];
typeL = ObjSprite; typeL = ObjSprite;
typeR = ObjSprite; typeR = ObjSprite;
@ -257,8 +257,8 @@ namespace HeavenStudio.Games
// only here for backwards compatibility // only here for backwards compatibility
public void ThrowBothObject(float beat, int ObjType1, int ObjType2) public void ThrowBothObject(float beat, int ObjType1, int ObjType2)
{ {
ThrowObject(beat, 0, ObjType1, 0); ThrowObject(beat, 2, ObjType1, ObjType2);
ThrowObject(beat, 1, 0, ObjType2); //ThrowObject(beat, 1, 0, ObjType2);
} }
public void CutEverything(float beat, bool sound, string customText) public void CutEverything(float beat, bool sound, string customText)

View file

@ -41,8 +41,8 @@ namespace HeavenStudio.Games.Scripts_DogNinja
private void Update() private void Update()
{ {
float flyPosHalves = (Conductor.instance.GetPositionFromBeat(songPos, 3f)*(Conductor.instance.GetPositionFromBeat(songPos, 3f)))+Conductor.instance.GetPositionFromBeat(songPos, 1f); float flyPosHalves = (Conductor.instance.GetPositionFromBeat(songPos, 3f)*(Conductor.instance.GetPositionFromBeat(songPos, 2f)))+Conductor.instance.GetPositionFromBeat(songPos, 1f);
flyPosHalves = (flyPosHalves*0.2f)+0.34f; flyPosHalves = (flyPosHalves*0.2f)+0.35f;
transform.position = curve.GetPoint(flyPosHalves)+objPos; transform.position = curve.GetPoint(flyPosHalves)+objPos;
float rot = rotSpeed; float rot = rotSpeed;

View file

@ -52,7 +52,7 @@ namespace HeavenStudio.Games.Scripts_DogNinja
if (direction == 2 && fromLeft) {} else { Jukebox.PlayOneShotGame(sfxNum+"1"); } if (direction == 2 && fromLeft) {} else { Jukebox.PlayOneShotGame(sfxNum+"1"); }
game.ScheduleInput(startBeat, 1f, InputType.STANDARD_DOWN, Hit, Miss, Out); game.ScheduleInput(startBeat, 1f, InputType.STANDARD_DOWN | InputType.DIRECTION_DOWN, Hit, Miss, Out);
DogAnim.SetBool("needPrepare", true); DogAnim.SetBool("needPrepare", true);
} }

View file

@ -30,6 +30,11 @@ namespace HeavenStudio.Games.Loaders
}, },
defaultLength = 0.5f, defaultLength = 0.5f,
priority = 2, priority = 2,
preFunctionLength = 1f,
preFunction = delegate {
var e = eventCaller.currentEntity;
MeatGrinder.PreMeatCall(e.beat);
},
}, },
new GameAction("StartInterval", "Start Interval") new GameAction("StartInterval", "Start Interval")
{ {
@ -40,6 +45,7 @@ namespace HeavenStudio.Games.Loaders
defaultLength = 4f, defaultLength = 4f,
resizable = true, resizable = true,
priority = 1, priority = 1,
preFunctionLength = 2f,
preFunction = delegate { preFunction = delegate {
var e = eventCaller.currentEntity; var e = eventCaller.currentEntity;
MeatGrinder.PreInterval(e.beat, e.length); MeatGrinder.PreInterval(e.beat, e.length);
@ -69,11 +75,7 @@ namespace HeavenStudio.Games
using Scripts_MeatGrinder; using Scripts_MeatGrinder;
public class MeatGrinder : Minigame public class MeatGrinder : Minigame
{ {
static List<QueuedMeatInput> queuedInputs = new List<QueuedMeatInput>(); static List<float> queuedInputs = new List<float>();
struct QueuedMeatInput
{
public float beatAwayFromStart;
}
[Header("Objects")] [Header("Objects")]
public GameObject MeatBase; public GameObject MeatBase;
@ -87,6 +89,7 @@ namespace HeavenStudio.Games
float intervalStartBeat; float intervalStartBeat;
float beatInterval = 4f; float beatInterval = 4f;
bool bossBop = true; bool bossBop = true;
bool dontCall = false;
public bool bossAnnoyed = false; public bool bossAnnoyed = false;
private float lastReportedBeat = 0f; private float lastReportedBeat = 0f;
const string sfxName = "meatGrinder/"; const string sfxName = "meatGrinder/";
@ -106,24 +109,22 @@ namespace HeavenStudio.Games
void OnDestroy() void OnDestroy()
{ {
if (!Conductor.instance.isPlaying || Conductor.instance.isPaused) if (!Conductor.instance.isPlaying || Conductor.instance.isPaused) {
{
if (queuedInputs.Count > 0) queuedInputs.Clear(); if (queuedInputs.Count > 0) queuedInputs.Clear();
} }
} }
private void Update() private void Update()
{ {
if (!Conductor.instance.isPlaying || Conductor.instance.isPaused) if (!Conductor.instance.isPlaying || Conductor.instance.isPaused) {
{
if (queuedInputs.Count > 0) queuedInputs.Clear(); if (queuedInputs.Count > 0) queuedInputs.Clear();
} }
if (!Conductor.instance.isPlaying && !Conductor.instance.isPaused && intervalStarted)
{ if (!Conductor.instance.isPlaying && !Conductor.instance.isPaused && intervalStarted) {
intervalStarted = false; intervalStarted = false;
} }
if (PlayerInput.Pressed() && !IsExpectingInputNow(InputType.STANDARD_DOWN))
{ if (PlayerInput.Pressed() && !IsExpectingInputNow(InputType.STANDARD_DOWN)) {
ScoreMiss(); ScoreMiss();
TackAnim.DoScaledAnimationAsync("TackEmptyHit", 0.5f); TackAnim.DoScaledAnimationAsync("TackEmptyHit", 0.5f);
TackAnim.SetBool("tackMeated", false); TackAnim.SetBool("tackMeated", false);
@ -168,25 +169,21 @@ namespace HeavenStudio.Games
public static void PreInterval(float beat, float interval) 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; 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) public void StartInterval(float beat, float interval)
{ {
intervalStartBeat = beat; intervalStartBeat = beat;
if (!intervalStarted) if (!intervalStarted) { intervalStarted = true; }
{
intervalStarted = true;
}
BeatAction.New(gameObject, new List<BeatAction.Action>() BeatAction.New(gameObject, new List<BeatAction.Action>()
{ {
@ -205,6 +202,15 @@ namespace HeavenStudio.Games
Meat.meatType = "DarkMeat"; 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) public void MeatCall(float beat)
{ {
BossAnim.DoScaledAnimationAsync("BossCall", 0.5f); BossAnim.DoScaledAnimationAsync("BossCall", 0.5f);
@ -215,23 +221,21 @@ namespace HeavenStudio.Games
StartInterval(beat, beatInterval); StartInterval(beat, beatInterval);
} }
queuedInputs.Add(new QueuedMeatInput() queuedInputs.Add(beat - intervalStartBeat);
{
beatAwayFromStart = beat - intervalStartBeat,
});
} }
public void PassTurn(float beat) public void PassTurn(float beat)
{ {
dontCall = false;
intervalStarted = false; intervalStarted = false;
foreach (var input in queuedInputs) foreach (var input in queuedInputs)
{ {
BeatAction.New(instance.gameObject, new List<BeatAction.Action>() BeatAction.New(instance.gameObject, new List<BeatAction.Action>()
{ {
new BeatAction.Action(input.beatAwayFromStart + beat, delegate { new BeatAction.Action(input + beat, delegate {
MeatToss Meat = Instantiate(MeatBase).GetComponent<MeatToss>(); MeatToss Meat = Instantiate(MeatBase).GetComponent<MeatToss>();
Meat.startBeat = beat; Meat.startBeat = beat;
Meat.cueLength = beatInterval + input.beatAwayFromStart; Meat.cueLength = beatInterval + input;
Meat.cueBased = false; Meat.cueBased = false;
Meat.meatType = "LightMeat"; Meat.meatType = "LightMeat";
}), }),