diff --git a/Assets/Editor/bread2unity/BCCAD.cs b/Assets/Editor/bread2unity/BCCAD.cs new file mode 100644 index 00000000..2749a1ab --- /dev/null +++ b/Assets/Editor/bread2unity/BCCAD.cs @@ -0,0 +1,94 @@ +using System; +using System.Collections; +using System.Collections.Generic; + +using UnityEngine; +namespace Bread2Unity +{ + public class BCCAD : IDataModel + { + + public BCCAD Read(byte[] bytes) + { + sheetW = (ushort)bytes[4]; + sheetH = (ushort)bytes[6]; + + ISprite spriteParts_ = new ISprite(); + + int max = (bytes[8] * 2) + 12; + int loopTimes = 0; + + // this is pretty bad spaghetti code, and I wrote this when I had the flu at 3 AM. so you're welcome --Starpelly + + for (int i = 12; i < max; i+=2) // 16 bit bytes, skip every 2nd byte + { + int ind = i + 4; // the first 4 contain the number of parts and an unknown number, I can skip these for now + + ISpritePart part = new ISpritePart(); + part.regionX = BitConverter.ToUInt16(bytes, ind + 0); + part.regionY = BitConverter.ToUInt16(bytes, ind + 2); + part.regionW = BitConverter.ToUInt16(bytes,ind + 4); + part.regionH = BitConverter.ToUInt16(bytes, ind + 6); + part.posX = BitConverter.ToInt16(bytes, ind + 8); + part.posY = BitConverter.ToInt16(bytes, ind + 10); + part.stretchX = BitConverter.ToSingle(bytes, ind + 12); + part.stretchY = BitConverter.ToSingle(bytes, ind + 14); + part.rotation = BitConverter.ToSingle(bytes, ind + 16); + part.flipX = bytes[ind + 18] != (byte)0; + part.flipY = bytes[ind + 20] != (byte)0; + // im sure the values between 20 and 28 are important so remind me to come back to these + part.opacity = bytes[ind + 28]; + + // Debug.Log(part.regionX); + + spriteParts_.parts.Add(part); + + int compare = 32; + if (loopTimes < 1) + { + compare = 32; + } + else if (loopTimes >= 1) + { + if (loopTimes % 2 == 0) + { + compare = 32; + } + else + { + compare = 34; + } + } + max += compare * 2; + i += compare * 2; + loopTimes++; + + Debug.Log("offset: " + (ind + (compare - loopTimes + 1) * 2) + ", val: " + BitConverter.ToUInt16(bytes, (ind + (compare - loopTimes + 1) * 2))); + + } + sprites.Add(spriteParts_); + + return new BCCAD() + { + }; + } + + + /// sprites length bytes start = 12 + + /// 20 = 1 + /// 84 = 2 + /// 152 = 3 + /// 216 = 4 + /// 284 - 5 + /// + /// + /// 64 + /// 64 + /// -- Loop + /// 68 + /// 64 + /// 68 + /// 64 + } +} \ No newline at end of file diff --git a/Assets/Editor/bread2unity/BCCAD.cs.meta b/Assets/Editor/bread2unity/BCCAD.cs.meta new file mode 100644 index 00000000..aa2f0d84 --- /dev/null +++ b/Assets/Editor/bread2unity/BCCAD.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3b4f0c7c12cfcc74bbfdc8c1be61d4b0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Editor/bread2unity/Bread2Unity.cs b/Assets/Editor/bread2unity/Bread2Unity.cs index 64686238..6cba9f92 100644 --- a/Assets/Editor/bread2unity/Bread2Unity.cs +++ b/Assets/Editor/bread2unity/Bread2Unity.cs @@ -1,5 +1,7 @@ using System.Collections; using System.Collections.Generic; +using System.IO; + using UnityEngine; using UnityEditor; @@ -27,11 +29,21 @@ namespace Bread2Unity desc.wordWrap = true; desc.fontStyle = FontStyle.BoldAndItalic; - GUILayout.Box("bread2unity is a tool built with the purpose of converting RH Megamix and Fever animations to unity. And to generally speed up development by a lot." + "\nCreated by Starpelly.", desc); GUILayout.Space(120); + + if (GUILayout.Button("Test")) + { + string path = EditorUtility.OpenFilePanel("Open BCCAD File", null, "bccad"); + if (path.Length != 0) + { + var fileContent = File.ReadAllBytes(path); + new BCCAD().Read(fileContent); + } + } + GUILayout.BeginHorizontal(); if (GUILayout.Button("Bread Download", GUILayout.Height(40))) { diff --git a/Assets/Editor/bread2unity/Model.meta b/Assets/Editor/bread2unity/Model.meta new file mode 100644 index 00000000..818af05f --- /dev/null +++ b/Assets/Editor/bread2unity/Model.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4801a6826549d7d4a978c7387a1aa26a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Editor/bread2unity/Model/IAnimation.cs b/Assets/Editor/bread2unity/Model/IAnimation.cs new file mode 100644 index 00000000..cdde15c0 --- /dev/null +++ b/Assets/Editor/bread2unity/Model/IAnimation.cs @@ -0,0 +1,24 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace Bread2Unity +{ + public class IAnimation + { + public List steps; + } + + public class IAnimationStep + { + public ushort spriteIndex; + public ushort delay; + + public float stretchX; + public float stretchY; + + public float rotation; + + public byte opacity; + } +} \ No newline at end of file diff --git a/Assets/Editor/bread2unity/Model/IAnimation.cs.meta b/Assets/Editor/bread2unity/Model/IAnimation.cs.meta new file mode 100644 index 00000000..c022dfd3 --- /dev/null +++ b/Assets/Editor/bread2unity/Model/IAnimation.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c33bcfd692627dd4a97ac1cd1d930420 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Editor/bread2unity/Model/IDataModel.cs b/Assets/Editor/bread2unity/Model/IDataModel.cs new file mode 100644 index 00000000..0c9634ed --- /dev/null +++ b/Assets/Editor/bread2unity/Model/IDataModel.cs @@ -0,0 +1,13 @@ +using System.Collections; +using System.Collections.Generic; + +namespace Bread2Unity +{ + public class IDataModel + { + public List sprites = new List(); + public List animations = new List(); + public int sheetW; + public int sheetH; + } +} \ No newline at end of file diff --git a/Assets/Editor/bread2unity/Model/IDataModel.cs.meta b/Assets/Editor/bread2unity/Model/IDataModel.cs.meta new file mode 100644 index 00000000..ff789390 --- /dev/null +++ b/Assets/Editor/bread2unity/Model/IDataModel.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ddf1fd563dabc6040a863537a081843a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Editor/bread2unity/Model/ISprite.cs b/Assets/Editor/bread2unity/Model/ISprite.cs new file mode 100644 index 00000000..9b0ca7e2 --- /dev/null +++ b/Assets/Editor/bread2unity/Model/ISprite.cs @@ -0,0 +1,31 @@ +using System.Collections; +using System.Collections.Generic; + +namespace Bread2Unity +{ + public class ISprite + { + public List parts = new List(); + } + + public class ISpritePart + { + public ushort regionX; + public ushort regionY; + public ushort regionW; + public ushort regionH; + + public short posX; + public short posY; + + public float stretchX; + public float stretchY; + + public float rotation; + + public bool flipX; + public bool flipY; + + public byte opacity; + } +} \ No newline at end of file diff --git a/Assets/Editor/bread2unity/Model/ISprite.cs.meta b/Assets/Editor/bread2unity/Model/ISprite.cs.meta new file mode 100644 index 00000000..c70703e1 --- /dev/null +++ b/Assets/Editor/bread2unity/Model/ISprite.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d4aae79bea7b7234f9ce059ade5fce08 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Games/rhythmTweezers.prefab b/Assets/Resources/Games/rhythmTweezers.prefab index e7a9ce77..74cb0b50 100644 --- a/Assets/Resources/Games/rhythmTweezers.prefab +++ b/Assets/Resources/Games/rhythmTweezers.prefab @@ -192,6 +192,7 @@ Transform: m_LocalScale: {x: 1, y: 1, z: 1} m_Children: - {fileID: 8539794534233051743} + - {fileID: 2037913084037357808} m_Father: {fileID: 1118188506360081759} m_RootOrder: 6 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -359,6 +360,164 @@ SpriteRenderer: m_WasSpriteAssigned: 1 m_MaskInteraction: 0 m_SpriteSortPoint: 0 +--- !u!1 &2595271014815681993 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1462520415884795608} + - component: {fileID: 5699986438258654680} + m_Layer: 0 + m_Name: Hair + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1462520415884795608 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2595271014815681993} + m_LocalRotation: {x: 0, y: 0.008726558, z: 0, w: 0.999962} + m_LocalPosition: {x: -0, y: -1.3562, z: -0} + m_LocalScale: {x: 1, y: 0.8, z: 1} + m_Children: [] + m_Father: {fileID: 2037913084037357808} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 1, z: 0} +--- !u!212 &5699986438258654680 +SpriteRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2595271014815681993} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 0 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 50 + m_Sprite: {fileID: -4253719726650700378, guid: 8b24cfccb5b27054bbfccc7d7a912b73, type: 3} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_FlipX: 0 + m_FlipY: 0 + m_DrawMode: 0 + m_Size: {x: 0.6, y: 0.84} + m_AdaptiveModeThreshold: 0.5 + m_SpriteTileMode: 0 + m_WasSpriteAssigned: 1 + m_MaskInteraction: 0 + m_SpriteSortPoint: 0 +--- !u!1 &2904820922900361117 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2037913084037357808} + - component: {fileID: 5065216968979282284} + - component: {fileID: 6151251985728575842} + m_Layer: 0 + m_Name: LongHairHolder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!4 &2037913084037357808 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2904820922900361117} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0.8214286, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1462520415884795608} + m_Father: {fileID: 6879237219359362440} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!95 &5065216968979282284 +Animator: + serializedVersion: 3 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2904820922900361117} + m_Enabled: 1 + m_Avatar: {fileID: 0} + m_Controller: {fileID: 9100000, guid: 0668b1912cbbd9841baf495221d8fcbe, type: 2} + m_CullingMode: 0 + m_UpdateMode: 0 + m_ApplyRootMotion: 0 + m_LinearVelocityBlending: 0 + m_WarningMessage: + m_HasTransformHierarchy: 1 + m_AllowConstantClipSamplingOptimization: 1 + m_KeepAnimatorControllerStateOnDisable: 0 +--- !u!114 &6151251985728575842 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2904820922900361117} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3279e585337e95a40b3621073b3c77b1, type: 3} + m_Name: + m_EditorClassIdentifier: + inList: 0 + lastState: 0 + state: + gameObject: {fileID: 0} + early: 0 + perfect: 0 + late: 0 + createBeat: 0 + isEligible: 0 + eligibleHitsList: [] + aceTimes: 0 + createBeat: 0 --- !u!1 &3082739543595333088 GameObject: m_ObjectHideFlags: 0 @@ -739,7 +898,7 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 3684904985109994079} - m_LocalRotation: {x: 0, y: 0, z: -0.5, w: 0.8660254} + m_LocalRotation: {x: 0, y: 0, z: -1, w: 0} m_LocalPosition: {x: 0, y: 3.68, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: @@ -748,7 +907,7 @@ Transform: - {fileID: 4348353426286950626} m_Father: {fileID: 5813499711186931250} m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: -60} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: -180} --- !u!114 &3391455012319192365 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1404,6 +1563,7 @@ MonoBehaviour: VegetableAnimator: {fileID: 3603513546661280919} Tweezers: {fileID: 3391455012319192365} hairBase: {fileID: 4104508031135416673} + longHairBase: {fileID: 2904820922900361117} HairsHolder: {fileID: 2002856028339003249} beatInterval: 4 tweezerBeatOffset: 0 diff --git a/Assets/Resources/Sprites/Games/DJ School/Animations/DJ Yellow/Hold.anim b/Assets/Resources/Sprites/Games/DJ School/Animations/DJ Yellow/Hold.anim index f9e2aeda..d23faf7e 100644 --- a/Assets/Resources/Sprites/Games/DJ School/Animations/DJ Yellow/Hold.anim +++ b/Assets/Resources/Sprites/Games/DJ School/Animations/DJ Yellow/Hold.anim @@ -71,13 +71,6 @@ AnimationClip: classID: 212 script: {fileID: 0} m_PPtrCurves: - - curve: - - time: 0 - value: {fileID: 9103593749776465035, guid: 0df5efc655895e943b8d6771eea1306b, type: 3} - attribute: m_Sprite - path: Head - classID: 212 - script: {fileID: 0} - curve: - time: 0 value: {fileID: -7897984728498327633, guid: 15a4d1a63a113d64ab903fd38f759b6d, type: 3} @@ -110,13 +103,6 @@ AnimationClip: typeID: 212 customType: 0 isPPtrCurve: 0 - - serializedVersion: 2 - path: 130111906 - attribute: 0 - script: {fileID: 0} - typeID: 212 - customType: 23 - isPPtrCurve: 1 - serializedVersion: 2 path: 3869152129 attribute: 0 @@ -125,7 +111,6 @@ AnimationClip: customType: 23 isPPtrCurve: 1 pptrCurveMapping: - - {fileID: 9103593749776465035, guid: 0df5efc655895e943b8d6771eea1306b, type: 3} - {fileID: -7897984728498327633, guid: 15a4d1a63a113d64ab903fd38f759b6d, type: 3} - {fileID: 2300229899535866167, guid: 15a4d1a63a113d64ab903fd38f759b6d, type: 3} - {fileID: 5980989039126267469, guid: 15a4d1a63a113d64ab903fd38f759b6d, type: 3} diff --git a/Assets/Resources/Sprites/Games/DJ School/Animations/DJ Yellow/Scratcho.anim b/Assets/Resources/Sprites/Games/DJ School/Animations/DJ Yellow/Scratcho.anim index a5de7302..51f597aa 100644 --- a/Assets/Resources/Sprites/Games/DJ School/Animations/DJ Yellow/Scratcho.anim +++ b/Assets/Resources/Sprites/Games/DJ School/Animations/DJ Yellow/Scratcho.anim @@ -93,13 +93,6 @@ AnimationClip: path: Torso classID: 212 script: {fileID: 0} - - curve: - - time: 0 - value: {fileID: 9103593749776465035, guid: 0df5efc655895e943b8d6771eea1306b, type: 3} - attribute: m_Sprite - path: Head - classID: 212 - script: {fileID: 0} m_SampleRate: 30 m_WrapMode: 0 m_Bounds: @@ -128,19 +121,11 @@ AnimationClip: typeID: 212 customType: 23 isPPtrCurve: 1 - - serializedVersion: 2 - path: 130111906 - attribute: 0 - script: {fileID: 0} - typeID: 212 - customType: 23 - isPPtrCurve: 1 pptrCurveMapping: - {fileID: -1076822054609707624, guid: 15a4d1a63a113d64ab903fd38f759b6d, type: 3} - {fileID: 8141265415314385592, guid: 15a4d1a63a113d64ab903fd38f759b6d, type: 3} - {fileID: 85121438970637506, guid: 15a4d1a63a113d64ab903fd38f759b6d, type: 3} - {fileID: 5628735845299456583, guid: 15a4d1a63a113d64ab903fd38f759b6d, type: 3} - - {fileID: 9103593749776465035, guid: 0df5efc655895e943b8d6771eea1306b, type: 3} m_AnimationClipSettings: serializedVersion: 2 m_AdditiveReferencePoseClip: {fileID: 0} diff --git a/Assets/Resources/Sprites/Games/DJ School/Animations/DJ Yellow/Scratcho2.anim b/Assets/Resources/Sprites/Games/DJ School/Animations/DJ Yellow/Scratcho2.anim index 5968d3dc..d893f134 100644 --- a/Assets/Resources/Sprites/Games/DJ School/Animations/DJ Yellow/Scratcho2.anim +++ b/Assets/Resources/Sprites/Games/DJ School/Animations/DJ Yellow/Scratcho2.anim @@ -82,13 +82,6 @@ AnimationClip: path: Torso classID: 212 script: {fileID: 0} - - curve: - - time: 0 - value: {fileID: 9103593749776465035, guid: 0df5efc655895e943b8d6771eea1306b, type: 3} - attribute: m_Sprite - path: Head - classID: 212 - script: {fileID: 0} m_SampleRate: 30 m_WrapMode: 0 m_Bounds: @@ -117,18 +110,10 @@ AnimationClip: typeID: 212 customType: 23 isPPtrCurve: 1 - - serializedVersion: 2 - path: 130111906 - attribute: 0 - script: {fileID: 0} - typeID: 212 - customType: 23 - isPPtrCurve: 1 pptrCurveMapping: - {fileID: 85121438970637506, guid: 15a4d1a63a113d64ab903fd38f759b6d, type: 3} - {fileID: 8141265415314385592, guid: 15a4d1a63a113d64ab903fd38f759b6d, type: 3} - {fileID: -1076822054609707624, guid: 15a4d1a63a113d64ab903fd38f759b6d, type: 3} - - {fileID: 9103593749776465035, guid: 0df5efc655895e943b8d6771eea1306b, type: 3} m_AnimationClipSettings: serializedVersion: 2 m_AdditiveReferencePoseClip: {fileID: 0} diff --git a/Assets/Scripts/Games/RhythmTweezers/LongHair.cs b/Assets/Scripts/Games/RhythmTweezers/LongHair.cs new file mode 100644 index 00000000..b30533f3 --- /dev/null +++ b/Assets/Scripts/Games/RhythmTweezers/LongHair.cs @@ -0,0 +1,40 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace RhythmHeavenMania.Games.RhythmTweezers +{ + public class LongHair : PlayerActionObject + { + public float createBeat; + private RhythmTweezers game; + private Tweezers tweezers; + + private void Awake() + { + game = RhythmTweezers.instance; + tweezers = game.Tweezers; + } + + private void Update() + { + float stateBeat = Conductor.instance.GetPositionFromBeat(createBeat + game.tweezerBeatOffset, game.beatInterval); + StateCheck(stateBeat); + + if (PlayerInput.Pressed() && tweezers.hitOnFrame == 0) + { + if (state.perfect) + { + Ace(); + } + } + } + + public void Ace() + { + tweezers.LongPluck(true, this); + + tweezers.hitOnFrame++; + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/Games/RhythmTweezers/LongHair.cs.meta b/Assets/Scripts/Games/RhythmTweezers/LongHair.cs.meta new file mode 100644 index 00000000..47bfa78f --- /dev/null +++ b/Assets/Scripts/Games/RhythmTweezers/LongHair.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3279e585337e95a40b3621073b3c77b1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Games/RhythmTweezers/RhythmTweezers.cs b/Assets/Scripts/Games/RhythmTweezers/RhythmTweezers.cs index 444c1cd9..acb0e485 100644 --- a/Assets/Scripts/Games/RhythmTweezers/RhythmTweezers.cs +++ b/Assets/Scripts/Games/RhythmTweezers/RhythmTweezers.cs @@ -17,6 +17,7 @@ namespace RhythmHeavenMania.Games.RhythmTweezers public Animator VegetableAnimator; public Tweezers Tweezers; public GameObject hairBase; + public GameObject longHairBase; [SerializeField] private GameObject HairsHolder; [NonSerialized] public int hairsLeft = 0; @@ -57,6 +58,25 @@ namespace RhythmHeavenMania.Games.RhythmTweezers hairsLeft++; } + public void SpawnLongHair(float beat) + { + StopTransitionIfActive(); + + if (!intervalStarted) + { + SetIntervalStart(beat, beatInterval); + } + + Jukebox.PlayOneShotGame("rhythmTweezers/longAppear", beat); + LongHair hair = Instantiate(longHairBase, HairsHolder.transform).GetComponent(); + hair.gameObject.SetActive(true); + + float rot = -58f + 116 * Mathp.Normalize(beat, intervalStartBeat, intervalStartBeat + beatInterval - 1f); + hair.transform.eulerAngles = new Vector3(0, 0, rot); + hair.createBeat = beat; + hairsLeft++; + } + public void SetIntervalStart(float beat, float interval = 4f) { // End transition early if the interval starts a lil early. diff --git a/Assets/Scripts/Games/RhythmTweezers/Tweezers.cs b/Assets/Scripts/Games/RhythmTweezers/Tweezers.cs index 7b3259e9..8f910b64 100644 --- a/Assets/Scripts/Games/RhythmTweezers/Tweezers.cs +++ b/Assets/Scripts/Games/RhythmTweezers/Tweezers.cs @@ -11,11 +11,14 @@ namespace RhythmHeavenMania.Games.RhythmTweezers public int hitOnFrame; private Animator anim; private Animator vegetableAnim; + private RhythmTweezers game; private void Start() { anim = GetComponent(); vegetableAnim = RhythmTweezers.instance.VegetableAnimator; + + game = RhythmTweezers.instance; } private void LateUpdate() @@ -35,8 +38,6 @@ namespace RhythmHeavenMania.Games.RhythmTweezers if (ace) { - var game = RhythmTweezers.instance; - Jukebox.PlayOneShotGame($"rhythmTweezers/shortPluck{Random.Range(1, 21)}"); Destroy(hair.gameObject); @@ -48,5 +49,24 @@ namespace RhythmHeavenMania.Games.RhythmTweezers vegetableAnim.Play("Hop", 0, 0); } } + + public void LongPluck(bool ace, LongHair hair) + { + anim.Play("Tweezers_Pluck", 0, 0); + + if (hitOnFrame > 0) return; + + if (ace) + { + float beat = Conductor.instance.songPositionInBeats; + MultiSound.Play(new MultiSound.Sound[] + { + new MultiSound.Sound($"rhythmTweezers/longPull{Random.Range(1, 5)}", beat), + new MultiSound.Sound("rhythmTweezers/longPullEnd", beat + 0.5f), + }); + + Destroy(hair.gameObject); + } + } } } \ No newline at end of file diff --git a/Assets/Scripts/Minigames.cs b/Assets/Scripts/Minigames.cs index e570dbe3..30712c50 100644 --- a/Assets/Scripts/Minigames.cs +++ b/Assets/Scripts/Minigames.cs @@ -78,10 +78,10 @@ namespace RhythmHeavenMania { new Minigame("gameManager", "Game Manager", "", false, true, new List() { - new GameAction("switchGame", delegate { GameManager.instance.SwitchGame(eventCaller.currentSwitchGame); }, 0.5f), - new GameAction("end", delegate { Debug.Log("end"); }), - new GameAction("skill star", delegate { }, 1f, true), - new GameAction("flash", delegate + new GameAction("switchGame", delegate { GameManager.instance.SwitchGame(eventCaller.currentSwitchGame); }, 0.5f), + new GameAction("end", delegate { Debug.Log("end"); }), + new GameAction("skill star", delegate { }, 1f, true), + new GameAction("flash", delegate { /*Color colA = eventCaller.currentEntity.colorA; @@ -103,19 +103,19 @@ namespace RhythmHeavenMania }), new Minigame("countIn", "Count-Ins", "", false, true, new List() { - new GameAction("cowbell", delegate { Jukebox.PlayOneShot("count-ins/cowbell"); }, 1f), - new GameAction("one", delegate { Jukebox.PlayOneShot("count-ins/one1"); }, 1f), - new GameAction("one (alt)", delegate { Jukebox.PlayOneShot("count-ins/one2"); }, 1f), - new GameAction("two", delegate { Jukebox.PlayOneShot("count-ins/two1"); }, 1f), - new GameAction("two (alt)", delegate { Jukebox.PlayOneShot("count-ins/two2"); }, 1f), - new GameAction("three", delegate { Jukebox.PlayOneShot("count-ins/three1"); }, 1f), - new GameAction("three (alt)", delegate { Jukebox.PlayOneShot("count-ins/three2"); }, 1f), - new GameAction("four", delegate { Jukebox.PlayOneShot("count-ins/four1"); }, 1f), - new GameAction("four (alt)", delegate { Jukebox.PlayOneShot("count-ins/four2"); }, 1f), - new GameAction("and", delegate { Jukebox.PlayOneShot("count-ins/and"); }, 0.5f), - new GameAction("go!", delegate { Jukebox.PlayOneShot("count-ins/go1"); }, 1f), - new GameAction("go! (alt)", delegate { Jukebox.PlayOneShot("count-ins/go2"); }, 1f), - new GameAction("ready!", delegate + new GameAction("cowbell", delegate { Jukebox.PlayOneShot("count-ins/cowbell"); }, 1f), + new GameAction("one", delegate { Jukebox.PlayOneShot("count-ins/one1"); }, 1f), + new GameAction("one (alt)", delegate { Jukebox.PlayOneShot("count-ins/one2"); }, 1f), + new GameAction("two", delegate { Jukebox.PlayOneShot("count-ins/two1"); }, 1f), + new GameAction("two (alt)", delegate { Jukebox.PlayOneShot("count-ins/two2"); }, 1f), + new GameAction("three", delegate { Jukebox.PlayOneShot("count-ins/three1"); }, 1f), + new GameAction("three (alt)", delegate { Jukebox.PlayOneShot("count-ins/three2"); }, 1f), + new GameAction("four", delegate { Jukebox.PlayOneShot("count-ins/four1"); }, 1f), + new GameAction("four (alt)", delegate { Jukebox.PlayOneShot("count-ins/four2"); }, 1f), + new GameAction("and", delegate { Jukebox.PlayOneShot("count-ins/and"); }, 0.5f), + new GameAction("go!", delegate { Jukebox.PlayOneShot("count-ins/go1"); }, 1f), + new GameAction("go! (alt)", delegate { Jukebox.PlayOneShot("count-ins/go2"); }, 1f), + new GameAction("ready!", delegate { MultiSound.Play(new MultiSound.Sound[] { @@ -126,82 +126,83 @@ namespace RhythmHeavenMania }), new Minigame("forkLifter", "Fork Lifter", "FFFFFF", false, false, new List() { - new GameAction("pea", delegate { ForkLifter.instance.Flick(eventCaller.currentEntity.beat, 0); }, 3), - new GameAction("topbun", delegate { ForkLifter.instance.Flick(eventCaller.currentEntity.beat, 1); }, 3), - new GameAction("burger", delegate { ForkLifter.instance.Flick(eventCaller.currentEntity.beat, 2); }, 3), - new GameAction("bottombun", delegate { ForkLifter.instance.Flick(eventCaller.currentEntity.beat, 3); }, 3), - new GameAction("prepare", delegate { ForkLifter.instance.ForkLifterHand.Prepare(); }, 0.5f), - new GameAction("gulp", delegate { ForkLifterPlayer.instance.Eat(); }), - new GameAction("sigh", delegate { Jukebox.PlayOneShot("sigh"); }) + new GameAction("pea", delegate { ForkLifter.instance.Flick(eventCaller.currentEntity.beat, 0); }, 3), + new GameAction("topbun", delegate { ForkLifter.instance.Flick(eventCaller.currentEntity.beat, 1); }, 3), + new GameAction("burger", delegate { ForkLifter.instance.Flick(eventCaller.currentEntity.beat, 2); }, 3), + new GameAction("bottombun", delegate { ForkLifter.instance.Flick(eventCaller.currentEntity.beat, 3); }, 3), + new GameAction("prepare", delegate { ForkLifter.instance.ForkLifterHand.Prepare(); }, 0.5f), + new GameAction("gulp", delegate { ForkLifterPlayer.instance.Eat(); }), + new GameAction("sigh", delegate { Jukebox.PlayOneShot("sigh"); }) }), new Minigame("clappyTrio", "The Clappy Trio", "29E7FF", false, false, new List() { - new GameAction("clap", delegate { ClappyTrio.instance.Clap(eventCaller.currentEntity.beat, eventCaller.currentEntity.length); }, 3, true), - new GameAction("bop", delegate { ClappyTrio.instance.Bop(eventCaller.currentEntity.beat); } ), - new GameAction("prepare", delegate { ClappyTrio.instance.Prepare(0); } ), - new GameAction("prepare_alt", delegate { ClappyTrio.instance.Prepare(3); } ), + new GameAction("clap", delegate { ClappyTrio.instance.Clap(eventCaller.currentEntity.beat, eventCaller.currentEntity.length); }, 3, true), + new GameAction("bop", delegate { ClappyTrio.instance.Bop(eventCaller.currentEntity.beat); } ), + new GameAction("prepare", delegate { ClappyTrio.instance.Prepare(0); } ), + new GameAction("prepare_alt", delegate { ClappyTrio.instance.Prepare(3); } ), }), new Minigame("spaceball", "Spaceball", "00A518", false, false, new List() { - new GameAction("shoot", delegate { Spaceball.instance.Shoot(eventCaller.currentEntity.beat, false, eventCaller.currentEntity.type); }, 2, false), - new GameAction("shootHigh", delegate { Spaceball.instance.Shoot(eventCaller.currentEntity.beat, true, eventCaller.currentEntity.type); }, 3), - new GameAction("costume", delegate { Spaceball.instance.Costume(eventCaller.currentEntity.type); }, 1f, false, new List() + new GameAction("shoot", delegate { Spaceball.instance.Shoot(eventCaller.currentEntity.beat, false, eventCaller.currentEntity.type); }, 2, false), + new GameAction("shootHigh", delegate { Spaceball.instance.Shoot(eventCaller.currentEntity.beat, true, eventCaller.currentEntity.type); }, 3), + new GameAction("costume", delegate { Spaceball.instance.Costume(eventCaller.currentEntity.type); }, 1f, false, new List() { new Param("type", new EntityTypes.Integer(0, 2), "Type") } ), - new GameAction("alien", delegate { Spaceball.instance.alien.Show(eventCaller.currentEntity.beat); } ), - new GameAction("camera", delegate { Spaceball.instance.OverrideCurrentZoom(); }, 4, true, new List() + new GameAction("alien", delegate { Spaceball.instance.alien.Show(eventCaller.currentEntity.beat); } ), + new GameAction("camera", delegate { Spaceball.instance.OverrideCurrentZoom(); }, 4, true, new List() { new Param("valA", new EntityTypes.Integer(1, 320, 10), "Zoom"), new Param("ease", EasingFunction.Ease.Linear, "Ease") } ), - new GameAction("prepare dispenser", delegate { Spaceball.instance.PrepareDispenser(); }, 1 ), + new GameAction("prepare dispenser", delegate { Spaceball.instance.PrepareDispenser(); }, 1 ), }), new Minigame("karateman", "Karate Man", "70A8D8", false, false, new List() { - new GameAction("bop", delegate { KarateMan.instance.Bop(eventCaller.currentEntity.beat, eventCaller.currentEntity.length); }, 0.5f, true), - new GameAction("pot", delegate { KarateMan.instance.Shoot(eventCaller.currentEntity.beat, 0); }, 2), - new GameAction("bulb", delegate { KarateMan.instance.Shoot(eventCaller.currentEntity.beat, 1); }, 2), - new GameAction("rock", delegate { KarateMan.instance.Shoot(eventCaller.currentEntity.beat, 2); }, 2), - new GameAction("ball", delegate { KarateMan.instance.Shoot(eventCaller.currentEntity.beat, 3); }, 2), - new GameAction("kick", delegate { KarateMan.instance.Shoot(eventCaller.currentEntity.beat, 4); }, 4.5f), - new GameAction("combo", delegate { KarateMan.instance.Combo(eventCaller.currentEntity.beat); }, 4f), - new GameAction("hit3", delegate { KarateMan.instance.Hit3(eventCaller.currentEntity.beat); }), - new GameAction("hit4", delegate { KarateMan.instance.Hit4(eventCaller.currentEntity.beat); }), - new GameAction("prepare", delegate { KarateMan.instance.Prepare(eventCaller.currentEntity.beat, eventCaller.currentEntity.length); }, 1f, true), - new GameAction("bgfxon", delegate { KarateMan.instance.BGFXOn(); } ), - new GameAction("bgfxoff", delegate { KarateMan.instance.BGFXOff(); }), - new GameAction("tacobell", delegate { KarateMan.instance.Shoot(eventCaller.currentEntity.beat, 6); }, 2), + new GameAction("bop", delegate { KarateMan.instance.Bop(eventCaller.currentEntity.beat, eventCaller.currentEntity.length); }, 0.5f, true), + new GameAction("pot", delegate { KarateMan.instance.Shoot(eventCaller.currentEntity.beat, 0); }, 2), + new GameAction("bulb", delegate { KarateMan.instance.Shoot(eventCaller.currentEntity.beat, 1); }, 2), + new GameAction("rock", delegate { KarateMan.instance.Shoot(eventCaller.currentEntity.beat, 2); }, 2), + new GameAction("ball", delegate { KarateMan.instance.Shoot(eventCaller.currentEntity.beat, 3); }, 2), + new GameAction("kick", delegate { KarateMan.instance.Shoot(eventCaller.currentEntity.beat, 4); }, 4.5f), + new GameAction("combo", delegate { KarateMan.instance.Combo(eventCaller.currentEntity.beat); }, 4f), + new GameAction("hit3", delegate { KarateMan.instance.Hit3(eventCaller.currentEntity.beat); }), + new GameAction("hit4", delegate { KarateMan.instance.Hit4(eventCaller.currentEntity.beat); }), + new GameAction("prepare", delegate { KarateMan.instance.Prepare(eventCaller.currentEntity.beat, eventCaller.currentEntity.length); }, 1f, true), + new GameAction("bgfxon", delegate { KarateMan.instance.BGFXOn(); } ), + new GameAction("bgfxoff", delegate { KarateMan.instance.BGFXOff(); }), + new GameAction("tacobell", delegate { KarateMan.instance.Shoot(eventCaller.currentEntity.beat, 6); }, 2), }), new Minigame("spaceSoccer", "Space Soccer", "B888F8", false, false, new List() { - new GameAction("ball dispense", delegate { SpaceSoccer.instance.Dispense(eventCaller.currentEntity.beat); }, 2f), - new GameAction("keep-up", delegate { }, 4f, true), - new GameAction("high kick-toe!", delegate { }, 3f, false, new List() + new GameAction("ball dispense", delegate { SpaceSoccer.instance.Dispense(eventCaller.currentEntity.beat); }, 2f), + new GameAction("keep-up", delegate { }, 4f, true), + new GameAction("high kick-toe!", delegate { }, 3f, false, new List() { new Param("valA", new EntityTypes.Float(0, 1), "Swing") }), }), new Minigame("djSchool", "DJ School \n[Non-Playable]", "008c97", false, false, new List() { - new GameAction("bop", delegate { DJSchool.instance.Bop(eventCaller.currentEntity.beat, eventCaller.currentEntity.length); }, 0.5f, true), - new GameAction("and stop ooh", delegate { DJSchool.instance.AndStop(eventCaller.currentEntity.beat); }, 2.5f), - new GameAction("break c'mon ooh", delegate { DJSchool.instance.BreakCmon(eventCaller.currentEntity.beat, eventCaller.currentEntity.type); }, 3f, false, new List() + new GameAction("bop", delegate { DJSchool.instance.Bop(eventCaller.currentEntity.beat, eventCaller.currentEntity.length); }, 0.5f, true), + new GameAction("and stop ooh", delegate { DJSchool.instance.AndStop(eventCaller.currentEntity.beat); }, 2.5f), + new GameAction("break c'mon ooh", delegate { DJSchool.instance.BreakCmon(eventCaller.currentEntity.beat, eventCaller.currentEntity.type); }, 3f, false, new List() { new Param("type", new EntityTypes.Integer(0, 2, 0), "Type"), }), - new GameAction("scratch-o hey", delegate { DJSchool.instance.ScratchoHey(eventCaller.currentEntity.beat, eventCaller.currentEntity.type); }, 3f, false, new List() + new GameAction("scratch-o hey", delegate { DJSchool.instance.ScratchoHey(eventCaller.currentEntity.beat, eventCaller.currentEntity.type); }, 3f, false, new List() { new Param("type", new EntityTypes.Integer(0, 2, 0), "Type"), }), }), new Minigame("rhythmTweezers", "Rhythm Tweezers \n[WIP don't use]", "98b389", false, false, new List() { - new GameAction("start interval", delegate { RhythmTweezers.instance.SetIntervalStart(eventCaller.currentEntity.beat, eventCaller.currentEntity.length); }, 4f, true), - new GameAction("short hair", delegate { RhythmTweezers.instance.SpawnHair(eventCaller.currentEntity.beat); }, 0.5f), - new GameAction("next vegetable", delegate { RhythmTweezers.instance.NextVegetable(eventCaller.currentEntity.beat); }, 0.5f), + new GameAction("start interval", delegate { RhythmTweezers.instance.SetIntervalStart(eventCaller.currentEntity.beat, eventCaller.currentEntity.length); }, 4f, true), + new GameAction("short hair", delegate { RhythmTweezers.instance.SpawnHair(eventCaller.currentEntity.beat); }, 0.5f), + new GameAction("long hair", delegate { RhythmTweezers.instance.SpawnLongHair(eventCaller.currentEntity.beat); }, 0.5f), + new GameAction("next vegetable", delegate { RhythmTweezers.instance.NextVegetable(eventCaller.currentEntity.beat); }, 0.5f), new GameAction("set tweezer delay", delegate { RhythmTweezers.instance.tweezerBeatOffset = eventCaller.currentEntity.length; }, 1f, true), - new GameAction("reset tweezer delay", delegate { RhythmTweezers.instance.tweezerBeatOffset = 0f; }, 0.5f), + new GameAction("reset tweezer delay", delegate { RhythmTweezers.instance.tweezerBeatOffset = 0f; }, 0.5f), }), /* new Minigame("rhythmRally", "Rhythm Rally", "B888F8", true, false, new List()