Proper namespaces

This commit is contained in:
Starpelly 2021-12-20 20:10:49 -05:00
parent 9266cf2a8a
commit 5d85d9d363
45 changed files with 1364 additions and 1264 deletions

View file

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 96ed2f99a777c924f882e2f3c41b1881
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -1,13 +1,13 @@
%YAML 1.1 %YAML 1.1
%TAG !u! tag:unity3d.com,2011: %TAG !u! tag:unity3d.com,2011:
--- !u!21 &-1154359511425921776 --- !u!21 &-1662932664650235619
Material: Material:
serializedVersion: 6 serializedVersion: 6
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0} m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0} m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
m_Name: rodin_merged Material m_Name: rodin_lat_cy_ja_ko_spec Material
m_Shader: {fileID: 4800000, guid: 128e987d567d4e2c824d754223b3f3b0, type: 3} m_Shader: {fileID: 4800000, guid: 128e987d567d4e2c824d754223b3f3b0, type: 3}
m_ShaderKeywords: m_ShaderKeywords:
m_LightmapFlags: 4 m_LightmapFlags: 4
@ -24,7 +24,7 @@ Material:
m_Scale: {x: 1, y: 1} m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0} m_Offset: {x: 0, y: 0}
- _MainTex: - _MainTex:
m_Texture: {fileID: 1363669669053061815} m_Texture: {fileID: 8801383763965547972}
m_Scale: {x: 1, y: 1} m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0} m_Offset: {x: 0, y: 0}
m_Floats: m_Floats:
@ -53,14 +53,14 @@ MonoBehaviour:
m_Enabled: 1 m_Enabled: 1
m_EditorHideFlags: 0 m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 71c1514a6bd24e1e882cebbe1904ce04, type: 3} m_Script: {fileID: 11500000, guid: 71c1514a6bd24e1e882cebbe1904ce04, type: 3}
m_Name: rodin_merged m_Name: rodin_lat_cy_ja_ko_spec
m_EditorClassIdentifier: m_EditorClassIdentifier:
hashCode: 0 hashCode: 0
material: {fileID: -1154359511425921776} material: {fileID: -1662932664650235619}
materialHashCode: 0 materialHashCode: 0
m_Version: 1.1.0 m_Version: 1.1.0
m_SourceFontFileGUID: d245bd2e354835547b32cf6c1a738d45 m_SourceFontFileGUID: 6459e01c422d8fb469d08b74a81e6b81
m_SourceFontFile_EditorRef: {fileID: 12800000, guid: d245bd2e354835547b32cf6c1a738d45, type: 3} m_SourceFontFile_EditorRef: {fileID: 12800000, guid: 6459e01c422d8fb469d08b74a81e6b81, type: 3}
m_SourceFontFile: {fileID: 0} m_SourceFontFile: {fileID: 0}
m_AtlasPopulationMode: 0 m_AtlasPopulationMode: 0
m_FaceInfo: m_FaceInfo:
@ -79,7 +79,7 @@ MonoBehaviour:
m_SuperscriptSize: 0.5 m_SuperscriptSize: 0.5
m_SubscriptOffset: -39.989998 m_SubscriptOffset: -39.989998
m_SubscriptSize: 0.5 m_SubscriptSize: 0.5
m_UnderlineOffset: -85.374 m_UnderlineOffset: -104.346
m_UnderlineThickness: 18.972 m_UnderlineThickness: 18.972
m_StrikethroughOffset: 41.2 m_StrikethroughOffset: 41.2
m_StrikethroughThickness: 18.972 m_StrikethroughThickness: 18.972
@ -2717,7 +2717,7 @@ MonoBehaviour:
m_Height: 185 m_Height: 185
m_Scale: 1 m_Scale: 1
m_AtlasIndex: 0 m_AtlasIndex: 0
- m_Index: 466 - m_Index: 596
m_Metrics: m_Metrics:
m_Width: 93 m_Width: 93
m_Height: 14 m_Height: 14
@ -2731,7 +2731,7 @@ MonoBehaviour:
m_Height: 14 m_Height: 14
m_Scale: 1 m_Scale: 1
m_AtlasIndex: 0 m_AtlasIndex: 0
- m_Index: 467 - m_Index: 597
m_Metrics: m_Metrics:
m_Width: 186 m_Width: 186
m_Height: 13 m_Height: 13
@ -2745,7 +2745,7 @@ MonoBehaviour:
m_Height: 13 m_Height: 13
m_Scale: 1 m_Scale: 1
m_AtlasIndex: 0 m_AtlasIndex: 0
- m_Index: 470 - m_Index: 600
m_Metrics: m_Metrics:
m_Width: 25 m_Width: 25
m_Height: 54 m_Height: 54
@ -2759,7 +2759,7 @@ MonoBehaviour:
m_Height: 54 m_Height: 54
m_Scale: 1 m_Scale: 1
m_AtlasIndex: 0 m_AtlasIndex: 0
- m_Index: 471 - m_Index: 601
m_Metrics: m_Metrics:
m_Width: 25 m_Width: 25
m_Height: 55 m_Height: 55
@ -2773,7 +2773,7 @@ MonoBehaviour:
m_Height: 55 m_Height: 55
m_Scale: 1 m_Scale: 1
m_AtlasIndex: 0 m_AtlasIndex: 0
- m_Index: 472 - m_Index: 602
m_Metrics: m_Metrics:
m_Width: 25 m_Width: 25
m_Height: 55 m_Height: 55
@ -2787,7 +2787,7 @@ MonoBehaviour:
m_Height: 55 m_Height: 55
m_Scale: 1 m_Scale: 1
m_AtlasIndex: 0 m_AtlasIndex: 0
- m_Index: 474 - m_Index: 604
m_Metrics: m_Metrics:
m_Width: 59 m_Width: 59
m_Height: 54 m_Height: 54
@ -2801,7 +2801,7 @@ MonoBehaviour:
m_Height: 54 m_Height: 54
m_Scale: 1 m_Scale: 1
m_AtlasIndex: 0 m_AtlasIndex: 0
- m_Index: 475 - m_Index: 605
m_Metrics: m_Metrics:
m_Width: 58 m_Width: 58
m_Height: 55 m_Height: 55
@ -2815,7 +2815,7 @@ MonoBehaviour:
m_Height: 55 m_Height: 55
m_Scale: 1 m_Scale: 1
m_AtlasIndex: 0 m_AtlasIndex: 0
- m_Index: 476 - m_Index: 606
m_Metrics: m_Metrics:
m_Width: 58 m_Width: 58
m_Height: 55 m_Height: 55
@ -2829,7 +2829,7 @@ MonoBehaviour:
m_Height: 55 m_Height: 55
m_Scale: 1 m_Scale: 1
m_AtlasIndex: 0 m_AtlasIndex: 0
- m_Index: 477 - m_Index: 607
m_Metrics: m_Metrics:
m_Width: 90 m_Width: 90
m_Height: 168 m_Height: 168
@ -2843,7 +2843,7 @@ MonoBehaviour:
m_Height: 168 m_Height: 168
m_Scale: 1 m_Scale: 1
m_AtlasIndex: 0 m_AtlasIndex: 0
- m_Index: 478 - m_Index: 608
m_Metrics: m_Metrics:
m_Width: 90 m_Width: 90
m_Height: 168 m_Height: 168
@ -2857,7 +2857,7 @@ MonoBehaviour:
m_Height: 168 m_Height: 168
m_Scale: 1 m_Scale: 1
m_AtlasIndex: 0 m_AtlasIndex: 0
- m_Index: 479 - m_Index: 609
m_Metrics: m_Metrics:
m_Width: 43 m_Width: 43
m_Height: 42 m_Height: 42
@ -2871,7 +2871,7 @@ MonoBehaviour:
m_Height: 42 m_Height: 42
m_Scale: 1 m_Scale: 1
m_AtlasIndex: 0 m_AtlasIndex: 0
- m_Index: 481 - m_Index: 611
m_Metrics: m_Metrics:
m_Width: 152 m_Width: 152
m_Height: 28 m_Height: 28
@ -2885,7 +2885,7 @@ MonoBehaviour:
m_Height: 28 m_Height: 28
m_Scale: 1 m_Scale: 1
m_AtlasIndex: 0 m_AtlasIndex: 0
- m_Index: 482 - m_Index: 612
m_Metrics: m_Metrics:
m_Width: 169 m_Width: 169
m_Height: 153 m_Height: 153
@ -2899,7 +2899,7 @@ MonoBehaviour:
m_Height: 153 m_Height: 153
m_Scale: 1 m_Scale: 1
m_AtlasIndex: 0 m_AtlasIndex: 0
- m_Index: 485 - m_Index: 615
m_Metrics: m_Metrics:
m_Width: 69 m_Width: 69
m_Height: 105 m_Height: 105
@ -2913,7 +2913,7 @@ MonoBehaviour:
m_Height: 105 m_Height: 105
m_Scale: 1 m_Scale: 1
m_AtlasIndex: 0 m_AtlasIndex: 0
- m_Index: 486 - m_Index: 616
m_Metrics: m_Metrics:
m_Width: 69 m_Width: 69
m_Height: 105 m_Height: 105
@ -2927,7 +2927,7 @@ MonoBehaviour:
m_Height: 105 m_Height: 105
m_Scale: 1 m_Scale: 1
m_AtlasIndex: 0 m_AtlasIndex: 0
- m_Index: 489 - m_Index: 619
m_Metrics: m_Metrics:
m_Width: 100 m_Width: 100
m_Height: 155 m_Height: 155
@ -2941,7 +2941,7 @@ MonoBehaviour:
m_Height: 155 m_Height: 155
m_Scale: 1 m_Scale: 1
m_AtlasIndex: 0 m_AtlasIndex: 0
- m_Index: 490 - m_Index: 620
m_Metrics: m_Metrics:
m_Width: 124 m_Width: 124
m_Height: 153 m_Height: 153
@ -2955,7 +2955,7 @@ MonoBehaviour:
m_Height: 153 m_Height: 153
m_Scale: 1 m_Scale: 1
m_AtlasIndex: 0 m_AtlasIndex: 0
- m_Index: 498 - m_Index: 628
m_Metrics: m_Metrics:
m_Width: 135 m_Width: 135
m_Height: 78 m_Height: 78
@ -3724,78 +3724,78 @@ MonoBehaviour:
m_Scale: 1 m_Scale: 1
- m_ElementType: 1 - m_ElementType: 1
m_Unicode: 8211 m_Unicode: 8211
m_GlyphIndex: 466 m_GlyphIndex: 596
m_Scale: 1 m_Scale: 1
- m_ElementType: 1 - m_ElementType: 1
m_Unicode: 8212 m_Unicode: 8212
m_GlyphIndex: 467 m_GlyphIndex: 597
m_Scale: 1 m_Scale: 1
- m_ElementType: 1 - m_ElementType: 1
m_Unicode: 8216 m_Unicode: 8216
m_GlyphIndex: 470 m_GlyphIndex: 600
m_Scale: 1 m_Scale: 1
- m_ElementType: 1 - m_ElementType: 1
m_Unicode: 8217 m_Unicode: 8217
m_GlyphIndex: 471 m_GlyphIndex: 601
m_Scale: 1 m_Scale: 1
- m_ElementType: 1 - m_ElementType: 1
m_Unicode: 8218 m_Unicode: 8218
m_GlyphIndex: 472 m_GlyphIndex: 602
m_Scale: 1 m_Scale: 1
- m_ElementType: 1 - m_ElementType: 1
m_Unicode: 8220 m_Unicode: 8220
m_GlyphIndex: 474 m_GlyphIndex: 604
m_Scale: 1 m_Scale: 1
- m_ElementType: 1 - m_ElementType: 1
m_Unicode: 8221 m_Unicode: 8221
m_GlyphIndex: 475 m_GlyphIndex: 605
m_Scale: 1 m_Scale: 1
- m_ElementType: 1 - m_ElementType: 1
m_Unicode: 8222 m_Unicode: 8222
m_GlyphIndex: 476 m_GlyphIndex: 606
m_Scale: 1 m_Scale: 1
- m_ElementType: 1 - m_ElementType: 1
m_Unicode: 8224 m_Unicode: 8224
m_GlyphIndex: 477 m_GlyphIndex: 607
m_Scale: 1 m_Scale: 1
- m_ElementType: 1 - m_ElementType: 1
m_Unicode: 8225 m_Unicode: 8225
m_GlyphIndex: 478 m_GlyphIndex: 608
m_Scale: 1 m_Scale: 1
- m_ElementType: 1 - m_ElementType: 1
m_Unicode: 8226 m_Unicode: 8226
m_GlyphIndex: 479 m_GlyphIndex: 609
m_Scale: 1 m_Scale: 1
- m_ElementType: 1 - m_ElementType: 1
m_Unicode: 8230 m_Unicode: 8230
m_GlyphIndex: 481 m_GlyphIndex: 611
m_Scale: 1 m_Scale: 1
- m_ElementType: 1 - m_ElementType: 1
m_Unicode: 8240 m_Unicode: 8240
m_GlyphIndex: 482 m_GlyphIndex: 612
m_Scale: 1 m_Scale: 1
- m_ElementType: 1 - m_ElementType: 1
m_Unicode: 8249 m_Unicode: 8249
m_GlyphIndex: 485 m_GlyphIndex: 615
m_Scale: 1 m_Scale: 1
- m_ElementType: 1 - m_ElementType: 1
m_Unicode: 8250 m_Unicode: 8250
m_GlyphIndex: 486 m_GlyphIndex: 616
m_Scale: 1 m_Scale: 1
- m_ElementType: 1 - m_ElementType: 1
m_Unicode: 8260 m_Unicode: 8260
m_GlyphIndex: 489 m_GlyphIndex: 619
m_Scale: 1 m_Scale: 1
- m_ElementType: 1 - m_ElementType: 1
m_Unicode: 8364 m_Unicode: 8364
m_GlyphIndex: 490 m_GlyphIndex: 620
m_Scale: 1 m_Scale: 1
- m_ElementType: 1 - m_ElementType: 1
m_Unicode: 8482 m_Unicode: 8482
m_GlyphIndex: 498 m_GlyphIndex: 628
m_Scale: 1 m_Scale: 1
m_AtlasTextures: m_AtlasTextures:
- {fileID: 1363669669053061815} - {fileID: 8801383763965547972}
m_AtlasTextureIndex: 0 m_AtlasTextureIndex: 0
m_IsMultiAtlasTexturesEnabled: 0 m_IsMultiAtlasTexturesEnabled: 0
m_ClearDynamicDataOnBuild: 0 m_ClearDynamicDataOnBuild: 0
@ -5341,7 +5341,7 @@ MonoBehaviour:
m_FallbackFontAssetTable: [] m_FallbackFontAssetTable: []
m_CreationSettings: m_CreationSettings:
sourceFontFileName: sourceFontFileName:
sourceFontFileGUID: d245bd2e354835547b32cf6c1a738d45 sourceFontFileGUID: 6459e01c422d8fb469d08b74a81e6b81
pointSizeSamplingMode: 0 pointSizeSamplingMode: 0
pointSize: 186 pointSize: 186
padding: 12 padding: 12
@ -5384,13 +5384,13 @@ MonoBehaviour:
boldSpacing: 7 boldSpacing: 7
italicStyle: 35 italicStyle: 35
tabSize: 10 tabSize: 10
--- !u!28 &1363669669053061815 --- !u!28 &8801383763965547972
Texture2D: Texture2D:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0} m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0} m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
m_Name: rodin_merged Atlas m_Name: rodin_lat_cy_ja_ko_spec Atlas
m_ImageContentsHash: m_ImageContentsHash:
serializedVersion: 2 serializedVersion: 2
Hash: 00000000000000000000000000000000 Hash: 00000000000000000000000000000000

View file

@ -1,5 +1,5 @@
fileFormatVersion: 2 fileFormatVersion: 2
guid: 391dfd08cb8a3cf4dbae153523abce8b guid: 795a65f16e097f44eb799cb2ec026fc1
NativeFormatImporter: NativeFormatImporter:
externalObjects: {} externalObjects: {}
mainObjectFileID: 11400000 mainObjectFileID: 11400000

View file

@ -1,5 +1,5 @@
fileFormatVersion: 2 fileFormatVersion: 2
guid: d245bd2e354835547b32cf6c1a738d45 guid: 6459e01c422d8fb469d08b74a81e6b81
TrueTypeFontImporter: TrueTypeFontImporter:
externalObjects: {} externalObjects: {}
serializedVersion: 4 serializedVersion: 4
@ -10,7 +10,8 @@ TrueTypeFontImporter:
includeFontData: 1 includeFontData: 1
fontNames: fontNames:
- nintendo_NTLG-DB_001 - nintendo_NTLG-DB_001
fallbackFontReferences: [] fallbackFontReferences:
- {fileID: 12800000, guid: d245bd2e354835547b32cf6c1a738d45, type: 3}
customCharacters: customCharacters:
fontRenderingMode: 0 fontRenderingMode: 0
ascentCalculationMode: 1 ascentCalculationMode: 1

View file

@ -1,11 +0,0 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CommonAnimEvents : MonoBehaviour
{
public void Destroy()
{
Destroy(this.gameObject);
}
}

View file

@ -4,164 +4,167 @@ using UnityEngine;
using Starpelly; using Starpelly;
[RequireComponent(typeof(AudioSource))] namespace RhythmHeavenMania
public class Conductor : MonoBehaviour
{ {
//Song beats per minute [RequireComponent(typeof(AudioSource))]
//This is determined by the song you're trying to sync up to public class Conductor : MonoBehaviour
public float songBpm;
//The number of seconds for each song beat
public float secPerBeat;
//Current song position, in seconds
public float songPosition;
//Current song position, in beats
public float songPositionInBeats;
//How many seconds have passed since the song started
public float dspSongTime;
//an AudioSource attached to this GameObject that will play the music.
public AudioSource musicSource;
//The offset to the first beat of the song in seconds
public float firstBeatOffset;
//the number of beats in each loop
public float beatsPerLoop;
//the total number of loops completed since the looping clip first started
public int completedLoops = 0;
//The current position of the song within the loop in beats.
public float loopPositionInBeats;
//The current relative position of the song within the loop measured between 0 and 1.
public float loopPositionInAnalog;
//Conductor instance
public static Conductor instance;
//Pause times
private int pauseTime = 0;
public float beatThreshold;
void Awake()
{ {
instance = this; //Song beats per minute
} //This is determined by the song you're trying to sync up to
public float songBpm;
void Start() //The number of seconds for each song beat
{ public float secPerBeat;
//Load the AudioSource attached to the Conductor GameObject
musicSource = GetComponent<AudioSource>();
//Calculate the number of seconds in each beat //Current song position, in seconds
secPerBeat = 60f / songBpm; public float songPosition;
//Record the time when the music starts //Current song position, in beats
dspSongTime = (float)musicSource.time; public float songPositionInBeats;
//Start the music //How many seconds have passed since the song started
// musicSource.Play(); public float dspSongTime;
}
void Update() //an AudioSource attached to this GameObject that will play the music.
{ public AudioSource musicSource;
Conductor.instance.musicSource.pitch = Time.timeScale;
/*if (Input.GetKeyDown(KeyCode.Space)) //The offset to the first beat of the song in seconds
public float firstBeatOffset;
//the number of beats in each loop
public float beatsPerLoop;
//the total number of loops completed since the looping clip first started
public int completedLoops = 0;
//The current position of the song within the loop in beats.
public float loopPositionInBeats;
//The current relative position of the song within the loop measured between 0 and 1.
public float loopPositionInAnalog;
//Conductor instance
public static Conductor instance;
//Pause times
private int pauseTime = 0;
public float beatThreshold;
void Awake()
{ {
pauseTime++; instance = this;
if (pauseTime == 1) }
musicSource.Pause();
else if (pauseTime > 1) { musicSource.UnPause(); pauseTime = 0; }
}*/
//determine how many seconds since the song started void Start()
songPosition = (float)(musicSource.time - dspSongTime - firstBeatOffset);
//determine how many beats since the song started
songPositionInBeats = songPosition / secPerBeat;
//calculate the loop position
if (songPositionInBeats >= (completedLoops + 1) * beatsPerLoop)
completedLoops++;
loopPositionInBeats = songPositionInBeats - completedLoops * beatsPerLoop;
loopPositionInAnalog = loopPositionInBeats / beatsPerLoop;
}
public float GetLoopPositionFromBeat(float startBeat, float length)
{
float final = Starpelly.Mathp.Normalize(songPositionInBeats, startBeat, startBeat + length);
return final;
}
public bool InThreshold(float beat)
{
//Check if the beat sent falls within beatThreshold
//Written to handle the looping
if (beat <= beatThreshold + 1)
{ {
//Debug.Log("Case 1, beat is close to 1"); //Load the AudioSource attached to the Conductor GameObject
if (loopPositionInBeats > beat + beatThreshold) musicSource = GetComponent<AudioSource>();
//Calculate the number of seconds in each beat
secPerBeat = 60f / songBpm;
//Record the time when the music starts
dspSongTime = (float)musicSource.time;
//Start the music
// musicSource.Play();
}
void Update()
{
Conductor.instance.musicSource.pitch = Time.timeScale;
/*if (Input.GetKeyDown(KeyCode.Space))
{ {
if (loopPositionInBeats >= (beat + songPositionInBeats - 1) + beatThreshold) pauseTime++;
if (pauseTime == 1)
musicSource.Pause();
else if (pauseTime > 1) { musicSource.UnPause(); pauseTime = 0; }
}*/
//determine how many seconds since the song started
songPosition = (float)(musicSource.time - dspSongTime - firstBeatOffset);
//determine how many beats since the song started
songPositionInBeats = songPosition / secPerBeat;
//calculate the loop position
if (songPositionInBeats >= (completedLoops + 1) * beatsPerLoop)
completedLoops++;
loopPositionInBeats = songPositionInBeats - completedLoops * beatsPerLoop;
loopPositionInAnalog = loopPositionInBeats / beatsPerLoop;
}
public float GetLoopPositionFromBeat(float startBeat, float length)
{
float final = Starpelly.Mathp.Normalize(songPositionInBeats, startBeat, startBeat + length);
return final;
}
public bool InThreshold(float beat)
{
//Check if the beat sent falls within beatThreshold
//Written to handle the looping
if (beat <= beatThreshold + 1)
{
//Debug.Log("Case 1, beat is close to 1");
if (loopPositionInBeats > beat + beatThreshold)
{ {
//Debug.Log("LoopPos just below loop point"); if (loopPositionInBeats >= (beat + songPositionInBeats - 1) + beatThreshold)
return true; {
//Debug.Log("LoopPos just below loop point");
return true;
}
else
{
//Debug.Log("LoopPos not within beat threshold");
}
} }
else else
{ {
//Debug.Log("LoopPos not within beat threshold"); //Debug.Log("Case 1, loopPos between loop point and beat threshold");
} }
} }
else else if (beat < (songPositionInBeats + 1 - beatThreshold))
{ {
//Debug.Log("Case 1, loopPos between loop point and beat threshold"); //Debug.Log("Case 2, beat is far from loop point.");
} if (loopPositionInBeats >= beat - beatThreshold && loopPositionInBeats <= beat + beatThreshold)
}
else if (beat < (songPositionInBeats + 1 - beatThreshold))
{
//Debug.Log("Case 2, beat is far from loop point.");
if (loopPositionInBeats >= beat - beatThreshold && loopPositionInBeats <= beat + beatThreshold)
{
//Debug.Log("LoopPos within threshold");
return true;
}
}
else if (beat >= (songPositionInBeats + 1 - beatThreshold))
{
//Debug.Log("Case 3, beat is close to loop point");
if (loopPositionInBeats < beat)
{
if (loopPositionInBeats >= beat - beatThreshold)
{ {
//Debug.Log("LoopPos just below beat"); //Debug.Log("LoopPos within threshold");
return true;
}
else if (loopPositionInBeats < (beat - songPositionInBeats + 1) - beatThreshold)
{
//Debug.Log("LoopPos just above loop point");
return true; return true;
} }
} }
else else if (beat >= (songPositionInBeats + 1 - beatThreshold))
{ {
//Debug.Log("LoopPos just above beat"); //Debug.Log("Case 3, beat is close to loop point");
return true; if (loopPositionInBeats < beat)
} {
if (loopPositionInBeats >= beat - beatThreshold)
{
//Debug.Log("LoopPos just below beat");
return true;
}
else if (loopPositionInBeats < (beat - songPositionInBeats + 1) - beatThreshold)
{
//Debug.Log("LoopPos just above loop point");
return true;
}
}
else
{
//Debug.Log("LoopPos just above beat");
return true;
}
}
else
{
Debug.LogError("Strange Case. Where is this beat? This should never happen");
}
return false;
} }
else
{
Debug.LogError("Strange Case. Where is this beat? This should never happen");
}
return false;
} }
} }

View file

@ -1,38 +0,0 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ForkLifter : MonoBehaviour
{
public static ForkLifter instance;
GameManager GameManager;
[Header("Objects")]
public Animator handAnim;
public GameObject flickedObject;
public SpriteRenderer peaPreview;
public Sprite[] peaSprites;
public Sprite[] peaHitSprites;
private void Awake()
{
instance = this;
}
private void Start()
{
GameManager = GameManager.instance;
}
public void Flick(float beat, int type)
{
Jukebox.PlayOneShot("flick");
handAnim.Play("Hand_Flick", 0, 0);
GameObject fo = Instantiate(flickedObject);
fo.GetComponent<Pea>().startBeat = beat;
fo.GetComponent<Pea>().type = type;
fo.SetActive(true);
}
}

View file

@ -1,58 +0,0 @@
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
public class ForkLifterHand : MonoBehaviour
{
public SpriteRenderer fastSprite;
public Sprite[] fastSprites;
List<GameManager.Event> allPlayerActions;
public static ForkLifterHand instance { get; set; }
private void Awake()
{
instance = this;
}
public void CheckNextFlick()
{
allPlayerActions = GameManager.instance.Events.FindAll(c => c.eventName != "gulp" && c.eventName != "sigh" && c.eventName != "prepare");
if (GameManager.instance.currentEventPlayer < allPlayerActions.Count)
{
switch (allPlayerActions[GameManager.instance.currentEventPlayer].eventName)
{
case "pea":
ForkLifter.instance.peaPreview.sprite = ForkLifter.instance.peaSprites[0];
fastSprite.sprite = fastSprites[0];
break;
case "topbun":
fastSprite.sprite = fastSprites[0];
ForkLifter.instance.peaPreview.sprite = ForkLifter.instance.peaSprites[1];
break;
case "burger":
fastSprite.sprite = fastSprites[1];
ForkLifter.instance.peaPreview.sprite = ForkLifter.instance.peaSprites[2];
break;
case "bottombun":
fastSprite.sprite = fastSprites[0];
ForkLifter.instance.peaPreview.sprite = ForkLifter.instance.peaSprites[3];
break;
}
}
else
{
ForkLifter.instance.peaPreview.sprite = null;
}
}
public void Prepare()
{
Jukebox.PlayOneShot("flickPrepare");
GetComponent<Animator>().Play("Hand_Prepare");
}
}

View file

@ -1,312 +0,0 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;
public class ForkLifterPlayer : MonoBehaviour
{
[Header("Objects")]
public GameObject fork;
public Sprite peaSprite;
public Sprite hitFX;
public Sprite hitFXG;
public Sprite hitFXMiss;
public Sprite hitFX2;
public Transform early, perfect, late;
[SerializeField]
private BoxCollider2D col;
private Animator anim;
public List<Eligible> EligibleHits = new List<Eligible>();
private int currentHitInList = 0;
public static ForkLifterPlayer instance { get; set; }
public float timescale = 1;
private int currentEarlyPeasOnFork;
private int currentPerfectPeasOnFork;
private int currentLatePeasOnFork;
private bool isEating = false;
// Burger shit
private bool topbun, middleburger, bottombun;
// -----------
[System.Serializable]
public class Eligible
{
public Pea pea;
public bool early;
public bool perfect;
public bool late;
}
private void Awake()
{
instance = this;
}
private void Start()
{
anim = GetComponent<Animator>();
}
private void Update()
{
Time.timeScale = timescale;
if (Input.GetMouseButtonDown(0) || Input.GetKeyDown(KeyCode.Z) || Input.GetKeyDown(KeyCode.Space))
{
Stab();
}
if (EligibleHits.Count == 0)
{
currentHitInList = 0;
}
if (Input.GetKeyDown(KeyCode.A))
{
Conductor.instance.musicSource.time += 3;
}
else if (Input.GetKeyDown(KeyCode.S))
{
Conductor.instance.musicSource.time -= 3;
GameManager.instance.SetCurrentEventToClosest();
}
}
public void Eat()
{
if (currentEarlyPeasOnFork != 0 || currentPerfectPeasOnFork != 0 || currentLatePeasOnFork != 0)
{
anim.Play("Player_Eat", 0, 0);
isEating = true;
}
}
public void EatConfirm()
{
if (topbun && middleburger && bottombun)
{
Jukebox.PlayOneShot("burger");
}
else
{
if (currentEarlyPeasOnFork > 0 || currentLatePeasOnFork > 0)
{
Jukebox.PlayOneShot($"cough_{Random.Range(1, 3)}");
}
else
{
Jukebox.PlayOneShot("gulp");
}
}
for (int i = 0; i < early.transform.childCount; i++)
{
Destroy(early.transform.GetChild(i).gameObject);
}
for (int i = 0; i < perfect.transform.childCount; i++)
{
Destroy(perfect.transform.GetChild(i).gameObject);
}
for (int i = 0; i < late.transform.childCount; i++)
{
Destroy(late.transform.GetChild(i).gameObject);
}
currentEarlyPeasOnFork = 0;
currentPerfectPeasOnFork = 0;
currentLatePeasOnFork = 0;
isEating = false;
topbun = false; middleburger = false; bottombun = false;
}
public void Stab()
{
if (isEating) return;
bool canHit = (EligibleHits.Count > 0) && (currentHitInList < EligibleHits.Count);
if (canHit)
{
GameObject pea = new GameObject();
if (EligibleHits[currentHitInList].perfect)
{
pea.transform.parent = perfect.transform;
pea.transform.localScale = Vector2.one;
pea.transform.localPosition = Vector3.zero;
for (int i = 0; i < perfect.transform.childCount; i++)
{
perfect.transform.GetChild(i).transform.localPosition = new Vector3(0, (-1.67f - (0.15724f * i)) + 0.15724f * currentPerfectPeasOnFork);
}
SpriteRenderer psprite = pea.AddComponent<SpriteRenderer>();
psprite.sprite = ForkLifter.instance.peaHitSprites[EligibleHits[currentHitInList].pea.type];
psprite.sortingOrder = 20;
switch (EligibleHits[currentHitInList].pea.type)
{
case 0:
psprite.sortingOrder = 101;
break;
case 1:
psprite.sortingOrder = 104;
break;
case 2:
psprite.sortingOrder = 103;
break;
case 3:
psprite.sortingOrder = 102;
break;
}
GameObject hitFXo = new GameObject();
hitFXo.transform.localPosition = new Vector3(1.9969f, -3.7026f);
hitFXo.transform.localScale = new Vector3(3.142196f, 3.142196f);
SpriteRenderer hfxs = hitFXo.AddComponent<SpriteRenderer>();
hfxs.sprite = hitFX;
hfxs.sortingOrder = 100;
hfxs.DOColor(new Color(1, 1, 1, 0), 0.05f).OnComplete(delegate { Destroy(hitFXo); });
FastEffectHit(EligibleHits[currentHitInList].pea.type);
Jukebox.PlayOneShot("stab");
currentPerfectPeasOnFork++;
if (EligibleHits[currentHitInList].pea.type == 1)
{
topbun = true;
}
else if (EligibleHits[currentHitInList].pea.type == 2)
{
middleburger = true;
}
else if (EligibleHits[currentHitInList].pea.type == 3)
{
bottombun = true;
}
RemovePea();
GoForAPerfect.instance.Hit();
GameProfiler.instance.IncreaseScore();
}
else if (EligibleHits[currentHitInList].early)
{
pea.transform.parent = early.transform;
pea.transform.localScale = Vector2.one;
pea.transform.localPosition = Vector3.zero;
pea.transform.localRotation = Quaternion.Euler(0, 0, 90);
for (int i = 0; i < early.transform.childCount; i++)
{
early.transform.GetChild(i).transform.localPosition = new Vector3(0, (-1.67f - (0.15724f * i)) + 0.15724f * currentEarlyPeasOnFork);
}
SpriteRenderer psprite = pea.AddComponent<SpriteRenderer>();
psprite.sprite = ForkLifter.instance.peaHitSprites[EligibleHits[currentHitInList].pea.type];
psprite.sortingOrder = 20;
HitFXMiss(new Vector2(1.0424f, -4.032f), new Vector2(1.129612f, 1.129612f));
HitFXMiss(new Vector2(0.771f, -3.016f), new Vector2(1.71701f, 1.71701f));
HitFXMiss(new Vector2(2.598f, -2.956f), new Vector2(1.576043f, 1.576043f));
HitFXMiss(new Vector2(2.551f, -3.609f), new Vector2(1.200788f, 1.200788f));
FastEffectHit(EligibleHits[currentHitInList].pea.type);
Jukebox.PlayOneShot("miss");
currentEarlyPeasOnFork++;
RemovePea();
GoForAPerfect.instance.Miss();
}
else if (EligibleHits[currentHitInList].late)
{
pea.transform.parent = late.transform;
pea.transform.localScale = Vector2.one;
pea.transform.localPosition = Vector3.zero;
pea.transform.localRotation = Quaternion.Euler(0, 0, 90);
for (int i = 0; i < late.transform.childCount; i++)
{
late.transform.GetChild(i).transform.localPosition = new Vector3(0, (-1.67f - (0.15724f * i)) + 0.15724f * currentLatePeasOnFork);
}
SpriteRenderer psprite = pea.AddComponent<SpriteRenderer>();
psprite.sprite = ForkLifter.instance.peaHitSprites[EligibleHits[currentHitInList].pea.type];
psprite.sortingOrder = 20;
HitFXMiss(new Vector2(1.0424f, -4.032f), new Vector2(1.129612f, 1.129612f));
HitFXMiss(new Vector2(0.771f, -3.016f), new Vector2(1.71701f, 1.71701f));
HitFXMiss(new Vector2(2.598f, -2.956f), new Vector2(1.576043f, 1.576043f));
HitFXMiss(new Vector2(2.551f, -3.609f), new Vector2(1.200788f, 1.200788f));
FastEffectHit(EligibleHits[currentHitInList].pea.type);
Jukebox.PlayOneShot("miss");
currentLatePeasOnFork++;
RemovePea();
GoForAPerfect.instance.Miss();
}
}
else
{
Jukebox.PlayOneShot("stabnohit");
}
anim.Play("Player_Stab", 0, 0);
}
private void FastEffectHit(int type)
{
GameObject hitFX2o = new GameObject();
hitFX2o.transform.localPosition = new Vector3(0.11f, -2.15f);
hitFX2o.transform.localScale = new Vector3(5.401058f, 1.742697f);
hitFX2o.transform.localRotation = Quaternion.Euler(0, 0, -38.402f);
SpriteRenderer hfx2s = hitFX2o.AddComponent<SpriteRenderer>();
if (type == 2)
hfx2s.sprite = hitFXG;
else
hfx2s.sprite = hitFX2;
hfx2s.sortingOrder = -5;
hfx2s.DOColor(new Color(1, 1, 1, 0), 0.07f).OnComplete(delegate { Destroy(hitFX2o); });
}
private void HitFXMiss(Vector2 pos, Vector2 size)
{
GameObject hitFXo = new GameObject();
hitFXo.transform.localPosition = new Vector3(pos.x, pos.y);
hitFXo.transform.localScale = new Vector3(size.x, size.y);
SpriteRenderer hfxs = hitFXo.AddComponent<SpriteRenderer>();
hfxs.sprite = hitFXMiss;
hfxs.sortingOrder = 100;
hfxs.DOColor(new Color(1, 1, 1, 0), 0.05f).OnComplete(delegate { Destroy(hitFXo); });
}
private void RemovePea()
{
if (currentHitInList < EligibleHits.Count)
{
Destroy(EligibleHits[currentHitInList].pea.gameObject);
EligibleHits.Remove(EligibleHits[currentHitInList]);
currentHitInList++;
}
}
}

View file

@ -1,112 +0,0 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Pea : MonoBehaviour
{
[Header("Latency")]
public float earlyTime;
public float perfectTime;
public float lateTime;
public float endTime;
private Animator anim;
public float startBeat;
private bool inList = false;
public int type;
private ForkLifterPlayer.Eligible e = new ForkLifterPlayer.Eligible();
public int estate, pstate, lstate, endstate;
private void Start()
{
anim = GetComponent<Animator>();
Jukebox.PlayOneShot("zoom");
GetComponentInChildren<SpriteRenderer>().sprite = ForkLifter.instance.peaSprites[type];
e = new ForkLifterPlayer.Eligible();
e.pea = this;
for (int i = 0; i < transform.GetChild(0).childCount; i++)
{
transform.GetChild(0).GetChild(i).GetComponent<SpriteRenderer>().sprite = transform.GetChild(0).GetComponent<SpriteRenderer>().sprite;
}
}
private void Update()
{
float normalizedBeat = (Conductor.instance.GetLoopPositionFromBeat(startBeat, 2.5f));
anim.Play("Flicked_Object", -1, normalizedBeat);
anim.speed = 0;
// Early State
if (normalizedBeat > earlyTime && normalizedBeat < perfectTime && estate <= 1)
{
estate++;
MakeEligible(true, false, false);
}
// Perfect State
else if (normalizedBeat > perfectTime && normalizedBeat < lateTime && pstate <= 1)
{
pstate++;
MakeEligible(false, true, false);
}
// Late State
else if (normalizedBeat > lateTime && normalizedBeat < endTime && lstate <= 1)
{
lstate++;
MakeEligible(false, false, true);
}
else if (normalizedBeat < earlyTime || normalizedBeat > endTime)
{
MakeInEligible();
}
if (normalizedBeat > endTime && endstate <= 1)
{
endstate++;
Jukebox.PlayOneShot("disappointed");
GoForAPerfect.instance.Miss();
}
if (normalizedBeat > 1.35f)
{
MakeInEligible();
Destroy(this.gameObject);
}
}
public void MakeEligible(bool early, bool perfect, bool late)
{
// print($"{early}, {perfect}, {late}");
if (!inList)
{
e.early = early;
e.perfect = perfect;
e.late = late;
ForkLifterPlayer.instance.EligibleHits.Add(e);
inList = true;
}
else
{
ForkLifterPlayer.Eligible es = ForkLifterPlayer.instance.EligibleHits[ForkLifterPlayer.instance.EligibleHits.IndexOf(e)];
es.early = early;
es.perfect = perfect;
es.late = late;
}
}
public void MakeInEligible()
{
if (!inList) return;
ForkLifterPlayer.instance.EligibleHits.Remove(e);
inList = false;
}
}

View file

@ -7,176 +7,182 @@ using UnityEngine;
using Starpelly; using Starpelly;
using Newtonsoft.Json; using Newtonsoft.Json;
public class GameManager : MonoBehaviour using RhythmHeavenMania.Games.ForkLifter;
using RhythmHeavenMania.Util;
namespace RhythmHeavenMania
{ {
public static GameManager instance; public class GameManager : MonoBehaviour
public List<Event> Events = new List<Event>();
public List<float> AutoPlay = new List<float>();
public List<Event> allPlayerActions = new List<Event>();
public int currentEvent, currentEventAutoplay, currentEventPlayer;
public TextAsset txt;
public bool autoplay = false;
public float startOffset;
[Serializable]
public class Event : ICloneable
{ {
public float spawnTime; public static GameManager instance;
public string eventName;
public object Clone() public List<Event> Events = new List<Event>();
public List<float> AutoPlay = new List<float>();
public List<Event> allPlayerActions = new List<Event>();
public int currentEvent, currentEventAutoplay, currentEventPlayer;
public TextAsset txt;
public bool autoplay = false;
public float startOffset;
[Serializable]
public class Event : ICloneable
{ {
return this.MemberwiseClone(); public float spawnTime;
} public string eventName;
}
private void Awake() public object Clone()
{
instance = this;
}
private void Start()
{
SortEventsList();
string json = txt.text;
Events = JsonConvert.DeserializeObject<List<Event>>(json);
SortEventsList();
allPlayerActions = Events.FindAll(c => c.eventName != "gulp" && c.eventName != "sigh" && c.eventName != "prepare" && c.eventName != "end");
AutoPlay = allPlayerActions.Select(c => c.spawnTime + 2).ToList();
/*List<Event> temp = new List<Event>();
for (int i = 0; i < allPlayerActions.Count; i++)
{
if (i - 1 > 0)
{ {
if (Mathp.IsWithin(allPlayerActions[i - 1].spawnTime, allPlayerActions[i].spawnTime - 1f, allPlayerActions[i].spawnTime)) return this.MemberwiseClone();
{
// do nothing lul
continue;
}
}
Event e = (Event)allPlayerActions[i].Clone();
e.spawnTime = allPlayerActions[i].spawnTime - 1;
e.eventName = "prepare";
temp.Add(e);
}
string s = JsonConvert.SerializeObject(temp);
print(s);*/
StartCoroutine(Begin());
GlobalGameManager.Init();
}
private IEnumerator Begin()
{
yield return new WaitForSeconds(startOffset);
Conductor.instance.musicSource.Play();
GoForAPerfect.instance.Enable();
}
private void Update()
{
if (Input.GetKeyDown(KeyCode.Q))
ForkLifter.instance.Flick(Conductor.instance.songPositionInBeats, 0);
if (Input.GetKeyDown(KeyCode.W))
ForkLifter.instance.Flick(Conductor.instance.songPositionInBeats, 1);
if (Input.GetKeyDown(KeyCode.E))
ForkLifter.instance.Flick(Conductor.instance.songPositionInBeats, 2);
if (Input.GetKeyDown(KeyCode.R))
ForkLifter.instance.Flick(Conductor.instance.songPositionInBeats, 3);
if (Events.Count < 1)
return;
List<float> floats = Events.Select(c => c.spawnTime).ToList();
if (currentEvent < Events.Count && currentEvent >= 0)
{
if (Conductor.instance.songPositionInBeats >= floats[currentEvent])
{
switch (Events[currentEvent].eventName)
{
case "pea":
currentEventPlayer++;
ForkLifter.instance.Flick(Events[currentEvent].spawnTime, 0);
break;
case "topbun":
currentEventPlayer++;
ForkLifter.instance.Flick(Events[currentEvent].spawnTime, 1);
break;
case "burger":
currentEventPlayer++;
ForkLifter.instance.Flick(Events[currentEvent].spawnTime, 2);
break;
case "bottombun":
currentEventPlayer++;
ForkLifter.instance.Flick(Events[currentEvent].spawnTime, 3);
break;
case "gulp":
ForkLifterPlayer.instance.Eat();
break;
case "sigh":
Jukebox.PlayOneShot("sigh");
break;
case "prepare":
ForkLifterHand.instance.Prepare();
break;
case "end":
GlobalGameManager.LoadScene(2, 0.45f);
break;
}
currentEvent++;
} }
} }
if (autoplay) private void Awake()
{ {
if (currentEventAutoplay < AutoPlay.Count && currentEventAutoplay >= 0) instance = this;
{
if (Conductor.instance.songPositionInBeats >= AutoPlay[currentEventAutoplay])
{
ForkLifterPlayer.instance.Stab();
currentEventAutoplay++;
}
}
} }
}
public void SortEventsList() private void Start()
{
Events.Sort((x, y) => x.spawnTime.CompareTo(y.spawnTime));
}
public void SetCurrentEventToClosest()
{
if (Events.Count > 0)
{ {
SortEventsList();
string json = txt.text;
Events = JsonConvert.DeserializeObject<List<Event>>(json);
SortEventsList();
allPlayerActions = Events.FindAll(c => c.eventName != "gulp" && c.eventName != "sigh" && c.eventName != "prepare" && c.eventName != "end");
AutoPlay = allPlayerActions.Select(c => c.spawnTime + 2).ToList();
/*List<Event> temp = new List<Event>();
for (int i = 0; i < allPlayerActions.Count; i++)
{
if (i - 1 > 0)
{
if (Mathp.IsWithin(allPlayerActions[i - 1].spawnTime, allPlayerActions[i].spawnTime - 1f, allPlayerActions[i].spawnTime))
{
// do nothing lul
continue;
}
}
Event e = (Event)allPlayerActions[i].Clone();
e.spawnTime = allPlayerActions[i].spawnTime - 1;
e.eventName = "prepare";
temp.Add(e);
}
string s = JsonConvert.SerializeObject(temp);
print(s);*/
StartCoroutine(Begin());
GlobalGameManager.Init();
}
private IEnumerator Begin()
{
yield return new WaitForSeconds(startOffset);
Conductor.instance.musicSource.Play();
GoForAPerfect.instance.Enable();
}
private void Update()
{
if (Input.GetKeyDown(KeyCode.Q))
ForkLifter.instance.Flick(Conductor.instance.songPositionInBeats, 0);
if (Input.GetKeyDown(KeyCode.W))
ForkLifter.instance.Flick(Conductor.instance.songPositionInBeats, 1);
if (Input.GetKeyDown(KeyCode.E))
ForkLifter.instance.Flick(Conductor.instance.songPositionInBeats, 2);
if (Input.GetKeyDown(KeyCode.R))
ForkLifter.instance.Flick(Conductor.instance.songPositionInBeats, 3);
if (Events.Count < 1)
return;
List<float> floats = Events.Select(c => c.spawnTime).ToList(); List<float> floats = Events.Select(c => c.spawnTime).ToList();
currentEvent = floats.IndexOf(Mathp.GetClosestInList(floats, Conductor.instance.songPositionInBeats));
if (currentEvent < Events.Count && currentEvent >= 0)
{
if (Conductor.instance.songPositionInBeats >= floats[currentEvent])
{
switch (Events[currentEvent].eventName)
{
case "pea":
currentEventPlayer++;
ForkLifter.instance.Flick(Events[currentEvent].spawnTime, 0);
break;
case "topbun":
currentEventPlayer++;
ForkLifter.instance.Flick(Events[currentEvent].spawnTime, 1);
break;
case "burger":
currentEventPlayer++;
ForkLifter.instance.Flick(Events[currentEvent].spawnTime, 2);
break;
case "bottombun":
currentEventPlayer++;
ForkLifter.instance.Flick(Events[currentEvent].spawnTime, 3);
break;
case "gulp":
ForkLifterPlayer.instance.Eat();
break;
case "sigh":
Jukebox.PlayOneShot("sigh");
break;
case "prepare":
ForkLifterHand.instance.Prepare();
break;
case "end":
GlobalGameManager.LoadScene(2, 0.45f);
break;
}
currentEvent++;
}
}
if (autoplay)
{
if (currentEventAutoplay < AutoPlay.Count && currentEventAutoplay >= 0)
{
if (Conductor.instance.songPositionInBeats >= AutoPlay[currentEventAutoplay])
{
ForkLifterPlayer.instance.Stab();
currentEventAutoplay++;
}
}
}
} }
if (AutoPlay.Count > 0)
public void SortEventsList()
{ {
currentEvent = AutoPlay.IndexOf(Mathp.GetClosestInList(AutoPlay, Conductor.instance.songPositionInBeats)); Events.Sort((x, y) => x.spawnTime.CompareTo(y.spawnTime));
currentEventPlayer = AutoPlay.IndexOf(Mathp.GetClosestInList(AutoPlay, Conductor.instance.songPositionInBeats)); }
public void SetCurrentEventToClosest()
{
if (Events.Count > 0)
{
List<float> floats = Events.Select(c => c.spawnTime).ToList();
currentEvent = floats.IndexOf(Mathp.GetClosestInList(floats, Conductor.instance.songPositionInBeats));
}
if (AutoPlay.Count > 0)
{
currentEvent = AutoPlay.IndexOf(Mathp.GetClosestInList(AutoPlay, Conductor.instance.songPositionInBeats));
currentEventPlayer = AutoPlay.IndexOf(Mathp.GetClosestInList(AutoPlay, Conductor.instance.songPositionInBeats));
}
} }
}
private void OnGUI() private void OnGUI()
{ {
// GUI.Box(new Rect(0, 0, 300, 50), $"SongPosInBeats: {Conductor.instance.songPositionInBeats}"); // GUI.Box(new Rect(0, 0, 300, 50), $"SongPosInBeats: {Conductor.instance.songPositionInBeats}");
}
} }
} }

View file

@ -2,33 +2,36 @@ using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using UnityEngine; using UnityEngine;
public class GameProfiler : MonoBehaviour namespace RhythmHeavenMania
{ {
public float score = 0; public class GameProfiler : MonoBehaviour
public int totalHits = 0;
public bool perfect = false;
public static GameProfiler instance { get; set; }
private void Awake()
{ {
instance = this; public float score = 0;
DontDestroyOnLoad(this.gameObject); public int totalHits = 0;
}
private void Start()
{
perfect = true;
}
public void IncreaseScore() public bool perfect = false;
{
totalHits++;
score = GetPercent(totalHits, GameManager.instance.allPlayerActions.Count);
}
public float GetPercent(float value, float totalValue) public static GameProfiler instance { get; set; }
{
return (value / totalValue) * 100; private void Awake()
{
instance = this;
DontDestroyOnLoad(this.gameObject);
}
private void Start()
{
perfect = true;
}
public void IncreaseScore()
{
totalHits++;
score = GetPercent(totalHits, GameManager.instance.allPlayerActions.Count);
}
public float GetPercent(float value, float totalValue)
{
return (value / totalValue) * 100;
}
} }
} }

View file

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: cc7b4daee555e974cac4bcee60f9e6f0
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,44 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using RhythmHeavenMania.Util;
namespace RhythmHeavenMania.Games.ForkLifter
{
public class ForkLifter : MonoBehaviour
{
public static ForkLifter instance;
GameManager GameManager;
[Header("Objects")]
public Animator handAnim;
public GameObject flickedObject;
public SpriteRenderer peaPreview;
public Sprite[] peaSprites;
public Sprite[] peaHitSprites;
private void Awake()
{
instance = this;
}
private void Start()
{
GameManager = GameManager.instance;
}
public void Flick(float beat, int type)
{
Jukebox.PlayOneShot("flick");
handAnim.Play("Hand_Flick", 0, 0);
GameObject fo = Instantiate(flickedObject);
fo.GetComponent<Pea>().startBeat = beat;
fo.GetComponent<Pea>().type = type;
fo.SetActive(true);
}
}
}

View file

@ -0,0 +1,63 @@
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using RhythmHeavenMania.Util;
namespace RhythmHeavenMania.Games.ForkLifter
{
public class ForkLifterHand : MonoBehaviour
{
public SpriteRenderer fastSprite;
public Sprite[] fastSprites;
List<GameManager.Event> allPlayerActions;
public static ForkLifterHand instance { get; set; }
private void Awake()
{
instance = this;
}
public void CheckNextFlick()
{
allPlayerActions = GameManager.instance.Events.FindAll(c => c.eventName != "gulp" && c.eventName != "sigh" && c.eventName != "prepare");
if (GameManager.instance.currentEventPlayer < allPlayerActions.Count)
{
switch (allPlayerActions[GameManager.instance.currentEventPlayer].eventName)
{
case "pea":
ForkLifter.instance.peaPreview.sprite = ForkLifter.instance.peaSprites[0];
fastSprite.sprite = fastSprites[0];
break;
case "topbun":
fastSprite.sprite = fastSprites[0];
ForkLifter.instance.peaPreview.sprite = ForkLifter.instance.peaSprites[1];
break;
case "burger":
fastSprite.sprite = fastSprites[1];
ForkLifter.instance.peaPreview.sprite = ForkLifter.instance.peaSprites[2];
break;
case "bottombun":
fastSprite.sprite = fastSprites[0];
ForkLifter.instance.peaPreview.sprite = ForkLifter.instance.peaSprites[3];
break;
}
}
else
{
ForkLifter.instance.peaPreview.sprite = null;
}
}
public void Prepare()
{
Jukebox.PlayOneShot("flickPrepare");
GetComponent<Animator>().Play("Hand_Prepare");
}
}
}

View file

@ -0,0 +1,317 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;
using RhythmHeavenMania.Util;
namespace RhythmHeavenMania.Games.ForkLifter
{
public class ForkLifterPlayer : MonoBehaviour
{
[Header("Objects")]
public GameObject fork;
public Sprite peaSprite;
public Sprite hitFX;
public Sprite hitFXG;
public Sprite hitFXMiss;
public Sprite hitFX2;
public Transform early, perfect, late;
[SerializeField]
private BoxCollider2D col;
private Animator anim;
public List<Eligible> EligibleHits = new List<Eligible>();
private int currentHitInList = 0;
public static ForkLifterPlayer instance { get; set; }
public float timescale = 1;
private int currentEarlyPeasOnFork;
private int currentPerfectPeasOnFork;
private int currentLatePeasOnFork;
private bool isEating = false;
// Burger shit
private bool topbun, middleburger, bottombun;
// -----------
[System.Serializable]
public class Eligible
{
public Pea pea;
public bool early;
public bool perfect;
public bool late;
}
private void Awake()
{
instance = this;
}
private void Start()
{
anim = GetComponent<Animator>();
}
private void Update()
{
Time.timeScale = timescale;
if (Input.GetMouseButtonDown(0) || Input.GetKeyDown(KeyCode.Z) || Input.GetKeyDown(KeyCode.Space))
{
Stab();
}
if (EligibleHits.Count == 0)
{
currentHitInList = 0;
}
if (Input.GetKeyDown(KeyCode.A))
{
Conductor.instance.musicSource.time += 3;
}
else if (Input.GetKeyDown(KeyCode.S))
{
Conductor.instance.musicSource.time -= 3;
GameManager.instance.SetCurrentEventToClosest();
}
}
public void Eat()
{
if (currentEarlyPeasOnFork != 0 || currentPerfectPeasOnFork != 0 || currentLatePeasOnFork != 0)
{
anim.Play("Player_Eat", 0, 0);
isEating = true;
}
}
public void EatConfirm()
{
if (topbun && middleburger && bottombun)
{
Jukebox.PlayOneShot("burger");
}
else
{
if (currentEarlyPeasOnFork > 0 || currentLatePeasOnFork > 0)
{
Jukebox.PlayOneShot($"cough_{Random.Range(1, 3)}");
}
else
{
Jukebox.PlayOneShot("gulp");
}
}
for (int i = 0; i < early.transform.childCount; i++)
{
Destroy(early.transform.GetChild(i).gameObject);
}
for (int i = 0; i < perfect.transform.childCount; i++)
{
Destroy(perfect.transform.GetChild(i).gameObject);
}
for (int i = 0; i < late.transform.childCount; i++)
{
Destroy(late.transform.GetChild(i).gameObject);
}
currentEarlyPeasOnFork = 0;
currentPerfectPeasOnFork = 0;
currentLatePeasOnFork = 0;
isEating = false;
topbun = false; middleburger = false; bottombun = false;
}
public void Stab()
{
if (isEating) return;
bool canHit = (EligibleHits.Count > 0) && (currentHitInList < EligibleHits.Count);
if (canHit)
{
GameObject pea = new GameObject();
if (EligibleHits[currentHitInList].perfect)
{
pea.transform.parent = perfect.transform;
pea.transform.localScale = Vector2.one;
pea.transform.localPosition = Vector3.zero;
for (int i = 0; i < perfect.transform.childCount; i++)
{
perfect.transform.GetChild(i).transform.localPosition = new Vector3(0, (-1.67f - (0.15724f * i)) + 0.15724f * currentPerfectPeasOnFork);
}
SpriteRenderer psprite = pea.AddComponent<SpriteRenderer>();
psprite.sprite = ForkLifter.instance.peaHitSprites[EligibleHits[currentHitInList].pea.type];
psprite.sortingOrder = 20;
switch (EligibleHits[currentHitInList].pea.type)
{
case 0:
psprite.sortingOrder = 101;
break;
case 1:
psprite.sortingOrder = 104;
break;
case 2:
psprite.sortingOrder = 103;
break;
case 3:
psprite.sortingOrder = 102;
break;
}
GameObject hitFXo = new GameObject();
hitFXo.transform.localPosition = new Vector3(1.9969f, -3.7026f);
hitFXo.transform.localScale = new Vector3(3.142196f, 3.142196f);
SpriteRenderer hfxs = hitFXo.AddComponent<SpriteRenderer>();
hfxs.sprite = hitFX;
hfxs.sortingOrder = 100;
hfxs.DOColor(new Color(1, 1, 1, 0), 0.05f).OnComplete(delegate { Destroy(hitFXo); });
FastEffectHit(EligibleHits[currentHitInList].pea.type);
Jukebox.PlayOneShot("stab");
currentPerfectPeasOnFork++;
if (EligibleHits[currentHitInList].pea.type == 1)
{
topbun = true;
}
else if (EligibleHits[currentHitInList].pea.type == 2)
{
middleburger = true;
}
else if (EligibleHits[currentHitInList].pea.type == 3)
{
bottombun = true;
}
RemovePea();
GoForAPerfect.instance.Hit();
GameProfiler.instance.IncreaseScore();
}
else if (EligibleHits[currentHitInList].early)
{
pea.transform.parent = early.transform;
pea.transform.localScale = Vector2.one;
pea.transform.localPosition = Vector3.zero;
pea.transform.localRotation = Quaternion.Euler(0, 0, 90);
for (int i = 0; i < early.transform.childCount; i++)
{
early.transform.GetChild(i).transform.localPosition = new Vector3(0, (-1.67f - (0.15724f * i)) + 0.15724f * currentEarlyPeasOnFork);
}
SpriteRenderer psprite = pea.AddComponent<SpriteRenderer>();
psprite.sprite = ForkLifter.instance.peaHitSprites[EligibleHits[currentHitInList].pea.type];
psprite.sortingOrder = 20;
HitFXMiss(new Vector2(1.0424f, -4.032f), new Vector2(1.129612f, 1.129612f));
HitFXMiss(new Vector2(0.771f, -3.016f), new Vector2(1.71701f, 1.71701f));
HitFXMiss(new Vector2(2.598f, -2.956f), new Vector2(1.576043f, 1.576043f));
HitFXMiss(new Vector2(2.551f, -3.609f), new Vector2(1.200788f, 1.200788f));
FastEffectHit(EligibleHits[currentHitInList].pea.type);
Jukebox.PlayOneShot("miss");
currentEarlyPeasOnFork++;
RemovePea();
GoForAPerfect.instance.Miss();
}
else if (EligibleHits[currentHitInList].late)
{
pea.transform.parent = late.transform;
pea.transform.localScale = Vector2.one;
pea.transform.localPosition = Vector3.zero;
pea.transform.localRotation = Quaternion.Euler(0, 0, 90);
for (int i = 0; i < late.transform.childCount; i++)
{
late.transform.GetChild(i).transform.localPosition = new Vector3(0, (-1.67f - (0.15724f * i)) + 0.15724f * currentLatePeasOnFork);
}
SpriteRenderer psprite = pea.AddComponent<SpriteRenderer>();
psprite.sprite = ForkLifter.instance.peaHitSprites[EligibleHits[currentHitInList].pea.type];
psprite.sortingOrder = 20;
HitFXMiss(new Vector2(1.0424f, -4.032f), new Vector2(1.129612f, 1.129612f));
HitFXMiss(new Vector2(0.771f, -3.016f), new Vector2(1.71701f, 1.71701f));
HitFXMiss(new Vector2(2.598f, -2.956f), new Vector2(1.576043f, 1.576043f));
HitFXMiss(new Vector2(2.551f, -3.609f), new Vector2(1.200788f, 1.200788f));
FastEffectHit(EligibleHits[currentHitInList].pea.type);
Jukebox.PlayOneShot("miss");
currentLatePeasOnFork++;
RemovePea();
GoForAPerfect.instance.Miss();
}
}
else
{
Jukebox.PlayOneShot("stabnohit");
}
anim.Play("Player_Stab", 0, 0);
}
private void FastEffectHit(int type)
{
GameObject hitFX2o = new GameObject();
hitFX2o.transform.localPosition = new Vector3(0.11f, -2.15f);
hitFX2o.transform.localScale = new Vector3(5.401058f, 1.742697f);
hitFX2o.transform.localRotation = Quaternion.Euler(0, 0, -38.402f);
SpriteRenderer hfx2s = hitFX2o.AddComponent<SpriteRenderer>();
if (type == 2)
hfx2s.sprite = hitFXG;
else
hfx2s.sprite = hitFX2;
hfx2s.sortingOrder = -5;
hfx2s.DOColor(new Color(1, 1, 1, 0), 0.07f).OnComplete(delegate { Destroy(hitFX2o); });
}
private void HitFXMiss(Vector2 pos, Vector2 size)
{
GameObject hitFXo = new GameObject();
hitFXo.transform.localPosition = new Vector3(pos.x, pos.y);
hitFXo.transform.localScale = new Vector3(size.x, size.y);
SpriteRenderer hfxs = hitFXo.AddComponent<SpriteRenderer>();
hfxs.sprite = hitFXMiss;
hfxs.sortingOrder = 100;
hfxs.DOColor(new Color(1, 1, 1, 0), 0.05f).OnComplete(delegate { Destroy(hitFXo); });
}
private void RemovePea()
{
if (currentHitInList < EligibleHits.Count)
{
Destroy(EligibleHits[currentHitInList].pea.gameObject);
EligibleHits.Remove(EligibleHits[currentHitInList]);
currentHitInList++;
}
}
}
}

View file

@ -0,0 +1,117 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using RhythmHeavenMania.Util;
namespace RhythmHeavenMania.Games.ForkLifter
{
public class Pea : MonoBehaviour
{
[Header("Latency")]
public float earlyTime;
public float perfectTime;
public float lateTime;
public float endTime;
private Animator anim;
public float startBeat;
private bool inList = false;
public int type;
private ForkLifterPlayer.Eligible e = new ForkLifterPlayer.Eligible();
public int estate, pstate, lstate, endstate;
private void Start()
{
anim = GetComponent<Animator>();
Jukebox.PlayOneShot("zoom");
GetComponentInChildren<SpriteRenderer>().sprite = ForkLifter.instance.peaSprites[type];
e = new ForkLifterPlayer.Eligible();
e.pea = this;
for (int i = 0; i < transform.GetChild(0).childCount; i++)
{
transform.GetChild(0).GetChild(i).GetComponent<SpriteRenderer>().sprite = transform.GetChild(0).GetComponent<SpriteRenderer>().sprite;
}
}
private void Update()
{
float normalizedBeat = (Conductor.instance.GetLoopPositionFromBeat(startBeat, 2.5f));
anim.Play("Flicked_Object", -1, normalizedBeat);
anim.speed = 0;
// Early State
if (normalizedBeat > earlyTime && normalizedBeat < perfectTime && estate <= 1)
{
estate++;
MakeEligible(true, false, false);
}
// Perfect State
else if (normalizedBeat > perfectTime && normalizedBeat < lateTime && pstate <= 1)
{
pstate++;
MakeEligible(false, true, false);
}
// Late State
else if (normalizedBeat > lateTime && normalizedBeat < endTime && lstate <= 1)
{
lstate++;
MakeEligible(false, false, true);
}
else if (normalizedBeat < earlyTime || normalizedBeat > endTime)
{
MakeInEligible();
}
if (normalizedBeat > endTime && endstate <= 1)
{
endstate++;
Jukebox.PlayOneShot("disappointed");
GoForAPerfect.instance.Miss();
}
if (normalizedBeat > 1.35f)
{
MakeInEligible();
Destroy(this.gameObject);
}
}
public void MakeEligible(bool early, bool perfect, bool late)
{
// print($"{early}, {perfect}, {late}");
if (!inList)
{
e.early = early;
e.perfect = perfect;
e.late = late;
ForkLifterPlayer.instance.EligibleHits.Add(e);
inList = true;
}
else
{
ForkLifterPlayer.Eligible es = ForkLifterPlayer.instance.EligibleHits[ForkLifterPlayer.instance.EligibleHits.IndexOf(e)];
es.early = early;
es.perfect = perfect;
es.late = late;
}
}
public void MakeInEligible()
{
if (!inList) return;
ForkLifterPlayer.instance.EligibleHits.Remove(e);
inList = false;
}
}
}

View file

@ -5,88 +5,92 @@ using UnityEngine.SceneManagement;
using UnityEngine.UI; using UnityEngine.UI;
using DG.Tweening; using DG.Tweening;
public class GlobalGameManager : MonoBehaviour namespace RhythmHeavenMania
{ {
public static GlobalGameManager instance { get; set; } public class GlobalGameManager : MonoBehaviour
public static int loadedScene;
public int lastLoadedScene;
public static float fadeDuration;
public GameObject loadScenePrefab;
public GameObject hourGlass;
public static string levelLocation;
public static bool officialLevel;
public enum Scenes : int
{ {
SplashScreen = 0, public static GlobalGameManager instance { get; set; }
Menu = 1,
Editor = 2,
Game = 3
}
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)] public static int loadedScene;
public static void Init() public int lastLoadedScene;
{ public static float fadeDuration;
BasicCheck();
loadedScene = 0; public GameObject loadScenePrefab;
fadeDuration = 0; public GameObject hourGlass;
}
public void Awake() public static string levelLocation;
{ public static bool officialLevel;
Init();
DontDestroyOnLoad(this.gameObject);
instance = this;
Starpelly.OS.Windows.ChangeWindowTitle($"Rhythm Heaven Mania DEMO");
}
public static GameObject CreateFade() public enum Scenes : int
{
GameObject fade = new GameObject();
DontDestroyOnLoad(fade);
fade.transform.localScale = new Vector3(4000, 4000);
SpriteRenderer sr = fade.AddComponent<SpriteRenderer>();
sr.sprite = Resources.Load<Sprite>("Sprites/GeneralPurpose/Square");
sr.sortingOrder = 20000;
fade.layer = 5;
return fade;
}
public static void BasicCheck()
{
if (FindGGM() == null)
{ {
GameObject GlobalGameManager = new GameObject("GlobalGameManager"); SplashScreen = 0,
GlobalGameManager.name = "GlobalGameManager"; Menu = 1,
GlobalGameManager.AddComponent<GlobalGameManager>(); Editor = 2,
Game = 3
}
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]
public static void Init()
{
BasicCheck();
loadedScene = 0;
fadeDuration = 0;
}
public void Awake()
{
Init();
DontDestroyOnLoad(this.gameObject);
instance = this;
Starpelly.OS.Windows.ChangeWindowTitle($"Rhythm Heaven Mania DEMO");
}
public static GameObject CreateFade()
{
GameObject fade = new GameObject();
DontDestroyOnLoad(fade);
fade.transform.localScale = new Vector3(4000, 4000);
SpriteRenderer sr = fade.AddComponent<SpriteRenderer>();
sr.sprite = Resources.Load<Sprite>("Sprites/GeneralPurpose/Square");
sr.sortingOrder = 20000;
fade.layer = 5;
return fade;
}
public static void BasicCheck()
{
if (FindGGM() == null)
{
GameObject GlobalGameManager = new GameObject("GlobalGameManager");
GlobalGameManager.name = "GlobalGameManager";
GlobalGameManager.AddComponent<GlobalGameManager>();
}
}
public static GameObject FindGGM()
{
if (GameObject.Find("GlobalGameManager") != null)
return GameObject.Find("GlobalGameManager");
else
return null;
}
public static void LoadScene(int sceneIndex, float duration = 0.35f)
{
print("bruh");
BasicCheck();
loadedScene = sceneIndex;
fadeDuration = duration;
// DOTween.Clear(true);
// SceneManager.LoadScene(sceneIndex);
GameObject fade = CreateFade();
fade.GetComponent<SpriteRenderer>().color = new Color(0, 0, 0, 0);
fade.GetComponent<SpriteRenderer>().DOColor(Color.black, fadeDuration).OnComplete(() => { SceneManager.LoadScene(loadedScene); fade.GetComponent<SpriteRenderer>().DOColor(new Color(0, 0, 0, 0), fadeDuration).OnComplete(() => { Destroy(fade); }); });
} }
} }
public static GameObject FindGGM()
{
if (GameObject.Find("GlobalGameManager") != null)
return GameObject.Find("GlobalGameManager");
else
return null;
}
public static void LoadScene(int sceneIndex, float duration = 0.35f)
{
print("bruh");
BasicCheck();
loadedScene = sceneIndex;
fadeDuration = duration;
// DOTween.Clear(true);
// SceneManager.LoadScene(sceneIndex);
GameObject fade = CreateFade();
fade.GetComponent<SpriteRenderer>().color = new Color(0, 0, 0, 0);
fade.GetComponent<SpriteRenderer>().DOColor(Color.black, fadeDuration).OnComplete(() => { SceneManager.LoadScene(loadedScene); fade.GetComponent<SpriteRenderer>().DOColor(new Color(0, 0, 0, 0), fadeDuration).OnComplete(() => { Destroy(fade); }); });
}
} }

View file

@ -0,0 +1,70 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using RhythmHeavenMania.Util;
namespace RhythmHeavenMania
{
public class GoForAPerfect : MonoBehaviour
{
public static GoForAPerfect instance { get; set; }
private Animator pAnim;
private bool active = false;
public bool perfect;
private void Awake()
{
instance = this;
}
private void Start()
{
pAnim = transform.GetChild(0).GetChild(0).GetComponent<Animator>();
perfect = true;
}
public void Hit()
{
if (!active) return;
pAnim.Play("PerfectIcon_Hit", 0, 0);
}
public void Miss()
{
if (!active) return;
perfect = false;
GameProfiler.instance.perfect = false;
transform.GetChild(0).GetChild(1).gameObject.SetActive(false);
this.GetComponent<Animator>().Play("GoForAPerfect_Miss");
Jukebox.PlayOneShot("perfectMiss");
}
public void Enable()
{
SetActive();
transform.GetChild(0).gameObject.SetActive(true);
}
public void Disable()
{
SetInactive();
transform.GetChild(0).gameObject.SetActive(false);
}
public void SetActive()
{
active = true;
}
public void SetInactive()
{
active = false;
}
}
}

View file

@ -1,49 +0,0 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Jukebox
{
public enum AudioType
{
OGG,
WAV
}
/// <summary>
/// This is me just idiot-proofing.
/// </summary>
public static void BasicCheck()
{
if (FindJukebox() == null)
{
GameObject Jukebox = new GameObject("Jukebox");
Jukebox.AddComponent<AudioSource>();
Jukebox.tag = "Jukebox";
}
}
public static GameObject FindJukebox()
{
if (GameObject.FindGameObjectWithTag("Jukebox") != null)
return GameObject.FindGameObjectWithTag("Jukebox");
else
return null;
}
public static void SetVolume(float volume)
{
BasicCheck();
FindJukebox().GetComponent<AudioSource>().volume = volume;
}
public static void PlayOneShot(string name)
{
GameObject oneShot = new GameObject("oneShot");
AudioSource aus = oneShot.AddComponent<AudioSource>();
aus.playOnAwake = false;
Sound snd = oneShot.AddComponent<Sound>();
snd.clip = Resources.Load<AudioClip>($"Sfx/{name}");
}
}

View file

@ -1,24 +0,0 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Sound : MonoBehaviour
{
public AudioClip clip;
public float pitch;
private AudioSource audioSource;
private void Start()
{
audioSource = GetComponent<AudioSource>();
audioSource.PlayOneShot(clip);
StartCoroutine(play());
}
private IEnumerator play()
{
yield return new WaitForSeconds(clip.length);
Destroy(this.gameObject);
}
}

View file

@ -1,64 +0,0 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GoForAPerfect : MonoBehaviour
{
public static GoForAPerfect instance { get; set; }
private Animator pAnim;
private bool active = false;
public bool perfect;
private void Awake()
{
instance = this;
}
private void Start()
{
pAnim = transform.GetChild(0).GetChild(0).GetComponent<Animator>();
perfect = true;
}
public void Hit()
{
if (!active) return;
pAnim.Play("PerfectIcon_Hit", 0, 0);
}
public void Miss()
{
if (!active) return;
perfect = false;
GameProfiler.instance.perfect = false;
transform.GetChild(0).GetChild(1).gameObject.SetActive(false);
this.GetComponent<Animator>().Play("GoForAPerfect_Miss");
Jukebox.PlayOneShot("perfectMiss");
}
public void Enable()
{
SetActive();
transform.GetChild(0).gameObject.SetActive(true);
}
public void Disable()
{
SetInactive();
transform.GetChild(0).gameObject.SetActive(false);
}
public void SetActive()
{
active = true;
}
public void SetInactive()
{
active = false;
}
}

View file

@ -2,34 +2,38 @@ using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using UnityEngine; using UnityEngine;
public class Prologue : MonoBehaviour namespace RhythmHeavenMania
{ {
[SerializeField] private float waitSeconds; public class Prologue : MonoBehaviour
public GameObject Holder;
public GameObject pressAny;
bool inPrologue = false;
private void Update()
{ {
if (Input.anyKeyDown && !inPrologue) [SerializeField] private float waitSeconds;
public GameObject Holder;
public GameObject pressAny;
bool inPrologue = false;
private void Update()
{ {
pressAny.SetActive(false); if (Input.anyKeyDown && !inPrologue)
Holder.SetActive(true); {
StartCoroutine(Wait()); pressAny.SetActive(false);
inPrologue = true; Holder.SetActive(true);
StartCoroutine(Wait());
inPrologue = true;
}
}
IEnumerator Wait()
{
transform.GetChild(0).gameObject.SetActive(false);
yield return new WaitForSeconds(1);
transform.GetChild(0).gameObject.SetActive(true);
yield return new WaitForSeconds(waitSeconds);
transform.GetChild(0).gameObject.SetActive(false);
yield return new WaitForSeconds(2);
UnityEngine.SceneManagement.SceneManager.LoadScene(1);
} }
} }
IEnumerator Wait()
{
transform.GetChild(0).gameObject.SetActive(false);
yield return new WaitForSeconds(1);
transform.GetChild(0).gameObject.SetActive(true);
yield return new WaitForSeconds(waitSeconds);
transform.GetChild(0).gameObject.SetActive(false);
yield return new WaitForSeconds(2);
UnityEngine.SceneManagement.SceneManager.LoadScene(1);
}
} }

View file

@ -5,135 +5,141 @@ using UnityEngine.UI;
using TMPro; using TMPro;
using DG.Tweening; using DG.Tweening;
public class Rating : MonoBehaviour using RhythmHeavenMania.Util;
namespace RhythmHeavenMania
{ {
public GameObject Title; public class Rating : MonoBehaviour
public GameObject Desc;
public GameObject Rank;
public GameObject Epilogue;
public GameObject Perfect;
public GameObject RankingHolder;
public GameObject Fade;
private string rank;
private int rankId;
public Sprite[] epilogueSprites;
public Image epilogueImage;
public TMP_Text epilogueText;
private void Start()
{ {
float score = GameProfiler.instance.score; public GameObject Title;
TMP_Text desc = Desc.GetComponent<TMP_Text>(); public GameObject Desc;
public GameObject Rank;
public GameObject Epilogue;
public GameObject Perfect;
if (GameProfiler.instance.perfect) public GameObject RankingHolder;
public GameObject Fade;
private string rank;
private int rankId;
public Sprite[] epilogueSprites;
public Image epilogueImage;
public TMP_Text epilogueText;
private void Start()
{ {
Perfect.SetActive(true); float score = GameProfiler.instance.score;
Jukebox.PlayOneShot("Rankings/ranking_perfect"); TMP_Text desc = Desc.GetComponent<TMP_Text>();
StartCoroutine(PerfectIE());
if (GameProfiler.instance.perfect)
{
Perfect.SetActive(true);
Jukebox.PlayOneShot("Rankings/ranking_perfect");
StartCoroutine(PerfectIE());
}
else
{
if (score < 59)
{
// try again
desc.text = "Your fork technique was rather uncouth. \nYour consecutive stabs needed work.";
rank = "Rankings/ranking_tryagain";
rankId = 2;
}
else if (score >= 59 && score < 79)
{
// ok
desc.text = "Eh. Good enough.";
rank = "Rankings/ranking_ok";
rankId = 1;
}
else if (score >= 79)
{
// superb
desc.text = "Your fork technique was quite elegant. \nYour consecutive stabs were excellent. \nYour triple-stab technique was sublime.";
rank = "Rankings/ranking_superb";
rankId = 0;
}
StartCoroutine(ShowRank());
}
} }
else
private IEnumerator ShowRank()
{ {
if (score < 59) // Title
yield return new WaitForSeconds(0.5f);
Jukebox.PlayOneShot("Rankings/ranking_title_show");
Title.SetActive(true);
// Desc
yield return new WaitForSeconds(2f);
Jukebox.PlayOneShot("Rankings/ranking_desc_show");
Desc.SetActive(true);
// Rating
yield return new WaitForSeconds(2f);
Jukebox.PlayOneShot(rank);
Rank.transform.GetChild(rankId).gameObject.SetActive(true);
// Epilogue
yield return new WaitForSeconds(5f);
Fade.GetComponent<Image>().DOColor(Color.black, 0.75f).OnComplete(delegate
{ {
// try again StartCoroutine(ShowEpilogue());
desc.text = "Your fork technique was rather uncouth. \nYour consecutive stabs needed work."; });
rank = "Rankings/ranking_tryagain"; }
rankId = 2;
} private IEnumerator ShowEpilogue()
else if (score >= 59 && score < 79) {
epilogueImage.sprite = epilogueSprites[rankId];
switch (rankId)
{ {
// ok case 2:
desc.text = "Eh. Good enough."; epilogueText.text = "Blood sugar...so...low...";
rank = "Rankings/ranking_ok"; break;
rankId = 1; case 1:
} epilogueText.text = "I could eat two more dinners!";
else if (score >= 79) break;
{ case 0:
// superb epilogueText.text = "So full! So satisfied!";
desc.text = "Your fork technique was quite elegant. \nYour consecutive stabs were excellent. \nYour triple-stab technique was sublime."; break;
rank = "Rankings/ranking_superb";
rankId = 0;
} }
StartCoroutine(ShowRank()); yield return new WaitForSeconds(1);
Fade.GetComponent<Image>().color = new Color(0, 0, 0, 0);
RankingHolder.SetActive(false);
Epilogue.SetActive(true);
switch (rankId)
{
case 0:
Jukebox.PlayOneShot("Rankings/epilogue_superb");
break;
case 1:
Jukebox.PlayOneShot("Rankings/epilogue_ok");
break;
case 2:
Jukebox.PlayOneShot("Rankings/epilogue_tryagain");
break;
}
yield return new WaitForSeconds(8);
GlobalGameManager.LoadScene(0);
}
private IEnumerator PerfectIE()
{
yield return new WaitForSeconds(8);
GlobalGameManager.LoadScene(0);
} }
} }
private IEnumerator ShowRank()
{
// Title
yield return new WaitForSeconds(0.5f);
Jukebox.PlayOneShot("Rankings/ranking_title_show");
Title.SetActive(true);
// Desc
yield return new WaitForSeconds(2f);
Jukebox.PlayOneShot("Rankings/ranking_desc_show");
Desc.SetActive(true);
// Rating
yield return new WaitForSeconds(2f);
Jukebox.PlayOneShot(rank);
Rank.transform.GetChild(rankId).gameObject.SetActive(true);
// Epilogue
yield return new WaitForSeconds(5f);
Fade.GetComponent<Image>().DOColor(Color.black, 0.75f).OnComplete(delegate
{
StartCoroutine(ShowEpilogue());
});
}
private IEnumerator ShowEpilogue()
{
epilogueImage.sprite = epilogueSprites[rankId];
switch (rankId)
{
case 2:
epilogueText.text = "Blood sugar...so...low...";
break;
case 1:
epilogueText.text = "I could eat two more dinners!";
break;
case 0:
epilogueText.text = "So full! So satisfied!";
break;
}
yield return new WaitForSeconds(1);
Fade.GetComponent<Image>().color = new Color(0, 0, 0, 0);
RankingHolder.SetActive(false);
Epilogue.SetActive(true);
switch (rankId)
{
case 0:
Jukebox.PlayOneShot("Rankings/epilogue_superb");
break;
case 1:
Jukebox.PlayOneShot("Rankings/epilogue_ok");
break;
case 2:
Jukebox.PlayOneShot("Rankings/epilogue_tryagain");
break;
}
yield return new WaitForSeconds(8);
GlobalGameManager.LoadScene(0);
}
private IEnumerator PerfectIE()
{
yield return new WaitForSeconds(8);
GlobalGameManager.LoadScene(0);
}
} }

8
Assets/Scripts/Util.meta Normal file
View file

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 23db959b7a4cf21438c0b20d9b30b688
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,15 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace RhythmHeavenMania.Util
{
public class CommonAnimEvents : MonoBehaviour
{
public void Destroy()
{
Destroy(this.gameObject);
}
}
}

View file

@ -0,0 +1,53 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace RhythmHeavenMania.Util
{
public class Jukebox
{
public enum AudioType
{
OGG,
WAV
}
/// <summary>
/// This is me just idiot-proofing.
/// </summary>
public static void BasicCheck()
{
if (FindJukebox() == null)
{
GameObject Jukebox = new GameObject("Jukebox");
Jukebox.AddComponent<AudioSource>();
Jukebox.tag = "Jukebox";
}
}
public static GameObject FindJukebox()
{
if (GameObject.FindGameObjectWithTag("Jukebox") != null)
return GameObject.FindGameObjectWithTag("Jukebox");
else
return null;
}
public static void SetVolume(float volume)
{
BasicCheck();
FindJukebox().GetComponent<AudioSource>().volume = volume;
}
public static void PlayOneShot(string name)
{
GameObject oneShot = new GameObject("oneShot");
AudioSource aus = oneShot.AddComponent<AudioSource>();
aus.playOnAwake = false;
Sound snd = oneShot.AddComponent<Sound>();
snd.clip = Resources.Load<AudioClip>($"Sfx/{name}");
}
}
}

View file

@ -0,0 +1,27 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace RhythmHeavenMania.Util
{
public class Sound : MonoBehaviour
{
public AudioClip clip;
public float pitch;
private AudioSource audioSource;
private void Start()
{
audioSource = GetComponent<AudioSource>();
audioSource.PlayOneShot(clip);
StartCoroutine(play());
}
private IEnumerator play()
{
yield return new WaitForSeconds(clip.length);
Destroy(this.gameObject);
}
}
}

View file

@ -1,18 +1,21 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine; using UnityEngine;
public class WTF : MonoBehaviour // this is a script for testing
namespace RhythmHeavenMania.Tests
{ {
// Start is called before the first frame update public class WTF : MonoBehaviour
void Start()
{ {
// Start is called before the first frame update
void Start()
{
} }
// Update is called once per frame // Update is called once per frame
void Update() void Update()
{ {
}
} }
} }

8
Assets/Shaders.meta Normal file
View file

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 2ba8fd574a5948a4b9c3bb56e0c57a2d
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant: