From 0e7917e79990c7e158a5d2d864799d20f6857c9e Mon Sep 17 00:00:00 2001 From: minenice55 Date: Wed, 13 Dec 2023 23:47:33 -0500 Subject: [PATCH] finish category system --- .../Prefabs/GameView/CamerasGame.prefab | 343 ++++++++++++------ Assets/Resources/Sfx/count-ins/cowbell.ogg | Bin 11687 -> 0 bytes Assets/Resources/Sfx/count-ins/cowbell.wav | Bin 0 -> 35360 bytes .../{cowbell.ogg.meta => cowbell.wav.meta} | 2 +- Assets/Scenes/Editor.unity | 36 +- Assets/Scenes/Game.unity | 2 +- Assets/Scenes/Judgement.unity | 153 +++++++- Assets/Scripts/GameManager.cs | 12 +- Assets/Scripts/GlobalGameManager.cs | 2 +- Assets/Scripts/JudgementManager.cs | 267 ++++++++++++-- .../NumberChartPropertyPrefab.cs | 12 - .../RatingScreenPropertyDialog.cs | 103 +++++- .../StringChartPropertyPrefab.cs | 5 - .../RemixPropertiesDialog.cs | 2 + .../Scripts/LevelEditor/Timeline/Timeline.cs | 1 + 15 files changed, 736 insertions(+), 204 deletions(-) delete mode 100644 Assets/Resources/Sfx/count-ins/cowbell.ogg create mode 100644 Assets/Resources/Sfx/count-ins/cowbell.wav rename Assets/Resources/Sfx/count-ins/{cowbell.ogg.meta => cowbell.wav.meta} (91%) diff --git a/Assets/Resources/Prefabs/GameView/CamerasGame.prefab b/Assets/Resources/Prefabs/GameView/CamerasGame.prefab index 999fdb63e..ae977d4b9 100644 --- a/Assets/Resources/Prefabs/GameView/CamerasGame.prefab +++ b/Assets/Resources/Prefabs/GameView/CamerasGame.prefab @@ -681,7 +681,7 @@ Transform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 6234653029009288364} - m_RootOrder: 5 + m_RootOrder: 6 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &3901862248944335408 MonoBehaviour: @@ -878,6 +878,7 @@ GameObject: - component: {fileID: 1168123228960484818} - component: {fileID: 1574772130180899299} - component: {fileID: 974770566238864437} + - component: {fileID: 7654832573267263516} m_Layer: 31 m_Name: GameView m_TagString: Untagged @@ -940,6 +941,18 @@ MonoBehaviour: y: 0 width: 1 height: 1 +--- !u!114 &7654832573267263516 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2832441949350437337} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d556607141c07af40b1b5ee71c28c5a6, type: 3} + m_Name: + m_EditorClassIdentifier: --- !u!1 &3498225866970293299 GameObject: m_ObjectHideFlags: 0 @@ -1169,6 +1182,68 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 221.5 +--- !u!1 &4378940007735271137 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8911262839428776692} + - component: {fileID: 4066285641915621701} + - component: {fileID: 7781529375355758868} + m_Layer: 21 + m_Name: PPVolume + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &8911262839428776692 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4378940007735271137} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 6234653029009288364} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &4066285641915621701 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4378940007735271137} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 8b9a305e18de0c04dbd257a21cd47087, type: 3} + m_Name: + m_EditorClassIdentifier: + sharedProfile: {fileID: 11400000, guid: b51cceebf153b484cb3ae8addf344bb3, type: 2} + isGlobal: 1 + blendDistance: 0 + weight: 1 + priority: 0 +--- !u!114 &7781529375355758868 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4378940007735271137} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e3cc0a4bae0c56540b9f598f4644539c, type: 3} + m_Name: + m_EditorClassIdentifier: --- !u!1 &4548882026653333708 GameObject: m_ObjectHideFlags: 0 @@ -1384,6 +1459,168 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 +--- !u!1 &5009365359458460369 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1049730448508550528} + - component: {fileID: 2170325723817611015} + - component: {fileID: 3655910237903630935} + - component: {fileID: 4529662476191353454} + - component: {fileID: 907286915261741163} + m_Layer: 0 + m_Name: Main Camera + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1049730448508550528 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5009365359458460369} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 6234653029009288364} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!20 &2170325723817611015 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5009365359458460369} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 2 + m_BackGroundColor: {r: 0, g: 0, b: 0, a: 1} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.01 + far clip plane: 1000 + field of view: 53.15 + orthographic: 0 + orthographic size: 5 + m_Depth: 99 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4631 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 8400000, guid: da1c23fc8a9167c438d0d771189a6157, type: 2} + m_TargetDisplay: 0 + m_TargetEye: 0 + m_HDR: 0 + m_AllowMSAA: 0 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 0 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!81 &3655910237903630935 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5009365359458460369} + m_Enabled: 1 +--- !u!114 &4529662476191353454 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5009365359458460369} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a774f8053d895604cb8ded8c46de6733, type: 3} + m_Name: + m_EditorClassIdentifier: + camera: {fileID: 2170325723817611015} + baseColor: {r: 0, g: 0, b: 0, a: 1} +--- !u!114 &907286915261741163 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5009365359458460369} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 948f4100a11a5c24981795d21301da5c, type: 3} + m_Name: + m_EditorClassIdentifier: + volumeTrigger: {fileID: 1049730448508550528} + volumeLayer: + serializedVersion: 2 + m_Bits: 2097152 + stopNaNPropagation: 1 + finalBlitToCameraTarget: 0 + antialiasingMode: 0 + temporalAntialiasing: + jitterSpread: 0.75 + sharpness: 0.25 + stationaryBlending: 0.95 + motionBlending: 0.85 + subpixelMorphologicalAntialiasing: + quality: 2 + fastApproximateAntialiasing: + fastMode: 0 + keepAlpha: 0 + fog: + enabled: 1 + excludeSkybox: 1 + debugLayer: + lightMeter: + width: 512 + height: 256 + showCurves: 1 + histogram: + width: 512 + height: 256 + channel: 3 + waveform: + exposure: 0.12 + height: 256 + vectorscope: + size: 256 + exposure: 0.12 + overlaySettings: + linearDepth: 0 + motionColorIntensity: 4 + motionGridSize: 64 + colorBlindnessType: 0 + colorBlindnessStrength: 1 + m_Resources: {fileID: 11400000, guid: d82512f9c8e5d4a4d938b575d47f88d4, type: 2} + m_ShowToolkit: 0 + m_ShowCustomSorter: 0 + breakBeforeColorGrading: 0 + m_BeforeTransparentBundles: [] + m_BeforeStackBundles: + - assemblyQualifiedName: PostProcessOutline, Assembly-CSharp, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_AfterStackBundles: [] --- !u!1 &5530727079185901299 GameObject: m_ObjectHideFlags: 0 @@ -1735,105 +1972,6 @@ Camera: m_OcclusionCulling: 0 m_StereoConvergence: 10 m_StereoSeparation: 0.022 ---- !u!1 &6234653028453841298 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 6234653028453841262} - - component: {fileID: 6234653028453841297} - - component: {fileID: 6234653028453841299} - - component: {fileID: 4269444482100919274} - m_Layer: 0 - m_Name: Main Camera - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &6234653028453841262 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6234653028453841298} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: -10} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 6234653029009288364} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!20 &6234653028453841297 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6234653028453841298} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 2 - m_BackGroundColor: {r: 0, g: 0, b: 0, a: 1} - m_projectionMatrixMode: 1 - m_GateFitMode: 2 - m_FOVAxisMode: 0 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.01 - far clip plane: 1000 - field of view: 53.15 - orthographic: 0 - orthographic size: 5 - m_Depth: 99 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4631 - m_RenderingPath: -1 - m_TargetTexture: {fileID: 8400000, guid: da1c23fc8a9167c438d0d771189a6157, type: 2} - m_TargetDisplay: 0 - m_TargetEye: 0 - m_HDR: 0 - m_AllowMSAA: 0 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 0 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!81 &6234653028453841299 -AudioListener: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6234653028453841298} - m_Enabled: 1 ---- !u!114 &4269444482100919274 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6234653028453841298} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: a774f8053d895604cb8ded8c46de6733, type: 3} - m_Name: - m_EditorClassIdentifier: - camera: {fileID: 6234653028453841297} - baseColor: {r: 0, g: 0, b: 0, a: 1} --- !u!1 &6234653029009288367 GameObject: m_ObjectHideFlags: 0 @@ -1862,11 +2000,12 @@ Transform: m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 6234653028453841262} + - {fileID: 1049730448508550528} - {fileID: 6234653028281991656} - {fileID: 1942359490671534657} - {fileID: 4590016237509569025} - {fileID: 1850376182743320724} + - {fileID: 8911262839428776692} - {fileID: 3598754111961318833} - {fileID: 1590694521260573583} m_Father: {fileID: 0} @@ -2703,7 +2842,7 @@ RectTransform: m_Children: - {fileID: 657067078569207446} m_Father: {fileID: 6234653029009288364} - m_RootOrder: 6 + m_RootOrder: 7 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} diff --git a/Assets/Resources/Sfx/count-ins/cowbell.ogg b/Assets/Resources/Sfx/count-ins/cowbell.ogg deleted file mode 100644 index 471a287241204342c95b13b5cf71af7e32dbf325..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11687 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

|=CW^l5{ zp4Qil%pl1Jnvw2_W`Y?xM{A+P&LoKEEEL~NTXI2jB}1k;t#3^p2vZa;l0@BC`^Cio zL3enJ77-~G6_}=VA^JpTVJJCZ!KJP}t%e5yZ3r632R^ob z(X%9w7|4zC`Rc1~bAJFr^%Uud{8mb@ z%WnQ&L~W+<}@PncnY` z^r-QL`E3OJC&WC?;akA=`I@0K`2Cxu0$??Sx`uXU$J}CS03*8r#v`tR(3}(>7(?Be zoXOk%J|u-!tKjg|obl2}F?KSUJ(TZZX|bT;RLzsbUtGJLliB+}*AA&Oubg=NvqM`p zTrM!)QBO!%T2JMyYuiAhvY=&8Vlz{e$uO7A5u^Z|8&>2Axo?y5D8>xb%?^8jcE!o& z2$TeWfTCf9xXF9dAX9V^6$n4g4VV^gB9%U$VX{=y84+bo47djGzM{r(1SOHEC(aFo za}m54spGGysmggK+0a!1ila}8hP8%1{Hsz(xGpyLFSh@3peU=%WW zrT~<@kb%e+*D6D+#h6{WNHbZnNg_nSpo;`dc>zOaASg2!8yBSkH#>y~j2XzRIg`SW zP~p|X=EB5#91C;R(@csqWO!(pg>oOw=%TFJun?x$U@M!E;wdvEmn6cEl7=WFA614% zxR5m2fB{~EEQKJHFnXgu5;4fat6>z-Z7|r1?eYVQKpId!*K8)3Wr%+l^8hELoF0e; zks1+UjcUSOEiO_32Kr}lwy7Js&2qF@UrP2U$B`iF{lH`_Opf%ELtWA|4W5HT;} z%*Y=8K)boOo!i3?#{mrh@WcU(SYUrMGPsb9!~X$>Ngnv(!bbsW*KzD9v-`4n;qdc{ z$49>)gLzNp*mI-Diyx;Pd=4EwZpMCIxqa*{OSd1|I1fU57oz^0_t*J54adVI%RYVg z=|zlPCo=OBA0xQL^E=B2IlY#bK;ov*{UX18qQ%Tnc_4|0n~xW-eB{{zn2mE0Rojg} N`Ewrg=PkD>{|Cw0GAIB5 diff --git a/Assets/Resources/Sfx/count-ins/cowbell.wav b/Assets/Resources/Sfx/count-ins/cowbell.wav new file mode 100644 index 0000000000000000000000000000000000000000..8fdde677f4126d10a776be7edec02b49dcd2f203 GIT binary patch literal 35360 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 GbmV_WRj!Tz literal 0 HcmV?d00001 diff --git a/Assets/Resources/Sfx/count-ins/cowbell.ogg.meta b/Assets/Resources/Sfx/count-ins/cowbell.wav.meta similarity index 91% rename from Assets/Resources/Sfx/count-ins/cowbell.ogg.meta rename to Assets/Resources/Sfx/count-ins/cowbell.wav.meta index 72210a497..3bcfc64ec 100644 --- a/Assets/Resources/Sfx/count-ins/cowbell.ogg.meta +++ b/Assets/Resources/Sfx/count-ins/cowbell.wav.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 9c54cb8099a017249a30a903648a3bda +guid: f5fbb1f743d01f24d96613dc6da68f30 AudioImporter: externalObjects: {} serializedVersion: 6 diff --git a/Assets/Scenes/Editor.unity b/Assets/Scenes/Editor.unity index 346c9eec9..2a40ec54a 100644 --- a/Assets/Scenes/Editor.unity +++ b/Assets/Scenes/Editor.unity @@ -551,9 +551,9 @@ RectTransform: m_Father: {fileID: 574002313} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 0, y: -21} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 32, y: 32} m_Pivot: {x: 0, y: 0.5} --- !u!114 &9435782 @@ -4154,9 +4154,9 @@ RectTransform: m_Father: {fileID: 539838476} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 32, y: -21} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 32, y: 32} m_Pivot: {x: 1, y: 0.5} --- !u!114 &121871281 @@ -4378,9 +4378,9 @@ RectTransform: m_Father: {fileID: 539838476} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 72, y: -21} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 32, y: 32} m_Pivot: {x: 1, y: 0.5} --- !u!114 &129013734 @@ -4514,9 +4514,9 @@ RectTransform: m_Father: {fileID: 539838476} m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 112, y: -21} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 32, y: 32} m_Pivot: {x: 1, y: 0.5} --- !u!114 &151246938 @@ -33916,9 +33916,9 @@ RectTransform: m_Father: {fileID: 574002313} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 40, y: -21} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 32, y: 32} m_Pivot: {x: 0, y: 0.5} --- !u!114 &1345846031 @@ -43459,9 +43459,9 @@ RectTransform: m_Father: {fileID: 574002313} m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 80, y: -21} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 32, y: 32} m_Pivot: {x: 0, y: 0.5} --- !u!114 &1783491359 diff --git a/Assets/Scenes/Game.unity b/Assets/Scenes/Game.unity index dee4d0f19..ff6c5b02a 100644 --- a/Assets/Scenes/Game.unity +++ b/Assets/Scenes/Game.unity @@ -377,7 +377,7 @@ GameObject: m_PrefabAsset: {fileID: 0} --- !u!1 &348185267 stripped GameObject: - m_CorrespondingSourceObject: {fileID: 6234653028453841298, guid: 75ce9c0b59ff27f46a011e0cafc17fb3, type: 3} + m_CorrespondingSourceObject: {fileID: 5009365359458460369, guid: 75ce9c0b59ff27f46a011e0cafc17fb3, type: 3} m_PrefabInstance: {fileID: 348185263} m_PrefabAsset: {fileID: 0} --- !u!1 &348185268 stripped diff --git a/Assets/Scenes/Judgement.unity b/Assets/Scenes/Judgement.unity index ea7ab99ae..09f0d686a 100644 --- a/Assets/Scenes/Judgement.unity +++ b/Assets/Scenes/Judgement.unity @@ -518,7 +518,7 @@ ParticleSystemRenderer: m_MeshWeighting1: 1 m_MeshWeighting2: 1 m_MeshWeighting3: 1 - m_MaskInteraction: 0 + m_MaskInteraction: 2 --- !u!198 &136506958 ParticleSystem: m_ObjectHideFlags: 0 @@ -5393,7 +5393,7 @@ ParticleSystemRenderer: m_MeshWeighting1: 1 m_MeshWeighting2: 1 m_MeshWeighting3: 1 - m_MaskInteraction: 0 + m_MaskInteraction: 2 --- !u!198 &230967138 ParticleSystem: m_ObjectHideFlags: 0 @@ -10394,7 +10394,10 @@ MonoBehaviour: epilogueFitter: {fileID: 780969119} bg: {fileID: 272774269} rankLogo: {fileID: 1569344340} + justOk: {fileID: 921777198} rankAnim: {fileID: 1569344344} + okParticles1: {fileID: 136506958} + okParticles2: {fileID: 230967138} scaler: {fileID: 1200697281} canvasAnim: {fileID: 1200697284} --- !u!320 &560605780 @@ -11073,7 +11076,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 432, y: 48} + m_AnchoredPosition: {x: 512, y: 48} m_SizeDelta: {x: 632, y: 184} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &906704162 @@ -11127,6 +11130,143 @@ MonoBehaviour: m_OnValueChanged: m_PersistentCalls: m_Calls: [] +--- !u!1 &921777196 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 921777197} + - component: {fileID: 921777199} + - component: {fileID: 921777198} + m_Layer: 5 + m_Name: JustOk + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &921777197 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 921777196} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1569344341} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: -12, y: 12} + m_SizeDelta: {x: 256, y: 50} + m_Pivot: {x: 0.5, y: 0} +--- !u!114 &921777198 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 921777196} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: ...but, just + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8597c35f18a008c428fc5870aec75766, type: 2} + m_sharedMaterial: {fileID: 2100000, guid: fa00f193fe038984592034ad7d5c2a42, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 28 + m_fontSizeBase: 28 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_TextWrappingMode: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 0 + m_ActiveFontFeatures: 6e72656b + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_EmojiFallbackSupport: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &921777199 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 921777196} + m_CullTransparentMesh: 1 --- !u!1 &989164489 GameObject: m_ObjectHideFlags: 0 @@ -11678,7 +11818,7 @@ GameObject: - component: {fileID: 1569344342} - component: {fileID: 1569344344} m_Layer: 5 - m_Name: JudgementGfxTemp + m_Name: JudgementGfx m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -11701,12 +11841,13 @@ RectTransform: - {fileID: 876844700} - {fileID: 513457787} - {fileID: 1625794068} + - {fileID: 921777197} m_Father: {fileID: 17428505} m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 1, y: 0} m_AnchorMax: {x: 1, y: 0} - m_AnchoredPosition: {x: -312, y: 44} + m_AnchoredPosition: {x: -378, y: 44} m_SizeDelta: {x: 480, y: 180} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1569344342 @@ -12219,7 +12360,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 + m_IsActive: 1 --- !u!224 &1702256961 RectTransform: m_ObjectHideFlags: 0 diff --git a/Assets/Scripts/GameManager.cs b/Assets/Scripts/GameManager.cs index 97c635c30..1bc160d24 100644 --- a/Assets/Scripts/GameManager.cs +++ b/Assets/Scripts/GameManager.cs @@ -696,10 +696,6 @@ namespace HeavenStudio private IEnumerator PlayCo(double beat, float delay = 0f) { - if (delay > 0) - { - yield return new WaitForSeconds(delay); - } bool paused = Conductor.instance.isPaused; if (!paused) @@ -710,6 +706,14 @@ namespace HeavenStudio SetCurrentEventToClosest(beat); KillAllSounds(); + if (delay > 0) + { + yield return new WaitForSeconds(delay); + } + } + + if (!paused) + { Minigame miniGame = currentGameO?.GetComponent(); if (miniGame != null) miniGame.OnPlay(beat); diff --git a/Assets/Scripts/GlobalGameManager.cs b/Assets/Scripts/GlobalGameManager.cs index aae8933e0..5b042a2dd 100644 --- a/Assets/Scripts/GlobalGameManager.cs +++ b/Assets/Scripts/GlobalGameManager.cs @@ -341,7 +341,7 @@ namespace HeavenStudio if (!Screen.fullScreen) { // Set the resolution to the display's current resolution - Screen.SetResolution(Display.main.systemWidth, Display.main.systemHeight, FullScreenMode.ExclusiveFullScreen); + Screen.SetResolution(Display.main.systemWidth, Display.main.systemHeight, FullScreenMode.FullScreenWindow); Screen.fullScreen = true; PersistentDataManager.gameSettings.isFullscreen = true; } diff --git a/Assets/Scripts/JudgementManager.cs b/Assets/Scripts/JudgementManager.cs index 018fcb94a..04605e757 100644 --- a/Assets/Scripts/JudgementManager.cs +++ b/Assets/Scripts/JudgementManager.cs @@ -16,6 +16,13 @@ namespace HeavenStudio [RequireComponent(typeof(PlayableDirector), typeof(AudioSource))] public class JudgementManager : MonoBehaviour { + enum Rank + { + Ng = 0, + Ok = 1, + Hi = 2 + } + public enum InputCategory : int { Normal = 0, @@ -96,32 +103,163 @@ namespace HeavenStudio [SerializeField] GameObject bg; [SerializeField] GameObject rankLogo; + [SerializeField] TMP_Text justOk; [SerializeField] Animator rankAnim; + [SerializeField] ParticleSystem okParticles1, okParticles2; [SerializeField] CanvasScaler scaler; [SerializeField] Animator canvasAnim; AudioSource audioSource; - bool twoMessage = false, barStarted = false, didRank = false, didEpilogue = false; + List usedCategories; + float[] categoryInputs; + double[] categoryScores; + string msg0, msg1, msg2; float barTime = 0, barStartTime = float.MaxValue; + Rank rank; + bool twoMessage = false, barStarted = false, didRank = false, didEpilogue = false, subRank = false; public void PrepareJudgement() { bg.SetActive(false); rankLogo.SetActive(false); + justOk.gameObject.SetActive(false); + subRank = false; barText.text = "0"; barSlider.value = 0; barText.color = numColourNg; barSlider.fillRect.GetComponent().color = barColourNg; - // temp - twoMessage = false; - // judgementInfo = new() - // { - // finalScore = 0.79, - // }; + string propSuffix = "ng"; + if (judgementInfo.finalScore < Minigame.rankOkThreshold) + { + rank = Rank.Ng; + propSuffix = "ng"; + } + else if (judgementInfo.finalScore < Minigame.rankHiThreshold) + { + rank = Rank.Ok; + propSuffix = "ok"; + } + else + { + rank = Rank.Hi; + propSuffix = "hi"; + } + + GetCategoryInfo(); + + int firstCat = 0, secondCat = 0; + double lastScore = 0; + if (usedCategories.Count == 1) + { + twoMessage = false; + if (playedBeatmap != null) + { + msg0 = playedBeatmap[$"resultcommon_{propSuffix}"]; + } + else + { + msg0 = rank switch + { + Rank.Ng => "Try harder next time.", + Rank.Ok => "Eh. Passable.", + _ => "Good rhythm.", + }; + } + } + else + { + switch (rank) + { + case Rank.Ok: + // check if any category has a hi score + foreach (int cat in usedCategories) + { + if (categoryScores[cat] > lastScore) + { + lastScore = categoryScores[cat]; + firstCat = cat; + } + } + SetOkMessages(firstCat, lastScore); + break; + case Rank.Ng: + // find the first and second worst categories + firstCat = -1; + secondCat = -1; + lastScore = double.MaxValue; + foreach (int cat in usedCategories) + { + if (categoryScores[cat] < lastScore) + { + lastScore = categoryScores[cat]; + firstCat = cat; + } + } + lastScore = double.MaxValue; + foreach (int cat in usedCategories) + { + if (cat == firstCat) continue; + if (categoryScores[cat] < lastScore) + { + lastScore = categoryScores[cat]; + secondCat = cat; + } + } + // only show one message if only one category fails + twoMessage = categoryScores[secondCat] < Minigame.rankOkThreshold; + if (playedBeatmap != null) + { + msg0 = msg1 = playedBeatmap[$"resultcat{firstCat}_ng"]; + msg2 = playedBeatmap[$"resultcat{secondCat}_ng"]; + } + else + { + msg0 = msg1 = "Try harder next time."; + msg2 = "Try harder next time."; + } + break; + case Rank.Hi: + // find the first and second best categories + firstCat = -1; + secondCat = -1; + lastScore = 0; + foreach (int cat in usedCategories) + { + if (categoryScores[cat] > lastScore) + { + lastScore = categoryScores[cat]; + firstCat = cat; + } + } + lastScore = 0; + foreach (int cat in usedCategories) + { + if (cat == firstCat) continue; + if (categoryScores[cat] > lastScore) + { + lastScore = categoryScores[cat]; + secondCat = cat; + } + } + // only show one message if only one category passes + twoMessage = categoryScores[secondCat] >= Minigame.rankHiThreshold; + if (playedBeatmap != null) + { + msg0 = msg1 = playedBeatmap[$"resultcat{firstCat}_hi"]; + msg2 = playedBeatmap[$"resultcat{secondCat}_hi"]; + } + else + { + msg0 = msg1 = "Good rhythm."; + msg2 = "Good rhythm."; + } + break; + } + } + header.text = playedBeatmap != null ? playedBeatmap["resultcaption"] : "Rhythm League Notes"; - // end temp if (twoMessage) { @@ -139,14 +277,14 @@ namespace HeavenStudio message0.text = " "; } - string imagePath = ""; - string imageName = ""; + string imagePath; + string imageName; EntityTypes.Resource? imageResource; - if (judgementInfo.finalScore < Minigame.rankOkThreshold) + if (rank == Rank.Ng) { imageResource = playedBeatmap != null ? playedBeatmap["epilogue_ng_res"] : null; } - else if (judgementInfo.finalScore < Minigame.rankHiThreshold) + else if (rank == Rank.Ok) { imageResource = playedBeatmap != null ? playedBeatmap["epilogue_ok_res"] : null; } @@ -174,6 +312,71 @@ namespace HeavenStudio } } + void SetOkMessages(int cat, double score) + { + twoMessage = false; + if (score >= Minigame.rankHiThreshold) + { + // just OK + subRank = true; + if (playedBeatmap != null) + { + msg0 = playedBeatmap[$"resultcat{cat}_hi"]; + } + else + { + msg0 = "Good rhythm."; + } + } + else + { + if (playedBeatmap != null) + { + msg0 = playedBeatmap[$"resultcommon_ok"]; + } + else + { + msg0 = "Eh. Passable."; + } + } + } + + void GetCategoryInfo() + { + int maxCat = 0; + usedCategories = new(); + if (playedBeatmap == null || playedBeatmap.data.beatmapSections.Count == 0) + { + usedCategories.Add(0); + return; + } + foreach (var section in playedBeatmap.data.beatmapSections) + { + int cat = section["category"]; + if (!usedCategories.Contains(cat)) + { + usedCategories.Add(cat); + maxCat = Mathf.Max(maxCat, cat); + } + } + usedCategories.Sort(); + + categoryInputs = new float[maxCat + 1]; + categoryScores = new double[maxCat + 1]; + foreach (var input in judgementInfo.inputs) + { + categoryInputs[input.category] += input.weight; + categoryScores[input.category] += input.accuracyState * input.weight; + } + for (int i = 0; i < categoryScores.Length; i++) + { + if (categoryInputs[i] > 0) + { + categoryScores[i] /= categoryInputs[i]; + } + } + } + IEnumerator LoadImage(string path) { UnityWebRequest www = UnityWebRequestTexture.GetTexture("file://" + path); @@ -198,18 +401,7 @@ namespace HeavenStudio { if (twoMessage) return; audioSource.PlayOneShot(messageLast); - if (judgementInfo.finalScore < Minigame.rankOkThreshold) - { - message0.text = playedBeatmap != null ? playedBeatmap["resultcommon_ng"] : "Try harder next time."; - } - else if (judgementInfo.finalScore < Minigame.rankHiThreshold) - { - message0.text = playedBeatmap != null ? playedBeatmap["resultcommon_ok"] : "Eh. Passable."; - } - else - { - message0.text = playedBeatmap != null ? playedBeatmap["resultcommon_hi"] : "Good rhythm."; - } + message0.text = msg0; } public void ShowMessage1() @@ -217,7 +409,7 @@ namespace HeavenStudio if (!twoMessage) return; audioSource.PlayOneShot(messageMid); // message1.text = "message line 1"; - message1.text = "skill issue"; + message1.text = msg1; } public void ShowMessage2() @@ -225,7 +417,7 @@ namespace HeavenStudio if (!twoMessage) return; audioSource.PlayOneShot(messageLast); // message2.text = "message line 2"; - message2.text = "lmao lmao"; + message2.text = "Also..." + msg2; } public void StartBar() @@ -243,14 +435,19 @@ namespace HeavenStudio { rankLogo.SetActive(true); bg.SetActive(true); - if (judgementInfo.finalScore < Minigame.rankOkThreshold) + if (rank == Rank.Ng) { rankAnim.Play("Ng"); audioSource.PlayOneShot(rankNg); } - else if (judgementInfo.finalScore < Minigame.rankHiThreshold) + else if (rank == Rank.Ok) { rankAnim.Play("Ok"); + if (subRank) + { + justOk.gameObject.SetActive(true); + justOk.text = "...but, just"; + } audioSource.PlayOneShot(rankOk); } else @@ -262,14 +459,14 @@ namespace HeavenStudio public void StartRankMusic() { - if (judgementInfo.finalScore < Minigame.rankOkThreshold) + if (rank == Rank.Ng) { audioSource.PlayOneShot(musNgStart); audioSource.clip = musNg; audioSource.loop = true; audioSource.PlayScheduled(AudioSettings.dspTime + musNgStart.length); } - else if (judgementInfo.finalScore < Minigame.rankHiThreshold) + else if (rank == Rank.Ok) { audioSource.PlayOneShot(musOkStart); audioSource.clip = musOk; @@ -311,14 +508,16 @@ namespace HeavenStudio if (didRank && !didEpilogue) { // start the sequence for epilogue + okParticles1.Stop(); + okParticles2.Stop(); canvasAnim.Play("EpilogueOpen"); audioSource.Stop(); - if (judgementInfo.finalScore < Minigame.rankOkThreshold) + if (rank == Rank.Ng) { epilogueMessage.text = playedBeatmap != null ? playedBeatmap["epilogue_ng"] : "Try Again picture"; audioSource.PlayOneShot(jglNg); } - else if (judgementInfo.finalScore < Minigame.rankHiThreshold) + else if (rank == Rank.Ok) { epilogueMessage.text = playedBeatmap != null ? playedBeatmap["epilogue_ok"] : "OK picture"; audioSource.PlayOneShot(jglOk); @@ -352,12 +551,12 @@ namespace HeavenStudio barText.text = ((int)(judgementInfo.finalScore * 100)).ToString(); barSlider.value = (float)judgementInfo.finalScore; - if (judgementInfo.finalScore < Minigame.rankOkThreshold) + if (rank == Rank.Ng) { barText.color = numColourNg; barSlider.fillRect.GetComponent().color = barColourNg; } - else if (judgementInfo.finalScore < Minigame.rankHiThreshold) + else if (rank == Rank.Ok) { barText.color = numColourOk; barSlider.fillRect.GetComponent().color = barColourOk; diff --git a/Assets/Scripts/LevelEditor/RemixPropertiesDialog/PropertyPrefabs/NumberChartPropertyPrefab.cs b/Assets/Scripts/LevelEditor/RemixPropertiesDialog/PropertyPrefabs/NumberChartPropertyPrefab.cs index 54f164de4..4c9f40d65 100644 --- a/Assets/Scripts/LevelEditor/RemixPropertiesDialog/PropertyPrefabs/NumberChartPropertyPrefab.cs +++ b/Assets/Scripts/LevelEditor/RemixPropertiesDialog/PropertyPrefabs/NumberChartPropertyPrefab.cs @@ -41,17 +41,11 @@ namespace HeavenStudio.Editor } ); - inputField.onSelect.AddListener( - _ => - Editor.instance.editingInputField = true - ); - inputField.onEndEdit.AddListener( _ => { slider.value = Convert.ToSingle(inputField.text); parameterManager.chart[propertyName] = (int) slider.value; - Editor.instance.editingInputField = false; } ); break; @@ -72,17 +66,11 @@ namespace HeavenStudio.Editor } ); - inputField.onSelect.AddListener( - _ => - Editor.instance.editingInputField = true - ); - inputField.onEndEdit.AddListener( _ => { slider.value = (float) Math.Round(Convert.ToSingle(inputField.text), 4); parameterManager.chart[propertyName] = slider.value; - Editor.instance.editingInputField = false; } ); break; diff --git a/Assets/Scripts/LevelEditor/RemixPropertiesDialog/PropertyPrefabs/RatingScreenPropertyDialog.cs b/Assets/Scripts/LevelEditor/RemixPropertiesDialog/PropertyPrefabs/RatingScreenPropertyDialog.cs index cc4656a50..4b72e0a4a 100644 --- a/Assets/Scripts/LevelEditor/RemixPropertiesDialog/PropertyPrefabs/RatingScreenPropertyDialog.cs +++ b/Assets/Scripts/LevelEditor/RemixPropertiesDialog/PropertyPrefabs/RatingScreenPropertyDialog.cs @@ -36,6 +36,8 @@ namespace HeavenStudio.Editor Sprite[] rankImages; bool initHooks; + int currentEditingCat = -1; + List usedCategories; RemixPropertiesDialog diag; Ranks currentEditingRank; @@ -45,27 +47,28 @@ namespace HeavenStudio.Editor currentEditingRank = Ranks.Ok; rankImages = new Sprite[3]; diag.StartCoroutine(LoadRankImages()); - UpdateInfo(); + GetUsedCategories(); if (!initHooks) { initHooks = true; - headerInput.onSelect.AddListener( - _ => - Editor.instance.editingInputField = true - ); + + for (int i = 0; i < catButtons.Length; i++) + { + int cat = i; + catButtons[i].onClick.AddListener(() => + { + SetCatEditing(cat); + }); + } + headerInput.onValueChanged.AddListener( _ => { diag.chart["resultcaption"] = headerInput.text; - Editor.instance.editingInputField = false; } ); - epilogueInput.onSelect.AddListener( - _ => - Editor.instance.editingInputField = true - ); epilogueInput.onValueChanged.AddListener( _ => { @@ -76,16 +79,14 @@ namespace HeavenStudio.Editor _ => "ok", }; diag.chart["epilogue_" + propSuffix] = epilogueInput.text; - Editor.instance.editingInputField = false; } ); - messageInput.onSelect.AddListener( - _ => - Editor.instance.editingInputField = true - ); messageInput.onValueChanged.AddListener(DoMessageInput); } + + UpdateInfo(); + SetCatEditing(usedCategories[0]); } void UpdateInfo() @@ -103,9 +104,7 @@ namespace HeavenStudio.Editor _ => "ok", }; epilogueInput.text = (string)diag.chart["epilogue_" + propSuffix]; - - //todo: check categories - messageInput.text = (string)diag.chart["resultcommon_" + propSuffix]; + SetCatEditing(currentEditingCat); } void DoMessageInput(string _) @@ -116,8 +115,72 @@ namespace HeavenStudio.Editor Ranks.Hi => "hi", _ => "ok", }; - diag.chart["resultcommon_" + propSuffix] = messageInput.text; - Editor.instance.editingInputField = false; + + if (usedCategories.Count == 1) + { + diag.chart["resultcommon_" + propSuffix] = messageInput.text; + } + else + { + diag.chart["resultcat" + currentEditingCat + "_" + propSuffix] = messageInput.text; + } + } + + void SetCatEditing(int cat) + { + string propSuffix = currentEditingRank switch + { + Ranks.Ng => "ng", + Ranks.Hi => "hi", + _ => "ok", + }; + + cat = Mathf.Clamp(cat, 0, catButtons.Length - 1); + + if (usedCategories.Count == 1 || currentEditingRank == Ranks.Ok) + { + currentEditingCat = usedCategories[0]; + for (int i = 0; i < catButtons.Length; i++) + { + catButtons[i].gameObject.SetActive(false); + } + + messageInput.text = (string)diag.chart["resultcommon_" + propSuffix]; + } + else + { + currentEditingCat = cat; + for (int i = 0; i < catButtons.Length; i++) + { + catButtons[i].gameObject.SetActive(usedCategories.Contains(i)); + if (i == currentEditingCat) + catButtons[i].GetComponent().sprite = catSprites[i]; + else + catButtons[i].GetComponent().sprite = catOff; + } + + messageInput.text = (string)diag.chart["resultcat" + currentEditingCat + "_" + propSuffix]; + } + } + + void GetUsedCategories() + { + RiqBeatmap chart = diag.chart; + usedCategories = new(); + if (chart.data.beatmapSections.Count == 0) + { + usedCategories.Add(0); + return; + } + foreach (var section in chart.data.beatmapSections) + { + int cat = section["category"]; + if (!usedCategories.Contains(cat)) + { + usedCategories.Add(cat); + } + } + usedCategories.Sort(); } public void GoPrevRank() diff --git a/Assets/Scripts/LevelEditor/RemixPropertiesDialog/PropertyPrefabs/StringChartPropertyPrefab.cs b/Assets/Scripts/LevelEditor/RemixPropertiesDialog/PropertyPrefabs/StringChartPropertyPrefab.cs index 5bd84dd56..228e13f84 100644 --- a/Assets/Scripts/LevelEditor/RemixPropertiesDialog/PropertyPrefabs/StringChartPropertyPrefab.cs +++ b/Assets/Scripts/LevelEditor/RemixPropertiesDialog/PropertyPrefabs/StringChartPropertyPrefab.cs @@ -24,15 +24,10 @@ namespace HeavenStudio.Editor inputFieldString.text = (string) parameterManager.chart[propertyName]; - inputFieldString.onSelect.AddListener( - _ => - Editor.instance.editingInputField = true - ); inputFieldString.onValueChanged.AddListener( _ => {; parameterManager.chart[propertyName] = inputFieldString.text; - Editor.instance.editingInputField = false; } ); } diff --git a/Assets/Scripts/LevelEditor/RemixPropertiesDialog/RemixPropertiesDialog.cs b/Assets/Scripts/LevelEditor/RemixPropertiesDialog/RemixPropertiesDialog.cs index 651170536..011f03b0a 100644 --- a/Assets/Scripts/LevelEditor/RemixPropertiesDialog/RemixPropertiesDialog.cs +++ b/Assets/Scripts/LevelEditor/RemixPropertiesDialog/RemixPropertiesDialog.cs @@ -47,6 +47,7 @@ namespace HeavenStudio.Editor { Editor.instance.canSelect = true; Editor.instance.inAuthorativeMenu = false; + Editor.instance.editingInputField = false; dialog.SetActive(false); tabsManager.CleanTabs(); @@ -57,6 +58,7 @@ namespace HeavenStudio.Editor ResetAllDialogs(); Editor.instance.canSelect = false; Editor.instance.inAuthorativeMenu = true; + Editor.instance.editingInputField = true; dialog.SetActive(true); chart = GameManager.instance.Beatmap; diff --git a/Assets/Scripts/LevelEditor/Timeline/Timeline.cs b/Assets/Scripts/LevelEditor/Timeline/Timeline.cs index d5abd226a..656c8eb65 100644 --- a/Assets/Scripts/LevelEditor/Timeline/Timeline.cs +++ b/Assets/Scripts/LevelEditor/Timeline/Timeline.cs @@ -399,6 +399,7 @@ namespace HeavenStudio.Editor.Track foreach (var rect in GameObject.FindGameObjectsWithTag("BlocksEditor")) { + if (!rect.activeInHierarchy) continue; if (rect.TryGetComponent(out RectTransform rectTransform)) { if (RectTransformUtility.RectangleContainsScreenPoint(rectTransform, Input.mousePosition, Camera.main))