diff --git a/TECHMANIA/Assets/Animations/Judgement Text.anim b/TECHMANIA/Assets/Animations/Judgement Text.anim deleted file mode 100644 index 0a2e39a8..00000000 --- a/TECHMANIA/Assets/Animations/Judgement Text.anim +++ /dev/null @@ -1,385 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!74 &7400000 -AnimationClip: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: Judgement Text - serializedVersion: 6 - m_Legacy: 0 - m_Compressed: 0 - m_UseHighQualityCurve: 1 - m_RotationCurves: [] - m_CompressedRotationCurves: [] - m_EulerCurves: [] - m_PositionCurves: [] - m_ScaleCurves: - - curve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: {x: 1.2, y: 1.2, z: 1} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.1 - value: {x: 0.8, y: 0.8, z: 1} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.13333334 - value: {x: 1.1, y: 1.1, z: 1} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.16666667 - value: {x: 1, y: 1, z: 1} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 0.8333333 - value: {x: 1, y: 1, z: 1} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - - serializedVersion: 3 - time: 1 - value: {x: 1, y: 2, z: 1} - inSlope: {x: 0, y: 0, z: 0} - outSlope: {x: 0, y: 0, z: 0} - tangentMode: 0 - weightedMode: 0 - inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - path: - m_FloatCurves: - - curve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0.5 - inSlope: 8.044198 - outSlope: 8.044198 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.24338058 - - serializedVersion: 3 - time: 0.1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.8333333 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - attribute: m_Alpha - path: - classID: 225 - script: {fileID: 0} - m_PPtrCurves: [] - m_SampleRate: 60 - m_WrapMode: 0 - m_Bounds: - m_Center: {x: 0, y: 0, z: 0} - m_Extent: {x: 0, y: 0, z: 0} - m_ClipBindingConstant: - genericBindings: - - serializedVersion: 2 - path: 0 - attribute: 3 - script: {fileID: 0} - typeID: 4 - customType: 0 - isPPtrCurve: 0 - - serializedVersion: 2 - path: 0 - attribute: 1574349066 - script: {fileID: 0} - typeID: 225 - customType: 0 - isPPtrCurve: 0 - pptrCurveMapping: [] - m_AnimationClipSettings: - serializedVersion: 2 - m_AdditiveReferencePoseClip: {fileID: 0} - m_AdditiveReferencePoseTime: 0 - m_StartTime: 0 - m_StopTime: 1 - m_OrientationOffsetY: 0 - m_Level: 0 - m_CycleOffset: 0 - m_HasAdditiveReferencePose: 0 - m_LoopTime: 0 - m_LoopBlend: 0 - m_LoopBlendOrientation: 0 - m_LoopBlendPositionY: 0 - m_LoopBlendPositionXZ: 0 - m_KeepOriginalOrientation: 0 - m_KeepOriginalPositionY: 1 - m_KeepOriginalPositionXZ: 0 - m_HeightFromFeet: 0 - m_Mirror: 0 - m_EditorCurves: - - curve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1.2 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.1 - value: 0.8 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.13333334 - value: 1.1 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.16666667 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.8333333 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - attribute: m_LocalScale.x - path: - classID: 224 - script: {fileID: 0} - - curve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1.2 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.1 - value: 0.8 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.13333334 - value: 1.1 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.16666667 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.8333333 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 2 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - attribute: m_LocalScale.y - path: - classID: 224 - script: {fileID: 0} - - curve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.8333333 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - attribute: m_LocalScale.z - path: - classID: 224 - script: {fileID: 0} - - curve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0.5 - inSlope: 8.044198 - outSlope: 8.044198 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.24338058 - - serializedVersion: 3 - time: 0.1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 0.8333333 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 136 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - attribute: m_Alpha - path: - classID: 225 - script: {fileID: 0} - m_EulerEditorCurves: [] - m_HasGenericRootTransform: 0 - m_HasMotionFloatCurves: 0 - m_Events: [] diff --git a/TECHMANIA/Assets/Animations/Judgement Text.controller b/TECHMANIA/Assets/Animations/Judgement Text.controller deleted file mode 100644 index b9563c0d..00000000 --- a/TECHMANIA/Assets/Animations/Judgement Text.controller +++ /dev/null @@ -1,104 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1107 &-646729921099458028 -AnimatorStateMachine: - serializedVersion: 5 - m_ObjectHideFlags: 1 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: Base Layer - m_ChildStates: - - serializedVersion: 1 - m_State: {fileID: 342130579961969401} - m_Position: {x: 30, y: 210, z: 0} - m_ChildStateMachines: [] - m_AnyStateTransitions: [] - m_EntryTransitions: [] - m_StateMachineTransitions: {} - m_StateMachineBehaviours: [] - m_AnyStatePosition: {x: 50, y: 20, z: 0} - m_EntryPosition: {x: 50, y: 120, z: 0} - m_ExitPosition: {x: 800, y: 120, z: 0} - m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} - m_DefaultState: {fileID: 342130579961969401} ---- !u!91 &9100000 -AnimatorController: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: Judgement Text - serializedVersion: 5 - m_AnimatorParameters: - - m_Name: Activate - m_Type: 9 - m_DefaultFloat: 0 - m_DefaultInt: 0 - m_DefaultBool: 0 - m_Controller: {fileID: 0} - m_AnimatorLayers: - - serializedVersion: 5 - m_Name: Base Layer - m_StateMachine: {fileID: -646729921099458028} - m_Mask: {fileID: 0} - m_Motions: [] - m_Behaviours: [] - m_BlendingMode: 0 - m_SyncedLayerIndex: -1 - m_DefaultWeight: 0 - m_IKPass: 0 - m_SyncedLayerAffectsTiming: 0 - m_Controller: {fileID: 9100000} ---- !u!1102 &342130579961969401 -AnimatorState: - serializedVersion: 5 - m_ObjectHideFlags: 1 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: Judgement Text - m_Speed: 1 - m_CycleOffset: 0 - m_Transitions: - - {fileID: 1379791009502763287} - m_StateMachineBehaviours: [] - m_Position: {x: 50, y: 50, z: 0} - m_IKOnFeet: 0 - m_WriteDefaultValues: 1 - m_Mirror: 0 - m_SpeedParameterActive: 0 - m_MirrorParameterActive: 0 - m_CycleOffsetParameterActive: 0 - m_TimeParameterActive: 0 - m_Motion: {fileID: 7400000, guid: 8895a3d11db539c449c41148ad5dc737, type: 2} - m_Tag: - m_SpeedParameter: - m_MirrorParameter: - m_CycleOffsetParameter: - m_TimeParameter: ---- !u!1101 &1379791009502763287 -AnimatorStateTransition: - m_ObjectHideFlags: 1 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: - m_Conditions: - - m_ConditionMode: 1 - m_ConditionEvent: Activate - m_EventTreshold: 0 - m_DstStateMachine: {fileID: 0} - m_DstState: {fileID: 342130579961969401} - m_Solo: 0 - m_Mute: 0 - m_IsExit: 0 - serializedVersion: 3 - m_TransitionDuration: 0 - m_TransitionOffset: 0 - m_ExitTime: 0.75 - m_HasExitTime: 0 - m_HasFixedDuration: 0 - m_InterruptionSource: 0 - m_OrderedInterruption: 1 - m_CanTransitionToSelf: 1 diff --git a/TECHMANIA/Assets/Animations/Judgement Text.controller.meta b/TECHMANIA/Assets/Animations/Judgement Text.controller.meta deleted file mode 100644 index 2ea35f72..00000000 --- a/TECHMANIA/Assets/Animations/Judgement Text.controller.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: bcfb89bed2834e14c82b62878cc7e940 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 0 - userData: - assetBundleName: - assetBundleVariant: diff --git a/TECHMANIA/Assets/Scenes/Main.unity b/TECHMANIA/Assets/Scenes/Main.unity index cfbf78f4..36d2abdf 100644 --- a/TECHMANIA/Assets/Scenes/Main.unity +++ b/TECHMANIA/Assets/Scenes/Main.unity @@ -179,6 +179,7 @@ MonoBehaviour: lockNotesInTimeToggle: {fileID: 1874739372} lockDragAnchorsInTimeToggle: {fileID: 429155495} snapDragAnchorsToggle: {fileID: 1497274609} + autoSaveToggle: {fileID: 416289386} metronomeToggle: {fileID: 1721100886} assistTickOnSilentNotesToggle: {fileID: 850507076} returnScanlineAfterPlaybackToggle: {fileID: 1380239317} @@ -1135,7 +1136,7 @@ PrefabInstance: - target: {fileID: 6024100903353481884, guid: c492613baa5aa5443a2ff6505c7ee213, type: 3} propertyPath: m_AnchoredPosition.y - value: -3053.83 + value: -3135.83 objectReference: {fileID: 0} - target: {fileID: 6024100903353481884, guid: c492613baa5aa5443a2ff6505c7ee213, type: 3} @@ -10046,22 +10047,22 @@ PrefabInstance: - target: {fileID: 8111477514134335581, guid: 6d71ded5003a93c4ca74d7e2eb0e4f62, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0.83229125 objectReference: {fileID: 0} - target: {fileID: 8111477514134335581, guid: 6d71ded5003a93c4ca74d7e2eb0e4f62, type: 3} propertyPath: m_AnchorMin.y - value: 0.6906161 + value: 0.53056204 objectReference: {fileID: 0} - target: {fileID: 8111477514375073465, guid: 6d71ded5003a93c4ca74d7e2eb0e4f62, type: 3} propertyPath: m_Size - value: 0.30957547 + value: 0.3093839 objectReference: {fileID: 0} - target: {fileID: 8111477514375073465, guid: 6d71ded5003a93c4ca74d7e2eb0e4f62, type: 3} propertyPath: m_Value - value: 1 + value: 0.7509999 objectReference: {fileID: 0} - target: {fileID: 8111477514673168009, guid: 6d71ded5003a93c4ca74d7e2eb0e4f62, type: 3} @@ -10226,12 +10227,12 @@ PrefabInstance: - target: {fileID: 8111477515770818489, guid: 6d71ded5003a93c4ca74d7e2eb0e4f62, type: 3} propertyPath: m_SizeDelta.y - value: 3232.2302 + value: 3314.2302 objectReference: {fileID: 0} - target: {fileID: 8111477515770818489, guid: 6d71ded5003a93c4ca74d7e2eb0e4f62, type: 3} propertyPath: m_AnchoredPosition.y - value: 0.00012207031 + value: 555.82544 objectReference: {fileID: 0} m_RemovedComponents: - {fileID: 8111477514770311785, guid: 6d71ded5003a93c4ca74d7e2eb0e4f62, type: 3} @@ -10293,6 +10294,14 @@ PrefabInstance: type: 3} insertIndex: -1 addedObject: {fileID: 1263857048} + - targetCorrespondingSourceObject: {fileID: 8111477515770818489, guid: 6d71ded5003a93c4ca74d7e2eb0e4f62, + type: 3} + insertIndex: -1 + addedObject: {fileID: 438560214} + - targetCorrespondingSourceObject: {fileID: 8111477515770818489, guid: 6d71ded5003a93c4ca74d7e2eb0e4f62, + type: 3} + insertIndex: -1 + addedObject: {fileID: 1192105579} - targetCorrespondingSourceObject: {fileID: 8111477515770818489, guid: 6d71ded5003a93c4ca74d7e2eb0e4f62, type: 3} insertIndex: -1 @@ -16124,6 +16133,202 @@ MonoBehaviour: stopTimeButton: {fileID: 2042000708} timeStopInputField: {fileID: 1820886058} dontStopTimeButton: {fileID: 1823087550} +--- !u!1001 &416289384 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 1192105579} + m_Modifications: + - target: {fileID: 1260019629886154125, guid: 38ddc5a75a4741f4081a6e86bcd0f904, + type: 3} + propertyPath: m_Navigation.m_Mode + value: -1 + objectReference: {fileID: 0} + - target: {fileID: 1260019629886154125, guid: 38ddc5a75a4741f4081a6e86bcd0f904, + type: 3} + propertyPath: m_Navigation.m_SelectOnUp + value: + objectReference: {fileID: 0} + - target: {fileID: 1260019629886154125, guid: 38ddc5a75a4741f4081a6e86bcd0f904, + type: 3} + propertyPath: m_Navigation.m_SelectOnDown + value: + objectReference: {fileID: 0} + - target: {fileID: 1260019629886154125, guid: 38ddc5a75a4741f4081a6e86bcd0f904, + type: 3} + propertyPath: onValueChanged.m_PersistentCalls.m_Calls.Array.size + value: 2 + objectReference: {fileID: 0} + - target: {fileID: 1260019629886154125, guid: 38ddc5a75a4741f4081a6e86bcd0f904, + type: 3} + propertyPath: onValueChanged.m_PersistentCalls.m_Calls.Array.data[1].m_Mode + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1260019629886154125, guid: 38ddc5a75a4741f4081a6e86bcd0f904, + type: 3} + propertyPath: onValueChanged.m_PersistentCalls.m_Calls.Array.data[1].m_Target + value: + objectReference: {fileID: 2666411} + - target: {fileID: 1260019629886154125, guid: 38ddc5a75a4741f4081a6e86bcd0f904, + type: 3} + propertyPath: onValueChanged.m_PersistentCalls.m_Calls.Array.data[1].m_CallState + value: 2 + objectReference: {fileID: 0} + - target: {fileID: 1260019629886154125, guid: 38ddc5a75a4741f4081a6e86bcd0f904, + type: 3} + propertyPath: onValueChanged.m_PersistentCalls.m_Calls.Array.data[1].m_MethodName + value: UIToMemory + objectReference: {fileID: 0} + - target: {fileID: 1260019629886154125, guid: 38ddc5a75a4741f4081a6e86bcd0f904, + type: 3} + propertyPath: onValueChanged.m_PersistentCalls.m_Calls.Array.data[0].m_TargetAssemblyTypeName + value: MaterialToggle, Assembly-CSharp + objectReference: {fileID: 0} + - target: {fileID: 1260019629886154125, guid: 38ddc5a75a4741f4081a6e86bcd0f904, + type: 3} + propertyPath: onValueChanged.m_PersistentCalls.m_Calls.Array.data[1].m_TargetAssemblyTypeName + value: EditorOptionsTab, Assembly-CSharp + objectReference: {fileID: 0} + - target: {fileID: 1260019629886154125, guid: 38ddc5a75a4741f4081a6e86bcd0f904, + type: 3} + propertyPath: onValueChanged.m_PersistentCalls.m_Calls.Array.data[1].m_Arguments.m_ObjectArgumentAssemblyTypeName + value: UnityEngine.Object, UnityEngine + objectReference: {fileID: 0} + - target: {fileID: 1260019629886154126, guid: 38ddc5a75a4741f4081a6e86bcd0f904, + type: 3} + propertyPath: m_Pivot.x + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1260019629886154126, guid: 38ddc5a75a4741f4081a6e86bcd0f904, + type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1260019629886154126, guid: 38ddc5a75a4741f4081a6e86bcd0f904, + type: 3} + propertyPath: m_RootOrder + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1260019629886154126, guid: 38ddc5a75a4741f4081a6e86bcd0f904, + type: 3} + propertyPath: m_AnchorMax.x + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1260019629886154126, guid: 38ddc5a75a4741f4081a6e86bcd0f904, + type: 3} + propertyPath: m_AnchorMax.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1260019629886154126, guid: 38ddc5a75a4741f4081a6e86bcd0f904, + type: 3} + propertyPath: m_AnchorMin.x + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1260019629886154126, guid: 38ddc5a75a4741f4081a6e86bcd0f904, + type: 3} + propertyPath: m_AnchorMin.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1260019629886154126, guid: 38ddc5a75a4741f4081a6e86bcd0f904, + type: 3} + propertyPath: m_SizeDelta.x + value: 42 + objectReference: {fileID: 0} + - target: {fileID: 1260019629886154126, guid: 38ddc5a75a4741f4081a6e86bcd0f904, + type: 3} + propertyPath: m_SizeDelta.y + value: 25 + objectReference: {fileID: 0} + - target: {fileID: 1260019629886154126, guid: 38ddc5a75a4741f4081a6e86bcd0f904, + type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1260019629886154126, guid: 38ddc5a75a4741f4081a6e86bcd0f904, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1260019629886154126, guid: 38ddc5a75a4741f4081a6e86bcd0f904, + type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1260019629886154126, guid: 38ddc5a75a4741f4081a6e86bcd0f904, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1260019629886154126, guid: 38ddc5a75a4741f4081a6e86bcd0f904, + type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1260019629886154126, guid: 38ddc5a75a4741f4081a6e86bcd0f904, + type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1260019629886154126, guid: 38ddc5a75a4741f4081a6e86bcd0f904, + type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1260019629886154126, guid: 38ddc5a75a4741f4081a6e86bcd0f904, + type: 3} + propertyPath: m_AnchoredPosition.x + value: -20 + objectReference: {fileID: 0} + - target: {fileID: 1260019629886154126, guid: 38ddc5a75a4741f4081a6e86bcd0f904, + type: 3} + propertyPath: m_AnchoredPosition.y + value: -40 + objectReference: {fileID: 0} + - target: {fileID: 1260019629886154126, guid: 38ddc5a75a4741f4081a6e86bcd0f904, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1260019629886154126, guid: 38ddc5a75a4741f4081a6e86bcd0f904, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1260019629886154126, guid: 38ddc5a75a4741f4081a6e86bcd0f904, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1260019629886154127, guid: 38ddc5a75a4741f4081a6e86bcd0f904, + type: 3} + propertyPath: m_Name + value: Toggle + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 38ddc5a75a4741f4081a6e86bcd0f904, type: 3} +--- !u!224 &416289385 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 1260019629886154126, guid: 38ddc5a75a4741f4081a6e86bcd0f904, + type: 3} + m_PrefabInstance: {fileID: 416289384} + m_PrefabAsset: {fileID: 0} +--- !u!114 &416289386 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 1260019629886154125, guid: 38ddc5a75a4741f4081a6e86bcd0f904, + type: 3} + m_PrefabInstance: {fileID: 416289384} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3} + m_Name: + m_EditorClassIdentifier: --- !u!1001 &429155494 PrefabInstance: m_ObjectHideFlags: 0 @@ -16701,6 +16906,102 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 437964926} m_CullTransparentMesh: 0 +--- !u!1 &438560213 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 438560214} + - component: {fileID: 438560217} + - component: {fileID: 438560216} + - component: {fileID: 438560215} + m_Layer: 5 + m_Name: Divider (8) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &438560214 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 438560213} + 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: 269523111} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 395, y: -906.49005} + m_SizeDelta: {x: 790, y: 2} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &438560215 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 438560213} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: 2 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!114 &438560216 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 438560213} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0.12156863} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &438560217 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 438560213} + m_CullTransparentMesh: 0 --- !u!1 &465729919 GameObject: m_ObjectHideFlags: 0 @@ -20101,7 +20402,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 395, y: -1146.6301} + m_AnchoredPosition: {x: 395, y: -1228.63} m_SizeDelta: {x: 790, y: 2} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &573104785 @@ -20789,7 +21090,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 395, y: -2835.4302} + m_AnchoredPosition: {x: 395, y: -2917.4302} m_SizeDelta: {x: 790, y: 80} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &585249411 @@ -20887,7 +21188,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 395, y: -1375.7701} + m_AnchoredPosition: {x: 395, y: -1457.77} m_SizeDelta: {x: 790, y: 80} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &591998344 @@ -25020,7 +25321,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 395, y: -2223.83} + m_AnchoredPosition: {x: 395, y: -2305.83} m_SizeDelta: {x: 790, y: 80} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &705844162 @@ -26433,7 +26734,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 395, y: -1105.6301} + m_AnchoredPosition: {x: 395, y: -1187.63} m_SizeDelta: {x: 790, y: 80} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &772622720 @@ -26531,7 +26832,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 395, y: -1023.63007} + m_AnchoredPosition: {x: 395, y: -1105.63} m_SizeDelta: {x: 790, y: 80} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &781012565 @@ -28145,6 +28446,166 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} m_Name: m_EditorClassIdentifier: +--- !u!1001 &911889540 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 1192105579} + m_Modifications: + - target: {fileID: 532432800814719921, guid: c492613baa5aa5443a2ff6505c7ee213, + type: 3} + propertyPath: key + value: pattern_panel_options_auto_save_label + objectReference: {fileID: 0} + - target: {fileID: 6024100903353481883, guid: c492613baa5aa5443a2ff6505c7ee213, + type: 3} + propertyPath: m_Name + value: Body 1 (2) + objectReference: {fileID: 0} + - target: {fileID: 6024100903353481884, guid: c492613baa5aa5443a2ff6505c7ee213, + type: 3} + propertyPath: m_Pivot.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 6024100903353481884, guid: c492613baa5aa5443a2ff6505c7ee213, + type: 3} + propertyPath: m_Pivot.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 6024100903353481884, guid: c492613baa5aa5443a2ff6505c7ee213, + type: 3} + propertyPath: m_RootOrder + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6024100903353481884, guid: c492613baa5aa5443a2ff6505c7ee213, + type: 3} + propertyPath: m_AnchorMax.x + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 6024100903353481884, guid: c492613baa5aa5443a2ff6505c7ee213, + type: 3} + propertyPath: m_AnchorMax.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 6024100903353481884, guid: c492613baa5aa5443a2ff6505c7ee213, + type: 3} + propertyPath: m_AnchorMin.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6024100903353481884, guid: c492613baa5aa5443a2ff6505c7ee213, + type: 3} + propertyPath: m_AnchorMin.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 6024100903353481884, guid: c492613baa5aa5443a2ff6505c7ee213, + type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6024100903353481884, guid: c492613baa5aa5443a2ff6505c7ee213, + type: 3} + propertyPath: m_SizeDelta.y + value: 80 + objectReference: {fileID: 0} + - target: {fileID: 6024100903353481884, guid: c492613baa5aa5443a2ff6505c7ee213, + type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6024100903353481884, guid: c492613baa5aa5443a2ff6505c7ee213, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6024100903353481884, guid: c492613baa5aa5443a2ff6505c7ee213, + type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6024100903353481884, guid: c492613baa5aa5443a2ff6505c7ee213, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 6024100903353481884, guid: c492613baa5aa5443a2ff6505c7ee213, + type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 6024100903353481884, guid: c492613baa5aa5443a2ff6505c7ee213, + type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 6024100903353481884, guid: c492613baa5aa5443a2ff6505c7ee213, + type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 6024100903353481884, guid: c492613baa5aa5443a2ff6505c7ee213, + type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6024100903353481884, guid: c492613baa5aa5443a2ff6505c7ee213, + type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6024100903353481884, guid: c492613baa5aa5443a2ff6505c7ee213, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6024100903353481884, guid: c492613baa5aa5443a2ff6505c7ee213, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6024100903353481884, guid: c492613baa5aa5443a2ff6505c7ee213, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6024100903353481886, guid: c492613baa5aa5443a2ff6505c7ee213, + type: 3} + propertyPath: m_text + value: Auto save every 5 minutes + objectReference: {fileID: 0} + - target: {fileID: 6024100903353481886, guid: c492613baa5aa5443a2ff6505c7ee213, + type: 3} + propertyPath: m_margin.x + value: 20 + objectReference: {fileID: 0} + - target: {fileID: 6024100903353481886, guid: c492613baa5aa5443a2ff6505c7ee213, + type: 3} + propertyPath: m_textAlignment + value: 65535 + objectReference: {fileID: 0} + - target: {fileID: 6024100903353481886, guid: c492613baa5aa5443a2ff6505c7ee213, + type: 3} + propertyPath: m_TextStyleHashCode + value: -1183493901 + objectReference: {fileID: 0} + - target: {fileID: 6024100903353481886, guid: c492613baa5aa5443a2ff6505c7ee213, + type: 3} + propertyPath: m_VerticalAlignment + value: 512 + objectReference: {fileID: 0} + m_RemovedComponents: + - {fileID: 6024100903353481885, guid: c492613baa5aa5443a2ff6505c7ee213, type: 3} + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: c492613baa5aa5443a2ff6505c7ee213, type: 3} +--- !u!224 &911889541 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 6024100903353481884, guid: c492613baa5aa5443a2ff6505c7ee213, + type: 3} + m_PrefabInstance: {fileID: 911889540} + m_PrefabAsset: {fileID: 0} --- !u!1001 &912393049 PrefabInstance: m_ObjectHideFlags: 0 @@ -29284,7 +29745,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 395, y: -1202.6301} + m_AnchoredPosition: {x: 395, y: -1284.63} m_SizeDelta: {x: 790, y: 110} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &941246442 @@ -30900,7 +31361,7 @@ PrefabInstance: - target: {fileID: 7299862028387148676, guid: ab430c3b23fa3a046b8a0af014a2f552, type: 3} propertyPath: m_AnchoredPosition.y - value: -1296.7001 + value: -1378.7 objectReference: {fileID: 0} - target: {fileID: 7299862028387148676, guid: ab430c3b23fa3a046b8a0af014a2f552, type: 3} @@ -36060,6 +36521,7 @@ GameObject: - component: {fileID: 1144905155} - component: {fileID: 1144905156} - component: {fileID: 1144905157} + - component: {fileID: 1144905158} m_Layer: 0 m_Name: Main Camera m_TagString: MainCamera @@ -36218,6 +36680,19 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: attenuationObject: {fileID: 0} +--- !u!114 &1144905158 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1144905148} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ff1e1f349131a05468e3cd0f7a242e96, type: 3} + m_Name: + m_EditorClassIdentifier: + savePeriodInSeconds: 10 --- !u!1001 &1150623708 PrefabInstance: m_ObjectHideFlags: 0 @@ -36413,7 +36888,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 395, y: -1064.6301} + m_AnchoredPosition: {x: 395, y: -1146.63} m_SizeDelta: {x: 790, y: 2} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1153590310 @@ -38397,6 +38872,104 @@ MonoBehaviour: m_ChildScaleWidth: 0 m_ChildScaleHeight: 0 m_ReverseArrangement: 0 +--- !u!1 &1192105578 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1192105579} + - component: {fileID: 1192105582} + - component: {fileID: 1192105581} + - component: {fileID: 1192105580} + m_Layer: 5 + m_Name: Auto Save + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1192105579 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1192105578} + 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: + - {fileID: 911889541} + - {fileID: 416289385} + m_Father: {fileID: 269523111} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 395, y: -947.49005} + m_SizeDelta: {x: 790, y: 80} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1192105580 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1192105578} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: 80 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!114 &1192105581 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1192105578} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0.050980393} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1192105582 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1192105578} + m_CullTransparentMesh: 0 --- !u!1001 &1201567951 PrefabInstance: m_ObjectHideFlags: 0 @@ -38953,7 +39526,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 395, y: -1798.8002} + m_AnchoredPosition: {x: 395, y: -1880.8} m_SizeDelta: {x: 790, y: 766.06} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1209566756 @@ -56088,7 +56661,7 @@ PrefabInstance: - target: {fileID: 6024100903353481884, guid: c492613baa5aa5443a2ff6505c7ee213, type: 3} propertyPath: m_AnchoredPosition.y - value: -2528.6301 + value: -2610.6301 objectReference: {fileID: 0} - target: {fileID: 6024100903353481884, guid: c492613baa5aa5443a2ff6505c7ee213, type: 3} @@ -56540,7 +57113,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 395, y: -2794.4302} + m_AnchoredPosition: {x: 395, y: -2876.4302} m_SizeDelta: {x: 790, y: 2} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1695261635 @@ -70716,7 +71289,7 @@ PrefabInstance: - target: {fileID: 7299862028387148676, guid: ab430c3b23fa3a046b8a0af014a2f552, type: 3} propertyPath: m_AnchoredPosition.y - value: -944.56006 + value: -1026.56 objectReference: {fileID: 0} - target: {fileID: 7299862028387148676, guid: ab430c3b23fa3a046b8a0af014a2f552, type: 3} @@ -70837,7 +71410,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 395, y: -2182.83} + m_AnchoredPosition: {x: 395, y: -2264.83} m_SizeDelta: {x: 790, y: 2} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &2090922912 @@ -73302,27 +73875,6 @@ RectTransform: m_AnchoredPosition: {x: 550, y: -40} m_SizeDelta: {x: 100, y: 80} m_Pivot: {x: 0.5, y: 0.5} ---- !u!95 &6153932699938651322 -Animator: - serializedVersion: 5 - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7243017405029880506} - m_Enabled: 1 - m_Avatar: {fileID: 0} - m_Controller: {fileID: 9100000, guid: bcfb89bed2834e14c82b62878cc7e940, type: 2} - m_CullingMode: 0 - m_UpdateMode: 0 - m_ApplyRootMotion: 0 - m_LinearVelocityBlending: 0 - m_StabilizeFeet: 0 - m_WarningMessage: - m_HasTransformHierarchy: 1 - m_AllowConstantClipSamplingOptimization: 1 - m_KeepAnimatorStateOnDisable: 0 - m_WriteDefaultValuesOnDisable: 0 --- !u!224 &6153932699961667954 RectTransform: m_ObjectHideFlags: 0 @@ -73418,7 +73970,6 @@ MonoBehaviour: - {fileID: 6153932700175475600} - {fileID: 6153932701551899585} - {fileID: 6153932700756826985} - animator: {fileID: 6153932699938651322} --- !u!224 &6153932700612440403 RectTransform: m_ObjectHideFlags: 0 @@ -73644,7 +74195,6 @@ GameObject: - component: {fileID: 13029433216755254} - component: {fileID: 6741901529986167011} - component: {fileID: 8602171300447636044} - - component: {fileID: 6153932699938651322} m_Layer: 5 m_Name: Combo Text Layout m_TagString: Untagged diff --git a/TECHMANIA/Assets/Scripts/Components/Editor Components/EditorOptionsTab.cs b/TECHMANIA/Assets/Scripts/Components/Editor Components/EditorOptionsTab.cs index 39f3fa51..5807052b 100644 --- a/TECHMANIA/Assets/Scripts/Components/Editor Components/EditorOptionsTab.cs +++ b/TECHMANIA/Assets/Scripts/Components/Editor Components/EditorOptionsTab.cs @@ -16,6 +16,7 @@ public class EditorOptionsTab : MonoBehaviour public Toggle lockNotesInTimeToggle; public Toggle lockDragAnchorsInTimeToggle; public Toggle snapDragAnchorsToggle; + public Toggle autoSaveToggle; [Header("Playback")] public Toggle metronomeToggle; @@ -53,6 +54,8 @@ private void MemoryToUI() Options.instance.editorOptions.lockDragAnchorsInTime); snapDragAnchorsToggle.SetIsOnWithoutNotify( Options.instance.editorOptions.snapDragAnchors); + autoSaveToggle.SetIsOnWithoutNotify( + Options.instance.editorOptions.autoSave); metronomeToggle.SetIsOnWithoutNotify( Options.instance.editorOptions.metronome); @@ -80,6 +83,8 @@ public void UIToMemory() lockDragAnchorsInTimeToggle.isOn; Options.instance.editorOptions.snapDragAnchors = snapDragAnchorsToggle.isOn; + Options.instance.editorOptions.autoSave = + autoSaveToggle.isOn; Options.instance.editorOptions.metronome = metronomeToggle.isOn; diff --git a/TECHMANIA/Assets/Scripts/Components/Editor Components/EditorTopBar.cs b/TECHMANIA/Assets/Scripts/Components/Editor Components/EditorTopBar.cs index c90f3676..44e18260 100644 --- a/TECHMANIA/Assets/Scripts/Components/Editor Components/EditorTopBar.cs +++ b/TECHMANIA/Assets/Scripts/Components/Editor Components/EditorTopBar.cs @@ -11,12 +11,15 @@ public class EditorTopBar : MonoBehaviour public Button undoButton; public Button redoButton; + private DateTime lastAutoSaveTime; + private void OnEnable() { EditorContext.DirtynessUpdated += RefreshTitle; EditorContext.UndoRedoStackUpdated += RefreshUndoRedoButtons; RefreshTitle(EditorContext.Dirty); RefreshUndoRedoButtons(); + lastAutoSaveTime = DateTime.Now; } private void OnDisable() @@ -36,6 +39,7 @@ public void Save() { EditorContext.SaveSetlist(); } + lastAutoSaveTime = DateTime.Now; } public void Undo() @@ -79,5 +83,15 @@ void Update() Redo(); } } + + if (Options.instance.editorOptions.autoSave) + { + if (DateTime.Now - lastAutoSaveTime > + TimeSpan.FromMinutes(5)) + { + Debug.Log("Auto saving."); + Save(); + } + } } } diff --git a/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/ComboText.cs b/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/ComboText.cs index 0f193e29..19161294 100644 --- a/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/ComboText.cs +++ b/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/ComboText.cs @@ -1,4 +1,5 @@ -using System.Collections; +using System; +using System.Collections; using System.Collections.Generic; using System.Text; using ThemeApi; @@ -12,7 +13,6 @@ public class ComboText : MonoBehaviour public UnityEngine.UI.Image judgementText; public RectTransform space; public List comboDigits; - public Animator animator; private UnityEngine.UIElements.VisualElement elementToFollow; private RectTransform rect; @@ -209,8 +209,9 @@ public void Show(UnityEngine.UIElements.VisualElement noteImage, } startTime = Time.time; + ResetAllAnimationAttributes(); + UpdateAnimationCurves(); UpdateSprites(); - animator.SetTrigger("Activate"); } private void UpdateSprites() @@ -234,8 +235,12 @@ private void UpdateSprites() private void Update() { - Follow(); - UpdateSprites(); + if (elementToFollow != null) + { + Follow(); + UpdateAnimationCurves(); + UpdateSprites(); + } } private void Follow() @@ -247,4 +252,93 @@ private void Follow() rect.anchorMin = viewportPoint; rect.anchorMax = viewportPoint; } + + #region Animation + private void SetTranslationX(float value) + { + comboTextLayout.anchoredPosition = new Vector2( + value * sizeUnit, + comboTextLayout.anchoredPosition.y); + } + + private void SetTranslationY(float value) + { + comboTextLayout.anchoredPosition = new Vector2( + comboTextLayout.anchoredPosition.x, + GlobalResource.comboSkin.distanceToNote * sizeUnit + value); + } + + private void SetRotationInDegrees(float value) + { + comboTextLayout.localRotation = Quaternion.Euler( + 0f, 0f, value); + } + + private void SetScaleX(float value) + { + comboTextLayout.localScale = new Vector3(value, + comboTextLayout.localScale.y, 1f); + } + + private void SetScaleY(float value) + { + comboTextLayout.localScale = new Vector3( + comboTextLayout.localScale.x, value, 1f); + } + + private void SetAlpha(float value) + { + comboTextLayout.GetComponent().alpha = + value; + } + + private void ResetAllAnimationAttributes() + { + SetTranslationX(0f); + SetTranslationY(0f); + SetRotationInDegrees(0f); + SetScaleX(1f); + SetScaleY(1f); + SetAlpha(1f); + } + + private void UpdateAnimationCurves() + { + float time = Time.time - startTime; + + foreach (Tuple tuple in + GlobalResource.comboAnimationCurvesAndAttributes) + { + AnimationCurve curve = tuple.Item1; + string attribute = tuple.Item2; + + float value = curve.Evaluate(time); + switch (attribute) + { + case "translationX": + SetTranslationX(value); + break; + case "translationY": + SetTranslationY(value); + break; + case "rotationInDegrees": + SetRotationInDegrees(value); + break; + case "scaleX": + SetScaleX(value); + break; + case "scaleY": + SetScaleY(value); + break; + case "alpha": + SetAlpha(value); + break; + default: + Debug.LogWarning("Unknown attribute in combo animation: " + attribute); + break; + } + } + } + + #endregion } diff --git a/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/GameController.cs b/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/GameController.cs index 8ea429a0..c2edfd69 100644 --- a/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/GameController.cs +++ b/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/GameController.cs @@ -400,16 +400,19 @@ private IEnumerator LoadSequence() element = loadedElement; }); yield return new WaitUntil(() => loaded); - if (!status.Ok()) + if (status.Ok()) { - reportLoadError(status); - yield break; + bg.SetBga(element, + loop: setup.patternAfterModifier.patternMetadata + .playBgaOnLoop, + offset: (float)setup.patternAfterModifier + .patternMetadata.bgaOffset); + } + else + { + Debug.LogError("An error occurred when loading BGA: " + + status.errorMessage + "; game will continue without BGA."); } - bg.SetBga(element, - loop: setup.patternAfterModifier.patternMetadata - .playBgaOnLoop, - offset: (float)setup.patternAfterModifier - .patternMetadata.bgaOffset); } reportLoadProgress(bga); @@ -522,6 +525,14 @@ public void BeginLoading() } setup.ruleset = Options.instance.ruleset; + // Statistics. + if (Statistics.instance != null) + { + Statistics.instance.totalPatternsPlayed++; + } + StatsMaintainer.instance?.OnGameBeginLoad(); + + // Begin the load sequence. StartCoroutine(LoadSequence()); } @@ -594,6 +605,8 @@ public void Unpause() public void Conclude() { + StatsMaintainer.instance?.OnGameConclude(); + AudioManager.instance.SetSpeed(1f); timer?.Dispose(); @@ -860,6 +873,12 @@ public void HitNote(NoteElements elements, float timeDifference) Judgement judgement = GameInputManager .TimeDifferenceToJudgement(elements.note, timeDifference, timer.speed); + JudgementAndTimeDifference judgementAndTimeDifference = + new JudgementAndTimeDifference() + { + judgement = judgement, + timeDifference = timeDifference + }; switch (elements.note.type) { @@ -870,18 +889,19 @@ public void HitNote(NoteElements elements, float timeDifference) if (judgement == Judgement.Miss) { // Missed notes do not enter Ongoing state. - ResolveNote(elements, judgement); + ResolveNote(elements, judgementAndTimeDifference); } else { // Register an ongoing note. - input.RegisterOngoingNote(elements, judgement); + input.RegisterOngoingNote(elements, + judgementAndTimeDifference); elements.SetOngoing(); vfxManager.SpawnOngoingVFX(elements, judgement); } break; default: - ResolveNote(elements, judgement); + ResolveNote(elements, judgementAndTimeDifference); break; } @@ -890,8 +910,15 @@ public void HitNote(NoteElements elements, float timeDifference) } public void ResolveNote(NoteElements elements, - Judgement judgement) + JudgementAndTimeDifference judgementAndTimeDifference) { + Judgement judgement = judgementAndTimeDifference.judgement; + if (judgement != Judgement.Break && + Statistics.instance != null) + { + Statistics.instance.totalNotesHit++; + } + noteManager.ResolveNote(elements); scoreKeeper.ResolveNote(elements.note.type, judgement); vfxManager.SpawnResolvedVFX(elements, judgement); @@ -899,7 +926,8 @@ public void ResolveNote(NoteElements elements, elements.Resolve(); setup.onNoteResolved?.Function?.Call(elements.note, - judgement, scoreKeeper); + judgement, scoreKeeper, + judgementAndTimeDifference.timeDifference); if (scoreKeeper.AllNotesResolved()) { setup.onAllNotesResolved?.Function?.Call(scoreKeeper); @@ -939,11 +967,12 @@ public void EmptyHitForKeyboard(Note note) #region Responding to time public void ComboTick() { - foreach (KeyValuePair pair in + foreach (KeyValuePair pair in input.ongoingNotes) { NoteElements elements = pair.Key; - Judgement judgement = pair.Value; + Judgement judgement = pair.Value.judgement; scoreKeeper.IncrementCombo(); comboText.Show(elements.noteImage, judgement, scoreKeeper); diff --git a/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/GameInputManager.cs b/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/GameInputManager.cs index 29d0ba0d..24faab44 100644 --- a/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/GameInputManager.cs +++ b/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/GameInputManager.cs @@ -42,7 +42,8 @@ public void Prepare() { // Initialize data structures. fingerInLane = new Dictionary(); - ongoingNotes = new Dictionary(); + ongoingNotes = new Dictionary(); ongoingNoteIsHitOnThisFrame = new Dictionary(); ongoingNoteLastInput = new Dictionary(); @@ -313,7 +314,8 @@ private void CheckForBreak() && !ongoingNotes.ContainsKey(upcoming)) { - controller.ResolveNote(upcoming, Judgement.Break); + controller.ResolveNote(upcoming, + JudgementAndTimeDifference.Break()); } } } @@ -701,16 +703,16 @@ private void CheckHitOnKeyboardNote(NoteElements elements) #endregion #region Ongoing notes - // Value is the judgement at note's head. - public Dictionary ongoingNotes - { get; private set; } + // Value is the judgement and time difference at note's head. + public Dictionary + ongoingNotes { get; private set; } private Dictionary ongoingNoteIsHitOnThisFrame; private Dictionary ongoingNoteLastInput; public void RegisterOngoingNote(NoteElements elements, - Judgement judgement) + JudgementAndTimeDifference judgementAndTimeDifference) { - ongoingNotes.Add(elements, judgement); + ongoingNotes.Add(elements, judgementAndTimeDifference); ongoingNoteIsHitOnThisFrame.Add(elements, true); } @@ -766,7 +768,8 @@ private void UpdateOngoingNotes() { // No input on this note for too long, resolve // as MISS. - controller.ResolveNote(elements, Judgement.Miss); + controller.ResolveNote(elements, + JudgementAndTimeDifference.Miss()); controller.StopKeysoundIfPlaying(note); ongoingNotes.Remove(elements); ongoingNoteLastInput.Remove(elements); diff --git a/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/NoteElements Subclasses/BasicNoteElements.cs b/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/NoteElements Subclasses/BasicNoteElements.cs index a8b00070..8fa81263 100644 --- a/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/NoteElements Subclasses/BasicNoteElements.cs +++ b/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/NoteElements Subclasses/BasicNoteElements.cs @@ -6,6 +6,13 @@ public class BasicNoteElements : NoteElements { public BasicNoteElements(Note note) : base(note) { } + protected override void TypeSpecificInitializeSizeExceptHitbox() + { + noteImage.EnableInClassList(hFlippedClass, + scanDirection == GameLayout.ScanDirection.Left && + GlobalResource.noteSkin.basic.flipWhenScanningLeft); + } + protected override void TypeSpecificUpdateState() { switch (state) diff --git a/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/NoteElements Subclasses/ChainHeadElements.cs b/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/NoteElements Subclasses/ChainHeadElements.cs index 17951077..80cb5bca 100644 --- a/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/NoteElements Subclasses/ChainHeadElements.cs +++ b/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/NoteElements Subclasses/ChainHeadElements.cs @@ -6,6 +6,13 @@ public class ChainHeadElements : ChainElementsBase { public ChainHeadElements(Note n) : base(n) { } + protected override void TypeSpecificInitializeSizeExceptHitbox() + { + noteImage.EnableInClassList(hFlippedClass, + scanDirection == GameLayout.ScanDirection.Left && + GlobalResource.noteSkin.chainHead.flipWhenScanningLeft); + } + protected override float GetNoteImageScaleFromRuleset() { return GlobalResource.noteSkin.chainHead.scale; diff --git a/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/NoteElements Subclasses/ChainNodeElements.cs b/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/NoteElements Subclasses/ChainNodeElements.cs index 09bb5f41..ca82373e 100644 --- a/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/NoteElements Subclasses/ChainNodeElements.cs +++ b/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/NoteElements Subclasses/ChainNodeElements.cs @@ -32,8 +32,15 @@ public void PointPathTowards(TemplateContainer previousNote) protected override void TypeSpecificInitializeSizeExceptHitbox() { + noteImage.EnableInClassList(hFlippedClass, + scanDirection == GameLayout.ScanDirection.Left && + GlobalResource.noteSkin.chainNode.flipWhenScanningLeft); + pathToPreviousNote.style.height = layout.laneHeight * GlobalResource.noteSkin.chainPath.scale; + pathToPreviousNote.EnableInClassList(hFlippedClass, + scanDirection == GameLayout.ScanDirection.Left && + GlobalResource.noteSkin.chainPath.flipWhenScanningLeft); // During initialization, this does nothing as there is no // next node. diff --git a/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/NoteElements Subclasses/DragNoteElements.cs b/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/NoteElements Subclasses/DragNoteElements.cs index feaa91fc..21824941 100644 --- a/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/NoteElements Subclasses/DragNoteElements.cs +++ b/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/NoteElements Subclasses/DragNoteElements.cs @@ -82,6 +82,10 @@ protected override float GetNoteImageScaleFromRuleset() protected override void TypeSpecificInitializeSizeExceptHitbox() { + noteImage.EnableInClassList(hFlippedClass, + scanDirection == GameLayout.ScanDirection.Left && + GlobalResource.noteSkin.dragHead.flipWhenScanningLeft); + gameContainerWidthCopy = layout.gameContainerWidth; scanHeightCopy = layout.scanHeight; curveWidth = layout.laneHeight * @@ -185,6 +189,8 @@ private void DrawCurve(MeshGenerationContext context) if (pointList == null || pointList.Count < 2) return; if (curveSprite == null) return; + bool hFlipped = scanDirection == GameLayout.ScanDirection.Left + && GlobalResource.noteSkin.dragCurve.flipWhenScanningLeft; // Convert relative positions to absolute ones. Vector2[] points = new Vector2[pointList.Count]; @@ -220,6 +226,8 @@ private void DrawCurve(MeshGenerationContext context) System.Func projectUv = (float u, float v) => { + if (hFlipped) v = 1f - v; + // First project from sprite to texture. float uInTexture = Mathf.Lerp( spriteRectInTexture.xMin, diff --git a/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/NoteElements Subclasses/HoldNoteElements.cs b/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/NoteElements Subclasses/HoldNoteElements.cs index c0d7ed0e..3082dbb9 100644 --- a/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/NoteElements Subclasses/HoldNoteElements.cs +++ b/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/NoteElements Subclasses/HoldNoteElements.cs @@ -6,6 +6,13 @@ public class HoldNoteElements : NoteElements { public HoldNoteElements(Note n) : base(n) { } + protected override void TypeSpecificInitializeSizeExceptHitbox() + { + noteImage.EnableInClassList(hFlippedClass, + scanDirection == GameLayout.ScanDirection.Left && + GlobalResource.noteSkin.holdHead.flipWhenScanningLeft); + } + protected override void TypeSpecificUpdateState() { switch (state) diff --git a/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/NoteElements Subclasses/HoldTrailElements.cs b/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/NoteElements Subclasses/HoldTrailElements.cs index a995638b..3b3b873d 100644 --- a/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/NoteElements Subclasses/HoldTrailElements.cs +++ b/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/NoteElements Subclasses/HoldTrailElements.cs @@ -64,7 +64,8 @@ public void Initialize(TemplateContainer templateContainer) layout.evenScanDirection : layout.oddScanDirection; bool scansToLeft = scanDirection == GameLayout.ScanDirection.Left; - trailContainer.EnableInClassList("h-flipped", scansToLeft); + trailContainer.EnableInClassList(NoteElements.hFlippedClass, + scansToLeft); // Calculate startPulse and endPulse. int pulsesPerScan = bps * Pattern.pulsesPerBeat; diff --git a/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/NoteElements Subclasses/RepeatHeadElementsBase.cs b/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/NoteElements Subclasses/RepeatHeadElementsBase.cs index ec9e9527..92b0b779 100644 --- a/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/NoteElements Subclasses/RepeatHeadElementsBase.cs +++ b/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/NoteElements Subclasses/RepeatHeadElementsBase.cs @@ -7,6 +7,13 @@ public class RepeatHeadElementsBase : NoteElements { public RepeatHeadElementsBase(Note n) : base(n) { } + protected override void TypeSpecificInitializeSizeExceptHitbox() + { + noteImage.EnableInClassList(hFlippedClass, + scanDirection == GameLayout.ScanDirection.Left && + GlobalResource.noteSkin.repeatHead.flipWhenScanningLeft); + } + protected override void TypeSpecificResolve() { state = State.PendingResolve; diff --git a/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/NoteElements Subclasses/RepeatHoldElements.cs b/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/NoteElements Subclasses/RepeatHoldElements.cs index f82dfd20..d98a49da 100644 --- a/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/NoteElements Subclasses/RepeatHoldElements.cs +++ b/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/NoteElements Subclasses/RepeatHoldElements.cs @@ -6,4 +6,11 @@ public class RepeatHoldElements : RepeatNoteElementsBase { public RepeatHoldElements(Note n) : base(n) { } + + protected override void TypeSpecificInitializeSizeExceptHitbox() + { + noteImage.EnableInClassList(hFlippedClass, + scanDirection == GameLayout.ScanDirection.Left && + GlobalResource.noteSkin.repeat.flipWhenScanningLeft); + } } diff --git a/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/NoteElements Subclasses/RepeatNoteElements.cs b/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/NoteElements Subclasses/RepeatNoteElements.cs index 9b476dc5..3ef13330 100644 --- a/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/NoteElements Subclasses/RepeatNoteElements.cs +++ b/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/NoteElements Subclasses/RepeatNoteElements.cs @@ -7,5 +7,10 @@ public class RepeatNoteElements : RepeatNoteElementsBase { public RepeatNoteElements(Note n) : base(n) { } - // That's the whole class. + protected override void TypeSpecificInitializeSizeExceptHitbox() + { + noteImage.EnableInClassList(hFlippedClass, + scanDirection == GameLayout.ScanDirection.Left && + GlobalResource.noteSkin.repeat.flipWhenScanningLeft); + } } diff --git a/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/NoteElements Subclasses/RepeatPathElements.cs b/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/NoteElements Subclasses/RepeatPathElements.cs index f2ec15d0..39f0a791 100644 --- a/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/NoteElements Subclasses/RepeatPathElements.cs +++ b/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/NoteElements Subclasses/RepeatPathElements.cs @@ -55,7 +55,8 @@ public void Initialize(TemplateContainer templateContainer) layout.evenScanDirection : layout.oddScanDirection; bool scansToLeft = scanDirection == GameLayout.ScanDirection.Left; - pathContainer.EnableInClassList("h-flipped", scansToLeft); + pathContainer.EnableInClassList(NoteElements.hFlippedClass, + scansToLeft); // Calculate startPulse and endPulse. int startPulseOfIntScan = intScan * pulsesPerScan; diff --git a/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/NoteElements.cs b/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/NoteElements.cs index 6c1e356f..0453bc23 100644 --- a/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/NoteElements.cs +++ b/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/NoteElements.cs @@ -64,6 +64,8 @@ // stuff. public class NoteElements : INoteHolder { + public const string hFlippedClass = "h-flipped"; + public Note note; Note INoteHolder.note { @@ -236,13 +238,16 @@ private void InitializeSizeExceptHitBox() scale = GlobalResource.vfxSkin.feverOverlay.scale; feverOverlay.style.width = laneHeight * scale; feverOverlay.style.height = laneHeight * scale; + feverOverlay.EnableInClassList(hFlippedClass, + scanDirection == GameLayout.ScanDirection.Left && + GlobalResource.vfxSkin.feverOverlay.flipWhenScanningLeft); } if (approachOverlay != null) { scale = GlobalResource.gameUiSkin.approachOverlay.scale; approachOverlay.style.width = laneHeight * scale; approachOverlay.style.height = laneHeight * scale; - approachOverlay.EnableInClassList("h-flipped", + approachOverlay.EnableInClassList(hFlippedClass, scanDirection == GameLayout.ScanDirection.Left); } @@ -258,7 +263,7 @@ protected virtual float GetNoteImageScaleFromRuleset() "NoteElements.GetNoteImageScaleFromRuleset should never be called."); } - // For paths and trails and stuff. + // For paths and trails and stuff. Also flipping. protected virtual void TypeSpecificInitializeSizeExceptHitbox() { } #endregion @@ -554,6 +559,11 @@ private static void RotateElementToward(VisualElement self, return; } + if (self.ClassListContains(hFlippedClass)) + { + delta = -delta; + } + float angleInRadian = Mathf.Atan2(delta.y, delta.x); self.style.rotate = new StyleRotate(new Rotate(new Angle( angleInRadian, AngleUnit.Radian))); diff --git a/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/ScoreKeeper.cs b/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/ScoreKeeper.cs index 4dbb84b4..70f1b52a 100644 --- a/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/ScoreKeeper.cs +++ b/TECHMANIA/Assets/Scripts/Components/Main Scene/Game/ScoreKeeper.cs @@ -13,6 +13,30 @@ public enum Judgement Break } +public struct JudgementAndTimeDifference +{ + public Judgement judgement; + public float timeDifference; // game time - correct time + + public static JudgementAndTimeDifference Miss() + { + return new JudgementAndTimeDifference() + { + judgement = Judgement.Miss, + timeDifference = float.PositiveInfinity + }; + } + + public static JudgementAndTimeDifference Break() + { + return new JudgementAndTimeDifference() + { + judgement = Judgement.Break, + timeDifference = float.PositiveInfinity + }; + } +} + public enum PerformanceMedal { NoMedal, diff --git a/TECHMANIA/Assets/Scripts/Components/Main Scene/GlobalResourceLoader.cs b/TECHMANIA/Assets/Scripts/Components/Main Scene/GlobalResourceLoader.cs index 140c0dbd..f23d2f17 100644 --- a/TECHMANIA/Assets/Scripts/Components/Main Scene/GlobalResourceLoader.cs +++ b/TECHMANIA/Assets/Scripts/Components/Main Scene/GlobalResourceLoader.cs @@ -149,6 +149,7 @@ public void LoadComboSkin(ProgressCallback progressCallback, completeCallback(status); return; } + // The game expects 10 digits in each set. foreach (List list in GlobalResource.comboSkin.GetReferenceToDigitLists()) @@ -158,6 +159,17 @@ public void LoadComboSkin(ProgressCallback progressCallback, list.Add(SpriteSheet.MakeNewEmptySpriteSheet()); } } + + // Convert animation from custom format to Unity format. + GlobalResource.comboAnimationCurvesAndAttributes = new + List>(); + foreach (SkinAnimationCurve customCurve in + GlobalResource.comboSkin.animationCurves) + { + GlobalResource.comboAnimationCurvesAndAttributes.Add( + customCurve.ToUnityCurveAndAttribute()); + } + completeCallback(Status.OKStatus()); }; List spriteSheets = GlobalResource.comboSkin diff --git a/TECHMANIA/Assets/Scripts/Components/Main Scene/Startup.cs b/TECHMANIA/Assets/Scripts/Components/Main Scene/Startup.cs index 6ddd0b90..e52ed35f 100644 --- a/TECHMANIA/Assets/Scripts/Components/Main Scene/Startup.cs +++ b/TECHMANIA/Assets/Scripts/Components/Main Scene/Startup.cs @@ -1,6 +1,7 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Text; using UnityEngine; public class Startup : MonoBehaviour @@ -34,6 +35,9 @@ void Start() Input.simulateMouseWithTouches = false; Paths.PrepareFolders(); Options.RefreshInstance(); + Statistics.RefreshInstance(); + Statistics.instance.timesAppLaunched++; + GetComponent().BeginWorking(); FmodManager.instance.Initialize( Options.instance.audioBufferSize, diff --git a/TECHMANIA/Assets/Scripts/Components/Main Scene/StatsMaintainer.cs b/TECHMANIA/Assets/Scripts/Components/Main Scene/StatsMaintainer.cs new file mode 100644 index 00000000..5d327863 --- /dev/null +++ b/TECHMANIA/Assets/Scripts/Components/Main Scene/StatsMaintainer.cs @@ -0,0 +1,73 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +// This component: +// - updates the TimeSpans in Statistics.instance every frame +// - saves stats to disk every 30 seconds +public class StatsMaintainer : MonoBehaviour +{ + public int savePeriodInSeconds; + + private bool active = false; + private bool inGame; + private bool inEditor; + private DateTime lastSaved; + + public static StatsMaintainer instance; + + private void Start() + { + instance = this; + } + + // Update is called once per frame + void Update() + { + if (!active) return; + + Statistics stats = Statistics.instance; + if (stats == null) return; + + TimeSpan span = TimeSpan.FromSeconds(Time.deltaTime); + stats.totalPlayTime += span; + if (inGame) stats.timeInGame += span; + if (inEditor) stats.timeInEditor += span; + + if (DateTime.Now - lastSaved >= + TimeSpan.FromSeconds(savePeriodInSeconds) && !inGame) + { + stats.SaveToFile(); + lastSaved = DateTime.Now; + } + } + + public void BeginWorking() + { + active = true; + inGame = false; + inEditor = false; + lastSaved = DateTime.Now; + } + + public void OnGameBeginLoad() + { + inGame = true; + } + + public void OnGameConclude() + { + inGame = false; + } + + public void OnEnterEditor() + { + inEditor = true; + } + + public void OnLeaveEditor() + { + inEditor = false; + } +} diff --git a/TECHMANIA/Assets/Scripts/Components/Main Scene/StatsMaintainer.cs.meta b/TECHMANIA/Assets/Scripts/Components/Main Scene/StatsMaintainer.cs.meta new file mode 100644 index 00000000..98bf40eb --- /dev/null +++ b/TECHMANIA/Assets/Scripts/Components/Main Scene/StatsMaintainer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ff1e1f349131a05468e3cd0f7a242e96 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/TECHMANIA/Assets/Scripts/GlobalResource.cs b/TECHMANIA/Assets/Scripts/GlobalResource.cs index be4f7c6a..72d59bf2 100644 --- a/TECHMANIA/Assets/Scripts/GlobalResource.cs +++ b/TECHMANIA/Assets/Scripts/GlobalResource.cs @@ -23,6 +23,9 @@ public static class GlobalResource public static ComboSkin comboSkin; public static GameUISkin gameUiSkin; + public static List> + comboAnimationCurvesAndAttributes; + public static List GetSkinList(SkinType type) { return AllSkinsInFolder( diff --git a/TECHMANIA/Assets/Scripts/Paths.cs b/TECHMANIA/Assets/Scripts/Paths.cs index 5cb91bbc..b208c1d2 100644 --- a/TECHMANIA/Assets/Scripts/Paths.cs +++ b/TECHMANIA/Assets/Scripts/Paths.cs @@ -257,6 +257,11 @@ public static string GetRecordsFilePath() { return Path.Combine(dataFolder, "records.json"); } + + public static string GetStatisticsFilePath() + { + return Path.Combine(dataFolder, "stats.json"); + } #endregion #region Listing files of specific type diff --git a/TECHMANIA/Assets/Scripts/Serializable/Options.cs b/TECHMANIA/Assets/Scripts/Serializable/Options.cs index 43987e33..622a54c2 100644 --- a/TECHMANIA/Assets/Scripts/Serializable/Options.cs +++ b/TECHMANIA/Assets/Scripts/Serializable/Options.cs @@ -505,6 +505,7 @@ public class EditorOptions public bool lockNotesInTime; public bool lockDragAnchorsInTime; public bool snapDragAnchors; + public bool autoSave; // Playback @@ -525,6 +526,7 @@ public EditorOptions() lockNotesInTime = false; lockDragAnchorsInTime = false; snapDragAnchors = true; + autoSave = false; metronome = false; assistTickOnSilentNotes = false; @@ -546,7 +548,9 @@ public EditorOptions Clone() metronome = metronome, assistTickOnSilentNotes = assistTickOnSilentNotes, - returnScanlineAfterPlayback = returnScanlineAfterPlayback + returnScanlineAfterPlayback = returnScanlineAfterPlayback, + + autoSave = autoSave }; } } diff --git a/TECHMANIA/Assets/Scripts/Serializable/Skin.cs b/TECHMANIA/Assets/Scripts/Serializable/Skin.cs index 9a4ae384..ae89842f 100644 --- a/TECHMANIA/Assets/Scripts/Serializable/Skin.cs +++ b/TECHMANIA/Assets/Scripts/Serializable/Skin.cs @@ -21,6 +21,7 @@ public class SpriteSheet public float scale; // Relative to 1x lane height public float speed; // Relative to 60 fps public bool additiveShader; + public bool flipWhenScanningLeft; [NonSerialized] // Loaded at runtime public Texture2D texture; @@ -39,6 +40,7 @@ public SpriteSheet() scale = 1f; speed = 1f; additiveShader = false; + flipWhenScanningLeft = false; } // Call after loading texture. @@ -140,6 +142,91 @@ public static SpriteSheet MakeNewEmptySpriteSheet() #endregion } +[Serializable] +[MoonSharpUserData] +public class SkinAnimationKeyframe +{ + // All values default to 0. + + public float time; + public float value; + public float inTangent; + public float outTangent; + public float inWeight; + public float outWeight; + public int weightedMode; + + public Keyframe ToUnityKeyframe() + { + return new Keyframe(time, value, inTangent, outTangent) + { + inWeight = inWeight, + outWeight = outWeight, + weightedMode = (WeightedMode)weightedMode + }; + } +} + +[Serializable] +[MoonSharpUserData] +public class SkinAnimationCurve +{ + public List keys; + + // Which attribute this curve controls. Possible values: + // translationX + // translationY + // rotationInDegrees + // scaleX + // scaleY + // alpha + public string attribute; + + // "once" (default) + // "pingpong" + // "loop" + public string loopMode; + + public SkinAnimationCurve() + { + keys = new List(); + } + + public void AddKeyframe(float time, float value, + float inTangent = 0f, float outTangent = 0f) + { + keys.Add(new SkinAnimationKeyframe() + { + time = time, + value = value, + inTangent = inTangent, + outTangent = outTangent + }); + } + + public Tuple ToUnityCurveAndAttribute() + { + AnimationCurve curve = new AnimationCurve(); + foreach (SkinAnimationKeyframe k in keys) + { + curve.AddKey(k.ToUnityKeyframe()); + } + switch (loopMode) + { + case "pingpong": + curve.postWrapMode = WrapMode.PingPong; + break; + case "loop": + curve.postWrapMode = WrapMode.Loop; + break; + default: + curve.postWrapMode = WrapMode.Once; + break; + } + return new Tuple(curve, attribute); + } +} + [Serializable] [FormatVersion(NoteSkin.kVersion, typeof(NoteSkin), isLatest: true)] public class NoteSkinBase : SerializableClass {} @@ -342,6 +429,8 @@ public class ComboSkin : ComboSkinBase public List coolDigits; public List goodDigits; + public List animationCurves; + public ComboSkin() { version = kVersion; @@ -368,6 +457,43 @@ public ComboSkin() coolDigits.Add(new SpriteSheet()); goodDigits.Add(new SpriteSheet()); } + + animationCurves = new List(); + + // Default curves + + SkinAnimationCurve scaleXCurve = new SkinAnimationCurve() + { + attribute = "scaleX" + }; + scaleXCurve.AddKeyframe(0f, 1.2f); + scaleXCurve.AddKeyframe(0.1f, 0.8f); + scaleXCurve.AddKeyframe(0.133f, 1.1f); + scaleXCurve.AddKeyframe(0.167f, 1f); + scaleXCurve.AddKeyframe(1f, 1f); + animationCurves.Add(scaleXCurve); + + SkinAnimationCurve scaleYCurve = new SkinAnimationCurve() + { + attribute = "scaleY" + }; + scaleYCurve.AddKeyframe(0f, 1.2f); + scaleYCurve.AddKeyframe(0.1f, 0.8f); + scaleYCurve.AddKeyframe(0.133f, 1.1f); + scaleYCurve.AddKeyframe(0.167f, 1f); + scaleYCurve.AddKeyframe(0.833f, 1f); + scaleYCurve.AddKeyframe(1f, 2f); + animationCurves.Add(scaleYCurve); + + SkinAnimationCurve alphaCurve = new SkinAnimationCurve() + { + attribute = "alpha" + }; + alphaCurve.AddKeyframe(0f, 0.5f, inTangent: 8f); + alphaCurve.AddKeyframe(0.1f, 1f); + alphaCurve.AddKeyframe(0.833f, 1f); + alphaCurve.AddKeyframe(1f, 0f); + animationCurves.Add(alphaCurve); } public List GetReferenceToAllSpriteSheets() diff --git a/TECHMANIA/Assets/Scripts/Serializable/Statistics.cs b/TECHMANIA/Assets/Scripts/Serializable/Statistics.cs new file mode 100644 index 00000000..5e2c336d --- /dev/null +++ b/TECHMANIA/Assets/Scripts/Serializable/Statistics.cs @@ -0,0 +1,85 @@ +using MoonSharp.Interpreter; +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +[Serializable] +[FormatVersion(Statistics.kVersion, typeof(Statistics), isLatest: true)] +public class StatisticsBase : SerializableClass +{ + public void SaveToFile() + { + SaveToFile(Paths.GetStatisticsFilePath()); + } +} + +// All fields are read-only to Lua. +[Serializable] +[MoonSharpUserData] +public class Statistics : StatisticsBase +{ + public const string kVersion = "1"; + + public TimeSpan totalPlayTime + { + get; + [MoonSharpHidden] + set; + } + public TimeSpan timeInGame + { + get; + [MoonSharpHidden] + set; + } + public TimeSpan timeInEditor + { + get; + [MoonSharpHidden] + set; + } + + public long timesAppLaunched + { + get; + [MoonSharpHidden] + set; + } + public long totalPatternsPlayed + { + get; + [MoonSharpHidden] + set; + } + public long totalNotesHit + { + get; + [MoonSharpHidden] + set; + } + + public Statistics() + { + version = kVersion; + } + + #region Instance + public static Statistics instance { get; private set; } + + public static void RefreshInstance() + { + try + { + instance = LoadFromFile( + Paths.GetStatisticsFilePath()) as Statistics; + } + catch (Exception ex) + { + Debug.LogError("An error occurred when loading statistics. All stats will be reset. See next error for details."); + Debug.LogException(ex); + instance = new Statistics(); + } + } + #endregion +} diff --git a/TECHMANIA/Assets/Scripts/Serializable/Statistics.cs.meta b/TECHMANIA/Assets/Scripts/Serializable/Statistics.cs.meta new file mode 100644 index 00000000..ce708cfe --- /dev/null +++ b/TECHMANIA/Assets/Scripts/Serializable/Statistics.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9d012095d7da4e54b9e4801e804f78bd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/TECHMANIA/Assets/Scripts/Theme API/EditorInterface.cs b/TECHMANIA/Assets/Scripts/Theme API/EditorInterface.cs index c3bded27..b5aadf97 100644 --- a/TECHMANIA/Assets/Scripts/Theme API/EditorInterface.cs +++ b/TECHMANIA/Assets/Scripts/Theme API/EditorInterface.cs @@ -13,6 +13,9 @@ public class EditorInterface #region Launching and exiting public void LaunchOnTrack(string trackFolder) { + // Statistics + StatsMaintainer.instance?.OnEnterEditor(); + // Set EditorContext EditorContext.previewCallback = () => { @@ -31,6 +34,7 @@ public void LaunchOnTrack(string trackFolder) }; EditorContext.exitCallback = () => { + StatsMaintainer.instance?.OnLeaveEditor(); TopLevelObjects.instance.ShowUiDocument(); TopLevelObjects.instance.editorCanvas.gameObject .SetActive(false); @@ -59,9 +63,13 @@ public void LaunchOnTrack(string trackFolder) public void LaunchOnSetlist(string setlistFolder) { + // Statistics + StatsMaintainer.instance?.OnEnterEditor(); + // Set EditorContext EditorContext.exitCallback = () => { + StatsMaintainer.instance?.OnLeaveEditor(); TopLevelObjects.instance.ShowUiDocument(); TopLevelObjects.instance.editorCanvas.gameObject .SetActive(false); diff --git a/TECHMANIA/Assets/Scripts/Theme API/GameSetup.cs b/TECHMANIA/Assets/Scripts/Theme API/GameSetup.cs index 25f2ba71..a4677742 100644 --- a/TECHMANIA/Assets/Scripts/Theme API/GameSetup.cs +++ b/TECHMANIA/Assets/Scripts/Theme API/GameSetup.cs @@ -112,7 +112,8 @@ public class LoadProgress // Parameter: GameTimer. Called every frame, in // Ongoing and Paused states. public DynValue onUpdate; - // Parameter: Note, Judgement, ScoreKeeper. + // Parameter: Note, Judgement, ScoreKeeper, time difference + // in seconds (may be +infinity for MISS and BREAK). public DynValue onNoteResolved; // Parameter: ScoreKeeper. public DynValue onAllNotesResolved; diff --git a/TECHMANIA/Assets/Scripts/Theme API/IO.cs b/TECHMANIA/Assets/Scripts/Theme API/IO.cs index b2a41cc9..1abdea99 100644 --- a/TECHMANIA/Assets/Scripts/Theme API/IO.cs +++ b/TECHMANIA/Assets/Scripts/Theme API/IO.cs @@ -317,6 +317,24 @@ public static void ReloadGameUiSkin( completeCallback.Function.Call(status); }); } + + public static void ReloadAllSkins( + DynValue progressCallback, + DynValue completeCallback) + { + GlobalResourceLoader.GetInstance().LoadAllSkins( + progressCallback: (string currentlyLoadingFile) => + { + if (progressCallback.IsNil()) return; + progressCallback.Function.Call( + currentlyLoadingFile); + }, + completeCallback: (Status status) => + { + if (completeCallback.IsNil()) return; + completeCallback.Function.Call(status); + }); + } } } diff --git a/TECHMANIA/Assets/Scripts/Theme API/ScriptSession.cs b/TECHMANIA/Assets/Scripts/Theme API/ScriptSession.cs index ca7d52d9..82ae6f93 100644 --- a/TECHMANIA/Assets/Scripts/Theme API/ScriptSession.cs +++ b/TECHMANIA/Assets/Scripts/Theme API/ScriptSession.cs @@ -32,6 +32,7 @@ public static void Prepare() // Register types UserData.RegisterAssembly(); UserData.RegisterType>(); + UserData.RegisterType(); UserData.RegisterType(); UserData.RegisterType(); UserData.RegisterType(); @@ -87,9 +88,10 @@ public static Table GetApi(int version) apiVersion = version; switch (version) { - case 1: - case 2: - case 3: + case 1: // 2.0 + case 2: // 2.1 + case 3: // 2.2 + case 4: // 2.3 return GetApiVersion1(); default: throw new ApiNotSupportedException(); diff --git a/TECHMANIA/Assets/Scripts/Theme API/Techmania.cs b/TECHMANIA/Assets/Scripts/Theme API/Techmania.cs index 6e0cde5c..c87f5bad 100644 --- a/TECHMANIA/Assets/Scripts/Theme API/Techmania.cs +++ b/TECHMANIA/Assets/Scripts/Theme API/Techmania.cs @@ -59,6 +59,7 @@ public void SetPanelSettings(string path) public Options options => Options.instance; public Ruleset ruleset => Ruleset.instance; public Records records => Records.instance; + public Statistics stats => Statistics.instance; public ThemeL10n l10n { get; private set; } public DynValue paths; // Of type Paths public DynValue resources; // Of type GlobalResource @@ -332,6 +333,7 @@ public string Version() public static void Quit() { + Statistics.instance.SaveToFile(); #if UNITY_EDITOR UnityEditor.EditorApplication.isPlaying = false; #else diff --git a/TECHMANIA/Assets/Sprites/Material Icons/Additional Icons.psd b/TECHMANIA/Assets/Sprites/Material Icons/Additional Icons.psd index 2794fe47..b4e7366e 100644 Binary files a/TECHMANIA/Assets/Sprites/Material Icons/Additional Icons.psd and b/TECHMANIA/Assets/Sprites/Material Icons/Additional Icons.psd differ diff --git a/TECHMANIA/Assets/String Table (system).csv b/TECHMANIA/Assets/String Table (system).csv index beaecfba..35e10ffe 100644 --- a/TECHMANIA/Assets/String Table (system).csv +++ b/TECHMANIA/Assets/String Table (system).csv @@ -8,7 +8,7 @@ Used in information menu.",localizer_names,N/A,DJ Hitori,Kento,"BrainInAVet, Sin ,,,,,, ,resource_loader_loading_skins,Loading skins... ({0} / {1}),正在读取皮肤…… ({0} / {1}),正在載入造型…… ({0} / {1}),スキンをロード中… ({0} / {1}),스킨 로드 중... ({0} / {1}) ,resource_loader_loading_track_list,Loading track list... ({0} / {1}),正在读取曲目列表…… ({0} / {1}),正在載入歌曲清單…… ({0} / {1}),トラックをロード中… ({0} / {1}),음악 로드 중... ({0} / {1}) -Added in 2.2,resource_loader_loading_setlist_list,Loading setlists... ({0} / {1}),正在读取组曲列表…… ({0} / {1}),正在載入組曲清單…… ({0} / {1}),セットリストをロード中… ({0} / {1}),디스크셋 로드 중... ({0} / {1}) +,resource_loader_loading_setlist_list,Loading setlists... ({0} / {1}),正在读取组曲列表…… ({0} / {1}),正在載入組曲清單…… ({0} / {1}),セットリストをロード中… ({0} / {1}),디스크셋 로드 중... ({0} / {1}) ,resource_loader_loading_theme,Loading theme... ({0} / {1}),正在读取主题…… ({0} / {1}),正在載入主題…… ({0} / {1}),テーマをロード中… ({0} / {1}),테마 로드 중... ({0} / {1}) ,boot_screen_revert_default_theme_label,Revert to default theme ({0}),复原至默认主题 ({0}),還原至預設主題 ({0}),デフォルトにします… ({0}),기본값으로 되돌리는 중... ({0}) ,boot_screen_revert_default_theme_button,REVERT,复原,還原,デフォルトにする,기본값으로 복원 @@ -66,7 +66,7 @@ TECHMANIA 기본 테마를 사용합니다." ,,,,,, ,discord_state_editing_track,Editing Track,正在编辑曲目,正在編輯歌曲,トラック編集,패턴 편집 중 {0} is number of lanes; {1} is control scheme; {2} is level.,discord_state_editing_pattern,Editing {0}L {1} - {2},正在编辑:{0}轨 {1} - {2},正在編輯:{0}軌 {1} - {2},{0}ライン {1} - {2} 編集,{1} 모드 / {0}라인 {2} 편집 중 -Added in 2.2,discord_state_editing_setlist,Editing Setlist,正在编辑组曲,正在編輯組曲,セットリスト編集,디스크셋 편집 중 +,discord_state_editing_setlist,Editing Setlist,正在编辑组曲,正在編輯組曲,セットリスト編集,디스크셋 편집 중 ,,,,,, ,message_dialog_ok_button,OK,确定,確定,OK,확인 ,,,,,, @@ -360,6 +360,7 @@ Ctrl 또는 Shift 키를 누른 채로 여러 사운드를 선택하여 순서 ,pattern_panel_options_lock_anchors_description,Prevent dragging drag anchors to a different time.,确保无法横向移动任何拖拽音符的锚点。,確保無法橫向移動任何拖動音符的錨點。,ドラッグノートのアンカーを移すとき、他の小節に移せなくなります。,드래그 노트의 고정점을 옮길 때 시점을 고정합니다. ,pattern_panel_options_snap_anchors_label,Snap drag note anchors,对齐拖拽锚点,對齊拖動錨點,ドラッグノートアンカースナップ,드래그 노트 고정점 스냅 ,pattern_panel_options_snap_anchors_description,Snap anchors the same way as other notes.,按照对齐音符的方式对齐拖拽音符的锚点。,按照對齊音符的方式對齊拖動音符的錨點。,ドラッグノートのアンカーも他のノートのようにスナップされます。,드래그 노트의 고정점도 다른 노트처럼 스냅되도록 설정합니다. +Added in 2.3,pattern_panel_options_auto_save_label,Auto save every 5 minutes,每5分钟自动保存,每 5 分鐘自動儲存,5分毎にオートセーブ,5분마다 자동 저장 ,pattern_panel_options_playback_header,Playback,播放,播放,プレイバック,재생 ,pattern_panel_options_metronome_label,Metronome,节拍器,節拍器,メトロノーム,메트로놈 기능 ,pattern_panel_options_assist_tick_label,Play ticks on silent notes,在无声音符上播放辅助音效,在無聲音符上播放輔助音效。,無音ノートに打撃音適用,연주음이 없는 노트에서 클랩음 재생 @@ -596,7 +597,7 @@ You can continue to edit this pattern, but playback and preview will be disabled * このレベルはおすすめのレベルです。実際のレベルは自分で判断してください。","* 각 항목의 정의외 계산 방식은 TECHMANIA 공식 문서를 참조하십시오. * 이 레벨은 프로그램의 추천 값입니다. 실제 레벨을 정할 때 참고용으로만 사용하십시오." ,,,,,, -All strings on setlists are added in 2.2,edit_setlist_panel_title,Editing Setlist,编辑组曲,編輯組曲,セットリスト編集,디스크셋 편집 +,edit_setlist_panel_title,Editing Setlist,编辑组曲,編輯組曲,セットリスト編集,디스크셋 편집 ,edit_setlist_panel_resources_and_metadata_header,Resources and metadata,资源与元数据,資源與組曲資訊,リソース及びメタデータ,리소스 & 메타데이터 ,edit_setlist_panel_import_button,Import,导入,匯入,インポート,가져오기 ,edit_setlist_panel_import_button_help,"Import image files so they can be used diff --git a/TECHMANIA/Assets/UI/Controls/Controls.txt b/TECHMANIA/Assets/UI/Controls/Controls.txt index 0be1d75e..2393a197 100644 --- a/TECHMANIA/Assets/UI/Controls/Controls.txt +++ b/TECHMANIA/Assets/UI/Controls/Controls.txt @@ -76,7 +76,7 @@ function InitializeControls() end) -- Buttons - function SetUpButtonSoundsForClass(className) + local function SetUpButtonSoundsForClass(className) tm.root.Query(nil, className).ForEach(function (element) controls.SetUpButtonSounds(element) end) diff --git a/TECHMANIA/Assets/UI/Images/SkipNext.png b/TECHMANIA/Assets/UI/Images/SkipNext.png new file mode 100644 index 00000000..4c71a9fe Binary files /dev/null and b/TECHMANIA/Assets/UI/Images/SkipNext.png differ diff --git a/TECHMANIA/Assets/UI/Images/SkipNext.png.meta b/TECHMANIA/Assets/UI/Images/SkipNext.png.meta new file mode 100644 index 00000000..d7f82134 --- /dev/null +++ b/TECHMANIA/Assets/UI/Images/SkipNext.png.meta @@ -0,0 +1,114 @@ +fileFormatVersion: 2 +guid: b53e1197fe24c2e49b8886a6ad150bcf +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/TECHMANIA/Assets/UI/MainScript.txt b/TECHMANIA/Assets/UI/MainScript.txt index 65ee32bd..c938f74d 100644 --- a/TECHMANIA/Assets/UI/MainScript.txt +++ b/TECHMANIA/Assets/UI/MainScript.txt @@ -1,4 +1,4 @@ -api = getApi(3) +api = getApi(4) tm = api.tm net = api.net unity = api.unity @@ -19,6 +19,7 @@ tm.ExecuteScriptFromTheme("Assets/UI/Controls/Controls.txt") InitializeControls() tm.ExecuteScriptFromTheme("Assets/UI/Scripts/Alert Box.txt") +tm.ExecuteScriptFromTheme("Assets/UI/Scripts/Jukebox.txt") tm.ExecuteScriptFromTheme("Assets/UI/Scripts/Panels/Welcome Mat.txt") tm.ExecuteScriptFromTheme("Assets/UI/Scripts/Panels/Select Track Panel.txt") tm.ExecuteScriptFromTheme("Assets/UI/Scripts/Panels/Select Setlist Panel.txt") diff --git a/TECHMANIA/Assets/UI/MainTree.uxml b/TECHMANIA/Assets/UI/MainTree.uxml index 4b4387df..b50ff01d 100644 --- a/TECHMANIA/Assets/UI/MainTree.uxml +++ b/TECHMANIA/Assets/UI/MainTree.uxml @@ -1,9 +1,9 @@ - + @@ -98,9 +98,6 @@ - - - @@ -112,6 +109,16 @@ + + + + + + + + + + @@ -146,10 +153,10 @@ - + - + @@ -541,7 +548,7 @@ - + @@ -654,6 +661,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -793,24 +828,40 @@