diff --git a/.gitattributes b/.gitattributes index e5c5394e6..d530ed421 100644 --- a/.gitattributes +++ b/.gitattributes @@ -54,6 +54,9 @@ *.sbsar filter=lfs diff=lfs merge=lfs -text *.msgpack filter=lfs diff=lfs merge=lfs -text GameData/*.cc filter=lfs diff=lfs merge=lfs -text +GameData/Mods/**/*.cc filter=lfs diff=lfs merge=lfs -text +GameData/Mods/**/*.glb filter=lfs diff=lfs merge=lfs -text +tools/blender/tests/fixtures/*.glb filter=lfs diff=lfs merge=lfs -text *.a filter=lfs diff=lfs merge=lfs -text *AkSoundEngine filter=lfs diff=lfs merge=lfs -text *AkWaapiClient filter=lfs diff=lfs merge=lfs -text diff --git a/.gitignore b/.gitignore index 75b9cad4f..ac9c49142 100644 --- a/.gitignore +++ b/.gitignore @@ -66,6 +66,7 @@ GameData/*.lock /Aetheria.Shared/obj/ /tools/**/bin/ /tools/**/obj/ +/ModTools/ /tests/**/bin/ /tests/**/obj/ @@ -93,7 +94,7 @@ crashlytics-build.properties Packages/packages-lock.json GameData/run.cc GameData/player.cc -Vault/Aetheria/.obsidian/plugins/copilot/data.json +GameData/RemovedMods/ # Agent scratch, sandboxed toolchain caches, and throwaway checkouts. These had # grown to 47 untracked entries; the worktree must stay legible, so they never @@ -109,3 +110,6 @@ tests/_scratch_* .nuget-sandbox/ .dotnet-sandbox/ .appdata-sandbox/ + +# Stryker.NET mutation reports (regenerated per run) +StrykerOutput/ diff --git a/.lfsconfig b/.lfsconfig new file mode 100644 index 000000000..d9ce439fc --- /dev/null +++ b/.lfsconfig @@ -0,0 +1,2 @@ +[lfs] + url = https://eureka.gamecult.org/forge/GameCult/Aetheria.git/info/lfs diff --git a/.voidbot/state/aetheria.cc b/.voidbot/state/aetheria.cc index 168f00ca4..91f465eca 100644 Binary files a/.voidbot/state/aetheria.cc and b/.voidbot/state/aetheria.cc differ diff --git a/Aetheria.Shared/Aetheria.Shared.csproj b/Aetheria.Shared/Aetheria.Shared.csproj index 5274558da..a8a4c97bc 100644 --- a/Aetheria.Shared/Aetheria.Shared.csproj +++ b/Aetheria.Shared/Aetheria.Shared.csproj @@ -24,7 +24,11 @@ - + + + + + diff --git a/Asset Sources/PBR Materials.blend b/Asset Sources/PBR Materials.blend new file mode 100644 index 000000000..cbe7a475b --- /dev/null +++ b/Asset Sources/PBR Materials.blend @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7c88c4c5380c3553182a545e04ffcc0776a54f7cbde4fa80de95f5e569b931de +size 359499 diff --git a/Asset Sources/blender_assets.cats.txt b/Asset Sources/blender_assets.cats.txt new file mode 100644 index 000000000..7fc29fe08 --- /dev/null +++ b/Asset Sources/blender_assets.cats.txt @@ -0,0 +1,10 @@ +# This is an Asset Catalog Definition file for Blender. +# +# Empty lines and lines starting with `#` will be ignored. +# The first non-ignored line should be the version indicator. +# Other lines are of the format "UUID:catalog/path/for/assets:simple catalog name" + +VERSION 1 + +2c70f9d2-3a69-4004-8f42-4712b3e6c439:Aetheria:Aetheria +a71be0dc-105e-4c66-8ff3-acb25522e9cd:Aetheria/PBR:Aetheria-PBR diff --git a/Assets/Content/Prefabs/Mine.prefab b/Assets/Content/Prefabs/Mine.prefab new file mode 100644 index 000000000..912986ee7 --- /dev/null +++ b/Assets/Content/Prefabs/Mine.prefab @@ -0,0 +1,150 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &3437702659452284539 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3879893384158149147} + - component: {fileID: 8643339631069775210} + - component: {fileID: 7703217095432408775} + - component: {fileID: 7283754118921506074} + m_Layer: 0 + m_Name: Mine + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &3879893384158149147 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3437702659452284539} + serializedVersion: 2 + 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: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &8643339631069775210 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3437702659452284539} + m_Mesh: {fileID: -5495902117074765545, guid: dab8e1a18a1b825458e8e6356cf00cd2, type: 3} +--- !u!23 &7703217095432408775 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3437702659452284539} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 38f8ba6b169127249b6532be2b3926ee, type: 2} + - {fileID: 2100000, guid: 71e1f3613633dfa488fff097aaf97660, type: 2} + - {fileID: 2100000, guid: e879c37f3520bf14a8a6075581faf7b2, type: 2} + - {fileID: 2100000, guid: 33a2546b27ff92d4fb43d5a76a9693c0, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_MaskInteraction: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!114 &7283754118921506074 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3437702659452284539} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 35c62f5e26769f645b1a1614a70422e1, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::MineInstance + MeshRenderer: {fileID: 7703217095432408775} + EmissionSubmesh: 2 + EmissionCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0.051179443 + outSlope: 0.051179443 + tangentMode: 0 + weightedMode: 3 + inWeight: 0 + outWeight: 0.24423963 + - serializedVersion: 3 + time: 0.5 + value: 0.1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 3 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 3 + inWeight: 0.22580647 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + ActiveCycleDuration: 1 + ArmedCycleDuration: 0.25 + ActiveEmission: 100 + ArmedEmission: 1000 + RotationSpeed: 1 + HitEffect: {fileID: 1121192042590650, guid: e1b08032bec16ba4eb1ae23cbd572664, type: 3} + HitEffectScale: 10 diff --git a/Assets/Prefabs/RTS/Asteroid Belt.prefab.meta b/Assets/Content/Prefabs/Mine.prefab.meta similarity index 74% rename from Assets/Prefabs/RTS/Asteroid Belt.prefab.meta rename to Assets/Content/Prefabs/Mine.prefab.meta index f1298ae38..01e11b0eb 100644 --- a/Assets/Prefabs/RTS/Asteroid Belt.prefab.meta +++ b/Assets/Content/Prefabs/Mine.prefab.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 1f1bfa2175a13b647888e2949e0cb138 +guid: b04728b2b65e057429eb6e8529299c8a PrefabImporter: externalObjects: {} userData: diff --git a/Assets/Content/Prefabs/ShipModTemplate.prefab b/Assets/Content/Prefabs/ShipModTemplate.prefab new file mode 100644 index 000000000..7ed600cb6 --- /dev/null +++ b/Assets/Content/Prefabs/ShipModTemplate.prefab @@ -0,0 +1,51 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &4001 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4002} + - component: {fileID: 4003} + m_Layer: 0 + m_Name: ShipModTemplate + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4002 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4001} + 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_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &4003 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4001} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7c3e9a52d8b14f0e8a6d2b1f4c95e703, type: 3} + m_Name: + m_EditorClassIdentifier: + Shield: {fileID: 8402070500206635106, guid: 897fa55d98f1f7f40b889f93ce9146f4, type: 3} + TractorBeam: {fileID: 2009124798951080406, guid: 1df59848be1db8547bc662080d0d6000, type: 3} + Ping: {fileID: 3496685214803260731, guid: bfcaa66e173f6a44cb640aabbcb5e429, type: 3} + DestroyEffect: {fileID: 1121192042590650, guid: e1b08032bec16ba4eb1ae23cbd572664, type: 3} + Invisible: {fileID: 2100000, guid: c94a225de88e5ce42af01c34df3521e6, type: 2} + MapIcon: {fileID: 2100000, guid: 64d1c3f8a4422884b88363be07521fb0, type: 2} diff --git a/Assets/Content/Prefabs/Thrusters/Aether Drive.prefab.meta b/Assets/Content/Prefabs/ShipModTemplate.prefab.meta similarity index 74% rename from Assets/Content/Prefabs/Thrusters/Aether Drive.prefab.meta rename to Assets/Content/Prefabs/ShipModTemplate.prefab.meta index e33810938..d2ea9f827 100644 --- a/Assets/Content/Prefabs/Thrusters/Aether Drive.prefab.meta +++ b/Assets/Content/Prefabs/ShipModTemplate.prefab.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 151cf0ff54a22274caf671ece149fa6e +guid: 5d1f3a8c7e2b4f60a9c4b7e1d3f2a860 PrefabImporter: externalObjects: {} userData: diff --git a/Assets/Content/Prefabs/Stations/PlanetOutpost.prefab b/Assets/Content/Prefabs/Stations/PlanetOutpost.prefab index 6ce31f34f..e3d20ceb7 100644 --- a/Assets/Content/Prefabs/Stations/PlanetOutpost.prefab +++ b/Assets/Content/Prefabs/Stations/PlanetOutpost.prefab @@ -81,87 +81,6 @@ MeshRenderer: m_SortingLayer: 0 m_SortingOrder: 0 m_AdditionalVertexStreams: {fileID: 0} ---- !u!1 &7783244517717541194 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 7783244517717541195} - - component: {fileID: 7783244517717541175} - - component: {fileID: 7783244517717541174} - m_Layer: 9 - m_Name: Gravity Well - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &7783244517717541195 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7783244517717541194} - m_LocalRotation: {x: 0.7071068, y: 0, z: 0, w: 0.7071068} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 7783244518521719148} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} ---- !u!33 &7783244517717541175 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7783244517717541194} - m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &7783244517717541174 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7783244517717541194} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: 44a8bbb89acb4e34c9f41a9da5842bb4, type: 2} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_AdditionalVertexStreams: {fileID: 0} --- !u!1 &7783244518317531027 GameObject: m_ObjectHideFlags: 0 @@ -289,7 +208,6 @@ Transform: m_Children: - {fileID: 589192530128514016} - {fileID: 7783244518317531036} - - {fileID: 7783244517717541195} - {fileID: 7783244516809707565} m_Father: {fileID: 0} m_RootOrder: 0 @@ -307,7 +225,6 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Body: {fileID: 7783244518317531038} - GravityWell: {fileID: 7783244517717541174} Icon: {fileID: 7783244516809707566} Generator: {fileID: 741236912059895623} --- !u!114 &741236912059895623 diff --git a/Assets/Content/Prefabs/Thrusters/Aether Drive.prefab b/Assets/Content/Prefabs/Thrusters/Aether Drive.prefab deleted file mode 100644 index 4a566b534..000000000 --- a/Assets/Content/Prefabs/Thrusters/Aether Drive.prefab +++ /dev/null @@ -1,4819 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &3270076511764283730 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 5152310125488819541} - - component: {fileID: 8928170315538518364} - - component: {fileID: 8974554360790158463} - m_Layer: 0 - m_Name: Aether Drive - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &5152310125488819541 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3270076511764283730} - 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_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!198 &8928170315538518364 -ParticleSystem: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3270076511764283730} - serializedVersion: 7 - lengthInSec: 5 - simulationSpeed: 2 - stopAction: 0 - cullingMode: 0 - ringBufferMode: 0 - ringBufferLoopRange: {x: 0, y: 1} - looping: 1 - prewarm: 0 - playOnAwake: 1 - useUnscaledTime: 0 - autoRandomSeed: 1 - useRigidbodyForVelocity: 0 - startDelay: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - moveWithTransform: 2 - moveWithCustomTransform: {fileID: 0} - scalingMode: 2 - randomSeed: 0 - InitialModule: - serializedVersion: 3 - enabled: 1 - startLifetime: - serializedVersion: 2 - minMaxState: 0 - scalar: 0.5 - minScalar: 5 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - startSpeed: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 5 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - startColor: - serializedVersion: 2 - minMaxState: 0 - minColor: {r: 1, g: 1, b: 1, a: 1} - maxColor: {r: 1, g: 1, b: 1, a: 1} - maxGradient: - serializedVersion: 2 - key0: {r: 1, g: 1, b: 1, a: 1} - key1: {r: 1, g: 1, b: 1, a: 1} - key2: {r: 0, g: 0, b: 0, a: 0} - key3: {r: 0, g: 0, b: 0, a: 0} - key4: {r: 0, g: 0, b: 0, a: 0} - key5: {r: 0, g: 0, b: 0, a: 0} - key6: {r: 0, g: 0, b: 0, a: 0} - key7: {r: 0, g: 0, b: 0, a: 0} - ctime0: 0 - ctime1: 65535 - ctime2: 0 - ctime3: 0 - ctime4: 0 - ctime5: 0 - ctime6: 0 - ctime7: 0 - atime0: 0 - atime1: 65535 - atime2: 0 - atime3: 0 - atime4: 0 - atime5: 0 - atime6: 0 - atime7: 0 - m_Mode: 0 - m_NumColorKeys: 2 - m_NumAlphaKeys: 2 - minGradient: - serializedVersion: 2 - key0: {r: 1, g: 1, b: 1, a: 1} - key1: {r: 1, g: 1, b: 1, a: 1} - key2: {r: 0, g: 0, b: 0, a: 0} - key3: {r: 0, g: 0, b: 0, a: 0} - key4: {r: 0, g: 0, b: 0, a: 0} - key5: {r: 0, g: 0, b: 0, a: 0} - key6: {r: 0, g: 0, b: 0, a: 0} - key7: {r: 0, g: 0, b: 0, a: 0} - ctime0: 0 - ctime1: 65535 - ctime2: 0 - ctime3: 0 - ctime4: 0 - ctime5: 0 - ctime6: 0 - ctime7: 0 - atime0: 0 - atime1: 65535 - atime2: 0 - atime3: 0 - atime4: 0 - atime5: 0 - atime6: 0 - atime7: 0 - m_Mode: 0 - m_NumColorKeys: 2 - m_NumAlphaKeys: 2 - startSize: - serializedVersion: 2 - minMaxState: 0 - scalar: 0.25 - minScalar: 1 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - startSizeY: - serializedVersion: 2 - minMaxState: 0 - scalar: 1 - minScalar: 1 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - startSizeZ: - serializedVersion: 2 - minMaxState: 0 - scalar: 1 - minScalar: 1 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - startRotationX: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - startRotationY: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - startRotation: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - randomizeRotationDirection: 0 - maxNumParticles: 1000 - size3D: 0 - rotation3D: 0 - gravityModifier: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - ShapeModule: - serializedVersion: 6 - enabled: 1 - type: 0 - angle: 25 - length: 5 - boxThickness: {x: 0, y: 0, z: 0} - radiusThickness: 1 - donutRadius: 0.2 - m_Position: {x: 0, y: 0, z: 0} - m_Rotation: {x: 0, y: 0, z: 0} - m_Scale: {x: 1, y: 1, z: 1} - placementMode: 2 - m_MeshMaterialIndex: 0 - m_MeshNormalOffset: 0 - m_MeshSpawn: - mode: 0 - spread: 0 - speed: - serializedVersion: 2 - minMaxState: 0 - scalar: 1 - minScalar: 1 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - m_Mesh: {fileID: 0} - m_MeshRenderer: {fileID: 0} - m_SkinnedMeshRenderer: {fileID: 0} - m_Sprite: {fileID: 0} - m_SpriteRenderer: {fileID: 0} - m_UseMeshMaterialIndex: 0 - m_UseMeshColors: 0 - alignToDirection: 0 - m_Texture: {fileID: 0} - m_TextureClipChannel: 3 - m_TextureClipThreshold: 0 - m_TextureUVChannel: 0 - m_TextureColorAffectsParticles: 1 - m_TextureAlphaAffectsParticles: 1 - m_TextureBilinearFiltering: 0 - randomDirectionAmount: 0 - sphericalDirectionAmount: 0 - randomPositionAmount: 0 - radius: - value: 10 - mode: 0 - spread: 0 - speed: - serializedVersion: 2 - minMaxState: 0 - scalar: 1 - minScalar: 1 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - arc: - value: 360 - mode: 0 - spread: 0 - speed: - serializedVersion: 2 - minMaxState: 0 - scalar: 1 - minScalar: 1 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - EmissionModule: - enabled: 1 - serializedVersion: 4 - rateOverTime: - serializedVersion: 2 - minMaxState: 0 - scalar: 75 - minScalar: 10 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - rateOverDistance: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - m_BurstCount: 0 - m_Bursts: [] - SizeModule: - enabled: 1 - curve: - serializedVersion: 2 - minMaxState: 1 - scalar: 1 - minScalar: 1 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 1 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 1 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - y: - serializedVersion: 2 - minMaxState: 1 - scalar: 1 - minScalar: 1 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 1 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 1 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - z: - serializedVersion: 2 - minMaxState: 1 - scalar: 1 - minScalar: 1 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 1 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 1 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - separateAxes: 0 - RotationModule: - enabled: 0 - x: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - y: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - curve: - serializedVersion: 2 - minMaxState: 0 - scalar: 0.7853982 - minScalar: 0.7853982 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - separateAxes: 0 - ColorModule: - enabled: 1 - gradient: - serializedVersion: 2 - minMaxState: 1 - minColor: {r: 1, g: 1, b: 1, a: 1} - maxColor: {r: 1, g: 1, b: 1, a: 1} - maxGradient: - serializedVersion: 2 - key0: {r: 0, g: 0.54509807, b: 1, a: 1} - key1: {r: 0.122641504, g: 0, b: 0.121027805, a: 0.45490196} - key2: {r: 0.122641504, g: 0, b: 0.121027805, a: 0} - key3: {r: 0, g: 0, b: 0, a: 0} - key4: {r: 0, g: 0, b: 0, a: 0} - key5: {r: 0, g: 0, b: 0, a: 0} - key6: {r: 0, g: 0, b: 0, a: 0} - key7: {r: 0, g: 0, b: 0, a: 0} - ctime0: 0 - ctime1: 65535 - ctime2: 65535 - ctime3: 0 - ctime4: 0 - ctime5: 0 - ctime6: 0 - ctime7: 0 - atime0: 0 - atime1: 65535 - atime2: 0 - atime3: 0 - atime4: 0 - atime5: 0 - atime6: 0 - atime7: 0 - m_Mode: 0 - m_NumColorKeys: 2 - m_NumAlphaKeys: 2 - minGradient: - serializedVersion: 2 - key0: {r: 1, g: 1, b: 1, a: 1} - key1: {r: 1, g: 1, b: 1, a: 1} - key2: {r: 0, g: 0, b: 0, a: 0} - key3: {r: 0, g: 0, b: 0, a: 0} - key4: {r: 0, g: 0, b: 0, a: 0} - key5: {r: 0, g: 0, b: 0, a: 0} - key6: {r: 0, g: 0, b: 0, a: 0} - key7: {r: 0, g: 0, b: 0, a: 0} - ctime0: 0 - ctime1: 65535 - ctime2: 0 - ctime3: 0 - ctime4: 0 - ctime5: 0 - ctime6: 0 - ctime7: 0 - atime0: 0 - atime1: 65535 - atime2: 0 - atime3: 0 - atime4: 0 - atime5: 0 - atime6: 0 - atime7: 0 - m_Mode: 0 - m_NumColorKeys: 2 - m_NumAlphaKeys: 2 - UVModule: - serializedVersion: 2 - enabled: 0 - mode: 0 - timeMode: 0 - fps: 30 - frameOverTime: - serializedVersion: 2 - minMaxState: 1 - scalar: 0.9999 - minScalar: 0.9999 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 1 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 1 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - startFrame: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - speedRange: {x: 0, y: 1} - tilesX: 1 - tilesY: 1 - animationType: 0 - rowIndex: 0 - cycles: 1 - uvChannelMask: -1 - rowMode: 1 - sprites: - - sprite: {fileID: 0} - flipU: 0 - flipV: 0 - VelocityModule: - enabled: 0 - x: - serializedVersion: 2 - minMaxState: 1 - scalar: 99.9 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - y: - serializedVersion: 2 - minMaxState: 1 - scalar: 1 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - z: - serializedVersion: 2 - minMaxState: 1 - scalar: 50 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: -1 - inSlope: 2 - outSlope: 2 - tangentMode: 0 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 1 - value: -0.013513565 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - orbitalX: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - orbitalY: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - orbitalZ: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - orbitalOffsetX: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - orbitalOffsetY: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - orbitalOffsetZ: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - radial: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - speedModifier: - serializedVersion: 2 - minMaxState: 0 - scalar: 1 - minScalar: 1 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - inWorldSpace: 0 - InheritVelocityModule: - enabled: 0 - m_Mode: 0 - m_Curve: - serializedVersion: 2 - minMaxState: 0 - scalar: 2 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - LifetimeByEmitterSpeedModule: - enabled: 0 - m_Curve: - serializedVersion: 2 - minMaxState: 1 - scalar: 1 - minScalar: 1 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: -0.8 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0.2 - inSlope: -0.8 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - m_Range: {x: 0, y: 1} - ForceModule: - enabled: 1 - x: - serializedVersion: 2 - minMaxState: 1 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: -1 - inSlope: 3.072868 - outSlope: 3.072868 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.11519607 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - y: - serializedVersion: 2 - minMaxState: 1 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: -1 - inSlope: 3.0251138 - outSlope: 3.0251138 - tangentMode: 0 - weightedMode: 0 - inWeight: 0 - outWeight: 0.09068627 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.12531352 - outWeight: 0 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - z: - serializedVersion: 2 - minMaxState: 1 - scalar: 50 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: -1 - inSlope: 3.0335512 - outSlope: 3.0335512 - tangentMode: 0 - weightedMode: 0 - inWeight: 0 - outWeight: 0.09354838 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - inWorldSpace: 1 - randomizePerFrame: 0 - ExternalForcesModule: - serializedVersion: 2 - enabled: 0 - multiplierCurve: - serializedVersion: 2 - minMaxState: 0 - scalar: 1 - minScalar: 1 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - influenceFilter: 0 - influenceMask: - serializedVersion: 2 - m_Bits: 4294967295 - influenceList: [] - ClampVelocityModule: - enabled: 0 - x: - serializedVersion: 2 - minMaxState: 0 - scalar: 1 - minScalar: 1 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - y: - serializedVersion: 2 - minMaxState: 0 - scalar: 1 - minScalar: 1 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - z: - serializedVersion: 2 - minMaxState: 0 - scalar: 1 - minScalar: 1 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - magnitude: - serializedVersion: 2 - minMaxState: 0 - scalar: 1 - minScalar: 1 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - separateAxis: 0 - inWorldSpace: 0 - multiplyDragByParticleSize: 1 - multiplyDragByParticleVelocity: 1 - dampen: 0 - drag: - serializedVersion: 2 - minMaxState: 0 - scalar: 33.08 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - NoiseModule: - enabled: 1 - strength: - serializedVersion: 2 - minMaxState: 0 - scalar: 25 - minScalar: 1 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: -2 - outSlope: -2 - tangentMode: 0 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - strengthY: - serializedVersion: 2 - minMaxState: 0 - scalar: 1 - minScalar: 1 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - strengthZ: - serializedVersion: 2 - minMaxState: 0 - scalar: 1 - minScalar: 1 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - separateAxes: 0 - frequency: 0.1 - damping: 0 - octaves: 3 - octaveMultiplier: 0.5 - octaveScale: 2 - quality: 2 - scrollSpeed: - serializedVersion: 2 - minMaxState: 0 - scalar: 1 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - remap: - serializedVersion: 2 - minMaxState: 1 - scalar: 1 - minScalar: 1 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: -1 - inSlope: 0 - outSlope: 2 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 2 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - remapY: - serializedVersion: 2 - minMaxState: 1 - scalar: 1 - minScalar: 1 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: -1 - inSlope: 0 - outSlope: 2 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 2 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - remapZ: - serializedVersion: 2 - minMaxState: 1 - scalar: 1 - minScalar: 1 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: -1 - inSlope: 0 - outSlope: 2 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 2 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - remapEnabled: 0 - positionAmount: - serializedVersion: 2 - minMaxState: 0 - scalar: 1 - minScalar: 1 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - rotationAmount: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - sizeAmount: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - SizeBySpeedModule: - enabled: 0 - curve: - serializedVersion: 2 - minMaxState: 1 - scalar: 1 - minScalar: 1 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 1 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 1 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - y: - serializedVersion: 2 - minMaxState: 1 - scalar: 1 - minScalar: 1 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 1 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 1 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - z: - serializedVersion: 2 - minMaxState: 1 - scalar: 1 - minScalar: 1 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 1 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 1 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - range: {x: 0, y: 1} - separateAxes: 0 - RotationBySpeedModule: - enabled: 0 - x: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - y: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - curve: - serializedVersion: 2 - minMaxState: 0 - scalar: 0.7853982 - minScalar: 0.7853982 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - separateAxes: 0 - range: {x: 0, y: 1} - ColorBySpeedModule: - enabled: 0 - gradient: - serializedVersion: 2 - minMaxState: 1 - minColor: {r: 1, g: 1, b: 1, a: 1} - maxColor: {r: 1, g: 1, b: 1, a: 1} - maxGradient: - serializedVersion: 2 - key0: {r: 1, g: 1, b: 1, a: 1} - key1: {r: 1, g: 1, b: 1, a: 1} - key2: {r: 0, g: 0, b: 0, a: 0} - key3: {r: 0, g: 0, b: 0, a: 0} - key4: {r: 0, g: 0, b: 0, a: 0} - key5: {r: 0, g: 0, b: 0, a: 0} - key6: {r: 0, g: 0, b: 0, a: 0} - key7: {r: 0, g: 0, b: 0, a: 0} - ctime0: 0 - ctime1: 65535 - ctime2: 0 - ctime3: 0 - ctime4: 0 - ctime5: 0 - ctime6: 0 - ctime7: 0 - atime0: 0 - atime1: 65535 - atime2: 0 - atime3: 0 - atime4: 0 - atime5: 0 - atime6: 0 - atime7: 0 - m_Mode: 0 - m_NumColorKeys: 2 - m_NumAlphaKeys: 2 - minGradient: - serializedVersion: 2 - key0: {r: 1, g: 1, b: 1, a: 1} - key1: {r: 1, g: 1, b: 1, a: 1} - key2: {r: 0, g: 0, b: 0, a: 0} - key3: {r: 0, g: 0, b: 0, a: 0} - key4: {r: 0, g: 0, b: 0, a: 0} - key5: {r: 0, g: 0, b: 0, a: 0} - key6: {r: 0, g: 0, b: 0, a: 0} - key7: {r: 0, g: 0, b: 0, a: 0} - ctime0: 0 - ctime1: 65535 - ctime2: 0 - ctime3: 0 - ctime4: 0 - ctime5: 0 - ctime6: 0 - ctime7: 0 - atime0: 0 - atime1: 65535 - atime2: 0 - atime3: 0 - atime4: 0 - atime5: 0 - atime6: 0 - atime7: 0 - m_Mode: 0 - m_NumColorKeys: 2 - m_NumAlphaKeys: 2 - range: {x: 0, y: 1} - CollisionModule: - enabled: 0 - serializedVersion: 4 - type: 0 - collisionMode: 0 - colliderForce: 0 - multiplyColliderForceByParticleSize: 0 - multiplyColliderForceByParticleSpeed: 0 - multiplyColliderForceByCollisionAngle: 1 - m_Planes: - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - m_Dampen: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - m_Bounce: - serializedVersion: 2 - minMaxState: 0 - scalar: 1 - minScalar: 1 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - m_EnergyLossOnCollision: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minKillSpeed: 0 - maxKillSpeed: 10000 - radiusScale: 1 - collidesWith: - serializedVersion: 2 - m_Bits: 4294967295 - maxCollisionShapes: 256 - quality: 0 - voxelSize: 0.5 - collisionMessages: 0 - collidesWithDynamic: 1 - interiorCollisions: 0 - TriggerModule: - enabled: 0 - serializedVersion: 2 - inside: 1 - outside: 0 - enter: 0 - exit: 0 - colliderQueryMode: 0 - radiusScale: 1 - primitives: - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - SubModule: - serializedVersion: 2 - enabled: 0 - subEmitters: - - serializedVersion: 3 - emitter: {fileID: 0} - type: 0 - properties: 0 - emitProbability: 1 - LightsModule: - enabled: 0 - ratio: 0 - light: {fileID: 0} - randomDistribution: 1 - color: 1 - range: 1 - intensity: 1 - rangeCurve: - serializedVersion: 2 - minMaxState: 0 - scalar: 1 - minScalar: 1 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - intensityCurve: - serializedVersion: 2 - minMaxState: 0 - scalar: 1 - minScalar: 1 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - maxLights: 20 - TrailModule: - enabled: 1 - mode: 0 - ratio: 1 - lifetime: - serializedVersion: 2 - minMaxState: 0 - scalar: 1 - minScalar: 1 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minVertexDistance: 0.5 - textureMode: 0 - ribbonCount: 1 - shadowBias: 0.5 - worldSpace: 0 - dieWithParticles: 0 - sizeAffectsWidth: 0 - sizeAffectsLifetime: 0 - inheritParticleColor: 0 - generateLightingData: 0 - splitSubEmitterRibbons: 0 - attachRibbonsToTransform: 0 - colorOverLifetime: - serializedVersion: 2 - minMaxState: 0 - minColor: {r: 1, g: 1, b: 1, a: 1} - maxColor: {r: 1, g: 1, b: 1, a: 1} - maxGradient: - serializedVersion: 2 - key0: {r: 1, g: 1, b: 1, a: 1} - key1: {r: 1, g: 1, b: 1, a: 1} - key2: {r: 0, g: 0, b: 0, a: 0} - key3: {r: 0, g: 0, b: 0, a: 0} - key4: {r: 0, g: 0, b: 0, a: 0} - key5: {r: 0, g: 0, b: 0, a: 0} - key6: {r: 0, g: 0, b: 0, a: 0} - key7: {r: 0, g: 0, b: 0, a: 0} - ctime0: 0 - ctime1: 65535 - ctime2: 0 - ctime3: 0 - ctime4: 0 - ctime5: 0 - ctime6: 0 - ctime7: 0 - atime0: 0 - atime1: 65535 - atime2: 0 - atime3: 0 - atime4: 0 - atime5: 0 - atime6: 0 - atime7: 0 - m_Mode: 0 - m_NumColorKeys: 2 - m_NumAlphaKeys: 2 - minGradient: - serializedVersion: 2 - key0: {r: 1, g: 1, b: 1, a: 1} - key1: {r: 1, g: 1, b: 1, a: 1} - key2: {r: 0, g: 0, b: 0, a: 0} - key3: {r: 0, g: 0, b: 0, a: 0} - key4: {r: 0, g: 0, b: 0, a: 0} - key5: {r: 0, g: 0, b: 0, a: 0} - key6: {r: 0, g: 0, b: 0, a: 0} - key7: {r: 0, g: 0, b: 0, a: 0} - ctime0: 0 - ctime1: 65535 - ctime2: 0 - ctime3: 0 - ctime4: 0 - ctime5: 0 - ctime6: 0 - ctime7: 0 - atime0: 0 - atime1: 65535 - atime2: 0 - atime3: 0 - atime4: 0 - atime5: 0 - atime6: 0 - atime7: 0 - m_Mode: 0 - m_NumColorKeys: 2 - m_NumAlphaKeys: 2 - widthOverTrail: - serializedVersion: 2 - minMaxState: 1 - scalar: 0.25 - minScalar: 1 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 6.705435 - outSlope: 6.705435 - tangentMode: 0 - weightedMode: 0 - inWeight: 0 - outWeight: 0.034313723 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - colorOverTrail: - serializedVersion: 2 - minMaxState: 1 - minColor: {r: 1, g: 1, b: 1, a: 1} - maxColor: {r: 1, g: 1, b: 1, a: 1} - maxGradient: - serializedVersion: 2 - key0: {r: 0.2830189, g: 0, b: 0, a: 0} - key1: {r: 0.12415449, g: 0.26510748, b: 0.8490566, a: 1} - key2: {r: 0, g: 0, b: 0, a: 0} - key3: {r: 0, g: 0, b: 0, a: 0} - key4: {r: 0, g: 0, b: 0, a: 0} - key5: {r: 0, g: 0, b: 0, a: 0} - key6: {r: 0, g: 0, b: 0, a: 0} - key7: {r: 0, g: 0, b: 0, a: 0} - ctime0: 0 - ctime1: 65535 - ctime2: 0 - ctime3: 0 - ctime4: 0 - ctime5: 0 - ctime6: 0 - ctime7: 0 - atime0: 129 - atime1: 31802 - atime2: 65535 - atime3: 65535 - atime4: 0 - atime5: 0 - atime6: 0 - atime7: 0 - m_Mode: 0 - m_NumColorKeys: 2 - m_NumAlphaKeys: 3 - minGradient: - serializedVersion: 2 - key0: {r: 1, g: 1, b: 1, a: 1} - key1: {r: 1, g: 1, b: 1, a: 1} - key2: {r: 0, g: 0, b: 0, a: 0} - key3: {r: 0, g: 0, b: 0, a: 0} - key4: {r: 0, g: 0, b: 0, a: 0} - key5: {r: 0, g: 0, b: 0, a: 0} - key6: {r: 0, g: 0, b: 0, a: 0} - key7: {r: 0, g: 0, b: 0, a: 0} - ctime0: 0 - ctime1: 65535 - ctime2: 0 - ctime3: 0 - ctime4: 0 - ctime5: 0 - ctime6: 0 - ctime7: 0 - atime0: 0 - atime1: 65535 - atime2: 0 - atime3: 0 - atime4: 0 - atime5: 0 - atime6: 0 - atime7: 0 - m_Mode: 0 - m_NumColorKeys: 2 - m_NumAlphaKeys: 2 - CustomDataModule: - enabled: 1 - mode0: 1 - vectorComponentCount0: 2 - color0: - serializedVersion: 2 - minMaxState: 0 - minColor: {r: 1, g: 1, b: 1, a: 1} - maxColor: {r: 1, g: 1, b: 1, a: 1} - maxGradient: - serializedVersion: 2 - key0: {r: 1, g: 1, b: 1, a: 1} - key1: {r: 1, g: 1, b: 1, a: 1} - key2: {r: 0, g: 0, b: 0, a: 0} - key3: {r: 0, g: 0, b: 0, a: 0} - key4: {r: 0, g: 0, b: 0, a: 0} - key5: {r: 0, g: 0, b: 0, a: 0} - key6: {r: 0, g: 0, b: 0, a: 0} - key7: {r: 0, g: 0, b: 0, a: 0} - ctime0: 0 - ctime1: 65535 - ctime2: 0 - ctime3: 0 - ctime4: 0 - ctime5: 0 - ctime6: 0 - ctime7: 0 - atime0: 0 - atime1: 65535 - atime2: 0 - atime3: 0 - atime4: 0 - atime5: 0 - atime6: 0 - atime7: 0 - m_Mode: 0 - m_NumColorKeys: 2 - m_NumAlphaKeys: 2 - minGradient: - serializedVersion: 2 - key0: {r: 1, g: 1, b: 1, a: 1} - key1: {r: 1, g: 1, b: 1, a: 1} - key2: {r: 0, g: 0, b: 0, a: 0} - key3: {r: 0, g: 0, b: 0, a: 0} - key4: {r: 0, g: 0, b: 0, a: 0} - key5: {r: 0, g: 0, b: 0, a: 0} - key6: {r: 0, g: 0, b: 0, a: 0} - key7: {r: 0, g: 0, b: 0, a: 0} - ctime0: 0 - ctime1: 65535 - ctime2: 0 - ctime3: 0 - ctime4: 0 - ctime5: 0 - ctime6: 0 - ctime7: 0 - atime0: 0 - atime1: 65535 - atime2: 0 - atime3: 0 - atime4: 0 - atime5: 0 - atime6: 0 - atime7: 0 - m_Mode: 0 - m_NumColorKeys: 2 - m_NumAlphaKeys: 2 - colorLabel0: Color - vector0_0: - serializedVersion: 2 - minMaxState: 3 - scalar: 1 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - vectorLabel0_0: X - vector0_1: - serializedVersion: 2 - minMaxState: 3 - scalar: 1 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - vectorLabel0_1: Y - vector0_2: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - vectorLabel0_2: Z - vector0_3: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - vectorLabel0_3: W - mode1: 0 - vectorComponentCount1: 4 - color1: - serializedVersion: 2 - minMaxState: 0 - minColor: {r: 1, g: 1, b: 1, a: 1} - maxColor: {r: 1, g: 1, b: 1, a: 1} - maxGradient: - serializedVersion: 2 - key0: {r: 1, g: 1, b: 1, a: 1} - key1: {r: 1, g: 1, b: 1, a: 1} - key2: {r: 0, g: 0, b: 0, a: 0} - key3: {r: 0, g: 0, b: 0, a: 0} - key4: {r: 0, g: 0, b: 0, a: 0} - key5: {r: 0, g: 0, b: 0, a: 0} - key6: {r: 0, g: 0, b: 0, a: 0} - key7: {r: 0, g: 0, b: 0, a: 0} - ctime0: 0 - ctime1: 65535 - ctime2: 0 - ctime3: 0 - ctime4: 0 - ctime5: 0 - ctime6: 0 - ctime7: 0 - atime0: 0 - atime1: 65535 - atime2: 0 - atime3: 0 - atime4: 0 - atime5: 0 - atime6: 0 - atime7: 0 - m_Mode: 0 - m_NumColorKeys: 2 - m_NumAlphaKeys: 2 - minGradient: - serializedVersion: 2 - key0: {r: 1, g: 1, b: 1, a: 1} - key1: {r: 1, g: 1, b: 1, a: 1} - key2: {r: 0, g: 0, b: 0, a: 0} - key3: {r: 0, g: 0, b: 0, a: 0} - key4: {r: 0, g: 0, b: 0, a: 0} - key5: {r: 0, g: 0, b: 0, a: 0} - key6: {r: 0, g: 0, b: 0, a: 0} - key7: {r: 0, g: 0, b: 0, a: 0} - ctime0: 0 - ctime1: 65535 - ctime2: 0 - ctime3: 0 - ctime4: 0 - ctime5: 0 - ctime6: 0 - ctime7: 0 - atime0: 0 - atime1: 65535 - atime2: 0 - atime3: 0 - atime4: 0 - atime5: 0 - atime6: 0 - atime7: 0 - m_Mode: 0 - m_NumColorKeys: 2 - m_NumAlphaKeys: 2 - colorLabel1: Color - vector1_0: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - vectorLabel1_0: X - vector1_1: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - vectorLabel1_1: Y - vector1_2: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - vectorLabel1_2: Z - vector1_3: - serializedVersion: 2 - minMaxState: 0 - scalar: 0 - minScalar: 0 - maxCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - minCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - vectorLabel1_3: W ---- !u!199 &8974554360790158463 -ParticleSystemRenderer: - serializedVersion: 6 - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3270076511764283730} - m_Enabled: 1 - m_CastShadows: 0 - m_ReceiveShadows: 0 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 0 - m_ReflectionProbeUsage: 0 - m_RayTracingMode: 0 - m_RayTraceProcedural: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: 6af0f423a2567be43b16d152d2b60e0c, type: 2} - - {fileID: 2100000, guid: 555ada90c0f01654a9387483bd95a688, type: 2} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_RenderMode: 5 - m_SortMode: 0 - m_MinParticleSize: 0 - m_MaxParticleSize: 0.5 - m_CameraVelocityScale: 0 - m_VelocityScale: 0 - m_LengthScale: 2 - m_SortingFudge: 0 - m_NormalDirection: 1 - m_ShadowBias: 0 - m_RenderAlignment: 0 - m_Pivot: {x: 0, y: 0, z: 0} - m_Flip: {x: 0, y: 0, z: 0} - m_UseCustomVertexStreams: 1 - m_EnableGPUInstancing: 1 - m_ApplyActiveColorSpace: 1 - m_AllowRoll: 1 - m_FreeformStretching: 0 - m_RotateWithStretchDirection: 1 - m_VertexStreams: 0001030420 - m_Mesh: {fileID: 0} - m_Mesh1: {fileID: 0} - m_Mesh2: {fileID: 0} - m_Mesh3: {fileID: 0} - m_MaskInteraction: 0 diff --git a/Assets/Content/Prefabs/Tractor Beam.prefab b/Assets/Content/Prefabs/Tractor Beam.prefab index 9ce0d7760..c98d252a3 100644 --- a/Assets/Content/Prefabs/Tractor Beam.prefab +++ b/Assets/Content/Prefabs/Tractor Beam.prefab @@ -4818,6 +4818,3 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: ParticleSystem: {fileID: 5087162364086924483} - Radius: 25 - Traction: 25 - Distance: 75 diff --git a/Assets/Content/Prefabs/Weapons/Mine Launcher.prefab b/Assets/Content/Prefabs/Weapons/Mine Launcher.prefab deleted file mode 100644 index 05171242b..000000000 --- a/Assets/Content/Prefabs/Weapons/Mine Launcher.prefab +++ /dev/null @@ -1,336 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &756302067359749329 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 3605572244125604411} - - component: {fileID: 5473211974529592485} - - component: {fileID: 4535912766998605946} - - component: {fileID: 2069293240452108309} - - component: {fileID: 951258163572815990} - - component: {fileID: 6357237398779034136} - m_Layer: 21 - m_Name: Mine - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &3605572244125604411 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 756302067359749329} - 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: 466182245789483358} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!33 &5473211974529592485 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 756302067359749329} - m_Mesh: {fileID: -5495902117074765545, guid: dab8e1a18a1b825458e8e6356cf00cd2, type: 3} ---- !u!23 &4535912766998605946 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 756302067359749329} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 3720744386649352057, guid: 504c7bfe0d50ff64a88b8eac2ceb46f8, type: 3} - - {fileID: 3720744386649352057, guid: a1d39ea984432bf44b4a0686afe2bf1a, type: 3} - - {fileID: 2100000, guid: e879c37f3520bf14a8a6075581faf7b2, type: 2} - - {fileID: 9178725544925813344, guid: 58e16b7dbc1c31f4585e11544cdce127, type: 3} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_AdditionalVertexStreams: {fileID: 0} ---- !u!114 &2069293240452108309 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 756302067359749329} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 1281fe44325f9b548aa42dc331b17266, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!114 &951258163572815990 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 756302067359749329} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f190191fe8c8419f85767868c50cde5f, type: 3} - m_Name: - m_EditorClassIdentifier: - GridObject: {fileID: 6357237398779034136} - MeshRenderer: {fileID: 4535912766998605946} - EmissionSubmesh: 2 - EmissionCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0.051179443 - outSlope: 0.051179443 - tangentMode: 0 - weightedMode: 0 - inWeight: 0 - outWeight: 0.24423963 - - serializedVersion: 3 - time: 0.5 - value: 0.1 - inSlope: 0 - outSlope: 0 - tangentMode: 34 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: -0 - outSlope: -0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.22580647 - outWeight: 0 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - ActiveCycleDuration: 1 - ArmedCycleDuration: 0.25 - ActiveEmission: 100 - ArmedEmission: 1000 - HitEffect: {fileID: 3349939966709198091} - Lifetime: 30 - ActivationDelay: 2 - BlastRange: 25 - BlastDelay: 2 ---- !u!114 &6357237398779034136 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 756302067359749329} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 737f47c158214f0995ba2835f040ed96, type: 3} - m_Name: - m_EditorClassIdentifier: - RotationSpeed: 1 - GridOffset: 0 - GridAttraction: 10 - Gravity: 1 - Drag: 0.05 - LaunchDrag: 0.2 ---- !u!1 &951357816492268516 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 466182245789483358} - - component: {fileID: 2749986269966238105} - m_Layer: 0 - m_Name: Mine Launcher - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &466182245789483358 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 951357816492268516} - 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: 3865250807623958572} - - {fileID: 3605572244125604411} - m_Father: {fileID: 0} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &2749986269966238105 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 951357816492268516} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 6e048d9c74a84343befd496907ee2126, type: 3} - m_Name: - m_EditorClassIdentifier: - ProjectilePrototype: {fileID: 2069293240452108309} - InheritVelocity: 1 ---- !u!1001 &3867385469207619610 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 466182245789483358} - m_Modifications: - - target: {fileID: 1121192042590650, guid: e1b08032bec16ba4eb1ae23cbd572664, type: 3} - propertyPath: m_Name - value: BigExplosion - objectReference: {fileID: 0} - - target: {fileID: 4388947112716342, guid: e1b08032bec16ba4eb1ae23cbd572664, type: 3} - propertyPath: m_RootOrder - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4388947112716342, guid: e1b08032bec16ba4eb1ae23cbd572664, type: 3} - propertyPath: m_LocalScale.x - value: 10 - objectReference: {fileID: 0} - - target: {fileID: 4388947112716342, guid: e1b08032bec16ba4eb1ae23cbd572664, type: 3} - propertyPath: m_LocalScale.y - value: 10 - objectReference: {fileID: 0} - - target: {fileID: 4388947112716342, guid: e1b08032bec16ba4eb1ae23cbd572664, type: 3} - propertyPath: m_LocalScale.z - value: 10 - objectReference: {fileID: 0} - - target: {fileID: 4388947112716342, guid: e1b08032bec16ba4eb1ae23cbd572664, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4388947112716342, guid: e1b08032bec16ba4eb1ae23cbd572664, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4388947112716342, guid: e1b08032bec16ba4eb1ae23cbd572664, type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4388947112716342, guid: e1b08032bec16ba4eb1ae23cbd572664, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 4388947112716342, guid: e1b08032bec16ba4eb1ae23cbd572664, type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4388947112716342, guid: e1b08032bec16ba4eb1ae23cbd572664, type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4388947112716342, guid: e1b08032bec16ba4eb1ae23cbd572664, type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4388947112716342, guid: e1b08032bec16ba4eb1ae23cbd572664, type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4388947112716342, guid: e1b08032bec16ba4eb1ae23cbd572664, type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 4388947112716342, guid: e1b08032bec16ba4eb1ae23cbd572664, type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 198917022394846920, guid: e1b08032bec16ba4eb1ae23cbd572664, - type: 3} - propertyPath: stopAction - value: 3 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: e1b08032bec16ba4eb1ae23cbd572664, type: 3} ---- !u!4 &3865250807623958572 stripped -Transform: - m_CorrespondingSourceObject: {fileID: 4388947112716342, guid: e1b08032bec16ba4eb1ae23cbd572664, - type: 3} - m_PrefabInstance: {fileID: 3867385469207619610} - m_PrefabAsset: {fileID: 0} ---- !u!1 &3866425147859458464 stripped -GameObject: - m_CorrespondingSourceObject: {fileID: 1121192042590650, guid: e1b08032bec16ba4eb1ae23cbd572664, - type: 3} - m_PrefabInstance: {fileID: 3867385469207619610} - m_PrefabAsset: {fileID: 0} ---- !u!114 &3349939966709198091 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3866425147859458464} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 1281fe44325f9b548aa42dc331b17266, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!114 &5700147869379115258 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3866425147859458464} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: db021a309de3d324588c5603de40c29f, type: 3} - m_Name: - m_EditorClassIdentifier: diff --git a/Assets/Content/Prefabs/Weapons/Mine Launcher.prefab.meta b/Assets/Content/Prefabs/Weapons/Mine Launcher.prefab.meta deleted file mode 100644 index 2489e77fa..000000000 --- a/Assets/Content/Prefabs/Weapons/Mine Launcher.prefab.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 24eddacc819f20542962f2395930f261 -PrefabImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Editor/AetheriaBuild.cs b/Assets/Editor/AetheriaBuild.cs new file mode 100644 index 000000000..3cf434ee4 --- /dev/null +++ b/Assets/Editor/AetheriaBuild.cs @@ -0,0 +1,116 @@ +using System; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Text.RegularExpressions; +using UnityEditor; +using UnityEditor.AddressableAssets.Settings; +using UnityEditor.Build.Reporting; +using Debug = UnityEngine.Debug; + +// The one way to make a player directory, for Windows or Linux. Owns what the directory contains: the player and its data, +// GameData/Aetheria.cc, GameData/Narrative/**, GameData/Mods/** and ModTools/AetherDb. Manual builds, smokes and +// release cuts all call this and stage nothing themselves. +// +// Unity -batchmode -quit -projectPath -executeMethod AetheriaBuild.Build +// -aetheriaVersion -aetheriaOut [-aetheriaTarget win64|linux64] -logFile +// +// AetherDb is published from tools/AetherDb, so the headless build's CULTLIB_ROOT / CULTMATH_ROOT (Directory.Build.props) +// must be set for dotnet when the defaults do not hold the pinned revisions. +// Any failure logs "AetheriaBuild FAILED at " and exits 1. +public static class AetheriaBuild +{ + private static readonly Regex SemVer = new Regex(@"^\d+\.\d+\.\d+([-+][0-9A-Za-z.-]+)?$"); + + // A target: the player Unity builds, its executable, and the runtime AetherDb is published for. + private static (BuildTarget target, string player, string runtime, string aetherDb) Target(string name) => name switch + { + "win64" => (BuildTarget.StandaloneWindows64, "Aetheria.exe", "win-x64", "AetherDb.exe"), + "linux64" => (BuildTarget.StandaloneLinux64, "Aetheria.x86_64", "linux-x64", "AetherDb"), + _ => throw new InvalidOperationException($"-aetheriaTarget {name}: expected win64 or linux64"), + }; + + public static void Build() + { + var step = "arguments"; + try + { + var version = Argument("-aetheriaVersion"); + if (!SemVer.IsMatch(version)) throw new InvalidOperationException("-aetheriaVersion is not a semver"); + var output = Path.GetFullPath(Argument("-aetheriaOut")); + var target = Target(Argument("-aetheriaTarget", "win64")); + var repoRoot = Directory.GetParent(UnityEngine.Application.dataPath).FullName; + + step = "version"; + UnityEditor.PlayerSettings.bundleVersion = version; // the game has its own global PlayerSettings + + step = "addressables"; + AddressableAssetSettings.BuildPlayerContent(out var content); + if (!string.IsNullOrEmpty(content.Error)) throw new InvalidOperationException("Addressables build reported an error: " + content.Error); + + step = "player"; + Directory.CreateDirectory(output); + var scenes = EditorBuildSettings.scenes.Where(scene => scene.enabled).Select(scene => scene.path).ToArray(); + if (scenes.Length == 0) throw new InvalidOperationException("EditorBuildSettings has no enabled scene"); + var report = BuildPipeline.BuildPlayer(new BuildPlayerOptions + { + scenes = scenes, + locationPathName = Path.Combine(output, target.player), + target = target.target, + options = BuildOptions.None, + }); + if (report.summary.result != BuildResult.Succeeded || report.summary.totalErrors != 0) + throw new InvalidOperationException($"BuildPlayer ended {report.summary.result} with {report.summary.totalErrors} errors"); + + step = "gamedata"; + PlayerStaging.Stage(repoRoot, output); + + step = "aetherdb"; + Publish(repoRoot, Path.Combine(output, "ModTools"), target.runtime, target.aetherDb); + + step = "burst"; + var burst = Path.Combine(output, "Aetheria_BurstDebugInformation_DoNotShip"); + if (Directory.Exists(burst)) Directory.Delete(burst, true); + + Debug.Log($"AetheriaBuild OK {version} {output}"); + } + catch (Exception error) + { + Debug.LogError($"AetheriaBuild FAILED at {step}: {error.GetType().Name}: {error.Message}"); + EditorApplication.Exit(1); + return; + } + EditorApplication.Exit(0); + } + + private static void Publish(string repoRoot, string modTools, string runtime, string aetherDb) + { + var info = new ProcessStartInfo("dotnet") + { + Arguments = $"publish tools/AetherDb -c Release -r {runtime} --self-contained -p:PublishSingleFile=true -o \"{modTools}\"", + WorkingDirectory = repoRoot, + UseShellExecute = false, + RedirectStandardOutput = true, + RedirectStandardError = true, + }; + using (var process = Process.Start(info)) + { + var errors = process.StandardError.ReadToEndAsync(); + var text = process.StandardOutput.ReadToEnd(); + process.WaitForExit(); + if (process.ExitCode != 0) + throw new InvalidOperationException($"dotnet publish exited {process.ExitCode}:\n{text}\n{errors.Result}"); + } + if (!File.Exists(Path.Combine(modTools, aetherDb))) + throw new InvalidOperationException($"dotnet publish produced no ModTools/{aetherDb}"); + } + + private static string Argument(string name, string fallback = null) + { + var args = Environment.GetCommandLineArgs(); + var at = Array.IndexOf(args, name); + if (at < 0 || at + 1 >= args.Length) + return fallback ?? throw new InvalidOperationException(name + " is required"); + return args[at + 1]; + } +} diff --git a/Assets/Editor/AetheriaBuild.cs.meta b/Assets/Editor/AetheriaBuild.cs.meta new file mode 100644 index 000000000..833ad46ac --- /dev/null +++ b/Assets/Editor/AetheriaBuild.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: d38caad223051494ba36c734ce79950d \ No newline at end of file diff --git a/Assets/Editor/PlayerStaging.cs b/Assets/Editor/PlayerStaging.cs new file mode 100644 index 000000000..6f48daaa0 --- /dev/null +++ b/Assets/Editor/PlayerStaging.cs @@ -0,0 +1,41 @@ +using System; +using System.IO; + +// What a player directory holds beside the executable's data: GameData/Aetheria.cc, GameData/Narrative/** and, when +// the repo has one, GameData/Mods/**. Nothing else under GameData ships (run.cc and player.cc are the player's own). +// Unity-free so the headless suite can prove the rules; AetheriaBuild is the only caller. +internal static class PlayerStaging +{ + public const string Catalog = "Aetheria.cc"; + public const string Narrative = "Narrative"; + public const string Mods = "Mods"; + + // Replaces /GameData with a copy of the three shipped entries of /GameData. + // Throws InvalidOperationException naming the entry when the catalog or Narrative is absent. + public static void Stage(string repoRoot, string playerDir) + { + var source = Path.Combine(repoRoot, "GameData"); + var destination = Path.Combine(playerDir, "GameData"); + var catalog = Path.Combine(source, Catalog); + var narrative = Path.Combine(source, Narrative); + var mods = Path.Combine(source, Mods); + + if (!File.Exists(catalog)) throw new InvalidOperationException($"GameData/{Catalog} is missing; a player never ships without its catalog."); + if (!Directory.Exists(narrative)) throw new InvalidOperationException($"GameData/{Narrative} is missing."); + + if (Directory.Exists(destination)) Directory.Delete(destination, true); + Directory.CreateDirectory(destination); + File.Copy(catalog, Path.Combine(destination, Catalog)); + CopyTree(narrative, Path.Combine(destination, Narrative)); + if (Directory.Exists(mods)) CopyTree(mods, Path.Combine(destination, Mods)); + } + + private static void CopyTree(string from, string to) + { + Directory.CreateDirectory(to); + foreach (var directory in Directory.GetDirectories(from, "*", SearchOption.AllDirectories)) + Directory.CreateDirectory(Path.Combine(to, directory.Substring(from.Length + 1))); + foreach (var file in Directory.GetFiles(from, "*", SearchOption.AllDirectories)) + File.Copy(file, Path.Combine(to, file.Substring(from.Length + 1))); + } +} diff --git a/Assets/Editor/PlayerStaging.cs.meta b/Assets/Editor/PlayerStaging.cs.meta new file mode 100644 index 000000000..71743d471 --- /dev/null +++ b/Assets/Editor/PlayerStaging.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 16dce8087f9149b44b6e294cb0851dd8 \ No newline at end of file diff --git a/Assets/Scripts/ServerShared/NIH/MIConvexHull.meta b/Assets/Fonts/Emoji.meta similarity index 77% rename from Assets/Scripts/ServerShared/NIH/MIConvexHull.meta rename to Assets/Fonts/Emoji.meta index 5f927b59d..442fb19cd 100644 --- a/Assets/Scripts/ServerShared/NIH/MIConvexHull.meta +++ b/Assets/Fonts/Emoji.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 4a109a0b0bb6e8f40935ca2ec55e5bd7 +guid: 5e0ef88f85924e146855ca7bb57bbdb6 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Assets/Fonts/Emoji/Emoji.asset b/Assets/Fonts/Emoji/Emoji.asset new file mode 100644 index 000000000..b37478ebd --- /dev/null +++ b/Assets/Fonts/Emoji/Emoji.asset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0da0ff045c78def703de64f1c79a0f6c0842985e21c261b165ada948dc726b1e +size 5791 diff --git a/Assets/Fonts/Emoji/Emoji.asset.meta b/Assets/Fonts/Emoji/Emoji.asset.meta new file mode 100644 index 000000000..f89bc04be --- /dev/null +++ b/Assets/Fonts/Emoji/Emoji.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4cbb1005dc560d54ba85c3d091dbe30b +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Fonts/Emoji/LICENSE.txt b/Assets/Fonts/Emoji/LICENSE.txt new file mode 100644 index 000000000..db961e007 --- /dev/null +++ b/Assets/Fonts/Emoji/LICENSE.txt @@ -0,0 +1,410 @@ +Twemoji v17.0.3: https://github.com/jdecked/twemoji/archive/refs/tags/v17.0.3.tar.gz +Copyright (c) 2022–present Jason Sofonia & Justine De Caires +Copyright (c) 2014–2021 Twitter +Graphics licensed under CC-BY 4.0: + +Change notice (CC BY 4.0 section 3(a)(1)(B)): the SVG graphics are converted to a COLRv0 colour +font (Twemoji.ttf) by tools/emoji/fetch_emoji_font.py using nanoemoji. No artwork is edited. + +Attribution Requirements (upstream README) + +As an open source project, attribution is critical from a legal, practical and motivational perspective in our opinion. The graphics are licensed under the CC-BY 4.0 which has a pretty good guide on [best practices for attribution](https://wiki.creativecommons.org/Best_practices_for_attribution). + +However, we consider the guide a bit onerous and as a project, will accept a mention in a project README or an 'About' section or footer on a website. In mobile applications, a common place would be in the Settings/About section (for example, see the mobile Twitter application Settings->About->Legal section). We would consider a mention in the HTML/JS source sufficient also. + +LICENSE-GRAPHICS (upstream, verbatim) +======================================================================= + +Attribution 4.0 International + +======================================================================= + +Creative Commons Corporation ("Creative Commons") is not a law firm and +does not provide legal services or legal advice. Distribution of +Creative Commons public licenses does not create a lawyer-client or +other relationship. Creative Commons makes its licenses and related +information available on an "as-is" basis. Creative Commons gives no +warranties regarding its licenses, any material licensed under their +terms and conditions, or any related information. Creative Commons +disclaims all liability for damages resulting from their use to the +fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and +conditions that creators and other rights holders may use to share +original works of authorship and other material subject to copyright +and certain other rights specified in the public license below. The +following considerations are for informational purposes only, are not +exhaustive, and do not form part of our licenses. + + Considerations for licensors: Our public licenses are + intended for use by those authorized to give the public + permission to use material in ways otherwise restricted by + copyright and certain other rights. Our licenses are + irrevocable. Licensors should read and understand the terms + and conditions of the license they choose before applying it. + Licensors should also secure all rights necessary before + applying our licenses so that the public can reuse the + material as expected. Licensors should clearly mark any + material not subject to the license. This includes other CC- + licensed material, or material used under an exception or + limitation to copyright. More considerations for licensors: + wiki.creativecommons.org/Considerations_for_licensors + + Considerations for the public: By using one of our public + licenses, a licensor grants the public permission to use the + licensed material under specified terms and conditions. If + the licensor's permission is not necessary for any reason--for + example, because of any applicable exception or limitation to + copyright--then that use is not regulated by the license. Our + licenses grant only permissions under copyright and certain + other rights that a licensor has authority to grant. Use of + the licensed material may still be restricted for other + reasons, including because others have copyright or other + rights in the material. A licensor may make special requests, + such as asking that all changes be marked or described. + Although not required by our licenses, you are encouraged to + respect those requests where reasonable. More_considerations + for the public: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Creative Commons Attribution 4.0 International Public License + +By exercising the Licensed Rights (defined below), You accept and agree +to be bound by the terms and conditions of this Creative Commons +Attribution 4.0 International Public License ("Public License"). To the +extent this Public License may be interpreted as a contract, You are +granted the Licensed Rights in consideration of Your acceptance of +these terms and conditions, and the Licensor grants You such rights in +consideration of benefits the Licensor receives from making the +Licensed Material available under these terms and conditions. + + +Section 1 -- Definitions. + + a. Adapted Material means material subject to Copyright and Similar + Rights that is derived from or based upon the Licensed Material + and in which the Licensed Material is translated, altered, + arranged, transformed, or otherwise modified in a manner requiring + permission under the Copyright and Similar Rights held by the + Licensor. For purposes of this Public License, where the Licensed + Material is a musical work, performance, or sound recording, + Adapted Material is always produced where the Licensed Material is + synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright + and Similar Rights in Your contributions to Adapted Material in + accordance with the terms and conditions of this Public License. + + c. Copyright and Similar Rights means copyright and/or similar rights + closely related to copyright including, without limitation, + performance, broadcast, sound recording, and Sui Generis Database + Rights, without regard to how the rights are labeled or + categorized. For purposes of this Public License, the rights + specified in Section 2(b)(1)-(2) are not Copyright and Similar + Rights. + + d. Effective Technological Measures means those measures that, in the + absence of proper authority, may not be circumvented under laws + fulfilling obligations under Article 11 of the WIPO Copyright + Treaty adopted on December 20, 1996, and/or similar international + agreements. + + e. Exceptions and Limitations means fair use, fair dealing, and/or + any other exception or limitation to Copyright and Similar Rights + that applies to Your use of the Licensed Material. + + f. Licensed Material means the artistic or literary work, database, + or other material to which the Licensor applied this Public + License. + + g. Licensed Rights means the rights granted to You subject to the + terms and conditions of this Public License, which are limited to + all Copyright and Similar Rights that apply to Your use of the + Licensed Material and that the Licensor has authority to license. + + h. Licensor means the individual(s) or entity(ies) granting rights + under this Public License. + + i. Share means to provide material to the public by any means or + process that requires permission under the Licensed Rights, such + as reproduction, public display, public performance, distribution, + dissemination, communication, or importation, and to make material + available to the public including in ways that members of the + public may access the material from a place and at a time + individually chosen by them. + + j. Sui Generis Database Rights means rights other than copyright + resulting from Directive 96/9/EC of the European Parliament and of + the Council of 11 March 1996 on the legal protection of databases, + as amended and/or succeeded, as well as other essentially + equivalent rights anywhere in the world. + + k. You means the individual or entity exercising the Licensed Rights + under this Public License. Your has a corresponding meaning. + + +Section 2 -- Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, + the Licensor hereby grants You a worldwide, royalty-free, + non-sublicensable, non-exclusive, irrevocable license to + exercise the Licensed Rights in the Licensed Material to: + + a. reproduce and Share the Licensed Material, in whole or + in part; and + + b. produce, reproduce, and Share Adapted Material. + + 2. Exceptions and Limitations. For the avoidance of doubt, where + Exceptions and Limitations apply to Your use, this Public + License does not apply, and You do not need to comply with + its terms and conditions. + + 3. Term. The term of this Public License is specified in Section + 6(a). + + 4. Media and formats; technical modifications allowed. The + Licensor authorizes You to exercise the Licensed Rights in + all media and formats whether now known or hereafter created, + and to make technical modifications necessary to do so. The + Licensor waives and/or agrees not to assert any right or + authority to forbid You from making technical modifications + necessary to exercise the Licensed Rights, including + technical modifications necessary to circumvent Effective + Technological Measures. For purposes of this Public License, + simply making modifications authorized by this Section 2(a) + (4) never produces Adapted Material. + + 5. Downstream recipients. + + a. Offer from the Licensor -- Licensed Material. Every + recipient of the Licensed Material automatically + receives an offer from the Licensor to exercise the + Licensed Rights under the terms and conditions of this + Public License. + + b. No downstream restrictions. You may not offer or impose + any additional or different terms or conditions on, or + apply any Effective Technological Measures to, the + Licensed Material if doing so restricts exercise of the + Licensed Rights by any recipient of the Licensed + Material. + + 6. No endorsement. Nothing in this Public License constitutes or + may be construed as permission to assert or imply that You + are, or that Your use of the Licensed Material is, connected + with, or sponsored, endorsed, or granted official status by, + the Licensor or others designated to receive attribution as + provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not + licensed under this Public License, nor are publicity, + privacy, and/or other similar personality rights; however, to + the extent possible, the Licensor waives and/or agrees not to + assert any such rights held by the Licensor to the limited + extent necessary to allow You to exercise the Licensed + Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this + Public License. + + 3. To the extent possible, the Licensor waives any right to + collect royalties from You for the exercise of the Licensed + Rights, whether directly or through a collecting society + under any voluntary or waivable statutory or compulsory + licensing scheme. In all other cases the Licensor expressly + reserves any right to collect such royalties. + + +Section 3 -- License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the +following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified + form), You must: + + a. retain the following if it is supplied by the Licensor + with the Licensed Material: + + i. identification of the creator(s) of the Licensed + Material and any others designated to receive + attribution, in any reasonable manner requested by + the Licensor (including by pseudonym if + designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of + warranties; + + v. a URI or hyperlink to the Licensed Material to the + extent reasonably practicable; + + b. indicate if You modified the Licensed Material and + retain an indication of any previous modifications; and + + c. indicate the Licensed Material is licensed under this + Public License, and include the text of, or the URI or + hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any + reasonable manner based on the medium, means, and context in + which You Share the Licensed Material. For example, it may be + reasonable to satisfy the conditions by providing a URI or + hyperlink to a resource that includes the required + information. + + 3. If requested by the Licensor, You must remove any of the + information required by Section 3(a)(1)(A) to the extent + reasonably practicable. + + 4. If You Share Adapted Material You produce, the Adapter's + License You apply must not prevent recipients of the Adapted + Material from complying with this Public License. + + +Section 4 -- Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that +apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right + to extract, reuse, reproduce, and Share all or a substantial + portion of the contents of the database; + + b. if You include all or a substantial portion of the database + contents in a database in which You have Sui Generis Database + Rights, then the database in which You have Sui Generis Database + Rights (but not its individual contents) is Adapted Material; and + + c. You must comply with the conditions in Section 3(a) if You Share + all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not +replace Your obligations under this Public License where the Licensed +Rights include other Copyright and Similar Rights. + + +Section 5 -- Disclaimer of Warranties and Limitation of Liability. + + a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE + EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS + AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF + ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, + IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, + WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, + ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT + KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT + ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. + + b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE + TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, + NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, + INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, + COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR + USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR + DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR + IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. + + c. The disclaimer of warranties and limitation of liability provided + above shall be interpreted in a manner that, to the extent + possible, most closely approximates an absolute disclaimer and + waiver of all liability. + + +Section 6 -- Term and Termination. + + a. This Public License applies for the term of the Copyright and + Similar Rights licensed here. However, if You fail to comply with + this Public License, then Your rights under this Public License + terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under + Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided + it is cured within 30 days of Your discovery of the + violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any + right the Licensor may have to seek remedies for Your violations + of this Public License. + + c. For the avoidance of doubt, the Licensor may also offer the + Licensed Material under separate terms or conditions or stop + distributing the Licensed Material at any time; however, doing so + will not terminate this Public License. + + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public + License. + + +Section 7 -- Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different + terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the + Licensed Material not stated herein are separate from and + independent of the terms and conditions of this Public License. + + +Section 8 -- Interpretation. + + a. For the avoidance of doubt, this Public License does not, and + shall not be interpreted to, reduce, limit, restrict, or impose + conditions on any use of the Licensed Material that could lawfully + be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is + deemed unenforceable, it shall be automatically reformed to the + minimum extent necessary to make it enforceable. If the provision + cannot be reformed, it shall be severed from this Public License + without affecting the enforceability of the remaining terms and + conditions. + + c. No term or condition of this Public License will be waived and no + failure to comply consented to unless expressly agreed to by the + Licensor. + + d. Nothing in this Public License constitutes or may be interpreted + as a limitation upon, or waiver of, any privileges and immunities + that apply to the Licensor or You, including from the legal + processes of any jurisdiction or authority. + + +======================================================================= + +Creative Commons is not a party to its public licenses. +Notwithstanding, Creative Commons may elect to apply one of its public +licenses to material it publishes and in those instances will be +considered the "Licensor." Except for the limited purpose of indicating +that material is shared under a Creative Commons public license or as +otherwise permitted by the Creative Commons policies published at +creativecommons.org/policies, Creative Commons does not authorize the +use of the trademark "Creative Commons" or any other trademark or logo +of Creative Commons without its prior written consent including, +without limitation, in connection with any unauthorized modifications +to any of its public licenses or any other arrangements, +understandings, or agreements concerning use of licensed material. For +the avoidance of doubt, this paragraph does not form part of the public +licenses. + +Creative Commons may be contacted at creativecommons.org. diff --git a/Assets/Resources/Geonames/Congo.csv.meta b/Assets/Fonts/Emoji/LICENSE.txt.meta similarity index 75% rename from Assets/Resources/Geonames/Congo.csv.meta rename to Assets/Fonts/Emoji/LICENSE.txt.meta index 6147d0a96..8dabd4444 100644 --- a/Assets/Resources/Geonames/Congo.csv.meta +++ b/Assets/Fonts/Emoji/LICENSE.txt.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 1e43b383bf860524986a6947496776d0 +guid: db23d2e6bc295794888af02d32cbae60 TextScriptImporter: externalObjects: {} userData: diff --git a/Assets/Fonts/Emoji/Twemoji.ttf b/Assets/Fonts/Emoji/Twemoji.ttf new file mode 100644 index 000000000..60d816cf2 --- /dev/null +++ b/Assets/Fonts/Emoji/Twemoji.ttf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:283b775ce3715a84065212985ebbdecb8fa0c457b7ccf2c9c15c99b5a83ef702 +size 1805956 diff --git a/Assets/Fonts/Emoji/Twemoji.ttf.meta b/Assets/Fonts/Emoji/Twemoji.ttf.meta new file mode 100644 index 000000000..5cc7ab440 --- /dev/null +++ b/Assets/Fonts/Emoji/Twemoji.ttf.meta @@ -0,0 +1,21 @@ +fileFormatVersion: 2 +guid: bde541f3fd3b82b4aa6aa068e4a205a7 +TrueTypeFontImporter: + externalObjects: {} + serializedVersion: 4 + fontSize: 16 + forceTextureCase: -2 + characterSpacing: 0 + characterPadding: 1 + includeFontData: 1 + fontNames: + - Aetheria Emoji + fallbackFontReferences: [] + customCharacters: + fontRenderingMode: 0 + ascentCalculationMode: 1 + useLegacyBoundsCalculation: 0 + shouldRoundAdvanceValue: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Fonts/Emoji/emoji-font.lock b/Assets/Fonts/Emoji/emoji-font.lock new file mode 100644 index 000000000..cc54beafa --- /dev/null +++ b/Assets/Fonts/Emoji/emoji-font.lock @@ -0,0 +1,25 @@ +source_url=https://github.com/jdecked/twemoji/archive/refs/tags/v17.0.3.tar.gz +source_version=v17.0.3 +source_sha256=a0855654b633045ae2337537e77f1bb4361162f7fcd910e613eaab1d6d9c5fca +emoji_test_version=17.0 +emoji_test_url=https://unicode.org/Public/17.0.0/emoji/emoji-test.txt +emoji_test_sha256=1d8a944f88d7952f7ef7c5167fef3c67995bcae24543949710231b03a201acda +svg_count=4009 +single_codepoint_count=1400 +unsupported_count=0 +sequence_count=2760 +tool_nanoemoji=0.16.0 +tool_fonttools=4.66.1 +tool_picosvg=0.23.0 +tool_ninja=1.13.2 +source_date_epoch=1780352497 +color_format=glyf_colr_0 +python_version=3.13.15 +platform=linux +container_image=python:3.13-slim +fe0f_less_twins=15 +font_file=Twemoji.ttf +font_sha256=283b775ce3715a84065212985ebbdecb8fa0c457b7ccf2c9c15c99b5a83ef702 +singles_sha256=7ad887a16ef5386df040e1e8988e9bdc55ae5cab461ffc9df4613d0cb5770b4e +unsupported_sha256=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 +sequences_sha256=18529154b14f75f54db5dedd72910de35af9ca05aef284b7d121be249b3c3bb2 diff --git a/Assets/Fonts/Emoji/emoji-font.lock.meta b/Assets/Fonts/Emoji/emoji-font.lock.meta new file mode 100644 index 000000000..d59e8a3eb --- /dev/null +++ b/Assets/Fonts/Emoji/emoji-font.lock.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 6290b5397f6ae1d47a19c6886ebd87e2 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/Brushes/Gravity Well.mat b/Assets/Materials/Brushes/Gravity Field.mat similarity index 92% rename from Assets/Materials/Brushes/Gravity Well.mat rename to Assets/Materials/Brushes/Gravity Field.mat index e0bd9f79d..d912917c9 100644 --- a/Assets/Materials/Brushes/Gravity Well.mat +++ b/Assets/Materials/Brushes/Gravity Field.mat @@ -7,8 +7,8 @@ Material: m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_Name: Gravity Well - m_Shader: {fileID: 4800000, guid: 268da230635cfb34ab4ed6ad39503fa0, type: 3} + m_Name: Gravity Field + m_Shader: {fileID: 4800000, guid: 08d8efa80af84065b54c9bfed784e435, type: 3} m_ShaderKeywords: m_LightmapFlags: 4 m_EnableInstancingVariants: 0 @@ -57,8 +57,6 @@ Material: m_Offset: {x: 0, y: 0} m_Floats: - _BumpScale: 1 - - _Cutoff: 1 - - _Depth: 80 - _DetailNormalMapScale: 1 - _DstBlend: 0 - _GlossMapScale: 1 @@ -68,7 +66,6 @@ Material: - _Mode: 0 - _OcclusionStrength: 1 - _Parallax: 0.02 - - _Power: 16 - _SmoothnessTextureChannel: 0 - _SpecularHighlights: 1 - _SrcBlend: 1 diff --git a/Assets/Materials/Brushes/Gravity Well.mat.meta b/Assets/Materials/Brushes/Gravity Field.mat.meta similarity index 100% rename from Assets/Materials/Brushes/Gravity Well.mat.meta rename to Assets/Materials/Brushes/Gravity Field.mat.meta diff --git a/Assets/Materials/Brushes/Sector Tint.mat b/Assets/Materials/Brushes/Sector Tint.mat index 3e5e00f24..84e252ad3 100644 --- a/Assets/Materials/Brushes/Sector Tint.mat +++ b/Assets/Materials/Brushes/Sector Tint.mat @@ -8,7 +8,7 @@ Material: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_Name: Sector Tint - m_Shader: {fileID: 4800000, guid: 268da230635cfb34ab4ed6ad39503fa0, type: 3} + m_Shader: {fileID: 4800000, guid: 782740c1a3d7455ea75dc87fafdc8432, type: 3} m_ValidKeywords: [] m_InvalidKeywords: [] m_LightmapFlags: 4 @@ -59,8 +59,8 @@ Material: m_Ints: [] m_Floats: - _BumpScale: 1 - - _Cutoff: 1 - _Depth: 0.025 + - _EdgeBrightness: 0.12 - _DetailNormalMapScale: 1 - _DstBlend: 0 - _Frequency: 6.2832 @@ -72,7 +72,6 @@ Material: - _OcclusionStrength: 1 - _Parallax: 0.02 - _Phase: 0 - - _Power: 2 - _SinePower: 1.25 - _SmoothnessTextureChannel: 0 - _SpecularHighlights: 1 diff --git a/Assets/Materials/Brushes/Wormhole Gravity.mat b/Assets/Materials/Brushes/Wormhole Gravity.mat deleted file mode 100644 index fb6f52b20..000000000 --- a/Assets/Materials/Brushes/Wormhole Gravity.mat +++ /dev/null @@ -1,82 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!21 &2100000 -Material: - serializedVersion: 8 - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: Wormhole Gravity - m_Shader: {fileID: 4800000, guid: 268da230635cfb34ab4ed6ad39503fa0, type: 3} - m_ValidKeywords: [] - m_InvalidKeywords: [] - m_LightmapFlags: 4 - m_EnableInstancingVariants: 0 - m_DoubleSidedGI: 0 - m_CustomRenderQueue: -1 - stringTagMap: {} - disabledShaderPasses: [] - m_SavedProperties: - serializedVersion: 3 - m_TexEnvs: - - _BumpMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailAlbedoMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailMask: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailNormalMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _EmissionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MainTex: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MetallicGlossMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _OcclusionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _ParallaxMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - m_Ints: [] - m_Floats: - - _BumpScale: 1 - - _Cutoff: 0.15 - - _Depth: 2000 - - _DetailNormalMapScale: 1 - - _DstBlend: 0 - - _GlossMapScale: 1 - - _Glossiness: 0.5 - - _GlossyReflections: 1 - - _Metallic: 0 - - _Mode: 0 - - _OcclusionStrength: 1 - - _Parallax: 0.02 - - _Power: 64 - - _SmoothnessTextureChannel: 0 - - _SpecularHighlights: 1 - - _SrcBlend: 1 - - _UVSec: 0 - - _ZWrite: 1 - m_Colors: - - _Color: {r: 1, g: 1, b: 1, a: 1} - - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} - m_BuildTextureStacks: [] diff --git a/Assets/Materials/Brushes/Wormhole Waves.mat.meta b/Assets/Materials/Brushes/Wormhole Waves.mat.meta deleted file mode 100644 index 1e5f35dd3..000000000 --- a/Assets/Materials/Brushes/Wormhole Waves.mat.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: ef2f6090d5cc14a4e9ce38def3bed9ac -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 2100000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Materials/Fog Marching 1.mat b/Assets/Materials/Fog Marching 1.mat deleted file mode 100644 index 20290c785..000000000 --- a/Assets/Materials/Fog Marching 1.mat +++ /dev/null @@ -1,73 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!21 &2100000 -Material: - serializedVersion: 6 - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: Fog Marching 1 - m_Shader: {fileID: 4800000, guid: 7a890b6ceccf53c44bfc54b18b5daa58, type: 3} - m_ShaderKeywords: - m_LightmapFlags: 4 - m_EnableInstancingVariants: 0 - m_DoubleSidedGI: 0 - m_CustomRenderQueue: -1 - stringTagMap: {} - disabledShaderPasses: [] - m_SavedProperties: - serializedVersion: 3 - m_TexEnvs: - - _Displacement: - m_Texture: {fileID: 8400000, guid: 06ec5ef8a5830fc44b1ac1a6e123add5, type: 2} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MainTex: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _Patch: - m_Texture: {fileID: 8400000, guid: c618a6b20b3c7394590c59a9fa467e86, type: 2} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _Surface: - m_Texture: {fileID: 8400000, guid: 2fc21a9d3e9647948b56e384cd9378b3, type: 2} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _TintTexture: - m_Texture: {fileID: 8400000, guid: d196505464047f04a97f28689041209b, type: 2} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - m_Floats: - - _AlphaFloor: 0.01 - - _DepthBlend: 512 - - _DepthCeiling: 4096 - - _FlowSpeed: 2 - - _Gamma: 0.5 - - _GridCeilingBlend: -300 - - _GridCeilingDensity: 0.01 - - _GridCeilingFollow: 0 - - _GridCeilingOffset: 0 - - _GridFillDensity: 0.001 - - _GridFloorBlend: 100 - - _GridFloorDensity: 2 - - _GridFloorOffset: 20 - - _GridPatchBlend: 50 - - _GridPatchDensity: 2 - - _NoiseExponent: 2.25 - - _NoiseFrequency: 0.015 - - _NoiseSpeed: 0 - - _NoiseStrength: 500 - - _SafetyDistance: 20 - - _Scattering: 0 - - _ScatteringDensityExponent: 0.5 - - _ScatteringDistExponent: 0.5 - - _ScatteringMinDist: 500 - - _StepExponent: 2 - - _TintExponent: 0.1 - - _TurbulenceAmplitude: 100 - - _TurbulenceScale: 100 - m_Colors: - - _Tint: {r: 0.0627451, g: 0.0627451, b: 0.0627451, a: 1} - m_BuildTextureStacks: [] diff --git a/Assets/Materials/Fog Marching 1.mat.meta b/Assets/Materials/Fog Marching 1.mat.meta deleted file mode 100644 index 00e039020..000000000 --- a/Assets/Materials/Fog Marching 1.mat.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: a72896cb7097bfa46a1a8f4092e47c72 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 2100000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Materials/Fog Marching Main Menu.mat b/Assets/Materials/Fog Marching Main Menu.mat deleted file mode 100644 index b22522a2d..000000000 --- a/Assets/Materials/Fog Marching Main Menu.mat +++ /dev/null @@ -1,99 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!21 &2100000 -Material: - serializedVersion: 6 - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: Fog Marching Main Menu - m_Shader: {fileID: 4800000, guid: 7a890b6ceccf53c44bfc54b18b5daa58, type: 3} - m_ShaderKeywords: - m_LightmapFlags: 4 - m_EnableInstancingVariants: 0 - m_DoubleSidedGI: 0 - m_CustomRenderQueue: -1 - stringTagMap: {} - disabledShaderPasses: [] - m_SavedProperties: - serializedVersion: 3 - m_TexEnvs: - - _Displacement: - m_Texture: {fileID: 8400000, guid: 06ec5ef8a5830fc44b1ac1a6e123add5, type: 2} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MainTex: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _NebulaPatch: - m_Texture: {fileID: 8400000, guid: c618a6b20b3c7394590c59a9fa467e86, type: 2} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _NebulaPatchHeight: - m_Texture: {fileID: 8400000, guid: 06ec5ef8a5830fc44b1ac1a6e123add5, type: 2} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _NebulaSurfaceHeight: - m_Texture: {fileID: 8400000, guid: 2fc21a9d3e9647948b56e384cd9378b3, type: 2} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _NebulaTint: - m_Texture: {fileID: 8400000, guid: d196505464047f04a97f28689041209b, type: 2} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _Patch: - m_Texture: {fileID: 8400000, guid: c618a6b20b3c7394590c59a9fa467e86, type: 2} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _Surface: - m_Texture: {fileID: 8400000, guid: 2fc21a9d3e9647948b56e384cd9378b3, type: 2} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _TintTexture: - m_Texture: {fileID: 8400000, guid: d196505464047f04a97f28689041209b, type: 2} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - m_Floats: - - _AlphaFloor: 0 - - _DepthBlend: 512 - - _DepthCeiling: 1024 - - _Exposure: 100 - - _FlowAmplitude: 1 - - _FlowScale: 1 - - _FlowScroll: 1 - - _FlowSpeed: 5 - - _Gamma: 0.3 - - _GridCeilingBlend: -300 - - _GridCeilingDensity: 0.01 - - _GridCeilingFollow: 0 - - _GridCeilingOffset: 0 - - _GridFillDensity: 0.001 - - _GridFloorBlend: 50 - - _GridFloorDensity: 1 - - _GridFloorOffset: 100 - - _GridPatchBlend: 50 - - _GridPatchDensity: 1 - - _NebulaFillDensity: 0.00075 - - _NebulaFloorBlend: 50 - - _NebulaFloorDensity: 1 - - _NebulaFloorOffset: 80 - - _NebulaPatchBlend: 25 - - _NebulaPatchDensity: 0.1 - - _NoiseExponent: 2 - - _NoiseFrequency: 0.02 - - _NoiseSpeed: 0.00001 - - _NoiseStrength: 200 - - _SafetyDistance: 50 - - _Scattering: 0 - - _ScatteringDensityExponent: 8 - - _ScatteringDistExponent: 0.5 - - _ScatteringMinDist: 1 - - _StepExponent: 2 - - _TintExponent: 1.2 - - _TurbulenceAmplitude: 20 - - _TurbulenceScale: 30 - m_Colors: - - _Tint: {r: 0.09411765, g: 0.09411765, b: 0.09411765, a: 1} - m_BuildTextureStacks: [] diff --git a/Assets/Materials/Fog Marching Main Menu.mat.meta b/Assets/Materials/Fog Marching Main Menu.mat.meta deleted file mode 100644 index 6a5cdb35e..000000000 --- a/Assets/Materials/Fog Marching Main Menu.mat.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: e21702a5e6e98b7409d6913663ceab7e -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 0 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Materials/Fog Marching Test.mat b/Assets/Materials/Fog Marching Test.mat deleted file mode 100644 index 91b56761e..000000000 --- a/Assets/Materials/Fog Marching Test.mat +++ /dev/null @@ -1,65 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!21 &2100000 -Material: - serializedVersion: 6 - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: Fog Marching Test - m_Shader: {fileID: 4800000, guid: 7a890b6ceccf53c44bfc54b18b5daa58, type: 3} - m_ShaderKeywords: - m_LightmapFlags: 4 - m_EnableInstancingVariants: 0 - m_DoubleSidedGI: 0 - m_CustomRenderQueue: -1 - stringTagMap: {} - disabledShaderPasses: [] - m_SavedProperties: - serializedVersion: 3 - m_TexEnvs: - - _Displacement: - m_Texture: {fileID: 8400000, guid: 06ec5ef8a5830fc44b1ac1a6e123add5, type: 2} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MainTex: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _Patch: - m_Texture: {fileID: 8400000, guid: c618a6b20b3c7394590c59a9fa467e86, type: 2} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _Surface: - m_Texture: {fileID: 8400000, guid: 2fc21a9d3e9647948b56e384cd9378b3, type: 2} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _TintTexture: - m_Texture: {fileID: 8400000, guid: d196505464047f04a97f28689041209b, type: 2} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - m_Floats: - - _AlphaFloor: 0 - - _DepthBlend: 512 - - _DepthCeiling: 4096 - - _Gamma: 0.66 - - _GridCeilingBlend: -300 - - _GridCeilingDensity: 0.01 - - _GridCeilingFollow: 0 - - _GridCeilingOffset: 0 - - _GridFillDensity: 0.000025 - - _GridFloorBlend: 100 - - _GridFloorDensity: 4 - - _GridFloorOffset: 0 - - _GridPatchBlend: 5 - - _GridPatchDensity: 0.1 - - _NoiseFrequency: 0.01 - - _NoiseSpeed: 0.02 - - _NoiseStrength: 50 - - _SafetyDistance: 0 - - _StepExponent: 2 - - _TintExponent: 8 - m_Colors: - - _Tint: {r: 2.0078435, g: 2.0078435, b: 2.0078435, a: 1} - m_BuildTextureStacks: [] diff --git a/Assets/Materials/Fog Marching Test.mat.meta b/Assets/Materials/Fog Marching Test.mat.meta deleted file mode 100644 index 9f0e3d586..000000000 --- a/Assets/Materials/Fog Marching Test.mat.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: ad63650ae6d6cc542a5aad16694b3c46 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 0 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Materials/Fog Marching.mat b/Assets/Materials/Fog Marching.mat deleted file mode 100644 index 52dc13c19..000000000 --- a/Assets/Materials/Fog Marching.mat +++ /dev/null @@ -1,99 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!21 &2100000 -Material: - serializedVersion: 6 - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: Fog Marching - m_Shader: {fileID: 4800000, guid: 7a890b6ceccf53c44bfc54b18b5daa58, type: 3} - m_ShaderKeywords: - m_LightmapFlags: 4 - m_EnableInstancingVariants: 0 - m_DoubleSidedGI: 0 - m_CustomRenderQueue: -1 - stringTagMap: {} - disabledShaderPasses: [] - m_SavedProperties: - serializedVersion: 3 - m_TexEnvs: - - _Displacement: - m_Texture: {fileID: 8400000, guid: 06ec5ef8a5830fc44b1ac1a6e123add5, type: 2} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MainTex: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _NebulaPatch: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _NebulaPatchHeight: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _NebulaSurfaceHeight: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _NebulaTint: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _Patch: - m_Texture: {fileID: 8400000, guid: c618a6b20b3c7394590c59a9fa467e86, type: 2} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _Surface: - m_Texture: {fileID: 8400000, guid: 2fc21a9d3e9647948b56e384cd9378b3, type: 2} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _TintTexture: - m_Texture: {fileID: 8400000, guid: d196505464047f04a97f28689041209b, type: 2} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - m_Floats: - - _AlphaFloor: 0.01 - - _DepthBlend: 512 - - _DepthCeiling: 4096 - - _Exposure: 10 - - _FlowAmplitude: 512 - - _FlowScale: 1024 - - _FlowScroll: 0 - - _FlowSpeed: 1 - - _Gamma: 0.3 - - _GridCeilingBlend: -300 - - _GridCeilingDensity: 0.01 - - _GridCeilingFollow: 0 - - _GridCeilingOffset: 0 - - _GridFillDensity: 0.0005 - - _GridFloorBlend: 50 - - _GridFloorDensity: 1 - - _GridFloorOffset: 10 - - _GridPatchBlend: 150 - - _GridPatchDensity: 1 - - _NebulaFillDensity: 0.00075 - - _NebulaFloorBlend: 150 - - _NebulaFloorDensity: 1 - - _NebulaFloorOffset: 0 - - _NebulaPatchBlend: 51.47 - - _NebulaPatchDensity: 0.25 - - _NoiseExponent: 3 - - _NoiseFrequency: 0.005 - - _NoiseSpeed: 0 - - _NoiseStrength: -400 - - _SafetyDistance: 200 - - _Scattering: 50 - - _ScatteringDensityExponent: 1 - - _ScatteringDistExponent: 1.5 - - _ScatteringMinDist: 10 - - _StepExponent: 2 - - _TintExponent: 2 - - _TurbulenceAmplitude: 20 - - _TurbulenceScale: 60 - m_Colors: - - _Tint: {r: 0.01, g: 0.01, b: 0.01, a: 1} - m_BuildTextureStacks: [] diff --git a/Assets/Materials/Fog Marching.mat.meta b/Assets/Materials/Fog Marching.mat.meta deleted file mode 100644 index 04c6076f8..000000000 --- a/Assets/Materials/Fog Marching.mat.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 2ff39f5d101241043ba1dcde19d92f77 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 0 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scripts/ServerShared/NIH/MIConvexHull/ConvexHull.meta b/Assets/Materials/PBR.meta similarity index 77% rename from Assets/Scripts/ServerShared/NIH/MIConvexHull/ConvexHull.meta rename to Assets/Materials/PBR.meta index 6a291ff20..a534b0d5a 100644 --- a/Assets/Scripts/ServerShared/NIH/MIConvexHull/ConvexHull.meta +++ b/Assets/Materials/PBR.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: a6e88469e3b81a541a0bc8a66e60d0c7 +guid: 5b293e272c024dc999b28fe49925e1d5 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Assets/Resources/Geonames.meta b/Assets/Materials/PBR/Carbon_Fibre.meta similarity index 77% rename from Assets/Resources/Geonames.meta rename to Assets/Materials/PBR/Carbon_Fibre.meta index 64c8c9a19..c4c6f51e4 100644 --- a/Assets/Resources/Geonames.meta +++ b/Assets/Materials/PBR/Carbon_Fibre.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 0f3e518a4c9bcc2469abe6cebdcb3691 +guid: 636104c9ca48436da05c3f6003fd3eae folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Assets/Materials/Brushes/Wormhole Waves.mat b/Assets/Materials/PBR/Carbon_Fibre/Carbon_Fibre.mat similarity index 70% rename from Assets/Materials/Brushes/Wormhole Waves.mat rename to Assets/Materials/PBR/Carbon_Fibre/Carbon_Fibre.mat index 7902c5c36..b7f244b60 100644 --- a/Assets/Materials/Brushes/Wormhole Waves.mat +++ b/Assets/Materials/PBR/Carbon_Fibre/Carbon_Fibre.mat @@ -7,9 +7,9 @@ Material: m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_Name: Wormhole Waves - m_Shader: {fileID: 4800000, guid: 8681ac064d59d15458d16cc9b884262c, type: 3} - m_ShaderKeywords: + m_Name: Carbon_Fibre + m_Shader: {fileID: 4800000, guid: ddff0b48b92c991499817d2a0f5d5059, type: 3} + m_ShaderKeywords: _MAINTEX _METALLICGLOSSMAP _NORMALMAP m_LightmapFlags: 4 m_EnableInstancingVariants: 0 m_DoubleSidedGI: 0 @@ -20,7 +20,7 @@ Material: serializedVersion: 3 m_TexEnvs: - _BumpMap: - m_Texture: {fileID: 0} + m_Texture: {fileID: 2800000, guid: 5723eb533deb4d73a2b015bb75b523b4, type: 3} m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} - _DetailAlbedoMap: @@ -39,12 +39,16 @@ Material: m_Texture: {fileID: 0} m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} + - _FadeTex: + m_Texture: {fileID: 2800000, guid: df0632a08c5f1a1498fa325c755dc459, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} - _MainTex: - m_Texture: {fileID: 0} + m_Texture: {fileID: 2800000, guid: 32fc9d1c4304495da5350f8a8b52e14b, type: 3} m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} - _MetallicGlossMap: - m_Texture: {fileID: 0} + m_Texture: {fileID: 2800000, guid: 15a9bba7a82740718ad2d3913f7297af, type: 3} m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} - _OcclusionMap: @@ -58,27 +62,25 @@ Material: m_Floats: - _BumpScale: 1 - _Cutoff: 0.5 - - _Depth: 33.9 - _DetailNormalMapScale: 1 - _DstBlend: 0 - - _Frequency: 2 - - _FrequencyDist: 60 + - _Fade: 0 + - _FadeEdge: 0.05 + - _FadeSharpness: 16 - _GlossMapScale: 1 - - _Glossiness: 0.5 + - _Glossiness: 1 - _GlossyReflections: 1 - - _Metallic: 0 + - _Metallic: 1 - _Mode: 0 - _OcclusionStrength: 1 - _Parallax: 0.02 - - _Power: 2 - - _SinePower: 1.25 - _SmoothnessTextureChannel: 0 - _SpecularHighlights: 1 - - _Speed: 15 - _SrcBlend: 1 - _UVSec: 0 - _ZWrite: 1 m_Colors: - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EdgeColor: {r: 3.0117648, g: 3.0117648, b: 11.984314, a: 1} - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} m_BuildTextureStacks: [] diff --git a/Assets/Materials/Brushes/Gravity Waves.mat.meta b/Assets/Materials/PBR/Carbon_Fibre/Carbon_Fibre.mat.meta similarity index 79% rename from Assets/Materials/Brushes/Gravity Waves.mat.meta rename to Assets/Materials/PBR/Carbon_Fibre/Carbon_Fibre.mat.meta index f4e2f41d4..b0f1c3097 100644 --- a/Assets/Materials/Brushes/Gravity Waves.mat.meta +++ b/Assets/Materials/PBR/Carbon_Fibre/Carbon_Fibre.mat.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 11fbaa87dcc7a3743a6bd3aa5c86e5ae +guid: 8e5a779dec614c80a12925ba063bb99f NativeFormatImporter: externalObjects: {} mainObjectFileID: 2100000 diff --git a/Assets/Materials/PBR/Carbon_Fibre/Carbon_Fibre_Color.jpg b/Assets/Materials/PBR/Carbon_Fibre/Carbon_Fibre_Color.jpg new file mode 100644 index 000000000..4e3c4a374 --- /dev/null +++ b/Assets/Materials/PBR/Carbon_Fibre/Carbon_Fibre_Color.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:327e42b2dfc859efd9b4f122cf1adbdb611c75e80dd3cb8a18bc69e83eef9585 +size 566952 diff --git a/Assets/Materials/PBR/Carbon_Fibre/Carbon_Fibre_Color.jpg.meta b/Assets/Materials/PBR/Carbon_Fibre/Carbon_Fibre_Color.jpg.meta new file mode 100644 index 000000000..614f43088 --- /dev/null +++ b/Assets/Materials/PBR/Carbon_Fibre/Carbon_Fibre_Color.jpg.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: 32fc9d1c4304495da5350f8a8b52e14b +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + 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: 4 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + 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: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Carbon_Fibre/Carbon_Fibre_MetallicSmoothness.png b/Assets/Materials/PBR/Carbon_Fibre/Carbon_Fibre_MetallicSmoothness.png new file mode 100644 index 000000000..31131f1a7 --- /dev/null +++ b/Assets/Materials/PBR/Carbon_Fibre/Carbon_Fibre_MetallicSmoothness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fd50d0187fdf8c05eba5ef982da5217c6adf9f03720a2c8041ef4bebd5a2658d +size 1944562 diff --git a/Assets/Materials/PBR/Carbon_Fibre/Carbon_Fibre_MetallicSmoothness.png.meta b/Assets/Materials/PBR/Carbon_Fibre/Carbon_Fibre_MetallicSmoothness.png.meta new file mode 100644 index 000000000..19a8fae68 --- /dev/null +++ b/Assets/Materials/PBR/Carbon_Fibre/Carbon_Fibre_MetallicSmoothness.png.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: 15a9bba7a82740718ad2d3913f7297af +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + 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: 4 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + 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: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Carbon_Fibre/Carbon_Fibre_NormalGL.jpg b/Assets/Materials/PBR/Carbon_Fibre/Carbon_Fibre_NormalGL.jpg new file mode 100644 index 000000000..c0e1c9aa8 --- /dev/null +++ b/Assets/Materials/PBR/Carbon_Fibre/Carbon_Fibre_NormalGL.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e76a53fce87086a2346756ef1ef25f6db6153bda3433611a192ac71b32b2ebdc +size 1356999 diff --git a/Assets/Materials/PBR/Carbon_Fibre/Carbon_Fibre_NormalGL.jpg.meta b/Assets/Materials/PBR/Carbon_Fibre/Carbon_Fibre_NormalGL.jpg.meta new file mode 100644 index 000000000..072cf13c3 --- /dev/null +++ b/Assets/Materials/PBR/Carbon_Fibre/Carbon_Fibre_NormalGL.jpg.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: 5723eb533deb4d73a2b015bb75b523b4 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + 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: 4 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + 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: 0 + spriteTessellationDetail: -1 + textureType: 1 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Carbon_Fibre/Carbon_Fibre_Roughness.jpg b/Assets/Materials/PBR/Carbon_Fibre/Carbon_Fibre_Roughness.jpg new file mode 100644 index 000000000..fd7a1f7f1 --- /dev/null +++ b/Assets/Materials/PBR/Carbon_Fibre/Carbon_Fibre_Roughness.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8005027078e974df48351781ce90885bd6325ac63d0a16b41938fca8fd35a634 +size 1189710 diff --git a/Assets/Materials/PBR/Carbon_Fibre/Carbon_Fibre_Roughness.jpg.meta b/Assets/Materials/PBR/Carbon_Fibre/Carbon_Fibre_Roughness.jpg.meta new file mode 100644 index 000000000..503d1d154 --- /dev/null +++ b/Assets/Materials/PBR/Carbon_Fibre/Carbon_Fibre_Roughness.jpg.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: b8e5cd91353441ebb42296a830fef845 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + 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: 4 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + 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: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/ServerShared/NIH/MIConvexHull/Triangulation.meta b/Assets/Materials/PBR/Gunmetal_Dark.meta similarity index 77% rename from Assets/Scripts/ServerShared/NIH/MIConvexHull/Triangulation.meta rename to Assets/Materials/PBR/Gunmetal_Dark.meta index 346f5fafe..7680bfe76 100644 --- a/Assets/Scripts/ServerShared/NIH/MIConvexHull/Triangulation.meta +++ b/Assets/Materials/PBR/Gunmetal_Dark.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 5bf99a94223c6e1458c243cb68091852 +guid: 22e47659e8e14482b3466711751b01b8 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Assets/Materials/Brushes/Wormhole Gravity 1.mat b/Assets/Materials/PBR/Gunmetal_Dark/Gunmetal_Dark.mat similarity index 69% rename from Assets/Materials/Brushes/Wormhole Gravity 1.mat rename to Assets/Materials/PBR/Gunmetal_Dark/Gunmetal_Dark.mat index 3ae24d6ee..150f0f72c 100644 --- a/Assets/Materials/Brushes/Wormhole Gravity 1.mat +++ b/Assets/Materials/PBR/Gunmetal_Dark/Gunmetal_Dark.mat @@ -7,9 +7,9 @@ Material: m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_Name: Wormhole Gravity 1 - m_Shader: {fileID: 4800000, guid: 268da230635cfb34ab4ed6ad39503fa0, type: 3} - m_ShaderKeywords: + m_Name: Gunmetal_Dark + m_Shader: {fileID: 4800000, guid: ddff0b48b92c991499817d2a0f5d5059, type: 3} + m_ShaderKeywords: _MAINTEX _METALLICGLOSSMAP _NORMALMAP m_LightmapFlags: 4 m_EnableInstancingVariants: 0 m_DoubleSidedGI: 0 @@ -20,7 +20,7 @@ Material: serializedVersion: 3 m_TexEnvs: - _BumpMap: - m_Texture: {fileID: 0} + m_Texture: {fileID: 2800000, guid: dc71e34b4a1f4de7aa826d18b67b5852, type: 3} m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} - _DetailAlbedoMap: @@ -39,12 +39,16 @@ Material: m_Texture: {fileID: 0} m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} + - _FadeTex: + m_Texture: {fileID: 2800000, guid: df0632a08c5f1a1498fa325c755dc459, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} - _MainTex: - m_Texture: {fileID: 0} + m_Texture: {fileID: 2800000, guid: 1ed06708491744fe944217d19e450157, type: 3} m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} - _MetallicGlossMap: - m_Texture: {fileID: 0} + m_Texture: {fileID: 2800000, guid: 31e7d642ff8a49a28390c82626c4b6b9, type: 3} m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} - _OcclusionMap: @@ -57,18 +61,19 @@ Material: m_Offset: {x: 0, y: 0} m_Floats: - _BumpScale: 1 - - _Cutoff: 1 - - _Depth: 54 + - _Cutoff: 0.5 - _DetailNormalMapScale: 1 - _DstBlend: 0 + - _Fade: 0 + - _FadeEdge: 0.05 + - _FadeSharpness: 16 - _GlossMapScale: 1 - - _Glossiness: 0.5 + - _Glossiness: 1 - _GlossyReflections: 1 - - _Metallic: 0 + - _Metallic: 1 - _Mode: 0 - _OcclusionStrength: 1 - _Parallax: 0.02 - - _Power: 4 - _SmoothnessTextureChannel: 0 - _SpecularHighlights: 1 - _SrcBlend: 1 @@ -76,5 +81,6 @@ Material: - _ZWrite: 1 m_Colors: - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EdgeColor: {r: 3.0117648, g: 3.0117648, b: 11.984314, a: 1} - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} m_BuildTextureStacks: [] diff --git a/Assets/Materials/Brushes/Wormhole Gravity 2.mat.meta b/Assets/Materials/PBR/Gunmetal_Dark/Gunmetal_Dark.mat.meta similarity index 79% rename from Assets/Materials/Brushes/Wormhole Gravity 2.mat.meta rename to Assets/Materials/PBR/Gunmetal_Dark/Gunmetal_Dark.mat.meta index fb6f1270d..24a52eab3 100644 --- a/Assets/Materials/Brushes/Wormhole Gravity 2.mat.meta +++ b/Assets/Materials/PBR/Gunmetal_Dark/Gunmetal_Dark.mat.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 0ec0689c58b99c64297b3e429e1d9112 +guid: 32199fedf9ce473191d8a734a74f3d5f NativeFormatImporter: externalObjects: {} mainObjectFileID: 2100000 diff --git a/Assets/Materials/PBR/Gunmetal_Dark/Gunmetal_Dark_Color.jpg b/Assets/Materials/PBR/Gunmetal_Dark/Gunmetal_Dark_Color.jpg new file mode 100644 index 000000000..4a0118922 --- /dev/null +++ b/Assets/Materials/PBR/Gunmetal_Dark/Gunmetal_Dark_Color.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:28845bf0cc6a1edeed7e9f10f5db4034cae4ba7377bc53633f413de0dbcae5b7 +size 1451112 diff --git a/Assets/Materials/PBR/Gunmetal_Dark/Gunmetal_Dark_Color.jpg.meta b/Assets/Materials/PBR/Gunmetal_Dark/Gunmetal_Dark_Color.jpg.meta new file mode 100644 index 000000000..848791f40 --- /dev/null +++ b/Assets/Materials/PBR/Gunmetal_Dark/Gunmetal_Dark_Color.jpg.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: 1ed06708491744fe944217d19e450157 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + 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: 4 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + 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: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Gunmetal_Dark/Gunmetal_Dark_MetallicSmoothness.png b/Assets/Materials/PBR/Gunmetal_Dark/Gunmetal_Dark_MetallicSmoothness.png new file mode 100644 index 000000000..f3cca5c7f --- /dev/null +++ b/Assets/Materials/PBR/Gunmetal_Dark/Gunmetal_Dark_MetallicSmoothness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1c101b3b9d7b3ff0636b6539cc65908dc5cac76e31e951a6a375918bb681076c +size 2899231 diff --git a/Assets/Materials/PBR/Gunmetal_Dark/Gunmetal_Dark_MetallicSmoothness.png.meta b/Assets/Materials/PBR/Gunmetal_Dark/Gunmetal_Dark_MetallicSmoothness.png.meta new file mode 100644 index 000000000..598a3c189 --- /dev/null +++ b/Assets/Materials/PBR/Gunmetal_Dark/Gunmetal_Dark_MetallicSmoothness.png.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: 31e7d642ff8a49a28390c82626c4b6b9 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + 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: 4 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + 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: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Gunmetal_Dark/Gunmetal_Dark_Metalness.jpg b/Assets/Materials/PBR/Gunmetal_Dark/Gunmetal_Dark_Metalness.jpg new file mode 100644 index 000000000..afd0fe3a6 --- /dev/null +++ b/Assets/Materials/PBR/Gunmetal_Dark/Gunmetal_Dark_Metalness.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b65d6b9091747bd81ee58adedcb6209d8ee21b2bde9298d7216989ada85ef622 +size 16545 diff --git a/Assets/Materials/PBR/Gunmetal_Dark/Gunmetal_Dark_Metalness.jpg.meta b/Assets/Materials/PBR/Gunmetal_Dark/Gunmetal_Dark_Metalness.jpg.meta new file mode 100644 index 000000000..2eb33ad5e --- /dev/null +++ b/Assets/Materials/PBR/Gunmetal_Dark/Gunmetal_Dark_Metalness.jpg.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: 51e45f19716b43128ce5d2aac5b5aed4 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + 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: 4 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + 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: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Gunmetal_Dark/Gunmetal_Dark_NormalGL.jpg b/Assets/Materials/PBR/Gunmetal_Dark/Gunmetal_Dark_NormalGL.jpg new file mode 100644 index 000000000..37f403c32 --- /dev/null +++ b/Assets/Materials/PBR/Gunmetal_Dark/Gunmetal_Dark_NormalGL.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e7b4437dca1fe52addbb21e145d3ccc43e8c1780b7930cc9dad1e2b73cb7455b +size 2260227 diff --git a/Assets/Materials/PBR/Gunmetal_Dark/Gunmetal_Dark_NormalGL.jpg.meta b/Assets/Materials/PBR/Gunmetal_Dark/Gunmetal_Dark_NormalGL.jpg.meta new file mode 100644 index 000000000..e3fed3ebc --- /dev/null +++ b/Assets/Materials/PBR/Gunmetal_Dark/Gunmetal_Dark_NormalGL.jpg.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: dc71e34b4a1f4de7aa826d18b67b5852 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + 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: 4 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + 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: 0 + spriteTessellationDetail: -1 + textureType: 1 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Gunmetal_Dark/Gunmetal_Dark_Roughness.jpg b/Assets/Materials/PBR/Gunmetal_Dark/Gunmetal_Dark_Roughness.jpg new file mode 100644 index 000000000..1e6edb81f --- /dev/null +++ b/Assets/Materials/PBR/Gunmetal_Dark/Gunmetal_Dark_Roughness.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0f466bcf997694d56cb7bc93526a881a195e2ee63b1e0c8a19da88289596b9f4 +size 1228992 diff --git a/Assets/Materials/PBR/Gunmetal_Dark/Gunmetal_Dark_Roughness.jpg.meta b/Assets/Materials/PBR/Gunmetal_Dark/Gunmetal_Dark_Roughness.jpg.meta new file mode 100644 index 000000000..d09d43872 --- /dev/null +++ b/Assets/Materials/PBR/Gunmetal_Dark/Gunmetal_Dark_Roughness.jpg.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: 5677a8acff8f49358627841b9be8e2dd +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + 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: 4 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + 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: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Metal_Scratched.meta b/Assets/Materials/PBR/Metal_Scratched.meta new file mode 100644 index 000000000..a53ff5c65 --- /dev/null +++ b/Assets/Materials/PBR/Metal_Scratched.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3e9d00e0b2454cc08632c972d2ee499b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Metal_Scratched/Metal_Scratched.mat b/Assets/Materials/PBR/Metal_Scratched/Metal_Scratched.mat new file mode 100644 index 000000000..fe6463397 --- /dev/null +++ b/Assets/Materials/PBR/Metal_Scratched/Metal_Scratched.mat @@ -0,0 +1,86 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Metal_Scratched + m_Shader: {fileID: 4800000, guid: ddff0b48b92c991499817d2a0f5d5059, type: 3} + m_ShaderKeywords: _MAINTEX _METALLICGLOSSMAP _NORMALMAP + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 2800000, guid: 3a10044baac4438f9fc0930783eccdf7, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _FadeTex: + m_Texture: {fileID: 2800000, guid: df0632a08c5f1a1498fa325c755dc459, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 2800000, guid: 5a9cee903a2d48718aaf6b224126f279, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 2800000, guid: 8b24d7ea11c341408a146fa39f59b7b0, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _Fade: 0 + - _FadeEdge: 0.05 + - _FadeSharpness: 16 + - _GlossMapScale: 1 + - _Glossiness: 1 + - _GlossyReflections: 1 + - _Metallic: 1 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EdgeColor: {r: 3.0117648, g: 3.0117648, b: 11.984314, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + m_BuildTextureStacks: [] diff --git a/Assets/Materials/Brushes/Wormhole Gravity 1.mat.meta b/Assets/Materials/PBR/Metal_Scratched/Metal_Scratched.mat.meta similarity index 79% rename from Assets/Materials/Brushes/Wormhole Gravity 1.mat.meta rename to Assets/Materials/PBR/Metal_Scratched/Metal_Scratched.mat.meta index 7d40d0332..1d5895d52 100644 --- a/Assets/Materials/Brushes/Wormhole Gravity 1.mat.meta +++ b/Assets/Materials/PBR/Metal_Scratched/Metal_Scratched.mat.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 244f3e4c0c030a24b8d7aa944895bdcf +guid: a5874fba9e2242c79aea6b21ddb63af0 NativeFormatImporter: externalObjects: {} mainObjectFileID: 2100000 diff --git a/Assets/Materials/PBR/Metal_Scratched/Metal_Scratched_Color.jpg b/Assets/Materials/PBR/Metal_Scratched/Metal_Scratched_Color.jpg new file mode 100644 index 000000000..cb09761f3 --- /dev/null +++ b/Assets/Materials/PBR/Metal_Scratched/Metal_Scratched_Color.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:934e3f0e21b71cb534442f398b287f70158ba7cc3e11ab829f873ddce9cea7fb +size 4314757 diff --git a/Assets/Materials/PBR/Metal_Scratched/Metal_Scratched_Color.jpg.meta b/Assets/Materials/PBR/Metal_Scratched/Metal_Scratched_Color.jpg.meta new file mode 100644 index 000000000..7b34b1c8f --- /dev/null +++ b/Assets/Materials/PBR/Metal_Scratched/Metal_Scratched_Color.jpg.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: 5a9cee903a2d48718aaf6b224126f279 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + 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: 4 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + 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: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Metal_Scratched/Metal_Scratched_MetallicSmoothness.png b/Assets/Materials/PBR/Metal_Scratched/Metal_Scratched_MetallicSmoothness.png new file mode 100644 index 000000000..7b1578437 --- /dev/null +++ b/Assets/Materials/PBR/Metal_Scratched/Metal_Scratched_MetallicSmoothness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7ce0400bc23c44f54aa018b195472b99b7c7007bf93166017bfaf05d68bca38d +size 4647897 diff --git a/Assets/Materials/PBR/Metal_Scratched/Metal_Scratched_MetallicSmoothness.png.meta b/Assets/Materials/PBR/Metal_Scratched/Metal_Scratched_MetallicSmoothness.png.meta new file mode 100644 index 000000000..b6b4c4b0e --- /dev/null +++ b/Assets/Materials/PBR/Metal_Scratched/Metal_Scratched_MetallicSmoothness.png.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: 8b24d7ea11c341408a146fa39f59b7b0 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + 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: 4 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + 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: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Metal_Scratched/Metal_Scratched_Metalness.jpg b/Assets/Materials/PBR/Metal_Scratched/Metal_Scratched_Metalness.jpg new file mode 100644 index 000000000..687e06af5 --- /dev/null +++ b/Assets/Materials/PBR/Metal_Scratched/Metal_Scratched_Metalness.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7a4f1124670270e69c5fae2537f2493ab55d6f6264310fa344414eb75026cfde +size 564910 diff --git a/Assets/Materials/PBR/Metal_Scratched/Metal_Scratched_Metalness.jpg.meta b/Assets/Materials/PBR/Metal_Scratched/Metal_Scratched_Metalness.jpg.meta new file mode 100644 index 000000000..697296e8c --- /dev/null +++ b/Assets/Materials/PBR/Metal_Scratched/Metal_Scratched_Metalness.jpg.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: 2eace05436f24d15944266ed3b841f21 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + 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: 4 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + 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: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Metal_Scratched/Metal_Scratched_NormalGL.jpg b/Assets/Materials/PBR/Metal_Scratched/Metal_Scratched_NormalGL.jpg new file mode 100644 index 000000000..e772289b2 --- /dev/null +++ b/Assets/Materials/PBR/Metal_Scratched/Metal_Scratched_NormalGL.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eb3d7953fb7867f7948b5d7a0dff6044f92a6bba56e6f4a48ad30a94c6096d98 +size 5038957 diff --git a/Assets/Materials/PBR/Metal_Scratched/Metal_Scratched_NormalGL.jpg.meta b/Assets/Materials/PBR/Metal_Scratched/Metal_Scratched_NormalGL.jpg.meta new file mode 100644 index 000000000..932d93b51 --- /dev/null +++ b/Assets/Materials/PBR/Metal_Scratched/Metal_Scratched_NormalGL.jpg.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: 3a10044baac4438f9fc0930783eccdf7 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + 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: 4 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + 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: 0 + spriteTessellationDetail: -1 + textureType: 1 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Metal_Scratched/Metal_Scratched_Roughness.jpg b/Assets/Materials/PBR/Metal_Scratched/Metal_Scratched_Roughness.jpg new file mode 100644 index 000000000..9dab37dc6 --- /dev/null +++ b/Assets/Materials/PBR/Metal_Scratched/Metal_Scratched_Roughness.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8fbd2281a995ab1185715dae4d7a657c10b338dfcb57a2f2245eac530d5bd7ed +size 2140434 diff --git a/Assets/Materials/PBR/Metal_Scratched/Metal_Scratched_Roughness.jpg.meta b/Assets/Materials/PBR/Metal_Scratched/Metal_Scratched_Roughness.jpg.meta new file mode 100644 index 000000000..393e3bd91 --- /dev/null +++ b/Assets/Materials/PBR/Metal_Scratched/Metal_Scratched_Roughness.jpg.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: 986a2475c1e248d7be5208d88ee17a15 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + 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: 4 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + 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: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Paint_Clean_Light.meta b/Assets/Materials/PBR/Paint_Clean_Light.meta new file mode 100644 index 000000000..c72ff31ca --- /dev/null +++ b/Assets/Materials/PBR/Paint_Clean_Light.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c2497e59922c471b935a06c396acb73e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Paint_Clean_Light/Paint_Clean_Light.mat b/Assets/Materials/PBR/Paint_Clean_Light/Paint_Clean_Light.mat new file mode 100644 index 000000000..f76052e2d --- /dev/null +++ b/Assets/Materials/PBR/Paint_Clean_Light/Paint_Clean_Light.mat @@ -0,0 +1,86 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Paint_Clean_Light + m_Shader: {fileID: 4800000, guid: ddff0b48b92c991499817d2a0f5d5059, type: 3} + m_ShaderKeywords: _MAINTEX _METALLICGLOSSMAP _NORMALMAP + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 2800000, guid: f548cd63b5734e04a284018fefc81b30, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _FadeTex: + m_Texture: {fileID: 2800000, guid: df0632a08c5f1a1498fa325c755dc459, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 2800000, guid: 2c82a94e33b64fd481cbfeb7df9516bd, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 2800000, guid: ad8a50784ce04f5d9b3bab2115eeea34, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _Fade: 0 + - _FadeEdge: 0.05 + - _FadeSharpness: 16 + - _GlossMapScale: 1 + - _Glossiness: 1 + - _GlossyReflections: 1 + - _Metallic: 1 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EdgeColor: {r: 3.0117648, g: 3.0117648, b: 11.984314, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + m_BuildTextureStacks: [] diff --git a/Assets/Materials/Brushes/Wormhole Gravity.mat.meta b/Assets/Materials/PBR/Paint_Clean_Light/Paint_Clean_Light.mat.meta similarity index 79% rename from Assets/Materials/Brushes/Wormhole Gravity.mat.meta rename to Assets/Materials/PBR/Paint_Clean_Light/Paint_Clean_Light.mat.meta index 30ec9b01d..519f702b0 100644 --- a/Assets/Materials/Brushes/Wormhole Gravity.mat.meta +++ b/Assets/Materials/PBR/Paint_Clean_Light/Paint_Clean_Light.mat.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: a9ef17c902709ce41a837c54b809184b +guid: 132cb2f99d9f42fe9b05db1c0d653897 NativeFormatImporter: externalObjects: {} mainObjectFileID: 2100000 diff --git a/Assets/Materials/PBR/Paint_Clean_Light/Paint_Clean_Light_Color.jpg b/Assets/Materials/PBR/Paint_Clean_Light/Paint_Clean_Light_Color.jpg new file mode 100644 index 000000000..222b441ba --- /dev/null +++ b/Assets/Materials/PBR/Paint_Clean_Light/Paint_Clean_Light_Color.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9e966978debc85c05e1e4834e1ac8406d863f9267c396d1580ec2d94fdce9738 +size 638778 diff --git a/Assets/Materials/PBR/Paint_Clean_Light/Paint_Clean_Light_Color.jpg.meta b/Assets/Materials/PBR/Paint_Clean_Light/Paint_Clean_Light_Color.jpg.meta new file mode 100644 index 000000000..029f71505 --- /dev/null +++ b/Assets/Materials/PBR/Paint_Clean_Light/Paint_Clean_Light_Color.jpg.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: 2c82a94e33b64fd481cbfeb7df9516bd +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + 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: 4 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + 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: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Paint_Clean_Light/Paint_Clean_Light_MetallicSmoothness.png b/Assets/Materials/PBR/Paint_Clean_Light/Paint_Clean_Light_MetallicSmoothness.png new file mode 100644 index 000000000..a61363526 --- /dev/null +++ b/Assets/Materials/PBR/Paint_Clean_Light/Paint_Clean_Light_MetallicSmoothness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:412547b698a0968ba6f7c4f31e888bd88afb9f24e049f5811ca51c7490510998 +size 3692433 diff --git a/Assets/Materials/PBR/Paint_Clean_Light/Paint_Clean_Light_MetallicSmoothness.png.meta b/Assets/Materials/PBR/Paint_Clean_Light/Paint_Clean_Light_MetallicSmoothness.png.meta new file mode 100644 index 000000000..41ba9a3be --- /dev/null +++ b/Assets/Materials/PBR/Paint_Clean_Light/Paint_Clean_Light_MetallicSmoothness.png.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: ad8a50784ce04f5d9b3bab2115eeea34 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + 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: 4 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + 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: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Paint_Clean_Light/Paint_Clean_Light_NormalGL.jpg b/Assets/Materials/PBR/Paint_Clean_Light/Paint_Clean_Light_NormalGL.jpg new file mode 100644 index 000000000..0c74319d3 --- /dev/null +++ b/Assets/Materials/PBR/Paint_Clean_Light/Paint_Clean_Light_NormalGL.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:70e36c645d2d6bc9ddc79b86d1275147c52947613fed8ed75dc6aec5d9282187 +size 3220864 diff --git a/Assets/Materials/PBR/Paint_Clean_Light/Paint_Clean_Light_NormalGL.jpg.meta b/Assets/Materials/PBR/Paint_Clean_Light/Paint_Clean_Light_NormalGL.jpg.meta new file mode 100644 index 000000000..d0c0e745e --- /dev/null +++ b/Assets/Materials/PBR/Paint_Clean_Light/Paint_Clean_Light_NormalGL.jpg.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: f548cd63b5734e04a284018fefc81b30 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + 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: 4 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + 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: 0 + spriteTessellationDetail: -1 + textureType: 1 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Paint_Clean_Light/Paint_Clean_Light_Roughness.jpg b/Assets/Materials/PBR/Paint_Clean_Light/Paint_Clean_Light_Roughness.jpg new file mode 100644 index 000000000..499f33718 --- /dev/null +++ b/Assets/Materials/PBR/Paint_Clean_Light/Paint_Clean_Light_Roughness.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:44a1a3eb43252db6c242cd3e777a2e41819e872058e032e3cf8285cc578f35bb +size 2011305 diff --git a/Assets/Materials/PBR/Paint_Clean_Light/Paint_Clean_Light_Roughness.jpg.meta b/Assets/Materials/PBR/Paint_Clean_Light/Paint_Clean_Light_Roughness.jpg.meta new file mode 100644 index 000000000..117171aad --- /dev/null +++ b/Assets/Materials/PBR/Paint_Clean_Light/Paint_Clean_Light_Roughness.jpg.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: 21721bf50f1f407d8e0f2b5e06bf4ef5 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + 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: 4 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + 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: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Paint_Worn_Dark.meta b/Assets/Materials/PBR/Paint_Worn_Dark.meta new file mode 100644 index 000000000..f6af35502 --- /dev/null +++ b/Assets/Materials/PBR/Paint_Worn_Dark.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 22c55f60ad784e7495f2ddbae1e2799e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Paint_Worn_Dark/Paint_Worn_Dark.mat b/Assets/Materials/PBR/Paint_Worn_Dark/Paint_Worn_Dark.mat new file mode 100644 index 000000000..11deee75d --- /dev/null +++ b/Assets/Materials/PBR/Paint_Worn_Dark/Paint_Worn_Dark.mat @@ -0,0 +1,86 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Paint_Worn_Dark + m_Shader: {fileID: 4800000, guid: ddff0b48b92c991499817d2a0f5d5059, type: 3} + m_ShaderKeywords: _MAINTEX _METALLICGLOSSMAP _NORMALMAP _OCCLUSIONMAP + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 2800000, guid: b37cce6dfe8a45d0a7ba4e9a844c68b9, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _FadeTex: + m_Texture: {fileID: 2800000, guid: df0632a08c5f1a1498fa325c755dc459, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 2800000, guid: 8f9bc4377cc4451aae71a877219e700f, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 2800000, guid: b5158bc316ef42bead7fa70b7bc08a7a, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 2800000, guid: e8713adbe3e74ac4a4f431581bb31a4b, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _Fade: 0 + - _FadeEdge: 0.05 + - _FadeSharpness: 16 + - _GlossMapScale: 1 + - _Glossiness: 1 + - _GlossyReflections: 1 + - _Metallic: 1 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EdgeColor: {r: 3.0117648, g: 3.0117648, b: 11.984314, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + m_BuildTextureStacks: [] diff --git a/Assets/Materials/PBR/Paint_Worn_Dark/Paint_Worn_Dark.mat.meta b/Assets/Materials/PBR/Paint_Worn_Dark/Paint_Worn_Dark.mat.meta new file mode 100644 index 000000000..c70f30afd --- /dev/null +++ b/Assets/Materials/PBR/Paint_Worn_Dark/Paint_Worn_Dark.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e081b7d98e6d424fa42a6876a8e0bab3 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Paint_Worn_Dark/Paint_Worn_Dark_AO.jpg b/Assets/Materials/PBR/Paint_Worn_Dark/Paint_Worn_Dark_AO.jpg new file mode 100644 index 000000000..7c4f50094 --- /dev/null +++ b/Assets/Materials/PBR/Paint_Worn_Dark/Paint_Worn_Dark_AO.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d2e4af5867078208c00332af23bded29a4ac325b040f5980c2730ff8e551bc9d +size 2924087 diff --git a/Assets/Materials/PBR/Paint_Worn_Dark/Paint_Worn_Dark_AO.jpg.meta b/Assets/Materials/PBR/Paint_Worn_Dark/Paint_Worn_Dark_AO.jpg.meta new file mode 100644 index 000000000..e3c6ca27e --- /dev/null +++ b/Assets/Materials/PBR/Paint_Worn_Dark/Paint_Worn_Dark_AO.jpg.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: e8713adbe3e74ac4a4f431581bb31a4b +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + 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: 4 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + 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: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Paint_Worn_Dark/Paint_Worn_Dark_Color.jpg b/Assets/Materials/PBR/Paint_Worn_Dark/Paint_Worn_Dark_Color.jpg new file mode 100644 index 000000000..de88b6108 --- /dev/null +++ b/Assets/Materials/PBR/Paint_Worn_Dark/Paint_Worn_Dark_Color.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c57d484d39db6704fbcf32184f73472e6a78cfc63027422426fa170d87bdfc4a +size 5177435 diff --git a/Assets/Materials/PBR/Paint_Worn_Dark/Paint_Worn_Dark_Color.jpg.meta b/Assets/Materials/PBR/Paint_Worn_Dark/Paint_Worn_Dark_Color.jpg.meta new file mode 100644 index 000000000..5cdcca076 --- /dev/null +++ b/Assets/Materials/PBR/Paint_Worn_Dark/Paint_Worn_Dark_Color.jpg.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: 8f9bc4377cc4451aae71a877219e700f +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + 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: 4 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + 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: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Paint_Worn_Dark/Paint_Worn_Dark_MetallicSmoothness.png b/Assets/Materials/PBR/Paint_Worn_Dark/Paint_Worn_Dark_MetallicSmoothness.png new file mode 100644 index 000000000..ca9d86708 --- /dev/null +++ b/Assets/Materials/PBR/Paint_Worn_Dark/Paint_Worn_Dark_MetallicSmoothness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:98cc6442c3952acba81f86ae0210e9e0b171522dec1a80d9177eb942dd295d73 +size 5117887 diff --git a/Assets/Materials/PBR/Paint_Worn_Dark/Paint_Worn_Dark_MetallicSmoothness.png.meta b/Assets/Materials/PBR/Paint_Worn_Dark/Paint_Worn_Dark_MetallicSmoothness.png.meta new file mode 100644 index 000000000..28b873752 --- /dev/null +++ b/Assets/Materials/PBR/Paint_Worn_Dark/Paint_Worn_Dark_MetallicSmoothness.png.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: b5158bc316ef42bead7fa70b7bc08a7a +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + 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: 4 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + 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: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Paint_Worn_Dark/Paint_Worn_Dark_Metalness.jpg b/Assets/Materials/PBR/Paint_Worn_Dark/Paint_Worn_Dark_Metalness.jpg new file mode 100644 index 000000000..90096ce14 --- /dev/null +++ b/Assets/Materials/PBR/Paint_Worn_Dark/Paint_Worn_Dark_Metalness.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f3cdb47576c1085bea1bd3e90d055c7f45b66bda53d3ad03f825e5dc9665b93f +size 1073864 diff --git a/Assets/Materials/PBR/Paint_Worn_Dark/Paint_Worn_Dark_Metalness.jpg.meta b/Assets/Materials/PBR/Paint_Worn_Dark/Paint_Worn_Dark_Metalness.jpg.meta new file mode 100644 index 000000000..fb46b8a1a --- /dev/null +++ b/Assets/Materials/PBR/Paint_Worn_Dark/Paint_Worn_Dark_Metalness.jpg.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: c6d0917aab0d4442ad102a6088628f53 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + 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: 4 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + 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: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Paint_Worn_Dark/Paint_Worn_Dark_NormalGL.jpg b/Assets/Materials/PBR/Paint_Worn_Dark/Paint_Worn_Dark_NormalGL.jpg new file mode 100644 index 000000000..9c151b688 --- /dev/null +++ b/Assets/Materials/PBR/Paint_Worn_Dark/Paint_Worn_Dark_NormalGL.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:60e7d12d4eefed9f9c763b3095b6db35542ee00c7f076b72bb2718a3ccd649c9 +size 7526970 diff --git a/Assets/Materials/PBR/Paint_Worn_Dark/Paint_Worn_Dark_NormalGL.jpg.meta b/Assets/Materials/PBR/Paint_Worn_Dark/Paint_Worn_Dark_NormalGL.jpg.meta new file mode 100644 index 000000000..bcfcf9af3 --- /dev/null +++ b/Assets/Materials/PBR/Paint_Worn_Dark/Paint_Worn_Dark_NormalGL.jpg.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: b37cce6dfe8a45d0a7ba4e9a844c68b9 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + 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: 4 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + 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: 0 + spriteTessellationDetail: -1 + textureType: 1 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Paint_Worn_Dark/Paint_Worn_Dark_Roughness.jpg b/Assets/Materials/PBR/Paint_Worn_Dark/Paint_Worn_Dark_Roughness.jpg new file mode 100644 index 000000000..918bb48c5 --- /dev/null +++ b/Assets/Materials/PBR/Paint_Worn_Dark/Paint_Worn_Dark_Roughness.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:648bf332066975dad0fc618eda260571e8077a7d418587b8b55a68c7da797541 +size 2083327 diff --git a/Assets/Materials/PBR/Paint_Worn_Dark/Paint_Worn_Dark_Roughness.jpg.meta b/Assets/Materials/PBR/Paint_Worn_Dark/Paint_Worn_Dark_Roughness.jpg.meta new file mode 100644 index 000000000..3607f105d --- /dev/null +++ b/Assets/Materials/PBR/Paint_Worn_Dark/Paint_Worn_Dark_Roughness.jpg.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: 46fe06d220b044d1a6bb1a716c6e8705 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + 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: 4 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + 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: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Paint_Worn_Light.meta b/Assets/Materials/PBR/Paint_Worn_Light.meta new file mode 100644 index 000000000..34d26b097 --- /dev/null +++ b/Assets/Materials/PBR/Paint_Worn_Light.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b660a03d95714359ac68aa01a52064b9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Paint_Worn_Light/Paint_Worn_Light.mat b/Assets/Materials/PBR/Paint_Worn_Light/Paint_Worn_Light.mat new file mode 100644 index 000000000..9f6a4ff51 --- /dev/null +++ b/Assets/Materials/PBR/Paint_Worn_Light/Paint_Worn_Light.mat @@ -0,0 +1,86 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Paint_Worn_Light + m_Shader: {fileID: 4800000, guid: ddff0b48b92c991499817d2a0f5d5059, type: 3} + m_ShaderKeywords: _MAINTEX _METALLICGLOSSMAP _NORMALMAP _OCCLUSIONMAP + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 2800000, guid: 4ce3c2cc69304068b4a2ddc833b748b9, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _FadeTex: + m_Texture: {fileID: 2800000, guid: df0632a08c5f1a1498fa325c755dc459, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 2800000, guid: 73568a0c02bd4184bcb398c9e3dd7ab6, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 2800000, guid: d9cd336372c244e398532512e3f8f3be, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 2800000, guid: 73e117729c3447e5aa0eb1a30fad7c75, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _Fade: 0 + - _FadeEdge: 0.05 + - _FadeSharpness: 16 + - _GlossMapScale: 1 + - _Glossiness: 1 + - _GlossyReflections: 1 + - _Metallic: 1 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EdgeColor: {r: 3.0117648, g: 3.0117648, b: 11.984314, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + m_BuildTextureStacks: [] diff --git a/Assets/Materials/PBR/Paint_Worn_Light/Paint_Worn_Light.mat.meta b/Assets/Materials/PBR/Paint_Worn_Light/Paint_Worn_Light.mat.meta new file mode 100644 index 000000000..1441ced17 --- /dev/null +++ b/Assets/Materials/PBR/Paint_Worn_Light/Paint_Worn_Light.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5eb890ad19d44af98f2710f3af280e3c +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Paint_Worn_Light/Paint_Worn_Light_AO.jpg b/Assets/Materials/PBR/Paint_Worn_Light/Paint_Worn_Light_AO.jpg new file mode 100644 index 000000000..a9989d282 --- /dev/null +++ b/Assets/Materials/PBR/Paint_Worn_Light/Paint_Worn_Light_AO.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e2560f1aa453ffd2f4374c9ba4d184e1c43456726d8971460062515acef83b76 +size 2764255 diff --git a/Assets/Materials/PBR/Paint_Worn_Light/Paint_Worn_Light_AO.jpg.meta b/Assets/Materials/PBR/Paint_Worn_Light/Paint_Worn_Light_AO.jpg.meta new file mode 100644 index 000000000..be48781f6 --- /dev/null +++ b/Assets/Materials/PBR/Paint_Worn_Light/Paint_Worn_Light_AO.jpg.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: 73e117729c3447e5aa0eb1a30fad7c75 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + 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: 4 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + 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: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Paint_Worn_Light/Paint_Worn_Light_Color.jpg b/Assets/Materials/PBR/Paint_Worn_Light/Paint_Worn_Light_Color.jpg new file mode 100644 index 000000000..d05a21ab2 --- /dev/null +++ b/Assets/Materials/PBR/Paint_Worn_Light/Paint_Worn_Light_Color.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:401b7ee4394595110564bcb12a40c0b87ea50acfc3632b7e7237e2d0165d1ded +size 4364255 diff --git a/Assets/Materials/PBR/Paint_Worn_Light/Paint_Worn_Light_Color.jpg.meta b/Assets/Materials/PBR/Paint_Worn_Light/Paint_Worn_Light_Color.jpg.meta new file mode 100644 index 000000000..cc5b0e17b --- /dev/null +++ b/Assets/Materials/PBR/Paint_Worn_Light/Paint_Worn_Light_Color.jpg.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: 73568a0c02bd4184bcb398c9e3dd7ab6 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + 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: 4 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + 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: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Paint_Worn_Light/Paint_Worn_Light_MetallicSmoothness.png b/Assets/Materials/PBR/Paint_Worn_Light/Paint_Worn_Light_MetallicSmoothness.png new file mode 100644 index 000000000..08375c3a3 --- /dev/null +++ b/Assets/Materials/PBR/Paint_Worn_Light/Paint_Worn_Light_MetallicSmoothness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4c59489103f8a5ef438f0f74484cdf5af90b1ee2985a180d690772d1325816bf +size 6990606 diff --git a/Assets/Materials/PBR/Paint_Worn_Light/Paint_Worn_Light_MetallicSmoothness.png.meta b/Assets/Materials/PBR/Paint_Worn_Light/Paint_Worn_Light_MetallicSmoothness.png.meta new file mode 100644 index 000000000..13b040de5 --- /dev/null +++ b/Assets/Materials/PBR/Paint_Worn_Light/Paint_Worn_Light_MetallicSmoothness.png.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: d9cd336372c244e398532512e3f8f3be +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + 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: 4 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + 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: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Paint_Worn_Light/Paint_Worn_Light_Metalness.jpg b/Assets/Materials/PBR/Paint_Worn_Light/Paint_Worn_Light_Metalness.jpg new file mode 100644 index 000000000..10a0cd502 --- /dev/null +++ b/Assets/Materials/PBR/Paint_Worn_Light/Paint_Worn_Light_Metalness.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8be2891eeff9e521ac8d672edb106830e878ee0b73852a5763c803a8088014f2 +size 2705735 diff --git a/Assets/Materials/PBR/Paint_Worn_Light/Paint_Worn_Light_Metalness.jpg.meta b/Assets/Materials/PBR/Paint_Worn_Light/Paint_Worn_Light_Metalness.jpg.meta new file mode 100644 index 000000000..402c2f3f3 --- /dev/null +++ b/Assets/Materials/PBR/Paint_Worn_Light/Paint_Worn_Light_Metalness.jpg.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: 464aecd85593406aa2426215e07b988a +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + 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: 4 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + 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: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Paint_Worn_Light/Paint_Worn_Light_NormalGL.jpg b/Assets/Materials/PBR/Paint_Worn_Light/Paint_Worn_Light_NormalGL.jpg new file mode 100644 index 000000000..549164ad2 --- /dev/null +++ b/Assets/Materials/PBR/Paint_Worn_Light/Paint_Worn_Light_NormalGL.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f2ae51f315549a7d63c7f0290e9f6d35dfcd1bc42df422579ee407c30692599a +size 6857447 diff --git a/Assets/Materials/PBR/Paint_Worn_Light/Paint_Worn_Light_NormalGL.jpg.meta b/Assets/Materials/PBR/Paint_Worn_Light/Paint_Worn_Light_NormalGL.jpg.meta new file mode 100644 index 000000000..a9aa1c988 --- /dev/null +++ b/Assets/Materials/PBR/Paint_Worn_Light/Paint_Worn_Light_NormalGL.jpg.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: 4ce3c2cc69304068b4a2ddc833b748b9 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + 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: 4 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + 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: 0 + spriteTessellationDetail: -1 + textureType: 1 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Paint_Worn_Light/Paint_Worn_Light_Roughness.jpg b/Assets/Materials/PBR/Paint_Worn_Light/Paint_Worn_Light_Roughness.jpg new file mode 100644 index 000000000..d0ab06978 --- /dev/null +++ b/Assets/Materials/PBR/Paint_Worn_Light/Paint_Worn_Light_Roughness.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1207c0c4716229b36290416e4af37ccaf5351a65c8d93237a7802a95f45dfbcf +size 1929057 diff --git a/Assets/Materials/PBR/Paint_Worn_Light/Paint_Worn_Light_Roughness.jpg.meta b/Assets/Materials/PBR/Paint_Worn_Light/Paint_Worn_Light_Roughness.jpg.meta new file mode 100644 index 000000000..2b1eeabdb --- /dev/null +++ b/Assets/Materials/PBR/Paint_Worn_Light/Paint_Worn_Light_Roughness.jpg.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: 58cb097056b5431e819ca45954ee3b47 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + 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: 4 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + 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: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Plastic_Matte.meta b/Assets/Materials/PBR/Plastic_Matte.meta new file mode 100644 index 000000000..91fd17d97 --- /dev/null +++ b/Assets/Materials/PBR/Plastic_Matte.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1126ae7b5bcb4d6b8403e31233638b8d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/Brushes/Wormhole Gravity 2.mat b/Assets/Materials/PBR/Plastic_Matte/Plastic_Matte.mat similarity index 69% rename from Assets/Materials/Brushes/Wormhole Gravity 2.mat rename to Assets/Materials/PBR/Plastic_Matte/Plastic_Matte.mat index 3ae24d6ee..f5845363d 100644 --- a/Assets/Materials/Brushes/Wormhole Gravity 2.mat +++ b/Assets/Materials/PBR/Plastic_Matte/Plastic_Matte.mat @@ -7,9 +7,9 @@ Material: m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_Name: Wormhole Gravity 1 - m_Shader: {fileID: 4800000, guid: 268da230635cfb34ab4ed6ad39503fa0, type: 3} - m_ShaderKeywords: + m_Name: Plastic_Matte + m_Shader: {fileID: 4800000, guid: ddff0b48b92c991499817d2a0f5d5059, type: 3} + m_ShaderKeywords: _MAINTEX _METALLICGLOSSMAP _NORMALMAP m_LightmapFlags: 4 m_EnableInstancingVariants: 0 m_DoubleSidedGI: 0 @@ -20,7 +20,7 @@ Material: serializedVersion: 3 m_TexEnvs: - _BumpMap: - m_Texture: {fileID: 0} + m_Texture: {fileID: 2800000, guid: d9e9439b6e9f43ed9c47015cafdcd5d3, type: 3} m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} - _DetailAlbedoMap: @@ -39,12 +39,16 @@ Material: m_Texture: {fileID: 0} m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} + - _FadeTex: + m_Texture: {fileID: 2800000, guid: df0632a08c5f1a1498fa325c755dc459, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} - _MainTex: - m_Texture: {fileID: 0} + m_Texture: {fileID: 2800000, guid: 053c9b821bf649bab9c8f7b234803809, type: 3} m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} - _MetallicGlossMap: - m_Texture: {fileID: 0} + m_Texture: {fileID: 2800000, guid: f405c1ca89914831a4366ac1e4d850ee, type: 3} m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} - _OcclusionMap: @@ -57,18 +61,19 @@ Material: m_Offset: {x: 0, y: 0} m_Floats: - _BumpScale: 1 - - _Cutoff: 1 - - _Depth: 54 + - _Cutoff: 0.5 - _DetailNormalMapScale: 1 - _DstBlend: 0 + - _Fade: 0 + - _FadeEdge: 0.05 + - _FadeSharpness: 16 - _GlossMapScale: 1 - - _Glossiness: 0.5 + - _Glossiness: 1 - _GlossyReflections: 1 - - _Metallic: 0 + - _Metallic: 1 - _Mode: 0 - _OcclusionStrength: 1 - _Parallax: 0.02 - - _Power: 4 - _SmoothnessTextureChannel: 0 - _SpecularHighlights: 1 - _SrcBlend: 1 @@ -76,5 +81,6 @@ Material: - _ZWrite: 1 m_Colors: - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EdgeColor: {r: 3.0117648, g: 3.0117648, b: 11.984314, a: 1} - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} m_BuildTextureStacks: [] diff --git a/Assets/Materials/PBR/Plastic_Matte/Plastic_Matte.mat.meta b/Assets/Materials/PBR/Plastic_Matte/Plastic_Matte.mat.meta new file mode 100644 index 000000000..f92b559c4 --- /dev/null +++ b/Assets/Materials/PBR/Plastic_Matte/Plastic_Matte.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 636667df941046e79d2417c6b062d995 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Plastic_Matte/Plastic_Matte_Color.jpg b/Assets/Materials/PBR/Plastic_Matte/Plastic_Matte_Color.jpg new file mode 100644 index 000000000..00c2a444a --- /dev/null +++ b/Assets/Materials/PBR/Plastic_Matte/Plastic_Matte_Color.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5cb3a446755c2f868957807195d1e51ff989384da7878e8c0d9f93f391a5b755 +size 905715 diff --git a/Assets/Materials/PBR/Plastic_Matte/Plastic_Matte_Color.jpg.meta b/Assets/Materials/PBR/Plastic_Matte/Plastic_Matte_Color.jpg.meta new file mode 100644 index 000000000..e0947dee4 --- /dev/null +++ b/Assets/Materials/PBR/Plastic_Matte/Plastic_Matte_Color.jpg.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: 053c9b821bf649bab9c8f7b234803809 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + 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: 4 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + 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: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Plastic_Matte/Plastic_Matte_MetallicSmoothness.png b/Assets/Materials/PBR/Plastic_Matte/Plastic_Matte_MetallicSmoothness.png new file mode 100644 index 000000000..45e075a5b --- /dev/null +++ b/Assets/Materials/PBR/Plastic_Matte/Plastic_Matte_MetallicSmoothness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:811b05a5b78048c711f5129d14073bfa1983443553a2b75453f15e46ad6da998 +size 3782071 diff --git a/Assets/Materials/PBR/Plastic_Matte/Plastic_Matte_MetallicSmoothness.png.meta b/Assets/Materials/PBR/Plastic_Matte/Plastic_Matte_MetallicSmoothness.png.meta new file mode 100644 index 000000000..c641103a4 --- /dev/null +++ b/Assets/Materials/PBR/Plastic_Matte/Plastic_Matte_MetallicSmoothness.png.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: f405c1ca89914831a4366ac1e4d850ee +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + 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: 4 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + 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: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Plastic_Matte/Plastic_Matte_NormalGL.jpg b/Assets/Materials/PBR/Plastic_Matte/Plastic_Matte_NormalGL.jpg new file mode 100644 index 000000000..12b6ad1ff --- /dev/null +++ b/Assets/Materials/PBR/Plastic_Matte/Plastic_Matte_NormalGL.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e177082ed5027b4bb533e39b0556c7f3ca4701d6ffa3761910dff678d7f43d07 +size 9096346 diff --git a/Assets/Materials/PBR/Plastic_Matte/Plastic_Matte_NormalGL.jpg.meta b/Assets/Materials/PBR/Plastic_Matte/Plastic_Matte_NormalGL.jpg.meta new file mode 100644 index 000000000..357ce2800 --- /dev/null +++ b/Assets/Materials/PBR/Plastic_Matte/Plastic_Matte_NormalGL.jpg.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: d9e9439b6e9f43ed9c47015cafdcd5d3 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + 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: 4 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + 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: 0 + spriteTessellationDetail: -1 + textureType: 1 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Plastic_Matte/Plastic_Matte_Roughness.jpg b/Assets/Materials/PBR/Plastic_Matte/Plastic_Matte_Roughness.jpg new file mode 100644 index 000000000..c1eb5f150 --- /dev/null +++ b/Assets/Materials/PBR/Plastic_Matte/Plastic_Matte_Roughness.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:629c695383835080794b90174ae19a422cb7234870752642afa81f36a28cd9e7 +size 2095946 diff --git a/Assets/Materials/PBR/Plastic_Matte/Plastic_Matte_Roughness.jpg.meta b/Assets/Materials/PBR/Plastic_Matte/Plastic_Matte_Roughness.jpg.meta new file mode 100644 index 000000000..575bf2428 --- /dev/null +++ b/Assets/Materials/PBR/Plastic_Matte/Plastic_Matte_Roughness.jpg.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: 142ed10762d242a9a4ecf63ee0e38b71 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + 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: 4 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + 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: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Plates_Panels.meta b/Assets/Materials/PBR/Plates_Panels.meta new file mode 100644 index 000000000..99eb09f70 --- /dev/null +++ b/Assets/Materials/PBR/Plates_Panels.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 086928e6583747e1b14c6767ced082b4 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Plates_Panels/Plates_Panels.mat b/Assets/Materials/PBR/Plates_Panels/Plates_Panels.mat new file mode 100644 index 000000000..babe13ca0 --- /dev/null +++ b/Assets/Materials/PBR/Plates_Panels/Plates_Panels.mat @@ -0,0 +1,86 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Plates_Panels + m_Shader: {fileID: 4800000, guid: ddff0b48b92c991499817d2a0f5d5059, type: 3} + m_ShaderKeywords: _MAINTEX _METALLICGLOSSMAP _NORMALMAP + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 2800000, guid: 8bc10cfce8a64defaf9f67d156003f09, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _FadeTex: + m_Texture: {fileID: 2800000, guid: df0632a08c5f1a1498fa325c755dc459, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 2800000, guid: 2195885db9e846999fd10aa7f5c629b1, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 2800000, guid: d91bff887b764847a484d0a9bedce9e9, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _Fade: 0 + - _FadeEdge: 0.05 + - _FadeSharpness: 16 + - _GlossMapScale: 1 + - _Glossiness: 1 + - _GlossyReflections: 1 + - _Metallic: 1 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EdgeColor: {r: 3.0117648, g: 3.0117648, b: 11.984314, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + m_BuildTextureStacks: [] diff --git a/Assets/Materials/PBR/Plates_Panels/Plates_Panels.mat.meta b/Assets/Materials/PBR/Plates_Panels/Plates_Panels.mat.meta new file mode 100644 index 000000000..a8a703cf0 --- /dev/null +++ b/Assets/Materials/PBR/Plates_Panels/Plates_Panels.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c508beb10bbe4c7f88fc9a7c003e51d5 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Plates_Panels/Plates_Panels_Color.jpg b/Assets/Materials/PBR/Plates_Panels/Plates_Panels_Color.jpg new file mode 100644 index 000000000..9945f16ae --- /dev/null +++ b/Assets/Materials/PBR/Plates_Panels/Plates_Panels_Color.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4e69514467f58898537ecc6b3c47e618537406a00b7eb24099d3835ca4ae4c9a +size 2132182 diff --git a/Assets/Materials/PBR/Plates_Panels/Plates_Panels_Color.jpg.meta b/Assets/Materials/PBR/Plates_Panels/Plates_Panels_Color.jpg.meta new file mode 100644 index 000000000..960e6e0e3 --- /dev/null +++ b/Assets/Materials/PBR/Plates_Panels/Plates_Panels_Color.jpg.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: 2195885db9e846999fd10aa7f5c629b1 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + 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: 4 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + 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: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Plates_Panels/Plates_Panels_MetallicSmoothness.png b/Assets/Materials/PBR/Plates_Panels/Plates_Panels_MetallicSmoothness.png new file mode 100644 index 000000000..de028ea73 --- /dev/null +++ b/Assets/Materials/PBR/Plates_Panels/Plates_Panels_MetallicSmoothness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6b5ea65058b4792f97c7f9affd89930342b2306ab5dbd21f930ef153d4f4acf1 +size 3414650 diff --git a/Assets/Materials/PBR/Plates_Panels/Plates_Panels_MetallicSmoothness.png.meta b/Assets/Materials/PBR/Plates_Panels/Plates_Panels_MetallicSmoothness.png.meta new file mode 100644 index 000000000..6b036cb95 --- /dev/null +++ b/Assets/Materials/PBR/Plates_Panels/Plates_Panels_MetallicSmoothness.png.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: d91bff887b764847a484d0a9bedce9e9 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + 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: 4 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + 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: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Plates_Panels/Plates_Panels_Metalness.jpg b/Assets/Materials/PBR/Plates_Panels/Plates_Panels_Metalness.jpg new file mode 100644 index 000000000..9edfab941 --- /dev/null +++ b/Assets/Materials/PBR/Plates_Panels/Plates_Panels_Metalness.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:736a312c106a791672e1115df51ba0a08be7927f6cfc4aff97fcfb60311e002f +size 171958 diff --git a/Assets/Materials/PBR/Plates_Panels/Plates_Panels_Metalness.jpg.meta b/Assets/Materials/PBR/Plates_Panels/Plates_Panels_Metalness.jpg.meta new file mode 100644 index 000000000..69399ee42 --- /dev/null +++ b/Assets/Materials/PBR/Plates_Panels/Plates_Panels_Metalness.jpg.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: 5df39678e5734f51a29940f2f6a43dda +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + 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: 4 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + 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: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Plates_Panels/Plates_Panels_NormalGL.jpg b/Assets/Materials/PBR/Plates_Panels/Plates_Panels_NormalGL.jpg new file mode 100644 index 000000000..127c7888d --- /dev/null +++ b/Assets/Materials/PBR/Plates_Panels/Plates_Panels_NormalGL.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5f916040ca388073191224a515def08761a3e136a74f559feb5774ef50527d54 +size 3505435 diff --git a/Assets/Materials/PBR/Plates_Panels/Plates_Panels_NormalGL.jpg.meta b/Assets/Materials/PBR/Plates_Panels/Plates_Panels_NormalGL.jpg.meta new file mode 100644 index 000000000..da4e2137e --- /dev/null +++ b/Assets/Materials/PBR/Plates_Panels/Plates_Panels_NormalGL.jpg.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: 8bc10cfce8a64defaf9f67d156003f09 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + 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: 4 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + 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: 0 + spriteTessellationDetail: -1 + textureType: 1 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Plates_Panels/Plates_Panels_Roughness.jpg b/Assets/Materials/PBR/Plates_Panels/Plates_Panels_Roughness.jpg new file mode 100644 index 000000000..cf7a6709b --- /dev/null +++ b/Assets/Materials/PBR/Plates_Panels/Plates_Panels_Roughness.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f9fc8550cdb559c16cbd2d43196dcc271653e78c802519bc446684224048ff69 +size 1742286 diff --git a/Assets/Materials/PBR/Plates_Panels/Plates_Panels_Roughness.jpg.meta b/Assets/Materials/PBR/Plates_Panels/Plates_Panels_Roughness.jpg.meta new file mode 100644 index 000000000..9d51593f6 --- /dev/null +++ b/Assets/Materials/PBR/Plates_Panels/Plates_Panels_Roughness.jpg.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: e2f6e4f21fd14d6eb65e100b4f012349 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + 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: 4 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + 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: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Plates_Riveted.meta b/Assets/Materials/PBR/Plates_Riveted.meta new file mode 100644 index 000000000..870fc938a --- /dev/null +++ b/Assets/Materials/PBR/Plates_Riveted.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 79fbea05234f4b53a53eab2f090d2005 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Plates_Riveted/Plates_Riveted.mat b/Assets/Materials/PBR/Plates_Riveted/Plates_Riveted.mat new file mode 100644 index 000000000..e8088be9b --- /dev/null +++ b/Assets/Materials/PBR/Plates_Riveted/Plates_Riveted.mat @@ -0,0 +1,86 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Plates_Riveted + m_Shader: {fileID: 4800000, guid: ddff0b48b92c991499817d2a0f5d5059, type: 3} + m_ShaderKeywords: _MAINTEX _METALLICGLOSSMAP _NORMALMAP + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 2800000, guid: 6fb688a276034675b895c2edeb1b538b, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _FadeTex: + m_Texture: {fileID: 2800000, guid: df0632a08c5f1a1498fa325c755dc459, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 2800000, guid: f07bacf217654b269eecfabbcc651b2b, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 2800000, guid: 08b45a54ea8c4521b7c4e7b3974f0b42, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _Fade: 0 + - _FadeEdge: 0.05 + - _FadeSharpness: 16 + - _GlossMapScale: 1 + - _Glossiness: 1 + - _GlossyReflections: 1 + - _Metallic: 1 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EdgeColor: {r: 3.0117648, g: 3.0117648, b: 11.984314, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + m_BuildTextureStacks: [] diff --git a/Assets/Materials/PBR/Plates_Riveted/Plates_Riveted.mat.meta b/Assets/Materials/PBR/Plates_Riveted/Plates_Riveted.mat.meta new file mode 100644 index 000000000..62c10b5e6 --- /dev/null +++ b/Assets/Materials/PBR/Plates_Riveted/Plates_Riveted.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 538d82fdc2de48f4bcf4e93b17407f90 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Plates_Riveted/Plates_Riveted_Color.jpg b/Assets/Materials/PBR/Plates_Riveted/Plates_Riveted_Color.jpg new file mode 100644 index 000000000..fe22d7428 --- /dev/null +++ b/Assets/Materials/PBR/Plates_Riveted/Plates_Riveted_Color.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5a72ee2d4e5e6c3d4154e9244ad57f7c6b644b40b356db162c9f2b01e80547eb +size 1602784 diff --git a/Assets/Materials/PBR/Plates_Riveted/Plates_Riveted_Color.jpg.meta b/Assets/Materials/PBR/Plates_Riveted/Plates_Riveted_Color.jpg.meta new file mode 100644 index 000000000..dc74b1c54 --- /dev/null +++ b/Assets/Materials/PBR/Plates_Riveted/Plates_Riveted_Color.jpg.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: f07bacf217654b269eecfabbcc651b2b +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + 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: 4 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + 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: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Plates_Riveted/Plates_Riveted_MetallicSmoothness.png b/Assets/Materials/PBR/Plates_Riveted/Plates_Riveted_MetallicSmoothness.png new file mode 100644 index 000000000..527fe9f5f --- /dev/null +++ b/Assets/Materials/PBR/Plates_Riveted/Plates_Riveted_MetallicSmoothness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d678e8bff66b2d3bc703c5d355c47644f135544ac33afd517f1a542195b7e43d +size 5021835 diff --git a/Assets/Materials/PBR/Plates_Riveted/Plates_Riveted_MetallicSmoothness.png.meta b/Assets/Materials/PBR/Plates_Riveted/Plates_Riveted_MetallicSmoothness.png.meta new file mode 100644 index 000000000..778892894 --- /dev/null +++ b/Assets/Materials/PBR/Plates_Riveted/Plates_Riveted_MetallicSmoothness.png.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: 08b45a54ea8c4521b7c4e7b3974f0b42 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + 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: 4 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + 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: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Plates_Riveted/Plates_Riveted_Metalness.jpg b/Assets/Materials/PBR/Plates_Riveted/Plates_Riveted_Metalness.jpg new file mode 100644 index 000000000..05c05f99a --- /dev/null +++ b/Assets/Materials/PBR/Plates_Riveted/Plates_Riveted_Metalness.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:212258a43acddd1cb67203b3b263721022ae5f22bbf2213842a608fb09dc2b2f +size 1396144 diff --git a/Assets/Materials/PBR/Plates_Riveted/Plates_Riveted_Metalness.jpg.meta b/Assets/Materials/PBR/Plates_Riveted/Plates_Riveted_Metalness.jpg.meta new file mode 100644 index 000000000..86f483ff4 --- /dev/null +++ b/Assets/Materials/PBR/Plates_Riveted/Plates_Riveted_Metalness.jpg.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: 24e3f6b76da9420592e2f21931defae7 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + 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: 4 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + 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: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Plates_Riveted/Plates_Riveted_NormalGL.jpg b/Assets/Materials/PBR/Plates_Riveted/Plates_Riveted_NormalGL.jpg new file mode 100644 index 000000000..4c272122c --- /dev/null +++ b/Assets/Materials/PBR/Plates_Riveted/Plates_Riveted_NormalGL.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e49f90c003cf728de4892eec7d71f08abec1b2f9cb4780c875d005cb313498ac +size 3616644 diff --git a/Assets/Materials/PBR/Plates_Riveted/Plates_Riveted_NormalGL.jpg.meta b/Assets/Materials/PBR/Plates_Riveted/Plates_Riveted_NormalGL.jpg.meta new file mode 100644 index 000000000..aa8d94dbe --- /dev/null +++ b/Assets/Materials/PBR/Plates_Riveted/Plates_Riveted_NormalGL.jpg.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: 6fb688a276034675b895c2edeb1b538b +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + 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: 4 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + 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: 0 + spriteTessellationDetail: -1 + textureType: 1 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Plates_Riveted/Plates_Riveted_Roughness.jpg b/Assets/Materials/PBR/Plates_Riveted/Plates_Riveted_Roughness.jpg new file mode 100644 index 000000000..b96f7460a --- /dev/null +++ b/Assets/Materials/PBR/Plates_Riveted/Plates_Riveted_Roughness.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d48b683b55fd5e89c91a0c4bfde3a539fc892abc958387045e7d0786fe5c1fbd +size 1889081 diff --git a/Assets/Materials/PBR/Plates_Riveted/Plates_Riveted_Roughness.jpg.meta b/Assets/Materials/PBR/Plates_Riveted/Plates_Riveted_Roughness.jpg.meta new file mode 100644 index 000000000..232a09cf3 --- /dev/null +++ b/Assets/Materials/PBR/Plates_Riveted/Plates_Riveted_Roughness.jpg.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: 7b50b58679684fc8991f112974a62120 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + 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: 4 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + 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: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Rubber.meta b/Assets/Materials/PBR/Rubber.meta new file mode 100644 index 000000000..f4d39fafb --- /dev/null +++ b/Assets/Materials/PBR/Rubber.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 180d9a65c5784b618970824077421002 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/Brushes/Gravity Waves.mat b/Assets/Materials/PBR/Rubber/Rubber.mat similarity index 70% rename from Assets/Materials/Brushes/Gravity Waves.mat rename to Assets/Materials/PBR/Rubber/Rubber.mat index a45dfed21..2c10c3488 100644 --- a/Assets/Materials/Brushes/Gravity Waves.mat +++ b/Assets/Materials/PBR/Rubber/Rubber.mat @@ -7,9 +7,9 @@ Material: m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_Name: Gravity Waves - m_Shader: {fileID: 4800000, guid: 8a8e593b17063b54ea02f7ea5363b59d, type: 3} - m_ShaderKeywords: + m_Name: Rubber + m_Shader: {fileID: 4800000, guid: ddff0b48b92c991499817d2a0f5d5059, type: 3} + m_ShaderKeywords: _MAINTEX _METALLICGLOSSMAP _NORMALMAP m_LightmapFlags: 4 m_EnableInstancingVariants: 0 m_DoubleSidedGI: 0 @@ -20,7 +20,7 @@ Material: serializedVersion: 3 m_TexEnvs: - _BumpMap: - m_Texture: {fileID: 0} + m_Texture: {fileID: 2800000, guid: 42826f488ae243178be306ada5ee9f41, type: 3} m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} - _DetailAlbedoMap: @@ -39,12 +39,16 @@ Material: m_Texture: {fileID: 0} m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} + - _FadeTex: + m_Texture: {fileID: 2800000, guid: df0632a08c5f1a1498fa325c755dc459, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} - _MainTex: - m_Texture: {fileID: 0} + m_Texture: {fileID: 2800000, guid: 83e6c1768e014acfb494fbf007c40c80, type: 3} m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} - _MetallicGlossMap: - m_Texture: {fileID: 0} + m_Texture: {fileID: 2800000, guid: f1d4409638e4452cb1412503ed8526de, type: 3} m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} - _OcclusionMap: @@ -58,20 +62,18 @@ Material: m_Floats: - _BumpScale: 1 - _Cutoff: 0.5 - - _Depth: 3.5 - _DetailNormalMapScale: 1 - _DstBlend: 0 - - _Frequency: 27.43 + - _Fade: 0 + - _FadeEdge: 0.05 + - _FadeSharpness: 16 - _GlossMapScale: 1 - - _Glossiness: 0.5 + - _Glossiness: 1 - _GlossyReflections: 1 - - _Metallic: 0 + - _Metallic: 1 - _Mode: 0 - _OcclusionStrength: 1 - _Parallax: 0.02 - - _Phase: 0 - - _Power: 8 - - _SinePower: 1.25 - _SmoothnessTextureChannel: 0 - _SpecularHighlights: 1 - _SrcBlend: 1 @@ -79,5 +81,6 @@ Material: - _ZWrite: 1 m_Colors: - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EdgeColor: {r: 3.0117648, g: 3.0117648, b: 11.984314, a: 1} - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} m_BuildTextureStacks: [] diff --git a/Assets/Materials/PBR/Rubber/Rubber.mat.meta b/Assets/Materials/PBR/Rubber/Rubber.mat.meta new file mode 100644 index 000000000..989c2cd22 --- /dev/null +++ b/Assets/Materials/PBR/Rubber/Rubber.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 257d49e9af154d6c9b5ea50a288db1fa +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Rubber/Rubber_Color.jpg b/Assets/Materials/PBR/Rubber/Rubber_Color.jpg new file mode 100644 index 000000000..3a0e09062 --- /dev/null +++ b/Assets/Materials/PBR/Rubber/Rubber_Color.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d712c25987d3e6f40e3f37fae1ce1a4a4155d5e27cff64dadf2bbe140979dd98 +size 4479634 diff --git a/Assets/Materials/PBR/Rubber/Rubber_Color.jpg.meta b/Assets/Materials/PBR/Rubber/Rubber_Color.jpg.meta new file mode 100644 index 000000000..ff443d7b4 --- /dev/null +++ b/Assets/Materials/PBR/Rubber/Rubber_Color.jpg.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: 83e6c1768e014acfb494fbf007c40c80 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + 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: 4 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + 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: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Rubber/Rubber_MetallicSmoothness.png b/Assets/Materials/PBR/Rubber/Rubber_MetallicSmoothness.png new file mode 100644 index 000000000..d194ddc8f --- /dev/null +++ b/Assets/Materials/PBR/Rubber/Rubber_MetallicSmoothness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3a5d2c567edceeeec37de50166d325a0b3d29bc6cd90ad891635bf4cf8334376 +size 5044494 diff --git a/Assets/Materials/PBR/Rubber/Rubber_MetallicSmoothness.png.meta b/Assets/Materials/PBR/Rubber/Rubber_MetallicSmoothness.png.meta new file mode 100644 index 000000000..fe4234492 --- /dev/null +++ b/Assets/Materials/PBR/Rubber/Rubber_MetallicSmoothness.png.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: f1d4409638e4452cb1412503ed8526de +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + 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: 4 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + 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: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Rubber/Rubber_NormalGL.jpg b/Assets/Materials/PBR/Rubber/Rubber_NormalGL.jpg new file mode 100644 index 000000000..461b856ff --- /dev/null +++ b/Assets/Materials/PBR/Rubber/Rubber_NormalGL.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:61bf1b38eae723913275a1de5eb08d4ac543f11e28f4ac6f596a0644169010fc +size 9238212 diff --git a/Assets/Materials/PBR/Rubber/Rubber_NormalGL.jpg.meta b/Assets/Materials/PBR/Rubber/Rubber_NormalGL.jpg.meta new file mode 100644 index 000000000..16144739a --- /dev/null +++ b/Assets/Materials/PBR/Rubber/Rubber_NormalGL.jpg.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: 42826f488ae243178be306ada5ee9f41 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + 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: 4 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + 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: 0 + spriteTessellationDetail: -1 + textureType: 1 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Rubber/Rubber_Roughness.jpg b/Assets/Materials/PBR/Rubber/Rubber_Roughness.jpg new file mode 100644 index 000000000..7c59cbb40 --- /dev/null +++ b/Assets/Materials/PBR/Rubber/Rubber_Roughness.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dc137f95179a4ae42d67819750d78c3fe878d438b789cf96b33947618305a275 +size 3042709 diff --git a/Assets/Materials/PBR/Rubber/Rubber_Roughness.jpg.meta b/Assets/Materials/PBR/Rubber/Rubber_Roughness.jpg.meta new file mode 100644 index 000000000..feca8c0c2 --- /dev/null +++ b/Assets/Materials/PBR/Rubber/Rubber_Roughness.jpg.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: 834b5a5e1e1a49559f9fdeffd947e0a0 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + 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: 4 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + 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: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/SOURCES.md b/Assets/Materials/PBR/SOURCES.md new file mode 100644 index 000000000..baebd4022 --- /dev/null +++ b/Assets/Materials/PBR/SOURCES.md @@ -0,0 +1,22 @@ +# PBR material sources + +All texture sets are from ambientCG (https://ambientcg.com), licensed CC0 1.0 Universal (public domain, https://creativecommons.org/publicdomain/zero/1.0/). 2K-JPG downloads; displacement and NormalDX dropped; NormalGL kept (OpenGL convention, used by Blender and Unity). + +| Material | ambientCG id | URL | Metallic source | +|---|---|---|---| +| Paint_Clean_Light | Plastic010 | https://ambientcg.com/view?id=Plastic010 | none in set: constant 0 | +| Paint_Worn_Light | PaintedMetal012 | https://ambientcg.com/view?id=PaintedMetal012 | ambientCG Metalness map | +| Paint_Worn_Dark | PaintedMetal007 | https://ambientcg.com/view?id=PaintedMetal007 | ambientCG Metalness map | +| Steel_Brushed | Metal009 | https://ambientcg.com/view?id=Metal009 | ambientCG Metalness map | +| Metal_Scratched | Metal002 | https://ambientcg.com/view?id=Metal002 | ambientCG Metalness map | +| Gunmetal_Dark | Metal030 | https://ambientcg.com/view?id=Metal030 | ambientCG Metalness map | +| Plates_Riveted | MetalPlates002 | https://ambientcg.com/view?id=MetalPlates002 | ambientCG Metalness map | +| Plates_Panels | MetalPlates006 | https://ambientcg.com/view?id=MetalPlates006 | ambientCG Metalness map | +| Tread_Diamond | DiamondPlate001 | https://ambientcg.com/view?id=DiamondPlate001 | ambientCG Metalness map | +| Rubber | Rubber001 | https://ambientcg.com/view?id=Rubber001 | none in set: constant 0 | +| Plastic_Matte | Plastic004 | https://ambientcg.com/view?id=Plastic004 | none in set: constant 0 | +| Carbon_Fibre | Fabric004 | https://ambientcg.com/view?id=Fabric004 | set map is all 1.0; dielectric, so constant 0 | + +Files per material: `_Color`, `_Roughness`, `_NormalGL`, `_Metalness` and `_AO` (where the set has them), plus `_MetallicSmoothness.png` generated here for Unity (Metallic in R, Smoothness = 1 - Roughness in A). AO exists only for Paint_Worn_Light and Paint_Worn_Dark. + +Blender library: `Asset Sources/PBR Materials.blend` (catalog Aetheria/PBR, images linked by relative path to this folder). Unity materials use Aetheria/GlowFade. diff --git a/Assets/Resources/Geonames/Germany.csv.meta b/Assets/Materials/PBR/SOURCES.md.meta similarity index 75% rename from Assets/Resources/Geonames/Germany.csv.meta rename to Assets/Materials/PBR/SOURCES.md.meta index 244e41eda..4c16a4a62 100644 --- a/Assets/Resources/Geonames/Germany.csv.meta +++ b/Assets/Materials/PBR/SOURCES.md.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: ed470b8eb6cc68c4485ddc05d5a17ca1 +guid: a29568b9a0cf46babc43fe6045d6e10a TextScriptImporter: externalObjects: {} userData: diff --git a/Assets/Materials/PBR/Steel_Brushed.meta b/Assets/Materials/PBR/Steel_Brushed.meta new file mode 100644 index 000000000..0a76b67a2 --- /dev/null +++ b/Assets/Materials/PBR/Steel_Brushed.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 76edddc4bbd74a8d80e7cc29729b334e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Steel_Brushed/Steel_Brushed.mat b/Assets/Materials/PBR/Steel_Brushed/Steel_Brushed.mat new file mode 100644 index 000000000..7147c9aa2 --- /dev/null +++ b/Assets/Materials/PBR/Steel_Brushed/Steel_Brushed.mat @@ -0,0 +1,86 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Steel_Brushed + m_Shader: {fileID: 4800000, guid: ddff0b48b92c991499817d2a0f5d5059, type: 3} + m_ShaderKeywords: _MAINTEX _METALLICGLOSSMAP _NORMALMAP + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 2800000, guid: c3ef09438e3e46d18a4c267810aeb285, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _FadeTex: + m_Texture: {fileID: 2800000, guid: df0632a08c5f1a1498fa325c755dc459, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 2800000, guid: f70b6df0395b4752b4ec80cb7bfd8f42, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 2800000, guid: 40f5e915d2734d43bc01f984772e9d29, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _Fade: 0 + - _FadeEdge: 0.05 + - _FadeSharpness: 16 + - _GlossMapScale: 1 + - _Glossiness: 1 + - _GlossyReflections: 1 + - _Metallic: 1 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EdgeColor: {r: 3.0117648, g: 3.0117648, b: 11.984314, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + m_BuildTextureStacks: [] diff --git a/Assets/Materials/PBR/Steel_Brushed/Steel_Brushed.mat.meta b/Assets/Materials/PBR/Steel_Brushed/Steel_Brushed.mat.meta new file mode 100644 index 000000000..6a17f81b3 --- /dev/null +++ b/Assets/Materials/PBR/Steel_Brushed/Steel_Brushed.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 65c607f056d64708bb493dd31b39e79e +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Steel_Brushed/Steel_Brushed_Color.jpg b/Assets/Materials/PBR/Steel_Brushed/Steel_Brushed_Color.jpg new file mode 100644 index 000000000..c3406774a --- /dev/null +++ b/Assets/Materials/PBR/Steel_Brushed/Steel_Brushed_Color.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:209d3bb050be9f58c5af179d9712fa7799567a4cd50afd338d37674bdcff765b +size 2439272 diff --git a/Assets/Materials/PBR/Steel_Brushed/Steel_Brushed_Color.jpg.meta b/Assets/Materials/PBR/Steel_Brushed/Steel_Brushed_Color.jpg.meta new file mode 100644 index 000000000..d6973f061 --- /dev/null +++ b/Assets/Materials/PBR/Steel_Brushed/Steel_Brushed_Color.jpg.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: f70b6df0395b4752b4ec80cb7bfd8f42 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + 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: 4 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + 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: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Steel_Brushed/Steel_Brushed_MetallicSmoothness.png b/Assets/Materials/PBR/Steel_Brushed/Steel_Brushed_MetallicSmoothness.png new file mode 100644 index 000000000..8142b06f2 --- /dev/null +++ b/Assets/Materials/PBR/Steel_Brushed/Steel_Brushed_MetallicSmoothness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f2b84e6acb67eb71fb263546ba5fe2ddd5f6e00517addb3c96c0f226becab3bb +size 3309438 diff --git a/Assets/Materials/PBR/Steel_Brushed/Steel_Brushed_MetallicSmoothness.png.meta b/Assets/Materials/PBR/Steel_Brushed/Steel_Brushed_MetallicSmoothness.png.meta new file mode 100644 index 000000000..130146909 --- /dev/null +++ b/Assets/Materials/PBR/Steel_Brushed/Steel_Brushed_MetallicSmoothness.png.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: 40f5e915d2734d43bc01f984772e9d29 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + 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: 4 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + 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: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Steel_Brushed/Steel_Brushed_Metalness.jpg b/Assets/Materials/PBR/Steel_Brushed/Steel_Brushed_Metalness.jpg new file mode 100644 index 000000000..afd0fe3a6 --- /dev/null +++ b/Assets/Materials/PBR/Steel_Brushed/Steel_Brushed_Metalness.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b65d6b9091747bd81ee58adedcb6209d8ee21b2bde9298d7216989ada85ef622 +size 16545 diff --git a/Assets/Materials/PBR/Steel_Brushed/Steel_Brushed_Metalness.jpg.meta b/Assets/Materials/PBR/Steel_Brushed/Steel_Brushed_Metalness.jpg.meta new file mode 100644 index 000000000..1aa819912 --- /dev/null +++ b/Assets/Materials/PBR/Steel_Brushed/Steel_Brushed_Metalness.jpg.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: 415d2498454d4d419948b2aa11eac78c +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + 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: 4 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + 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: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Steel_Brushed/Steel_Brushed_NormalGL.jpg b/Assets/Materials/PBR/Steel_Brushed/Steel_Brushed_NormalGL.jpg new file mode 100644 index 000000000..2c9942542 --- /dev/null +++ b/Assets/Materials/PBR/Steel_Brushed/Steel_Brushed_NormalGL.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8773d9e97a4b057ced3e538d8ecc6069d27c8948191d61daf79b9ad93d93e3b3 +size 4120356 diff --git a/Assets/Materials/PBR/Steel_Brushed/Steel_Brushed_NormalGL.jpg.meta b/Assets/Materials/PBR/Steel_Brushed/Steel_Brushed_NormalGL.jpg.meta new file mode 100644 index 000000000..e223398fa --- /dev/null +++ b/Assets/Materials/PBR/Steel_Brushed/Steel_Brushed_NormalGL.jpg.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: c3ef09438e3e46d18a4c267810aeb285 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + 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: 4 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + 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: 0 + spriteTessellationDetail: -1 + textureType: 1 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Steel_Brushed/Steel_Brushed_Roughness.jpg b/Assets/Materials/PBR/Steel_Brushed/Steel_Brushed_Roughness.jpg new file mode 100644 index 000000000..a1d7edd1f --- /dev/null +++ b/Assets/Materials/PBR/Steel_Brushed/Steel_Brushed_Roughness.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e802f013b93cb1bd4b55cd91f02a1863233475a7f8bd0e6755cfaa447a729674 +size 1891607 diff --git a/Assets/Materials/PBR/Steel_Brushed/Steel_Brushed_Roughness.jpg.meta b/Assets/Materials/PBR/Steel_Brushed/Steel_Brushed_Roughness.jpg.meta new file mode 100644 index 000000000..726ff5549 --- /dev/null +++ b/Assets/Materials/PBR/Steel_Brushed/Steel_Brushed_Roughness.jpg.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: 158c7794c28740d0a16fa2dc22e93d8c +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + 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: 4 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + 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: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Tread_Diamond.meta b/Assets/Materials/PBR/Tread_Diamond.meta new file mode 100644 index 000000000..6a3445907 --- /dev/null +++ b/Assets/Materials/PBR/Tread_Diamond.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 78b78bf7d2f84a8d85daaf75d21fa56f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Tread_Diamond/Tread_Diamond.mat b/Assets/Materials/PBR/Tread_Diamond/Tread_Diamond.mat new file mode 100644 index 000000000..5b9542d0f --- /dev/null +++ b/Assets/Materials/PBR/Tread_Diamond/Tread_Diamond.mat @@ -0,0 +1,86 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Tread_Diamond + m_Shader: {fileID: 4800000, guid: ddff0b48b92c991499817d2a0f5d5059, type: 3} + m_ShaderKeywords: _MAINTEX _METALLICGLOSSMAP _NORMALMAP + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 2800000, guid: 043636050ee1492697e5bebb7603bf12, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _FadeTex: + m_Texture: {fileID: 2800000, guid: df0632a08c5f1a1498fa325c755dc459, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 2800000, guid: f04f0c584e824d81b7d7a91b969efef8, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 2800000, guid: 28456bc0a3c045e394e0937b6fe0231c, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _Fade: 0 + - _FadeEdge: 0.05 + - _FadeSharpness: 16 + - _GlossMapScale: 1 + - _Glossiness: 1 + - _GlossyReflections: 1 + - _Metallic: 1 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EdgeColor: {r: 3.0117648, g: 3.0117648, b: 11.984314, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + m_BuildTextureStacks: [] diff --git a/Assets/Materials/PBR/Tread_Diamond/Tread_Diamond.mat.meta b/Assets/Materials/PBR/Tread_Diamond/Tread_Diamond.mat.meta new file mode 100644 index 000000000..dd3e8ee22 --- /dev/null +++ b/Assets/Materials/PBR/Tread_Diamond/Tread_Diamond.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bd8a08731d8c4a4d8961c92fe318f1bb +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Tread_Diamond/Tread_Diamond_Color.jpg b/Assets/Materials/PBR/Tread_Diamond/Tread_Diamond_Color.jpg new file mode 100644 index 000000000..c4aae91a2 --- /dev/null +++ b/Assets/Materials/PBR/Tread_Diamond/Tread_Diamond_Color.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0a1de0119ef8592c3054949b6a9608a5a814156f661ed54541b390feb6fb87cd +size 2675454 diff --git a/Assets/Materials/PBR/Tread_Diamond/Tread_Diamond_Color.jpg.meta b/Assets/Materials/PBR/Tread_Diamond/Tread_Diamond_Color.jpg.meta new file mode 100644 index 000000000..f02278e36 --- /dev/null +++ b/Assets/Materials/PBR/Tread_Diamond/Tread_Diamond_Color.jpg.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: f04f0c584e824d81b7d7a91b969efef8 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + 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: 4 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + 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: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Tread_Diamond/Tread_Diamond_MetallicSmoothness.png b/Assets/Materials/PBR/Tread_Diamond/Tread_Diamond_MetallicSmoothness.png new file mode 100644 index 000000000..8c48d3028 --- /dev/null +++ b/Assets/Materials/PBR/Tread_Diamond/Tread_Diamond_MetallicSmoothness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b6131476bdbc8b6e910a5537a0aaadc977584f22c2a76d97f4cab4aa2b2b7ec0 +size 7151369 diff --git a/Assets/Materials/PBR/Tread_Diamond/Tread_Diamond_MetallicSmoothness.png.meta b/Assets/Materials/PBR/Tread_Diamond/Tread_Diamond_MetallicSmoothness.png.meta new file mode 100644 index 000000000..8804c2d58 --- /dev/null +++ b/Assets/Materials/PBR/Tread_Diamond/Tread_Diamond_MetallicSmoothness.png.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: 28456bc0a3c045e394e0937b6fe0231c +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + 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: 4 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + 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: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Tread_Diamond/Tread_Diamond_Metalness.jpg b/Assets/Materials/PBR/Tread_Diamond/Tread_Diamond_Metalness.jpg new file mode 100644 index 000000000..d65027465 --- /dev/null +++ b/Assets/Materials/PBR/Tread_Diamond/Tread_Diamond_Metalness.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6925202668aae7828b0a4765ca8854c539d94c4cd0f945b5195b5576272cdc7a +size 2420905 diff --git a/Assets/Materials/PBR/Tread_Diamond/Tread_Diamond_Metalness.jpg.meta b/Assets/Materials/PBR/Tread_Diamond/Tread_Diamond_Metalness.jpg.meta new file mode 100644 index 000000000..c786edbd3 --- /dev/null +++ b/Assets/Materials/PBR/Tread_Diamond/Tread_Diamond_Metalness.jpg.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: 5086225cf1bf485597fe191f1b9ca912 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + 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: 4 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + 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: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Tread_Diamond/Tread_Diamond_NormalGL.jpg b/Assets/Materials/PBR/Tread_Diamond/Tread_Diamond_NormalGL.jpg new file mode 100644 index 000000000..7411d45d0 --- /dev/null +++ b/Assets/Materials/PBR/Tread_Diamond/Tread_Diamond_NormalGL.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:317627265f2587cdfb00e06ea80415333b0ff2597321c79a77c2fd55448e5ec5 +size 7454546 diff --git a/Assets/Materials/PBR/Tread_Diamond/Tread_Diamond_NormalGL.jpg.meta b/Assets/Materials/PBR/Tread_Diamond/Tread_Diamond_NormalGL.jpg.meta new file mode 100644 index 000000000..747097254 --- /dev/null +++ b/Assets/Materials/PBR/Tread_Diamond/Tread_Diamond_NormalGL.jpg.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: 043636050ee1492697e5bebb7603bf12 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + 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: 4 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + 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: 0 + spriteTessellationDetail: -1 + textureType: 1 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PBR/Tread_Diamond/Tread_Diamond_Roughness.jpg b/Assets/Materials/PBR/Tread_Diamond/Tread_Diamond_Roughness.jpg new file mode 100644 index 000000000..2a2b7c7f8 --- /dev/null +++ b/Assets/Materials/PBR/Tread_Diamond/Tread_Diamond_Roughness.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6aa2c8bd6044829215771cb1c3d82fcd3845565ff1a9416f4a10403dc2dfbc1b +size 2395648 diff --git a/Assets/Materials/PBR/Tread_Diamond/Tread_Diamond_Roughness.jpg.meta b/Assets/Materials/PBR/Tread_Diamond/Tread_Diamond_Roughness.jpg.meta new file mode 100644 index 000000000..cc15cc441 --- /dev/null +++ b/Assets/Materials/PBR/Tread_Diamond/Tread_Diamond_Roughness.jpg.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: 1d942e92edc64885ae82ceb88af83104 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + 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: 4 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + 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: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 1 + platformSettings: + - serializedVersion: 4 + 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 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/Particles/Dithered Particle Trail AetherDrive.mat b/Assets/Materials/Particles/Dithered Particle Trail AetherDrive.mat deleted file mode 100644 index d4224d262..000000000 --- a/Assets/Materials/Particles/Dithered Particle Trail AetherDrive.mat +++ /dev/null @@ -1,78 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!21 &2100000 -Material: - serializedVersion: 6 - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: Dithered Particle Trail AetherDrive - m_Shader: {fileID: 4800000, guid: 46776b9fa35a437448f683f31b04d68d, type: 3} - m_ShaderKeywords: - m_LightmapFlags: 4 - m_EnableInstancingVariants: 0 - m_DoubleSidedGI: 0 - m_CustomRenderQueue: -1 - stringTagMap: {} - disabledShaderPasses: [] - m_SavedProperties: - serializedVersion: 3 - m_TexEnvs: - - _BumpMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailAlbedoMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailMask: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailNormalMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _EmissionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MainTex: - m_Texture: {fileID: 2800000, guid: 1d6eba2a167939a468c00fda35723dd0, type: 3} - m_Scale: {x: 0, y: 1} - m_Offset: {x: 0.5, y: 0} - - _MetallicGlossMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _OcclusionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _ParallaxMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - m_Floats: - - _BumpScale: 1 - - _Cutoff: 0.5 - - _DetailNormalMapScale: 1 - - _DstBlend: 0 - - _GlossMapScale: 1 - - _Glossiness: 0 - - _GlossyReflections: 1 - - _Metallic: 0 - - _Mode: 0 - - _OcclusionStrength: 1 - - _Parallax: 0.02 - - _SmoothnessTextureChannel: 0 - - _SpecularHighlights: 1 - - _SrcBlend: 1 - - _UVSec: 0 - - _ZWrite: 1 - m_Colors: - - _Color: {r: 1.216786, g: 1.216786, b: 1.216786, a: 1} - - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} - m_BuildTextureStacks: [] diff --git a/Assets/Materials/Particles/Dithered Particle Trail AetherDrive.mat.meta b/Assets/Materials/Particles/Dithered Particle Trail AetherDrive.mat.meta deleted file mode 100644 index 292027b73..000000000 --- a/Assets/Materials/Particles/Dithered Particle Trail AetherDrive.mat.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 555ada90c0f01654a9387483bd95a688 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 0 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Materials/UI/MapAsteroid.mat b/Assets/Materials/UI/MapAsteroid.mat new file mode 100644 index 000000000..a0dbbdb1f --- /dev/null +++ b/Assets/Materials/UI/MapAsteroid.mat @@ -0,0 +1,31 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: MapAsteroid + m_Shader: {fileID: 4800000, guid: 22e2fc798f044a3aa2f6cd71f1df09a7, type: 3} + m_ValidKeywords: [] + m_InvalidKeywords: [] + m_LightmapFlags: 0 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: 3000 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _MainTex: + m_Texture: {fileID: 2800000, guid: 060aefd5a3d5ced4dabd9190a140e76e, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: [] + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + m_BuildTextureStacks: [] diff --git a/Assets/Materials/UI/MapAsteroid.mat.meta b/Assets/Materials/UI/MapAsteroid.mat.meta new file mode 100644 index 000000000..2c044e9e9 --- /dev/null +++ b/Assets/Materials/UI/MapAsteroid.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c1012d5466454651b7279be93ef9af88 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Prefabs/RPG/Fog Patch.prefab b/Assets/Prefabs/RPG/Fog Patch.prefab index 64769c721..52cdefc65 100644 --- a/Assets/Prefabs/RPG/Fog Patch.prefab +++ b/Assets/Prefabs/RPG/Fog Patch.prefab @@ -11,6 +11,7 @@ GameObject: - component: {fileID: 3040023561780424834} - component: {fileID: 8539532519029615782} - component: {fileID: 4655154266675363797} + - component: {fileID: 2914522964471179774} m_Layer: 11 m_Name: Fog Patch m_TagString: Untagged @@ -25,13 +26,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 791530951415938407} + serializedVersion: 2 m_LocalRotation: {x: 0.7071068, y: -0, z: -0, w: 0.7071068} - m_LocalPosition: {x: -3148.4, y: -253.6, z: -1108.1} - m_LocalScale: {x: 1513.8295, y: 1513.8295, z: 1513.8295} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} --- !u!33 &8539532519029615782 MeshFilter: @@ -58,6 +59,11 @@ MeshRenderer: m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -79,7 +85,22 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 + m_MaskInteraction: 0 m_AdditionalVertexStreams: {fileID: 0} +--- !u!114 &2914522964471179774 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 791530951415938407} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a792b8f456004d04997a26557b338d1c, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::VapourCloudInstance + PatchHeight: -5 diff --git a/Assets/Prefabs/RPG/Pickups/Dodecahedron.prefab b/Assets/Prefabs/RPG/Pickups/Dodecahedron.prefab index 431b3c1a2..7a65a0864 100644 --- a/Assets/Prefabs/RPG/Pickups/Dodecahedron.prefab +++ b/Assets/Prefabs/RPG/Pickups/Dodecahedron.prefab @@ -23,6 +23,7 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 4094535758000554889} + serializedVersion: 2 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} @@ -30,7 +31,6 @@ Transform: m_Children: - {fileID: 9133920759869389018} m_Father: {fileID: 8489385781787202308} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &5284461483464579928 GameObject: @@ -44,7 +44,6 @@ GameObject: - component: {fileID: 2667259809042191123} - component: {fileID: 2093307059618178533} - component: {fileID: 8815906420840494942} - - component: {fileID: 8842807112802394818} - component: {fileID: 8689774408369415534} - component: {fileID: 5705448000916375656} - component: {fileID: -5496574226213385675} @@ -62,6 +61,7 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 5284461483464579928} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 2.76403, y: 0, z: 0} m_LocalScale: {x: 3, y: 3, z: 3} @@ -69,7 +69,6 @@ Transform: m_Children: - {fileID: 6463386671854692106} m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!33 &2667259809042191123 MeshFilter: @@ -96,6 +95,11 @@ MeshRenderer: m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -118,9 +122,11 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 + m_MaskInteraction: 0 m_AdditionalVertexStreams: {fileID: 0} --- !u!135 &8815906420840494942 SphereCollider: @@ -130,29 +136,19 @@ SphereCollider: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 5284461483464579928} m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 m_IsTrigger: 0 + m_ProvidesContacts: 0 m_Enabled: 1 - serializedVersion: 2 + serializedVersion: 3 m_Radius: 0.91187096 m_Center: {x: 0, y: 0, z: 0} ---- !u!114 &8842807112802394818 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5284461483464579928} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 737f47c158214f0995ba2835f040ed96, type: 3} - m_Name: - m_EditorClassIdentifier: - RotationSpeed: 1 - GridOffset: 0 - GridAttraction: 10 - Gravity: 1 - Drag: 0.05 - LaunchDrag: 0.2 --- !u!54 &8689774408369415534 Rigidbody: m_ObjectHideFlags: 0 @@ -160,10 +156,21 @@ Rigidbody: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 5284461483464579928} - serializedVersion: 2 + serializedVersion: 5 m_Mass: 1 - m_Drag: 0 - m_AngularDrag: 0.05 + m_LinearDamping: 0 + m_AngularDamping: 0.05 + m_CenterOfMass: {x: 0, y: 0, z: 0} + m_InertiaTensor: {x: 1, y: 1, z: 1} + m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ImplicitCom: 1 + m_ImplicitTensor: 1 m_UseGravity: 0 m_IsKinematic: 1 m_Interpolate: 0 @@ -181,6 +188,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 0c18f67d85af44c2b5afc8ecd15ce960, type: 3} m_Name: m_EditorClassIdentifier: + RotationSpeed: 1 LabelFadeDuration: 0.5 LabelPersistDuration: 3 LabelDisplayAngle: 15 @@ -204,6 +212,7 @@ PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: + serializedVersion: 3 m_TransformParent: {fileID: 6463386671854692106} m_Modifications: - target: {fileID: 2945231343692618236, guid: e7877477dc889804ea9d04f7ffd08e9b, @@ -327,6 +336,9 @@ PrefabInstance: value: 0 objectReference: {fileID: 0} m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: e7877477dc889804ea9d04f7ffd08e9b, type: 3} --- !u!114 &3355762817961458026 stripped MonoBehaviour: diff --git a/Assets/Prefabs/RPG/Pickups/Hexahedron.prefab b/Assets/Prefabs/RPG/Pickups/Hexahedron.prefab index fea9f67a9..f9a477cda 100644 --- a/Assets/Prefabs/RPG/Pickups/Hexahedron.prefab +++ b/Assets/Prefabs/RPG/Pickups/Hexahedron.prefab @@ -23,6 +23,7 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 3193517496555256095} + serializedVersion: 2 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} @@ -30,7 +31,6 @@ Transform: m_Children: - {fileID: 7638477100053754924} m_Father: {fileID: 3419130779256825702} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &7643266616531142933 GameObject: @@ -44,7 +44,6 @@ GameObject: - component: {fileID: 3269639735116279291} - component: {fileID: 7427774873968414741} - component: {fileID: 674324171579366365} - - component: {fileID: 7449398549621940518} - component: {fileID: 4507103896627202189} - component: {fileID: 648083621841515580} - component: {fileID: -5443764149998352794} @@ -62,6 +61,7 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 7643266616531142933} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 3, y: 3, z: 3} @@ -69,7 +69,6 @@ Transform: m_Children: - {fileID: 3601651121922051457} m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!33 &3269639735116279291 MeshFilter: @@ -96,6 +95,11 @@ MeshRenderer: m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -118,9 +122,11 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 + m_MaskInteraction: 0 m_AdditionalVertexStreams: {fileID: 0} --- !u!135 &674324171579366365 SphereCollider: @@ -130,29 +136,19 @@ SphereCollider: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 7643266616531142933} m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 m_IsTrigger: 0 + m_ProvidesContacts: 0 m_Enabled: 1 - serializedVersion: 2 + serializedVersion: 3 m_Radius: 0.8 m_Center: {x: 0, y: 0, z: 0} ---- !u!114 &7449398549621940518 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7643266616531142933} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 737f47c158214f0995ba2835f040ed96, type: 3} - m_Name: - m_EditorClassIdentifier: - RotationSpeed: 1 - GridOffset: 0 - GridAttraction: 10 - Gravity: 1 - Drag: 0.05 - LaunchDrag: 0.2 --- !u!114 &4507103896627202189 MonoBehaviour: m_ObjectHideFlags: 0 @@ -165,6 +161,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 0c18f67d85af44c2b5afc8ecd15ce960, type: 3} m_Name: m_EditorClassIdentifier: + RotationSpeed: 1 LabelFadeDuration: 0.5 LabelPersistDuration: 3 LabelDisplayAngle: 15 @@ -178,10 +175,21 @@ Rigidbody: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 7643266616531142933} - serializedVersion: 2 + serializedVersion: 5 m_Mass: 1 - m_Drag: 0 - m_AngularDrag: 0.05 + m_LinearDamping: 0 + m_AngularDamping: 0.05 + m_CenterOfMass: {x: 0, y: 0, z: 0} + m_InertiaTensor: {x: 1, y: 1, z: 1} + m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ImplicitCom: 1 + m_ImplicitTensor: 1 m_UseGravity: 0 m_IsKinematic: 1 m_Interpolate: 0 @@ -204,6 +212,7 @@ PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: + serializedVersion: 3 m_TransformParent: {fileID: 3601651121922051457} m_Modifications: - target: {fileID: 2945231343692618236, guid: e7877477dc889804ea9d04f7ffd08e9b, @@ -327,6 +336,9 @@ PrefabInstance: value: 0 objectReference: {fileID: 0} m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: e7877477dc889804ea9d04f7ffd08e9b, type: 3} --- !u!114 &4202270197902620060 stripped MonoBehaviour: diff --git a/Assets/Prefabs/RPG/Pickups/Icosahedron.prefab b/Assets/Prefabs/RPG/Pickups/Icosahedron.prefab index e99ae3392..4252e74cc 100644 --- a/Assets/Prefabs/RPG/Pickups/Icosahedron.prefab +++ b/Assets/Prefabs/RPG/Pickups/Icosahedron.prefab @@ -23,6 +23,7 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 6430764275721745537} + serializedVersion: 2 m_LocalRotation: {x: 0.7069834, y: -0, z: -0, w: 0.7072302} m_LocalPosition: {x: 0, y: -0.9858858, z: 0.000344038} m_LocalScale: {x: 1, y: 1, z: 1} @@ -30,7 +31,6 @@ Transform: m_Children: - {fileID: 5373456011921669618} m_Father: {fileID: 7548484292876150345} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &7167547457198401877 GameObject: @@ -44,7 +44,6 @@ GameObject: - component: {fileID: 7390838957595368880} - component: {fileID: 6960669510133879758} - component: {fileID: 3507902894264904200} - - component: {fileID: 8747099621875196907} - component: {fileID: 1545255963217739444} - component: {fileID: -5409019571952974707} - component: {fileID: -2501508196100734606} @@ -62,6 +61,7 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 7167547457198401877} + serializedVersion: 2 m_LocalRotation: {x: -0.7069834, y: 0, z: 0, w: 0.7072302} m_LocalPosition: {x: -0, y: 0, z: -2.9576573} m_LocalScale: {x: 3, y: 3, z: 3} @@ -69,7 +69,6 @@ Transform: m_Children: - {fileID: 4002800527770282731} m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: -89.98, y: 0, z: 0} --- !u!33 &7390838957595368880 MeshFilter: @@ -96,6 +95,11 @@ MeshRenderer: m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -118,9 +122,11 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 + m_MaskInteraction: 0 m_AdditionalVertexStreams: {fileID: 0} --- !u!135 &3507902894264904200 SphereCollider: @@ -130,29 +136,19 @@ SphereCollider: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 7167547457198401877} m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 m_IsTrigger: 0 + m_ProvidesContacts: 0 m_Enabled: 1 - serializedVersion: 2 + serializedVersion: 3 m_Radius: 0.8303433 m_Center: {x: 0, y: 0, z: 0} ---- !u!114 &8747099621875196907 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7167547457198401877} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 737f47c158214f0995ba2835f040ed96, type: 3} - m_Name: - m_EditorClassIdentifier: - RotationSpeed: 1 - GridOffset: 0 - GridAttraction: 10 - Gravity: 1 - Drag: 0.05 - LaunchDrag: 0.2 --- !u!114 &1545255963217739444 MonoBehaviour: m_ObjectHideFlags: 0 @@ -165,6 +161,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 0c18f67d85af44c2b5afc8ecd15ce960, type: 3} m_Name: m_EditorClassIdentifier: + RotationSpeed: 1 LabelFadeDuration: 0.5 LabelPersistDuration: 3 LabelDisplayAngle: 15 @@ -178,10 +175,21 @@ Rigidbody: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 7167547457198401877} - serializedVersion: 2 + serializedVersion: 5 m_Mass: 1 - m_Drag: 0 - m_AngularDrag: 0.05 + m_LinearDamping: 0 + m_AngularDamping: 0.05 + m_CenterOfMass: {x: 0, y: 0, z: 0} + m_InertiaTensor: {x: 1, y: 1, z: 1} + m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ImplicitCom: 1 + m_ImplicitTensor: 1 m_UseGravity: 0 m_IsKinematic: 1 m_Interpolate: 0 @@ -204,6 +212,7 @@ PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: + serializedVersion: 3 m_TransformParent: {fileID: 4002800527770282731} m_Modifications: - target: {fileID: 2945231343692618236, guid: e7877477dc889804ea9d04f7ffd08e9b, @@ -327,6 +336,9 @@ PrefabInstance: value: 0 objectReference: {fileID: 0} m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: e7877477dc889804ea9d04f7ffd08e9b, type: 3} --- !u!114 &1928241908402748482 stripped MonoBehaviour: diff --git a/Assets/Prefabs/RPG/Pickups/Octahedron.prefab b/Assets/Prefabs/RPG/Pickups/Octahedron.prefab index 7ba7910d2..099083195 100644 --- a/Assets/Prefabs/RPG/Pickups/Octahedron.prefab +++ b/Assets/Prefabs/RPG/Pickups/Octahedron.prefab @@ -23,6 +23,7 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 3932408193141279893} + serializedVersion: 2 m_LocalRotation: {x: 0.7069834, y: -0, z: -0, w: 0.7072302} m_LocalPosition: {x: 0, y: 0.9264834, z: -0.0003232956} m_LocalScale: {x: 1, y: 1, z: 1} @@ -30,7 +31,6 @@ Transform: m_Children: - {fileID: 7372978312502119311} m_Father: {fileID: 5807113421007930924} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &8555821447211356933 GameObject: @@ -44,7 +44,6 @@ GameObject: - component: {fileID: 4899765339662518078} - component: {fileID: 1691511938472729356} - component: {fileID: 3657818610818556929} - - component: {fileID: 946329779588188460} - component: {fileID: 7390748043139687254} - component: {fileID: -4611973708976329780} - component: {fileID: -8908388773057984787} @@ -62,6 +61,7 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 8555821447211356933} + serializedVersion: 2 m_LocalRotation: {x: -0.7069834, y: 0, z: 0, w: 0.7072302} m_LocalPosition: {x: -0, y: 0, z: 2.7794502} m_LocalScale: {x: 3, y: 3, z: 3} @@ -69,7 +69,6 @@ Transform: m_Children: - {fileID: 2388751103296260666} m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: -89.98, y: 0, z: 0} --- !u!33 &4899765339662518078 MeshFilter: @@ -96,6 +95,11 @@ MeshRenderer: m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -118,9 +122,11 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 + m_MaskInteraction: 0 m_AdditionalVertexStreams: {fileID: 0} --- !u!135 &3657818610818556929 SphereCollider: @@ -130,29 +136,19 @@ SphereCollider: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 8555821447211356933} m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 m_IsTrigger: 0 + m_ProvidesContacts: 0 m_Enabled: 1 - serializedVersion: 2 + serializedVersion: 3 m_Radius: 0.75 m_Center: {x: 0, y: 0, z: 0} ---- !u!114 &946329779588188460 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8555821447211356933} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 737f47c158214f0995ba2835f040ed96, type: 3} - m_Name: - m_EditorClassIdentifier: - RotationSpeed: 1 - GridOffset: 0 - GridAttraction: 10 - Gravity: 1 - Drag: 0.05 - LaunchDrag: 0.2 --- !u!114 &7390748043139687254 MonoBehaviour: m_ObjectHideFlags: 0 @@ -165,6 +161,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 0c18f67d85af44c2b5afc8ecd15ce960, type: 3} m_Name: m_EditorClassIdentifier: + RotationSpeed: 1 LabelFadeDuration: 0.5 LabelPersistDuration: 3 LabelDisplayAngle: 15 @@ -178,10 +175,21 @@ Rigidbody: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 8555821447211356933} - serializedVersion: 2 + serializedVersion: 5 m_Mass: 1 - m_Drag: 0 - m_AngularDrag: 0.05 + m_LinearDamping: 0 + m_AngularDamping: 0.05 + m_CenterOfMass: {x: 0, y: 0, z: 0} + m_InertiaTensor: {x: 1, y: 1, z: 1} + m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ImplicitCom: 1 + m_ImplicitTensor: 1 m_UseGravity: 0 m_IsKinematic: 1 m_Interpolate: 0 @@ -204,6 +212,7 @@ PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: + serializedVersion: 3 m_TransformParent: {fileID: 2388751103296260666} m_Modifications: - target: {fileID: 2945231343692618236, guid: e7877477dc889804ea9d04f7ffd08e9b, @@ -327,6 +336,9 @@ PrefabInstance: value: 0 objectReference: {fileID: 0} m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: e7877477dc889804ea9d04f7ffd08e9b, type: 3} --- !u!114 &3891726626588969535 stripped MonoBehaviour: diff --git a/Assets/Prefabs/RPG/Pickups/Scan Label.prefab b/Assets/Prefabs/RPG/Pickups/Scan Label.prefab index dff141f55..62c129c2b 100644 --- a/Assets/Prefabs/RPG/Pickups/Scan Label.prefab +++ b/Assets/Prefabs/RPG/Pickups/Scan Label.prefab @@ -28,9 +28,9 @@ RectTransform: 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: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -48,11 +48,17 @@ MeshRenderer: m_CastShadows: 0 m_ReceiveShadows: 0 m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -74,9 +80,11 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 + m_MaskInteraction: 0 m_AdditionalVertexStreams: {fileID: 0} --- !u!114 &3085702413493447743 MonoBehaviour: @@ -136,20 +144,23 @@ MonoBehaviour: m_VerticalAlignment: 1024 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 0 + m_TextWrappingMode: 0 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 0 m_isCullingEnabled: 0 @@ -164,8 +175,9 @@ MonoBehaviour: m_margin: {x: 0, y: 0, z: 0, w: 0} m_isUsingLegacyAnimationComponent: 0 m_isVolumetricText: 0 + _SortingLayer: 0 + _SortingLayerID: 0 + _SortingOrder: 0 m_hasFontAssetChanged: 0 m_renderer: {fileID: 2000937249754104238} m_maskType: 0 - _SortingLayerID: 0 - _SortingOrder: 0 diff --git a/Assets/Prefabs/RPG/Pickups/Tetrahedron.prefab b/Assets/Prefabs/RPG/Pickups/Tetrahedron.prefab index 26c2b96dd..6dad19967 100644 --- a/Assets/Prefabs/RPG/Pickups/Tetrahedron.prefab +++ b/Assets/Prefabs/RPG/Pickups/Tetrahedron.prefab @@ -23,6 +23,7 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2238948151922859802} + serializedVersion: 2 m_LocalRotation: {x: 0.7069834, y: -0, z: -0, w: 0.7072302} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} @@ -30,7 +31,6 @@ Transform: m_Children: - {fileID: 3300919539099916088} m_Father: {fileID: 8414659055235772867} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &7767746557817481743 GameObject: @@ -44,7 +44,6 @@ GameObject: - component: {fileID: 2868629223358676395} - component: {fileID: 6959931328227918623} - component: {fileID: 4540815661693075899} - - component: {fileID: 4008709970769624704} - component: {fileID: 7436534270673427838} - component: {fileID: -6589342969031261525} - component: {fileID: 5724758014884646323} @@ -62,6 +61,7 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 7767746557817481743} + serializedVersion: 2 m_LocalRotation: {x: -0.7069834, y: 0, z: 0, w: 0.7072302} m_LocalPosition: {x: -0, y: 0, z: 0} m_LocalScale: {x: 3, y: 3, z: 3} @@ -69,7 +69,6 @@ Transform: m_Children: - {fileID: 7682789761269032435} m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: -89.98, y: 0, z: 0} --- !u!33 &2868629223358676395 MeshFilter: @@ -96,6 +95,11 @@ MeshRenderer: m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -118,9 +122,11 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 + m_MaskInteraction: 0 m_AdditionalVertexStreams: {fileID: 0} --- !u!135 &4540815661693075899 SphereCollider: @@ -130,29 +136,19 @@ SphereCollider: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 7767746557817481743} m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 m_IsTrigger: 0 + m_ProvidesContacts: 0 m_Enabled: 1 - serializedVersion: 2 + serializedVersion: 3 m_Radius: 0.60371214 m_Center: {x: 0, y: 0, z: 0} ---- !u!114 &4008709970769624704 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7767746557817481743} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 737f47c158214f0995ba2835f040ed96, type: 3} - m_Name: - m_EditorClassIdentifier: - RotationSpeed: 1 - GridOffset: 0 - GridAttraction: 10 - Gravity: 1 - Drag: 0.05 - LaunchDrag: 0.2 --- !u!114 &7436534270673427838 MonoBehaviour: m_ObjectHideFlags: 0 @@ -165,6 +161,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 0c18f67d85af44c2b5afc8ecd15ce960, type: 3} m_Name: m_EditorClassIdentifier: + RotationSpeed: 1 LabelFadeDuration: 0.5 LabelPersistDuration: 3 LabelDisplayAngle: 15 @@ -178,10 +175,21 @@ Rigidbody: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 7767746557817481743} - serializedVersion: 2 + serializedVersion: 5 m_Mass: 1 - m_Drag: 0 - m_AngularDrag: 0.05 + m_LinearDamping: 0 + m_AngularDamping: 0.05 + m_CenterOfMass: {x: 0, y: 0, z: 0} + m_InertiaTensor: {x: 1, y: 1, z: 1} + m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ImplicitCom: 1 + m_ImplicitTensor: 1 m_UseGravity: 0 m_IsKinematic: 1 m_Interpolate: 0 @@ -204,6 +212,7 @@ PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: + serializedVersion: 3 m_TransformParent: {fileID: 7682789761269032435} m_Modifications: - target: {fileID: 2945231343692618236, guid: e7877477dc889804ea9d04f7ffd08e9b, @@ -327,6 +336,9 @@ PrefabInstance: value: 0 objectReference: {fileID: 0} m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: e7877477dc889804ea9d04f7ffd08e9b, type: 3} --- !u!224 &3300919539099916088 stripped RectTransform: diff --git a/Assets/Prefabs/RPG/Planets/Gas Giant.prefab b/Assets/Prefabs/RPG/Planets/Gas Giant.prefab index 46ae7a3b1..de87b2a13 100644 --- a/Assets/Prefabs/RPG/Planets/Gas Giant.prefab +++ b/Assets/Prefabs/RPG/Planets/Gas Giant.prefab @@ -30,8 +30,6 @@ Transform: m_ConstrainProportionsScale: 0 m_Children: - {fileID: 3973935122748960680} - - {fileID: 3973935121058605868} - - {fileID: 3973935122114073483} - {fileID: 3973935121358855036} m_Father: {fileID: 0} m_RootOrder: 0 @@ -49,94 +47,9 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Body: {fileID: 3973935122748960683} - GravityWell: {fileID: 3973935121058605871} Icon: {fileID: 3973935121358855037} Generator: {fileID: 0} SunMaterial: {fileID: 3973935122748960685} - GravityWaves: {fileID: 3973935122114073485} ---- !u!1 &3973935121058605867 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 3973935121058605868} - - component: {fileID: 3973935121058605856} - - component: {fileID: 3973935121058605871} - m_Layer: 9 - m_Name: Gravity Well - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &3973935121058605868 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3973935121058605867} - m_LocalRotation: {x: 0.7071068, y: -0, z: -0, w: 0.7071068} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 3973935120991099173} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} ---- !u!33 &3973935121058605856 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3973935121058605867} - m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &3973935121058605871 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3973935121058605867} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: 44a8bbb89acb4e34c9f41a9da5842bb4, type: 2} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_AdditionalVertexStreams: {fileID: 0} --- !u!1 &3973935121358855035 GameObject: m_ObjectHideFlags: 0 @@ -220,89 +133,6 @@ MeshRenderer: m_SortingLayer: 0 m_SortingOrder: 0 m_AdditionalVertexStreams: {fileID: 0} ---- !u!1 &3973935122114073482 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 3973935122114073483} - - component: {fileID: 3973935122114073486} - - component: {fileID: 3973935122114073485} - m_Layer: 10 - m_Name: Gravity Waves - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &3973935122114073483 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3973935122114073482} - m_LocalRotation: {x: 0.7071068, y: -0, z: -0, w: 0.7071068} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 3973935120991099173} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} ---- !u!33 &3973935122114073486 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3973935122114073482} - m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &3973935122114073485 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3973935122114073482} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: 11fbaa87dcc7a3743a6bd3aa5c86e5ae, type: 2} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_AdditionalVertexStreams: {fileID: 0} --- !u!1 &3973935122748960663 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/Prefabs/RPG/Planets/Planet.prefab b/Assets/Prefabs/RPG/Planets/Planet.prefab index 336b3430b..afffe73c4 100644 --- a/Assets/Prefabs/RPG/Planets/Planet.prefab +++ b/Assets/Prefabs/RPG/Planets/Planet.prefab @@ -83,89 +83,6 @@ MeshRenderer: m_SortingLayer: 0 m_SortingOrder: 0 m_AdditionalVertexStreams: {fileID: 0} ---- !u!1 &8859079004671924238 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 8859079004671924239} - - component: {fileID: 8859079004671924339} - - component: {fileID: 8859079004671924338} - m_Layer: 9 - m_Name: Gravity Well - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &8859079004671924239 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8859079004671924238} - m_LocalRotation: {x: 0.7071068, y: 0, z: 0, w: 0.7071068} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 8859079004937162792} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} ---- !u!33 &8859079004671924339 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8859079004671924238} - m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &8859079004671924338 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8859079004671924238} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: 44a8bbb89acb4e34c9f41a9da5842bb4, type: 2} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_AdditionalVertexStreams: {fileID: 0} --- !u!1 &8859079004937162791 GameObject: m_ObjectHideFlags: 0 @@ -197,7 +114,6 @@ Transform: m_ConstrainProportionsScale: 0 m_Children: - {fileID: 8859079005270853336} - - {fileID: 8859079004671924239} - {fileID: 8859079003226229097} m_Father: {fileID: 0} m_RootOrder: 0 @@ -215,7 +131,6 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Body: {fileID: 8859079005270853338} - GravityWell: {fileID: 8859079004671924338} Icon: {fileID: 8859079003226229098} Generator: {fileID: -7153121627769399805} --- !u!114 &-7153121627769399805 diff --git a/Assets/Prefabs/RPG/Planets/Sun.prefab b/Assets/Prefabs/RPG/Planets/Sun.prefab index a7950f448..ebe0fa72f 100644 --- a/Assets/Prefabs/RPG/Planets/Sun.prefab +++ b/Assets/Prefabs/RPG/Planets/Sun.prefab @@ -30,8 +30,6 @@ Transform: m_ConstrainProportionsScale: 0 m_Children: - {fileID: 7852221720971737233} - - {fileID: 7852221720969441490} - - {fileID: 7852221720741322892} - {fileID: 7852221720816817928} - {fileID: 7852221720964551245} m_Father: {fileID: 0} @@ -50,96 +48,11 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Body: {fileID: 7852221720971737229} - GravityWell: {fileID: 7852221720969441484} Icon: {fileID: 7852221720964551246} Generator: {fileID: 0} SunMaterial: {fileID: 7852221720971737234} - GravityWaves: {fileID: 7852221720741322894} FogTint: {fileID: 7852221720816817929} Light: {fileID: 8064377225639657765} ---- !u!1 &7852221720741322899 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 7852221720741322892} - - component: {fileID: 7852221720741322895} - - component: {fileID: 7852221720741322894} - m_Layer: 10 - m_Name: Gravity Waves - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &7852221720741322892 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7852221720741322899} - m_LocalRotation: {x: 0.7071068, y: -0, z: -0, w: 0.7071068} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 7852221720480299767} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} ---- !u!33 &7852221720741322895 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7852221720741322899} - m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &7852221720741322894 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7852221720741322899} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: 11fbaa87dcc7a3743a6bd3aa5c86e5ae, type: 2} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_AdditionalVertexStreams: {fileID: 0} --- !u!1 &7852221720816817935 GameObject: m_ObjectHideFlags: 0 @@ -306,89 +219,6 @@ MeshRenderer: m_SortingLayer: 0 m_SortingOrder: 0 m_AdditionalVertexStreams: {fileID: 0} ---- !u!1 &7852221720969441489 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 7852221720969441490} - - component: {fileID: 7852221720969441485} - - component: {fileID: 7852221720969441484} - m_Layer: 9 - m_Name: Gravity Well - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &7852221720969441490 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7852221720969441489} - m_LocalRotation: {x: 0.7071068, y: -0, z: -0, w: 0.7071068} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 7852221720480299767} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} ---- !u!33 &7852221720969441485 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7852221720969441489} - m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &7852221720969441484 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7852221720969441489} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: 44a8bbb89acb4e34c9f41a9da5842bb4, type: 2} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_AdditionalVertexStreams: {fileID: 0} --- !u!1 &7852221720971737232 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/Prefabs/RPG/Wormhole 1.prefab b/Assets/Prefabs/RPG/Wormhole 1.prefab index b03d01009..e1ca93be7 100644 --- a/Assets/Prefabs/RPG/Wormhole 1.prefab +++ b/Assets/Prefabs/RPG/Wormhole 1.prefab @@ -1,167 +1,5 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: ---- !u!1 &1826894967093516808 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1030590306481442051} - - component: {fileID: 3216580199816124320} - - component: {fileID: 3211969211988968959} - m_Layer: 9 - m_Name: Gravity Well - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1030590306481442051 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1826894967093516808} - m_LocalRotation: {x: 0.7071068, y: -0, z: -0, w: 0.7071068} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1024, y: 1024, z: 1024} - m_Children: [] - m_Father: {fileID: 463084220523011477} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} ---- !u!33 &3216580199816124320 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1826894967093516808} - m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &3211969211988968959 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1826894967093516808} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: 244f3e4c0c030a24b8d7aa944895bdcf, type: 2} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_AdditionalVertexStreams: {fileID: 0} ---- !u!1 &3908760799087214860 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 581261949390603689} - - component: {fileID: 987447324816385543} - - component: {fileID: 3959510878930752720} - m_Layer: 9 - m_Name: Gravity Waves - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &581261949390603689 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3908760799087214860} - m_LocalRotation: {x: 0.7071068, y: -0, z: -0, w: 0.7071068} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 512, y: 512, z: 512} - m_Children: [] - m_Father: {fileID: 463084220523011477} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} ---- !u!33 &987447324816385543 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3908760799087214860} - m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &3959510878930752720 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3908760799087214860} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: ef2f6090d5cc14a4e9ce38def3bed9ac, type: 2} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_AdditionalVertexStreams: {fileID: 0} --- !u!1 &4837153162502999620 GameObject: m_ObjectHideFlags: 0 @@ -189,9 +27,6 @@ Transform: m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: - - {fileID: 8222188360457572195} - - {fileID: 1030590306481442051} - - {fileID: 581261949390603689} - {fileID: 8249320701965103923} m_Father: {fileID: 0} m_RootOrder: 0 @@ -277,84 +112,3 @@ MeshRenderer: m_SortingLayer: 0 m_SortingOrder: 0 m_AdditionalVertexStreams: {fileID: 0} ---- !u!1 &7647029665738834910 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 8222188360457572195} - - component: {fileID: 2468954688819198096} - - component: {fileID: 8290522694236574882} - m_Layer: 9 - m_Name: Gravity Pit - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &8222188360457572195 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7647029665738834910} - m_LocalRotation: {x: 0.7071068, y: -0, z: -0, w: 0.7071068} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 512, y: 512, z: 512} - m_Children: [] - m_Father: {fileID: 463084220523011477} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} ---- !u!33 &2468954688819198096 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7647029665738834910} - m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &8290522694236574882 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7647029665738834910} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: a9ef17c902709ce41a837c54b809184b, type: 2} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_AdditionalVertexStreams: {fileID: 0} diff --git a/Assets/Prefabs/RTS/Asteroid Belt.prefab b/Assets/Prefabs/RTS/Asteroid Belt.prefab deleted file mode 100644 index 38df4e9e3..000000000 --- a/Assets/Prefabs/RTS/Asteroid Belt.prefab +++ /dev/null @@ -1,111 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &992254348637625916 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1779911639310264026} - - component: {fileID: 349597964696402918} - - component: {fileID: 2844878085845264008} - - component: {fileID: 917803079556930035} - - component: {fileID: 4397878771830533054} - m_Layer: 14 - m_Name: Asteroid Belt - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1779911639310264026 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 992254348637625916} - 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_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!33 &349597964696402918 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 992254348637625916} - m_Mesh: {fileID: 0} ---- !u!23 &2844878085845264008 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 992254348637625916} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: c018d99199afeca448c64b9022ac7270, type: 2} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 0 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_AdditionalVertexStreams: {fileID: 0} ---- !u!64 &917803079556930035 -MeshCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 992254348637625916} - m_Material: {fileID: 0} - m_IsTrigger: 0 - m_Enabled: 1 - serializedVersion: 4 - m_Convex: 0 - m_CookingOptions: 30 - m_Mesh: {fileID: 0} ---- !u!114 &4397878771830533054 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 992254348637625916} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 52538a3309c36fc4583c964a1c0b705f, type: 3} - m_Name: - m_EditorClassIdentifier: diff --git a/Assets/Prefabs/RTS/Entity.prefab b/Assets/Prefabs/RTS/Entity.prefab index c981cb3fb..61a1a8eb7 100644 --- a/Assets/Prefabs/RTS/Entity.prefab +++ b/Assets/Prefabs/RTS/Entity.prefab @@ -10,7 +10,6 @@ GameObject: m_Component: - component: {fileID: 4644834953993757301} - component: {fileID: 1859458984701215649} - - component: {fileID: 3439515216706641237} - component: {fileID: 3170441533209407059} - component: {fileID: 3150651635148382191} m_Layer: 0 @@ -30,9 +29,9 @@ RectTransform: 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: 7667578565413050542} - m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -50,13 +49,21 @@ MeshRenderer: m_CastShadows: 0 m_ReceiveShadows: 0 m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: - - {fileID: 21677577810600300, guid: ef74c4c30ca5ced4489f28b914006aad, type: 2} + - {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} m_StaticBatchInfo: firstSubMesh: 0 subMeshCount: 0 @@ -64,6 +71,7 @@ MeshRenderer: m_ProbeAnchor: {fileID: 0} m_LightProbeVolumeOverride: {fileID: 0} m_ScaleInLightmap: 1 + m_ReceiveGI: 1 m_PreserveUVs: 0 m_IgnoreNormalsForChartDetection: 0 m_ImportantGI: 0 @@ -73,17 +81,12 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 ---- !u!33 &3439515216706641237 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 235155884317602032} - m_Mesh: {fileID: 0} + m_MaskInteraction: 0 + m_AdditionalVertexStreams: {fileID: 0} --- !u!222 &3170441533209407059 CanvasRenderer: m_ObjectHideFlags: 0 @@ -107,16 +110,18 @@ MonoBehaviour: 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: 'Something just happened, now I''m telling you about it. - Something just happened, now I''m telling you about it.' + Something + just happened, now I''m telling you about it.' m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: ef74c4c30ca5ced4489f28b914006aad, type: 2} - m_sharedMaterial: {fileID: 21677577810600300, guid: ef74c4c30ca5ced4489f28b914006aad, - type: 2} + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} m_fontSharedMaterials: [] m_fontMaterial: {fileID: 0} m_fontMaterials: [] @@ -134,13 +139,12 @@ MonoBehaviour: m_fontColorGradientPreset: {fileID: 0} m_spriteAsset: {fileID: 0} m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: 0 m_overrideHtmlColors: 0 m_faceColor: serializedVersion: 2 rgba: 4294967295 - m_outlineColor: - serializedVersion: 2 - rgba: 4278190080 m_fontSize: 2.5 m_fontSizeBase: 2.5 m_fontWeight: 400 @@ -148,62 +152,46 @@ MonoBehaviour: m_fontSizeMin: 18 m_fontSizeMax: 72 m_fontStyle: 0 - m_textAlignment: 1026 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 1024 + m_textAlignment: 65535 m_characterSpacing: 1.38 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 7.09 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 0 + m_TextWrappingMode: 0 m_wordWrappingRatios: 0.4 m_overflowMode: 0 - m_firstOverflowCharacterIndex: 0 m_linkedTextComponent: {fileID: 0} - m_isLinkedTextComponent: 0 - m_isTextTruncated: 0 + parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 0 m_isCullingEnabled: 0 - m_ignoreRectMaskCulling: 0 - m_ignoreCulling: 1 m_horizontalMapping: 0 m_verticalMapping: 0 m_uvLineOffset: 0 m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 m_VertexBufferAutoSizeReduction: 1 - m_firstVisibleCharacter: 0 m_useMaxVisibleDescender: 1 m_pageToDisplay: 1 m_margin: {x: 0, y: 0, z: 0, w: 0} - m_textInfo: - textComponent: {fileID: 3150651635148382191} - characterCount: 109 - spriteCount: 0 - spaceCount: 17 - wordCount: 18 - linkCount: 0 - lineCount: 2 - pageCount: 1 - materialCount: 1 m_isUsingLegacyAnimationComponent: 0 m_isVolumetricText: 0 - m_spriteAnimator: {fileID: 0} + _SortingLayer: 0 + _SortingLayerID: 0 + _SortingOrder: 0 m_hasFontAssetChanged: 0 m_renderer: {fileID: 1859458984701215649} - m_subTextObjects: - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} m_maskType: 0 --- !u!1 &7667578565016065614 GameObject: @@ -232,12 +220,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 7667578565016065614} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0.05} m_LocalScale: {x: 0.75, y: 0.75, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 7667578565413050542} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!33 &7667578565016065611 MeshFilter: @@ -258,9 +247,17 @@ MeshRenderer: m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -272,6 +269,7 @@ MeshRenderer: m_ProbeAnchor: {fileID: 0} m_LightProbeVolumeOverride: {fileID: 0} m_ScaleInLightmap: 1 + m_ReceiveGI: 1 m_PreserveUVs: 0 m_IgnoreNormalsForChartDetection: 0 m_ImportantGI: 0 @@ -281,9 +279,12 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 + m_MaskInteraction: 0 + m_AdditionalVertexStreams: {fileID: 0} --- !u!64 &7667578565016065609 MeshCollider: m_ObjectHideFlags: 0 @@ -292,11 +293,19 @@ MeshCollider: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 7667578565016065614} m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 m_IsTrigger: 0 + m_ProvidesContacts: 0 m_Enabled: 1 - serializedVersion: 3 + serializedVersion: 5 m_Convex: 0 - m_CookingOptions: 14 + m_CookingOptions: 30 m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} --- !u!114 &7667578565016065610 MonoBehaviour: @@ -334,15 +343,16 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 7667578565413050543} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 5.38, y: 0.81, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: - {fileID: 7667578565016065613} - {fileID: 7667578566386612334} - {fileID: 4644834953993757301} m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &5800314421439145179 MonoBehaviour: @@ -370,7 +380,6 @@ GameObject: m_Component: - component: {fileID: 7667578566386612334} - component: {fileID: 7667578566386612330} - - component: {fileID: 7667578566386612331} - component: {fileID: 7667578566386612332} - component: {fileID: 7667578566386612333} m_Layer: 0 @@ -390,9 +399,9 @@ RectTransform: 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: 7667578565413050542} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -410,13 +419,21 @@ MeshRenderer: m_CastShadows: 0 m_ReceiveShadows: 0 m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: - - {fileID: 21677577810600300, guid: ef74c4c30ca5ced4489f28b914006aad, type: 2} + - {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} m_StaticBatchInfo: firstSubMesh: 0 subMeshCount: 0 @@ -424,6 +441,7 @@ MeshRenderer: m_ProbeAnchor: {fileID: 0} m_LightProbeVolumeOverride: {fileID: 0} m_ScaleInLightmap: 1 + m_ReceiveGI: 1 m_PreserveUVs: 0 m_IgnoreNormalsForChartDetection: 0 m_ImportantGI: 0 @@ -433,17 +451,12 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 ---- !u!33 &7667578566386612331 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7667578566386612335} - m_Mesh: {fileID: 0} + m_MaskInteraction: 0 + m_AdditionalVertexStreams: {fileID: 0} --- !u!222 &7667578566386612332 CanvasRenderer: m_ObjectHideFlags: 0 @@ -467,6 +480,8 @@ MonoBehaviour: 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: [] @@ -474,9 +489,8 @@ MonoBehaviour: ' m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: ef74c4c30ca5ced4489f28b914006aad, type: 2} - m_sharedMaterial: {fileID: 21677577810600300, guid: ef74c4c30ca5ced4489f28b914006aad, - type: 2} + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} m_fontSharedMaterials: [] m_fontMaterial: {fileID: 0} m_fontMaterials: [] @@ -494,13 +508,12 @@ MonoBehaviour: m_fontColorGradientPreset: {fileID: 0} m_spriteAsset: {fileID: 0} m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: 0 m_overrideHtmlColors: 0 m_faceColor: serializedVersion: 2 rgba: 4294967295 - m_outlineColor: - serializedVersion: 2 - rgba: 4278190080 m_fontSize: 2 m_fontSizeBase: 2 m_fontWeight: 400 @@ -508,60 +521,44 @@ MonoBehaviour: m_fontSizeMin: 18 m_fontSizeMax: 72 m_fontStyle: 0 - m_textAlignment: 258 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 256 + m_textAlignment: 65535 m_characterSpacing: 1.38 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 0 + m_TextWrappingMode: 0 m_wordWrappingRatios: 0.4 m_overflowMode: 0 - m_firstOverflowCharacterIndex: -1 m_linkedTextComponent: {fileID: 0} - m_isLinkedTextComponent: 0 - m_isTextTruncated: 0 + parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 0 m_isCullingEnabled: 0 - m_ignoreRectMaskCulling: 0 - m_ignoreCulling: 1 m_horizontalMapping: 0 m_verticalMapping: 0 m_uvLineOffset: 0 m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 m_VertexBufferAutoSizeReduction: 1 - m_firstVisibleCharacter: 0 m_useMaxVisibleDescender: 1 m_pageToDisplay: 1 m_margin: {x: 0, y: 0, z: 0, w: 0} - m_textInfo: - textComponent: {fileID: 7667578566386612333} - characterCount: 13 - spriteCount: 0 - spaceCount: 2 - wordCount: 2 - linkCount: 0 - lineCount: 1 - pageCount: 1 - materialCount: 1 m_isUsingLegacyAnimationComponent: 0 m_isVolumetricText: 0 - m_spriteAnimator: {fileID: 0} + _SortingLayer: 0 + _SortingLayerID: 0 + _SortingOrder: 0 m_hasFontAssetChanged: 0 m_renderer: {fileID: 7667578566386612330} - m_subTextObjects: - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} m_maskType: 0 diff --git a/Assets/Prefabs/RTS/Planet.prefab b/Assets/Prefabs/RTS/Planet.prefab index 09c80e995..b288f30c5 100644 --- a/Assets/Prefabs/RTS/Planet.prefab +++ b/Assets/Prefabs/RTS/Planet.prefab @@ -10,7 +10,6 @@ GameObject: m_Component: - component: {fileID: 1093865191529778971} - component: {fileID: 956320758189013213} - - component: {fileID: 6189203536709783203} - component: {fileID: 688008198251117811} - component: {fileID: 6196070888394201391} m_Layer: 0 @@ -30,9 +29,9 @@ RectTransform: 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: 5321404118521994135} - m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -50,13 +49,21 @@ MeshRenderer: m_CastShadows: 0 m_ReceiveShadows: 0 m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: - - {fileID: 21677577810600300, guid: ef74c4c30ca5ced4489f28b914006aad, type: 2} + - {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} m_StaticBatchInfo: firstSubMesh: 0 subMeshCount: 0 @@ -64,6 +71,7 @@ MeshRenderer: m_ProbeAnchor: {fileID: 0} m_LightProbeVolumeOverride: {fileID: 0} m_ScaleInLightmap: 1 + m_ReceiveGI: 1 m_PreserveUVs: 0 m_IgnoreNormalsForChartDetection: 0 m_ImportantGI: 0 @@ -73,17 +81,12 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 ---- !u!33 &6189203536709783203 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4176311944753611310} - m_Mesh: {fileID: 0} + m_MaskInteraction: 0 + m_AdditionalVertexStreams: {fileID: 0} --- !u!222 &688008198251117811 CanvasRenderer: m_ObjectHideFlags: 0 @@ -107,16 +110,18 @@ MonoBehaviour: 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: 'Something just happened, now I''m telling you about it. - Something just happened, now I''m telling you about it.' + Something + just happened, now I''m telling you about it.' m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: ef74c4c30ca5ced4489f28b914006aad, type: 2} - m_sharedMaterial: {fileID: 21677577810600300, guid: ef74c4c30ca5ced4489f28b914006aad, - type: 2} + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} m_fontSharedMaterials: [] m_fontMaterial: {fileID: 0} m_fontMaterials: [] @@ -134,13 +139,12 @@ MonoBehaviour: m_fontColorGradientPreset: {fileID: 0} m_spriteAsset: {fileID: 0} m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: 0 m_overrideHtmlColors: 0 m_faceColor: serializedVersion: 2 rgba: 4294967295 - m_outlineColor: - serializedVersion: 2 - rgba: 4278190080 m_fontSize: 2.5 m_fontSizeBase: 2.5 m_fontWeight: 400 @@ -148,62 +152,46 @@ MonoBehaviour: m_fontSizeMin: 18 m_fontSizeMax: 72 m_fontStyle: 0 - m_textAlignment: 1026 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 1024 + m_textAlignment: 65535 m_characterSpacing: 1.38 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 7.09 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 0 + m_TextWrappingMode: 0 m_wordWrappingRatios: 0.4 m_overflowMode: 0 - m_firstOverflowCharacterIndex: 0 m_linkedTextComponent: {fileID: 0} - m_isLinkedTextComponent: 0 - m_isTextTruncated: 0 + parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 0 m_isCullingEnabled: 0 - m_ignoreRectMaskCulling: 0 - m_ignoreCulling: 1 m_horizontalMapping: 0 m_verticalMapping: 0 m_uvLineOffset: 0 m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 m_VertexBufferAutoSizeReduction: 1 - m_firstVisibleCharacter: 0 m_useMaxVisibleDescender: 1 m_pageToDisplay: 1 m_margin: {x: 0, y: 0, z: 0, w: 0} - m_textInfo: - textComponent: {fileID: 6196070888394201391} - characterCount: 109 - spriteCount: 0 - spaceCount: 17 - wordCount: 18 - linkCount: 0 - lineCount: 2 - pageCount: 1 - materialCount: 1 m_isUsingLegacyAnimationComponent: 0 m_isVolumetricText: 0 - m_spriteAnimator: {fileID: 0} + _SortingLayer: 0 + _SortingLayerID: 0 + _SortingOrder: 0 m_hasFontAssetChanged: 0 m_renderer: {fileID: 956320758189013213} - m_subTextObjects: - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} m_maskType: 0 --- !u!1 &5321404118521994134 GameObject: @@ -229,16 +217,16 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 5321404118521994134} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 5.38, y: 0.81, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 5321404120083801960} - {fileID: 5321404118931821940} - {fileID: 5321404119494867799} - {fileID: 1093865191529778971} m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &5321404118521994133 MonoBehaviour: @@ -256,7 +244,7 @@ MonoBehaviour: Label: {fileID: 5321404119494867796} Message: {fileID: 6196070888394201391} Children: [] - GravityMesh: {fileID: 5321404120083801962} + GravityMesh: {fileID: 0} --- !u!1 &5321404118931821943 GameObject: m_ObjectHideFlags: 0 @@ -284,12 +272,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 5321404118931821943} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0.05} m_LocalScale: {x: 0.75, y: 0.75, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 5321404118521994135} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!33 &5321404118931821938 MeshFilter: @@ -310,9 +299,17 @@ MeshRenderer: m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -324,6 +321,7 @@ MeshRenderer: m_ProbeAnchor: {fileID: 0} m_LightProbeVolumeOverride: {fileID: 0} m_ScaleInLightmap: 1 + m_ReceiveGI: 1 m_PreserveUVs: 0 m_IgnoreNormalsForChartDetection: 0 m_ImportantGI: 0 @@ -333,9 +331,12 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 + m_MaskInteraction: 0 + m_AdditionalVertexStreams: {fileID: 0} --- !u!64 &5321404118931821936 MeshCollider: m_ObjectHideFlags: 0 @@ -344,11 +345,19 @@ MeshCollider: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 5321404118931821943} m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 m_IsTrigger: 0 + m_ProvidesContacts: 0 m_Enabled: 1 - serializedVersion: 3 + serializedVersion: 5 m_Convex: 0 - m_CookingOptions: 14 + m_CookingOptions: 30 m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} --- !u!114 &5321404118931821939 MonoBehaviour: @@ -372,7 +381,6 @@ GameObject: m_Component: - component: {fileID: 5321404119494867799} - component: {fileID: 5321404119494867795} - - component: {fileID: 5321404119494867794} - component: {fileID: 5321404119494867797} - component: {fileID: 5321404119494867796} m_Layer: 0 @@ -392,9 +400,9 @@ RectTransform: 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: 5321404118521994135} - m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -412,13 +420,21 @@ MeshRenderer: m_CastShadows: 0 m_ReceiveShadows: 0 m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: - - {fileID: 21677577810600300, guid: ef74c4c30ca5ced4489f28b914006aad, type: 2} + - {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} m_StaticBatchInfo: firstSubMesh: 0 subMeshCount: 0 @@ -426,6 +442,7 @@ MeshRenderer: m_ProbeAnchor: {fileID: 0} m_LightProbeVolumeOverride: {fileID: 0} m_ScaleInLightmap: 1 + m_ReceiveGI: 1 m_PreserveUVs: 0 m_IgnoreNormalsForChartDetection: 0 m_ImportantGI: 0 @@ -435,17 +452,12 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 ---- !u!33 &5321404119494867794 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5321404119494867798} - m_Mesh: {fileID: 0} + m_MaskInteraction: 0 + m_AdditionalVertexStreams: {fileID: 0} --- !u!222 &5321404119494867797 CanvasRenderer: m_ObjectHideFlags: 0 @@ -469,6 +481,8 @@ MonoBehaviour: 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: [] @@ -476,9 +490,8 @@ MonoBehaviour: ' m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: ef74c4c30ca5ced4489f28b914006aad, type: 2} - m_sharedMaterial: {fileID: 21677577810600300, guid: ef74c4c30ca5ced4489f28b914006aad, - type: 2} + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} m_fontSharedMaterials: [] m_fontMaterial: {fileID: 0} m_fontMaterials: [] @@ -496,13 +509,12 @@ MonoBehaviour: m_fontColorGradientPreset: {fileID: 0} m_spriteAsset: {fileID: 0} m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: 0 m_overrideHtmlColors: 0 m_faceColor: serializedVersion: 2 rgba: 4294967295 - m_outlineColor: - serializedVersion: 2 - rgba: 4278190080 m_fontSize: 2 m_fontSizeBase: 2 m_fontWeight: 400 @@ -510,137 +522,44 @@ MonoBehaviour: m_fontSizeMin: 18 m_fontSizeMax: 72 m_fontStyle: 0 - m_textAlignment: 258 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 256 + m_textAlignment: 65535 m_characterSpacing: 1.38 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 0 + m_TextWrappingMode: 0 m_wordWrappingRatios: 0.4 m_overflowMode: 0 - m_firstOverflowCharacterIndex: -1 m_linkedTextComponent: {fileID: 0} - m_isLinkedTextComponent: 0 - m_isTextTruncated: 0 + parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 0 m_isCullingEnabled: 0 - m_ignoreRectMaskCulling: 0 - m_ignoreCulling: 1 m_horizontalMapping: 0 m_verticalMapping: 0 m_uvLineOffset: 0 m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 m_VertexBufferAutoSizeReduction: 1 - m_firstVisibleCharacter: 0 m_useMaxVisibleDescender: 1 m_pageToDisplay: 1 m_margin: {x: 0, y: 0, z: 0, w: 0} - m_textInfo: - textComponent: {fileID: 5321404119494867796} - characterCount: 13 - spriteCount: 0 - spaceCount: 2 - wordCount: 2 - linkCount: 0 - lineCount: 1 - pageCount: 1 - materialCount: 1 m_isUsingLegacyAnimationComponent: 0 m_isVolumetricText: 0 - m_spriteAnimator: {fileID: 0} + _SortingLayer: 0 + _SortingLayerID: 0 + _SortingOrder: 0 m_hasFontAssetChanged: 0 m_renderer: {fileID: 5321404119494867795} - m_subTextObjects: - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} m_maskType: 0 ---- !u!1 &5321404120083801964 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 5321404120083801960} - - component: {fileID: 5321404120083801963} - - component: {fileID: 5321404120083801962} - m_Layer: 8 - m_Name: Gravity Well - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &5321404120083801960 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5321404120083801964} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 10, y: 10, z: 1} - m_Children: [] - m_Father: {fileID: 5321404118521994135} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!33 &5321404120083801963 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5321404120083801964} - m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &5321404120083801962 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5321404120083801964} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: 44a8bbb89acb4e34c9f41a9da5842bb4, type: 2} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 0 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 diff --git a/Assets/Prefabs/RTS/Ship.prefab b/Assets/Prefabs/RTS/Ship.prefab index 34867f7bf..9bfde2c33 100644 --- a/Assets/Prefabs/RTS/Ship.prefab +++ b/Assets/Prefabs/RTS/Ship.prefab @@ -23,13 +23,14 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 717230718983664133} + serializedVersion: 2 m_LocalRotation: {x: -0, y: -0, z: -0.7071068, w: 0.7071068} m_LocalPosition: {x: 0, y: -0.396, z: 0.025000002} m_LocalScale: {x: 1, y: 1.5, z: 1} + m_ConstrainProportionsScale: 0 m_Children: - {fileID: 6370514743660505460} m_Father: {fileID: 752969731239391542} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &752969730562965460 GameObject: @@ -55,15 +56,16 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 752969730562965460} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 5.38, y: 0.81, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: - {fileID: 752969731239391542} - {fileID: 752969731603226389} - {fileID: 2376444423840420930} m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &795352744099449573 MonoBehaviour: @@ -109,13 +111,14 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 752969731239391541} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0.05} m_LocalScale: {x: 0.75, y: 0.75, z: 1} + m_ConstrainProportionsScale: 0 m_Children: - {fileID: 6634195572313526987} m_Father: {fileID: 752969730562965461} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!33 &752969731239391536 MeshFilter: @@ -136,9 +139,17 @@ MeshRenderer: m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -150,6 +161,7 @@ MeshRenderer: m_ProbeAnchor: {fileID: 0} m_LightProbeVolumeOverride: {fileID: 0} m_ScaleInLightmap: 1 + m_ReceiveGI: 1 m_PreserveUVs: 0 m_IgnoreNormalsForChartDetection: 0 m_ImportantGI: 0 @@ -159,9 +171,12 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 + m_MaskInteraction: 0 + m_AdditionalVertexStreams: {fileID: 0} --- !u!64 &752969731239391538 MeshCollider: m_ObjectHideFlags: 0 @@ -170,11 +185,19 @@ MeshCollider: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 752969731239391541} m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 m_IsTrigger: 0 + m_ProvidesContacts: 0 m_Enabled: 1 - serializedVersion: 3 + serializedVersion: 5 m_Convex: 0 - m_CookingOptions: 14 + m_CookingOptions: 30 m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} --- !u!114 &752969731239391537 MonoBehaviour: @@ -198,7 +221,6 @@ GameObject: m_Component: - component: {fileID: 752969731603226389} - component: {fileID: 752969731603226385} - - component: {fileID: 752969731603226384} - component: {fileID: 752969731603226391} - component: {fileID: 752969731603226390} m_Layer: 0 @@ -218,9 +240,9 @@ RectTransform: 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: 752969730562965461} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -238,13 +260,21 @@ MeshRenderer: m_CastShadows: 0 m_ReceiveShadows: 0 m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: - - {fileID: 21677577810600300, guid: ef74c4c30ca5ced4489f28b914006aad, type: 2} + - {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} m_StaticBatchInfo: firstSubMesh: 0 subMeshCount: 0 @@ -252,6 +282,7 @@ MeshRenderer: m_ProbeAnchor: {fileID: 0} m_LightProbeVolumeOverride: {fileID: 0} m_ScaleInLightmap: 1 + m_ReceiveGI: 1 m_PreserveUVs: 0 m_IgnoreNormalsForChartDetection: 0 m_ImportantGI: 0 @@ -261,17 +292,12 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 ---- !u!33 &752969731603226384 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 752969731603226388} - m_Mesh: {fileID: 0} + m_MaskInteraction: 0 + m_AdditionalVertexStreams: {fileID: 0} --- !u!222 &752969731603226391 CanvasRenderer: m_ObjectHideFlags: 0 @@ -295,6 +321,8 @@ MonoBehaviour: 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: [] @@ -302,9 +330,8 @@ MonoBehaviour: ' m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: ef74c4c30ca5ced4489f28b914006aad, type: 2} - m_sharedMaterial: {fileID: 21677577810600300, guid: ef74c4c30ca5ced4489f28b914006aad, - type: 2} + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} m_fontSharedMaterials: [] m_fontMaterial: {fileID: 0} m_fontMaterials: [] @@ -322,13 +349,12 @@ MonoBehaviour: m_fontColorGradientPreset: {fileID: 0} m_spriteAsset: {fileID: 0} m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: 0 m_overrideHtmlColors: 0 m_faceColor: serializedVersion: 2 rgba: 4294967295 - m_outlineColor: - serializedVersion: 2 - rgba: 4278190080 m_fontSize: 2 m_fontSizeBase: 2 m_fontWeight: 400 @@ -336,62 +362,46 @@ MonoBehaviour: m_fontSizeMin: 18 m_fontSizeMax: 72 m_fontStyle: 0 - m_textAlignment: 258 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 256 + m_textAlignment: 65535 m_characterSpacing: 1.38 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 0 + m_TextWrappingMode: 0 m_wordWrappingRatios: 0.4 m_overflowMode: 0 - m_firstOverflowCharacterIndex: -1 m_linkedTextComponent: {fileID: 0} - m_isLinkedTextComponent: 0 - m_isTextTruncated: 0 + parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 0 m_isCullingEnabled: 0 - m_ignoreRectMaskCulling: 0 - m_ignoreCulling: 1 m_horizontalMapping: 0 m_verticalMapping: 0 m_uvLineOffset: 0 m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 m_VertexBufferAutoSizeReduction: 1 - m_firstVisibleCharacter: 0 m_useMaxVisibleDescender: 1 m_pageToDisplay: 1 m_margin: {x: 0, y: 0, z: 0, w: 0} - m_textInfo: - textComponent: {fileID: 752969731603226390} - characterCount: 13 - spriteCount: 0 - spaceCount: 2 - wordCount: 2 - linkCount: 0 - lineCount: 1 - pageCount: 1 - materialCount: 1 m_isUsingLegacyAnimationComponent: 0 m_isVolumetricText: 0 - m_spriteAnimator: {fileID: 0} + _SortingLayer: 0 + _SortingLayerID: 0 + _SortingOrder: 0 m_hasFontAssetChanged: 0 m_renderer: {fileID: 752969731603226385} - m_subTextObjects: - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} m_maskType: 0 --- !u!1 &1383583254418650531 GameObject: @@ -418,12 +428,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1383583254418650531} + serializedVersion: 2 m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0.114, y: 0, z: 0} m_LocalScale: {x: 0.3, y: 0.3, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 6634195572313526987} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: -90} --- !u!33 &2644584120131549798 MeshFilter: @@ -444,9 +455,17 @@ MeshRenderer: m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -458,6 +477,7 @@ MeshRenderer: m_ProbeAnchor: {fileID: 0} m_LightProbeVolumeOverride: {fileID: 0} m_ScaleInLightmap: 1 + m_ReceiveGI: 1 m_PreserveUVs: 0 m_IgnoreNormalsForChartDetection: 0 m_ImportantGI: 0 @@ -467,9 +487,12 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 + m_MaskInteraction: 0 + m_AdditionalVertexStreams: {fileID: 0} --- !u!1 &8284500064616352456 GameObject: m_ObjectHideFlags: 0 @@ -480,7 +503,6 @@ GameObject: m_Component: - component: {fileID: 2376444423840420930} - component: {fileID: 9122382316357193139} - - component: {fileID: 2978801183465297864} - component: {fileID: 7740350830631187417} - component: {fileID: 2269191731601446379} m_Layer: 0 @@ -500,9 +522,9 @@ RectTransform: 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: 752969730562965461} - m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -520,13 +542,21 @@ MeshRenderer: m_CastShadows: 0 m_ReceiveShadows: 0 m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: - - {fileID: 21677577810600300, guid: ef74c4c30ca5ced4489f28b914006aad, type: 2} + - {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} m_StaticBatchInfo: firstSubMesh: 0 subMeshCount: 0 @@ -534,6 +564,7 @@ MeshRenderer: m_ProbeAnchor: {fileID: 0} m_LightProbeVolumeOverride: {fileID: 0} m_ScaleInLightmap: 1 + m_ReceiveGI: 1 m_PreserveUVs: 0 m_IgnoreNormalsForChartDetection: 0 m_ImportantGI: 0 @@ -543,17 +574,12 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 ---- !u!33 &2978801183465297864 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8284500064616352456} - m_Mesh: {fileID: 0} + m_MaskInteraction: 0 + m_AdditionalVertexStreams: {fileID: 0} --- !u!222 &7740350830631187417 CanvasRenderer: m_ObjectHideFlags: 0 @@ -577,16 +603,18 @@ MonoBehaviour: 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: 'Something just happened, now I''m telling you about it. - Something just happened, now I''m telling you about it.' + Something + just happened, now I''m telling you about it.' m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: ef74c4c30ca5ced4489f28b914006aad, type: 2} - m_sharedMaterial: {fileID: 21677577810600300, guid: ef74c4c30ca5ced4489f28b914006aad, - type: 2} + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} m_fontSharedMaterials: [] m_fontMaterial: {fileID: 0} m_fontMaterials: [] @@ -604,13 +632,12 @@ MonoBehaviour: m_fontColorGradientPreset: {fileID: 0} m_spriteAsset: {fileID: 0} m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: 0 m_overrideHtmlColors: 0 m_faceColor: serializedVersion: 2 rgba: 4294967295 - m_outlineColor: - serializedVersion: 2 - rgba: 4278190080 m_fontSize: 2.5 m_fontSizeBase: 2.5 m_fontWeight: 400 @@ -618,60 +645,44 @@ MonoBehaviour: m_fontSizeMin: 18 m_fontSizeMax: 72 m_fontStyle: 0 - m_textAlignment: 1026 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 1024 + m_textAlignment: 65535 m_characterSpacing: 1.38 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 7.09 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 0 + m_TextWrappingMode: 0 m_wordWrappingRatios: 0.4 m_overflowMode: 0 - m_firstOverflowCharacterIndex: 0 m_linkedTextComponent: {fileID: 0} - m_isLinkedTextComponent: 0 - m_isTextTruncated: 0 + parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 0 m_isCullingEnabled: 0 - m_ignoreRectMaskCulling: 0 - m_ignoreCulling: 1 m_horizontalMapping: 0 m_verticalMapping: 0 m_uvLineOffset: 0 m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 m_VertexBufferAutoSizeReduction: 1 - m_firstVisibleCharacter: 0 m_useMaxVisibleDescender: 1 m_pageToDisplay: 1 m_margin: {x: 0, y: 0, z: 0, w: 0} - m_textInfo: - textComponent: {fileID: 2269191731601446379} - characterCount: 109 - spriteCount: 0 - spaceCount: 17 - wordCount: 18 - linkCount: 0 - lineCount: 2 - pageCount: 1 - materialCount: 1 m_isUsingLegacyAnimationComponent: 0 m_isVolumetricText: 0 - m_spriteAnimator: {fileID: 0} + _SortingLayer: 0 + _SortingLayerID: 0 + _SortingOrder: 0 m_hasFontAssetChanged: 0 m_renderer: {fileID: 9122382316357193139} - m_subTextObjects: - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} m_maskType: 0 diff --git a/Assets/Prefabs/UI/Action Slot.prefab b/Assets/Prefabs/UI/Action Slot.prefab index 6ecf19406..acfc2f263 100644 --- a/Assets/Prefabs/UI/Action Slot.prefab +++ b/Assets/Prefabs/UI/Action Slot.prefab @@ -31,7 +31,6 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 8334150340270499360} - m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -105,20 +104,23 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 @@ -181,7 +183,6 @@ RectTransform: - {fileID: 8334150341178146430} - {fileID: 8334150340826609675} m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -350,7 +351,6 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 8334150340270499360} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -426,7 +426,6 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 8334150340270499360} - m_RootOrder: 7 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -502,7 +501,6 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 8334150340270499360} - m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -578,7 +576,6 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 8334150340270499360} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -654,7 +651,6 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 8334150340270499360} - m_RootOrder: 6 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 1, y: 1} m_AnchorMax: {x: 1, y: 1} @@ -728,20 +724,23 @@ MonoBehaviour: m_VerticalAlignment: 256 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 @@ -790,7 +789,6 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 8334150340270499360} - m_RootOrder: 5 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -864,20 +862,23 @@ MonoBehaviour: m_VerticalAlignment: 1024 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 @@ -926,7 +927,6 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 8334150340270499360} - m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} diff --git a/Assets/Prefabs/UI/Choice.prefab b/Assets/Prefabs/UI/Choice.prefab index 7aff99027..5624bd6ff 100644 --- a/Assets/Prefabs/UI/Choice.prefab +++ b/Assets/Prefabs/UI/Choice.prefab @@ -11,7 +11,7 @@ GameObject: - component: {fileID: 1388299342124750210} - component: {fileID: 7958013063086106696} m_Layer: 5 - m_Name: TMP SubMeshUI [UbuntuMono-R SDF + LiberationSans SDF Atlas] + m_Name: 'TMP SubMeshUI [UbuntuMono-R SDF + LiberationSans SDF Atlas]' m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -27,9 +27,9 @@ RectTransform: 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: 3385051013345111086} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -76,10 +76,10 @@ RectTransform: 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: 1388299342124750210} m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -152,20 +152,23 @@ MonoBehaviour: m_VerticalAlignment: 256 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 diff --git a/Assets/Prefabs/UI/Context Menu Option.prefab b/Assets/Prefabs/UI/Context Menu Option.prefab index 77cbd95e0..ccaca26d5 100644 --- a/Assets/Prefabs/UI/Context Menu Option.prefab +++ b/Assets/Prefabs/UI/Context Menu Option.prefab @@ -32,11 +32,11 @@ RectTransform: 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: 2147126713793274338} - {fileID: 1944744018361081348} m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -202,9 +202,9 @@ RectTransform: 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: 2147126713262799480} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -278,20 +278,23 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 @@ -357,9 +360,9 @@ RectTransform: 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: 2147126713262799480} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 1, y: 0.5} m_AnchorMax: {x: 1, y: 0.5} diff --git a/Assets/Prefabs/UI/Corporation Selection.prefab b/Assets/Prefabs/UI/Corporation Selection.prefab index 0e983e9be..b9dda795c 100644 --- a/Assets/Prefabs/UI/Corporation Selection.prefab +++ b/Assets/Prefabs/UI/Corporation Selection.prefab @@ -29,10 +29,10 @@ RectTransform: 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: 3643881634033459408} m_Father: {fileID: 3643881633437836137} - m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -62,6 +62,8 @@ MonoBehaviour: 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: [] @@ -89,13 +91,12 @@ MonoBehaviour: m_fontColorGradientPreset: {fileID: 0} m_spriteAsset: {fileID: 0} m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: 0 m_overrideHtmlColors: 0 m_faceColor: serializedVersion: 2 rgba: 4294967295 - m_outlineColor: - serializedVersion: 2 - rgba: 4278190080 m_fontSize: 12 m_fontSizeBase: 16 m_fontWeight: 400 @@ -103,61 +104,42 @@ MonoBehaviour: m_fontSizeMin: 12 m_fontSizeMax: 20 m_fontStyle: 0 - m_textAlignment: 514 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 - m_firstOverflowCharacterIndex: 0 m_linkedTextComponent: {fileID: 0} - m_isLinkedTextComponent: 0 - m_isTextTruncated: 0 + parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 - m_ignoreRectMaskCulling: 0 - m_ignoreCulling: 1 m_horizontalMapping: 0 m_verticalMapping: 0 m_uvLineOffset: 0 m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 m_VertexBufferAutoSizeReduction: 1 - m_firstVisibleCharacter: 0 m_useMaxVisibleDescender: 1 m_pageToDisplay: 1 m_margin: {x: 0, y: 0, z: 0, w: 0} - m_textInfo: - textComponent: {fileID: 3643881633221182914} - characterCount: 212 - spriteCount: 0 - spaceCount: 31 - wordCount: 32 - linkCount: 0 - lineCount: 181 - pageCount: 1 - materialCount: 2 m_isUsingLegacyAnimationComponent: 0 m_isVolumetricText: 0 - m_spriteAnimator: {fileID: 0} m_hasFontAssetChanged: 0 - m_subTextObjects: - - {fileID: 0} - - {fileID: 3643881634033459409} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} m_baseMaterial: {fileID: 0} m_maskOffset: {x: 0, y: 0, z: 0, w: 0} --- !u!114 &3643881633221182915 @@ -169,7 +151,7 @@ MonoBehaviour: m_GameObject: {fileID: 3643881633221182924} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 1679637790, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} m_Name: m_EditorClassIdentifier: m_IgnoreLayout: 0 @@ -212,6 +194,7 @@ RectTransform: 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: 3643881633927103020} - {fileID: 3643881634854544289} @@ -219,7 +202,6 @@ RectTransform: - {fileID: 3643881634695350169} - {fileID: 3643881634325817956} m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -235,7 +217,7 @@ MonoBehaviour: m_GameObject: {fileID: 3643881633437836136} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 1679637790, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} m_Name: m_EditorClassIdentifier: m_IgnoreLayout: 0 @@ -255,7 +237,7 @@ MonoBehaviour: m_GameObject: {fileID: 3643881633437836136} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 1297475563, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} m_Name: m_EditorClassIdentifier: m_Padding: @@ -269,6 +251,9 @@ MonoBehaviour: m_ChildForceExpandHeight: 0 m_ChildControlWidth: 1 m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 --- !u!222 &3643881633437836141 CanvasRenderer: m_ObjectHideFlags: 0 @@ -286,12 +271,14 @@ MonoBehaviour: m_GameObject: {fileID: 3643881633437836136} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} m_Color: {r: 0, g: 0.29125005, b: 0.699, a: 1} m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] @@ -304,6 +291,7 @@ MonoBehaviour: m_FillClockwise: 1 m_FillOrigin: 0 m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 --- !u!114 &6925424662664426412 MonoBehaviour: m_ObjectHideFlags: 0 @@ -313,11 +301,12 @@ MonoBehaviour: m_GameObject: {fileID: 3643881633437836136} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 1392445389, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} m_Name: m_EditorClassIdentifier: m_Navigation: m_Mode: 3 + m_WrapAround: 0 m_SelectOnUp: {fileID: 0} m_SelectOnDown: {fileID: 0} m_SelectOnLeft: {fileID: 0} @@ -327,17 +316,20 @@ MonoBehaviour: m_NormalColor: {r: 0.3962264, g: 0.3962264, b: 0.3962264, a: 1} m_HighlightedColor: {r: 0.8018868, g: 0.8018868, b: 0.8018868, a: 1} m_PressedColor: {r: 1, g: 1, b: 1, a: 1} + m_SelectedColor: {r: 0.8018868, g: 0.8018868, b: 0.8018868, a: 1} m_DisabledColor: {r: 0.301, g: 0.301, b: 0.301, a: 0.5019608} m_ColorMultiplier: 1 m_FadeDuration: 0.1 m_SpriteState: m_HighlightedSprite: {fileID: 0} m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} m_DisabledSprite: {fileID: 0} m_AnimationTriggers: m_NormalTrigger: Normal m_HighlightedTrigger: Highlighted m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted m_DisabledTrigger: Disabled m_Interactable: 1 m_TargetGraphic: {fileID: 3643881633437836140} @@ -390,9 +382,9 @@ RectTransform: 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: 3643881633437836137} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -422,6 +414,8 @@ MonoBehaviour: 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: [] @@ -447,13 +441,12 @@ MonoBehaviour: m_fontColorGradientPreset: {fileID: 0} m_spriteAsset: {fileID: 0} m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: 0 m_overrideHtmlColors: 0 m_faceColor: serializedVersion: 2 rgba: 4294967295 - m_outlineColor: - serializedVersion: 2 - rgba: 4278190080 m_fontSize: 18 m_fontSizeBase: 48 m_fontWeight: 400 @@ -461,61 +454,42 @@ MonoBehaviour: m_fontSizeMin: 18 m_fontSizeMax: 72 m_fontStyle: 0 - m_textAlignment: 514 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 - m_firstOverflowCharacterIndex: 0 m_linkedTextComponent: {fileID: 0} - m_isLinkedTextComponent: 0 - m_isTextTruncated: 0 + parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 - m_ignoreRectMaskCulling: 0 - m_ignoreCulling: 1 m_horizontalMapping: 0 m_verticalMapping: 0 m_uvLineOffset: 0 m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 m_VertexBufferAutoSizeReduction: 1 - m_firstVisibleCharacter: 0 m_useMaxVisibleDescender: 1 m_pageToDisplay: 1 m_margin: {x: 0, y: 0, z: 0, w: 0} - m_textInfo: - textComponent: {fileID: 3643881633927103010} - characterCount: 17 - spriteCount: 0 - spaceCount: 1 - wordCount: 2 - linkCount: 0 - lineCount: 16 - pageCount: 1 - materialCount: 1 m_isUsingLegacyAnimationComponent: 0 m_isVolumetricText: 0 - m_spriteAnimator: {fileID: 0} m_hasFontAssetChanged: 0 - m_subTextObjects: - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} m_baseMaterial: {fileID: 0} m_maskOffset: {x: 0, y: 0, z: 0, w: 0} --- !u!114 &3643881633927103021 @@ -527,7 +501,7 @@ MonoBehaviour: m_GameObject: {fileID: 3643881633927103023} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 1679637790, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} m_Name: m_EditorClassIdentifier: m_IgnoreLayout: 0 @@ -548,9 +522,8 @@ GameObject: m_Component: - component: {fileID: 3643881634033459408} - component: {fileID: 3643881634033459414} - - component: {fileID: 3643881634033459409} m_Layer: 5 - m_Name: TMP SubMeshUI [Ubuntu-R SDF Material + LiberationSans SDF Atlas] + m_Name: 'TMP SubMeshUI [Ubuntu-R SDF Material + LiberationSans SDF Atlas]' m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -566,9 +539,9 @@ RectTransform: 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: 3643881633221182925} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -583,33 +556,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 3643881634033459411} m_CullTransparentMesh: 0 ---- !u!114 &3643881634033459409 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3643881634033459411} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 058cba836c1846c3aa1c5fd2e28aea77, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_spriteAsset: {fileID: 0} - m_material: {fileID: 0} - m_sharedMaterial: {fileID: 0} - m_isDefaultMaterial: 0 - m_padding: 8.5625 - m_canvasRenderer: {fileID: 3643881634033459414} - m_TextComponent: {fileID: 3643881633221182914} - m_materialReferenceIndex: 1 --- !u!1 &3643881634325817959 GameObject: m_ObjectHideFlags: 0 @@ -639,9 +585,9 @@ RectTransform: 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: 3643881633437836137} - m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 1, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -665,12 +611,14 @@ MonoBehaviour: m_GameObject: {fileID: 3643881634325817959} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} m_Color: {r: 0.8, g: 0.9333333, 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: [] @@ -683,6 +631,7 @@ MonoBehaviour: m_FillClockwise: 1 m_FillOrigin: 0 m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 --- !u!114 &3643881634325817957 MonoBehaviour: m_ObjectHideFlags: 0 @@ -692,7 +641,7 @@ MonoBehaviour: m_GameObject: {fileID: 3643881634325817959} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 1679637790, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} m_Name: m_EditorClassIdentifier: m_IgnoreLayout: 1 @@ -733,9 +682,9 @@ RectTransform: 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: 3643881634854544289} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -759,12 +708,14 @@ MonoBehaviour: m_GameObject: {fileID: 3643881634576849061} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} + 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: 1} m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] @@ -777,6 +728,7 @@ MonoBehaviour: m_FillClockwise: 1 m_FillOrigin: 0 m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 --- !u!114 &3643881634576849048 MonoBehaviour: m_ObjectHideFlags: 0 @@ -786,7 +738,7 @@ MonoBehaviour: m_GameObject: {fileID: 3643881634576849061} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: -1254083943, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Script: {fileID: 11500000, guid: 86710e43de46f6f4bac7c8e50813a599, type: 3} m_Name: m_EditorClassIdentifier: m_AspectMode: 1 @@ -800,7 +752,7 @@ MonoBehaviour: m_GameObject: {fileID: 3643881634576849061} m_Enabled: 0 m_EditorHideFlags: 0 - m_Script: {fileID: 1741964061, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} m_Name: m_EditorClassIdentifier: m_HorizontalFit: 0 @@ -834,9 +786,9 @@ RectTransform: 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: 3643881633437836137} - m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} @@ -860,12 +812,14 @@ MonoBehaviour: m_GameObject: {fileID: 3643881634695350168} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} m_Color: {r: 0.8, g: 0.9333333, 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: [] @@ -878,6 +832,7 @@ MonoBehaviour: m_FillClockwise: 1 m_FillOrigin: 0 m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 --- !u!114 &3643881634695350174 MonoBehaviour: m_ObjectHideFlags: 0 @@ -887,7 +842,7 @@ MonoBehaviour: m_GameObject: {fileID: 3643881634695350168} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 1679637790, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} m_Name: m_EditorClassIdentifier: m_IgnoreLayout: 1 @@ -926,10 +881,10 @@ RectTransform: 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: 3643881634576849050} m_Father: {fileID: 3643881633437836137} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -945,7 +900,7 @@ MonoBehaviour: m_GameObject: {fileID: 3643881634854544288} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 1679637790, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} m_Name: m_EditorClassIdentifier: m_IgnoreLayout: 0 @@ -965,7 +920,7 @@ MonoBehaviour: m_GameObject: {fileID: 3643881634854544288} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: -405508275, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3} m_Name: m_EditorClassIdentifier: m_Padding: @@ -979,3 +934,6 @@ MonoBehaviour: m_ChildForceExpandHeight: 0 m_ChildControlWidth: 1 m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 diff --git a/Assets/Prefabs/UI/Dropdown Option.prefab b/Assets/Prefabs/UI/Dropdown Option.prefab index 0f99f8b8a..a93c5f568 100644 --- a/Assets/Prefabs/UI/Dropdown Option.prefab +++ b/Assets/Prefabs/UI/Dropdown Option.prefab @@ -30,11 +30,11 @@ RectTransform: 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: 5288995275525413887} - {fileID: 4420144871448733516} m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -103,6 +103,7 @@ MonoBehaviour: m_EditorClassIdentifier: m_Navigation: m_Mode: 3 + m_WrapAround: 0 m_SelectOnUp: {fileID: 0} m_SelectOnDown: {fileID: 0} m_SelectOnLeft: {fileID: 0} @@ -161,9 +162,9 @@ RectTransform: 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: 4420144871272692262} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -237,20 +238,23 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 @@ -317,9 +321,9 @@ RectTransform: 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: 4420144871272692262} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} diff --git a/Assets/Prefabs/UI/Flat InputField.prefab b/Assets/Prefabs/UI/Flat InputField.prefab index f5748ed7b..9e59ba224 100644 --- a/Assets/Prefabs/UI/Flat InputField.prefab +++ b/Assets/Prefabs/UI/Flat InputField.prefab @@ -28,11 +28,11 @@ RectTransform: 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: 4451361955953725104} - {fileID: 4451361956030022757} m_Father: {fileID: 4451361956630297310} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -89,9 +89,9 @@ RectTransform: 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: 4451361954557856253} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -164,20 +164,23 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 0 + m_TextWrappingMode: 0 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 1 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 @@ -223,9 +226,9 @@ RectTransform: 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: 4451361954557856253} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -298,20 +301,23 @@ MonoBehaviour: m_VerticalAlignment: 256 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 0 + m_TextWrappingMode: 3 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 1 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 @@ -358,10 +364,10 @@ RectTransform: 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: 4451361954557856253} m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -470,10 +476,13 @@ MonoBehaviour: m_GlobalFontAsset: {fileID: 11400000, guid: 3fb7d873bb5a7944bb9a7c73c430c44b, type: 2} m_OnFocusSelectAll: 1 m_ResetOnDeActivation: 1 + m_KeepTextSelectionVisible: 0 m_RestoreOriginalTextOnEscape: 1 m_isRichTextEditingAllowed: 0 m_LineLimit: 0 + isAlert: 0 m_InputValidator: {fileID: 0} + m_ShouldActivateOnSelect: 1 --- !u!114 &3109909670730689337 MonoBehaviour: m_ObjectHideFlags: 0 diff --git a/Assets/Prefabs/UI/Input Display Container.prefab b/Assets/Prefabs/UI/Input Display Container.prefab index 20f1b6c1a..e0fe5c833 100644 --- a/Assets/Prefabs/UI/Input Display Container.prefab +++ b/Assets/Prefabs/UI/Input Display Container.prefab @@ -26,10 +26,10 @@ RectTransform: 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: 3575543201409287275} m_Father: {fileID: 3575543199475698844} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -64,9 +64,9 @@ RectTransform: 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: 3575543201164511461} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -138,13 +138,13 @@ RectTransform: 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: 3575543199328406134} - {fileID: 3575543201062286834} - {fileID: 3575543199601288280} - {fileID: 3575543201335647258} m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 0.5} @@ -217,9 +217,9 @@ RectTransform: 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: 3575543200853098928} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -292,6 +292,7 @@ RectTransform: m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 0.8, y: 0.8, z: 1} + m_ConstrainProportionsScale: 0 m_Children: - {fileID: 3575543201164511461} - {fileID: 3575543200709404420} @@ -299,7 +300,6 @@ RectTransform: - {fileID: 3575543200853098928} - {fileID: 3575543200736016708} m_Father: {fileID: 3575543199475698844} - m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 1, y: 0} m_AnchorMax: {x: 1, y: 0} @@ -373,11 +373,11 @@ RectTransform: 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: 3575543200370154277} - {fileID: 3575543199949252307} m_Father: {fileID: 3575543201062286834} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -465,9 +465,9 @@ RectTransform: 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: 3575543199809032539} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -534,9 +534,9 @@ RectTransform: 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: 3575543200370154277} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -616,13 +616,13 @@ RectTransform: 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: 3575543200306509116} - {fileID: 3575543201356857812} - {fileID: 3575543201337423529} - {fileID: 3575543200656285771} m_Father: {fileID: 3575543199809032539} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -743,6 +743,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 3468b3db8d419c745b12124f6432696b, type: 3} m_Name: m_EditorClassIdentifier: + SuppressDisable: 0 --- !u!114 &3575543200370154281 MonoBehaviour: m_ObjectHideFlags: 0 @@ -790,10 +791,10 @@ RectTransform: 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: 3575543200396461816} m_Father: {fileID: 3575543199601288280} - m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -905,6 +906,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 3468b3db8d419c745b12124f6432696b, type: 3} m_Name: m_EditorClassIdentifier: + SuppressDisable: 0 --- !u!114 &3575543200394488151 MonoBehaviour: m_ObjectHideFlags: 0 @@ -957,9 +959,9 @@ RectTransform: 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: 3575543200394488147} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -1032,9 +1034,9 @@ RectTransform: 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: 3575543200978094812} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -1108,20 +1110,23 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 @@ -1167,9 +1172,9 @@ RectTransform: 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: 3575543200370154277} - m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0.5} m_AnchorMax: {x: 1, y: 1} @@ -1243,20 +1248,23 @@ MonoBehaviour: m_VerticalAlignment: 256 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 @@ -1302,9 +1310,9 @@ RectTransform: 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: 3575543200736016708} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -1384,10 +1392,10 @@ RectTransform: 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: 3575543201305645094} m_Father: {fileID: 3575543199601288280} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -1499,6 +1507,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 3468b3db8d419c745b12124f6432696b, type: 3} m_Name: m_EditorClassIdentifier: + SuppressDisable: 0 --- !u!114 &3575543200709404424 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1558,10 +1567,10 @@ RectTransform: 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: 3575543200691046844} m_Father: {fileID: 3575543199601288280} - m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -1673,6 +1682,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 3468b3db8d419c745b12124f6432696b, type: 3} m_Name: m_EditorClassIdentifier: + SuppressDisable: 0 --- !u!114 &3575543200736016712 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1732,10 +1742,10 @@ RectTransform: 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: 3575543199594005114} m_Father: {fileID: 3575543199601288280} - m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -1847,6 +1857,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 3468b3db8d419c745b12124f6432696b, type: 3} m_Name: m_EditorClassIdentifier: + SuppressDisable: 0 --- !u!114 &3575543200853098932 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1899,9 +1910,9 @@ RectTransform: 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: 3575543201062286834} - m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -1967,10 +1978,10 @@ RectTransform: 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: 3575543200538069944} m_Father: {fileID: 3575543201062286834} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -2031,12 +2042,12 @@ RectTransform: 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: 3575543200978094812} - {fileID: 3575543199809032539} - {fileID: 3575543200860056044} m_Father: {fileID: 3575543199475698844} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -2117,9 +2128,9 @@ RectTransform: 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: 3575543201335647258} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -2221,20 +2232,23 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 @@ -2338,10 +2352,10 @@ RectTransform: 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: 3575543199395697427} m_Father: {fileID: 3575543199601288280} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -2453,6 +2467,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 3468b3db8d419c745b12124f6432696b, type: 3} m_Name: m_EditorClassIdentifier: + SuppressDisable: 0 --- !u!114 &3575543201164511465 MonoBehaviour: m_ObjectHideFlags: 0 @@ -2505,9 +2520,9 @@ RectTransform: 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: 3575543200709404420} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -2578,10 +2593,10 @@ RectTransform: 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: 3575543201132091707} m_Father: {fileID: 3575543199475698844} - m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -2616,9 +2631,9 @@ RectTransform: 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: 3575543200370154277} - m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 0.5} @@ -2692,20 +2707,23 @@ MonoBehaviour: m_VerticalAlignment: 1024 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 @@ -2751,9 +2769,9 @@ RectTransform: 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: 3575543200370154277} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -2827,9 +2845,9 @@ RectTransform: 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: 3575543199328406134} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} diff --git a/Assets/Prefabs/UI/Inventory.prefab b/Assets/Prefabs/UI/Inventory.prefab index 0addea4f8..dd6baefd6 100644 --- a/Assets/Prefabs/UI/Inventory.prefab +++ b/Assets/Prefabs/UI/Inventory.prefab @@ -28,9 +28,9 @@ RectTransform: 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: 4075091371340814903} - m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 1, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -104,20 +104,23 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 @@ -163,9 +166,9 @@ RectTransform: 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: 4075091371340814903} - m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} @@ -239,20 +242,23 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 @@ -300,9 +306,9 @@ RectTransform: 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: 6584545650613466935} - m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 1, y: 1} m_AnchorMax: {x: 1, y: 1} @@ -376,20 +382,23 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 @@ -497,10 +506,10 @@ RectTransform: 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: 2279630452912159027} m_Father: {fileID: 2279630453233804081} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -535,9 +544,9 @@ RectTransform: 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: 2279630452881931921} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -609,12 +618,12 @@ RectTransform: 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: 2279630452951644481} - {fileID: 2279630453233804081} - {fileID: 2279630454002795611} m_Father: {fileID: 2279630453886260053} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -677,10 +686,10 @@ RectTransform: 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: 2279630452592903581} m_Father: {fileID: 2279630454002795611} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -715,9 +724,9 @@ RectTransform: 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: 2279630452357787793} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -791,10 +800,10 @@ RectTransform: 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: 2279630453710142155} m_Father: {fileID: 2279630452842594753} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -881,9 +890,9 @@ RectTransform: 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: 6584545650613466935} - m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 0} @@ -977,10 +986,10 @@ RectTransform: 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: 2279630452357787793} m_Father: {fileID: 2279630452842594753} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -1108,9 +1117,9 @@ RectTransform: 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: 2279630454000268454} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -1203,6 +1212,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 3468b3db8d419c745b12124f6432696b, type: 3} m_Name: m_EditorClassIdentifier: + SuppressDisable: 0 --- !u!114 &3026868749259999386 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1255,9 +1265,9 @@ RectTransform: 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: 6584545650613466935} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -1331,20 +1341,23 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 @@ -1390,11 +1403,11 @@ RectTransform: 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: 5904147203112258852} - {fileID: 2279630454000268454} m_Father: {fileID: 2279630452951644481} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -1468,12 +1481,12 @@ RectTransform: 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: 6584545650613466935} - {fileID: 2279630452842594753} - {fileID: 4075091371340814903} m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -1493,6 +1506,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Dialog: {fileID: 0} + DragParent: {fileID: 0} Flip: 0 Settings: {fileID: 0} GameManager: {fileID: 0} @@ -2312,6 +2326,7 @@ MonoBehaviour: CellBackgroundColor: {r: 0, g: 0, b: 0, a: 0.9019608} MinTempRange: 1 DoubleClickTime: 0.5 + HitDamageThreshold: 1 EmptyCells: [] --- !u!222 &6932930312706461541 CanvasRenderer: @@ -2379,11 +2394,11 @@ RectTransform: 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: 2279630453345861720} - {fileID: 2862553520485687858} m_Father: {fileID: 2279630453710142155} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -2451,10 +2466,10 @@ RectTransform: 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: 2279630452881931921} m_Father: {fileID: 2279630452842594753} - m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 1, y: 0} m_AnchorMax: {x: 1, y: 0} @@ -2574,13 +2589,13 @@ RectTransform: 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: 25087979752144322} - {fileID: 6451840322166179141} - {fileID: 8682495930185187424} - {fileID: 1941003311334506942} m_Father: {fileID: 2279630453886260053} - m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} @@ -2616,10 +2631,10 @@ RectTransform: 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: 5788397503820000463} m_Father: {fileID: 4075091371340814903} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -2704,6 +2719,7 @@ RectTransform: 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: 4397116930423727094} - {fileID: 2279630453679143107} @@ -2712,7 +2728,6 @@ RectTransform: - {fileID: 5683613523479270443} - {fileID: 6462754505713931446} m_Father: {fileID: 2279630453886260053} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 1, y: 1} @@ -2773,9 +2788,9 @@ RectTransform: 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: 25087979752144322} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -2848,9 +2863,9 @@ RectTransform: 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: 2279630454000268454} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -2926,9 +2941,9 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: -0.7071068, w: 0.7071068} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 6584545650613466935} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: -90} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} @@ -3082,9 +3097,9 @@ RectTransform: 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: 3031152863755518086} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: -90} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -3236,9 +3251,9 @@ RectTransform: 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: 2279630453710142155} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} @@ -3327,10 +3342,10 @@ RectTransform: 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: 8871154407653395989} m_Father: {fileID: 6584545650613466935} - m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -3385,9 +3400,9 @@ RectTransform: 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: 4075091371340814903} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -3462,9 +3477,9 @@ RectTransform: 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: 6584545650613466935} - m_RootOrder: 5 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} @@ -3540,20 +3555,23 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 diff --git a/Assets/Prefabs/UI/Main Menu Canvas.prefab b/Assets/Prefabs/UI/Main Menu Canvas.prefab index a03628ba0..e185d1911 100644 --- a/Assets/Prefabs/UI/Main Menu Canvas.prefab +++ b/Assets/Prefabs/UI/Main Menu Canvas.prefab @@ -29,10 +29,10 @@ RectTransform: 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: 350889891057474423} m_Father: {fileID: 350889891632477145} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -118,9 +118,9 @@ RectTransform: 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: 350889892050671116} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -193,9 +193,9 @@ RectTransform: 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: 350889890423887027} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -270,10 +270,10 @@ RectTransform: 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: 350889892050671116} m_Father: {fileID: 350889891632477145} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} @@ -366,11 +366,11 @@ RectTransform: 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: 350889890423887027} - {fileID: 350889891628991064} m_Father: {fileID: 7329274282942065572} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -461,10 +461,10 @@ RectTransform: 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: 350889890962861326} m_Father: {fileID: 350889891628991064} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -500,9 +500,9 @@ RectTransform: 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: 8184616833802884024} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -596,11 +596,11 @@ RectTransform: m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 0.6666667, y: 0.6666667, z: 0.6666667} + m_ConstrainProportionsScale: 0 m_Children: - {fileID: 2261466211211207212} - {fileID: 7963881274223503427} m_Father: {fileID: 4533226043457584179} - m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -695,12 +695,12 @@ RectTransform: m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 0.6666667, y: 0.6666667, z: 0.6666667} + m_ConstrainProportionsScale: 0 m_Children: - {fileID: 4533226043526995714} - {fileID: 4533226043829246279} - {fileID: 4533226044611060154} m_Father: {fileID: 4533226043457584179} - m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -788,8 +788,9 @@ MonoBehaviour: type: 3} StatSheet: {fileID: 0} CurveField: {fileID: 0} + WeaponGroupAssignment: {fileID: 0} Content: {fileID: 4533226043449861658} - SelectedChild: {fileID: 0} + DragParent: {fileID: 0} GameManager: {fileID: 0} CancelClickCatcher: {fileID: 725430339668194415} ButtonGroup: {fileID: 4533226044611060155} @@ -827,13 +828,13 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 0, y: 0, z: 0} + m_ConstrainProportionsScale: 0 m_Children: - {fileID: 8079387348638243065} - {fileID: 7201272822408223301} - {fileID: 4533226043449861658} - {fileID: 8184616833802884024} m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -857,7 +858,9 @@ Canvas: m_OverrideSorting: 0 m_OverridePixelPerfect: 0 m_SortingBucketNormalizedSize: 0 + m_VertexColorAlwaysGammaSpace: 0 m_AdditionalShaderChannelsFlag: 25 + m_UpdateRectTransformForStandalone: 0 m_SortingLayerID: 0 m_SortingOrder: 0 m_TargetDisplay: 0 @@ -913,9 +916,9 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 3d7c7b928d043a3449b93bce9de03d1c, type: 3} m_Name: m_EditorClassIdentifier: + CloudRenderer: {fileID: 0} Settings: {fileID: 11400000, guid: cd2344e2001a37544aab0960c164d4ff, type: 2} Dialog: {fileID: 4533226043449861657} - InGame: 0 PanelPrototype: {fileID: 7329274282942065594} FadeTime: 0.5 FadeDistance: 1024 @@ -950,9 +953,9 @@ RectTransform: 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: 4533226043449861658} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -1045,9 +1048,9 @@ RectTransform: 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: 4533226043449861658} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -1121,20 +1124,23 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 @@ -1179,9 +1185,9 @@ RectTransform: 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: 4533226044611060154} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -1235,12 +1241,12 @@ RectTransform: 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: 2381176780008325752} - {fileID: 4533226043924106331} - {fileID: 2381176779129949493} m_Father: {fileID: 4533226043449861658} - m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -1299,10 +1305,10 @@ RectTransform: 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: 7329274282942065572} m_Father: {fileID: 4533226043457584179} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -1338,9 +1344,9 @@ RectTransform: m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 0.6666667, y: 0.6666667, z: 0.6666667} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 4533226043457584179} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -1429,11 +1435,11 @@ RectTransform: 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: 7329274283166941234} - {fileID: 350889891632477145} m_Father: {fileID: 8079387348638243065} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} @@ -1482,8 +1488,9 @@ MonoBehaviour: StatSheet: {fileID: 3416329628306957711, guid: 4f75723ed178a084e813965e84825bd4, type: 3} CurveField: {fileID: 0} + WeaponGroupAssignment: {fileID: 0} Content: {fileID: 350889891057474423} - SelectedChild: {fileID: 0} + DragParent: {fileID: 0} GameManager: {fileID: 0} --- !u!222 &7329274282942065577 CanvasRenderer: @@ -1573,9 +1580,9 @@ RectTransform: 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: 7329274282942065572} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -1651,20 +1658,23 @@ MonoBehaviour: m_VerticalAlignment: 256 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: -20 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 @@ -1745,9 +1755,9 @@ RectTransform: 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: 8184616833802884024} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} @@ -1807,6 +1817,7 @@ PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: + serializedVersion: 3 m_TransformParent: {fileID: 4533226044611060154} m_Modifications: - target: {fileID: 422905925398675622, guid: 2758dfa2744d7ad4d8877545189d116e, @@ -1889,6 +1900,11 @@ PrefabInstance: propertyPath: m_firstOverflowCharacterIndex value: 0 objectReference: {fileID: 0} + - target: {fileID: 1713457305180270767, guid: 2758dfa2744d7ad4d8877545189d116e, + type: 3} + propertyPath: 'm_ActiveFontFeatures.Array.data[0]' + value: 1801810542 + objectReference: {fileID: 0} - target: {fileID: 2297648055057363568, guid: 2758dfa2744d7ad4d8877545189d116e, type: 3} propertyPath: m_Pivot.x @@ -2080,25 +2096,10 @@ PrefabInstance: value: Confirm Button objectReference: {fileID: 0} m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 2758dfa2744d7ad4d8877545189d116e, type: 3} ---- !u!114 &2967358985619754986 stripped -MonoBehaviour: - m_CorrespondingSourceObject: {fileID: 1713457305180270767, guid: 2758dfa2744d7ad4d8877545189d116e, - type: 3} - m_PrefabInstance: {fileID: 4533226044147941189} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!224 &2381176779129949493 stripped -RectTransform: - m_CorrespondingSourceObject: {fileID: 2297648055057363568, guid: 2758dfa2744d7ad4d8877545189d116e, - type: 3} - m_PrefabInstance: {fileID: 4533226044147941189} - m_PrefabAsset: {fileID: 0} --- !u!114 &1044359408896957406 stripped MonoBehaviour: m_CorrespondingSourceObject: {fileID: 3501282941175030939, guid: 2758dfa2744d7ad4d8877545189d116e, @@ -2111,11 +2112,30 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} m_Name: m_EditorClassIdentifier: +--- !u!224 &2381176779129949493 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 2297648055057363568, guid: 2758dfa2744d7ad4d8877545189d116e, + type: 3} + m_PrefabInstance: {fileID: 4533226044147941189} + m_PrefabAsset: {fileID: 0} +--- !u!114 &2967358985619754986 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 1713457305180270767, guid: 2758dfa2744d7ad4d8877545189d116e, + type: 3} + m_PrefabInstance: {fileID: 4533226044147941189} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: --- !u!1001 &4533226044873879560 PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: + serializedVersion: 3 m_TransformParent: {fileID: 4533226044611060154} m_Modifications: - target: {fileID: 422905925398675622, guid: 2758dfa2744d7ad4d8877545189d116e, @@ -2203,6 +2223,11 @@ PrefabInstance: propertyPath: m_firstOverflowCharacterIndex value: 0 objectReference: {fileID: 0} + - target: {fileID: 1713457305180270767, guid: 2758dfa2744d7ad4d8877545189d116e, + type: 3} + propertyPath: 'm_ActiveFontFeatures.Array.data[0]' + value: 1801810542 + objectReference: {fileID: 0} - target: {fileID: 2297648055057363568, guid: 2758dfa2744d7ad4d8877545189d116e, type: 3} propertyPath: m_Pivot.x @@ -2394,7 +2419,22 @@ PrefabInstance: value: Cancel Button objectReference: {fileID: 0} m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 2758dfa2744d7ad4d8877545189d116e, type: 3} +--- !u!114 &1044359407629948051 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 3501282941175030939, guid: 2758dfa2744d7ad4d8877545189d116e, + type: 3} + m_PrefabInstance: {fileID: 4533226044873879560} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: --- !u!224 &2381176780008325752 stripped RectTransform: m_CorrespondingSourceObject: {fileID: 2297648055057363568, guid: 2758dfa2744d7ad4d8877545189d116e, @@ -2413,15 +2453,3 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} m_Name: m_EditorClassIdentifier: ---- !u!114 &1044359407629948051 stripped -MonoBehaviour: - m_CorrespondingSourceObject: {fileID: 3501282941175030939, guid: 2758dfa2744d7ad4d8877545189d116e, - type: 3} - m_PrefabInstance: {fileID: 4533226044873879560} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} - m_Name: - m_EditorClassIdentifier: diff --git a/Assets/Prefabs/UI/Properties Panel/Fancy/Bool Field.prefab b/Assets/Prefabs/UI/Properties Panel/Fancy/Bool Field.prefab index 84e750891..9fc83e309 100644 --- a/Assets/Prefabs/UI/Properties Panel/Fancy/Bool Field.prefab +++ b/Assets/Prefabs/UI/Properties Panel/Fancy/Bool Field.prefab @@ -35,7 +35,6 @@ RectTransform: - {fileID: 7661950295498381397} - {fileID: 7661950294707789146} m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -152,7 +151,6 @@ RectTransform: m_Children: - {fileID: 7661950295217243554} m_Father: {fileID: 7661950294707789146} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -230,7 +228,6 @@ RectTransform: m_Children: - {fileID: 7661950294137596689} m_Father: {fileID: 7661950293931311387} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -350,7 +347,6 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 7661950294137596689} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.2, y: 0.2} m_AnchorMax: {x: 0.8, y: 0.8} @@ -427,7 +423,6 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 7661950293931311387} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -501,20 +496,23 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 diff --git a/Assets/Prefabs/UI/Properties Panel/Fancy/Button Field.prefab b/Assets/Prefabs/UI/Properties Panel/Fancy/Button Field.prefab index bc492fa08..2515f64a0 100644 --- a/Assets/Prefabs/UI/Properties Panel/Fancy/Button Field.prefab +++ b/Assets/Prefabs/UI/Properties Panel/Fancy/Button Field.prefab @@ -28,9 +28,9 @@ RectTransform: 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: 790814198576895811} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -104,20 +104,23 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 @@ -165,10 +168,10 @@ RectTransform: 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: 790814197411605233} m_Father: {fileID: 6566784227922820063} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -307,11 +310,11 @@ RectTransform: 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: 6566784228232816309} - {fileID: 790814198576895811} m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -426,9 +429,9 @@ RectTransform: 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: 6566784227922820063} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -502,20 +505,23 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 diff --git a/Assets/Prefabs/UI/Properties Panel/Fancy/Curve Field.prefab b/Assets/Prefabs/UI/Properties Panel/Fancy/Curve Field.prefab index ea233162a..5cbdc480d 100644 --- a/Assets/Prefabs/UI/Properties Panel/Fancy/Curve Field.prefab +++ b/Assets/Prefabs/UI/Properties Panel/Fancy/Curve Field.prefab @@ -28,9 +28,9 @@ RectTransform: 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: 5150349054046905327} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.25} m_AnchorMax: {x: 0.5, y: 0.25} @@ -103,9 +103,9 @@ RectTransform: 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: 5150349054046905327} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0} m_AnchorMax: {x: 0.5, y: 0.25} @@ -179,9 +179,9 @@ RectTransform: 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: 4525093026741206958} - m_RootOrder: 5 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 1, y: 1} @@ -255,20 +255,23 @@ MonoBehaviour: m_VerticalAlignment: 256 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 @@ -335,9 +338,9 @@ RectTransform: 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: 4525093026741206958} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -411,20 +414,23 @@ MonoBehaviour: m_VerticalAlignment: 256 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 @@ -490,9 +496,9 @@ RectTransform: 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: 4525093026741206958} - m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 0} @@ -566,9 +572,9 @@ RectTransform: 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: 4525093026741206958} - m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0} m_AnchorMax: {x: 0.5, y: 0} @@ -642,20 +648,23 @@ MonoBehaviour: m_VerticalAlignment: 256 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 @@ -722,9 +731,9 @@ RectTransform: 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: 4525093026741206958} - m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 1, y: 0} m_AnchorMax: {x: 1, y: 0} @@ -798,20 +807,23 @@ MonoBehaviour: m_VerticalAlignment: 256 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 @@ -877,11 +889,11 @@ RectTransform: 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: 2039464565} - {fileID: 2008487938} m_Father: {fileID: 4525093026741206958} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -964,6 +976,7 @@ RectTransform: 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: 5150349054046905327} - {fileID: 8457868409217303238} @@ -972,7 +985,6 @@ RectTransform: - {fileID: 5150349052900313153} - {fileID: 7117984985042789648} m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} diff --git a/Assets/Prefabs/UI/Properties Panel/Fancy/Enum Field.prefab b/Assets/Prefabs/UI/Properties Panel/Fancy/Enum Field.prefab index 61980ca29..4634a2775 100644 --- a/Assets/Prefabs/UI/Properties Panel/Fancy/Enum Field.prefab +++ b/Assets/Prefabs/UI/Properties Panel/Fancy/Enum Field.prefab @@ -31,7 +31,6 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1444953513611246322} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -105,20 +104,23 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 @@ -171,7 +173,6 @@ RectTransform: - {fileID: 1444953513591056483} - {fileID: 1444953514355799430} m_Father: {fileID: 1444953514731475974} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -312,7 +313,6 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1444953514731475974} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -386,20 +386,23 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 @@ -468,7 +471,6 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1444953513611246322} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: -90} m_AnchorMin: {x: 1, y: 0.5} m_AnchorMax: {x: 1, y: 0.5} @@ -548,7 +550,6 @@ RectTransform: - {fileID: 1444953513817938006} - {fileID: 1444953513611246322} m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} diff --git a/Assets/Prefabs/UI/Properties Panel/Fancy/Increment Field.prefab b/Assets/Prefabs/UI/Properties Panel/Fancy/Increment Field.prefab index 112cd3b81..66fbba81a 100644 --- a/Assets/Prefabs/UI/Properties Panel/Fancy/Increment Field.prefab +++ b/Assets/Prefabs/UI/Properties Panel/Fancy/Increment Field.prefab @@ -33,7 +33,6 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 2544338102157427055} - m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 1, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -169,7 +168,6 @@ RectTransform: - {fileID: 7863247503782211248} - {fileID: 8483308900631515678} m_Father: {fileID: 6770904480725292323} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -228,7 +226,6 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 6770904480725292323} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -302,20 +299,23 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 @@ -388,7 +388,6 @@ RectTransform: - {fileID: 6770904480229951561} - {fileID: 2544338102157427055} m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -508,7 +507,6 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 2544338102157427055} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 1, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -642,7 +640,6 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 2544338102157427055} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -716,20 +713,23 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 diff --git a/Assets/Prefabs/UI/Properties Panel/Fancy/Input Field.prefab b/Assets/Prefabs/UI/Properties Panel/Fancy/Input Field.prefab index bdcedb118..afc077a82 100644 --- a/Assets/Prefabs/UI/Properties Panel/Fancy/Input Field.prefab +++ b/Assets/Prefabs/UI/Properties Panel/Fancy/Input Field.prefab @@ -35,7 +35,6 @@ RectTransform: - {fileID: 23155009713813574} - {fileID: 8734896053364945145} m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -152,7 +151,6 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 23155009655760172} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -226,20 +224,23 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 @@ -308,7 +309,6 @@ RectTransform: m_Children: - {fileID: 5938949450847760329} m_Father: {fileID: 23155009655760172} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -367,7 +367,6 @@ RectTransform: - {fileID: 5938949451508194215} - {fileID: 5938949451316023666} m_Father: {fileID: 5938949450847760329} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -422,7 +421,6 @@ RectTransform: m_Children: - {fileID: 5938949450758544618} m_Father: {fileID: 8734896053364945145} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -561,10 +559,13 @@ MonoBehaviour: m_GlobalFontAsset: {fileID: 11400000, guid: 9dcd07b95faae7641a3ff6fccab43c32, type: 2} m_OnFocusSelectAll: 1 m_ResetOnDeActivation: 1 + m_KeepTextSelectionVisible: 0 m_RestoreOriginalTextOnEscape: 1 m_isRichTextEditingAllowed: 0 m_LineLimit: 0 + isAlert: 0 m_InputValidator: {fileID: 0} + m_ShouldActivateOnSelect: 1 --- !u!114 &1618696626055083017 MonoBehaviour: m_ObjectHideFlags: 0 @@ -616,7 +617,6 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 5938949450758544618} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -690,20 +690,23 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 0 + m_TextWrappingMode: 3 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 1 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 @@ -752,7 +755,6 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 5938949450758544618} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -826,20 +828,23 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 0 + m_TextWrappingMode: 0 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 1 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 diff --git a/Assets/Prefabs/UI/Properties Panel/Fancy/Progress Field.prefab b/Assets/Prefabs/UI/Properties Panel/Fancy/Progress Field.prefab index c9200c393..18872559c 100644 --- a/Assets/Prefabs/UI/Properties Panel/Fancy/Progress Field.prefab +++ b/Assets/Prefabs/UI/Properties Panel/Fancy/Progress Field.prefab @@ -31,7 +31,6 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 8181761431199775037} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -107,7 +106,6 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 8181761431199775037} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -187,7 +185,6 @@ RectTransform: - {fileID: 3301729265189646952} - {fileID: 8626591645481506733} m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -304,7 +301,6 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 3301729265155698787} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -378,20 +374,23 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 @@ -460,7 +459,6 @@ RectTransform: - {fileID: 4052465884214141673} - {fileID: 1684719062263664779} m_Father: {fileID: 8626591645481506733} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -499,7 +497,6 @@ RectTransform: m_Children: - {fileID: 8181761431199775037} m_Father: {fileID: 3301729265155698787} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} diff --git a/Assets/Prefabs/UI/Properties Panel/Fancy/Property Label.prefab b/Assets/Prefabs/UI/Properties Panel/Fancy/Property Label.prefab index 6ec1c92cc..599a29f50 100644 --- a/Assets/Prefabs/UI/Properties Panel/Fancy/Property Label.prefab +++ b/Assets/Prefabs/UI/Properties Panel/Fancy/Property Label.prefab @@ -32,7 +32,6 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 2677123916507168719} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -106,20 +105,23 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 @@ -192,7 +194,6 @@ RectTransform: - {fileID: 2677123916028371621} - {fileID: 6602089867192183683} m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -309,7 +310,6 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 2677123916507168719} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -383,20 +383,23 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 diff --git a/Assets/Prefabs/UI/Properties Panel/Fancy/Property.prefab b/Assets/Prefabs/UI/Properties Panel/Fancy/Property.prefab index fd7063dc1..6c64288ee 100644 --- a/Assets/Prefabs/UI/Properties Panel/Fancy/Property.prefab +++ b/Assets/Prefabs/UI/Properties Panel/Fancy/Property.prefab @@ -29,9 +29,9 @@ RectTransform: 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: 9159917045172241900} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -107,20 +107,23 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 @@ -188,10 +191,10 @@ RectTransform: 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: 9159917045079857286} m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} diff --git a/Assets/Prefabs/UI/Properties Panel/Fancy/Ranged Float Field.prefab b/Assets/Prefabs/UI/Properties Panel/Fancy/Ranged Float Field.prefab index 5821edb01..f195ba08f 100644 --- a/Assets/Prefabs/UI/Properties Panel/Fancy/Ranged Float Field.prefab +++ b/Assets/Prefabs/UI/Properties Panel/Fancy/Ranged Float Field.prefab @@ -31,7 +31,6 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 7146463267720429741} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0.5} m_AnchorMax: {x: 1, y: 0.5} @@ -106,7 +105,6 @@ RectTransform: m_Children: - {fileID: 3436413162678517982} m_Father: {fileID: 7146463267720429741} - m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0.5} m_AnchorMax: {x: 1, y: 0.5} @@ -144,7 +142,6 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 7282863425963355709} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -219,7 +216,6 @@ RectTransform: m_Children: - {fileID: 287045173602649995} m_Father: {fileID: 7146463267720429741} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0.5} m_AnchorMax: {x: 1, y: 0.5} @@ -258,7 +254,6 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 3222204141728529077} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -353,7 +348,6 @@ RectTransform: - {fileID: 4127690186274268520} - {fileID: 7146463267720429741} m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -490,7 +484,6 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 4127690186169542499} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -564,20 +557,23 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 @@ -649,7 +645,6 @@ RectTransform: - {fileID: 7282863425963355709} - {fileID: 3222204141728529077} m_Father: {fileID: 4127690186169542499} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} diff --git a/Assets/Prefabs/UI/Properties Panel/Fancy/Stat.prefab b/Assets/Prefabs/UI/Properties Panel/Fancy/Stat.prefab index fcbe746fb..4e3669a40 100644 --- a/Assets/Prefabs/UI/Properties Panel/Fancy/Stat.prefab +++ b/Assets/Prefabs/UI/Properties Panel/Fancy/Stat.prefab @@ -29,11 +29,11 @@ RectTransform: 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: 215031283457978355} - {fileID: 6087143909423189777} m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -120,9 +120,9 @@ RectTransform: 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: 169101331738242590} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 0.5} @@ -196,20 +196,23 @@ MonoBehaviour: m_VerticalAlignment: 256 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 @@ -255,9 +258,9 @@ RectTransform: 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: 169101331738242590} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0.5} m_AnchorMax: {x: 1, y: 1} @@ -331,20 +334,23 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 diff --git a/Assets/Prefabs/UI/Properties Panel/Fancy/Weapon Group.prefab b/Assets/Prefabs/UI/Properties Panel/Fancy/Weapon Group.prefab index 95677030e..a27bdfb46 100644 --- a/Assets/Prefabs/UI/Properties Panel/Fancy/Weapon Group.prefab +++ b/Assets/Prefabs/UI/Properties Panel/Fancy/Weapon Group.prefab @@ -29,9 +29,9 @@ RectTransform: 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: 7093141058661617964} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -105,20 +105,23 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 @@ -208,9 +211,9 @@ RectTransform: 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: 7093141058661617964} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -288,11 +291,11 @@ RectTransform: 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: 8854537499952373070} - {fileID: 8854537499097178562} m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} diff --git a/Assets/Prefabs/UI/Properties Panel/Fancy/Weapon Groups.prefab b/Assets/Prefabs/UI/Properties Panel/Fancy/Weapon Groups.prefab index 77e704a12..c0ed5af9b 100644 --- a/Assets/Prefabs/UI/Properties Panel/Fancy/Weapon Groups.prefab +++ b/Assets/Prefabs/UI/Properties Panel/Fancy/Weapon Groups.prefab @@ -28,9 +28,9 @@ RectTransform: 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: 7017012055636029233} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0.5} m_AnchorMax: {x: 1, y: 1} @@ -104,20 +104,23 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 @@ -162,9 +165,9 @@ RectTransform: 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: 7017012055636029233} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 0} @@ -228,11 +231,11 @@ RectTransform: 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: 7044292112900681436} - {fileID: 4617351576505394386} m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} diff --git a/Assets/Prefabs/UI/Properties Panel/Properties.prefab b/Assets/Prefabs/UI/Properties Panel/Properties.prefab index 29d281e03..d51addf62 100644 --- a/Assets/Prefabs/UI/Properties Panel/Properties.prefab +++ b/Assets/Prefabs/UI/Properties Panel/Properties.prefab @@ -28,9 +28,9 @@ RectTransform: 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: 257019180622654292} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -103,9 +103,9 @@ RectTransform: 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: 257019180101986795} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -181,10 +181,10 @@ RectTransform: 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: 257019179596293679} m_Father: {fileID: 257019181563268737} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -268,10 +268,10 @@ RectTransform: 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: 257019179550429270} m_Father: {fileID: 257019181577240320} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -306,11 +306,11 @@ RectTransform: 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: 257019180101986795} - {fileID: 257019181577240320} m_Father: {fileID: 7131821417165215484} - m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -383,10 +383,10 @@ RectTransform: 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: 257019180622654292} m_Father: {fileID: 257019181563268737} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 1, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -479,9 +479,9 @@ RectTransform: 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: 7131821417165215484} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 1, y: 1} @@ -575,9 +575,9 @@ RectTransform: 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: 7131821417165215484} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 1, y: 1} @@ -651,20 +651,23 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 @@ -731,12 +734,12 @@ RectTransform: 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: 7131821417072393578} - {fileID: 7131821415452796888} - {fileID: 257019181563268737} m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 1, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -786,10 +789,10 @@ MonoBehaviour: type: 3} CurveField: {fileID: 3018914896466881005, guid: 168887bbd3de8c74eb3f06d3d46dda4e, type: 3} - Content: {fileID: 257019179596293679} WeaponGroupAssignment: {fileID: 8654742830357802168, guid: fbe6efeb205a68946af7a6f1cb8b9904, type: 3} - SelectedChild: {fileID: 0} + Content: {fileID: 257019179596293679} + DragParent: {fileID: 0} GameManager: {fileID: 0} --- !u!222 &7131821417165215473 CanvasRenderer: diff --git a/Assets/Prefabs/UI/Properties Panel/Property Button.prefab b/Assets/Prefabs/UI/Properties Panel/Property Button.prefab index 342160309..440b6cbc2 100644 --- a/Assets/Prefabs/UI/Properties Panel/Property Button.prefab +++ b/Assets/Prefabs/UI/Properties Panel/Property Button.prefab @@ -29,9 +29,9 @@ RectTransform: 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: 1613450655389604793} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -106,20 +106,23 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 @@ -187,11 +190,11 @@ RectTransform: 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: 7085828711539161696} - {fileID: 1613450655044732627} m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -319,9 +322,9 @@ RectTransform: 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: 1613450655389604793} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} diff --git a/Assets/Prefabs/UI/Properties Panel/Property List 1.prefab b/Assets/Prefabs/UI/Properties Panel/Property List 1.prefab index f776c2be8..e2c9744d6 100644 --- a/Assets/Prefabs/UI/Properties Panel/Property List 1.prefab +++ b/Assets/Prefabs/UI/Properties Panel/Property List 1.prefab @@ -29,9 +29,9 @@ RectTransform: 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: 2088721703295321218} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 1, y: 1} @@ -105,20 +105,23 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 @@ -186,12 +189,12 @@ RectTransform: 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: 6724740944390240338} - {fileID: 2088721703192714102} - {fileID: 2118837324186690404} m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -283,8 +286,12 @@ MonoBehaviour: type: 3} IncrementField: {fileID: 5486709585343280439, guid: 9c14c92a1a08b0a4fb4f6aa6f8504082, type: 3} + StatSheet: {fileID: 0} + CurveField: {fileID: 0} + WeaponGroupAssignment: {fileID: 0} Content: {fileID: 0} - SelectedChild: {fileID: 0} + DragParent: {fileID: 0} + GameManager: {fileID: 0} FoldoutIcon: {fileID: 6485458701090981364} FoldoutRotationDamping: 10 Button: {fileID: 2066200247} @@ -364,9 +371,9 @@ RectTransform: 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: 2088721703295321218} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -460,9 +467,9 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: -0.7071068, w: 0.7071068} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 2088721703295321218} - m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: -90} m_AnchorMin: {x: 1, y: 1} m_AnchorMax: {x: 1, y: 1} diff --git a/Assets/Prefabs/UI/Properties Panel/Property List.prefab b/Assets/Prefabs/UI/Properties Panel/Property List.prefab index a9a55945f..d99bbf8c3 100644 --- a/Assets/Prefabs/UI/Properties Panel/Property List.prefab +++ b/Assets/Prefabs/UI/Properties Panel/Property List.prefab @@ -29,9 +29,9 @@ RectTransform: 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: 2088721703295321218} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 1, y: 1} @@ -105,20 +105,23 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 @@ -186,12 +189,12 @@ RectTransform: 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: 6724740944390240338} - {fileID: 2088721703192714102} - {fileID: 2118837324186690404} m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -283,8 +286,12 @@ MonoBehaviour: type: 3} IncrementField: {fileID: 5486709585343280439, guid: 9c14c92a1a08b0a4fb4f6aa6f8504082, type: 3} + StatSheet: {fileID: 0} + CurveField: {fileID: 0} + WeaponGroupAssignment: {fileID: 0} Content: {fileID: 0} - SelectedChild: {fileID: 0} + DragParent: {fileID: 0} + GameManager: {fileID: 0} FoldoutIcon: {fileID: 6485458701090981364} FoldoutRotationDamping: 10 Button: {fileID: 2066200247} @@ -364,9 +371,9 @@ RectTransform: 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: 2088721703295321218} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -460,9 +467,9 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: -0.7071068, w: 0.7071068} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 2088721703295321218} - m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: -90} m_AnchorMin: {x: 1, y: 1} m_AnchorMax: {x: 1, y: 1} diff --git a/Assets/Prefabs/UI/Properties Panel/Property Section.prefab b/Assets/Prefabs/UI/Properties Panel/Property Section.prefab index f0629b763..2d2ccb36c 100644 --- a/Assets/Prefabs/UI/Properties Panel/Property Section.prefab +++ b/Assets/Prefabs/UI/Properties Panel/Property Section.prefab @@ -28,9 +28,9 @@ RectTransform: 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: 1026668114703092140} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -104,20 +104,23 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 @@ -162,10 +165,10 @@ RectTransform: 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: 1026668113805589148} m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} diff --git a/Assets/Prefabs/UI/Properties Panel/Simple/Attribute.prefab b/Assets/Prefabs/UI/Properties Panel/Simple/Attribute.prefab index dbad2c53d..c19b97642 100644 --- a/Assets/Prefabs/UI/Properties Panel/Simple/Attribute.prefab +++ b/Assets/Prefabs/UI/Properties Panel/Simple/Attribute.prefab @@ -28,9 +28,9 @@ RectTransform: 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: 4958798766822876479} - m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 0} @@ -60,13 +60,15 @@ MonoBehaviour: 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: efficient/organized m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: ef74c4c30ca5ced4489f28b914006aad, type: 2} - m_sharedMaterial: {fileID: 2100000, guid: 52bc194c171fd114e9a962923283262d, type: 2} + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} m_fontSharedMaterials: [] m_fontMaterial: {fileID: 0} m_fontMaterials: [] @@ -84,13 +86,12 @@ MonoBehaviour: m_fontColorGradientPreset: {fileID: 0} m_spriteAsset: {fileID: 0} m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: 0 m_overrideHtmlColors: 0 m_faceColor: serializedVersion: 2 rgba: 4294967295 - m_outlineColor: - serializedVersion: 2 - rgba: 4278190080 m_fontSize: 8 m_fontSizeBase: 8 m_fontWeight: 400 @@ -98,61 +99,42 @@ MonoBehaviour: m_fontSizeMin: 18 m_fontSizeMax: 72 m_fontStyle: 0 - m_textAlignment: 1028 + m_HorizontalAlignment: 4 + m_VerticalAlignment: 1024 + m_textAlignment: 65535 m_characterSpacing: 1.5 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 - m_firstOverflowCharacterIndex: -1 m_linkedTextComponent: {fileID: 0} - m_isLinkedTextComponent: 0 - m_isTextTruncated: 0 + parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 - m_ignoreRectMaskCulling: 0 - m_ignoreCulling: 1 m_horizontalMapping: 0 m_verticalMapping: 0 m_uvLineOffset: 0 m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 m_VertexBufferAutoSizeReduction: 1 - m_firstVisibleCharacter: 0 m_useMaxVisibleDescender: 1 m_pageToDisplay: 1 m_margin: {x: 0, y: 0, z: 0, w: 0} - m_textInfo: - textComponent: {fileID: 4958798766555897797} - characterCount: 19 - spriteCount: 0 - spaceCount: 0 - wordCount: 2 - linkCount: 0 - lineCount: 1 - pageCount: 1 - materialCount: 1 m_isUsingLegacyAnimationComponent: 0 m_isVolumetricText: 0 - m_spriteAnimator: {fileID: 0} m_hasFontAssetChanged: 0 - m_subTextObjects: - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} m_baseMaterial: {fileID: 0} m_maskOffset: {x: 0, y: 0, z: 0, w: 0} --- !u!1 &4958798766635474175 @@ -183,9 +165,9 @@ RectTransform: 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: 4958798768237988480} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -209,12 +191,14 @@ MonoBehaviour: m_GameObject: {fileID: 4958798766635474175} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} m_Color: {r: 1, g: 0.44583336, b: 0.050000012, a: 1} m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] @@ -227,6 +211,7 @@ MonoBehaviour: m_FillClockwise: 1 m_FillOrigin: 0 m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 --- !u!1 &4958798766822876478 GameObject: m_ObjectHideFlags: 0 @@ -255,13 +240,13 @@ RectTransform: 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: 4958798767036921042} - {fileID: 4958798767833643858} - {fileID: 4958798767855898775} - {fileID: 4958798766555897796} m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -277,7 +262,7 @@ MonoBehaviour: m_GameObject: {fileID: 4958798766822876478} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 1679637790, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} m_Name: m_EditorClassIdentifier: m_IgnoreLayout: 0 @@ -332,9 +317,9 @@ RectTransform: 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: 4958798766822876479} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 1, y: 1} @@ -364,6 +349,8 @@ MonoBehaviour: 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: [] @@ -389,13 +376,12 @@ MonoBehaviour: m_fontColorGradientPreset: {fileID: 0} m_spriteAsset: {fileID: 0} m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: 0 m_overrideHtmlColors: 0 m_faceColor: serializedVersion: 2 rgba: 4294967295 - m_outlineColor: - serializedVersion: 2 - rgba: 4278190080 m_fontSize: 20 m_fontSizeBase: 20 m_fontWeight: 400 @@ -403,61 +389,42 @@ MonoBehaviour: m_fontSizeMin: 18 m_fontSizeMax: 72 m_fontStyle: 0 - m_textAlignment: 258 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 256 + m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 - m_firstOverflowCharacterIndex: -1 m_linkedTextComponent: {fileID: 0} - m_isLinkedTextComponent: 0 - m_isTextTruncated: 0 + parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 - m_ignoreRectMaskCulling: 0 - m_ignoreCulling: 1 m_horizontalMapping: 0 m_verticalMapping: 0 m_uvLineOffset: 0 m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 m_VertexBufferAutoSizeReduction: 1 - m_firstVisibleCharacter: 0 m_useMaxVisibleDescender: 1 m_pageToDisplay: 1 m_margin: {x: 0, y: 0, z: 0, w: 0} - m_textInfo: - textComponent: {fileID: 4958798767036921043} - characterCount: 18 - spriteCount: 0 - spaceCount: 1 - wordCount: 1 - linkCount: 0 - lineCount: 1 - pageCount: 1 - materialCount: 1 m_isUsingLegacyAnimationComponent: 0 m_isVolumetricText: 0 - m_spriteAnimator: {fileID: 0} m_hasFontAssetChanged: 0 - m_subTextObjects: - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} m_baseMaterial: {fileID: 0} m_maskOffset: {x: 0, y: 0, z: 0, w: 0} --- !u!1 &4958798767101845646 @@ -488,9 +455,9 @@ RectTransform: 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: 4958798768306156651} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -514,12 +481,14 @@ MonoBehaviour: m_GameObject: {fileID: 4958798767101845646} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} m_Color: {r: 1, g: 0.44583336, b: 0.050000012, a: 1} m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] @@ -532,6 +501,7 @@ MonoBehaviour: m_FillClockwise: 1 m_FillOrigin: 0 m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 --- !u!1 &4958798767393056018 GameObject: m_ObjectHideFlags: 0 @@ -561,14 +531,14 @@ RectTransform: 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: 4958798767885421271} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.332, y: 0} - m_AnchorMax: {x: 0.332, y: 1} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: -2} - m_SizeDelta: {x: 0, y: 4} + m_SizeDelta: {x: 12.599999, y: 4} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &4958798767393056030 CanvasRenderer: @@ -587,12 +557,14 @@ MonoBehaviour: m_GameObject: {fileID: 4958798767393056018} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} m_Color: {r: 0.8, g: 0.9333333, 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: [] @@ -605,6 +577,7 @@ MonoBehaviour: m_FillClockwise: 1 m_FillOrigin: 0 m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 --- !u!114 &4958798767393056028 MonoBehaviour: m_ObjectHideFlags: 0 @@ -614,7 +587,7 @@ MonoBehaviour: m_GameObject: {fileID: 4958798767393056018} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: -1254083943, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Script: {fileID: 11500000, guid: 86710e43de46f6f4bac7c8e50813a599, type: 3} m_Name: m_EditorClassIdentifier: m_AspectMode: 2 @@ -646,12 +619,12 @@ RectTransform: 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: 4958798768237988480} - {fileID: 4958798768306156651} - {fileID: 4958798767966920791} m_Father: {fileID: 4958798766822876479} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0.5} m_AnchorMax: {x: 1, y: 0.5} @@ -667,11 +640,12 @@ MonoBehaviour: m_GameObject: {fileID: 4958798767833643857} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: -113659843, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Script: {fileID: 11500000, guid: 67db9e8f0e2ae9c40bc1e2b64352a6b4, type: 3} m_Name: m_EditorClassIdentifier: m_Navigation: m_Mode: 3 + m_WrapAround: 0 m_SelectOnUp: {fileID: 0} m_SelectOnDown: {fileID: 0} m_SelectOnLeft: {fileID: 0} @@ -681,17 +655,20 @@ MonoBehaviour: m_NormalColor: {r: 1, g: 1, b: 1, a: 1} m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} m_ColorMultiplier: 1 m_FadeDuration: 0.1 m_SpriteState: m_HighlightedSprite: {fileID: 0} m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} m_DisabledSprite: {fileID: 0} m_AnimationTriggers: m_NormalTrigger: Normal m_HighlightedTrigger: Highlighted m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted m_DisabledTrigger: Disabled m_Interactable: 0 m_TargetGraphic: {fileID: 0} @@ -733,9 +710,9 @@ RectTransform: 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: 4958798766822876479} - m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 0} @@ -765,13 +742,15 @@ MonoBehaviour: 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: easy-going/careless m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: ef74c4c30ca5ced4489f28b914006aad, type: 2} - m_sharedMaterial: {fileID: 2100000, guid: 006954f79490ab54bbc51d74b44d6e1c, type: 2} + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} m_fontSharedMaterials: [] m_fontMaterial: {fileID: 0} m_fontMaterials: [] @@ -789,13 +768,12 @@ MonoBehaviour: m_fontColorGradientPreset: {fileID: 0} m_spriteAsset: {fileID: 0} m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: 0 m_overrideHtmlColors: 0 m_faceColor: serializedVersion: 2 rgba: 4294967295 - m_outlineColor: - serializedVersion: 2 - rgba: 4278190080 m_fontSize: 8 m_fontSizeBase: 8 m_fontWeight: 400 @@ -803,61 +781,42 @@ MonoBehaviour: m_fontSizeMin: 18 m_fontSizeMax: 72 m_fontStyle: 0 - m_textAlignment: 1025 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 1024 + m_textAlignment: 65535 m_characterSpacing: 1.5 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 - m_firstOverflowCharacterIndex: -1 m_linkedTextComponent: {fileID: 0} - m_isLinkedTextComponent: 0 - m_isTextTruncated: 0 + parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 - m_ignoreRectMaskCulling: 0 - m_ignoreCulling: 1 m_horizontalMapping: 0 m_verticalMapping: 0 m_uvLineOffset: 0 m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 m_VertexBufferAutoSizeReduction: 1 - m_firstVisibleCharacter: 0 m_useMaxVisibleDescender: 1 m_pageToDisplay: 1 m_margin: {x: 0, y: 0, z: 0, w: 0} - m_textInfo: - textComponent: {fileID: 4958798767855898768} - characterCount: 19 - spriteCount: 0 - spaceCount: 0 - wordCount: 2 - linkCount: 0 - lineCount: 1 - pageCount: 1 - materialCount: 1 m_isUsingLegacyAnimationComponent: 0 m_isVolumetricText: 0 - m_spriteAnimator: {fileID: 0} m_hasFontAssetChanged: 0 - m_subTextObjects: - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} - - {fileID: 0} m_baseMaterial: {fileID: 0} m_maskOffset: {x: 0, y: 0, z: 0, w: 0} --- !u!1 &4958798767885421270 @@ -886,10 +845,10 @@ RectTransform: 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: 4958798767393056019} m_Father: {fileID: 4958798768237988480} - m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -924,9 +883,9 @@ RectTransform: 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: 4958798767833643858} - m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0.35} m_AnchorMax: {x: 1, y: 0.65} @@ -950,12 +909,14 @@ MonoBehaviour: m_GameObject: {fileID: 4958798767966920790} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} m_Color: {r: 0.8, g: 0.9333333, 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: [] @@ -968,6 +929,7 @@ MonoBehaviour: m_FillClockwise: 1 m_FillOrigin: 0 m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 --- !u!1 &4958798768237988487 GameObject: m_ObjectHideFlags: 0 @@ -997,12 +959,12 @@ RectTransform: 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: 4958798768341589565} - {fileID: 4958798766635474168} - {fileID: 4958798767885421271} m_Father: {fileID: 4958798767833643858} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0.35} m_AnchorMax: {x: 1, y: 0.65} @@ -1026,12 +988,14 @@ MonoBehaviour: m_GameObject: {fileID: 4958798768237988487} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} m_Color: {r: 0, g: 0.06416668, b: 0.154, a: 1} m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] @@ -1044,6 +1008,7 @@ MonoBehaviour: m_FillClockwise: 1 m_FillOrigin: 0 m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 --- !u!114 &4958798768237988481 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1053,7 +1018,7 @@ MonoBehaviour: m_GameObject: {fileID: 4958798768237988487} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: -1200242548, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} m_Name: m_EditorClassIdentifier: m_ShowMaskGraphic: 0 @@ -1083,10 +1048,10 @@ RectTransform: 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: 4958798767101845647} m_Father: {fileID: 4958798767833643858} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0.25} m_AnchorMax: {x: 1, y: 0.75} @@ -1121,9 +1086,9 @@ RectTransform: 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: 4958798768237988480} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -1147,12 +1112,14 @@ MonoBehaviour: m_GameObject: {fileID: 4958798768341589564} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} m_Color: {r: 0, g: 0.25294134, b: 0.6, a: 1} m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] @@ -1165,3 +1132,4 @@ MonoBehaviour: m_FillClockwise: 1 m_FillOrigin: 0 m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 diff --git a/Assets/Prefabs/UI/Properties Panel/Simple/Bool Field.prefab b/Assets/Prefabs/UI/Properties Panel/Simple/Bool Field.prefab index d005cdba5..d5cefa04e 100644 --- a/Assets/Prefabs/UI/Properties Panel/Simple/Bool Field.prefab +++ b/Assets/Prefabs/UI/Properties Panel/Simple/Bool Field.prefab @@ -29,11 +29,11 @@ RectTransform: 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: 7661950295498381397} - {fileID: 7661950294707789146} m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -116,10 +116,10 @@ RectTransform: 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: 7661950295217243554} m_Father: {fileID: 7661950294707789146} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -193,10 +193,10 @@ RectTransform: 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: 7661950294137596689} m_Father: {fileID: 7661950293931311387} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -313,9 +313,9 @@ RectTransform: 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: 7661950294137596689} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.2, y: 0.2} m_AnchorMax: {x: 0.8, y: 0.8} @@ -389,9 +389,9 @@ RectTransform: 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: 7661950293931311387} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -465,20 +465,23 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 diff --git a/Assets/Prefabs/UI/Properties Panel/Simple/Button Field.prefab b/Assets/Prefabs/UI/Properties Panel/Simple/Button Field.prefab index 0d208cbde..39a19b9cc 100644 --- a/Assets/Prefabs/UI/Properties Panel/Simple/Button Field.prefab +++ b/Assets/Prefabs/UI/Properties Panel/Simple/Button Field.prefab @@ -28,9 +28,9 @@ RectTransform: 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: 790814198576895811} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -104,20 +104,23 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 @@ -165,10 +168,10 @@ RectTransform: 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: 790814197411605233} m_Father: {fileID: 6566784227922820063} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -306,11 +309,11 @@ RectTransform: 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: 6566784228232816309} - {fileID: 790814198576895811} m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -395,9 +398,9 @@ RectTransform: 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: 6566784227922820063} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -471,20 +474,23 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 diff --git a/Assets/Prefabs/UI/Properties Panel/Simple/Enum Field.prefab b/Assets/Prefabs/UI/Properties Panel/Simple/Enum Field.prefab index aded92530..a426e807a 100644 --- a/Assets/Prefabs/UI/Properties Panel/Simple/Enum Field.prefab +++ b/Assets/Prefabs/UI/Properties Panel/Simple/Enum Field.prefab @@ -28,9 +28,9 @@ RectTransform: 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: 1444953513611246322} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -104,20 +104,23 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 @@ -165,11 +168,11 @@ RectTransform: 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: 1444953513591056483} - {fileID: 1444953514355799430} m_Father: {fileID: 1444953514731475974} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -307,9 +310,9 @@ RectTransform: 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: 1444953514731475974} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -383,20 +386,23 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 @@ -462,9 +468,9 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: -0.7071068, w: 0.7071068} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1444953513611246322} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: -90} m_AnchorMin: {x: 1, y: 0.5} m_AnchorMax: {x: 1, y: 0.5} @@ -538,11 +544,11 @@ RectTransform: 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: 1444953513817938006} - {fileID: 1444953513611246322} m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} diff --git a/Assets/Prefabs/UI/Properties Panel/Simple/Increment Field.prefab b/Assets/Prefabs/UI/Properties Panel/Simple/Increment Field.prefab index db1ffa153..1009b9d25 100644 --- a/Assets/Prefabs/UI/Properties Panel/Simple/Increment Field.prefab +++ b/Assets/Prefabs/UI/Properties Panel/Simple/Increment Field.prefab @@ -30,9 +30,9 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 0.75, y: 0.75, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 2544338102157427055} - m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 1, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -162,12 +162,12 @@ RectTransform: 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: 3841991687815987397} - {fileID: 7863247503782211248} - {fileID: 8483308900631515678} m_Father: {fileID: 6770904480725292323} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -223,9 +223,9 @@ RectTransform: 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: 6770904480725292323} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -299,20 +299,23 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 @@ -379,11 +382,11 @@ RectTransform: 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: 6770904480229951561} - {fileID: 2544338102157427055} m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -470,9 +473,9 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 0.75, y: 0.75, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 2544338102157427055} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 1, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -603,9 +606,9 @@ RectTransform: 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: 2544338102157427055} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -679,20 +682,23 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 diff --git a/Assets/Prefabs/UI/Properties Panel/Simple/Input Field.prefab b/Assets/Prefabs/UI/Properties Panel/Simple/Input Field.prefab index d5784a8cb..29050392e 100644 --- a/Assets/Prefabs/UI/Properties Panel/Simple/Input Field.prefab +++ b/Assets/Prefabs/UI/Properties Panel/Simple/Input Field.prefab @@ -29,11 +29,11 @@ RectTransform: 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: 23155009713813574} - {fileID: 8734896053364945145} m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -117,9 +117,9 @@ RectTransform: 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: 23155009655760172} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -193,20 +193,23 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 @@ -271,10 +274,10 @@ RectTransform: 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: 5938949450847760329} m_Father: {fileID: 23155009655760172} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -328,11 +331,11 @@ RectTransform: 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: 5938949451508194215} - {fileID: 5938949451316023666} m_Father: {fileID: 5938949450847760329} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -383,10 +386,10 @@ RectTransform: 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: 5938949450758544618} m_Father: {fileID: 8734896053364945145} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -525,10 +528,13 @@ MonoBehaviour: m_GlobalFontAsset: {fileID: 11400000, guid: 9dcd07b95faae7641a3ff6fccab43c32, type: 2} m_OnFocusSelectAll: 1 m_ResetOnDeActivation: 1 + m_KeepTextSelectionVisible: 0 m_RestoreOriginalTextOnEscape: 1 m_isRichTextEditingAllowed: 0 m_LineLimit: 0 + isAlert: 0 m_InputValidator: {fileID: 0} + m_ShouldActivateOnSelect: 1 --- !u!114 &1618696626055083017 MonoBehaviour: m_ObjectHideFlags: 0 @@ -577,9 +583,9 @@ RectTransform: 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: 5938949450758544618} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -653,20 +659,23 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 0 + m_TextWrappingMode: 3 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 1 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 @@ -712,9 +721,9 @@ RectTransform: 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: 5938949450758544618} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -788,20 +797,23 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 0 + m_TextWrappingMode: 0 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 1 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 diff --git a/Assets/Prefabs/UI/Properties Panel/Simple/Progress Field.prefab b/Assets/Prefabs/UI/Properties Panel/Simple/Progress Field.prefab index 1360e00de..d57409ee5 100644 --- a/Assets/Prefabs/UI/Properties Panel/Simple/Progress Field.prefab +++ b/Assets/Prefabs/UI/Properties Panel/Simple/Progress Field.prefab @@ -28,9 +28,9 @@ RectTransform: 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: 8181761431199775037} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -103,9 +103,9 @@ RectTransform: 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: 8626591645481506733} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0.25} m_AnchorMax: {x: 1, y: 0.75} @@ -179,11 +179,11 @@ RectTransform: 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: 3301729265189646952} - {fileID: 8626591645481506733} m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -267,9 +267,9 @@ RectTransform: 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: 3301729265155698787} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -343,20 +343,23 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 @@ -420,10 +423,10 @@ RectTransform: 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: 1684719062263664779} m_Father: {fileID: 8626591645481506733} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0.5} m_AnchorMax: {x: 1, y: 0.5} @@ -458,11 +461,11 @@ RectTransform: 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: 4052465884214141673} - {fileID: 8181761431199775037} m_Father: {fileID: 3301729265155698787} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} diff --git a/Assets/Prefabs/UI/Properties Panel/Simple/Property Label.prefab b/Assets/Prefabs/UI/Properties Panel/Simple/Property Label.prefab index 77133101c..f7f4fa9e9 100644 --- a/Assets/Prefabs/UI/Properties Panel/Simple/Property Label.prefab +++ b/Assets/Prefabs/UI/Properties Panel/Simple/Property Label.prefab @@ -29,9 +29,9 @@ RectTransform: 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: 2677123916507168719} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -105,20 +105,23 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 @@ -185,11 +188,11 @@ RectTransform: 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: 2677123916028371621} - {fileID: 6602089867192183683} m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -273,9 +276,9 @@ RectTransform: 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: 2677123916507168719} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -349,20 +352,23 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 diff --git a/Assets/Prefabs/UI/Properties Panel/Simple/Property.prefab b/Assets/Prefabs/UI/Properties Panel/Simple/Property.prefab index 06e3eca26..f53bd6914 100644 --- a/Assets/Prefabs/UI/Properties Panel/Simple/Property.prefab +++ b/Assets/Prefabs/UI/Properties Panel/Simple/Property.prefab @@ -29,9 +29,9 @@ RectTransform: 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: 9159917045172241900} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -107,20 +107,23 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 @@ -187,10 +190,10 @@ RectTransform: 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: 9159917045079857286} m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} diff --git a/Assets/Prefabs/UI/Properties Panel/Simple/Ranged Float Field.prefab b/Assets/Prefabs/UI/Properties Panel/Simple/Ranged Float Field.prefab index 3a13a994a..c2f68c328 100644 --- a/Assets/Prefabs/UI/Properties Panel/Simple/Ranged Float Field.prefab +++ b/Assets/Prefabs/UI/Properties Panel/Simple/Ranged Float Field.prefab @@ -28,9 +28,9 @@ RectTransform: 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: 7146463267720429741} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0.5} m_AnchorMax: {x: 1, y: 0.5} @@ -101,10 +101,10 @@ RectTransform: 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: 3436413162678517982} m_Father: {fileID: 7146463267720429741} - m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0.5} m_AnchorMax: {x: 1, y: 0.5} @@ -139,9 +139,9 @@ RectTransform: 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: 7282863425963355709} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -212,10 +212,10 @@ RectTransform: 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: 287045173602649995} m_Father: {fileID: 7146463267720429741} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0.5} m_AnchorMax: {x: 1, y: 0.5} @@ -251,9 +251,9 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 0.75, y: 0.75, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 3222204141728529077} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -342,11 +342,11 @@ RectTransform: 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: 4127690186274268520} - {fileID: 7146463267720429741} m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -450,9 +450,9 @@ RectTransform: 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: 4127690186169542499} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -526,20 +526,23 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 @@ -605,12 +608,12 @@ RectTransform: 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: 3217779461217105385} - {fileID: 7282863425963355709} - {fileID: 3222204141728529077} m_Father: {fileID: 4127690186169542499} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} diff --git a/Assets/Prefabs/UI/Properties Panel/Text Button.prefab b/Assets/Prefabs/UI/Properties Panel/Text Button.prefab index 65d6df6d7..8f001bcfe 100644 --- a/Assets/Prefabs/UI/Properties Panel/Text Button.prefab +++ b/Assets/Prefabs/UI/Properties Panel/Text Button.prefab @@ -31,9 +31,9 @@ RectTransform: 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: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -107,20 +107,23 @@ MonoBehaviour: m_VerticalAlignment: 256 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 0 + m_TextWrappingMode: 0 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 diff --git a/Assets/Prefabs/UI/Tab Button Primary.prefab b/Assets/Prefabs/UI/Tab Button Primary.prefab index fa0e184d4..1795e41df 100644 --- a/Assets/Prefabs/UI/Tab Button Primary.prefab +++ b/Assets/Prefabs/UI/Tab Button Primary.prefab @@ -29,9 +29,9 @@ RectTransform: 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: 7200536746924797989} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -105,20 +105,23 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 @@ -179,10 +182,10 @@ RectTransform: 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: 7200536746924797989} m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -249,6 +252,7 @@ MonoBehaviour: m_EditorClassIdentifier: m_Navigation: m_Mode: 3 + m_WrapAround: 0 m_SelectOnUp: {fileID: 0} m_SelectOnDown: {fileID: 0} m_SelectOnLeft: {fileID: 0} @@ -307,10 +311,10 @@ RectTransform: 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: 6493174789768221420} m_Father: {fileID: 5318229203699776728} - m_RootOrder: 0 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/Aetheria.inputactions b/Assets/Resources/Aetheria.inputactions index c5e3153a6..fe1ef6086 100644 --- a/Assets/Resources/Aetheria.inputactions +++ b/Assets/Resources/Aetheria.inputactions @@ -1,5 +1,6 @@ { "name": "Aetheria", + "version": 1, "maps": [ { "name": "Player", @@ -12,7 +13,8 @@ "expectedControlType": "Vector2", "processors": "", "interactions": "", - "initialStateCheck": true + "initialStateCheck": true, + "priority": 0 }, { "name": "Look", @@ -21,7 +23,8 @@ "expectedControlType": "Vector2", "processors": "", "interactions": "", - "initialStateCheck": true + "initialStateCheck": true, + "priority": 0 }, { "name": "Minimap Zoom", @@ -30,7 +33,8 @@ "expectedControlType": "Button", "processors": "", "interactions": "", - "initialStateCheck": false + "initialStateCheck": false, + "priority": 0 }, { "name": "Target Reticle", @@ -39,7 +43,8 @@ "expectedControlType": "Button", "processors": "", "interactions": "", - "initialStateCheck": false + "initialStateCheck": false, + "priority": 0 }, { "name": "Target Previous", @@ -48,7 +53,8 @@ "expectedControlType": "Button", "processors": "", "interactions": "", - "initialStateCheck": false + "initialStateCheck": false, + "priority": 0 }, { "name": "Target Next", @@ -57,7 +63,8 @@ "expectedControlType": "Button", "processors": "", "interactions": "", - "initialStateCheck": false + "initialStateCheck": false, + "priority": 0 }, { "name": "Target Nearest", @@ -66,7 +73,18 @@ "expectedControlType": "Button", "processors": "", "interactions": "", - "initialStateCheck": false + "initialStateCheck": false, + "priority": 0 + }, + { + "name": "Cycle Target Item", + "type": "Button", + "id": "3f9a2f0a-6e3f-4a53-9f5e-1a9c1e6d9f7b", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false, + "priority": 0 }, { "name": "Toggle Heatsinks", @@ -75,7 +93,8 @@ "expectedControlType": "Button", "processors": "", "interactions": "", - "initialStateCheck": false + "initialStateCheck": false, + "priority": 0 }, { "name": "Toggle Shield", @@ -84,7 +103,8 @@ "expectedControlType": "Button", "processors": "", "interactions": "", - "initialStateCheck": false + "initialStateCheck": false, + "priority": 0 }, { "name": "Toggle Stance", @@ -93,7 +113,8 @@ "expectedControlType": "Button", "processors": "", "interactions": "", - "initialStateCheck": false + "initialStateCheck": false, + "priority": 0 }, { "name": "Override Shutdown", @@ -102,7 +123,8 @@ "expectedControlType": "Button", "processors": "", "interactions": "", - "initialStateCheck": false + "initialStateCheck": false, + "priority": 0 }, { "name": "Ping", @@ -111,7 +133,8 @@ "expectedControlType": "Button", "processors": "", "interactions": "", - "initialStateCheck": false + "initialStateCheck": false, + "priority": 0 }, { "name": "Hide UI", @@ -120,7 +143,8 @@ "expectedControlType": "Button", "processors": "", "interactions": "", - "initialStateCheck": false + "initialStateCheck": false, + "priority": 0 }, { "name": "Tractor Beam", @@ -129,7 +153,8 @@ "expectedControlType": "", "processors": "", "interactions": "", - "initialStateCheck": true + "initialStateCheck": true, + "priority": 0 }, { "name": "Turn", @@ -138,23 +163,88 @@ "expectedControlType": "Axis", "processors": "", "interactions": "", - "initialStateCheck": true + "initialStateCheck": true, + "priority": 0 + }, + { + "name": "Face Aim", + "type": "Button", + "id": "6d5bd565-8c0e-4789-9d51-177dc0ec8e11", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false, + "priority": 0 + }, + { + "name": "Toggle Face Aim", + "type": "Button", + "id": "4067c72f-3e3d-4d7b-a8b5-356cab9793fc", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false, + "priority": 0 } ], "bindings": [ { - "name": "", + "name": "Gamepad Move", "id": "978bfe49-cc26-4a3d-ab7b-7d7a29327403", - "path": "/leftStick", + "path": "2DVector(mode=2)", + "interactions": "", + "processors": "", + "groups": "", + "action": "Move", + "isComposite": true, + "isPartOfComposite": false + }, + { + "name": "up", + "id": "e9c57b4d-1cd8-4b2f-93d6-1745a37cabc9", + "path": "/leftStick/up", "interactions": "", "processors": "", "groups": ";Gamepad", "action": "Move", "isComposite": false, - "isPartOfComposite": false + "isPartOfComposite": true }, { - "name": "WASD", + "name": "down", + "id": "05f19282-8364-4ae0-b5c3-d471c10601a7", + "path": "/leftStick/down", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Move", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "left", + "id": "1ce4a07f-43af-4e82-a631-dbb43c8191d3", + "path": "/leftShoulder", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Move", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "right", + "id": "bd1aed7e-b80b-4341-a550-4ef10bacf4b4", + "path": "/rightShoulder", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Move", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "W S Q E", "id": "00ca640b-d935-4593-8157-c05846ea39b3", "path": "Dpad(mode=1)", "interactions": "", @@ -189,7 +279,7 @@ { "name": "left", "id": "d2581a9b-1d11-4566-b27d-b92aff5fabbc", - "path": "/a", + "path": "/q", "interactions": "", "processors": "", "groups": ";Keyboard&Mouse", @@ -200,7 +290,7 @@ { "name": "right", "id": "fcfe95b8-67b9-4526-84b5-5d0bc98d6400", - "path": "/d", + "path": "/e", "interactions": "", "processors": "", "groups": ";Keyboard&Mouse", @@ -307,6 +397,17 @@ "isComposite": false, "isPartOfComposite": false }, + { + "name": "", + "id": "8c2d5e77-4b18-4f0b-9a2e-6d3f7c1a5e90", + "path": "/j", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Cycle Target Item", + "isComposite": false, + "isPartOfComposite": false + }, { "name": "", "id": "71ac6088-1e18-4810-86be-1179918dd4a2", @@ -398,7 +499,7 @@ { "name": "negative", "id": "8536ca60-1fed-4f29-8060-04d46cfffcab", - "path": "/q", + "path": "/a", "interactions": "", "processors": "", "groups": "", @@ -409,13 +510,57 @@ { "name": "positive", "id": "19c175bf-d4e6-4626-8bee-91e0c473a94b", - "path": "/e", + "path": "/d", "interactions": "", "processors": "", "groups": "", "action": "Turn", "isComposite": false, "isPartOfComposite": true + }, + { + "name": "", + "id": "fdff8f1f-0824-49bd-b09a-c1b792f16299", + "path": "/leftStick/x", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Turn", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "1ee2fadd-3db4-45e6-8fa4-7a621ef7d165", + "path": "/leftShift", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Face Aim", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "e9520d95-0458-439b-a37c-84c45237e110", + "path": "/capsLock", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "Toggle Face Aim", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "596ed367-be34-4951-9aac-d8caa57b411f", + "path": "/leftStickPress", + "interactions": "", + "processors": "", + "groups": ";Gamepad", + "action": "Toggle Face Aim", + "isComposite": false, + "isPartOfComposite": false } ] }, @@ -430,7 +575,8 @@ "expectedControlType": "Vector2", "processors": "", "interactions": "", - "initialStateCheck": true + "initialStateCheck": true, + "priority": 0 }, { "name": "Submit", @@ -439,7 +585,8 @@ "expectedControlType": "Button", "processors": "", "interactions": "", - "initialStateCheck": false + "initialStateCheck": false, + "priority": 0 }, { "name": "Cancel", @@ -448,7 +595,8 @@ "expectedControlType": "Button", "processors": "", "interactions": "", - "initialStateCheck": false + "initialStateCheck": false, + "priority": 0 }, { "name": "Point", @@ -457,7 +605,8 @@ "expectedControlType": "Vector2", "processors": "", "interactions": "", - "initialStateCheck": false + "initialStateCheck": false, + "priority": 0 }, { "name": "Click", @@ -466,7 +615,8 @@ "expectedControlType": "Button", "processors": "", "interactions": "", - "initialStateCheck": false + "initialStateCheck": false, + "priority": 0 }, { "name": "ScrollWheel", @@ -475,7 +625,8 @@ "expectedControlType": "Vector2", "processors": "", "interactions": "", - "initialStateCheck": false + "initialStateCheck": false, + "priority": 0 }, { "name": "MiddleClick", @@ -484,7 +635,8 @@ "expectedControlType": "", "processors": "", "interactions": "", - "initialStateCheck": false + "initialStateCheck": false, + "priority": 0 }, { "name": "RightClick", @@ -493,7 +645,8 @@ "expectedControlType": "", "processors": "", "interactions": "", - "initialStateCheck": false + "initialStateCheck": false, + "priority": 0 }, { "name": "Drag", @@ -502,7 +655,8 @@ "expectedControlType": "Vector2", "processors": "", "interactions": "", - "initialStateCheck": true + "initialStateCheck": true, + "priority": 0 } ], "bindings": [ @@ -893,7 +1047,8 @@ "expectedControlType": "Button", "processors": "", "interactions": "", - "initialStateCheck": false + "initialStateCheck": false, + "priority": 0 }, { "name": "Galaxy Map", @@ -902,7 +1057,8 @@ "expectedControlType": "Button", "processors": "", "interactions": "", - "initialStateCheck": false + "initialStateCheck": false, + "priority": 0 }, { "name": "Inventory", @@ -911,7 +1067,8 @@ "expectedControlType": "Button", "processors": "", "interactions": "", - "initialStateCheck": false + "initialStateCheck": false, + "priority": 0 }, { "name": "Main Menu", @@ -920,7 +1077,8 @@ "expectedControlType": "Button", "processors": "", "interactions": "", - "initialStateCheck": false + "initialStateCheck": false, + "priority": 0 }, { "name": "Input Screen", @@ -929,7 +1087,8 @@ "expectedControlType": "Button", "processors": "", "interactions": "", - "initialStateCheck": false + "initialStateCheck": false, + "priority": 0 }, { "name": "Interact", @@ -938,7 +1097,8 @@ "expectedControlType": "Button", "processors": "", "interactions": "", - "initialStateCheck": false + "initialStateCheck": false, + "priority": 0 } ], "bindings": [ diff --git a/Assets/Resources/Geonames/Australia.csv b/Assets/Resources/Geonames/Australia.csv deleted file mode 100644 index 05587efaa..000000000 --- a/Assets/Resources/Geonames/Australia.csv +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:01bb478f4433dc42d5533e5030ef103ad163deca6bc40fb412025acd12e35c73 -size 442795 diff --git a/Assets/Resources/Geonames/Congo.csv b/Assets/Resources/Geonames/Congo.csv deleted file mode 100644 index 5d0f0b66e..000000000 --- a/Assets/Resources/Geonames/Congo.csv +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c84ff44083e4f0d9d9314e7b7095ed4ce2955905f26e7926faa09ed222655729 -size 506722 diff --git a/Assets/Resources/Geonames/Germany.csv b/Assets/Resources/Geonames/Germany.csv deleted file mode 100644 index beb35d1d0..000000000 --- a/Assets/Resources/Geonames/Germany.csv +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:73e4e7231d448879d0a6d8524b3200be75fc8f5011a70cfd670b0897d07eca10 -size 1284208 diff --git a/Assets/Resources/Geonames/India.csv b/Assets/Resources/Geonames/India.csv deleted file mode 100644 index 6b4eab5c6..000000000 --- a/Assets/Resources/Geonames/India.csv +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:96c66414822c43a5451ce1910c1e545dedb224b0f3e79bc54f945dd484afc6a2 -size 3229324 diff --git a/Assets/Resources/Geonames/India.csv.meta b/Assets/Resources/Geonames/India.csv.meta deleted file mode 100644 index 3f8c176b4..000000000 --- a/Assets/Resources/Geonames/India.csv.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: ca62f6d649360184aaa975c2716dfb27 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Resources/Geonames/Iran.csv b/Assets/Resources/Geonames/Iran.csv deleted file mode 100644 index 8d2754642..000000000 --- a/Assets/Resources/Geonames/Iran.csv +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b70fbbe6b4832eb1a3f35844bd87c0eb479fc77b6e59d6600b64cbbe7cc1bf16 -size 1073119 diff --git a/Assets/Resources/Geonames/Iran.csv.meta b/Assets/Resources/Geonames/Iran.csv.meta deleted file mode 100644 index 507664280..000000000 --- a/Assets/Resources/Geonames/Iran.csv.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: e2d60c7158f6a01418d78e46c5845729 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Resources/Geonames/Japan.csv b/Assets/Resources/Geonames/Japan.csv deleted file mode 100644 index d106ec364..000000000 --- a/Assets/Resources/Geonames/Japan.csv +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d58dc0227cc6e3b7622726c155031467b6d7314623c7e3a33aad8ce1462b2c5b -size 1031132 diff --git a/Assets/Resources/Geonames/Japan.csv.meta b/Assets/Resources/Geonames/Japan.csv.meta deleted file mode 100644 index f46c1022d..000000000 --- a/Assets/Resources/Geonames/Japan.csv.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 5dd450a6f5ec92d49871674b33509135 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Resources/Geonames/Mexico.csv b/Assets/Resources/Geonames/Mexico.csv deleted file mode 100644 index 517228e8f..000000000 --- a/Assets/Resources/Geonames/Mexico.csv +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9a654b8451a08a0c769712f4fb1d96c3c661457a88bb57ec4288eab36eab7ec1 -size 633432 diff --git a/Assets/Resources/Geonames/Mexico.csv.meta b/Assets/Resources/Geonames/Mexico.csv.meta deleted file mode 100644 index 2b0283e78..000000000 --- a/Assets/Resources/Geonames/Mexico.csv.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: b75e17ea31f6a62488628bf9605bd48c -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Resources/Geonames/Russia.csv b/Assets/Resources/Geonames/Russia.csv deleted file mode 100644 index 6344ff571..000000000 --- a/Assets/Resources/Geonames/Russia.csv +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f4ed581eef681e5357a14efe4e6a1fc52370def7ada6565f4b953e410fa7f39e -size 2375319 diff --git a/Assets/Resources/Geonames/Russia.csv.meta b/Assets/Resources/Geonames/Russia.csv.meta deleted file mode 100644 index 7794294e9..000000000 --- a/Assets/Resources/Geonames/Russia.csv.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 5c1aee30ccf3a1e44bddeb4d550edbf0 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Resources/Geonames/Swahili.csv b/Assets/Resources/Geonames/Swahili.csv deleted file mode 100644 index 678065eed..000000000 --- a/Assets/Resources/Geonames/Swahili.csv +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fb0f44e7948c637a2b0f9e0ca098b2f4689d065fe6484723acf0bfa34a26d0a5 -size 501002 diff --git a/Assets/Resources/Geonames/Swahili.csv.meta b/Assets/Resources/Geonames/Swahili.csv.meta deleted file mode 100644 index 94bfbb4f8..000000000 --- a/Assets/Resources/Geonames/Swahili.csv.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 63e21276398c8b0449e01d97a088add1 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Resources/Geonames/Thailand.csv b/Assets/Resources/Geonames/Thailand.csv deleted file mode 100644 index 400b8f1a9..000000000 --- a/Assets/Resources/Geonames/Thailand.csv +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:888c929f0e29728369448e6981bb8a043c49610f4c4390a2cb549bf6b494d3dc -size 143084 diff --git a/Assets/Resources/Geonames/Thailand.csv.meta b/Assets/Resources/Geonames/Thailand.csv.meta deleted file mode 100644 index fd5bd346a..000000000 --- a/Assets/Resources/Geonames/Thailand.csv.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 2923f8bd3a2f0fb4084f64138e6d793d -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Resources/Geonames/USA.csv b/Assets/Resources/Geonames/USA.csv deleted file mode 100644 index 05bd91140..000000000 --- a/Assets/Resources/Geonames/USA.csv +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:314a30df2033795f04738589c660991e4310f1bfe0578c71bda2a9a72d8a617f -size 954928 diff --git a/Assets/Resources/Geonames/USA.csv.meta b/Assets/Resources/Geonames/USA.csv.meta deleted file mode 100644 index b59cdf567..000000000 --- a/Assets/Resources/Geonames/USA.csv.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: a06c0e26f73d51f489303deadad77030 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Resources/Geonames/bad-words.txt b/Assets/Resources/Geonames/bad-words.txt deleted file mode 100644 index 5013fea9d..000000000 --- a/Assets/Resources/Geonames/bad-words.txt +++ /dev/null @@ -1,1384 +0,0 @@ - -abbo -abo -abortion -abuse -addict -addicts -adult -africa -african -alla -allah -alligatorbait -amateur -american -anal -analannie -analsex -angie -angry -anus -arab -arabs -areola -argie -aroused -arse -arsehole -asian -ass -assassin -assassinate -assassination -assault -assbagger -assblaster -assclown -asscowboy -asses -assfuck -assfucker -asshat -asshole -assholes -asshore -assjockey -asskiss -asskisser -assklown -asslick -asslicker -asslover -assman -assmonkey -assmunch -assmuncher -asspacker -asspirate -asspuppies -assranger -asswhore -asswipe -athletesfoot -attack -australian -babe -babies -backdoor -backdoorman -backseat -badfuck -balllicker -balls -ballsack -banging -baptist -barelylegal -barf -barface -barfface -bast -bastard -bazongas -bazooms -beaner -beast -beastality -beastial -beastiality -beatoff -beat-off -beatyourmeat -beaver -bestial -bestiality -bi -biatch -bible -bicurious -bigass -bigbastard -bigbutt -bigger -bisexual -bi-sexual -bitch -bitcher -bitches -bitchez -bitchin -bitching -bitchslap -bitchy -biteme -black -blackman -blackout -blacks -blind -blow -blowjob -boang -bogan -bohunk -bollick -bollock -bomb -bombers -bombing -bombs -bomd -bondage -boner -bong -boob -boobies -boobs -booby -boody -boom -boong -boonga -boonie -booty -bootycall -bountybar -bra -brea5t -breast -breastjob -breastlover -breastman -brothel -bugger -buggered -buggery -bullcrap -bulldike -bulldyke -bullshit -bumblefuck -bumfuck -bunga -bunghole -buried -burn -butchbabes -butchdike -butchdyke -butt -buttbang -butt-bang -buttface -buttfuck -butt-fuck -buttfucker -butt-fucker -buttfuckers -butt-fuckers -butthead -buttman -buttmunch -buttmuncher -buttpirate -buttplug -buttstain -byatch -cacker -cameljockey -cameltoe -canadian -cancer -carpetmuncher -carruth -catholic -catholics -cemetery -chav -cherrypopper -chickslick -children's -chin -chinaman -chinamen -chinese -chink -chinky -choad -chode -christ -christian -church -cigarette -cigs -clamdigger -clamdiver -clit -clitoris -clogwog -cocaine -cock -cockblock -cockblocker -cockcowboy -cockfight -cockhead -cockknob -cocklicker -cocklover -cocknob -cockqueen -cockrider -cocksman -cocksmith -cocksmoker -cocksucer -cocksuck -cocksucked -cocksucker -cocksucking -cocktail -cocktease -cocky -cohee -coitus -color -colored -coloured -commie -communist -condom -conservative -conspiracy -coolie -cooly -coon -coondog -copulate -cornhole -corruption -cra5h -crabs -crack -crackpipe -crackwhore -crack-whore -crap -crapola -crapper -crappy -crash -creamy -crime -crimes -criminal -criminals -crotch -crotchjockey -crotchmonkey -crotchrot -cum -cumbubble -cumfest -cumjockey -cumm -cummer -cumming -cumquat -cumqueen -cumshot -cunilingus -cunillingus -cunn -cunnilingus -cunntt -cunt -cunteyed -cuntfuck -cuntfucker -cuntlick -cuntlicker -cuntlicking -cuntsucker -cybersex -cyberslimer -dago -dahmer -dammit -damn -damnation -damnit -darkie -darky -datnigga -dead -deapthroat -death -deepthroat -defecate -dego -demon -deposit -desire -destroy -deth -devil -devilworshipper -dick -dickbrain -dickforbrains -dickhead -dickless -dicklick -dicklicker -dickman -dickwad -dickweed -diddle -die -died -dies -dike -dildo -dingleberry -dink -dipshit -dipstick -dirty -disease -diseases -disturbed -dive -dix -dixiedike -dixiedyke -doggiestyle -doggystyle -dong -doodoo -doo-doo -doom -dope -dragqueen -dragqween -dripdick -drug -drunk -drunken -dumb -dumbass -dumbbitch -dumbfuck -dyefly -dyke -easyslut -eatballs -eatme -eatpussy -ecstacy -ejaculate -ejaculated -ejaculating -ejaculation -enema -enemy -erect -erection -ero -escort -ethiopian -ethnic -european -evl -excrement -execute -executed -execution -executioner -explosion -facefucker -faeces -fag -fagging -faggot -fagot -failed -failure -fairies -fairy -faith -fannyfucker -fart -farted -farting -farty -fastfuck -fat -fatah -fatass -fatfuck -fatfucker -fatso -fckcum -fear -feces -felatio -felch -felcher -felching -fellatio -feltch -feltcher -feltching -fetish -fight -filipina -filipino -fingerfood -fingerfuck -fingerfucked -fingerfucker -fingerfuckers -fingerfucking -fire -firing -fister -fistfuck -fistfucked -fistfucker -fistfucking -fisting -flange -flasher -flatulence -floo -flydie -flydye -fok -fondle -footaction -footfuck -footfucker -footlicker -footstar -fore -foreskin -forni -fornicate -foursome -fourtwenty -fraud -freakfuck -freakyfucker -freefuck -fu -fubar -fuc -fucck -fuck -fucka -fuckable -fuckbag -fuckbuddy -fucked -fuckedup -fucker -fuckers -fuckface -fuckfest -fuckfreak -fuckfriend -fuckhead -fuckher -fuckin -fuckina -fucking -fuckingbitch -fuckinnuts -fuckinright -fuckit -fuckknob -fuckme -fuckmehard -fuckmonkey -fuckoff -fuckpig -fucks -fucktard -fuckwhore -fuckyou -fudgepacker -fugly -fuk -fuks -funeral -funfuck -fungus -fuuck -gangbang -gangbanged -gangbanger -gangsta -gatorbait -gay -gaymuthafuckinwhore -gaysex -geez -geezer -geni -genital -german -getiton -gin -ginzo -gipp -girls -givehead -glazeddonut -gob -god -godammit -goddamit -goddammit -goddamn -goddamned -goddamnes -goddamnit -goddamnmuthafucker -goldenshower -gonorrehea -gonzagas -gook -gotohell -goy -goyim -greaseball -gringo -groe -gross -grostulation -gubba -gummer -gun -gyp -gypo -gypp -gyppie -gyppo -gyppy -hamas -handjob -hapa -harder -hardon -harem -headfuck -headlights -hebe -heeb -hell -henhouse -heroin -herpes -heterosexual -hijack -hijacker -hijacking -hillbillies -hindoo -hiscock -hitler -hitlerism -hitlerist -hiv -ho -hobo -hodgie -hoes -hole -holestuffer -homicide -homo -homobangers -homosexual -honger -honk -honkers -honkey -honky -hook -hooker -hookers -hooters -hore -hork -horn -horney -horniest -horny -horseshit -hosejob -hoser -hostage -hotdamn -hotpussy -hottotrot -hummer -husky -hussy -hustler -hymen -hymie -iblowu -idiot -ikey -illegal -incest -insest -intercourse -interracial -intheass -inthebuff -israel -israeli -israel's -italiano -itch -jackass -jackoff -jackshit -jacktheripper -jade -jap -japanese -japcrap -jebus -jeez -jerkoff -jesus -jesuschrist -jew -jewish -jiga -jigaboo -jigg -jigga -jiggabo -jigger -jiggy -jihad -jijjiboo -jimfish -jism -jiz -jizim -jizjuice -jizm -jizz -jizzim -jizzum -joint -juggalo -jugs -junglebunny -kaffer -kaffir -kaffre -kafir -kanake -kid -kigger -kike -kill -killed -killer -killing -kills -kink -kinky -kissass -kkk -knife -knockers -kock -kondum -koon -kotex -krap -krappy -kraut -kum -kumbubble -kumbullbe -kummer -kumming -kumquat -kums -kunilingus -kunnilingus -kunt -ky -kyke -lactate -laid -lapdance -latin -lesbain -lesbayn -lesbian -lesbin -lesbo -lez -lezbe -lezbefriends -lezbo -lezz -lezzo -liberal -libido -licker -lickme -lies -limey -limpdick -limy -lingerie -liquor -livesex -loadedgun -lolita -looser -loser -lotion -lovebone -lovegoo -lovegun -lovejuice -lovemuscle -lovepistol -loverocket -lowlife -lsd -lubejob -lucifer -luckycammeltoe -lugan -lynch -macaca -mad -mafia -magicwand -mams -manhater -manpaste -marijuana -mastabate -mastabater -masterbate -masterblaster -mastrabator -masturbate -masturbating -mattressprincess -meatbeatter -meatrack -meth -mexican -mgger -mggor -mickeyfinn -mideast -milf -minority -mockey -mockie -mocky -mofo -moky -moles -molest -molestation -molester -molestor -moneyshot -mooncricket -mormon -moron -moslem -mosshead -mothafuck -mothafucka -mothafuckaz -mothafucked -mothafucker -mothafuckin -mothafucking -mothafuckings -motherfuck -motherfucked -motherfucker -motherfuckin -motherfucking -motherfuckings -motherlovebone -muff -muffdive -muffdiver -muffindiver -mufflikcer -mulatto -muncher -munt -murder -murderer -muslim -naked -narcotic -nasty -nastybitch -nastyho -nastyslut -nastywhore -nazi -necro -negro -negroes -negroid -negro's -nig -niger -nigerian -nigerians -nigg -nigga -niggah -niggaracci -niggard -niggarded -niggarding -niggardliness -niggardliness's -niggardly -niggards -niggard's -niggaz -nigger -niggerhead -niggerhole -niggers -nigger's -niggle -niggled -niggles -niggling -nigglings -niggor -niggur -niglet -nignog -nigr -nigra -nigre -nip -nipple -nipplering -nittit -nlgger -nlggor -nofuckingway -nook -nookey -nookie -noonan -nooner -nude -nudger -nuke -nutfucker -nymph -ontherag -oral -orga -orgasim -orgasm -orgies -orgy -osama -paki -palesimian -palestinian -pansies -pansy -panti -panties -payo -pearlnecklace -peck -pecker -peckerwood -pee -peehole -pee-pee -peepshow -peepshpw -pendy -penetration -peni5 -penile -penis -penises -penthouse -period -perv -phonesex -phuk -phuked -phuking -phukked -phukking -phungky -phuq -pi55 -picaninny -piccaninny -pickaninny -piker -pikey -piky -pimp -pimped -pimper -pimpjuic -pimpjuice -pimpsimp -pindick -piss -pissed -pisser -pisses -pisshead -pissin -pissing -pissoff -pistol -pixie -pixy -playboy -playgirl -pocha -pocho -pocketpool -pohm -polack -pom -pommie -pommy -poo -poon -poontang -poop -pooper -pooperscooper -pooping -poorwhitetrash -popimp -porchmonkey -porn -pornflick -pornking -porno -pornography -pornprincess -pot -poverty -premature -pric -prick -prickhead -primetime -propaganda -pros -prostitute -protestant -pu55i -pu55y -pube -pubic -pubiclice -pud -pudboy -pudd -puddboy -puke -puntang -purinapricness -puss -pussie -pussies -pussy -pussycat -pussyeater -pussyfucker -pussylicker -pussylips -pussylover -pussypounder -pusy -quashie -queef -queer -quickie -quim -ra8s -rabbi -racial -racist -radical -radicals -raghead -randy -rape -raped -raper -rapist -rearend -rearentry -rectum -redlight -redneck -reefer -reestie -refugee -reject -remains -rentafuck -republican -rere -retard -retarded -ribbed -rigger -rimjob -rimming -roach -robber -roundeye -rump -russki -russkie -sadis -sadom -samckdaddy -sandm -sandnigger -satan -scag -scallywag -scat -schlong -screw -screwyou -scrotum -scum -semen -seppo -servant -sex -sexed -sexfarm -sexhound -sexhouse -sexing -sexkitten -sexpot -sexslave -sextogo -sextoy -sextoys -sexual -sexually -sexwhore -sexy -sexymoma -sexy-slim -shag -shaggin -shagging -shat -shav -shawtypimp -sheeney -shhit -shinola -shit -shitcan -shitdick -shite -shiteater -shited -shitface -shitfaced -shitfit -shitforbrains -shitfuck -shitfucker -shitfull -shithapens -shithappens -shithead -shithouse -shiting -shitlist -shitola -shitoutofluck -shits -shitstain -shitted -shitter -shitting -shitty -shoot -shooting -shortfuck -showtime -sick -sissy -sixsixsix -sixtynine -sixtyniner -skank -skankbitch -skankfuck -skankwhore -skanky -skankybitch -skankywhore -skinflute -skum -skumbag -slant -slanteye -slapper -slaughter -slav -slave -slavedriver -sleezebag -sleezeball -slideitin -slime -slimeball -slimebucket -slopehead -slopey -slopy -slut -sluts -slutt -slutting -slutty -slutwear -slutwhore -smack -smackthemonkey -smut -snatch -snatchpatch -snigger -sniggered -sniggering -sniggers -snigger's -sniper -snot -snowback -snownigger -sob -sodom -sodomise -sodomite -sodomize -sodomy -sonofabitch -sonofbitch -sooty -sos -soviet -spaghettibender -spaghettinigger -spank -spankthemonkey -sperm -spermacide -spermbag -spermhearder -spermherder -spic -spick -spig -spigotty -spik -spit -spitter -splittail -spooge -spreadeagle -spunk -spunky -squaw -stagg -stiffy -strapon -stringer -stripclub -stroke -stroking -stupid -stupidfuck -stupidfucker -suck -suckdick -sucker -suckme -suckmyass -suckmydick -suckmytit -suckoff -suicide -swallow -swallower -swalow -swastika -sweetness -syphilis -taboo -taff -tampon -tang -tantra -tarbaby -tard -teat -terror -terrorist -teste -testicle -testicles -thicklips -thirdeye -thirdleg -threesome -threeway -timbernigger -tinkle -tit -titbitnipply -titfuck -titfucker -titfuckin -titjob -titlicker -titlover -tits -tittie -titties -titty -tnt -toilet -tongethruster -tongue -tonguethrust -tonguetramp -tortur -torture -tosser -towelhead -trailertrash -tramp -trannie -tranny -transexual -transsexual -transvestite -triplex -trisexual -trojan -trots -tuckahoe -tunneloflove -turd -turnon -twat -twink -twinkie -twobitwhore -uck -uk -unfuckable -upskirt -uptheass -upthebutt -urinary -urinate -urine -usama -uterus -vagina -vaginal -vatican -vibr -vibrater -vibrator -vietcong -violence -virgin -virginbreaker -vomit -vulva -wab -wank -wanker -wanking -waysted -weapon -weenie -weewee -welcher -welfare -wetb -wetback -wetspot -whacker -whash -whigger -whiskey -whiskeydick -whiskydick -whit -whitenigger -whites -whitetrash -whitey -whiz -whop -whore -whorefucker -whorehouse -wigger -willie -williewanker -willy -wn -wog -women's -wop -wtf -wuss -wuzzie -xtc -xxx -yankee -yellowman -zigabo -zipperhead diff --git a/Assets/Resources/Geonames/bad-words.txt.meta b/Assets/Resources/Geonames/bad-words.txt.meta deleted file mode 100644 index ff605e0c5..000000000 --- a/Assets/Resources/Geonames/bad-words.txt.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 790ef350f8658b04480e0645919a21fa -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Resources/Geonames/pleiades.csv b/Assets/Resources/Geonames/pleiades.csv deleted file mode 100644 index 581d44ff7..000000000 --- a/Assets/Resources/Geonames/pleiades.csv +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:45b0dbc07d492958b26de3695427076d270bdd0525ab45c415be72560ebccb5f -size 400944 diff --git a/Assets/Resources/Geonames/pleiades.csv.meta b/Assets/Resources/Geonames/pleiades.csv.meta deleted file mode 100644 index dc0edb8f1..000000000 --- a/Assets/Resources/Geonames/pleiades.csv.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: b532694a5ec3cc6458d42aa2835537b5 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Resources/Settings.asset b/Assets/Resources/Settings.asset index b2a9b0ed2..46bee7272 100644 --- a/Assets/Resources/Settings.asset +++ b/Assets/Resources/Settings.asset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:347752dd66c3d250eddde8f6f78a17d7369d562bd698a0c8099e941f7c0825c8 -size 13163 +oid sha256:7f09c54dfdb87dffd76fa92365d62c53ce333457b89ccf8ead09093ffffedc42 +size 12525 diff --git a/Assets/Scenes/ARPG.unity b/Assets/Scenes/ARPG.unity index c4bd71fcf..4d5b15473 100644 --- a/Assets/Scenes/ARPG.unity +++ b/Assets/Scenes/ARPG.unity @@ -409,13 +409,13 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 23420356} serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalRotation: {x: 0.7071068, y: 0, z: 0, w: 0.7071068} + m_LocalPosition: {x: 0, y: -5, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] - m_Father: {fileID: 1037490739} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} --- !u!23 &23420359 MeshRenderer: m_ObjectHideFlags: 0 @@ -436,6 +436,8 @@ MeshRenderer: m_RayTracingAccelStructBuildFlagsOverride: 0 m_RayTracingAccelStructBuildFlags: 1 m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -457,9 +459,11 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 + m_MaskInteraction: 0 m_AdditionalVertexStreams: {fileID: 0} --- !u!33 &23420360 MeshFilter: @@ -701,6 +705,8 @@ MeshRenderer: m_RayTracingAccelStructBuildFlagsOverride: 0 m_RayTracingAccelStructBuildFlags: 1 m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -722,9 +728,11 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 + m_MaskInteraction: 0 m_AdditionalVertexStreams: {fileID: 0} --- !u!33 &45636168 MeshFilter: @@ -1137,6 +1145,7 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -1148,7 +1157,7 @@ MonoBehaviour: m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_ActiveFontFeatures: 6e72656b + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 @@ -1597,6 +1606,7 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -1608,7 +1618,7 @@ MonoBehaviour: m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_ActiveFontFeatures: 6e72656b + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 @@ -1638,81 +1648,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 125165634} m_CullTransparentMesh: 0 ---- !u!1 &126433269 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 126433270} - - component: {fileID: 126433272} - - component: {fileID: 126433271} - m_Layer: 5 - m_Name: Icon - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &126433270 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 126433269} - m_LocalRotation: {x: 0, y: 0, z: 0.7071068, w: 0.7071068} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 691045497} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 90} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 8, y: 0} - m_SizeDelta: {x: 14, y: -2} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &126433271 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 126433269} - 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: 1} - m_RaycastTarget: 0 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 0 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 21300000, guid: 55bed7a5ff978bf4c8cbda9971585df0, type: 3} - m_Type: 0 - m_PreserveAspect: 1 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &126433272 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 126433269} - m_CullTransparentMesh: 0 --- !u!1 &134113270 GameObject: m_ObjectHideFlags: 0 @@ -1821,6 +1756,7 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -1832,7 +1768,7 @@ MonoBehaviour: m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_ActiveFontFeatures: 6e72656b + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 @@ -2269,6 +2205,81 @@ MonoBehaviour: m_FlexibleWidth: -1 m_FlexibleHeight: -1 m_LayoutPriority: 1 +--- !u!1001 &177891521 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 775333809} + m_Modifications: + - target: {fileID: 1337198075554910, guid: 25c7aa9ad705fe143a4d71c1c8deb7d4, type: 3} + propertyPath: m_Name + value: TinyExplosion + objectReference: {fileID: 0} + - target: {fileID: 4441266138185142, guid: 25c7aa9ad705fe143a4d71c1c8deb7d4, type: 3} + propertyPath: m_LocalPosition.x + value: -4.2346153 + objectReference: {fileID: 0} + - target: {fileID: 4441266138185142, guid: 25c7aa9ad705fe143a4d71c1c8deb7d4, type: 3} + propertyPath: m_LocalPosition.y + value: 2.42 + objectReference: {fileID: 0} + - target: {fileID: 4441266138185142, guid: 25c7aa9ad705fe143a4d71c1c8deb7d4, type: 3} + propertyPath: m_LocalPosition.z + value: -21.91896 + objectReference: {fileID: 0} + - target: {fileID: 4441266138185142, guid: 25c7aa9ad705fe143a4d71c1c8deb7d4, type: 3} + propertyPath: m_LocalRotation.w + value: 0.7071068 + objectReference: {fileID: 0} + - target: {fileID: 4441266138185142, guid: 25c7aa9ad705fe143a4d71c1c8deb7d4, type: 3} + propertyPath: m_LocalRotation.x + value: -0.7071068 + objectReference: {fileID: 0} + - target: {fileID: 4441266138185142, guid: 25c7aa9ad705fe143a4d71c1c8deb7d4, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4441266138185142, guid: 25c7aa9ad705fe143a4d71c1c8deb7d4, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4441266138185142, guid: 25c7aa9ad705fe143a4d71c1c8deb7d4, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: -90 + objectReference: {fileID: 0} + - target: {fileID: 4441266138185142, guid: 25c7aa9ad705fe143a4d71c1c8deb7d4, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4441266138185142, guid: 25c7aa9ad705fe143a4d71c1c8deb7d4, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 25c7aa9ad705fe143a4d71c1c8deb7d4, type: 3} +--- !u!114 &177891522 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 8662091027736085435, guid: 25c7aa9ad705fe143a4d71c1c8deb7d4, + type: 3} + m_PrefabInstance: {fileID: 177891521} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1281fe44325f9b548aa42dc331b17266, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!4 &177891523 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4441266138185142, guid: 25c7aa9ad705fe143a4d71c1c8deb7d4, + type: 3} + m_PrefabInstance: {fileID: 177891521} + m_PrefabAsset: {fileID: 0} --- !u!1 &178733679 GameObject: m_ObjectHideFlags: 0 @@ -2497,6 +2508,8 @@ MeshRenderer: m_RayTracingAccelStructBuildFlagsOverride: 0 m_RayTracingAccelStructBuildFlags: 1 m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -2518,9 +2531,11 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 + m_MaskInteraction: 0 m_AdditionalVertexStreams: {fileID: 0} --- !u!33 &195655953 MeshFilter: @@ -2885,6 +2900,7 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -2896,7 +2912,7 @@ MonoBehaviour: m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_ActiveFontFeatures: 6e72656b + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 @@ -3410,6 +3426,7 @@ MonoBehaviour: InfiniteAmmoIcon: {fileID: 2044077503} CooldownFill: {fileID: 757740693} HeatFill: {fileID: 2060807771} + SelectedIndicator: {fileID: 0} --- !u!114 &232470601 MonoBehaviour: m_ObjectHideFlags: 0 @@ -3835,6 +3852,7 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -3846,7 +3864,7 @@ MonoBehaviour: m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_ActiveFontFeatures: 6e72656b + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 @@ -4117,6 +4135,8 @@ MeshRenderer: m_RayTracingAccelStructBuildFlagsOverride: 0 m_RayTracingAccelStructBuildFlags: 1 m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -4138,9 +4158,11 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 + m_MaskInteraction: 0 m_AdditionalVertexStreams: {fileID: 0} --- !u!33 &259676750 MeshFilter: @@ -4843,6 +4865,7 @@ RectTransform: m_Children: - {fileID: 2352149240727418666} - {fileID: 410701128} + - {fileID: 568886950} - {fileID: 1558520822} - {fileID: 1396909587} - {fileID: 1556666354} @@ -5058,142 +5081,6 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 100, y: 100} m_Pivot: {x: 0.5, y: 0.5} ---- !u!1 &383790463 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 383790464} - - component: {fileID: 383790466} - - component: {fileID: 383790465} - m_Layer: 5 - m_Name: Strafe RPM - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &383790464 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 383790463} - 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: 691045497} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 8, y: 0} - m_SizeDelta: {x: -16, y: -4} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &383790465 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 383790463} - 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: 0 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_text: 18,000 - m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 3fb7d873bb5a7944bb9a7c73c430c44b, type: 2} - m_sharedMaterial: {fileID: 2100000, guid: b9d2f6c9804cec1489502dcc1c19ec54, 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: 10 - m_fontSizeBase: 10 - m_fontWeight: 400 - m_enableAutoSizing: 1 - m_fontSizeMin: 6 - m_fontSizeMax: 16 - m_fontStyle: 0 - m_HorizontalAlignment: 1 - 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: 1 - 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: 1 - 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 &383790466 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 383790463} - m_CullTransparentMesh: 0 --- !u!1 &388927454 GameObject: m_ObjectHideFlags: 0 @@ -5289,6 +5176,7 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -5300,7 +5188,7 @@ MonoBehaviour: m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_ActiveFontFeatures: 6e72656b + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 @@ -5695,6 +5583,7 @@ MonoBehaviour: m_VerticalAlignment: 256 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -5706,7 +5595,7 @@ MonoBehaviour: m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_ActiveFontFeatures: 6e72656b + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 @@ -5953,7 +5842,6 @@ MonoBehaviour: OverrideIconBlinkSpeed: 0 ShieldIcon: {fileID: 0} HeatsinkBackground: {fileID: 0} - AetherDriveUi: {fileID: 0} EnergyLabel: {fileID: 0} CockpitTemperatureLabel: {fileID: 0} RadiatorTemperatureLabel: {fileID: 0} @@ -5962,18 +5850,12 @@ MonoBehaviour: VisibilityLabel: {fileID: 0} HullDurabilityLabel: {fileID: 0} DistanceLabel: {fileID: 0} - ForwardRPMLabel: {fileID: 0} - StrafeRPMLabel: {fileID: 0} - TurnRPMLabel: {fileID: 0} SensorCooldownFill: {fileID: 0} EnergyFill: {fileID: 0} HullDurabilityFill: {fileID: 0} HeatstrokeMeterFill: {fileID: 0} HypothermiaMeterFill: {fileID: 0} HeatstrokeLimitFill: {fileID: 0} - ForwardRPMFill: {fileID: 0} - StrafeRPMFill: {fileID: 0} - TurnRPMFill: {fileID: 0} --- !u!114 &410701130 MonoBehaviour: m_ObjectHideFlags: 0 @@ -7714,6 +7596,7 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -7725,7 +7608,7 @@ MonoBehaviour: m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_ActiveFontFeatures: 6e72656b + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 @@ -8154,7 +8037,7 @@ Camera: m_Depth: 0 m_CullingMask: serializedVersion: 2 - m_Bits: 5632 + m_Bits: 5120 m_RenderingPath: 1 m_TargetTexture: {fileID: 8400000, guid: 06ec5ef8a5830fc44b1ac1a6e123add5, type: 2} m_TargetDisplay: 0 @@ -8358,6 +8241,7 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -8369,7 +8253,7 @@ MonoBehaviour: m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_ActiveFontFeatures: 00000000 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 @@ -8732,6 +8616,8 @@ MeshRenderer: m_RayTracingAccelStructBuildFlagsOverride: 0 m_RayTracingAccelStructBuildFlags: 1 m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -8753,9 +8639,11 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 + m_MaskInteraction: 0 m_AdditionalVertexStreams: {fileID: 0} --- !u!33 &542243549 MeshFilter: @@ -9080,6 +8968,82 @@ RectTransform: type: 3} m_PrefabInstance: {fileID: 2279630454421103832} m_PrefabAsset: {fileID: 0} +--- !u!1 &568886949 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 568886950} + - component: {fileID: 568886952} + - component: {fileID: 568886951} + m_Layer: 5 + m_Name: Debug Info Panel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &568886950 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 568886949} + 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: 1731988778} + m_Father: {fileID: 346000247} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 16, y: -800} + m_SizeDelta: {x: 220, y: 120} + m_Pivot: {x: 0, y: 0} +--- !u!114 &568886951 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 568886949} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 2100000, guid: 46238d909c2092c4eb873278d84c6ce8, type: 2} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 0 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 84d126f984de5fd42ac66361c00f830c, type: 3} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 0.5 +--- !u!222 &568886952 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 568886949} + m_CullTransparentMesh: 0 --- !u!1 &569895571 GameObject: m_ObjectHideFlags: 0 @@ -9528,11 +9492,6 @@ PrefabInstance: propertyPath: m_SizeDelta.y value: 90.91 objectReference: {fileID: 0} - - target: {fileID: 4533226043457584178, guid: 3d8d9cbf10b12214e98891c1f03c1e99, - type: 3} - propertyPath: InGame - value: 1 - objectReference: {fileID: 0} - target: {fileID: 4533226043457584178, guid: 3d8d9cbf10b12214e98891c1f03c1e99, type: 3} propertyPath: CloudRenderer @@ -10233,9 +10192,6 @@ MonoBehaviour: TintDisplay: {fileID: 218215088} InfluenceDisplay: {fileID: 1390179643} Scale: 1 - Position: - x: 0 - y: 0 IconSize: 32 --- !u!1001 &642590526 PrefabInstance: @@ -11058,6 +11014,8 @@ MeshRenderer: m_RayTracingAccelStructBuildFlagsOverride: 0 m_RayTracingAccelStructBuildFlags: 1 m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -11079,9 +11037,11 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 + m_MaskInteraction: 0 m_AdditionalVertexStreams: {fileID: 0} --- !u!33 &677960094 MeshFilter: @@ -11091,105 +11051,6 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 677960091} m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &691045496 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 691045497} - - component: {fileID: 691045500} - - component: {fileID: 691045499} - - component: {fileID: 691045498} - m_Layer: 5 - m_Name: Strafe - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &691045497 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 691045496} - 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: 1542388328} - - {fileID: 126433270} - - {fileID: 383790464} - m_Father: {fileID: 1735948312} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 1} ---- !u!114 &691045498 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 691045496} - 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.011764706} - 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: 1 - 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 &691045499 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 691045496} - m_CullTransparentMesh: 1 ---- !u!114 &691045500 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 691045496} - 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: 16 - m_FlexibleWidth: -1 - m_FlexibleHeight: -1 - m_LayoutPriority: 1 --- !u!1 &693745763 GameObject: m_ObjectHideFlags: 0 @@ -11394,6 +11255,7 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -11405,7 +11267,7 @@ MonoBehaviour: m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_ActiveFontFeatures: 6e72656b + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 @@ -11512,6 +11374,8 @@ MeshRenderer: m_RayTracingAccelStructBuildFlagsOverride: 0 m_RayTracingAccelStructBuildFlags: 1 m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -11533,9 +11397,11 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 + m_MaskInteraction: 0 m_AdditionalVertexStreams: {fileID: 0} --- !u!33 &708399897 MeshFilter: @@ -11768,105 +11634,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 719842150} m_CullTransparentMesh: 1 ---- !u!1 &723697980 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 723697981} - - component: {fileID: 723697984} - - component: {fileID: 723697983} - - component: {fileID: 723697982} - m_Layer: 5 - m_Name: Forward - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &723697981 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 723697980} - 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: 1946192591} - - {fileID: 1463754850} - - {fileID: 1558236436} - m_Father: {fileID: 1735948312} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 1} ---- !u!114 &723697982 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 723697980} - 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.011764706} - 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: 1 - 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 &723697983 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 723697980} - m_CullTransparentMesh: 1 ---- !u!114 &723697984 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 723697980} - 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: 16 - m_FlexibleWidth: -1 - m_FlexibleHeight: -1 - m_LayoutPriority: 1 --- !u!1 &732687889 GameObject: m_ObjectHideFlags: 0 @@ -12046,6 +11813,7 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -12057,7 +11825,7 @@ MonoBehaviour: m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_ActiveFontFeatures: 6e72656b + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 @@ -12116,7 +11884,6 @@ RectTransform: m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 1735948312} - {fileID: 232470597} m_Father: {fileID: 60313920} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -12509,6 +12276,94 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0, y: 0} +--- !u!1 &775333807 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 775333809} + - component: {fileID: 775333808} + m_Layer: 0 + m_Name: Impact Feedback + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &775333808 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 775333807} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bfdc38a81d00b0347bb55ad6469535ff, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::ImpactFeedback + HullEffect: {fileID: 177891522} + IntensityScale: 10 + MinEffectScale: 0.3 + Impulse: + m_ImpulseChannel: 1 + m_ImpulseShape: 0 + m_CustomImpulseShape: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + m_ImpulseDuration: 0.2 + m_ImpulseType: 3 + m_DissipationRate: 0 + m_RawSignal: {fileID: 0} + m_AmplitudeGain: 1 + m_FrequencyGain: 1 + m_RepeatMode: 0 + m_Randomize: 1 + m_TimeEnvelope: + m_AttackShape: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + m_DecayShape: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + m_AttackTime: 0 + m_SustainTime: 0.2 + m_DecayTime: 0.7 + m_ScaleWithImpact: 1 + m_HoldForever: 0 + m_ImpactRadius: 100 + m_DirectionMode: 0 + m_DissipationMode: 2 + m_DissipationDistance: 100 + m_PropagationSpeed: 343 +--- !u!4 &775333809 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 775333807} + serializedVersion: 2 + 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: 177891523} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &776416423 GameObject: m_ObjectHideFlags: 0 @@ -13167,6 +13022,7 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -13178,7 +13034,7 @@ MonoBehaviour: m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_ActiveFontFeatures: 6e72656b + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 @@ -13434,6 +13290,7 @@ MonoBehaviour: m_VerticalAlignment: 256 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -13445,7 +13302,7 @@ MonoBehaviour: m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_ActiveFontFeatures: 00000000 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 @@ -13738,6 +13595,7 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -13749,7 +13607,7 @@ MonoBehaviour: m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_ActiveFontFeatures: 6e72656b + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 @@ -13799,81 +13657,6 @@ MonoBehaviour: m_FlexibleWidth: -1 m_FlexibleHeight: -1 m_LayoutPriority: 1 ---- !u!1 &853400335 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 853400336} - - component: {fileID: 853400338} - - component: {fileID: 853400337} - m_Layer: 5 - m_Name: Icon - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &853400336 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 853400335} - 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: 1214607512} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 8, y: 0} - m_SizeDelta: {x: 10, y: -4} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &853400337 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 853400335} - 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: 1} - m_RaycastTarget: 0 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 0 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 21300000, guid: 4b33557baae0da54a96c0aa97bf752ee, type: 3} - m_Type: 0 - m_PreserveAspect: 1 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &853400338 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 853400335} - m_CullTransparentMesh: 0 --- !u!1 &861158450 GameObject: m_ObjectHideFlags: 0 @@ -14010,6 +13793,7 @@ GameObject: m_Component: - component: {fileID: 887677623} - component: {fileID: 887677622} + - component: {fileID: 887677624} m_Layer: 0 m_Name: Third Person Rig m_TagString: Untagged @@ -14072,6 +13856,29 @@ Transform: - {fileID: 1319157835} m_Father: {fileID: 1665127616} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &887677624 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 887677621} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 00b2d199b96b516448144ab30fb26aed, type: 3} + m_Name: + m_EditorClassIdentifier: Cinemachine::Cinemachine.CinemachineImpulseListener + m_ApplyAfter: 2 + m_ChannelMask: 1 + m_Gain: 1 + m_Use2DDistance: 0 + m_UseCameraSpace: 1 + m_ReactionSettings: + m_SecondaryNoise: {fileID: 0} + m_AmplitudeGain: 1 + m_FrequencyGain: 1 + m_Duration: 1 + m_NoiseOffsets: {x: 0, y: 0, z: 0} --- !u!1 &906767441 GameObject: m_ObjectHideFlags: 0 @@ -14206,6 +14013,7 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -14217,7 +14025,7 @@ MonoBehaviour: m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_ActiveFontFeatures: 6e72656b + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 @@ -14343,6 +14151,7 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -14354,7 +14163,7 @@ MonoBehaviour: m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_ActiveFontFeatures: 6e72656b + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 @@ -14510,6 +14319,8 @@ MeshRenderer: m_RayTracingAccelStructBuildFlagsOverride: 0 m_RayTracingAccelStructBuildFlags: 1 m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -14531,9 +14342,11 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 + m_MaskInteraction: 0 m_AdditionalVertexStreams: {fileID: 0} --- !u!33 &926083405 MeshFilter: @@ -14699,6 +14512,7 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -14710,7 +14524,7 @@ MonoBehaviour: m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_ActiveFontFeatures: 6e72656b + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 @@ -14832,142 +14646,6 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 56, y: 56} m_Pivot: {x: 0, y: 0} ---- !u!1 &932757481 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 932757482} - - component: {fileID: 932757484} - - component: {fileID: 932757483} - m_Layer: 5 - m_Name: Turn RPM - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &932757482 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 932757481} - 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: 1214607512} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 8, y: 0} - m_SizeDelta: {x: -16, y: -4} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &932757483 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 932757481} - 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: 0 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_text: 18,000 - m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 3fb7d873bb5a7944bb9a7c73c430c44b, type: 2} - m_sharedMaterial: {fileID: 2100000, guid: b9d2f6c9804cec1489502dcc1c19ec54, 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: 10 - m_fontSizeBase: 10 - m_fontWeight: 400 - m_enableAutoSizing: 1 - m_fontSizeMin: 6 - m_fontSizeMax: 16 - m_fontStyle: 0 - m_HorizontalAlignment: 1 - 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: 1 - 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: 1 - 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 &932757484 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 932757481} - m_CullTransparentMesh: 0 --- !u!1 &933815652 GameObject: m_ObjectHideFlags: 0 @@ -15094,6 +14772,8 @@ MeshRenderer: m_RayTracingAccelStructBuildFlagsOverride: 0 m_RayTracingAccelStructBuildFlags: 1 m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -15115,9 +14795,11 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 + m_MaskInteraction: 0 m_AdditionalVertexStreams: {fileID: 0} --- !u!33 &936330464 MeshFilter: @@ -15244,6 +14926,8 @@ MeshRenderer: m_RayTracingAccelStructBuildFlagsOverride: 0 m_RayTracingAccelStructBuildFlags: 1 m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -15265,9 +14949,11 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 + m_MaskInteraction: 0 m_AdditionalVertexStreams: {fileID: 0} --- !u!33 &945347194 MeshFilter: @@ -16545,12 +16231,6 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Settings: {fileID: 11400000, guid: cd2344e2001a37544aab0960c164d4ff, type: 2} - Sensitivity: - x: -0.001 - y: 0.001 - Credits: 100000000 - TargetSpottedBlinkFrequency: 20 - TargetSpottedBlinkOffset: -0.25 DeathPostTransitionTime: 1 DeathPost: {fileID: 803284856} HeatstrokePost: {fileID: 1404901906} @@ -16585,6 +16265,7 @@ MonoBehaviour: FriendlyTargetIndicator: {fileID: 332734009} ViewDot: {fileID: 146394778} LockIndicator: {fileID: 1876420642} + IncomingLockIndicatorDistance: 30 Crosshairs: - {fileID: 1914685583} - {fileID: 1284802339} @@ -16594,6 +16275,7 @@ MonoBehaviour: HitMarkerDuration: 0.25 SchematicDisplay: {fileID: 7628189704109037584} TargetSchematicDisplay: {fileID: 410701129} + DebugInfoText: {fileID: 1731988779} TargetIndicator: {fileID: 1556666357} TargetHitpointsFill: {fileID: 1691348884} TargetVisibilityFill: {fileID: 1715434759} @@ -16605,7 +16287,6 @@ MonoBehaviour: NoShieldColor: {r: 0.6, g: 0.6, b: 0.6, a: 1} ShieldIcon: {fileID: 21300000, guid: 2a61aee34fcf7e640a093cb4c4fa56bc, type: 3} NoShieldIcon: {fileID: 21300000, guid: bc1017eafc2627f4aaa4e247f14347fd, type: 3} - IntroDuration: 10 --- !u!4 &1009503730 Transform: m_ObjectHideFlags: 0 @@ -16641,7 +16322,7 @@ MonoBehaviour: Settings: {fileID: 11400000, guid: cd2344e2001a37544aab0960c164d4ff, type: 2} ZoneRoot: {fileID: 2095699057} SectorBrushes: {fileID: 1037490739} - SectorBoundaryBrush: {fileID: 1476765550} + AmbientLight: {fileID: 23420357} SceneCamera: {fileID: 887677622} FogCameras: - {fileID: 559840917} @@ -16652,93 +16333,125 @@ MonoBehaviour: - {fileID: 488792362} - {fileID: 970624071} - {fileID: 2095741464} - FogMaterial: {fileID: 2100000, guid: 2ff39f5d101241043ba1dcde19d92f77, type: 2} - FogFarFadeFraction: 0.125 FarPlaneDistanceMultiplier: 1 AsteroidMeshes: - Mesh: {fileID: 4300004, guid: bdb4c719a85f3f2419f6c573dd1daf15, type: 3} Material: {fileID: 2100000, guid: ce975d2d2ccd0914b9260b7d66319aaa, type: 2} + Radius: 1.5022775 - Mesh: {fileID: 4300004, guid: 19fa9aa3b5fee244fb007d58c351be01, type: 3} Material: {fileID: 2100000, guid: 443981befe15f604aba2b04eef2f0de2, type: 2} + Radius: 1.0907339 - Mesh: {fileID: 4300004, guid: 693c11c21d8f22240ae2b6c576bf923a, type: 3} Material: {fileID: 2100000, guid: 818a00140c1abb047be1d65d1c20b52a, type: 2} + Radius: 1.345119 - Mesh: {fileID: 4300004, guid: 73f7fb37d1925f246919650feda3df71, type: 3} Material: {fileID: 2100000, guid: 60bb3870b22a23b458c2bc94e4403bda, type: 2} + Radius: 0.9581426 - Mesh: {fileID: 4300004, guid: 13503d5cc77421a4384053d90e12610f, type: 3} Material: {fileID: 2100000, guid: 3175592343a31774b872b32ae89a7ee8, type: 2} + Radius: 1.3620772 - Mesh: {fileID: 4300004, guid: 7c93e75f8f4cde14d82932c65389f566, type: 3} Material: {fileID: 2100000, guid: edee875c32d24154688acf645e314864, type: 2} + Radius: 1.1282945 - Mesh: {fileID: 4300004, guid: b2e60056527750e4c87bd4f6de85ec32, type: 3} Material: {fileID: 2100000, guid: c3d0e5db17690724b89cff9a71876aa6, type: 2} + Radius: 1.5490558 - Mesh: {fileID: 4300004, guid: 87ef785989ec82b498488e651b61b2c6, type: 3} Material: {fileID: 2100000, guid: 5686a9131ca8350448768971c9e21da0, type: 2} + Radius: 1.4786077 - Mesh: {fileID: 4300004, guid: a0f93e74d454f5046908a26ecbbc31cf, type: 3} Material: {fileID: 2100000, guid: 85e9ac4c62af0fb4a94bc35ac5e24254, type: 2} + Radius: 1.1443666 - Mesh: {fileID: 4300004, guid: 4a9e0d7ffd8f8e94abf7a800653c0b4e, type: 3} Material: {fileID: 2100000, guid: 27b1a299ede684d499133b9a0dc85bda, type: 2} + Radius: 1.1114912 - Mesh: {fileID: 4300004, guid: 232b4a71860923049890d661dee4aff7, type: 3} Material: {fileID: 2100000, guid: d9e9ebabc89054f4495754372a7b4d8f, type: 2} + Radius: 1.5410137 - Mesh: {fileID: 4300004, guid: 335c54d8095aa3f44bab46ca5fa5bd4c, type: 3} Material: {fileID: 2100000, guid: 71cd479bb26cd7140ba9d3753f49ffbc, type: 2} + Radius: 1.3792597 - Mesh: {fileID: 4300004, guid: 8942a135422bd014bb3451fe02d656f2, type: 3} Material: {fileID: 2100000, guid: 0f7035043b158484995ff86e9371b141, type: 2} + Radius: 1.2433527 - Mesh: {fileID: 4300004, guid: 47e8c832aa7d46e4ba06961fddf3cc06, type: 3} Material: {fileID: 2100000, guid: d5788bb4b0d2d93429d9c6462034e470, type: 2} + Radius: 1.3664026 - Mesh: {fileID: 4300004, guid: 7c1227bb235e0f74aa9a6cdb9e7ccac5, type: 3} Material: {fileID: 2100000, guid: 060b5e360701d5146adc3d1c65c7a3df, type: 2} + Radius: 1.2458941 - Mesh: {fileID: 4300004, guid: 77a272b796d88344eacf56a79372b45e, type: 3} Material: {fileID: 2100000, guid: 3cd15eb9c358aa547bcd223ee3c1edde, type: 2} + Radius: 2.157539 - Mesh: {fileID: 4300004, guid: bafc829a0712b174d9485c5bcbc1b529, type: 3} Material: {fileID: 2100000, guid: b58fd84189173114d8708fb50b43f2d7, type: 2} + Radius: 1.5399581 - Mesh: {fileID: 4300004, guid: 47fa308b6b417034ea47809cb08bccfb, type: 3} Material: {fileID: 2100000, guid: f56b0896907ac9e41b6fd9dca05f1fa2, type: 2} + Radius: 1.8855069 - Mesh: {fileID: 4300004, guid: fb03a3e40b409db44a810641e0a6c493, type: 3} Material: {fileID: 2100000, guid: 78859c2284122944493cc283967036db, type: 2} + Radius: 1.2214345 - Mesh: {fileID: 4300004, guid: de7739fee205f4a4f9ae290126a36b61, type: 3} Material: {fileID: 2100000, guid: 89b312038af5203469d447f7ff01105f, type: 2} + Radius: 1.8183402 - Mesh: {fileID: 4300004, guid: a966f9aba651bf34da1bb6e3e7f26301, type: 3} Material: {fileID: 2100000, guid: 3326bc3e2b8ada34c9bfd44cf8cf1a1c, type: 2} + Radius: 1.5686527 - Mesh: {fileID: 4300004, guid: 0d55ec2b68453b7418abcd63378eed69, type: 3} Material: {fileID: 2100000, guid: 12b1f515279281a42b2bd53cdb174488, type: 2} + Radius: 1.9112675 - Mesh: {fileID: 4300004, guid: e5dc38d7ffa6ed242831255d93657aaa, type: 3} Material: {fileID: 2100000, guid: 5a06a4f6d5df32b4dae76c13939d3ce9, type: 2} + Radius: 1.9507759 - Mesh: {fileID: 4300004, guid: 9f36793bd68d3d84d8116485bf933992, type: 3} Material: {fileID: 2100000, guid: decc37f956dfc244b956de2d6f5375c2, type: 2} + Radius: 1.5778105 - Mesh: {fileID: 4300004, guid: 214c1534cdd5b3a4a80927e9d879290f, type: 3} Material: {fileID: 2100000, guid: a20b424628f81de4e8cf080a503b66af, type: 2} + Radius: 1.4580269 - Mesh: {fileID: 4300004, guid: 7db51bba443e10f4f9a597a296ceb0c6, type: 3} Material: {fileID: 2100000, guid: f96d19f3fe978b044972d1360d2e7707, type: 2} + Radius: 2.430305 - Mesh: {fileID: 4300004, guid: 6116ec4d9786d04408c3b26d0c525407, type: 3} Material: {fileID: 2100000, guid: 1788de6db766a4444a09dc0c80e1bcb2, type: 2} + Radius: 1.7872484 - Mesh: {fileID: 4300004, guid: 3d6e611c9ebead04b9d6d7d490977ddc, type: 3} Material: {fileID: 2100000, guid: 0fab294fd86e3b84394a967642904d55, type: 2} + Radius: 1.9273407 - Mesh: {fileID: 4300004, guid: 76b1f709ca820234bbf6c03507333b7e, type: 3} Material: {fileID: 2100000, guid: 63a8a57976371814689d7fb222e635e9, type: 2} + Radius: 1.70707 - Mesh: {fileID: 4300004, guid: d3c9f05eabff9e24ca9521e0b8dffd50, type: 3} Material: {fileID: 2100000, guid: 9be65d82397829b46894243c2d91a06d, type: 2} + Radius: 1.6336656 AsteroidSpritesheetWidth: 4 AsteroidSpritesheetHeight: 4 LODHandler: {fileID: 1009503736} SlimeRenderer: {fileID: 1254851254} SlimeGravityCamera: {fileID: 1066823975} - SimpleCommodityPickup: {fileID: 4008709970769624704, guid: 521bfeece7dd5fd4e8f166d38493f18c, + SimpleCommodityPickup: {fileID: 7436534270673427838, guid: 521bfeece7dd5fd4e8f166d38493f18c, type: 3} - CompoundCommodityPickup: {fileID: 7449398549621940518, guid: 366909b6a01d7254d8eef01c333f8e00, + CompoundCommodityPickup: {fileID: 4507103896627202189, guid: 366909b6a01d7254d8eef01c333f8e00, type: 3} - GearPickup: {fileID: 946329779588188460, guid: d2b7e9a9cd7733041b0553682e4b61af, + GearPickup: {fileID: 7390748043139687254, guid: d2b7e9a9cd7733041b0553682e4b61af, type: 3} - WeaponPickup: {fileID: 8842807112802394818, guid: d2cec1d8c3d94074e9d2e6088e1c02d7, + WeaponPickup: {fileID: 5705448000916375656, guid: d2cec1d8c3d94074e9d2e6088e1c02d7, + type: 3} + MinePrefab: {fileID: 7283754118921506074, guid: b04728b2b65e057429eb6e8529299c8a, + type: 3} + CloudPrefab: {fileID: 2914522964471179774, guid: 4084aa3d08e52e04f880ad13daa409b4, type: 3} MapGravityMaterials: - {fileID: 2100000, guid: 841e4091d19548347bd59115047b4e49, type: 2} - {fileID: 2100000, guid: a92fc6d958edb9f46b6e58134f609cc0, type: 2} + GravityField: {fileID: 2100000, guid: 44a8bbb89acb4e34c9f41a9da5842bb4, type: 2} Tour: 0 TourSwitchTime: 10 TourFollowDistance: 100 TourHeightOffset: 50 TourFollowOffsetDegrees: 55 - AsteroidBeltUI: {fileID: 349597964696402918, guid: 1f1bfa2175a13b647888e2949e0cb138, - type: 3} + MapAsteroidMaterial: {fileID: 2100000, guid: c1012d5466454651b7279be93ef9af88, type: 2} Planet: {fileID: 8287217960984982033, guid: 88ace6073e3db1a46bd3aaf4f971acb9, type: 3} GasGiant: {fileID: 3250623180916197132, guid: 85753b4a7c762274385af384abed7a04, type: 3} @@ -16778,7 +16491,6 @@ MonoBehaviour: NebulaTint: {fileID: 8400000, guid: d196505464047f04a97f28689041209b, type: 2} Heightmap: {fileID: 8400000, guid: 2fc21a9d3e9647948b56e384cd9378b3, type: 2} ParticleColors: {fileID: 2800000, guid: 56db63da398b2d04394ddbccedce943c, type: 3} - GravityCamera: {fileID: 1537342003} --- !u!114 &1009503736 MonoBehaviour: m_ObjectHideFlags: 0 @@ -16997,6 +16709,7 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -17008,7 +16721,7 @@ MonoBehaviour: m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_ActiveFontFeatures: 6e72656b + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 @@ -17038,81 +16751,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1012981707} m_CullTransparentMesh: 0 ---- !u!1 &1013676407 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1013676408} - - component: {fileID: 1013676410} - - component: {fileID: 1013676409} - m_Layer: 5 - m_Name: Turn Fill - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1013676408 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1013676407} - 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: 1214607512} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0.8, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1013676409 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1013676407} - 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.101960786} - 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: 1 - 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 &1013676410 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1013676407} - m_CullTransparentMesh: 0 --- !u!1 &1029396710 GameObject: m_ObjectHideFlags: 0 @@ -17253,8 +16891,6 @@ Transform: m_LocalScale: {x: 3000, y: 3000, z: 3000} m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 1476765548} - - {fileID: 23420357} - {fileID: 1108843909} - {fileID: 1647230682} - {fileID: 1254851255} @@ -17431,6 +17067,7 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -17442,7 +17079,7 @@ MonoBehaviour: m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_ActiveFontFeatures: 6e72656b + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 @@ -17567,6 +17204,7 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -17578,7 +17216,7 @@ MonoBehaviour: m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_ActiveFontFeatures: 6e72656b + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 @@ -18347,6 +17985,7 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -18358,7 +17997,7 @@ MonoBehaviour: m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_ActiveFontFeatures: 6e72656b + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 @@ -18759,6 +18398,7 @@ MonoBehaviour: m_VerticalAlignment: 256 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -18770,7 +18410,7 @@ MonoBehaviour: m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_ActiveFontFeatures: 00000000 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 @@ -19045,6 +18685,8 @@ MeshRenderer: m_RayTracingAccelStructBuildFlagsOverride: 0 m_RayTracingAccelStructBuildFlags: 1 m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -19066,9 +18708,11 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 + m_MaskInteraction: 0 m_AdditionalVertexStreams: {fileID: 0} --- !u!33 &1163671429 MeshFilter: @@ -19683,105 +19327,6 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0, y: 0} ---- !u!1 &1214607511 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1214607512} - - component: {fileID: 1214607515} - - component: {fileID: 1214607514} - - component: {fileID: 1214607513} - m_Layer: 5 - m_Name: Turn - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1214607512 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1214607511} - 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: 1013676408} - - {fileID: 853400336} - - {fileID: 932757482} - m_Father: {fileID: 1735948312} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 1} ---- !u!114 &1214607513 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1214607511} - 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.011764706} - 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: 1 - 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 &1214607514 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1214607511} - m_CullTransparentMesh: 1 ---- !u!114 &1214607515 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1214607511} - 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: 16 - m_FlexibleWidth: -1 - m_FlexibleHeight: -1 - m_LayoutPriority: 1 --- !u!1 &1218822609 GameObject: m_ObjectHideFlags: 0 @@ -21015,6 +20560,7 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -21026,7 +20572,7 @@ MonoBehaviour: m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_ActiveFontFeatures: 6e72656b + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 @@ -21635,6 +21181,8 @@ MeshRenderer: m_RayTracingAccelStructBuildFlagsOverride: 0 m_RayTracingAccelStructBuildFlags: 1 m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -21656,9 +21204,11 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 + m_MaskInteraction: 0 m_AdditionalVertexStreams: {fileID: 0} --- !u!33 &1390575965 MeshFilter: @@ -21855,6 +21405,7 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -21866,7 +21417,7 @@ MonoBehaviour: m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_ActiveFontFeatures: 6e72656b + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 @@ -22054,6 +21605,7 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -22065,7 +21617,7 @@ MonoBehaviour: m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_ActiveFontFeatures: 6e72656b + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 @@ -22240,6 +21792,7 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -22251,7 +21804,7 @@ MonoBehaviour: m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_ActiveFontFeatures: 6e72656b + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 @@ -22746,6 +22299,7 @@ MonoBehaviour: InfiniteAmmoIcon: {fileID: 0} CooldownFill: {fileID: 0} HeatFill: {fileID: 0} + SelectedIndicator: {fileID: 0} --- !u!114 &1462704894 MonoBehaviour: m_ObjectHideFlags: 0 @@ -22778,81 +22332,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 1281fe44325f9b548aa42dc331b17266, type: 3} m_Name: m_EditorClassIdentifier: ---- !u!1 &1463754849 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1463754850} - - component: {fileID: 1463754852} - - component: {fileID: 1463754851} - m_Layer: 5 - m_Name: Icon - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1463754850 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1463754849} - 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: 723697981} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 8, y: 0} - m_SizeDelta: {x: 14, y: -2} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1463754851 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1463754849} - 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: 1} - m_RaycastTarget: 0 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 0 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 21300000, guid: 55bed7a5ff978bf4c8cbda9971585df0, type: 3} - m_Type: 0 - m_PreserveAspect: 1 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1463754852 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1463754849} - m_CullTransparentMesh: 0 --- !u!1 &1464157084 GameObject: m_ObjectHideFlags: 0 @@ -23011,6 +22490,7 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -23022,7 +22502,7 @@ MonoBehaviour: m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_ActiveFontFeatures: 6e72656b + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 @@ -23184,92 +22664,6 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0.5, y: 0.5} ---- !u!1 &1476765547 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1476765548} - - component: {fileID: 1476765551} - - component: {fileID: 1476765550} - m_Layer: 9 - m_Name: Boundary - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1476765548 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1476765547} - serializedVersion: 2 - 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: 1037490739} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!23 &1476765550 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1476765547} - m_Enabled: 1 - m_CastShadows: 0 - m_ReceiveShadows: 0 - m_DynamicOccludee: 0 - m_StaticShadowCaster: 0 - m_MotionVectors: 2 - m_LightProbeUsage: 0 - m_ReflectionProbeUsage: 0 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RayTracingAccelStructBuildFlagsOverride: 0 - m_RayTracingAccelStructBuildFlags: 1 - m_SmallMeshCulling: 1 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: 8f45fb3a0f420d5428f1528827d55fa2, type: 2} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_AdditionalVertexStreams: {fileID: 0} ---- !u!33 &1476765551 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1476765547} - m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} --- !u!1 &1485884351 GameObject: m_ObjectHideFlags: 0 @@ -23428,6 +22822,7 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -23439,7 +22834,7 @@ MonoBehaviour: m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_ActiveFontFeatures: 6e72656b + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 @@ -23824,6 +23219,7 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -23835,7 +23231,7 @@ MonoBehaviour: m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_ActiveFontFeatures: 00000000 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 @@ -24104,7 +23500,7 @@ Camera: m_Depth: 0 m_CullingMask: serializedVersion: 2 - m_Bits: 1536 + m_Bits: 512 m_RenderingPath: 1 m_TargetTexture: {fileID: 8400000, guid: 2fc21a9d3e9647948b56e384cd9378b3, type: 2} m_TargetDisplay: 0 @@ -24267,81 +23663,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1541341820} m_CullTransparentMesh: 1 ---- !u!1 &1542388327 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1542388328} - - component: {fileID: 1542388330} - - component: {fileID: 1542388329} - m_Layer: 5 - m_Name: Strafe Fill - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1542388328 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1542388327} - 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: 691045497} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0.8, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1542388329 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1542388327} - 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.101960786} - 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: 1 - 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 &1542388330 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1542388327} - m_CullTransparentMesh: 0 --- !u!1 &1547889398 GameObject: m_ObjectHideFlags: 0 @@ -24490,6 +23811,11 @@ PrefabInstance: propertyPath: m_firstOverflowCharacterIndex value: 0 objectReference: {fileID: 0} + - target: {fileID: 1713457305180270767, guid: 2758dfa2744d7ad4d8877545189d116e, + type: 3} + propertyPath: 'm_ActiveFontFeatures.Array.data[0]' + value: 1801810542 + objectReference: {fileID: 0} - target: {fileID: 2297648055057363568, guid: 2758dfa2744d7ad4d8877545189d116e, type: 3} propertyPath: m_Pivot.x @@ -24836,142 +24162,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1558182380} m_CullTransparentMesh: 1 ---- !u!1 &1558236435 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1558236436} - - component: {fileID: 1558236438} - - component: {fileID: 1558236437} - m_Layer: 5 - m_Name: Forward RPM - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1558236436 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1558236435} - 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: 723697981} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 8, y: 0} - m_SizeDelta: {x: -16, y: -4} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1558236437 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1558236435} - 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: 0 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_text: 18,000 - m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 3fb7d873bb5a7944bb9a7c73c430c44b, type: 2} - m_sharedMaterial: {fileID: 2100000, guid: b9d2f6c9804cec1489502dcc1c19ec54, 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: 10 - m_fontSizeBase: 10 - m_fontWeight: 400 - m_enableAutoSizing: 1 - m_fontSizeMin: 6 - m_fontSizeMax: 16 - m_fontStyle: 0 - m_HorizontalAlignment: 1 - 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: 1 - 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: 1 - 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 &1558236438 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1558236435} - m_CullTransparentMesh: 0 --- !u!1 &1558520821 GameObject: m_ObjectHideFlags: 0 @@ -25211,6 +24401,8 @@ MeshRenderer: m_RayTracingAccelStructBuildFlagsOverride: 0 m_RayTracingAccelStructBuildFlags: 1 m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -25232,9 +24424,11 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 + m_MaskInteraction: 0 m_AdditionalVertexStreams: {fileID: 0} --- !u!33 &1566772338 MeshFilter: @@ -25567,6 +24761,7 @@ MonoBehaviour: m_VerticalAlignment: 1024 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 50 m_lineSpacingMax: 0 @@ -25578,7 +24773,7 @@ MonoBehaviour: m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_ActiveFontFeatures: 00000000 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 @@ -25710,6 +24905,11 @@ PrefabInstance: propertyPath: m_firstOverflowCharacterIndex value: 0 objectReference: {fileID: 0} + - target: {fileID: 1713457305180270767, guid: 2758dfa2744d7ad4d8877545189d116e, + type: 3} + propertyPath: 'm_ActiveFontFeatures.Array.data[0]' + value: 1801810542 + objectReference: {fileID: 0} - target: {fileID: 2297648055057363568, guid: 2758dfa2744d7ad4d8877545189d116e, type: 3} propertyPath: m_Pivot.x @@ -26204,6 +25404,7 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -26215,7 +25416,7 @@ MonoBehaviour: m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_ActiveFontFeatures: 00000000 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 @@ -26715,6 +25916,7 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -26726,7 +25928,7 @@ MonoBehaviour: m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_ActiveFontFeatures: 6e72656b + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 @@ -26962,6 +26164,8 @@ MeshRenderer: m_RayTracingAccelStructBuildFlagsOverride: 0 m_RayTracingAccelStructBuildFlags: 1 m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -26983,9 +26187,11 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 + m_MaskInteraction: 0 m_AdditionalVertexStreams: {fileID: 0} --- !u!33 &1713745167 MeshFilter: @@ -27473,6 +26679,151 @@ MonoBehaviour: TabButtons: {fileID: 1783772015} ActiveTabColor: {r: 1, g: 0.44583336, b: 0.050000012, a: 1} InactiveTabColor: {r: 0.6981132, g: 0.6981132, b: 0.6981132, a: 1} +--- !u!1 &1731988777 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1731988778} + - component: {fileID: 1731988780} + - component: {fileID: 1731988779} + m_Layer: 5 + m_Name: Debug Info Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1731988778 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1731988777} + 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: 568886950} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 2, y: 2} + m_SizeDelta: {x: -20, y: -20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1731988779 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1731988777} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.TextMeshPro::TMPro.TextMeshProUGUI + 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: 'New TextNew TextNew Text + + New TextNew TextNew TextNew Text + + New + TextNew Text + + New TextNew Text' + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 53555f7a2d5e745428813f1b1118734f, type: 2} + m_sharedMaterial: {fileID: -2804126062856497447, guid: 53555f7a2d5e745428813f1b1118734f, + 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: 15.85 + m_fontSizeBase: 12 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 8 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 1024 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_characterHorizontalScale: 1 + 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: 6e72656b6167696c + 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 &1731988780 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1731988777} + m_CullTransparentMesh: 1 --- !u!1 &1733988258 GameObject: m_ObjectHideFlags: 0 @@ -27569,6 +26920,7 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -27580,7 +26932,7 @@ MonoBehaviour: m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_ActiveFontFeatures: 6e72656b + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 @@ -27610,92 +26962,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1733988258} m_CullTransparentMesh: 1 ---- !u!1 &1735948311 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1735948312} - - component: {fileID: 1735948314} - - component: {fileID: 1735948313} - m_Layer: 5 - m_Name: RPM Display - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1735948312 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1735948311} - 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: 723697981} - - {fileID: 691045497} - - {fileID: 1214607512} - m_Father: {fileID: 746825913} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1735948313 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1735948311} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Padding: - m_Left: 0 - m_Right: 0 - m_Top: 0 - m_Bottom: 0 - m_ChildAlignment: 0 - m_Spacing: 2 - m_ChildForceExpandWidth: 1 - m_ChildForceExpandHeight: 0 - m_ChildControlWidth: 1 - m_ChildControlHeight: 1 - m_ChildScaleWidth: 0 - m_ChildScaleHeight: 0 - m_ReverseArrangement: 0 ---- !u!114 &1735948314 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1735948311} - 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: 14 - m_FlexibleWidth: -1 - m_FlexibleHeight: -1 - m_LayoutPriority: 1 --- !u!1 &1741914909 GameObject: m_ObjectHideFlags: 0 @@ -27928,6 +27194,7 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -27939,7 +27206,7 @@ MonoBehaviour: m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_ActiveFontFeatures: 6e72656b + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 @@ -28979,6 +28246,8 @@ MeshRenderer: m_RayTracingAccelStructBuildFlagsOverride: 0 m_RayTracingAccelStructBuildFlags: 1 m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -29000,9 +28269,11 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 + m_MaskInteraction: 0 m_AdditionalVertexStreams: {fileID: 0} --- !u!33 &1857285688 MeshFilter: @@ -29765,81 +29036,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1943948574} m_CullTransparentMesh: 0 ---- !u!1 &1946192590 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1946192591} - - component: {fileID: 1946192593} - - component: {fileID: 1946192592} - m_Layer: 5 - m_Name: Forward Fill - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1946192591 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1946192590} - 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: 723697981} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0.8, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1946192592 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1946192590} - 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.101960786} - 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: 1 - 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 &1946192593 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1946192590} - m_CullTransparentMesh: 0 --- !u!1 &1952022815 GameObject: m_ObjectHideFlags: 0 @@ -30080,6 +29276,7 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -30091,7 +29288,7 @@ MonoBehaviour: m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_ActiveFontFeatures: 00000000 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 @@ -31056,6 +30253,7 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -31067,7 +30265,7 @@ MonoBehaviour: m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_ActiveFontFeatures: 6e72656b + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 @@ -31112,6 +30310,8 @@ MeshRenderer: m_RayTracingAccelStructBuildFlagsOverride: 0 m_RayTracingAccelStructBuildFlags: 1 m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -31133,9 +30333,11 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 + m_MaskInteraction: 0 m_AdditionalVertexStreams: {fileID: 0} --- !u!1 &2095699056 GameObject: @@ -31368,6 +30570,7 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -31379,7 +30582,7 @@ MonoBehaviour: m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_ActiveFontFeatures: 6e72656b + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 @@ -31708,6 +30911,8 @@ MeshRenderer: m_RayTracingAccelStructBuildFlagsOverride: 0 m_RayTracingAccelStructBuildFlags: 1 m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -31729,9 +30934,11 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 + m_MaskInteraction: 0 m_AdditionalVertexStreams: {fileID: 0} --- !u!33 &2117796868 MeshFilter: @@ -31892,6 +31099,7 @@ MonoBehaviour: m_VerticalAlignment: 256 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -31903,7 +31111,7 @@ MonoBehaviour: m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_ActiveFontFeatures: 00000000 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 @@ -32028,6 +31236,7 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -32039,7 +31248,7 @@ MonoBehaviour: m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_ActiveFontFeatures: 6e72656b + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 @@ -33170,6 +32379,7 @@ MonoBehaviour: m_VerticalAlignment: 1024 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -33181,7 +32391,7 @@ MonoBehaviour: m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_ActiveFontFeatures: 00000000 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 @@ -33270,6 +32480,7 @@ MonoBehaviour: m_VerticalAlignment: 1024 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -33281,7 +32492,7 @@ MonoBehaviour: m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_ActiveFontFeatures: 00000000 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 @@ -33590,6 +32801,7 @@ MonoBehaviour: m_VerticalAlignment: 256 m_textAlignment: 65535 m_characterSpacing: 9.01 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -33601,7 +32813,7 @@ MonoBehaviour: m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_ActiveFontFeatures: 00000000 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 @@ -33719,6 +32931,7 @@ MonoBehaviour: m_VerticalAlignment: 1024 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -33730,7 +32943,7 @@ MonoBehaviour: m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_ActiveFontFeatures: 00000000 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 @@ -33819,6 +33032,7 @@ MonoBehaviour: m_VerticalAlignment: 1024 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -33830,7 +33044,7 @@ MonoBehaviour: m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_ActiveFontFeatures: 00000000 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 @@ -34030,6 +33244,7 @@ MonoBehaviour: m_VerticalAlignment: 1024 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -34041,7 +33256,7 @@ MonoBehaviour: m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_ActiveFontFeatures: 00000000 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 @@ -34369,6 +33584,7 @@ MonoBehaviour: m_VerticalAlignment: 1024 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -34380,7 +33596,7 @@ MonoBehaviour: m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_ActiveFontFeatures: 00000000 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 @@ -34506,6 +33722,7 @@ MonoBehaviour: m_VerticalAlignment: 1024 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -34517,7 +33734,7 @@ MonoBehaviour: m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_ActiveFontFeatures: 00000000 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 @@ -34625,6 +33842,7 @@ MonoBehaviour: m_VerticalAlignment: 1024 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -34636,7 +33854,7 @@ MonoBehaviour: m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_ActiveFontFeatures: 00000000 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 @@ -34780,6 +33998,7 @@ MonoBehaviour: m_VerticalAlignment: 1024 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -34791,7 +34010,7 @@ MonoBehaviour: m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_ActiveFontFeatures: 00000000 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 @@ -34917,6 +34136,7 @@ MonoBehaviour: m_VerticalAlignment: 1024 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -34928,7 +34148,7 @@ MonoBehaviour: m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_ActiveFontFeatures: 00000000 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 @@ -35222,6 +34442,7 @@ MonoBehaviour: m_VerticalAlignment: 1024 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -35233,7 +34454,7 @@ MonoBehaviour: m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_ActiveFontFeatures: 00000000 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 @@ -35358,6 +34579,7 @@ MonoBehaviour: m_VerticalAlignment: 1024 m_textAlignment: 65535 m_characterSpacing: 9.01 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -35369,7 +34591,7 @@ MonoBehaviour: m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_ActiveFontFeatures: 00000000 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 @@ -35457,6 +34679,7 @@ MonoBehaviour: m_VerticalAlignment: 1024 m_textAlignment: 65535 m_characterSpacing: 9.01 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -35468,7 +34691,7 @@ MonoBehaviour: m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_ActiveFontFeatures: 00000000 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 @@ -35631,6 +34854,7 @@ MonoBehaviour: m_VerticalAlignment: 1024 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -35642,7 +34866,7 @@ MonoBehaviour: m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_ActiveFontFeatures: 00000000 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 @@ -35787,6 +35011,7 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -35798,7 +35023,7 @@ MonoBehaviour: m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_ActiveFontFeatures: 6e72656b + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 @@ -37131,6 +36356,7 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -37142,7 +36368,7 @@ MonoBehaviour: m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_ActiveFontFeatures: 6e72656b + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 @@ -37577,6 +36803,7 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -37588,7 +36815,7 @@ MonoBehaviour: m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_ActiveFontFeatures: 00000000 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 @@ -37888,6 +37115,7 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 @@ -37899,7 +37127,7 @@ MonoBehaviour: m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 - m_ActiveFontFeatures: 6e72656b + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 @@ -39010,7 +38238,6 @@ MonoBehaviour: OverrideIconBlinkSpeed: 10 ShieldIcon: {fileID: 19222411} HeatsinkBackground: {fileID: 661332569} - AetherDriveUi: {fileID: 1735948311} EnergyLabel: {fileID: 804489113} CockpitTemperatureLabel: {fileID: 212527384} RadiatorTemperatureLabel: {fileID: 1752418078} @@ -39019,18 +38246,12 @@ MonoBehaviour: VisibilityLabel: {fileID: 2122035461} HullDurabilityLabel: {fileID: 697075017} DistanceLabel: {fileID: 0} - ForwardRPMLabel: {fileID: 1558236437} - StrafeRPMLabel: {fileID: 383790465} - TurnRPMLabel: {fileID: 932757483} SensorCooldownFill: {fileID: 1943948575} EnergyFill: {fileID: 271575215} HullDurabilityFill: {fileID: 753112995} HeatstrokeMeterFill: {fileID: 1029396711} HypothermiaMeterFill: {fileID: 79341832} HeatstrokeLimitFill: {fileID: 933815653} - ForwardRPMFill: {fileID: 1946192591} - StrafeRPMFill: {fileID: 1542388328} - TurnRPMFill: {fileID: 1013676408} --- !u!224 &7628189704657849088 RectTransform: m_ObjectHideFlags: 0 @@ -39200,6 +38421,7 @@ SceneRoots: - {fileID: 906767442} - {fileID: 1009503730} - {fileID: 1037490739} + - {fileID: 23420357} - {fileID: 2095699057} - {fileID: 134113271} - {fileID: 666227432} @@ -39209,3 +38431,4 @@ SceneRoots: - {fileID: 990038542} - {fileID: 2135526003} - {fileID: 495677244} + - {fileID: 775333809} diff --git a/Assets/Scenes/FieldShieldTest.unity b/Assets/Scenes/FieldShieldTest.unity index b1b2e50b9..b659bb95b 100644 --- a/Assets/Scenes/FieldShieldTest.unity +++ b/Assets/Scenes/FieldShieldTest.unity @@ -13,7 +13,7 @@ OcclusionCullingSettings: --- !u!104 &2 RenderSettings: m_ObjectHideFlags: 0 - serializedVersion: 9 + serializedVersion: 10 m_Fog: 0 m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} m_FogMode: 3 @@ -38,13 +38,12 @@ RenderSettings: m_ReflectionIntensity: 1 m_CustomReflection: {fileID: 0} m_Sun: {fileID: 0} - m_IndirectSpecularColor: {r: 0.023674645, g: 0.04639011, b: 0.122535154, a: 1} m_UseRadianceAmbientProbe: 0 --- !u!157 &3 LightmapSettings: m_ObjectHideFlags: 0 - serializedVersion: 12 - m_GIWorkflowMode: 1 + serializedVersion: 13 + m_BakeOnSceneLoad: 0 m_GISettings: serializedVersion: 2 m_BounceScale: 1 @@ -67,9 +66,6 @@ LightmapSettings: m_LightmapParameters: {fileID: 0} m_LightmapsBakeMode: 1 m_TextureCompression: 1 - m_FinalGather: 0 - m_FinalGatherFiltering: 1 - m_FinalGatherRayCount: 256 m_ReflectionCompression: 2 m_MixedBakeMode: 2 m_BakeBackend: 1 @@ -104,7 +100,7 @@ NavMeshSettings: serializedVersion: 2 m_ObjectHideFlags: 0 m_BuildSettings: - serializedVersion: 2 + serializedVersion: 3 agentTypeID: 0 agentRadius: 0.5 agentHeight: 2 @@ -117,7 +113,7 @@ NavMeshSettings: cellSize: 0.16666667 manualTileSize: 0 tileSize: 256 - accuratePlacement: 0 + buildHeightMesh: 0 maxJobWorkers: 0 preserveTilesOutsideBounds: 0 debug: @@ -155,7 +151,6 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 815358592} - m_RootOrder: 5 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -296,7 +291,6 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 815358592} - m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -308,6 +302,7 @@ PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: + serializedVersion: 3 m_TransformParent: {fileID: 815358592} m_Modifications: - target: {fileID: 257019179550429270, guid: 426f9dcb510530d4dbfa678c9f727ec1, @@ -360,6 +355,11 @@ PrefabInstance: propertyPath: m_text value: Aetheric Field Tester objectReference: {fileID: 0} + - target: {fileID: 7131821417072393581, guid: 426f9dcb510530d4dbfa678c9f727ec1, + type: 3} + propertyPath: 'm_ActiveFontFeatures.Array.data[0]' + value: 1801810542 + objectReference: {fileID: 0} - target: {fileID: 7131821417165215474, guid: 426f9dcb510530d4dbfa678c9f727ec1, type: 3} propertyPath: m_Enabled @@ -481,6 +481,9 @@ PrefabInstance: value: Properties objectReference: {fileID: 0} m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 426f9dcb510530d4dbfa678c9f727ec1, type: 3} --- !u!114 &401779935 stripped MonoBehaviour: @@ -505,6 +508,7 @@ PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: + serializedVersion: 3 m_TransformParent: {fileID: 815358592} m_Modifications: - target: {fileID: 9194050151789067659, guid: 5c3a7b786419db74a8c1d17039fd4f67, @@ -663,6 +667,9 @@ PrefabInstance: value: 0 objectReference: {fileID: 0} m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 5c3a7b786419db74a8c1d17039fd4f67, type: 3} --- !u!224 &415327856 stripped RectTransform: @@ -713,7 +720,6 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1112533349} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 180} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -805,6 +811,9 @@ MonoBehaviour: Camera: {fileID: 1153356615} TestField: {fileID: 909026488} Properties: {fileID: 401779935} + GrabExtendTime: 1.5 + GrabEnvelopTime: 0.75 + GrabPullTime: 1.5 --- !u!4 &699508827 Transform: m_ObjectHideFlags: 0 @@ -812,13 +821,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 699508825} + serializedVersion: 2 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: 0} - m_RootOrder: 5 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &815358588 GameObject: @@ -896,7 +905,9 @@ Canvas: m_OverrideSorting: 0 m_OverridePixelPerfect: 0 m_SortingBucketNormalizedSize: 0 + m_VertexColorAlwaysGammaSpace: 0 m_AdditionalShaderChannelsFlag: 25 + m_UpdateRectTransformForStandalone: 0 m_SortingLayerID: 0 m_SortingOrder: 0 m_TargetDisplay: 0 @@ -919,7 +930,6 @@ RectTransform: - {fileID: 415327856} - {fileID: 87891009} m_Father: {fileID: 0} - m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -931,6 +941,7 @@ PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: + serializedVersion: 3 m_TransformParent: {fileID: 0} m_Modifications: - target: {fileID: 411033920054375063, guid: fe47fadcdb5ae5c4caca516b4af6fde6, @@ -1008,7 +1019,39 @@ PrefabInstance: propertyPath: m_LocalEulerAnglesHint.z value: 0 objectReference: {fileID: 0} + - target: {fileID: 2212592724187910978, guid: fe47fadcdb5ae5c4caca516b4af6fde6, + type: 3} + propertyPath: m_Enabled + value: 0 + objectReference: {fileID: 0} m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: + - targetCorrespondingSourceObject: {fileID: 411033920054375063, guid: fe47fadcdb5ae5c4caca516b4af6fde6, + type: 3} + insertIndex: -1 + addedObject: {fileID: 909026487} + - targetCorrespondingSourceObject: {fileID: 411033920054375063, guid: fe47fadcdb5ae5c4caca516b4af6fde6, + type: 3} + insertIndex: -1 + addedObject: {fileID: 909026488} + - targetCorrespondingSourceObject: {fileID: 411033920054375063, guid: fe47fadcdb5ae5c4caca516b4af6fde6, + type: 3} + insertIndex: -1 + addedObject: {fileID: 909026489} + - targetCorrespondingSourceObject: {fileID: 411033920054375063, guid: fe47fadcdb5ae5c4caca516b4af6fde6, + type: 3} + insertIndex: -1 + addedObject: {fileID: 909026490} + - targetCorrespondingSourceObject: {fileID: 411033920054375063, guid: fe47fadcdb5ae5c4caca516b4af6fde6, + type: 3} + insertIndex: -1 + addedObject: {fileID: 909026492} + - targetCorrespondingSourceObject: {fileID: 411033920054375063, guid: fe47fadcdb5ae5c4caca516b4af6fde6, + type: 3} + insertIndex: -1 + addedObject: {fileID: 909026491} m_SourcePrefab: {fileID: 100100000, guid: fe47fadcdb5ae5c4caca516b4af6fde6, type: 3} --- !u!1 &909026486 stripped GameObject: @@ -1024,9 +1067,17 @@ MeshCollider: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 909026486} m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 m_IsTrigger: 0 + m_ProvidesContacts: 0 m_Enabled: 1 - serializedVersion: 4 + serializedVersion: 5 m_Convex: 1 m_CookingOptions: 30 m_Mesh: {fileID: -5495902117074765545, guid: dd6644c1aa6c16c47bb9fea9822ce805, type: 3} @@ -1043,11 +1094,9 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Camera: {fileID: 1153356615} + FrontTwist: 0 + RearTwist: 0 TestMagnitude: 0.5 - Throttle: - x: 0 - y: 0 - ThrottleDecay: 5 FlowSpeed: 2 FlowSpeedThrottleExponent: 1 WaveThrottleExponent: 0 @@ -1070,9 +1119,6 @@ MonoBehaviour: TendrilBaseDamping: 2 TendrilTipRadiusAnimationExponent: 2 TendrilFadeExponent: 2 - GrabExtendTime: 1.5 - GrabEnvelopTime: 0.75 - GrabPullTime: 1.5 RefractionAxis: 1 --- !u!114 &909026489 MonoBehaviour: @@ -1084,8 +1130,8 @@ MonoBehaviour: m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 52538a3309c36fc4583c964a1c0b705f, type: 3} - m_Name: - m_EditorClassIdentifier: + m_Name: + m_EditorClassIdentifier: --- !u!114 &909026490 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1096,8 +1142,40 @@ MonoBehaviour: m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: d8f4aa77146e46a2a4b28d9fefb98496, type: 3} - m_Name: - m_EditorClassIdentifier: + m_Name: + m_EditorClassIdentifier: +--- !u!114 &909026491 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 909026486} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fdca6a832d764b6e89fc83fdcf7b42d7, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::ShieldInterceptor + Envelope: {fileID: 909026492} + PanelPrototype: {fileID: 1087039186} + MaxLivePanels: 12 + PanelRadius: 2 + EnergyScale: 1 + ReuseFraction: 1 + DeathMargin: 0.25 + PatternByDamageType: +--- !u!114 &909026492 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 909026486} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e25c67ee83c01364fb121caeda952606, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::ShieldEnvelope --- !u!1 &1012179276 GameObject: m_ObjectHideFlags: 0 @@ -1138,13 +1216,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1012179276} + serializedVersion: 2 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: 0} - m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &1012179280 MonoBehaviour: @@ -1186,11 +1264,14 @@ MonoBehaviour: type: 3} m_DeselectOnBackgroundClick: 1 m_PointerBehavior: 0 + m_CursorLockBehavior: 0 + m_ScrollDeltaPerTick: 6 --- !u!1001 &1080184620 PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: + serializedVersion: 3 m_TransformParent: {fileID: 0} m_Modifications: - target: {fileID: 105552333169325610, guid: 4a3db6090789ca24cb57c43666754017, @@ -1275,7 +1356,101 @@ PrefabInstance: objectReference: {fileID: 0} m_RemovedComponents: - {fileID: 7577392600424441103, guid: 4a3db6090789ca24cb57c43666754017, type: 3} + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 4a3db6090789ca24cb57c43666754017, type: 3} +--- !u!1 &1087039185 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1087039188} + - component: {fileID: 1087039187} + - component: {fileID: 1087039186} + m_Layer: 0 + m_Name: Panel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!114 &1087039186 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1087039185} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1281fe44325f9b548aa42dc331b17266, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::Prototype +--- !u!114 &1087039187 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1087039185} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c1b180b85c234a4488cf0662b75ac77f, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::ShieldField.ShieldPanel + tiling: 3 + panelRadius: 5 + cellSize: 0.35 + mergeRhombs: 1 + takeDual: 0 + seed: 1337 + sim: {fileID: 7200000, guid: 1d17c100121b5ba47af9c75de451a2f1, type: 3} + panelShader: {fileID: 4800000, guid: 6a7f034931432c2418a0f0f0b9af0b93, type: 3} + growDuration: 0.35 + wavefrontSpeed: 8 + delayJitter: 0.06 + waveSpeed2: 26 + damping: 1.6 + stressClamp: 4 + substeps: 6 + fixedSubstepDt: 0.0025 + echoDelaySteps: 5 + echoReflect: -0.65 + tensileStrength: 0.9 + temperInit: 0.55 + temperErosion: 2.2 + storedEnergyGain: 0.8 + damageGain: 6 + breakAt: 0.75 + crackStart: 0.18 + breakBudgetFraction: 0.02 + radialKick: 1.6 + lateralKick: 2.2 + normalKick: 1.1 + spinKick: 7 + shardLife: 2.5 + shardDrag: 0.7 + maxShards: 6 + conduitGain: 2.5 +--- !u!4 &1087039188 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1087039185} + serializedVersion: 2 + 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: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1112013867 GameObject: m_ObjectHideFlags: 0 @@ -1300,6 +1475,7 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1112013867} + serializedVersion: 2 m_LocalRotation: {x: 0.05948526, y: -0.910067, z: 0.14047916, w: 0.38536373} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} @@ -1307,7 +1483,6 @@ Transform: m_Children: - {fileID: 1153356611} m_Father: {fileID: 0} - m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 17.55, y: -134.1, z: 0} --- !u!114 &1112013869 MonoBehaviour: @@ -1353,7 +1528,6 @@ RectTransform: m_Children: - {fileID: 602735389} m_Father: {fileID: 815358592} - m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 1, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -1387,13 +1561,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1153356610} + serializedVersion: 2 m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: -50} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1112013868} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &1153356612 MonoBehaviour: @@ -1492,9 +1666,17 @@ Camera: m_projectionMatrixMode: 1 m_GateFitMode: 2 m_FOVAxisMode: 0 + m_Iso: 200 + m_ShutterSpeed: 0.005 + m_Aperture: 16 + m_FocusDistance: 10 + m_FocalLength: 50 + m_BladeCount: 5 + m_Curvature: {x: 2, y: 11} + m_BarrelClipping: 0.25 + m_Anamorphism: 0 m_SensorSize: {x: 36, y: 24} m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 m_NormalizedViewPortRect: serializedVersion: 2 x: 0 @@ -1564,9 +1746,17 @@ BoxCollider: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1424996955} m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 m_IsTrigger: 1 + m_ProvidesContacts: 0 m_Enabled: 1 - serializedVersion: 2 + serializedVersion: 3 m_Size: {x: 1, y: 1, z: 1} m_Center: {x: 0, y: 0, z: 0} --- !u!4 &1424996958 @@ -1576,13 +1766,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1424996955} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: -1.4908371, y: -143.55145, z: 0.8193531} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 0} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1618381683 GameObject: @@ -1617,7 +1807,6 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 815358592} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -1691,3 +1880,15 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1618381683} m_CullTransparentMesh: 1 +--- !u!1660057539 &9223372036854775807 +SceneRoots: + m_ObjectHideFlags: 0 + m_Roots: + - {fileID: 909026485} + - {fileID: 1424996958} + - {fileID: 1112013868} + - {fileID: 815358592} + - {fileID: 1012179279} + - {fileID: 699508827} + - {fileID: 1080184620} + - {fileID: 1087039188} diff --git a/Assets/Scenes/Main Menu.unity b/Assets/Scenes/Main Menu.unity index a37cfffba..4fafe8336 100644 --- a/Assets/Scenes/Main Menu.unity +++ b/Assets/Scenes/Main Menu.unity @@ -892,7 +892,6 @@ MonoBehaviour: NebulaTint: {fileID: 8400000, guid: d196505464047f04a97f28689041209b, type: 2} Heightmap: {fileID: 8400000, guid: 2fc21a9d3e9647948b56e384cd9378b3, type: 2} ParticleColors: {fileID: 2800000, guid: 56db63da398b2d04394ddbccedce943c, type: 3} - GravityCamera: {fileID: 2103364771} --- !u!114 &750375536 MonoBehaviour: m_ObjectHideFlags: 0 @@ -982,7 +981,7 @@ Camera: m_Depth: 0 m_CullingMask: serializedVersion: 2 - m_Bits: 5632 + m_Bits: 5120 m_RenderingPath: 1 m_TargetTexture: {fileID: 8400000, guid: 06ec5ef8a5830fc44b1ac1a6e123add5, type: 2} m_TargetDisplay: 0 @@ -1061,16 +1060,6 @@ PrefabInstance: propertyPath: m_LocalEulerAnglesHint.z value: 0 objectReference: {fileID: 0} - - target: {fileID: 7852221720741322892, guid: 046dde0f4600bce41ad33c476f99b309, - type: 3} - propertyPath: m_LocalScale.x - value: 512 - objectReference: {fileID: 0} - - target: {fileID: 7852221720741322892, guid: 046dde0f4600bce41ad33c476f99b309, - type: 3} - propertyPath: m_LocalScale.y - value: 512 - objectReference: {fileID: 0} - target: {fileID: 7852221720816817928, guid: 046dde0f4600bce41ad33c476f99b309, type: 3} propertyPath: m_LocalScale.x @@ -1086,16 +1075,6 @@ PrefabInstance: propertyPath: m_Materials.Array.data[0] value: objectReference: {fileID: 2100000, guid: b9f52544f98f47146b486fb6e27179bb, type: 2} - - target: {fileID: 7852221720969441490, guid: 046dde0f4600bce41ad33c476f99b309, - type: 3} - propertyPath: m_LocalScale.x - value: 512 - objectReference: {fileID: 0} - - target: {fileID: 7852221720969441490, guid: 046dde0f4600bce41ad33c476f99b309, - type: 3} - propertyPath: m_LocalScale.y - value: 512 - objectReference: {fileID: 0} - target: {fileID: 7852221720971737233, guid: 046dde0f4600bce41ad33c476f99b309, type: 3} propertyPath: m_LocalScale.x diff --git a/Assets/Scenes/TestScene.unity b/Assets/Scenes/TestScene.unity index 933f4c4ca..45c73ee85 100644 --- a/Assets/Scenes/TestScene.unity +++ b/Assets/Scenes/TestScene.unity @@ -13,7 +13,7 @@ OcclusionCullingSettings: --- !u!104 &2 RenderSettings: m_ObjectHideFlags: 0 - serializedVersion: 9 + serializedVersion: 10 m_Fog: 0 m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} m_FogMode: 3 @@ -38,13 +38,12 @@ RenderSettings: m_ReflectionIntensity: 1 m_CustomReflection: {fileID: 0} m_Sun: {fileID: 0} - m_IndirectSpecularColor: {r: 0.18113758, g: 0.20078251, b: 0.17357464, a: 1} m_UseRadianceAmbientProbe: 0 --- !u!157 &4 LightmapSettings: m_ObjectHideFlags: 0 - serializedVersion: 12 - m_GIWorkflowMode: 1 + serializedVersion: 13 + m_BakeOnSceneLoad: 0 m_GISettings: serializedVersion: 2 m_BounceScale: 1 @@ -67,9 +66,6 @@ LightmapSettings: m_LightmapParameters: {fileID: 0} m_LightmapsBakeMode: 1 m_TextureCompression: 0 - m_FinalGather: 0 - m_FinalGatherFiltering: 1 - m_FinalGatherRayCount: 1024 m_ReflectionCompression: 2 m_MixedBakeMode: 1 m_BakeBackend: 0 @@ -105,7 +101,7 @@ NavMeshSettings: serializedVersion: 2 m_ObjectHideFlags: 0 m_BuildSettings: - serializedVersion: 2 + serializedVersion: 3 agentTypeID: 0 agentRadius: 0.5 agentHeight: 2 @@ -118,7 +114,7 @@ NavMeshSettings: cellSize: 0.16666666 manualTileSize: 0 tileSize: 256 - accuratePlacement: 0 + buildHeightMesh: 0 maxJobWorkers: 0 preserveTilesOutsideBounds: 0 debug: @@ -153,9 +149,9 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: -1} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1124877095} - m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -220,20 +216,23 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 0 m_isCullingEnabled: 0 @@ -248,11 +247,12 @@ MonoBehaviour: m_margin: {x: 0, y: 0, z: 0, w: 0} m_isUsingLegacyAnimationComponent: 0 m_isVolumetricText: 0 + _SortingLayer: 0 + _SortingLayerID: 0 + _SortingOrder: 0 m_hasFontAssetChanged: 0 m_renderer: {fileID: 62236176} m_maskType: 0 - _SortingLayerID: 0 - _SortingOrder: 0 --- !u!23 &62236176 MeshRenderer: m_ObjectHideFlags: 0 @@ -264,11 +264,17 @@ MeshRenderer: m_CastShadows: 0 m_ReceiveShadows: 0 m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -290,9 +296,11 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 + m_MaskInteraction: 0 m_AdditionalVertexStreams: {fileID: 0} --- !u!114 &62236177 MonoBehaviour: @@ -335,11 +343,11 @@ RectTransform: 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: 73838348} - {fileID: 1538186655} m_Father: {fileID: 1187011252} - m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} @@ -394,9 +402,9 @@ RectTransform: 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: 67477253} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} @@ -470,9 +478,9 @@ RectTransform: 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: 676739119} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -565,9 +573,9 @@ RectTransform: 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: 1928037890} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} @@ -638,12 +646,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 162042368} + serializedVersion: 2 m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0.0125, z: 1} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1124877095} - m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!64 &162042370 MeshCollider: @@ -653,9 +662,17 @@ MeshCollider: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 162042368} m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 m_IsTrigger: 0 + m_ProvidesContacts: 0 m_Enabled: 1 - serializedVersion: 4 + serializedVersion: 5 m_Convex: 0 m_CookingOptions: 30 m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} @@ -670,11 +687,17 @@ MeshRenderer: m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -696,9 +719,11 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 + m_MaskInteraction: 0 m_AdditionalVertexStreams: {fileID: 0} --- !u!33 &162042372 MeshFilter: @@ -733,12 +758,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 215995290} + serializedVersion: 2 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: 789220865} - m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!23 &215995292 MeshRenderer: @@ -751,11 +777,17 @@ MeshRenderer: m_CastShadows: 0 m_ReceiveShadows: 0 m_DynamicOccludee: 0 + m_StaticShadowCaster: 0 m_MotionVectors: 2 m_LightProbeUsage: 0 m_ReflectionProbeUsage: 0 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -777,9 +809,11 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 + m_MaskInteraction: 0 m_AdditionalVertexStreams: {fileID: 0} --- !u!33 &215995293 MeshFilter: @@ -794,6 +828,7 @@ PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: + serializedVersion: 3 m_TransformParent: {fileID: 1090070598} m_Modifications: - target: {fileID: 7852221720480299766, guid: 046dde0f4600bce41ad33c476f99b309, @@ -876,32 +911,15 @@ PrefabInstance: propertyPath: m_LocalEulerAnglesHint.z value: 0 objectReference: {fileID: 0} - - target: {fileID: 7852221720741322892, guid: 046dde0f4600bce41ad33c476f99b309, - type: 3} - propertyPath: m_LocalScale.x - value: 40 - objectReference: {fileID: 0} - - target: {fileID: 7852221720741322892, guid: 046dde0f4600bce41ad33c476f99b309, - type: 3} - propertyPath: m_LocalScale.y - value: 40 - objectReference: {fileID: 0} - - target: {fileID: 7852221720969441490, guid: 046dde0f4600bce41ad33c476f99b309, - type: 3} - propertyPath: m_LocalScale.x - value: 20 - objectReference: {fileID: 0} - - target: {fileID: 7852221720969441490, guid: 046dde0f4600bce41ad33c476f99b309, - type: 3} - propertyPath: m_LocalScale.y - value: 20 - objectReference: {fileID: 0} - target: {fileID: 7852221720971737233, guid: 046dde0f4600bce41ad33c476f99b309, type: 3} propertyPath: m_LocalPosition.y value: -4 objectReference: {fileID: 0} m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 046dde0f4600bce41ad33c476f99b309, type: 3} --- !u!4 &229068763 stripped Transform: @@ -949,9 +967,17 @@ MeshCollider: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 240056260} m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 m_IsTrigger: 0 + m_ProvidesContacts: 0 m_Enabled: 1 - serializedVersion: 4 + serializedVersion: 5 m_Convex: 0 m_CookingOptions: 30 m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} @@ -966,11 +992,17 @@ MeshRenderer: m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -992,9 +1024,11 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 + m_MaskInteraction: 0 m_AdditionalVertexStreams: {fileID: 0} --- !u!33 &240056264 MeshFilter: @@ -1011,12 +1045,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 240056260} + serializedVersion: 2 m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 1} m_LocalScale: {x: 0.044999998, y: 0.044999998, z: 3} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 820952285} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &302169896 GameObject: @@ -1045,11 +1080,11 @@ RectTransform: 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: 2061863457} - {fileID: 686739139} m_Father: {fileID: 1187011252} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} @@ -1152,7 +1187,9 @@ Canvas: m_OverrideSorting: 0 m_OverridePixelPerfect: 0 m_SortingBucketNormalizedSize: 0 + m_VertexColorAlwaysGammaSpace: 0 m_AdditionalShaderChannelsFlag: 25 + m_UpdateRectTransformForStandalone: 0 m_SortingLayerID: 0 m_SortingOrder: 0 m_TargetDisplay: 0 @@ -1166,10 +1203,10 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 0, y: 0, z: 0} + m_ConstrainProportionsScale: 0 m_Children: - {fileID: 676739119} m_Father: {fileID: 0} - m_RootOrder: 8 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -1200,12 +1237,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 375851675} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0.7071068, z: -0.7071068, w: 0} m_LocalPosition: {x: 0, y: 10, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1532567794} - m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 90, y: 180, z: 0} --- !u!20 &375851677 Camera: @@ -1221,9 +1259,17 @@ Camera: m_projectionMatrixMode: 1 m_GateFitMode: 2 m_FOVAxisMode: 0 + m_Iso: 200 + m_ShutterSpeed: 0.005 + m_Aperture: 16 + m_FocusDistance: 10 + m_FocalLength: 50 + m_BladeCount: 5 + m_Curvature: {x: 2, y: 11} + m_BarrelClipping: 0.25 + m_Anamorphism: 0 m_SensorSize: {x: 36, y: 24} m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 m_NormalizedViewPortRect: serializedVersion: 2 x: 0 @@ -1255,6 +1301,7 @@ PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: + serializedVersion: 3 m_TransformParent: {fileID: 0} m_Modifications: - target: {fileID: 8326552097884649274, guid: 897fa55d98f1f7f40b889f93ce9146f4, @@ -1328,6 +1375,9 @@ PrefabInstance: value: 90 objectReference: {fileID: 0} m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 897fa55d98f1f7f40b889f93ce9146f4, type: 3} --- !u!1 &441433737 GameObject: @@ -1355,12 +1405,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 441433737} + serializedVersion: 2 m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 4} m_LocalScale: {x: 2, y: 2, z: 2} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1124877095} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!64 &441433739 MeshCollider: @@ -1370,9 +1421,17 @@ MeshCollider: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 441433737} m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 m_IsTrigger: 0 + m_ProvidesContacts: 0 m_Enabled: 1 - serializedVersion: 4 + serializedVersion: 5 m_Convex: 0 m_CookingOptions: 30 m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} @@ -1387,11 +1446,17 @@ MeshRenderer: m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -1413,9 +1478,11 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 + m_MaskInteraction: 0 m_AdditionalVertexStreams: {fileID: 0} --- !u!33 &441433741 MeshFilter: @@ -1453,9 +1520,9 @@ RectTransform: 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: 2039345446} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -1542,11 +1609,17 @@ MeshRenderer: m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -1568,9 +1641,11 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 + m_MaskInteraction: 0 m_AdditionalVertexStreams: {fileID: 0} --- !u!33 &507446969 MeshFilter: @@ -1587,18 +1662,20 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 507446966} + serializedVersion: 2 m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 5} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1183010124} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1001 &556481138 PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: + serializedVersion: 3 m_TransformParent: {fileID: 1090070598} m_Modifications: - target: {fileID: 7852221720480299766, guid: 046dde0f4600bce41ad33c476f99b309, @@ -1681,32 +1758,15 @@ PrefabInstance: propertyPath: m_LocalEulerAnglesHint.z value: 0 objectReference: {fileID: 0} - - target: {fileID: 7852221720741322892, guid: 046dde0f4600bce41ad33c476f99b309, - type: 3} - propertyPath: m_LocalScale.x - value: 40 - objectReference: {fileID: 0} - - target: {fileID: 7852221720741322892, guid: 046dde0f4600bce41ad33c476f99b309, - type: 3} - propertyPath: m_LocalScale.y - value: 40 - objectReference: {fileID: 0} - - target: {fileID: 7852221720969441490, guid: 046dde0f4600bce41ad33c476f99b309, - type: 3} - propertyPath: m_LocalScale.x - value: 20 - objectReference: {fileID: 0} - - target: {fileID: 7852221720969441490, guid: 046dde0f4600bce41ad33c476f99b309, - type: 3} - propertyPath: m_LocalScale.y - value: 20 - objectReference: {fileID: 0} - target: {fileID: 7852221720971737233, guid: 046dde0f4600bce41ad33c476f99b309, type: 3} propertyPath: m_LocalPosition.y value: -4 objectReference: {fileID: 0} m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 046dde0f4600bce41ad33c476f99b309, type: 3} --- !u!1 &599096482 stripped GameObject: @@ -1769,11 +1829,11 @@ RectTransform: 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: 2039345446} - {fileID: 1808942506} m_Father: {fileID: 1236141028} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} @@ -1856,9 +1916,9 @@ RectTransform: 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: 676739119} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 1, y: 1} @@ -1924,20 +1984,23 @@ MonoBehaviour: m_VerticalAlignment: 256 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 @@ -2013,13 +2076,13 @@ RectTransform: 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: 671490389} - {fileID: 87390263} - {fileID: 1187011252} - {fileID: 1236141028} m_Father: {fileID: 344649059} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -2132,9 +2195,9 @@ RectTransform: 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: 302169897} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -2200,20 +2263,23 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 @@ -2266,11 +2332,11 @@ RectTransform: 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: 1691202846} - {fileID: 840997727} m_Father: {fileID: 1187011252} - m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} @@ -2326,9 +2392,11 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 753458616} + serializedVersion: 2 m_LocalRotation: {x: 0.7071068, y: 0, z: 0, w: 0.7071068} m_LocalPosition: {x: 0, y: -5, z: 0} m_LocalScale: {x: 1024, y: 1024, z: 1024} + m_ConstrainProportionsScale: 0 m_Children: - {fileID: 1807969627} - {fileID: 1466792827} @@ -2336,7 +2404,6 @@ Transform: - {fileID: 1328848283} - {fileID: 6977256487279145164} m_Father: {fileID: 0} - m_RootOrder: 11 m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} --- !u!1 &789220864 GameObject: @@ -2361,15 +2428,16 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 789220864} + serializedVersion: 2 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: 1489231075} - {fileID: 1223346183} - {fileID: 215995291} m_Father: {fileID: 753458617} - m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &801092328 GameObject: @@ -2397,12 +2465,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 801092328} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 0.015, y: 0.015, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 820952285} - m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &801092330 MonoBehaviour: @@ -2427,11 +2496,17 @@ MeshRenderer: m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -2453,9 +2528,11 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 + m_MaskInteraction: 0 m_AdditionalVertexStreams: {fileID: 0} --- !u!33 &801092332 MeshFilter: @@ -2488,15 +2565,16 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 820952284} + serializedVersion: 2 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: 1124877095} - {fileID: 240056265} - {fileID: 801092329} m_Father: {fileID: 2067021207} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &840997726 GameObject: @@ -2526,9 +2604,9 @@ RectTransform: 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: 719378462} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -2594,20 +2672,23 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 @@ -2658,12 +2739,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 855309154} + serializedVersion: 2 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: 1328848283} - m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!23 &855309156 MeshRenderer: @@ -2676,11 +2758,17 @@ MeshRenderer: m_CastShadows: 0 m_ReceiveShadows: 0 m_DynamicOccludee: 0 + m_StaticShadowCaster: 0 m_MotionVectors: 2 m_LightProbeUsage: 0 m_ReflectionProbeUsage: 0 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -2702,9 +2790,11 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 + m_MaskInteraction: 0 m_AdditionalVertexStreams: {fileID: 0} --- !u!33 &855309157 MeshFilter: @@ -2719,6 +2809,7 @@ PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: + serializedVersion: 3 m_TransformParent: {fileID: 0} m_Modifications: - target: {fileID: 235077144, guid: 897fa55d98f1f7f40b889f93ce9146f4, type: 3} @@ -2791,6 +2882,9 @@ PrefabInstance: value: 0 objectReference: {fileID: 0} m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 897fa55d98f1f7f40b889f93ce9146f4, type: 3} --- !u!1 &942014700 GameObject: @@ -2816,12 +2910,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 942014700} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0.7071068, z: -0.7071068, w: 0} m_LocalPosition: {x: 0, y: 10, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1532567794} - m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 90, y: 180, z: 0} --- !u!20 &942014702 Camera: @@ -2837,9 +2932,17 @@ Camera: m_projectionMatrixMode: 1 m_GateFitMode: 2 m_FOVAxisMode: 0 + m_Iso: 200 + m_ShutterSpeed: 0.005 + m_Aperture: 16 + m_FocusDistance: 10 + m_FocalLength: 50 + m_BladeCount: 5 + m_Curvature: {x: 2, y: 11} + m_BarrelClipping: 0.25 + m_Anamorphism: 0 m_SensorSize: {x: 36, y: 24} m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 m_NormalizedViewPortRect: serializedVersion: 2 x: 0 @@ -2897,9 +3000,17 @@ Camera: m_projectionMatrixMode: 1 m_GateFitMode: 2 m_FOVAxisMode: 0 + m_Iso: 200 + m_ShutterSpeed: 0.005 + m_Aperture: 16 + m_FocusDistance: 10 + m_FocalLength: 50 + m_BladeCount: 5 + m_Curvature: {x: 2, y: 11} + m_BarrelClipping: 0.25 + m_Anamorphism: 0 m_SensorSize: {x: 36, y: 24} m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 m_NormalizedViewPortRect: serializedVersion: 2 x: 0 @@ -2933,12 +3044,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 983613690} + serializedVersion: 2 m_LocalRotation: {x: 0.7071068, y: -0, z: -0, w: 0.7071068} m_LocalPosition: {x: 0, y: 10, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 0} - m_RootOrder: 10 m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} --- !u!1 &1073373262 GameObject: @@ -2971,9 +3083,17 @@ Camera: m_projectionMatrixMode: 1 m_GateFitMode: 2 m_FOVAxisMode: 0 + m_Iso: 200 + m_ShutterSpeed: 0.005 + m_Aperture: 16 + m_FocusDistance: 10 + m_FocalLength: 50 + m_BladeCount: 5 + m_Curvature: {x: 2, y: 11} + m_BarrelClipping: 0.25 + m_Anamorphism: 0 m_SensorSize: {x: 36, y: 24} m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 m_NormalizedViewPortRect: serializedVersion: 2 x: 0 @@ -3007,12 +3127,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1073373262} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0.7071068, z: -0.7071068, w: 0} m_LocalPosition: {x: 0, y: 10, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1532567794} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 90, y: 180, z: 0} --- !u!1 &1090070596 GameObject: @@ -3051,15 +3172,16 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1090070596} + serializedVersion: 2 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: 1647759374} - {fileID: 229068763} - {fileID: 734604127} m_Father: {fileID: 0} - m_RootOrder: 13 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1124877094 GameObject: @@ -3086,9 +3208,11 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1124877094} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0.25, y: 0.25, z: 0} m_LocalScale: {x: 0.015, y: 0.015, z: 1} + m_ConstrainProportionsScale: 0 m_Children: - {fileID: 1520024706} - {fileID: 441433738} @@ -3096,7 +3220,6 @@ Transform: - {fileID: 162042369} - {fileID: 62236174} m_Father: {fileID: 820952285} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &1124877096 MonoBehaviour: @@ -3126,6 +3249,8 @@ MonoBehaviour: Secondary: {fileID: 441433740} Influence: {fileID: 1190354611} Label: {fileID: 62236175} + IconContainer: {fileID: 0} + Clickable: {fileID: 0} --- !u!4 &1128149392 stripped Transform: m_CorrespondingSourceObject: {fileID: 7852221720971737233, guid: 046dde0f4600bce41ad33c476f99b309, @@ -3156,15 +3281,16 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1183010123} + serializedVersion: 2 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: 1940409868} - {fileID: 507446970} - {fileID: 2067021207} m_Father: {fileID: 0} - m_RootOrder: 7 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &1183010125 MonoBehaviour: @@ -3208,6 +3334,8 @@ MonoBehaviour: m_PreInfinity: 2 m_PostInfinity: 2 m_RotationOrder: 4 + PlayerLocationLabelColor: {r: 0, g: 0, b: 0, a: 0} + PlayerLocationIconSize: 1.25 --- !u!1 &1187011251 GameObject: m_ObjectHideFlags: 0 @@ -3236,13 +3364,13 @@ RectTransform: 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: 1928037890} - {fileID: 302169897} - {fileID: 719378462} - {fileID: 67477253} m_Father: {fileID: 676739119} - m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} @@ -3315,12 +3443,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1190354608} + serializedVersion: 2 m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 15, y: 15, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1124877095} - m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!64 &1190354610 MeshCollider: @@ -3330,9 +3459,17 @@ MeshCollider: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1190354608} m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 m_IsTrigger: 0 + m_ProvidesContacts: 0 m_Enabled: 1 - serializedVersion: 4 + serializedVersion: 5 m_Convex: 0 m_CookingOptions: 30 m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} @@ -3347,11 +3484,17 @@ MeshRenderer: m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -3373,9 +3516,11 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 + m_MaskInteraction: 0 m_AdditionalVertexStreams: {fileID: 0} --- !u!33 &1190354612 MeshFilter: @@ -3410,12 +3555,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1223346182} + serializedVersion: 2 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: 789220865} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!23 &1223346184 MeshRenderer: @@ -3428,11 +3574,17 @@ MeshRenderer: m_CastShadows: 0 m_ReceiveShadows: 0 m_DynamicOccludee: 0 + m_StaticShadowCaster: 0 m_MotionVectors: 2 m_LightProbeUsage: 0 m_ReflectionProbeUsage: 0 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -3454,9 +3606,11 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 + m_MaskInteraction: 0 m_AdditionalVertexStreams: {fileID: 0} --- !u!33 &1223346185 MeshFilter: @@ -3494,10 +3648,10 @@ RectTransform: 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: 652433664} m_Father: {fileID: 676739119} - m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} @@ -3568,12 +3722,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1307174805} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0.7071068, z: -0.7071068, w: 0} m_LocalPosition: {x: 0, y: 10, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1532567794} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 90, y: 180, z: 0} --- !u!20 &1307174807 Camera: @@ -3589,9 +3744,17 @@ Camera: m_projectionMatrixMode: 1 m_GateFitMode: 2 m_FOVAxisMode: 0 + m_Iso: 200 + m_ShutterSpeed: 0.005 + m_Aperture: 16 + m_FocusDistance: 10 + m_FocalLength: 50 + m_BladeCount: 5 + m_Curvature: {x: 2, y: 11} + m_BarrelClipping: 0.25 + m_Anamorphism: 0 m_SensorSize: {x: 36, y: 24} m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 m_NormalizedViewPortRect: serializedVersion: 2 x: 0 @@ -3606,7 +3769,7 @@ Camera: m_Depth: 0 m_CullingMask: serializedVersion: 2 - m_Bits: 5632 + m_Bits: 5120 m_RenderingPath: 1 m_TargetTexture: {fileID: 8400000, guid: 06ec5ef8a5830fc44b1ac1a6e123add5, type: 2} m_TargetDisplay: 0 @@ -3684,8 +3847,13 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 8c03374f22d0a3d4882018de66894a84, type: 3} m_Name: m_EditorClassIdentifier: - _volMaterial: {fileID: 2100000, guid: ad63650ae6d6cc542a5aad16694b3c46, type: 2} - GridTransform: {fileID: 753458617} + GridMesh: {fileID: 0} + GridCamera: {fileID: 0} + Settings: {fileID: 0} + NebulaSurfaceHeight: {fileID: 0} + NebulaPatchHeight: {fileID: 0} + NebulaPatch: {fileID: 0} + NebulaTint: {fileID: 0} --- !u!114 &1314993071 MonoBehaviour: m_ObjectHideFlags: 0 @@ -3744,7 +3912,9 @@ MonoBehaviour: m_ShowCustomSorter: 0 breakBeforeColorGrading: 0 m_BeforeTransparentBundles: [] - m_BeforeStackBundles: [] + m_BeforeStackBundles: + - assemblyQualifiedName: UnityEngine.Rendering.PostProcessing.DepthOfField, Assembly-CSharp, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null m_AfterStackBundles: [] --- !u!20 &1314993072 Camera: @@ -3760,9 +3930,17 @@ Camera: m_projectionMatrixMode: 1 m_GateFitMode: 2 m_FOVAxisMode: 0 + m_Iso: 200 + m_ShutterSpeed: 0.005 + m_Aperture: 16 + m_FocusDistance: 10 + m_FocalLength: 50 + m_BladeCount: 5 + m_Curvature: {x: 2, y: 11} + m_BarrelClipping: 0.25 + m_Anamorphism: 0 m_SensorSize: {x: 36, y: 24} m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 m_NormalizedViewPortRect: serializedVersion: 2 x: 0 @@ -3796,12 +3974,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1314993065} + serializedVersion: 2 m_LocalRotation: {x: 0.2267062, y: 0.44560468, z: -0.11773936, w: 0.8580083} m_LocalPosition: {x: -299.03247, y: -38.375748, z: -188.30061} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 0} - m_RootOrder: 9 m_LocalEulerAnglesHint: {x: 20, y: 0, z: 0} --- !u!1 &1328848282 GameObject: @@ -3826,15 +4005,16 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1328848282} + serializedVersion: 2 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: 1563996706} - {fileID: 1584275846} - {fileID: 855309155} m_Father: {fileID: 753458617} - m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1388747984 GameObject: @@ -3859,13 +4039,14 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1388747984} + serializedVersion: 2 m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 3} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: - {fileID: 1955533727} m_Father: {fileID: 2067021207} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1404197274 GameObject: @@ -3960,9 +4141,17 @@ Camera: m_projectionMatrixMode: 1 m_GateFitMode: 2 m_FOVAxisMode: 0 + m_Iso: 200 + m_ShutterSpeed: 0.005 + m_Aperture: 16 + m_FocusDistance: 10 + m_FocalLength: 50 + m_BladeCount: 5 + m_Curvature: {x: 2, y: 11} + m_BarrelClipping: 0.25 + m_Anamorphism: 0 m_SensorSize: {x: 36, y: 24} m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 m_NormalizedViewPortRect: serializedVersion: 2 x: 0 @@ -3996,12 +4185,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1404197274} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: -1} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 0} - m_RootOrder: 5 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &1404197280 MonoBehaviour: @@ -4051,9 +4241,17 @@ Camera: m_projectionMatrixMode: 1 m_GateFitMode: 2 m_FOVAxisMode: 0 + m_Iso: 200 + m_ShutterSpeed: 0.005 + m_Aperture: 16 + m_FocusDistance: 10 + m_FocalLength: 50 + m_BladeCount: 5 + m_Curvature: {x: 2, y: 11} + m_BarrelClipping: 0.25 + m_Anamorphism: 0 m_SensorSize: {x: 36, y: 24} m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 m_NormalizedViewPortRect: serializedVersion: 2 x: 0 @@ -4087,12 +4285,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1462895483} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: -1} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 0} - m_RootOrder: 6 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &1462895486 MonoBehaviour: @@ -4155,12 +4354,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1466792826} + serializedVersion: 2 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: 753458617} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!23 &1466792829 MeshRenderer: @@ -4173,11 +4373,17 @@ MeshRenderer: m_CastShadows: 0 m_ReceiveShadows: 0 m_DynamicOccludee: 0 + m_StaticShadowCaster: 0 m_MotionVectors: 2 m_LightProbeUsage: 0 m_ReflectionProbeUsage: 0 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -4199,9 +4405,11 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 + m_MaskInteraction: 0 m_AdditionalVertexStreams: {fileID: 0} --- !u!33 &1466792830 MeshFilter: @@ -4254,7 +4462,11 @@ MonoBehaviour: NearClipPlane: 0.3 FarClipPlane: 4096 Dutch: 0 + ModeOverride: 0 LensShift: {x: 0, y: 0} + GateFit: 2 + FocusDistance: 10 + m_SensorSize: {x: 1, y: 1} m_Transitions: m_BlendHint: 0 m_InheritPosition: 0 @@ -4270,13 +4482,14 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1479254159} + serializedVersion: 2 m_LocalRotation: {x: 0.2267062, y: 0.44560468, z: -0.11773936, w: 0.8580083} m_LocalPosition: {x: -299.03247, y: -38.375748, z: -188.30061} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: - {fileID: 1547641803} m_Father: {fileID: 0} - m_RootOrder: 14 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1489231074 GameObject: @@ -4303,12 +4516,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1489231074} + serializedVersion: 2 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: 789220865} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!23 &1489231076 MeshRenderer: @@ -4321,11 +4535,17 @@ MeshRenderer: m_CastShadows: 0 m_ReceiveShadows: 0 m_DynamicOccludee: 0 + m_StaticShadowCaster: 0 m_MotionVectors: 2 m_LightProbeUsage: 0 m_ReflectionProbeUsage: 0 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -4347,9 +4567,11 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 + m_MaskInteraction: 0 m_AdditionalVertexStreams: {fileID: 0} --- !u!33 &1489231077 MeshFilter: @@ -4391,12 +4613,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1520024705} + serializedVersion: 2 m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 2} m_LocalScale: {x: 0.87800574, y: 0.87800574, z: 1.7560115} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1124877095} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!64 &1520024707 MeshCollider: @@ -4406,9 +4629,17 @@ MeshCollider: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1520024705} m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 m_IsTrigger: 0 + m_ProvidesContacts: 0 m_Enabled: 1 - serializedVersion: 4 + serializedVersion: 5 m_Convex: 0 m_CookingOptions: 30 m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} @@ -4423,11 +4654,17 @@ MeshRenderer: m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -4449,9 +4686,11 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 + m_MaskInteraction: 0 m_AdditionalVertexStreams: {fileID: 0} --- !u!33 &1520024709 MeshFilter: @@ -4484,16 +4723,17 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1532567792} + serializedVersion: 2 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: 1073373264} - {fileID: 1307174806} - {fileID: 942014701} - {fileID: 375851676} m_Father: {fileID: 0} - m_RootOrder: 12 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1538186654 GameObject: @@ -4523,9 +4763,9 @@ RectTransform: 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: 67477253} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -4591,20 +4831,23 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 @@ -4656,12 +4899,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1547641802} + serializedVersion: 2 m_LocalRotation: {x: -0.7071068, y: -0, z: -0, w: 0.7071068} m_LocalPosition: {x: -58.728523, y: 4.327759, z: 429.1176} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1479254161} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &1547641804 MonoBehaviour: @@ -4770,12 +5014,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1563996705} + serializedVersion: 2 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: 1328848283} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!23 &1563996707 MeshRenderer: @@ -4788,11 +5033,17 @@ MeshRenderer: m_CastShadows: 0 m_ReceiveShadows: 0 m_DynamicOccludee: 0 + m_StaticShadowCaster: 0 m_MotionVectors: 2 m_LightProbeUsage: 0 m_ReflectionProbeUsage: 0 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -4814,9 +5065,11 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 + m_MaskInteraction: 0 m_AdditionalVertexStreams: {fileID: 0} --- !u!33 &1563996708 MeshFilter: @@ -4851,12 +5104,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1584275845} + serializedVersion: 2 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: 1328848283} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!23 &1584275847 MeshRenderer: @@ -4869,11 +5123,17 @@ MeshRenderer: m_CastShadows: 0 m_ReceiveShadows: 0 m_DynamicOccludee: 0 + m_StaticShadowCaster: 0 m_MotionVectors: 2 m_LightProbeUsage: 0 m_ReflectionProbeUsage: 0 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -4895,9 +5155,11 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 + m_MaskInteraction: 0 m_AdditionalVertexStreams: {fileID: 0} --- !u!33 &1584275848 MeshFilter: @@ -4912,6 +5174,7 @@ PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: + serializedVersion: 3 m_TransformParent: {fileID: 1090070598} m_Modifications: - target: {fileID: 7852221720480299766, guid: 046dde0f4600bce41ad33c476f99b309, @@ -4994,32 +5257,15 @@ PrefabInstance: propertyPath: m_LocalEulerAnglesHint.z value: 0 objectReference: {fileID: 0} - - target: {fileID: 7852221720741322892, guid: 046dde0f4600bce41ad33c476f99b309, - type: 3} - propertyPath: m_LocalScale.x - value: 40 - objectReference: {fileID: 0} - - target: {fileID: 7852221720741322892, guid: 046dde0f4600bce41ad33c476f99b309, - type: 3} - propertyPath: m_LocalScale.y - value: 40 - objectReference: {fileID: 0} - - target: {fileID: 7852221720969441490, guid: 046dde0f4600bce41ad33c476f99b309, - type: 3} - propertyPath: m_LocalScale.x - value: 20 - objectReference: {fileID: 0} - - target: {fileID: 7852221720969441490, guid: 046dde0f4600bce41ad33c476f99b309, - type: 3} - propertyPath: m_LocalScale.y - value: 20 - objectReference: {fileID: 0} - target: {fileID: 7852221720971737233, guid: 046dde0f4600bce41ad33c476f99b309, type: 3} propertyPath: m_LocalPosition.y value: -4 objectReference: {fileID: 0} m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 046dde0f4600bce41ad33c476f99b309, type: 3} --- !u!4 &1647759374 stripped Transform: @@ -5055,9 +5301,9 @@ RectTransform: 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: 719378462} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} @@ -5127,12 +5373,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1807969626} + serializedVersion: 2 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: 753458617} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!23 &1807969629 MeshRenderer: @@ -5145,11 +5392,17 @@ MeshRenderer: m_CastShadows: 0 m_ReceiveShadows: 0 m_DynamicOccludee: 0 + m_StaticShadowCaster: 0 m_MotionVectors: 2 m_LightProbeUsage: 0 m_ReflectionProbeUsage: 0 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -5171,9 +5424,11 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 + m_MaskInteraction: 0 m_AdditionalVertexStreams: {fileID: 0} --- !u!33 &1807969630 MeshFilter: @@ -5211,9 +5466,9 @@ RectTransform: 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: 652433664} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -5279,20 +5534,23 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 @@ -5359,12 +5617,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1812750579} + serializedVersion: 2 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: 0} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!850595691 &1821185769 LightingSettings: @@ -5373,8 +5632,7 @@ LightingSettings: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_Name: Settings.lighting - serializedVersion: 3 - m_GIWorkflowMode: 1 + serializedVersion: 10 m_EnableBakedLightmaps: 1 m_EnableRealtimeLightmaps: 0 m_RealtimeEnvironmentLighting: 1 @@ -5382,11 +5640,19 @@ LightingSettings: m_AlbedoBoost: 1 m_IndirectOutputScale: 1 m_UsingShadowmask: 0 - m_BakeBackend: 0 + m_BakeBackend: 1 m_LightmapMaxSize: 1024 + m_LightmapSizeFixed: 0 + m_UseMipmapLimits: 1 m_BakeResolution: 50 m_Padding: 2 - m_TextureCompression: 0 + m_LightmapCompression: 0 + m_LightmapPackingMode: 1 + m_LightmapPackingMethod: 0 + m_XAtlasPackingAttempts: 16384 + m_XAtlasBruteForce: 0 + m_XAtlasBlockAlign: 0 + m_XAtlasRepackUnderutilizedLightmaps: 1 m_AO: 0 m_AOMaxDistance: 1 m_CompAOExponent: 0 @@ -5397,13 +5663,11 @@ LightingSettings: m_FilterMode: 1 m_LightmapParameters: {fileID: 15204, guid: 0000000000000000f000000000000000, type: 0} m_ExportTrainingData: 0 + m_EnableWorkerProcessBaking: 1 m_TrainingDataDestination: TrainingData m_RealtimeResolution: 1 m_ForceWhiteAlbedo: 0 m_ForceUpdates: 0 - m_FinalGather: 0 - m_FinalGatherRayCount: 1024 - m_FinalGatherFiltering: 1 m_PVRCulling: 1 m_PVRSampling: 1 m_PVRDirectSampleCount: 32 @@ -5413,7 +5677,7 @@ LightingSettings: m_LightProbeSampleCountMultiplier: 4 m_PVRBounces: 2 m_PVRMinBounces: 2 - m_PVREnvironmentMIS: 0 + m_PVREnvironmentImportanceSampling: 0 m_PVRFilteringMode: 0 m_PVRDenoiserTypeDirect: 0 m_PVRDenoiserTypeIndirect: 0 @@ -5427,6 +5691,7 @@ LightingSettings: m_PVRFilteringAtrousPositionSigmaDirect: 0.5 m_PVRFilteringAtrousPositionSigmaIndirect: 2 m_PVRFilteringAtrousPositionSigmaAO: 1 + m_RespectSceneVisibilityWhenBakingGI: 0 --- !u!1 &1928037889 GameObject: m_ObjectHideFlags: 0 @@ -5454,11 +5719,11 @@ RectTransform: 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: 115022189} - {fileID: 2008674250} m_Father: {fileID: 1187011252} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} @@ -5514,11 +5779,17 @@ MeshRenderer: m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -5540,9 +5811,11 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 + m_MaskInteraction: 0 m_AdditionalVertexStreams: {fileID: 0} --- !u!33 &1940409867 MeshFilter: @@ -5559,12 +5832,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1940409864} + serializedVersion: 2 m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0.5} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1183010124} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1955533722 GameObject: @@ -5606,9 +5880,17 @@ MeshCollider: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1955533722} m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 m_IsTrigger: 0 + m_ProvidesContacts: 0 m_Enabled: 1 - serializedVersion: 4 + serializedVersion: 5 m_Convex: 0 m_CookingOptions: 30 m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} @@ -5623,11 +5905,17 @@ MeshRenderer: m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -5649,9 +5937,11 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 + m_MaskInteraction: 0 m_AdditionalVertexStreams: {fileID: 0} --- !u!33 &1955533726 MeshFilter: @@ -5668,12 +5958,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1955533722} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0.25, y: 0.25, z: 0} m_LocalScale: {x: 0.1, y: 0.002, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1388747985} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1988754119 GameObject: @@ -5712,12 +6003,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1988754119} + serializedVersion: 2 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: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &2008674249 GameObject: @@ -5747,9 +6039,9 @@ RectTransform: 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: 1928037890} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -5815,20 +6107,23 @@ MonoBehaviour: m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 + m_characterHorizontalScale: 1 m_wordSpacing: 0 m_lineSpacing: 0 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 + m_TextWrappingMode: 1 m_wordWrappingRatios: 0.4 m_overflowMode: 0 m_linkedTextComponent: {fileID: 0} parentLinkedComponent: {fileID: 0} m_enableKerning: 1 + m_ActiveFontFeatures: 6e72656b6167696c m_enableExtraPadding: 0 checkPaddingRequired: 0 m_isRichText: 1 + m_EmojiFallbackSupport: 1 m_parseCtrlCharacters: 1 m_isOrthographic: 1 m_isCullingEnabled: 0 @@ -5882,10 +6177,10 @@ RectTransform: 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: 453065208} m_Father: {fileID: 652433664} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} @@ -5958,9 +6253,9 @@ RectTransform: 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: 302169897} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 1} @@ -6028,20 +6323,22 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2067021206} + serializedVersion: 2 m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: -0.5, y: -0.5, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: - {fileID: 820952285} - {fileID: 1388747985} m_Father: {fileID: 1183010124} - m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1001 &6977256487279145163 PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: + serializedVersion: 3 m_TransformParent: {fileID: 753458617} m_Modifications: - target: {fileID: 2784739443721397315, guid: efd1f097ce29ffa48bb0045d6502f55d, @@ -6115,6 +6412,13 @@ PrefabInstance: value: 0 objectReference: {fileID: 0} m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: + - targetCorrespondingSourceObject: {fileID: 6977256487485077368, guid: efd1f097ce29ffa48bb0045d6502f55d, + type: 3} + insertIndex: -1 + addedObject: {fileID: 599096484} m_SourcePrefab: {fileID: 100100000, guid: efd1f097ce29ffa48bb0045d6502f55d, type: 3} --- !u!4 &6977256487279145164 stripped Transform: @@ -6127,6 +6431,7 @@ PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: + serializedVersion: 3 m_TransformParent: {fileID: 0} m_Modifications: - target: {fileID: 7383646976225659329, guid: eb3a880755444d144a4d7f13ef11df77, @@ -6200,4 +6505,26 @@ PrefabInstance: value: 0 objectReference: {fileID: 0} m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: eb3a880755444d144a4d7f13ef11df77, type: 3} +--- !u!1660057539 &9223372036854775807 +SceneRoots: + m_ObjectHideFlags: 0 + m_Roots: + - {fileID: 1988754121} + - {fileID: 1812750581} + - {fileID: 7383646976240752633} + - {fileID: 426221916} + - {fileID: 924112690} + - {fileID: 1404197278} + - {fileID: 1462895485} + - {fileID: 1183010124} + - {fileID: 344649059} + - {fileID: 1314993073} + - {fileID: 983613692} + - {fileID: 753458617} + - {fileID: 1532567794} + - {fileID: 1090070598} + - {fileID: 1479254161} diff --git a/Assets/Scripts/AetheriaInput.cs b/Assets/Scripts/AetheriaInput.cs index c6eb618c2..373c0b8bb 100644 --- a/Assets/Scripts/AetheriaInput.cs +++ b/Assets/Scripts/AetheriaInput.cs @@ -162,6 +162,16 @@ public partial class @AetheriaInput: IInputActionCollection2, IDisposable ""initialStateCheck"": false, ""priority"": 0 }, + { + ""name"": ""Cycle Target Item"", + ""type"": ""Button"", + ""id"": ""3f9a2f0a-6e3f-4a53-9f5e-1a9c1e6d9f7b"", + ""expectedControlType"": ""Button"", + ""processors"": """", + ""interactions"": """", + ""initialStateCheck"": false, + ""priority"": 0 + }, { ""name"": ""Toggle Heatsinks"", ""type"": ""Button"", @@ -241,22 +251,86 @@ public partial class @AetheriaInput: IInputActionCollection2, IDisposable ""interactions"": """", ""initialStateCheck"": true, ""priority"": 0 + }, + { + ""name"": ""Face Aim"", + ""type"": ""Button"", + ""id"": ""6d5bd565-8c0e-4789-9d51-177dc0ec8e11"", + ""expectedControlType"": ""Button"", + ""processors"": """", + ""interactions"": """", + ""initialStateCheck"": false, + ""priority"": 0 + }, + { + ""name"": ""Toggle Face Aim"", + ""type"": ""Button"", + ""id"": ""4067c72f-3e3d-4d7b-a8b5-356cab9793fc"", + ""expectedControlType"": ""Button"", + ""processors"": """", + ""interactions"": """", + ""initialStateCheck"": false, + ""priority"": 0 } ], ""bindings"": [ { - ""name"": """", + ""name"": ""Gamepad Move"", ""id"": ""978bfe49-cc26-4a3d-ab7b-7d7a29327403"", - ""path"": ""/leftStick"", + ""path"": ""2DVector(mode=2)"", + ""interactions"": """", + ""processors"": """", + ""groups"": """", + ""action"": ""Move"", + ""isComposite"": true, + ""isPartOfComposite"": false + }, + { + ""name"": ""up"", + ""id"": ""e9c57b4d-1cd8-4b2f-93d6-1745a37cabc9"", + ""path"": ""/leftStick/up"", ""interactions"": """", ""processors"": """", ""groups"": "";Gamepad"", ""action"": ""Move"", ""isComposite"": false, - ""isPartOfComposite"": false + ""isPartOfComposite"": true }, { - ""name"": ""WASD"", + ""name"": ""down"", + ""id"": ""05f19282-8364-4ae0-b5c3-d471c10601a7"", + ""path"": ""/leftStick/down"", + ""interactions"": """", + ""processors"": """", + ""groups"": "";Gamepad"", + ""action"": ""Move"", + ""isComposite"": false, + ""isPartOfComposite"": true + }, + { + ""name"": ""left"", + ""id"": ""1ce4a07f-43af-4e82-a631-dbb43c8191d3"", + ""path"": ""/leftShoulder"", + ""interactions"": """", + ""processors"": """", + ""groups"": "";Gamepad"", + ""action"": ""Move"", + ""isComposite"": false, + ""isPartOfComposite"": true + }, + { + ""name"": ""right"", + ""id"": ""bd1aed7e-b80b-4341-a550-4ef10bacf4b4"", + ""path"": ""/rightShoulder"", + ""interactions"": """", + ""processors"": """", + ""groups"": "";Gamepad"", + ""action"": ""Move"", + ""isComposite"": false, + ""isPartOfComposite"": true + }, + { + ""name"": ""W S Q E"", ""id"": ""00ca640b-d935-4593-8157-c05846ea39b3"", ""path"": ""Dpad(mode=1)"", ""interactions"": """", @@ -291,7 +365,7 @@ public partial class @AetheriaInput: IInputActionCollection2, IDisposable { ""name"": ""left"", ""id"": ""d2581a9b-1d11-4566-b27d-b92aff5fabbc"", - ""path"": ""/a"", + ""path"": ""/q"", ""interactions"": """", ""processors"": """", ""groups"": "";Keyboard&Mouse"", @@ -302,7 +376,7 @@ public partial class @AetheriaInput: IInputActionCollection2, IDisposable { ""name"": ""right"", ""id"": ""fcfe95b8-67b9-4526-84b5-5d0bc98d6400"", - ""path"": ""/d"", + ""path"": ""/e"", ""interactions"": """", ""processors"": """", ""groups"": "";Keyboard&Mouse"", @@ -409,6 +483,17 @@ public partial class @AetheriaInput: IInputActionCollection2, IDisposable ""isComposite"": false, ""isPartOfComposite"": false }, + { + ""name"": """", + ""id"": ""8c2d5e77-4b18-4f0b-9a2e-6d3f7c1a5e90"", + ""path"": ""/j"", + ""interactions"": """", + ""processors"": """", + ""groups"": ""Keyboard&Mouse"", + ""action"": ""Cycle Target Item"", + ""isComposite"": false, + ""isPartOfComposite"": false + }, { ""name"": """", ""id"": ""71ac6088-1e18-4810-86be-1179918dd4a2"", @@ -500,7 +585,7 @@ public partial class @AetheriaInput: IInputActionCollection2, IDisposable { ""name"": ""negative"", ""id"": ""8536ca60-1fed-4f29-8060-04d46cfffcab"", - ""path"": ""/q"", + ""path"": ""/a"", ""interactions"": """", ""processors"": """", ""groups"": """", @@ -511,13 +596,57 @@ public partial class @AetheriaInput: IInputActionCollection2, IDisposable { ""name"": ""positive"", ""id"": ""19c175bf-d4e6-4626-8bee-91e0c473a94b"", - ""path"": ""/e"", + ""path"": ""/d"", ""interactions"": """", ""processors"": """", ""groups"": """", ""action"": ""Turn"", ""isComposite"": false, ""isPartOfComposite"": true + }, + { + ""name"": """", + ""id"": ""fdff8f1f-0824-49bd-b09a-c1b792f16299"", + ""path"": ""/leftStick/x"", + ""interactions"": """", + ""processors"": """", + ""groups"": "";Gamepad"", + ""action"": ""Turn"", + ""isComposite"": false, + ""isPartOfComposite"": false + }, + { + ""name"": """", + ""id"": ""1ee2fadd-3db4-45e6-8fa4-7a621ef7d165"", + ""path"": ""/leftShift"", + ""interactions"": """", + ""processors"": """", + ""groups"": ""Keyboard&Mouse"", + ""action"": ""Face Aim"", + ""isComposite"": false, + ""isPartOfComposite"": false + }, + { + ""name"": """", + ""id"": ""e9520d95-0458-439b-a37c-84c45237e110"", + ""path"": ""/capsLock"", + ""interactions"": """", + ""processors"": """", + ""groups"": ""Keyboard&Mouse"", + ""action"": ""Toggle Face Aim"", + ""isComposite"": false, + ""isPartOfComposite"": false + }, + { + ""name"": """", + ""id"": ""596ed367-be34-4951-9aac-d8caa57b411f"", + ""path"": ""/leftStickPress"", + ""interactions"": """", + ""processors"": """", + ""groups"": "";Gamepad"", + ""action"": ""Toggle Face Aim"", + ""isComposite"": false, + ""isPartOfComposite"": false } ] }, @@ -1178,6 +1307,7 @@ public partial class @AetheriaInput: IInputActionCollection2, IDisposable m_Player_TargetPrevious = m_Player.FindAction("Target Previous", throwIfNotFound: true); m_Player_TargetNext = m_Player.FindAction("Target Next", throwIfNotFound: true); m_Player_TargetNearest = m_Player.FindAction("Target Nearest", throwIfNotFound: true); + m_Player_CycleTargetItem = m_Player.FindAction("Cycle Target Item", throwIfNotFound: true); m_Player_ToggleHeatsinks = m_Player.FindAction("Toggle Heatsinks", throwIfNotFound: true); m_Player_ToggleShield = m_Player.FindAction("Toggle Shield", throwIfNotFound: true); m_Player_ToggleStance = m_Player.FindAction("Toggle Stance", throwIfNotFound: true); @@ -1186,6 +1316,8 @@ public partial class @AetheriaInput: IInputActionCollection2, IDisposable m_Player_HideUI = m_Player.FindAction("Hide UI", throwIfNotFound: true); m_Player_TractorBeam = m_Player.FindAction("Tractor Beam", throwIfNotFound: true); m_Player_Turn = m_Player.FindAction("Turn", throwIfNotFound: true); + m_Player_FaceAim = m_Player.FindAction("Face Aim", throwIfNotFound: true); + m_Player_ToggleFaceAim = m_Player.FindAction("Toggle Face Aim", throwIfNotFound: true); // UI m_UI = asset.FindActionMap("UI", throwIfNotFound: true); m_UI_Navigate = m_UI.FindAction("Navigate", throwIfNotFound: true); @@ -1294,6 +1426,7 @@ public partial class @AetheriaInput: IInputActionCollection2, IDisposable private readonly InputAction m_Player_TargetPrevious; private readonly InputAction m_Player_TargetNext; private readonly InputAction m_Player_TargetNearest; + private readonly InputAction m_Player_CycleTargetItem; private readonly InputAction m_Player_ToggleHeatsinks; private readonly InputAction m_Player_ToggleShield; private readonly InputAction m_Player_ToggleStance; @@ -1302,6 +1435,8 @@ public partial class @AetheriaInput: IInputActionCollection2, IDisposable private readonly InputAction m_Player_HideUI; private readonly InputAction m_Player_TractorBeam; private readonly InputAction m_Player_Turn; + private readonly InputAction m_Player_FaceAim; + private readonly InputAction m_Player_ToggleFaceAim; /// /// Provides access to input actions defined in input action map "Player". /// @@ -1342,6 +1477,10 @@ public partial class @AetheriaInput: IInputActionCollection2, IDisposable /// public InputAction @TargetNearest => m_Wrapper.m_Player_TargetNearest; /// + /// Provides access to the underlying input action "Player/CycleTargetItem". + /// + public InputAction @CycleTargetItem => m_Wrapper.m_Player_CycleTargetItem; + /// /// Provides access to the underlying input action "Player/ToggleHeatsinks". /// public InputAction @ToggleHeatsinks => m_Wrapper.m_Player_ToggleHeatsinks; @@ -1374,6 +1513,14 @@ public partial class @AetheriaInput: IInputActionCollection2, IDisposable /// public InputAction @Turn => m_Wrapper.m_Player_Turn; /// + /// Provides access to the underlying input action "Player/FaceAim". + /// + public InputAction @FaceAim => m_Wrapper.m_Player_FaceAim; + /// + /// Provides access to the underlying input action "Player/ToggleFaceAim". + /// + public InputAction @ToggleFaceAim => m_Wrapper.m_Player_ToggleFaceAim; + /// /// Provides access to the underlying input action map instance. /// public InputActionMap Get() { return m_Wrapper.m_Player; } @@ -1420,6 +1567,9 @@ public partial class @AetheriaInput: IInputActionCollection2, IDisposable @TargetNearest.started += instance.OnTargetNearest; @TargetNearest.performed += instance.OnTargetNearest; @TargetNearest.canceled += instance.OnTargetNearest; + @CycleTargetItem.started += instance.OnCycleTargetItem; + @CycleTargetItem.performed += instance.OnCycleTargetItem; + @CycleTargetItem.canceled += instance.OnCycleTargetItem; @ToggleHeatsinks.started += instance.OnToggleHeatsinks; @ToggleHeatsinks.performed += instance.OnToggleHeatsinks; @ToggleHeatsinks.canceled += instance.OnToggleHeatsinks; @@ -1444,6 +1594,12 @@ public partial class @AetheriaInput: IInputActionCollection2, IDisposable @Turn.started += instance.OnTurn; @Turn.performed += instance.OnTurn; @Turn.canceled += instance.OnTurn; + @FaceAim.started += instance.OnFaceAim; + @FaceAim.performed += instance.OnFaceAim; + @FaceAim.canceled += instance.OnFaceAim; + @ToggleFaceAim.started += instance.OnToggleFaceAim; + @ToggleFaceAim.performed += instance.OnToggleFaceAim; + @ToggleFaceAim.canceled += instance.OnToggleFaceAim; } /// @@ -1476,6 +1632,9 @@ public partial class @AetheriaInput: IInputActionCollection2, IDisposable @TargetNearest.started -= instance.OnTargetNearest; @TargetNearest.performed -= instance.OnTargetNearest; @TargetNearest.canceled -= instance.OnTargetNearest; + @CycleTargetItem.started -= instance.OnCycleTargetItem; + @CycleTargetItem.performed -= instance.OnCycleTargetItem; + @CycleTargetItem.canceled -= instance.OnCycleTargetItem; @ToggleHeatsinks.started -= instance.OnToggleHeatsinks; @ToggleHeatsinks.performed -= instance.OnToggleHeatsinks; @ToggleHeatsinks.canceled -= instance.OnToggleHeatsinks; @@ -1500,6 +1659,12 @@ public partial class @AetheriaInput: IInputActionCollection2, IDisposable @Turn.started -= instance.OnTurn; @Turn.performed -= instance.OnTurn; @Turn.canceled -= instance.OnTurn; + @FaceAim.started -= instance.OnFaceAim; + @FaceAim.performed -= instance.OnFaceAim; + @FaceAim.canceled -= instance.OnFaceAim; + @ToggleFaceAim.started -= instance.OnToggleFaceAim; + @ToggleFaceAim.performed -= instance.OnToggleFaceAim; + @ToggleFaceAim.canceled -= instance.OnToggleFaceAim; } /// @@ -1964,6 +2129,13 @@ public partial class @AetheriaInput: IInputActionCollection2, IDisposable /// void OnTargetNearest(InputAction.CallbackContext context); /// + /// Method invoked when associated input action "Cycle Target Item" is either , or . + /// + /// + /// + /// + void OnCycleTargetItem(InputAction.CallbackContext context); + /// /// Method invoked when associated input action "Toggle Heatsinks" is either , or . /// /// @@ -2019,6 +2191,20 @@ public partial class @AetheriaInput: IInputActionCollection2, IDisposable /// /// void OnTurn(InputAction.CallbackContext context); + /// + /// Method invoked when associated input action "Face Aim" is either , or . + /// + /// + /// + /// + void OnFaceAim(InputAction.CallbackContext context); + /// + /// Method invoked when associated input action "Toggle Face Aim" is either , or . + /// + /// + /// + /// + void OnToggleFaceAim(InputAction.CallbackContext context); } /// /// Interface to implement callback methods for all input action callbacks associated with input actions defined by "UI" which allows adding and removing callbacks. diff --git a/Assets/Scripts/Editor/AmbientEdgeVerify.cs b/Assets/Scripts/Editor/AmbientEdgeVerify.cs new file mode 100644 index 000000000..4a56b6ea9 --- /dev/null +++ b/Assets/Scripts/Editor/AmbientEdgeVerify.cs @@ -0,0 +1,244 @@ +using System; +using System.IO; +using GameCult.Caching; +using UnityEditor; +using UnityEditor.SceneManagement; +using UnityEngine; +using UnityEngine.Experimental.Rendering; +using UnityEngine.Rendering; + +namespace Aetheria.EditorTools +{ + /// + /// Batchmode check for campaign aetheria-gravity, cut ambient-follows-populated-area: the ambient tint falls softly to + /// dark and never hits an edge (ruling dark-beyond-populated-area). It opens ARPG.unity, takes the Ambient Fog Light the + /// scene wires into ZoneRenderer, sizes it for a generated zone with ZoneRenderer.FitAmbientLight (the call LoadZone + /// makes, not a copy), renders it through an orthographic camera that culls its layer into a target built from the descriptor of the production + /// Fog Tint render texture (B10G11R11_UFloatPack32, the format the Tint cameras write), and checks the + /// radial profile against exp(-(r/P)^2 ln(1/_EdgeBrightness)) times the centre, to within what that format stores (a + /// 5-bit mantissa) wherever the gaussian is at least a few ZoneRenderer.AmbientFloor (P is Zone.PopulatedRadius), that it + /// is lit at Pack.Radius, that the quad's rim and every lit texel beside a dark one are + /// at most two floors, and that no two lit texels are more than half a decade apart. + /// + /// Renders, so it needs a graphics device: run WITHOUT -nographics. + /// Unity -batchmode -projectPath <repo> -executeMethod Aetheria.EditorTools.AmbientEdgeVerify.Run -logFile <path> + /// Do not pass -quit: Run exits the Editor itself, 0 on success and 1 on any failure. + /// + public static class AmbientEdgeVerify + { + const string Tag = "[AmbientEdgeVerify]"; + const int Size = 512; + const int AmbientLayer = 13; + const string FogTintPath = "Assets/Resources/Fog Tint.renderTexture"; + // A float with a 5-bit mantissa (Fog Tint's blue) steps by 2^-5 of its value, and the target truncates to a step. + const float FormatRelativeError = 1f / 32f; + // The profile is held to the gaussian where it is at least this many floors; below that the format's tail is measured, not held. + const float FaithfulFloors = 8f; + // The rim and every lit texel beside a dark one hold at most this many floors, 2^-14 (the smallest normal of the format's + // floats): the one step to dark is the format's last value. Measured on the Fog Tint format it is 1.5 floors at most. + const float StepToDarkFloors = 2f; + static bool _ok = true; + + static void OnLog(string message, string stack, LogType type) + { + if ((type == LogType.Error || type == LogType.Exception || type == LogType.Assert) && !message.StartsWith(Tag)) + Fail("logged-error", message.Split('\n')[0]); + } + + static void Fail(string check, string detail) + { + Debug.LogError($"{Tag} FAIL {check}: {detail}"); + _ok = false; + } + + public static void Run() + { + if (SystemInfo.graphicsDeviceType == GraphicsDeviceType.Null) + { + Debug.LogError($"{Tag} FAIL: no graphics device in this session; rerun batchmode without -nographics."); + EditorApplication.Exit(1); + return; + } + Application.logMessageReceived += OnLog; + var work = Path.Combine(Path.GetTempPath(), "ambient-edge-" + Guid.NewGuid().ToString("N")); + Directory.CreateDirectory(Path.Combine(work, "probe")); + try + { + var settings = AssetDatabase.LoadAssetAtPath("Assets/Resources/Settings.asset") + ?? throw new InvalidOperationException("No Settings.asset."); + // Generated zones have the populated radius at about .78 of the pack radius (p50 over 1500 zones): this one's + // pack radius is set so, which puts Pack.Radius where it sits in play, inside the quad's reach. + var probe = GravityFieldParityVerify.BuildZone(settings, Path.Combine(work, "probe"), out _); + var zone = GravityFieldParityVerify.BuildZone(settings, work, out _, probe.PopulatedRadius / .78f); + EditorSceneManager.OpenScene("Assets/Scenes/ARPG.unity", OpenSceneMode.Single); + try + { + var renderer = UnityEngine.Object.FindFirstObjectByType(FindObjectsInactive.Include); + if (renderer == null || renderer.AmbientLight == null) throw new InvalidOperationException("ARPG.unity wires no ZoneRenderer.AmbientLight."); + Check(renderer, zone); + } + finally + { + EditorSceneManager.NewScene(NewSceneSetup.EmptyScene, NewSceneMode.Single); + } + Debug.Log(_ok ? $"{Tag} PASS" : $"{Tag} FAIL: see errors above"); + } + catch (Exception e) + { + Debug.LogError($"{Tag} FAIL exception: {e}"); + _ok = false; + } + finally + { + Application.logMessageReceived -= OnLog; + try { Directory.Delete(work, true); } catch { } + } + EditorApplication.Exit(_ok ? 0 : 1); + } + + // A bare ambient quad for the verifies that run LoadZone on a renderer built in code: the scene's material, no scene. + public static Transform NewAmbientLight() + { + var quad = new GameObject("Ambient Fog Light") { layer = AmbientLayer }; + quad.AddComponent().sharedMesh = Resources.GetBuiltinResource("Quad.fbx"); + quad.AddComponent().sharedMaterial = AssetDatabase.LoadAssetAtPath("Assets/Materials/Brushes/Sector Tint.mat"); + return quad.transform; + } + + static void Check(ZoneRenderer renderer, Zone zone) + { + var production = AssetDatabase.LoadAssetAtPath(FogTintPath); + if (production == null || production.graphicsFormat != GraphicsFormat.B10G11R11_UFloatPack32) + Fail("format", $"Fog Tint is {(production == null ? "missing" : production.graphicsFormat.ToString())}, not the B10G11R11_UFloatPack32 that AmbientFloor and FormatRelativeError describe"); + var light = renderer.AmbientLight; + if (light.parent != null) Fail("wiring", $"the ambient quad sits under {light.parent.name}, whose scale is the pack radius's"); + if (light.gameObject.layer != AmbientLayer) Fail("wiring", $"the ambient quad is on layer {light.gameObject.layer}, not {AmbientLayer}"); + + ZoneRenderer.FitAmbientLight(light, zone); + var meshRenderer = light.GetComponent(); + var material = meshRenderer.sharedMaterial; + var edge = material.GetFloat("_EdgeBrightness"); + var tint = material.GetColor("_Color").linear; + var centre = material.GetFloat("_Depth") * Mathf.Max(tint.r, Mathf.Max(tint.g, tint.b)); + var populated = zone.PopulatedRadius; + var half = light.localScale.x / 2f; + Debug.Log($"{Tag} populated radius {populated:F1} u, pack radius {zone.Pack.Radius:F1} u, quad half-extent {half:F1} u, edge brightness {edge:G3}, centre {centre:G4}"); + if (!(populated > 0f) || !(half > populated)) { Fail("sizing", $"the quad half-extent {half:F1} u does not reach beyond the populated radius {populated:F1} u"); return; } + + Render(light, half * 1.05f, out var value, out var world); + var floor = ZoneRenderer.AmbientFloor; + Debug.Log($"{Tag} format floor {floor:E2} = {floor / centre:E2} of the centre; tail (drawn / floor): " + + string.Join(" ", System.Linq.Enumerable.Select(new[] { 1.5f, 1.75f, 1.9f, 2f, 2.05f, 2.1f, 2.15f, 2.2f }, + k => $"{k}P:{Sample(value, world, new Vector2(k * populated, 0f)) / floor:G3}"))); + var logFall = Mathf.Log(1f / edge); + foreach (var k in new[] { 0f, .5f, 1f, 1.5f, 2f }) + { + var drawn = Sample(value, world, new Vector2(k * populated, 0f)); + Debug.Log($"{Tag} r = {k} P: drawn {drawn:G5}, expected {centre * Mathf.Exp(-k * k * logFall):G5}"); + } + var worstProfile = 0f; + var compared = 0; + var rim = 0f; + for (var i = 0; i < value.Length; i++) + { + if (float.IsNaN(value[i])) { Fail("texels", $"texel {i}: NaN"); return; } + var r = world[i].magnitude; + var expected = centre * Mathf.Exp(-(r / populated) * (r / populated) * logFall); + if (r <= half && expected >= FaithfulFloors * floor) + { + var error = Mathf.Abs(value[i] - expected) / (FormatRelativeError * expected); + worstProfile = Mathf.Max(worstProfile, error); + compared++; + if (error > 1f) { Fail("profile", $"at r = {r / populated:F3} P: expected {expected:G5}, drawn {value[i]:G5}, off by {error:F2} times the format's step"); return; } + } + // The rim: the texels in the quad's outermost ring (within two texels of its edge). + var edgeDistance = half - Mathf.Max(Mathf.Abs(world[i].x), Mathf.Abs(world[i].y)); + if (edgeDistance >= 0f && edgeDistance < 2f * (half * 1.05f * 2f / Size)) rim = Mathf.Max(rim, value[i]); + } + Debug.Log($"{Tag} profile: {compared} texels held to the gaussian, worst error {worstProfile:F3} of the format's step; rim {rim / centre:E2} of the centre"); + if (compared < Size * Size / 16) Fail("profile", $"only {compared} texels were held to the gaussian; the check is vacuous"); + if (rim > floor * StepToDarkFloors) Fail("rim", $"the quad's rim is {rim / floor:G3} times the format floor"); + + var atPack = Sample(value, world, new Vector2(zone.Pack.Radius, 0f)); + Debug.Log($"{Tag} at Pack.Radius: {atPack / centre:E2} of the centre"); + if (!(atPack > 0f)) Fail("pack-radius", "the ambient is zero at Pack.Radius"); + + var worstJump = 0f; + for (var y = 0; y < Size; y++) + for (var x = 0; x < Size; x++) + { + var here = value[y * Size + x]; + if (here <= 0f) continue; + foreach (var next in new[] { x + 1 < Size ? value[y * Size + x + 1] : 0f, y + 1 < Size ? value[(y + 1) * Size + x] : 0f }) + { + if (next <= 0f) { if (here > floor * StepToDarkFloors) Fail("last-step", $"a lit texel of {here / floor:G3} floors sits beside a dark one"); continue; } + worstJump = Mathf.Max(worstJump, Mathf.Abs(Mathf.Log10(here / next))); + } + } + Debug.Log($"{Tag} largest jump between neighbouring lit texels: {worstJump:F3} decades (limit 0.5)"); + if (worstJump > .5f) Fail("jump", $"neighbouring texels differ by {worstJump:F2} decades"); + var lit = 0; + foreach (var v in value) if (v > 0f) lit++; + if (lit < Size * Size / 2) Fail("jump", $"only {lit} texels are lit; the check is vacuous"); + } + + static float Sample(float[] value, Vector2[] world, Vector2 at) + { + var best = 0; + for (var i = 1; i < world.Length; i++) + if ((world[i] - at).sqrMagnitude < (world[best] - at).sqrMagnitude) best = i; + return value[best]; + } + + // Renders the ambient layer through a downward orthographic camera centred on the origin, as the Tint cameras see it, + // and returns the brightest channel of every texel with the world xz of its centre, which is asked of the camera. + static void Render(Transform light, float half, out float[] value, out Vector2[] world) + { + var production = AssetDatabase.LoadAssetAtPath(FogTintPath) ?? throw new InvalidOperationException("No Fog Tint render texture."); + var rt = new RenderTexture(production.descriptor) { filterMode = FilterMode.Point }; + var cameraObject = new GameObject("Ambient Edge Camera"); + var read = new Texture2D(Size, Size, TextureFormat.RGBAFloat, false); + var previous = RenderTexture.active; + try + { + var camera = cameraObject.AddComponent(); + camera.orthographic = true; + camera.orthographicSize = half; + camera.aspect = 1f; + camera.nearClipPlane = .3f; + camera.farClipPlane = 1000f; + camera.cullingMask = 1 << light.gameObject.layer; + camera.clearFlags = CameraClearFlags.SolidColor; + camera.backgroundColor = Color.black; + camera.allowHDR = false; + camera.allowMSAA = false; + camera.targetTexture = rt; + cameraObject.transform.SetPositionAndRotation(new Vector3(0f, 100f, 0f), Quaternion.Euler(90f, 0f, 0f)); + camera.Render(); + + RenderTexture.active = rt; + read.ReadPixels(new Rect(0, 0, Size, Size), 0, 0); + read.Apply(); + var pixels = read.GetPixelData(0); + value = new float[Size * Size]; + for (var i = 0; i < value.Length; i++) + value[i] = Mathf.Max(pixels[4 * i], Mathf.Max(pixels[4 * i + 1], pixels[4 * i + 2])); + world = new Vector2[Size * Size]; + for (var y = 0; y < Size; y++) + for (var x = 0; x < Size; x++) + { + var p = camera.ViewportToWorldPoint(new Vector3((x + .5f) / Size, (y + .5f) / Size, 100f)); + world[y * Size + x] = new Vector2(p.x, p.z); + } + } + finally + { + RenderTexture.active = previous; + UnityEngine.Object.DestroyImmediate(cameraObject); + UnityEngine.Object.DestroyImmediate(read); + rt.Release(); + UnityEngine.Object.DestroyImmediate(rt); + } + } + } +} diff --git a/Assets/Scripts/Editor/AmbientEdgeVerify.cs.meta b/Assets/Scripts/Editor/AmbientEdgeVerify.cs.meta new file mode 100644 index 000000000..0962854de --- /dev/null +++ b/Assets/Scripts/Editor/AmbientEdgeVerify.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 63b03af05dfdae44c89e21ca7ebec892 \ No newline at end of file diff --git a/Assets/Scripts/Editor/BeltFloaterLayerVerify.cs b/Assets/Scripts/Editor/BeltFloaterLayerVerify.cs new file mode 100644 index 000000000..500ae1cea --- /dev/null +++ b/Assets/Scripts/Editor/BeltFloaterLayerVerify.cs @@ -0,0 +1,265 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using GameCult.Caching; +using UnityEditor; +using UnityEditor.SceneManagement; +using UnityEngine; +using float2 = CultMath.float2; +using float4 = CultMath.float4; + +// End-to-end proof of the belt draw (rulings asteroid-tops-at-layer, rock-meshes-by-size), measured where it fails: two belts are loaded +// into a ZoneRenderer carrying ARPG.unity's real AsteroidMeshes (meshes, stored radii) and Settings.asset, over a zone whose wells make the +// field differ rock to rock, and ZoneRenderer.DrawBelts runs as Update runs it. Every instanced matrix it hands to the GPU is read back with the +// mesh it is drawn with (ZoneRenderer.DrawInstanced), and for each drawn rock the verify measures, from the mesh's real vertices: +// - the farthest vertex from the rock's centre after the matrix (the reach, a bound on the rock's top under any rotation) is the rock's +// gameplay radius, and centre y + reach is the floater layer over the field at the rock's xz and the drawn time; +// - the rock is drawn exactly once, on exactly one matrix of a real pose (no spare instance in a batch); +// - within a belt a bigger rock never takes a smaller mesh (by the mesh's own farthest vertex), and the belt keeps min(AsteroidMeshCount, meshes) meshes. +// The arguments the renderer hands the draw list (radius field, belt, batch size, kept count) are not inspected: their consequence is. +// +// Reached: ZoneRenderer.LoadPlanet for each belt, DrawBelts. Not reached: LoadZone's other planets (their prefabs), the GPU draw itself. +// Needs a GPU device for MapPresenter's belt buffer: run without -nographics. +// +// Unity -batchmode -projectPath -executeMethod Aetheria.EditorTools.BeltFloaterLayerVerify.Run -logFile +// +// Do not pass -quit: Run enters play mode (a domain reload), the check runs there, and the Editor exits itself, 0 on success and 1 on any failure. +namespace Aetheria.EditorTools +{ + [InitializeOnLoad] + public static class BeltFloaterLayerVerify + { + private const string Tag = "[BeltFloaterLayerVerify]"; + private const string Flag = "BeltFloaterLayerVerify.running"; + private const string Wiring = "BeltFloaterLayerVerify.wiring"; + private const double Budget = 300; // real seconds + private const float Lead = .008f, Layer = -1.5f, Tolerance = .02f; + private static IEnumerator _check; + private static double _started; + private static string _work; + + static BeltFloaterLayerVerify() + { + if (SessionState.GetBool(Flag, false)) EditorApplication.playModeStateChanged += OnPlayMode; + } + + public static void Run() + { + try + { + SessionState.SetString(Wiring, ReadWiring()); + SessionState.SetBool(Flag, true); + EditorApplication.EnterPlaymode(); + } + catch (Exception exception) + { + Debug.LogException(exception); + EditorApplication.Exit(1); + } + } + + private static void OnPlayMode(PlayModeStateChange change) + { + if (change != PlayModeStateChange.EnteredPlayMode) return; + _work = Path.Combine(Path.GetTempPath(), $"belt-floater-{Guid.NewGuid():N}"); + Directory.CreateDirectory(_work); + _started = Time.realtimeSinceStartupAsDouble; + _check = Check(); + EditorApplication.update += Step; + } + + private static void Step() + { + try + { + if (Time.realtimeSinceStartupAsDouble - _started > Budget) throw new InvalidOperationException($"The check did not finish in {Budget} seconds."); + if (_check.MoveNext()) return; + Finish(0); + } + catch (Exception exception) + { + Debug.LogException(exception); + Finish(1); + } + } + + private static void Finish(int code) + { + EditorApplication.update -= Step; + SessionState.SetBool(Flag, false); + try { if (Directory.Exists(_work)) Directory.Delete(_work, true); } catch (Exception) { /* a temp directory */ } + EditorApplication.Exit(code); + } + + private static void Require(bool condition, string what) + { + if (!condition) throw new InvalidOperationException(what); + } + + // A belt of rocks of every size, its sizes in the given order, round an orbit about the planet. + private static Asteroid[] Rocks(int count, Func size, float start) => Enumerable.Range(0, count).Select(i => new Asteroid + { + Distance = start + i * 9.7f, Phase = Mathf.Repeat(i * .6180339887f, 1f), Size = size(i), RotationSpeed = .1f + i * .013f + }).ToArray(); + + private static IEnumerator Check() + { + var game = AssetDatabase.LoadAssetAtPath("Assets/Resources/Settings.asset") ?? throw new InvalidOperationException("No Settings.asset."); + var settings = game.GameplaySettings; + settings.FloaterLayerHeight = Layer; // in memory, never saved back to the asset: a draw that drops the layer fails + + var meshes = SessionState.GetString(Wiring, "").Split('|').Select(entry => entry.Split('~')).Select(p => new InstancedMesh + { + Mesh = AssetDatabase.LoadAllAssetsAtPath(p[0]).OfType().First(m => m.name == p[1]), + Material = p[2] == "" ? null : AssetDatabase.LoadAssetAtPath(p[2]), + Radius = float.Parse(p[3], System.Globalization.CultureInfo.InvariantCulture) + }).ToArray(); + Require(meshes.Length > game.AsteroidMeshCount, $"ARPG.unity has {meshes.Length} rock meshes for a kept count of {game.AsteroidMeshCount}: nothing to prune."); + + var cache = AetheriaStores.Open(Path.Combine(_work, "belts.cc"), Path.Combine(_work, "belts-run.cc"), catalogWritable: true); + cache.Upsert(new VerseGrammar { Revision = 1 }); + cache.FlushAsync().Wait(); + var items = new ItemManager(1u, cache, new ProvenanceLedger(), settings, _ => { }); + + CultRecordKey Orbit(CultRecordKey parent, float distance, float phase, float2 fixedPosition = default) + { + var data = new OrbitData { Distance = distance, Phase = phase, FixedPosition = fixedPosition }; + if (parent.IsSet()) data.Parent = new CultRecordRef(parent); + return cache.Upsert(data).Key; + } + + // A heavy sun and a planet on a moving rail, the belts round the planet: the field under a rock differs from rock to rock. + var sunOrbit = Orbit(default, 0f, 0f, new float2(700f, -300f)); + var planetOrbit = Orbit(sunOrbit, 600f, .3f); + var beltOrbitA = Orbit(planetOrbit, 150f, .1f); + var beltOrbitB = Orbit(planetOrbit, 300f, .6f); + var beltA = cache.Upsert(new AsteroidBeltData { Orbit = new CultRecordRef(beltOrbitA), Asteroids = Rocks(24, i => (i * 7 % 24) / 23f, 40f) }).Key; + var beltB = cache.Upsert(new AsteroidBeltData { Orbit = new CultRecordRef(beltOrbitB), Asteroids = Rocks(24, i => (i * 5 % 24) / 23f, 60f) }).Key; + var pack = new ZonePack { Radius = 5000f, Mass = 10000f }; + foreach (var orbit in new[] { sunOrbit, planetOrbit, beltOrbitA, beltOrbitB }) pack.Orbits.Add(new CultRecordRef(orbit)); + pack.Planets.Add(new CultRecordRef(cache.Upsert(new PlanetData { Name = "Belt Sun", Orbit = new CultRecordRef(sunOrbit), Mass = 400f }).Key)); + pack.Planets.Add(new CultRecordRef(cache.Upsert(new PlanetData { Name = "Belt Planet", Orbit = new CultRecordRef(planetOrbit), Mass = 400f }).Key)); + pack.Planets.Add(new CultRecordRef(beltA)); + pack.Planets.Add(new CultRecordRef(beltB)); + var curves = new PlanetSettings + { + BodyRadius = new ExponentialCurve(), + WellStrength = new ExponentialCurve { Multiplier = 1f, Exponent = 1f }, + RocheLimit = new ExponentialCurve { Constant = 10f }, + AsteroidSize = new ExponentialLerp { Minimum = 2f, Maximum = 9f, Exponent = 1.7f }, + AsteroidHitpoints = new ExponentialLerp { Minimum = 10f, Maximum = 300f, Exponent = 2f }, + AsteroidRespawnTime = new ExponentialLerp { Minimum = 5f, Maximum = 60f, Exponent = 1f } + }; + var zone = new Zone(items, curves, pack, null, null); + zone.Update(.5f); + + // The renderer, configured as the scene configures it for belts: Awake builds the map, LoadPlanet reads Zone, Settings and AsteroidMeshes. + var rendererObject = new GameObject("Belt Zone Renderer"); + rendererObject.SetActive(false); + var renderer = rendererObject.AddComponent(); + renderer.Settings = game; + renderer.AsteroidMeshes = meshes; + renderer.ItemManager = items; + renderer.LODHandler = new GameObject("Belt LOD").AddComponent(); + const BindingFlags Any = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public; + typeof(ZoneRenderer).GetProperty("Zone").GetSetMethod(true).Invoke(renderer, new object[] { zone }); + typeof(ZoneRenderer).GetMethod("Awake", Any).Invoke(renderer, null); + var load = typeof(ZoneRenderer).GetMethod("LoadPlanet", Any); + foreach (var belt in new[] { beltA, beltB }) load.Invoke(renderer, new object[] { belt, zone.Planets[belt] }); + + var planetAt = DrawAhead.Orbit(zone, planetOrbit, Lead); + var camera = new GameObject("Belt Camera").AddComponent(); + camera.transform.position = new Vector3(planetAt.x, 4000f, planetAt.y); + camera.transform.rotation = Quaternion.Euler(90, 0, 0); + camera.farClipPlane = 20000f; + renderer.MainCamera = camera; + yield return null; + + ActionGameManager.Clock.Reset(); + ActionGameManager.Clock.Advance(Lead, _ => throw new InvalidOperationException("a step ran")); + var lead = ActionGameManager.Clock.Lead; + Require(Mathf.Abs(lead - Lead) < 1e-6f, $"The clock's lead is {lead}, not {Lead}."); + + var drawn = new List<(Mesh mesh, Matrix4x4[] matrices)>(); + renderer.DrawInstanced = (mesh, _, matrices) => drawn.Add((mesh, (Matrix4x4[]) matrices.Clone())); + renderer.DrawBelts(lead); + + // The poses the sim defines at the drawn time: every rock of both belts. + var rocks = new List<(CultRecordKey belt, int index, float4 pose)>(); + foreach (var belt in new[] { beltA, beltB }) + { + var poses = new float4[((AsteroidBeltData) zone.Planets[belt]).Asteroids.Length]; + zone.EvaluateBelt(belt, poses, DrawAhead.Time(zone, lead)); + for (var i = 0; i < poses.Length; i++) rocks.Add((belt, i, poses[i])); + } + Require(drawn.Count > 0, "DrawBelts drew nothing: the belts are out of the camera or have no rocks."); + + // The field differs between rocks, so a draw that drops it or samples it at the wrong place fails. + var layers = rocks.Select(r => DrawAhead.FloaterHeight(zone, settings, r.pose.xy, lead)).ToArray(); + Require(layers.Max() - layers.Min() > 1f, $"The fixture's field is flat under the rocks: layer heights span {layers.Max() - layers.Min()}."); + + var seen = new Dictionary<(CultRecordKey, int), float>(); // rock -> its mesh's own farthest vertex + var vertices = new Dictionary(); + foreach (var (mesh, matrices) in drawn) + { + if (!vertices.TryGetValue(mesh, out var v)) vertices[mesh] = v = mesh.vertices; + var own = Mathf.Sqrt(v.Max(x => x.sqrMagnitude)); + foreach (var matrix in matrices) + { + var centre = (Vector3) matrix.GetColumn(3); + var at = rocks.Where(r => Mathf.Abs(r.pose.x - centre.x) < .01f && Mathf.Abs(r.pose.y - centre.z) < .01f).ToArray(); + Require(at.Length == 1, $"An instance of {mesh.name} sits at {centre.x},{centre.z}, where {at.Length} rocks are (a spare or misplaced instance)."); + var rock = at[0]; + Require(seen.TryAdd((rock.belt, rock.index), own), $"Rock {rock.index} of {rock.belt} is drawn twice."); + var reach = v.Max(x => (matrix.MultiplyPoint3x4(x) - centre).magnitude); + Require(Mathf.Abs(reach - rock.pose.w) < Tolerance * Mathf.Max(1f, rock.pose.w), + $"Rock {rock.index} of {rock.belt} on {mesh.name}: its farthest vertex is {reach} from its centre, its gameplay radius {rock.pose.w}."); + var top = centre.y + reach; + var want = DrawAhead.FloaterHeight(zone, settings, rock.pose.xy, lead); + Require(Mathf.Abs(top - want) < Tolerance, + $"Rock {rock.index} of {rock.belt} on {mesh.name}: its top is {top}, the floater layer over the field there {want}."); + } + } + Require(seen.Count == rocks.Count, $"{seen.Count} of {rocks.Count} rocks were drawn."); + + foreach (var belt in new[] { beltA, beltB }) + { + var mine = rocks.Where(r => r.belt.Equals(belt)).ToArray(); + var radii = mine.Select(r => seen[(belt, r.index)]).Distinct().OrderBy(x => x).ToArray(); + Require(radii.Length >= 2, $"Belt {belt} is drawn on {radii.Length} distinct mesh radii: the size match is not exercised."); + var kept = drawn.Where(d => d.matrices.Any(m => mine.Any(r => Mathf.Abs(r.pose.x - m.m03) < .01f && Mathf.Abs(r.pose.y - m.m23) < .01f))).Select(d => d.mesh).Distinct().Count(); + Require(kept == Mathf.Min(game.AsteroidMeshCount, meshes.Length), $"Belt {belt} is drawn on {kept} meshes, not the kept count {game.AsteroidMeshCount}."); + var size = mine.ToDictionary(r => r.index, r => zone.AsteroidBelts[belt].UndamagedSize(r.index, zone.Settings)); + foreach (var a in mine) + foreach (var b in mine) + if (size[a.index] < size[b.index]) + Require(seen[(belt, a.index)] <= seen[(belt, b.index)], + $"Belt {belt}: rock {a.index} (size {size[a.index]}) is smaller than rock {b.index} ({size[b.index]}) and takes a bigger mesh ({seen[(belt, a.index)]} against {seen[(belt, b.index)]})."); + var biggest = mine.OrderByDescending(r => size[r.index]).First(); + Require(Mathf.Approximately(seen[(belt, biggest.index)], radii[^1]), $"Belt {belt}: its biggest rock is not on its biggest mesh."); + } + ActionGameManager.Clock.Reset(); + Debug.Log($"{Tag} ok: {rocks.Count} rocks of 2 belts drawn at the floater layer, big rocks on big meshes ({drawn.Count} batches)"); + } + + // The AsteroidMeshes ARPG.unity's ZoneRenderer names, read before the play session (a scene cannot be opened inside one) and carried across the + // domain reload as asset paths: mesh path, mesh name, material path, stored radius. + private static string ReadWiring() + { + var scene = EditorSceneManager.OpenScene("Assets/Scenes/ARPG.unity", OpenSceneMode.Additive); + try + { + var found = UnityEngine.Object.FindObjectsByType(FindObjectsInactive.Include, FindObjectsSortMode.None) + .Where(r => r.gameObject.scene == scene).ToArray(); + Require(found.Length == 1, $"ARPG.unity has {found.Length} ZoneRenderers."); + var meshes = found[0].AsteroidMeshes ?? throw new InvalidOperationException("ARPG.unity's ZoneRenderer has no AsteroidMeshes."); + return string.Join("|", meshes.Select(m => string.Join("~", AssetDatabase.GetAssetPath(m.Mesh), m.Mesh.name, + m.Material == null ? "" : AssetDatabase.GetAssetPath(m.Material), m.Radius.ToString("R", System.Globalization.CultureInfo.InvariantCulture)))); + } + finally { EditorSceneManager.CloseScene(scene, true); } + } + } +} diff --git a/Assets/Scripts/Editor/BeltFloaterLayerVerify.cs.meta b/Assets/Scripts/Editor/BeltFloaterLayerVerify.cs.meta new file mode 100644 index 000000000..a383593c7 --- /dev/null +++ b/Assets/Scripts/Editor/BeltFloaterLayerVerify.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 7d25a93db1972324fa5460b2415c1e4a \ No newline at end of file diff --git a/Assets/Scripts/Editor/CapabilityPresentationSmoke.cs b/Assets/Scripts/Editor/CapabilityPresentationSmoke.cs new file mode 100644 index 000000000..135163e24 --- /dev/null +++ b/Assets/Scripts/Editor/CapabilityPresentationSmoke.cs @@ -0,0 +1,217 @@ +using System; +using System.IO; +using System.Linq; +using System.Reflection; +using GameCult.Caching; +using UnityEditor; +using UnityEngine; +using CultMath; +using static CultMath.math; + +// Batch proof of the capability presenters' wiring, without a scene: a zone ship is bound to an EntityInstance through the +// game's own SetEntity, and impacts and grabs are published on the ship's Capabilities exactly as the simulation does. A hull absorb spawns +// one hull effect under the instance and, for the player's ship at ScreenShake 1, raises one camera impulse; ScreenShake 0 +// or another ship raises none; a shield absorb spawns no hull effect. The shield ripple itself (ShieldManager.ShowHit +// needs a shield material and a rig) is looked at in the editor, not here. Grabs: a Tractor Beam prefab under the instance +// is bound by the same SetEntity and presents a grab from events alone (emission at Power and the aim at the held point +// from Started to Completed or Cancelled, nothing otherwise, nothing for another entity's grab). +// +// Unity -batchmode -nographics -projectPath -executeMethod CapabilityPresentationSmoke.Run -logFile +// +// Do not pass -quit: Run exits the Editor itself, 0 on success and 1 on any failure. +public static class CapabilityPresentationSmoke +{ + private const BindingFlags Any = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic; + + public static void Run() + { + var work = Path.Combine(Path.GetTempPath(), $"capability-presentation-smoke-{Guid.NewGuid():N}"); + GameObject[] objects = null; + try + { + Directory.CreateDirectory(work); + objects = Check(work); + Clean(objects, work); + EditorApplication.Exit(0); + } + catch (Exception exception) + { + Debug.LogException(exception); + Clean(objects, work); + EditorApplication.Exit(1); + } + } + + // Edit mode runs no Awake or Start; the smoke runs the ones the game's scene would have. + private static void Awaken(Component component) => component.GetType().GetMethod("Awake", Any)?.Invoke(component, null); + + private static GameObject[] Check(string work) + { + var settings = AssetDatabase.LoadAssetAtPath("Assets/Resources/Settings.asset")?.GameplaySettings + ?? throw new InvalidOperationException("No Settings.asset."); + + var shape = new Shape(5, 4); + foreach (var cell in shape.AllCoordinates) shape[cell] = true; + var hullData = new HullData + { + Name = "Smoke Hull", HullType = HullType.Ship, Shape = shape, Durability = 1000, Mass = 1000, Armor = 0 + }; + var cache = AetheriaStores.Open(Path.Combine(work, "smoke.cc"), catalogWritable: true); + cache.Upsert(new VerseGrammar { Revision = 1 }); + cache.Upsert(hullData); + cache.FlushAsync().Wait(); + var ledger = new ProvenanceLedger(); + for (var i = 1; i <= 8; i++) ledger.Lots[i] = new Lot { Origin = new Attributed(), Quality = 1 }; + var items = new ItemManager(1u, cache, ledger, settings, _ => { }); + var zone = new Zone(items, new PlanetSettings(), new ZonePack(), new GalaxyZone { Name = "Smoke", Owner = null }, null); + var hullRef = items.ItemData.RefOf(items.ItemData.GetByName("Smoke Hull")); + var ship = new Ship(items, zone, new EquippableItem { Data = hullRef, Durability = 1000, Lot = 1 }, new EntitySettings()); + var other = new Ship(items, zone, new EquippableItem { Data = hullRef, Durability = 1000, Lot = 2 }, new EntitySettings()); + zone.Admit(ship, piloted: false); + zone.Admit(other, piloted: false); + + // The scene's side: the tuning object with a pooled effect, and the game manager that names the player's ship. + var feedbackObject = new GameObject("Smoke Impact Feedback"); + var feedback = feedbackObject.AddComponent(); + Awaken(feedback); + var effectObject = new GameObject("Smoke Hull Effect"); + feedback.HullEffect = effectObject.AddComponent(); + var managerObject = new GameObject("Smoke Game Manager"); + var manager = managerObject.AddComponent(); + typeof(ActionGameManager).GetProperty("Instance", Any).SetValue(null, manager); + manager.CurrentEntity = ship; + + var beamPrefab = AssetDatabase.LoadAssetAtPath("Assets/Content/Prefabs/Tractor Beam.prefab") + ?? throw new InvalidOperationException("No Tractor Beam prefab."); + // An entity's instance as the game builds it: the beam is a child before SetEntity on both ship paths, so the + // binder finds it as the game does. + // The scene's map: an entity registers its icon with the ZoneRenderer's presenter, so each instance carries a quad. + var mapRenderer = new GameObject("Smoke Zone Renderer").AddComponent(); + mapRenderer.Settings = AssetDatabase.LoadAssetAtPath("Assets/Resources/Settings.asset"); + mapRenderer.MapGravityMaterials = new Material[0]; + Awaken(mapRenderer); + (GameObject Object, EntityInstance Instance, TractorBeam Beam) Bound(string name, Entity entity) + { + var go = new GameObject(name); + var bound = go.AddComponent(); + Awaken(bound); + bound.HullColliders = new HullCollider[0]; + bound.RadiatorHardpoints = new RadiatorHardpoint[0]; + bound.ThrusterHardpoints = new ThrusterHardpoint[0]; + bound.WeaponHardpoints = new WeaponHardpoint[0]; + bound.ArticulationPoints = new ArticulationPoint[0]; + var tractor = ((GameObject)PrefabUtility.InstantiatePrefab(beamPrefab, go.transform)).GetComponent(); + tractor.Power = .8f; + tractor.Direction = Vector3.forward; + var icon = GameObject.CreatePrimitive(PrimitiveType.Quad); + icon.transform.SetParent(go.transform); + bound.MapIcon = icon.GetComponent(); + bound.MapIcon.sharedMaterial = new Material(Shader.Find("Unlit/Color")); + bound.SetEntity(mapRenderer, entity); + return (go, bound, tractor); + } + var (instanceObject, instance, beam) = Bound("Smoke Entity Instance", ship); + var (otherObject, _, otherBeam) = Bound("Smoke Other Instance", other); + + int Effects() => instance.GetComponentsInChildren(true).Count(p => p != null && !p.isOriginalPrototype); + void Expect(string what, int effects, int kicks) + { + if (Effects() != effects || feedback.KicksRaised != kicks) + throw new InvalidOperationException($"{what}: {Effects()} hull effects (want {effects}), {feedback.KicksRaised} impulses (want {kicks})."); + } + AbsorbEvent Hit(AbsorbLayer layer) => new AbsorbEvent(float3(1f, 0f, 2f), float3(0f, 0f, 1f), 100f, DamageType.Kinetic, layer); + + ActionGameManager.PlayerSettings.GraphicsSettings.ScreenShake = 1f; + ship.Capabilities.PublishAbsorb(Hit(AbsorbLayer.Hull)); + Expect("player's hull hit", 1, 1); + var effect = instance.GetComponentsInChildren(true).Single(p => !p.isOriginalPrototype); + var drawn = DrawAhead.Carried(ship, float3(1f, 0f, 2f), ActionGameManager.Clock.Lead); + if (abs(effect.transform.position.x - drawn.x) > 1e-3f || abs(effect.transform.position.z - drawn.z) > 1e-3f) + throw new InvalidOperationException("The hull effect is not at the drawn impact point."); + + ActionGameManager.PlayerSettings.GraphicsSettings.ScreenShake = 0f; + ship.Capabilities.PublishAbsorb(Hit(AbsorbLayer.Hull)); + Expect("hull hit at ScreenShake 0", 2, 1); + + ActionGameManager.PlayerSettings.GraphicsSettings.ScreenShake = 1f; + manager.CurrentEntity = other; + ship.Capabilities.PublishAbsorb(Hit(AbsorbLayer.Hull)); + // An untracked ship is not drawn at (ActionGameManager.DrawsAt, since contact-hud): no hull effect, no impulse. + Expect("hull hit on an untracked ship", 2, 1); + + // Once the player's instruments track it, the same hit is drawn. + other.VisibleEntities.Add(ship); + ship.Capabilities.PublishAbsorb(Hit(AbsorbLayer.Hull)); + Expect("hull hit on a tracked ship", 3, 1); + other.VisibleEntities.Remove(ship); + + manager.CurrentEntity = ship; + ship.Capabilities.PublishAbsorb(Hit(AbsorbLayer.Shield)); + Expect("player's shield hit", 3, 2); + + // Grabs: the beam presents the simulation's events and nothing else. + float Emission() => beam.ParticleSystem.emission.rateOverTimeMultiplier; + void ExpectBeam(string what, float emission, bool towardHeld) + { + beam.Update(); + var forward = beam.transform.forward; + var aimed = towardHeld ? forward.x > .999f : forward.z > .999f; + if (abs(Emission() - emission) > 1e-4f || !aimed) + throw new InvalidOperationException($"{what}: emission {Emission()} (want {emission}), forward {forward} (want {(towardHeld ? "+x" : "+z")})."); + } + GrabEvent Grab(GrabPhase phase, float3 at) => new GrabEvent(new FloatingBodyId(7), phase, at, 1f); + + ExpectBeam("idle beam", 0f, false); + ship.Capabilities.PublishGrab(Grab(GrabPhase.Started, float3(20f, 0f, 0f))); + ExpectBeam("grab started", .8f, true); + foreach (var phase in new[] { GrabPhase.Extend, GrabPhase.Envelop, GrabPhase.Pull }) + { + ship.Capabilities.PublishGrab(Grab(phase, float3(20f, 0f, 0f))); + ExpectBeam($"grab {phase}", .8f, true); + } + ship.Capabilities.PublishGrab(Grab(GrabPhase.Completed, float3(20f, 0f, 0f))); + ExpectBeam("grab completed", 0f, false); + + // A grab cancelled after its item vanished carries no position: the beam goes dark and never turns toward it. + ship.Capabilities.PublishGrab(Grab(GrabPhase.Started, float3(20f, 0f, 0f))); + ExpectBeam("second grab started", .8f, true); + ship.Capabilities.PublishGrab(Grab(GrabPhase.Cancelled, float3(0f, 0f, 0f))); + ExpectBeam("grab cancelled", 0f, false); + + // Aim is on the ground plane: a beam above the held point does not pitch toward it. + var beamHome = beam.transform.position; + beam.transform.position = beamHome + new Vector3(0f, 10f, 0f); + ship.Capabilities.PublishGrab(Grab(GrabPhase.Started, float3(20f, 7f, 0f))); + ExpectBeam("grab from above", .8f, true); + ship.Capabilities.PublishGrab(Grab(GrabPhase.Completed, float3(20f, 7f, 0f))); + beam.transform.position = beamHome; + + // A grab held at the beam's own position has no direction to take: the beam keeps the aim it had. + beam.Direction = Vector3.right; + var atBeam = float3(beam.transform.position.x, 0f, beam.transform.position.z); + ship.Capabilities.PublishGrab(Grab(GrabPhase.Started, atBeam)); + ExpectBeam("grab at the beam", .8f, true); + ship.Capabilities.PublishGrab(Grab(GrabPhase.Completed, atBeam)); + beam.Direction = Vector3.forward; + ExpectBeam("after the grab at the beam", 0f, false); + + // The beam belongs to the ship's entity: another entity's grab, with its own beam bound, moves only that beam. + other.Capabilities.PublishGrab(Grab(GrabPhase.Started, float3(20f, 0f, 0f))); + ExpectBeam("another entity's grab", 0f, false); + otherBeam.Update(); + if (abs(otherBeam.ParticleSystem.emission.rateOverTimeMultiplier - .8f) > 1e-4f) + throw new InvalidOperationException("The other entity's own beam did not present its grab."); + + Debug.Log("CAPABILITY_PRESENTATION_SMOKE ok effects=3 impulses=2 grabs=ok"); + return new[] { feedbackObject, effectObject, managerObject, instanceObject, otherObject }; + } + + private static void Clean(GameObject[] objects, string work) + { + if (objects != null) + foreach (var go in objects) + if (go != null) UnityEngine.Object.DestroyImmediate(go); + try { if (Directory.Exists(work)) Directory.Delete(work, true); } + catch (Exception error) { Debug.LogWarning($"Impact presenter smoke left {work}: {error.Message}"); } + } +} diff --git a/Assets/Scripts/Editor/CapabilityPresentationSmoke.cs.meta b/Assets/Scripts/Editor/CapabilityPresentationSmoke.cs.meta new file mode 100644 index 000000000..05df104cd --- /dev/null +++ b/Assets/Scripts/Editor/CapabilityPresentationSmoke.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: b1b27e4493b2cfe48805c786a5090cd3 \ No newline at end of file diff --git a/Assets/Scripts/Editor/CultCacheDrawers.cs b/Assets/Scripts/Editor/CultCacheDrawers.cs index c446212db..27d21afec 100644 --- a/Assets/Scripts/Editor/CultCacheDrawers.cs +++ b/Assets/Scripts/Editor/CultCacheDrawers.cs @@ -1,3 +1,4 @@ +using System.Collections.Generic; using System; using System.Linq; using System.Reflection; @@ -87,14 +88,13 @@ public sealed class InspectableTemperatureDrawer : ICultInspectorDrawer } } -// A size and a toggle per cell. When the owning item has a schematic texture, the texture lies under the grid and the -// height follows its aspect; a hull's hardpoint cells are tinted. Both read the owning record through +// A size and a toggle per cell. The underlay (the item's schematic texture, or a hull's line art stretched to the Shape's +// Width x Height) is drawn by HullUnderlay; the height follows a texture's aspect. A hull's hardpoint cells are tinted. +// Both read the owning record through // inspector.Record, which is a read-only copy: nothing here writes to it. [CultInspectorDrawer(typeof(InspectableSchematicShapeAttribute))] public sealed class InspectableSchematicShapeDrawer : ICultInspectorDrawer { - private static Material _schematicMaterial; - public object Draw(CultInspector inspector, string label, Type type, object value, MemberInfo member) { if (type != typeof(Shape)) return inspector.DrawDefault(label, type, value, member); @@ -122,18 +122,13 @@ public sealed class InspectableSchematicShapeDrawer : ICultInspectorDrawer { using (var grid = new EditorGUILayout.VerticalScope()) { - if (schematic != null && Event.current.type == EventType.Repaint) - { - _schematicMaterial ??= new Material(Shader.Find("Legacy Shaders/Particles/Additive")); - EditorGUI.DrawPreviewTexture(grid.rect, schematic, _schematicMaterial); - } + HullUnderlay.Draw(grid.rect, item, inspector.Records); for (var y = shape.Height - 1; y >= 0; y--) using (new EditorGUILayout.HorizontalScope()) for (var x = 0; x < shape.Width; x++) { - var hardpoint = hull?.Hardpoints.FirstOrDefault(hp => hp.Shape.Coordinates - .Any(v => v.x + hp.Position.x == x && v.y + hp.Position.y == y)); + var hardpoint = hull?.Hardpoints.FirstOrDefault(hp => HullFootprint.Cells(hp).Contains(int2(x, y))); var previous = GUI.backgroundColor; if (hardpoint != null) GUI.backgroundColor = hardpoint.TintColor.ToColor(); shape[int2(x, y)] = GUILayout.Toggle(shape[int2(x, y)], GUIContent.none, GUILayout.Width(16)); @@ -145,3 +140,93 @@ public sealed class InspectableSchematicShapeDrawer : ICultInspectorDrawer return shape; } } + +// The underlay under a hull's cell grids, drawn on Repaint only. A shipped hull's schematic texture is stretched over +// the grid rect; a mod hull's line art (its ShipAuthoring, found in the open cache at hull.Visual) is placed by +// SchematicUnderlay.Fit in cell units and mapped to the rect here, the one site that maps cells to a grid's screen +// rect. The hull Shape grid and the footprint painter both draw through it. No lookup found: no line underlay. +public static class HullUnderlay +{ + private static Material _schematicMaterial; + + public static void Draw(Rect grid, EquippableItemData item, IReadOnlyList records) + { + if (item == null || Event.current.type != EventType.Repaint) return; + var texture = string.IsNullOrEmpty(item.Schematic) ? null : AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(item.Schematic)); + if (texture != null) + { + _schematicMaterial ??= new Material(Shader.Find("Legacy Shaders/Particles/Additive")); + EditorGUI.DrawPreviewTexture(grid, texture, _schematicMaterial); + } + + if (!(item is HullData hull) || hull.Shape == null || hull.Shape.Width == 0 || hull.Shape.Height == 0) return; + var key = CultInspectorModel.RecordKey(hull.Visual); + var authoring = records?.FirstOrDefault(record => record.Key.Value == key && record.Document is ShipAuthoring)?.Document as ShipAuthoring; + if (authoring == null) return; + + var lines = authoring.SchematicLines; + var fit = SchematicUnderlay.Fit(lines, hull.Shape); + for (var i = 0; i < fit.Length; i++) + { + var rgba = lines[i].Color; + var color = rgba == null ? Color.white : new Color(rgba[0], rgba[1], rgba[2], rgba[3]); + var points = fit[i].Select(p => new Vector3( + grid.x + p.x / hull.Shape.Width * grid.width, + grid.yMax - p.y / hull.Shape.Height * grid.height)).ToList(); + if (lines[i].Cyclic && points.Count > 2) points.Add(points[0]); + using (new Handles.DrawingScope(color)) Handles.DrawAAPolyLine(2f, points.ToArray()); + } + } +} + +// A hardpoint's schematic footprint over its hull's cells: the hull's occupied cells shaded, this hardpoint's cells lit +// in its tint, other hardpoints' cells tinted and disabled. A click edits Position and Shape together through +// HullFootprint.Toggle, which owns the rule so a Thing host reads the same one. The footprint is authored for gameplay, +// never derived from the model. Read-only on inspector.Record; only the HardpointData it is given changes. +[CultInspectorDrawer(typeof(HardpointData))] +public sealed class HardpointFootprintDrawer : ICultInspectorDrawer +{ + public object Draw(CultInspector inspector, string label, Type type, object value, MemberInfo member) + { + var hardpoint = value as HardpointData; + if (type != typeof(HardpointData) || hardpoint == null) return inspector.DrawDefault(label, type, value, member); + var hull = inspector.Record as HullData; + var own = hull?.Hardpoints.FirstOrDefault(hp => hp.Type == hardpoint.Type && hp.Position.Equals(hardpoint.Position) + && HullFootprint.Cells(hp).SequenceEqual(HullFootprint.Cells(hardpoint))); + var drawn = (HardpointData) inspector.DrawDefault(label, type, value, member); + if (hull?.Shape == null) return drawn; + + var others = hull.Hardpoints.Where(hp => hp != own).ToArray(); + EditorGUILayout.LabelField("Footprint"); + using (new EditorGUILayout.HorizontalScope()) + { + using (var grid = new EditorGUILayout.VerticalScope()) + { + HullUnderlay.Draw(grid.rect, hull, inspector.Records); + for (var y = hull.Shape.Height - 1; y >= 0; y--) + using (new EditorGUILayout.HorizontalScope()) + for (var x = 0; x < hull.Shape.Width; x++) + { + var cell = int2(x, y); + var other = others.FirstOrDefault(hp => HullFootprint.Cells(hp).Contains(cell)); + var on = HullFootprint.Cells(drawn).Contains(cell); + var previous = GUI.backgroundColor; + GUI.backgroundColor = on ? drawn.TintColor.ToColor() : other != null ? other.TintColor.ToColor() + : hull.Shape[cell] ? Color.gray : previous; + EditorGUI.BeginChangeCheck(); + using (new EditorGUI.DisabledScope(other != null && !on)) + GUILayout.Toggle(on || other != null, GUIContent.none, GUILayout.Width(16)); + if (EditorGUI.EndChangeCheck() && HullFootprint.Toggle(drawn.Shape, drawn.Position, cell, out var shape, out var position)) + { + drawn.Shape = shape; + drawn.Position = position; + GUI.changed = true; + } + GUI.backgroundColor = previous; + } + } + GUILayout.FlexibleSpace(); + } + return drawn; + } +} diff --git a/Assets/Scripts/Editor/DrawnPoseWiringVerify.cs b/Assets/Scripts/Editor/DrawnPoseWiringVerify.cs new file mode 100644 index 000000000..69109a622 --- /dev/null +++ b/Assets/Scripts/Editor/DrawnPoseWiringVerify.cs @@ -0,0 +1,232 @@ +using System; +using System.Collections; +using System.IO; +using System.Linq; +using GameCult.Caching; +using UnityEditor; +using UnityEditor.SceneManagement; +using UnityEngine; +using float2 = CultMath.float2; +using float3 = CultMath.float3; + +// Batch proof that the presenters read the drawn pose through the clock: DrawnPoseTests pins the pose maths headlessly, +// and this is what pins that each presenter passes ActionGameManager.Clock.Lead into it. A zone with a sun and a planet on a moving rail +// is built and the pickup and mine prefabs ARPG.unity's ZoneRenderer names are bound to it as the renderer binds them; a loose Projectile is launched on the +// zone. The zone is stepped once, then the clock is set to leads 0, 0.008 and 0.015 s with no step, and each presenter's +// own Update places its transform. A body is drawn at its last step plus its step velocity times the lead, spelled here +// from the body's fields, so a presenter that reads lead 0 (or half the lead) sits on the step and fails. +// +// Reached: ItemPickup, MineInstance, Projectile.Draw. Not reached: ZoneRenderer.Update (Lower needs a ComputeBuffer, a +// GPU device) and the ActionGameManager markers (they need the ARPG scene running); a Lower split so its record fill is +// pure, or a run with a GPU and ARPG.unity in play mode, would reach them. +// +// Unity -batchmode -nographics -projectPath -executeMethod Aetheria.EditorTools.DrawnPoseWiringVerify.Run -logFile +// +// Do not pass -quit: Run enters play mode (a domain reload), the check runs there, and the Editor exits itself, 0 on +// success and 1 on any failure. +namespace Aetheria.EditorTools +{ + [InitializeOnLoad] + public static class DrawnPoseWiringVerify + { + private const string Tag = "[DrawnPoseWiringVerify]"; + private const string Flag = "DrawnPoseWiringVerify.running"; + private const string Wiring = "DrawnPoseWiringVerify.wiring"; + private const double Budget = 300; // real seconds + private const float RoundSpeed = 100f, Tolerance = 1e-3f; + private static IEnumerator _check; + private static double _started; + private static string _work; + + static DrawnPoseWiringVerify() + { + if (SessionState.GetBool(Flag, false)) EditorApplication.playModeStateChanged += OnPlayMode; + } + + public static void Run() + { + try + { + SessionState.SetString(Wiring, ReadWiring()); + SessionState.SetBool(Flag, true); + EditorApplication.EnterPlaymode(); + } + catch (Exception exception) + { + Debug.LogException(exception); + EditorApplication.Exit(1); + } + } + + private static void OnPlayMode(PlayModeStateChange change) + { + if (change != PlayModeStateChange.EnteredPlayMode) return; + _work = Path.Combine(Path.GetTempPath(), $"drawn-pose-wiring-{Guid.NewGuid():N}"); + Directory.CreateDirectory(_work); + _started = Time.realtimeSinceStartupAsDouble; + _check = Check(); + EditorApplication.update += Step; + } + + private static void Step() + { + try + { + if (Time.realtimeSinceStartupAsDouble - _started > Budget) throw new InvalidOperationException($"The check did not finish in {Budget} seconds."); + if (_check.MoveNext()) return; + Finish(0); + } + catch (Exception exception) + { + Debug.LogException(exception); + Finish(1); + } + } + + private static void Finish(int code) + { + EditorApplication.update -= Step; + SessionState.SetBool(Flag, false); + try { if (Directory.Exists(_work)) Directory.Delete(_work, true); } catch (Exception) { /* a temp directory */ } + EditorApplication.Exit(code); + } + + private static void Require(bool condition, string what) + { + if (!condition) throw new InvalidOperationException(what); + } + + private static IEnumerator Check() + { + var settings = AssetDatabase.LoadAssetAtPath("Assets/Resources/Settings.asset")?.GameplaySettings + ?? throw new InvalidOperationException("No Settings.asset."); + settings.FloaterLayerHeight = -1.5f; // nonzero, so a presenter that drops the floater layer fails + + var wired = SessionState.GetString(Wiring, "").Split('|').Select(entry => entry.Split('=')).ToDictionary(pair => pair[0], pair => pair[1]); + var pickupPrefab = AssetDatabase.LoadAssetAtPath(wired["SimpleCommodityPickup"])?.GetComponent(); + var minePrefab = AssetDatabase.LoadAssetAtPath(wired["MinePrefab"])?.GetComponent(); + Require(pickupPrefab != null, "ZoneRenderer.SimpleCommodityPickup is not an ItemPickup in ARPG.unity."); + Require(minePrefab != null, "ZoneRenderer.MinePrefab is not a MineInstance in ARPG.unity."); + + var oneCell = new Shape(1, 1); + oneCell[new CultMath.int2(0, 0)] = true; + var cache = AetheriaStores.Open(Path.Combine(_work, "wiring.cc"), Path.Combine(_work, "wiring-run.cc"), catalogWritable: true); + cache.Upsert(new VerseGrammar { Revision = 1 }); + cache.Upsert(new SimpleCommodityData { Name = "Wiring Ore", Shape = oneCell, MaxStack = 100 }); + cache.FlushAsync().Wait(); + var ledger = new ProvenanceLedger(); + var items = new ItemManager(1u, cache, ledger, settings, _ => { }); + + // A sun and a planet on a moving rail round it, both near the bodies below: the field under a floater changes with the + // drawn time, so a presenter that samples it at the step's time, drops it, or reads lead 0 for the height draws a different y. + var sunOrbit = cache.Upsert(new OrbitData { FixedPosition = new float2(-55, -.5f) }).Key; + var planetOrbit = cache.Upsert(new OrbitData { Parent = new CultRecordRef(sunOrbit), Distance = 40f, Phase = 0f }).Key; + var pack = new ZonePack { Radius = 5000f, Mass = 10000f }; + pack.Orbits.Add(new CultRecordRef(sunOrbit)); + pack.Orbits.Add(new CultRecordRef(planetOrbit)); + pack.Planets.Add(new CultRecordRef(cache.Upsert(new PlanetData { Name = "Wiring Sun", Orbit = new CultRecordRef(sunOrbit), Mass = 400f }).Key)); + pack.Planets.Add(new CultRecordRef(cache.Upsert(new PlanetData { Name = "Wiring Planet", Orbit = new CultRecordRef(planetOrbit), Mass = 400f }).Key)); + var curves = new PlanetSettings + { + BodyRadius = new ExponentialCurve(), + WellStrength = new ExponentialCurve { Multiplier = 1f, Exponent = 1f }, + RocheLimit = new ExponentialCurve { Constant = 10f } + }; + var zone = new Zone(items, curves, pack, null, null); + + var rootObject = new GameObject("Wiring Zone Root"); + + var ore = new SimpleCommodity { Data = items.ItemData.RefOf(items.ItemData.GetByName("Wiring Ore")), Quantity = 7 }; + var floating = zone.Release(ore, new float2(-17, 4), new float2(10, 0)); + var mine = new Mine + { + Body = new KinematicBody { Position = new float2(-20, 8), Velocity = new float2(0, 14) }, + ArmingDelay = 1e6f, FuseDelay = 1f, Lifetime = 1e6f, BlastRadius = 1f + }; + zone.Lay(mine); + + // Bound the way ZoneRenderer.LoadFloatingItem and LoadMine bind them: the prefab ARPG.unity names, Bind(zone, body, settings). + // (A ZoneRenderer would load this zone's sun and planet too, and that needs the planet prefab, the map and a GPU.) + var pickup = UnityEngine.Object.Instantiate(pickupPrefab, rootObject.transform); + pickup.Bind(zone, floating, settings); + var mineInstance = UnityEngine.Object.Instantiate(minePrefab, rootObject.transform); + mineInstance.Bind(zone, mine, settings); + + // A round on its frozen line, no target and no outcome known: drawn at FireOrigin + direction * speed * (T - FireTime). + var shot = new PendingShot + { + ShotId = 1, FireOrigin = new float3(0, 0, 0), FireTime = 0f, TravelDirection = new float2(1, 0), Speed = RoundSpeed, + MaxRange = 1e6f, FireRange = 1e6f, CommitTime = 1e5f, ArrivalTime = 2e5f + }; + var projectile = new GameObject("Wiring Round").AddComponent(); + projectile.Launch(null, zone, shot, new Vector3(0, 0, 0)); + yield return null; + + zone.Update(.5f); + + + var pickupVelocity = floating.Body.TotalVelocity; + var mineVelocity = mine.Body.TotalVelocity; + Require(Mathf.Abs(pickupVelocity.x) > 1f && Mathf.Abs(mineVelocity.y) > 1f, "The fixture's bodies stopped: a lead would not move them."); + + // The field under each floater really is a function of the drawn time here, by more than the tolerance at the largest lead. + const float LargestLead = .015f; + foreach (var at in new[] { floating.Body.Position + pickupVelocity * LargestLead, mine.Body.Position + mineVelocity * LargestLead }) + Require(Mathf.Abs(DrawAhead.Height(zone, at, LargestLead) - zone.GetHeight(at, zone.ExactTime)) > 5 * Tolerance, + $"The fixture's field is flat under a floater: height {DrawAhead.Height(zone, at, LargestLead)} at the drawn time, {zone.GetHeight(at, zone.ExactTime)} at the step, planet at {zone.OrbitPositionAt(planetOrbit, zone.ExactTime)}, floater at {at}."); + + Vector2 baseline = default; + foreach (var leadSeconds in new[] { 0f, .008f, .015f }) + { + ActionGameManager.Clock.Reset(); + if (leadSeconds > 0) ActionGameManager.Clock.Advance(leadSeconds, _ => throw new InvalidOperationException("a step ran")); + var lead = ActionGameManager.Clock.Lead; + Require(Mathf.Abs(lead - leadSeconds) < 1e-6f, $"The clock's lead is {lead}, not {leadSeconds}."); + yield return null; + + var seen = pickup.transform.position; + var want = floating.Body.Position + pickupVelocity * lead; + Require(Mathf.Abs(seen.x - want.x) < Tolerance && Mathf.Abs(seen.z - want.y) < Tolerance, + $"ItemPickup at lead {lead}: drawn x/z {seen.x},{seen.z}, the step plus velocity times lead {want.x},{want.y}."); + + Require(Mathf.Abs(seen.y - DrawAhead.FloaterHeight(zone, settings, new float2(want.x, want.y), lead)) < Tolerance, + $"ItemPickup y {seen.y} is not on the floater layer."); + + seen = mineInstance.transform.position; + want = mine.Body.Position + mineVelocity * lead; + Require(Mathf.Abs(seen.x - want.x) < Tolerance && Mathf.Abs(seen.z - want.y) < Tolerance, + $"MineInstance at lead {lead}: drawn x/z {seen.x},{seen.z}, the step plus velocity times lead {want.x},{want.y}."); + Require(Mathf.Abs(seen.y - DrawAhead.FloaterHeight(zone, settings, new float2(want.x, want.y), lead)) < Tolerance, + $"MineInstance y {seen.y} is not on the floater layer."); + + // The round's line is a function of the drawn time: it moves RoundSpeed * lead along its direction between leads. + seen = projectile.transform.position; + if (leadSeconds == 0f) baseline = new Vector2(seen.x, seen.z); + var moved = new Vector2(seen.x, seen.z) - baseline; + Require(Mathf.Abs(moved.x - RoundSpeed * lead) < Tolerance && Mathf.Abs(moved.y) < Tolerance, + $"Projectile at lead {lead}: drawn {moved.x},{moved.y} past its lead-0 pose, expected {RoundSpeed * lead},0."); + } + ActionGameManager.Clock.Reset(); + Debug.Log($"{Tag} ok: ItemPickup, MineInstance and Projectile draw at the clock's lead (0, 0.008, 0.015 s)"); + } + + // What ARPG.unity's ZoneRenderer names in the pickup and mine fields, read from the saved scene before the play session + // (a scene cannot be opened inside one) and carried across the domain reload as asset paths. + private static string ReadWiring() + { + var scene = EditorSceneManager.OpenScene("Assets/Scenes/ARPG.unity", OpenSceneMode.Additive); + try + { + var found = UnityEngine.Object.FindObjectsByType(FindObjectsInactive.Include, FindObjectsSortMode.None) + .Where(r => r.gameObject.scene == scene).ToArray(); + Require(found.Length == 1, $"ARPG.unity has {found.Length} ZoneRenderers."); + var wired = found[0]; + return string.Join("|", new (string, UnityEngine.Object)[] + { + ("SimpleCommodityPickup", wired.SimpleCommodityPickup), ("MinePrefab", wired.MinePrefab) + }.Select(f => f.Item1 + "=" + (f.Item2 == null ? "" : AssetDatabase.GetAssetPath(f.Item2)))); + } + finally { EditorSceneManager.CloseScene(scene, true); } + } + } +} diff --git a/Assets/Scripts/Editor/DrawnPoseWiringVerify.cs.meta b/Assets/Scripts/Editor/DrawnPoseWiringVerify.cs.meta new file mode 100644 index 000000000..534bebdb6 --- /dev/null +++ b/Assets/Scripts/Editor/DrawnPoseWiringVerify.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: c2270cf68a4af384eb715c8b5a55f5e8 \ No newline at end of file diff --git a/Assets/Scripts/Editor/EmojiCheck.cs b/Assets/Scripts/Editor/EmojiCheck.cs new file mode 100644 index 000000000..1f464fd9f --- /dev/null +++ b/Assets/Scripts/Editor/EmojiCheck.cs @@ -0,0 +1,222 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using TMPro; +using UnityEditor; +using UnityEngine; + +// Every single-code-point emoji of the pinned Unicode Emoji version that Twemoji draws, and the Pirates product +// names read from the shipped catalog, render through an ordinary TMP text on the game's body font with no +// missing code point, no blank glyph, ink in the emoji atlas, and each glyph served by the emoji asset or by the +// body font itself, never by a third font. TMP Settings must route emoji by two named routes (operator ruling +// emoji-fallback-route): the global fallback names Emoji.asset and the emoji fallback list is exactly Emoji.asset, +// so dropping either fails. +// Run as -executeMethod EmojiCheck.Run (exit 1 on failure in batchmode, as EngineAssetCheck). Corpus: +// tools/emoji/emoji-singles.txt (from emoji-test.txt); the emoji Twemoji lacks are listed in +// tools/emoji/emoji-unsupported.txt and reported, not rendered; -emojiLimit N spreads N entries evenly for a spike. +// Every fully-qualified multi-code-point sequence (tools/emoji/emoji-sequences.txt: ZWJ, skin tone, flag, keycap, +// tag) must also render as exactly one visible character, which needs `liga` on the rendering component: every +// TMP text in every prefab and scene must have it, and so must one added at runtime (as ActionGameManager's +// FACE AIM mark is), or a family or flag would show as its pieces. +public static class EmojiCheck +{ + const string BodyFontPath = "Assets/Fonts/Ubuntu/Ubuntu-L Small SDF.asset"; + const string PiratesFaction = "Pirates"; + const int Chunk = 64; + + [MenuItem("Aetheria/Text/Check Emoji Rendering")] + public static void Run() + { + var failures = new List(); + var summary = RunCheck(failures); + foreach (var failure in failures.Take(20)) Debug.LogError(failure); + Debug.Log($"EmojiCheck: {summary}; {failures.Count} failure(s)."); + if (Application.isBatchMode) EditorApplication.Exit(failures.Count == 0 ? 0 : 1); + } + + // Public so a scratch driver can mutate TMP Settings in memory and watch this fail; adds to failures. + public static string RunCheck(List failures) + { + var emoji = AssetDatabase.LoadAssetAtPath(EmojiFont.AssetPath); + var body = AssetDatabase.LoadAssetAtPath(BodyFontPath); + if (emoji == null || body == null) + { + failures.Add("EmojiCheck: Emoji.asset or the body font is missing; run EmojiFont.Build first."); + return "nothing checked"; + } + + // Two routes (operator ruling emoji-fallback-route): the emoji fallback list is exactly Emoji.asset, and the global list below names it. + if (TMP_Settings.emojiFallbackTextAssets == null || TMP_Settings.emojiFallbackTextAssets.Count != 1 || TMP_Settings.emojiFallbackTextAssets[0] != emoji) + failures.Add("TMP Settings' emoji fallback list is not exactly Emoji.asset: FE0F-followed bases the body font draws will not reach Twemoji."); + if (TMP_Settings.fallbackFontAssets == null || !TMP_Settings.fallbackFontAssets.Contains(emoji)) + failures.Add("TMP Settings' global fallback list does not name Emoji.asset: the route for every single code point is gone."); + + var unsupported = new HashSet(LoadCodePoints("emoji-unsupported.txt")); + var corpus = LoadSingles().Where(cp => !unsupported.Contains(cp)).ToList(); + var sequences = LoadSequences(); + var missing = new HashSet(); + TMP_Text.MissingCharacterEventCallback onMissing = (unicode, index, source, asset, component) => missing.Add(unicode); + TMP_Text.OnMissingCharacter += onMissing; + + var canvas = new GameObject("EmojiCheck", typeof(Canvas)); + var text = new GameObject("Text", typeof(RectTransform)).AddComponent(); + text.transform.SetParent(canvas.transform, false); + text.font = body; + text.textWrappingMode = TextWrappingModes.NoWrap; + text.rectTransform.sizeDelta = new Vector2(100000, 100000); + + int viaEmoji = 0, viaBody = 0, blank = 0, pirateNames = 0, notOne = 0, runtimeLiga = 0; + var strays = new HashSet(); + try + { + void Render(string content, string label) + { + text.text = content; + text.ForceMeshUpdate(); + for (var i = 0; i < text.textInfo.characterCount; i++) + { + var info = text.textInfo.characterInfo[i]; + if (info.character == ' ' || info.elementType != TMP_TextElementType.Character) continue; + if (info.fontAsset == emoji) viaEmoji++; + else if (info.fontAsset == body) viaBody++; + else if (strays.Add($"{info.fontAsset.name}:{(int)info.character:X}")) + failures.Add($"U+{(int)info.character:X4} in {label} was served by {info.fontAsset.name}, not Emoji.asset or the body font"); + if (info.fontAsset == emoji && info.textElement.glyph.glyphRect.width <= 0) + { + blank++; + failures.Add($"blank glyph U+{(int)info.character:X4} in {label}"); + } + } + } + + for (var i = 0; i < corpus.Count; i += Chunk) + { + var slice = corpus.Skip(i).Take(Chunk).ToList(); + Render(string.Join(" ", slice.Select(char.ConvertFromUtf32)), $"chunk {i}"); + } + + // A text created at runtime inherits liga from TMP Settings, with no wiring of its own. + var runtime = new GameObject("Runtime", typeof(RectTransform)); + runtime.transform.SetParent(canvas.transform, false); + runtimeLiga = runtime.AddComponent().fontFeatures + .Contains(UnityEngine.TextCore.OTL_FeatureTag.liga) ? 1 : 0; + if (runtimeLiga == 0) failures.Add("a TextMeshProUGUI added at runtime does not have liga: TMP Settings' features are not inherited"); + + // Sequences: space-separated groups, each of which must end as one visible character. + for (var i = 0; i < sequences.Count; i += Chunk) + { + var slice = sequences.Skip(i).Take(Chunk).ToList(); + text.text = string.Join(" ", slice.Select(ToText)); + text.ForceMeshUpdate(); + var visible = new List { 0 }; + var shown = new List { "" }; + for (var c = 0; c < text.textInfo.characterCount; c++) + { + var info = text.textInfo.characterInfo[c]; + if (info.character == ' ') { visible.Add(0); shown.Add(""); } + else if (info.isVisible) + { + visible[visible.Count - 1]++; + shown[shown.Count - 1] += $" U+{(int)info.character:X}:{info.fontAsset.name}"; + } + } + if (visible.Count != slice.Count) failures.Add($"sequence chunk {i}: {visible.Count} groups rendered for {slice.Count} sequences"); + for (var g = 0; g < Math.Min(visible.Count, slice.Count); g++) + if (visible[g] != 1) + { + notOne++; + failures.Add($"sequence {slice[g]} rendered {visible[g]} visible characters, not one:{shown[g]}"); + } + } + + // The Pirates names as the shipped catalog stores them, through the game's own catalog reader. + var catalogPath = Path.Combine(Directory.GetParent(Application.dataPath).FullName, "GameData", "Aetheria.cc"); + using (var catalog = AetheriaStores.Open(catalogPath)) + { + var pirates = catalog.GetAll().SingleOrDefault(faction => faction.Name == PiratesFaction); + if (pirates == null) failures.Add($"the catalog has no {PiratesFaction} faction"); + else + { + var key = catalog.RefOf(pirates); + foreach (var product in catalog.GetAll().Where(product => product.Manufacturer.Equals(key))) + { + pirateNames++; + Render(product.Name, $"Pirates product name \"{product.Name}\""); + } + if (pirateNames == 0) failures.Add($"the catalog has no {PiratesFaction} products"); + } + } + } + finally + { + TMP_Text.OnMissingCharacter -= onMissing; + UnityEngine.Object.DestroyImmediate(canvas); + } + + foreach (var cp in missing.OrderBy(c => c)) failures.Add($"missing code point U+{cp:X4}"); + + // Every serialized TMP text has liga (an instance inherits it from its prefab, so this reads the effective value). + int texts = 0, withoutLiga = 0; + EmojiFont.VisitSerializedTexts(component => + { + texts++; + if (!component.fontFeatures.Contains(UnityEngine.TextCore.OTL_FeatureTag.liga)) + { + withoutLiga++; + failures.Add($"TMP text {component.name} has no liga: {GetPath(component)}"); + } + return false; + }); + + // TMP over-allocates atlasTextures by doubling its capacity when a page is added, so entries past + // atlasTextureCount are null by design (3 pages in a 4-slot array). Only the used pages count. + long ink = 0, colour = 0; + for (var i = 0; i < emoji.atlasTextureCount; i++) + { + var page = emoji.atlasTextures[i]; + if (page == null) { failures.Add($"emoji atlas page {i} of {emoji.atlasTextureCount} is null"); continue; } + var pixels = page.GetPixels32(); + ink += pixels.LongCount(p => p.a != 0); + colour += pixels.LongCount(p => p.a != 0 && (p.r != p.g || p.g != p.b)); + } + if (ink == 0) failures.Add("the emoji atlas holds no ink after rendering"); + else if (colour == 0) failures.Add("the emoji atlas holds no coloured pixel: the glyphs rendered monochrome"); + + var pages = emoji.atlasTextureCount; + // Dynamic atlas content is cache: drop it so this check leaves the asset as Build wrote it. + emoji.ClearFontAssetData(true); + if (unsupported.Count > 0) + Debug.LogWarning($"EmojiCheck: Twemoji lacks {unsupported.Count} single-code-point emoji of the Emoji version: " + + string.Join(" ", unsupported.OrderBy(c => c).Select(c => $"U+{c:X4}"))); + return $"{sequences.Count} sequences ({notOne} not one visible character), {texts} serialized TMP texts ({withoutLiga} without liga), runtime text liga {runtimeLiga}; " + + $"checked {corpus.Count} single code points ({unsupported.Count} not drawn by Twemoji, listed in the warning) + {pirateNames} Pirates product names, " + + $"{missing.Count} missing, {viaEmoji} glyphs via the emoji asset, {viaBody} via the body font, {strays.Count} via other fonts, {blank} blank, " + + $"{ink} atlas ink pixels of which {colour} coloured, {pages} atlas pages"; + } + + static string GetPath(Component component) => + component.gameObject.scene.IsValid() ? component.gameObject.scene.path : AssetDatabase.GetAssetPath(component); + + static string ToText(string sequence) => string.Concat(sequence.Split(' ').Select(cp => char.ConvertFromUtf32(Convert.ToInt32(cp, 16)))); + + static List LoadSequences() => + File.ReadAllLines(Path.Combine(Directory.GetParent(Application.dataPath).FullName, "tools", "emoji", "emoji-sequences.txt")) + .Where(l => l.Length > 0).ToList(); + + static List LoadSingles() + { + var all = LoadCodePoints("emoji-singles.txt"); + var args = Environment.GetCommandLineArgs(); + var at = Array.IndexOf(args, "-emojiLimit"); + if (at < 0 || at + 1 >= args.Length) return all; + var limit = int.Parse(args[at + 1]); + return Enumerable.Range(0, limit).Select(i => all[i * all.Count / limit]).ToList(); + } + + static List LoadCodePoints(string file) + { + var path = Path.Combine(Directory.GetParent(Application.dataPath).FullName, "tools", "emoji", file); + return File.ReadAllLines(path).Where(l => l.Length > 0).Select(l => Convert.ToInt32(l, 16)).ToList(); + } +} diff --git a/Assets/Scripts/Editor/EmojiCheck.cs.meta b/Assets/Scripts/Editor/EmojiCheck.cs.meta new file mode 100644 index 000000000..945280e85 --- /dev/null +++ b/Assets/Scripts/Editor/EmojiCheck.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: c6f940add256a754daac8460fc79480d \ No newline at end of file diff --git a/Assets/Scripts/Editor/EmojiFont.cs b/Assets/Scripts/Editor/EmojiFont.cs new file mode 100644 index 000000000..9d50b95c1 --- /dev/null +++ b/Assets/Scripts/Editor/EmojiFont.cs @@ -0,0 +1,167 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using TMPro; +using UnityEditor; +using UnityEditor.SceneManagement; +using UnityEngine; +using UnityEngine.TextCore; +using UnityEngine.TextCore.LowLevel; + +// The one writer of the emoji font asset and of TMP Settings' emoji routing. The font file is the +// output of tools/emoji/fetch_emoji_font.py; the asset is a dynamic COLOR font asset whose atlas pages +// are cache, filled on first use at runtime and cleared here. Every TMP text reaches emoji through TMP +// Settings alone (no component names an emoji font), by two routes that both name only Emoji.asset (operator ruling +// emoji-fallback-route): the global fallback serves every code point, including the 200 text-presentation emoji the +// emoji list alone leaves unresolved; the emoji fallback list is what TMP tries first when FE0F follows, so a keycap +// or FE0F/ZWJ sequence whose first code point the body font also draws reaches Twemoji, whose ligatures collapse it. +// Sequences (ZWJ, skin tone, flag, keycap) resolve only through the emoji font's GSUB ligatures, and TMP applies +// them per component, gated by that component's font features: EnableLigatures writes `liga` into every +// serialized TMP text and into TMP Settings (so a text created later inherits it); there is no global switch. +public static class EmojiFont +{ + public const string FontPath = "Assets/Fonts/Emoji/Twemoji.ttf"; + public const string AssetPath = "Assets/Fonts/Emoji/Emoji.asset"; + + // Colour outlines (COLRv0) are rasterised at one size; 109 is the strike size a CBDT set needs. + const int SamplingPointSize = 64; + const int AtlasPadding = 4; + const int AtlasSize = 2048; + + // Menu entry for interactive use; -executeMethod EmojiFont.Build for batchmode, exit 1 on failure. + [MenuItem("Aetheria/Text/Build Emoji Font")] + public static void Build() + { + var ok = TryBuild(out var message); + if (ok) Debug.Log(message); else Debug.LogError(message); + if (Application.isBatchMode) EditorApplication.Exit(ok ? 0 : 1); + } + + static bool TryBuild(out string message) + { + var font = AssetDatabase.LoadAssetAtPath(FontPath); + if (font == null) + { + message = $"EmojiFont: {FontPath} is missing; run tools/emoji/fetch_emoji_font.py."; + return false; + } + + // An existing asset keeps its GUID, so a second Build changes nothing the settings point at. + var asset = AssetDatabase.LoadAssetAtPath(AssetPath); + if (asset == null) + { + asset = TMP_FontAsset.CreateFontAsset(font, SamplingPointSize, AtlasPadding, GlyphRenderMode.COLOR, + AtlasSize, AtlasSize, AtlasPopulationMode.Dynamic, enableMultiAtlasSupport: true); + if (asset == null) + { + message = $"EmojiFont: TMP could not create a font asset from {FontPath}."; + return false; + } + asset.name = "Emoji"; + AssetDatabase.CreateAsset(asset, AssetPath); + foreach (var page in asset.atlasTextures) + { + page.name = "Emoji Atlas"; + AssetDatabase.AddObjectToAsset(page, asset); + } + asset.material.name = "Emoji Atlas Material"; + AssetDatabase.AddObjectToAsset(asset.material, asset); + } + + // The atlas pages are cache: Build leaves them empty, the same state EmojiCheck restores. + asset.ClearFontAssetData(true); + + // Two routes: the global fallback serves every code point (text-presentation emoji too, U+263A without FE0F); + // the emoji list is tried first when FE0F follows. + TMP_Settings.emojiFallbackTextAssets = new List { asset }; + TMP_Settings.fallbackFontAssets = new List { asset }; + TMP_Settings.defaultSpriteAsset = null; + + EditorUtility.SetDirty(asset); + EditorUtility.SetDirty(TMP_Settings.instance); + AssetDatabase.SaveAssets(); + message = "EmojiFont: built " + AssetPath + " and named it in both of TMP Settings' emoji routes (the global fallback and the emoji fallback list)."; + return true; + } + + // Menu entry for interactive use; -executeMethod EmojiFont.EnableLigatures for batchmode, exit 1 on failure. + // Idempotent: a second run changes nothing and saves nothing. + [MenuItem("Aetheria/Text/Enable Ligatures")] + public static void EnableLigatures() + { + try + { + var settings = TMP_Settings.fontFeatures; + var settingsChanged = Enable(settings); + if (settingsChanged) EditorUtility.SetDirty(TMP_Settings.instance); + var (files, components) = VisitSerializedTexts(text => + { + var features = text.fontFeatures.ToList(); + if (!Enable(features, new SerializedObject(text).FindProperty("m_enableKerning").boolValue)) return false; + text.fontFeatures = features; + EditorUtility.SetDirty(text); + return true; + }); + AssetDatabase.SaveAssets(); + Debug.Log($"EmojiFont: liga added to {components} TMP component(s) in {files} file(s)" + + (settingsChanged ? " and to TMP Settings." : "; TMP Settings already had it.")); + if (Application.isBatchMode) EditorApplication.Exit(0); + } + catch (Exception e) + { + Debug.LogError("EmojiFont.EnableLigatures failed: " + e); + if (Application.isBatchMode) EditorApplication.Exit(1); + } + } + + // A legacy list ([0], no feature serialized) is first converted to [kern] when kerning is on, as TMP does on load. + static bool Enable(List features, bool kerning = true) + { + if (features.Contains(OTL_FeatureTag.liga)) return false; + features.RemoveAll(tag => tag == 0); + if (kerning && !features.Contains(OTL_FeatureTag.kern)) features.Add(OTL_FeatureTag.kern); + features.Add(OTL_FeatureTag.liga); + return true; + } + + // The one walk over every TMP text a serialized asset owns: each prefab and each scene under Assets/, skipping a + // component that belongs to a prefab instance unless that instance overrides its font features (otherwise it + // inherits from its source prefab, which is walked itself). `visit` returns whether it changed the component; + // an asset that changed is saved. Returns the files and components changed. + public static (int files, int components) VisitSerializedTexts(Func visit) + { + int files = 0, components = 0; + bool Owns(TMP_Text text) => + !PrefabUtility.IsPartOfPrefabInstance(text) || + new SerializedObject(text).FindProperty("m_ActiveFontFeatures")?.prefabOverride == true; + int Visit(IEnumerable texts) => texts.Where(Owns).Count(visit); + + foreach (var path in AssetDatabase.FindAssets("t:Prefab", new[] { "Assets" }).Select(AssetDatabase.GUIDToAssetPath)) + { + var root = PrefabUtility.LoadPrefabContents(path); + try + { + var changed = Visit(root.GetComponentsInChildren(true)); + if (changed == 0) continue; + PrefabUtility.SaveAsPrefabAsset(root, path); + files++; + components += changed; + } + finally { PrefabUtility.UnloadPrefabContents(root); } + } + foreach (var path in AssetDatabase.FindAssets("t:Scene", new[] { "Assets" }).Select(AssetDatabase.GUIDToAssetPath)) + { + var scene = EditorSceneManager.OpenScene(path, OpenSceneMode.Additive); + try + { + var changed = Visit(scene.GetRootGameObjects().SelectMany(root => root.GetComponentsInChildren(true))); + if (changed == 0) continue; + EditorSceneManager.SaveScene(scene); + files++; + components += changed; + } + finally { EditorSceneManager.CloseScene(scene, true); } + } + return (files, components); + } +} diff --git a/Assets/Scripts/Editor/EmojiFont.cs.meta b/Assets/Scripts/Editor/EmojiFont.cs.meta new file mode 100644 index 000000000..5888665c0 --- /dev/null +++ b/Assets/Scripts/Editor/EmojiFont.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: bd3a902defe23f14fbe821ca9fb26a08 \ No newline at end of file diff --git a/Assets/Scripts/Editor/FloatingItemsDrawnSmoke.cs b/Assets/Scripts/Editor/FloatingItemsDrawnSmoke.cs new file mode 100644 index 000000000..742e8aa9d --- /dev/null +++ b/Assets/Scripts/Editor/FloatingItemsDrawnSmoke.cs @@ -0,0 +1,262 @@ +using System; +using System.Collections; +using System.IO; +using System.Linq; +using GameCult.Caching; +using UnityEditor; +using UnityEditor.SceneManagement; +using UnityEngine; +using float2 = CultMath.float2; + +// Batch proof that ZoneRenderer draws Zone.FloatingItems and nothing else, in a play session with no scene of its own: +// the pickup prefabs are the ones ARPG.unity's ZoneRenderer names (so the wiring is read here too), a zone is loaded +// into a fresh ZoneRenderer, and the zone's own Release, step, expiry and TryPickUp are what move and remove the +// pickups. Zone.Release adds exactly one ItemPickup, placed at the body's position; stepping the zone moves it with the +// body; expiry and TryPickUp each destroy it; an item already in the zone when the renderer loads it is drawn too. +// +// Unity -batchmode -nographics -projectPath -executeMethod FloatingItemsDrawnSmoke.Run -logFile +// +// Do not pass -quit: Run enters play mode (a domain reload), the check runs there, and the Editor exits itself, 0 on +// success and 1 on any failure. Destroy only takes effect in a play session, which is why this is not an edit-mode check. +[InitializeOnLoad] +public static class FloatingItemsDrawnSmoke +{ + private const string Flag = "FloatingItemsDrawnSmoke.running"; + private const string Wiring = "FloatingItemsDrawnSmoke.wiring"; + private static IEnumerator _check; + private const double Budget = 300; // real seconds: batch frames can be far shorter than a game second + private static double _started; + private static string _work; + + static FloatingItemsDrawnSmoke() + { + if (SessionState.GetBool(Flag, false)) EditorApplication.playModeStateChanged += OnPlayMode; + } + + public static void Run() + { + try + { + SessionState.SetString(Wiring, ReadWiring()); + SessionState.SetBool(Flag, true); + EditorApplication.EnterPlaymode(); + } + catch (Exception exception) + { + Debug.LogException(exception); + EditorApplication.Exit(1); + } + } + + private static void OnPlayMode(PlayModeStateChange change) + { + if (change != PlayModeStateChange.EnteredPlayMode) return; + _work = Path.Combine(Path.GetTempPath(), $"floating-items-smoke-{Guid.NewGuid():N}"); + Directory.CreateDirectory(_work); + _started = Time.realtimeSinceStartupAsDouble; + _check = Check(); + EditorApplication.update += Step; + } + + private static void Step() + { + try + { + if (Time.realtimeSinceStartupAsDouble - _started > Budget) throw new InvalidOperationException($"The check did not finish in {Budget} seconds."); + if (_check.MoveNext()) return; + Finish(0); + } + catch (Exception exception) + { + Debug.LogException(exception); + Finish(1); + } + } + + private static void Finish(int code) + { + EditorApplication.update -= Step; + SessionState.SetBool(Flag, false); + try { if (Directory.Exists(_work)) Directory.Delete(_work, true); } catch (Exception) { /* a temp directory */ } + EditorApplication.Exit(code); + } + + private static void Require(bool condition, string what) + { + if (!condition) throw new InvalidOperationException(what); + } + + private static IEnumerator Check() + { + var settings = AssetDatabase.LoadAssetAtPath("Assets/Resources/Settings.asset")?.GameplaySettings + ?? throw new InvalidOperationException("No Settings.asset."); + // A floater rides its own layer: a nonzero one (never saved back to the asset), so a presenter that drops it fails. + settings.FloaterLayerHeight = -1.5f; + + // The wiring: the scene's ZoneRenderer names an ItemPickup prefab in each of the four fields, and none of those + // prefabs keeps a script that no longer exists. + var wired = SessionState.GetString(Wiring, "").Split('|').Select(entry => entry.Split('=')).Select(pair => + (Field: pair[0], Pickup: pair[1] == "" ? null : AssetDatabase.LoadAssetAtPath(pair[1])?.GetComponent())).ToArray(); + Require(wired.Length == 4, "The wiring was not carried into the play session."); + foreach (var (name, pickup) in wired) + { + Require(pickup != null, $"ZoneRenderer.{name} is not an ItemPickup in ARPG.unity."); + Require(pickup.ScanLabel != null && pickup.ScanLabelContainer != null, $"{name}'s prefab has no scan label."); + Require(!pickup.GetComponentsInChildren(true).Any(c => c == null), $"{name}'s prefab has a missing script."); + } + + var shape = new Shape(5, 5); + foreach (var cell in shape.AllCoordinates) shape[cell] = true; + var cargoShape = new Shape(4, 4); + foreach (var cell in cargoShape.AllCoordinates) cargoShape[cell] = true; + var oneCell = new Shape(1, 1); + oneCell[new CultMath.int2(0, 0)] = true; + var cache = AetheriaStores.Open(Path.Combine(_work, "smoke.cc"), catalogWritable: true); + cache.Upsert(new VerseGrammar { Revision = 1 }); + cache.Upsert(new HullData { Name = "Smoke Hub", HullType = HullType.Station, Shape = shape, Durability = 1000, Mass = 1000 }); + cache.Upsert(new CargoBayData { Name = "Smoke Crate", Shape = new Shape(), InteriorShape = cargoShape, Durability = 4 }); + cache.Upsert(new GearData + { + Name = "Smoke Spare", Hardpoint = HardpointType.Tool, Shape = oneCell, Durability = 1, + MinimumTemperature = -1000, MaximumTemperature = 1000, OptimalTemperature = 0, PlateauWidth = 2000 + }); + cache.Upsert(new SimpleCommodityData { Name = "Smoke Ore", Shape = oneCell, MaxStack = 100 }); + cache.FlushAsync().Wait(); + var ledger = new ProvenanceLedger(); + for (var i = 1; i <= 8; i++) ledger.Lots[i] = new Lot { Origin = new Attributed(), Quality = 1 }; + var items = new ItemManager(1u, cache, ledger, settings, _ => { }); + var zone = new Zone(items, new PlanetSettings(), new ZonePack(), null, null); + EquippableItem Make(string name, int lot) => new EquippableItem + { + Data = items.ItemData.RefOf(items.ItemData.GetByName(name)), Durability = 1, Lot = lot + }; + + // A station with a crate takes the picked-up stack. It is not admitted: the zone holds no entity for the renderer to draw. + var hubRef = items.ItemData.RefOf(items.ItemData.GetByName("Smoke Hub")); + var taker = new OrbitalEntity(items, zone, new EquippableItem { Data = hubRef, Durability = 1000, Lot = 1 }, default, new EntitySettings()); + Require(taker.TryEquip(Make("Smoke Crate", 2), new CultMath.int2(1, 1)), "The smoke station took no crate."); + + // An item already in the zone when the renderer loads it: drawn from the load, not only from the add. + var early = zone.Release(Make("Smoke Spare", 3), new float2(5, 6), float2.zero); + + // The renderer's side. Inactive while it is configured, so it runs no Awake or Start of the scene's own. + var rootObject = new GameObject("Smoke Zone Root"); + var rendererObject = new GameObject("Smoke Zone Renderer"); + rendererObject.SetActive(false); + var renderer = rendererObject.AddComponent(); + renderer.ZoneRoot = rootObject.transform; + foreach (var (name, pickup) in wired) + typeof(ZoneRenderer).GetField(name).SetValue(renderer, pickup); + renderer.ItemManager = items; + renderer.SectorBrushes = new GameObject("Smoke Brushes").transform; + renderer.AmbientLight = Aetheria.EditorTools.AmbientEdgeVerify.NewAmbientLight(); + renderer.SlimeGravityCamera = new GameObject("Smoke Gravity Camera").AddComponent(); + var slimeObject = new GameObject("Smoke Slime"); + slimeObject.SetActive(false); // the real Slime needs its compute shader; LoadZone only sets its radius + renderer.SlimeRenderer = slimeObject.AddComponent(); + renderer.LoadZone(zone); + yield return null; + + ItemPickup[] Pickups() => rootObject.GetComponentsInChildren(true).Where(p => p != null).ToArray(); + void At(ItemPickup pickup, FloatingItem floating, string what) + { + var lead = ActionGameManager.Clock.Lead; + var at = DrawAhead.Position(floating.Body, lead); + var want = new Vector3(at.x, DrawAhead.FloaterHeight(zone, settings, at, lead), at.y); + Require(Vector3.Distance(pickup.transform.position, want) < 1e-3f, + $"{what}: the pickup is at {pickup.transform.position}, the body at {want}."); + } + + Require(Pickups().Length == 1, $"load: {Pickups().Length} pickups for one existing floating item."); + At(Pickups()[0], early, "load"); + + // Release adds exactly one pickup, at the body's position, bound to its item. + var ore = new SimpleCommodity { Data = items.ItemData.RefOf(items.ItemData.GetByName("Smoke Ore")), Quantity = 7 }; + var released = zone.Release(ore, new float2(3, 4), new float2(10, 0)); + yield return null; + Require(Pickups().Length == 2, $"release: {Pickups().Length} pickups for two floating items."); + var drawn = Pickups().Single(p => p.Item == ore); + At(drawn, released, "release"); + + // Stepping the zone moves the sim body; the pickup follows it on its next update, with nothing of its own. + var before = drawn.transform.position; + zone.Update(.5f); + yield return null; + Require(released.Body.Position.x > 3.5f, "the sim body did not drift."); + At(drawn, released, "step"); + Require(drawn.transform.position != before, "the pickup did not move with the body."); + + // A held item keeps its label lit, so a pull is read as it happens. The label is let go dark first (nothing views + // it), then the zone holds the item through its own TryHold and the label must come up. + var earlyPickup = Pickups().Single(p => p.Item == early.Item); + earlyPickup.LabelPersistDuration = 1; + earlyPickup.LabelFadeDuration = .2f; + // Game time, not frames: batch frames can be far shorter than a game second, so a frame count can run out before the fade. + var labelUntil = Time.time + earlyPickup.LabelPersistDuration + earlyPickup.LabelFadeDuration + 1f; + while (Time.time < labelUntil && earlyPickup.ScanLabel.color.a > .05f) yield return null; + Require(earlyPickup.ScanLabel.color.a <= .05f, "label: an unviewed, unheld label did not go dark."); + Require(zone.TryHold(taker, early.Id), "label: the zone refused to hold the item."); + labelUntil = Time.time + earlyPickup.LabelPersistDuration + earlyPickup.LabelFadeDuration + 1f; + while (Time.time < labelUntil && earlyPickup.ScanLabel.color.a < .95f) yield return null; + Require(earlyPickup.ScanLabel.color.a >= .95f, "label: a held item's label is not lit."); + + // The test scene's stand-in sim and tendril ride the zone's own held-pose curve: its pose at each point of a grab + // is where the zone puts a held item at the same progress. + var (extend, envelop, pull) = (1.5f, .75f, 1.5f); + var holderAt = new CultMath.float3(taker.Position.x, 0f, taker.Position.z); + var claimedAt = new CultMath.float3(early.HeldFrom.x, 0f, early.HeldFrom.y); + foreach (var elapsed in new[] { 0f, extend + envelop - .01f, extend + envelop + .3f, extend + envelop + .75f, extend + envelop + pull }) + { + zone.SetHeldProgress(early.Id, Mathf.Clamp01((elapsed - extend - envelop) / pull)); // the pull starts after Extend and Envelop + zone.Update(.01f); + var want = FieldTester.PulledPosition(claimedAt, holderAt, elapsed, extend, envelop, pull); + Require(Mathf.Abs(early.Body.Position.x - want.x) < 1e-3f && Mathf.Abs(early.Body.Position.y - want.z) < 1e-3f, + $"stand-in pose at {elapsed}s is {want}, the zone holds the item at {early.Body.Position}."); + } + zone.Free(early.Id); + + // Pickup destroys exactly the picked-up item's pickup. + Require(zone.TryPickUp(taker, released.Id), "the station refused a one-cell stack."); + yield return null; + yield return null; + Require(drawn == null, "pickup: the pickup is still there."); + Require(Pickups().Length == 1 && Pickups()[0].Item == early.Item, "pickup: the wrong pickup went."); + + // Expiry destroys the pickup of an item nobody took. + zone.Update(3600f); // far past any lifetime + yield return null; + yield return null; + Require(zone.FloatingItems.Count == 0, "expiry: the item did not expire."); + Require(Pickups().Length == 0, $"expiry: {Pickups().Length} pickups left."); + + // A later release is drawn again, and clearing the renderer takes what is left. + zone.Release(Make("Smoke Spare", 4), new float2(1, 1), float2.zero); + yield return null; + Require(Pickups().Length == 1, "re-release: not drawn."); + renderer.ClearZone(); + yield return null; + yield return null; + Require(Pickups().Length == 0, "clear: pickups left after ClearZone."); + Debug.Log("FLOATING_ITEMS_SMOKE ok"); + } + + // What ARPG.unity's ZoneRenderer names in each pickup field, read from the saved scene before the play session (a + // scene cannot be opened inside one) and carried across the domain reload as the prefabs' asset paths. + private static string ReadWiring() + { + var scene = EditorSceneManager.OpenScene("Assets/Scenes/ARPG.unity", OpenSceneMode.Additive); + try + { + var found = UnityEngine.Object.FindObjectsByType(FindObjectsInactive.Include, FindObjectsSortMode.None) + .Where(r => r.gameObject.scene == scene).ToArray(); + Require(found.Length == 1, $"ARPG.unity has {found.Length} ZoneRenderers."); + var wired = found[0]; + return string.Join("|", new[] + { + ("SimpleCommodityPickup", wired.SimpleCommodityPickup), ("CompoundCommodityPickup", wired.CompoundCommodityPickup), + ("GearPickup", wired.GearPickup), ("WeaponPickup", wired.WeaponPickup) + }.Select(f => f.Item1 + "=" + (f.Item2 == null ? "" : AssetDatabase.GetAssetPath(f.Item2)))); + } + finally { EditorSceneManager.CloseScene(scene, true); } + } +} diff --git a/Assets/Scripts/Editor/FloatingItemsDrawnSmoke.cs.meta b/Assets/Scripts/Editor/FloatingItemsDrawnSmoke.cs.meta new file mode 100644 index 000000000..51e4b34a7 --- /dev/null +++ b/Assets/Scripts/Editor/FloatingItemsDrawnSmoke.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 67544a932f794a2458741c731ef04d11 \ No newline at end of file diff --git a/Assets/Scripts/Editor/FlowFieldParityVerify.cs b/Assets/Scripts/Editor/FlowFieldParityVerify.cs new file mode 100644 index 000000000..2fa3e5fda --- /dev/null +++ b/Assets/Scripts/Editor/FlowFieldParityVerify.cs @@ -0,0 +1,302 @@ +using System; +using System.IO; +using GameCult.Caching; +using UnityEditor; +using UnityEngine; + +namespace Aetheria.EditorTools +{ + /// + /// Batchmode check for flow-shader-parity (campaign aetheria-fauna, cut fauna-flow-field): the HLSL globalFlow and + /// slopeFlow of Assets/Shaders/Volumetric.cginc give the values of FlowField (ServerShared) for the same position, + /// scroll, settings and gradient. It drives the real lowering: a Zone is stepped, VolumeSampling.LowerFlow sets the + /// shader globals from the zone's Settings.Flow and FlowScroll, FlowParity.compute reads those globals, and the + /// results are compared with FlowField. It also checks that Settings.asset carries the authored flow under + /// PlanetSettings and that the shader got the zone's scroll (speed times zone time). + /// + /// Dispatches a compute kernel, so it needs a graphics device: run WITHOUT -nographics (as ShieldPanelCut3Verify). + /// Unity -batchmode -projectPath <repo> -executeMethod Aetheria.EditorTools.FlowFieldParityVerify.Run -logFile <path> + /// Do not pass -quit: Run exits the Editor itself, 0 on success and 1 on any failure. + /// + public static class FlowFieldParityVerify + { + const string Tag = "[FlowFieldParityVerify]"; + // Measured disagreement between the HLSL and the C# on this tree (float32 on both sides, positions to 10000, + // scrolls to 100, through the keyword-gated flow()): max 2.9e-5 of amplitude (the "max error" line this run + // prints). The tolerance is 5x that noise, so constant errors of 0.05% (y factor .501, swirl or amplitude + // x1.0005: 4e-4 to 8e-4) fail; a 0.01% error is at the noise floor and unresolvable. + const float RelativeTolerance = 1.5e-4f; + static float _maxError; + static bool _ok = true; + + static void OnLog(string message, string stack, LogType type) + { + if ((type == LogType.Error || type == LogType.Exception || type == LogType.Assert) && !message.StartsWith(Tag)) + Fail("logged-error", message.Split('\n')[0]); + } + + static void Fail(string check, string detail) + { + Debug.LogError($"{Tag} FAIL {check}: {detail}"); + _ok = false; + } + + public static void Run() + { + if (SystemInfo.graphicsDeviceType == UnityEngine.Rendering.GraphicsDeviceType.Null) + { + Debug.LogError($"{Tag} FAIL: no graphics device in this session; rerun batchmode without -nographics."); + EditorApplication.Exit(1); + return; + } + + // The flow's error lines (a shader keyword that does not exist, a missing property) fail the check. + Application.logMessageReceived += OnLog; + var work = Path.Combine(Path.GetTempPath(), "flow-parity-" + Guid.NewGuid().ToString("N")); + Directory.CreateDirectory(work); + try + { + var settings = AssetDatabase.LoadAssetAtPath("Assets/Resources/Settings.asset") + ?? throw new InvalidOperationException("No Settings.asset."); + var compute = AssetDatabase.LoadAssetAtPath("Assets/Shaders/Compute/FlowParity.compute") + ?? throw new InvalidOperationException("No FlowParity.compute."); + + CheckAuthoredFlow(settings.PlanetSettings.Flow); + + // The authored flow (global term only: its slope amplitudes are authored zero), then a flow with every + // term live and a scroll speed that reaches scrolls up to 100. + var authored = settings.PlanetSettings.Flow; + CheckParity("authored", settings, work, compute, authored, new[] { 0.0, 3.1, 40.0, 100.0 }); + var wide = new FlowSettings + { + GlobalScale = authored.GlobalScale, GlobalAmplitude = authored.GlobalAmplitude, Period = authored.Period, + GlobalScrollSpeed = 1f, SlopeAmplitude = 3f, SwirlAmplitude = 5f + }; + CheckParity("wide", settings, work, compute, wide, new[] { 0.0, 1.0, 17.0, 60.0, 100.0 }); + CheckNoiseClock(compute); + + Debug.Log($"{Tag} max error {_maxError:G4} of amplitude (tolerance {RelativeTolerance:G4})"); + Debug.Log(_ok ? $"{Tag} PASS" : $"{Tag} FAIL: see errors above"); + } + catch (Exception e) + { + Debug.LogError($"{Tag} FAIL exception: {e}"); + _ok = false; + } + finally + { + Application.logMessageReceived -= OnLog; + try { Directory.Delete(work, true); } catch { } + } + EditorApplication.Exit(_ok ? 0 : 1); + } + + // Settings.asset carries the authored flow under PlanetSettings (it moved from DefaultEnvironment unchanged). + static void CheckAuthoredFlow(FlowSettings flow) + { + if (flow == null) { Fail("authored-flow", "PlanetSettings.Flow is null"); return; } + if (flow.GlobalScale != 512f || flow.GlobalAmplitude != 15f || flow.GlobalScrollSpeed != .025f || + flow.Period != 8f || flow.SlopeAmplitude != 0f || flow.SwirlAmplitude != 0f) + Fail("authored-flow", $"PlanetSettings.Flow is {flow.GlobalScale}/{flow.GlobalAmplitude}/{flow.GlobalScrollSpeed}/" + + $"{flow.Period}/{flow.SlopeAmplitude}/{flow.SwirlAmplitude}, authored 512/15/0.025/8/0/0"); + } + + internal static Zone BuildZone(GameSettings settings, string work, FlowSettings flow, double time = 0) + { + var cache = AetheriaStores.Open(Path.Combine(work, Guid.NewGuid().ToString("N") + ".cc"), catalogWritable: true); + cache.Upsert(new VerseGrammar { Revision = 1 }); + cache.FlushAsync().Wait(); + var items = new ItemManager(1u, cache, new ProvenanceLedger(), settings.GameplaySettings, _ => { }); + return new Zone(items, new PlanetSettings { Flow = flow }, new ZonePack { Time = time }, new GalaxyZone { Name = "Parity", Owner = null }, null); + } + + static void CheckParity(string label, GameSettings settings, string work, ComputeShader compute, FlowSettings flow, + double[] zoneTimes) + { + var zone = BuildZone(settings, work, flow); + var kernel = compute.FindKernel("Evaluate"); + var rng = new System.Random(label.Length * 7919); + const int positionCount = 256, gradientCount = 64; + const int count = positionCount; + + var positions = new Vector3[count]; + for (var i = 0; i < positionCount; i++) + positions[i] = new Vector3((float) (rng.NextDouble() * 20000 - 10000), (float) (rng.NextDouble() * 200 - 100), + (float) (rng.NextDouble() * 20000 - 10000)); + // Gradients of any direction and magnitude, plus one zero gradient. + var gradients = new Vector2[count]; + for (var i = 1; i < gradientCount; i++) + { + var angle = rng.NextDouble() * Math.PI * 2; + var magnitude = (float) Math.Exp(rng.NextDouble() * 8 - 4); + gradients[i] = new Vector2((float) Math.Cos(angle) * magnitude, (float) Math.Sin(angle) * magnitude); + } + gradients[0] = Vector2.zero; + + var positionBuffer = new ComputeBuffer(count, 12); + var gradientBuffer = new ComputeBuffer(count, 8); + var globalBuffer = new ComputeBuffer(count, 12); + var slopeBuffer = new ComputeBuffer(count, 12); + var gatedBuffer = new ComputeBuffer(count, 12); + ComputeBuffer noiseBuffer = null; + // flow() reads the nebula's gravity height under FLOW_SLOPE. A ramp rising along the texture's x gives every + // position inside the grid the gradient direction (1, 0), so the slope term is live where a flat height + // would zero it (and the FLOW_SLOPE keyword and its pragma would not matter). + const int rampSize = 64; + var height = new Texture2D(rampSize, rampSize, TextureFormat.RFloat, false) + { filterMode = FilterMode.Point, wrapMode = TextureWrapMode.Clamp }; + var ramp = new float[rampSize * rampSize]; + for (var i = 0; i < ramp.Length; i++) ramp[i] = (i % rampSize) / (float) (rampSize - 1); + height.SetPixelData(ramp, 0); + height.Apply(); + var rampGradient = new CultMath.float2(1f, 0f); + try + { + positionBuffer.SetData(positions); + gradientBuffer.SetData(gradients); + compute.SetBuffer(kernel, "positions", positionBuffer); + compute.SetBuffer(kernel, "gradients", gradientBuffer); + compute.SetBuffer(kernel, "globalOut", globalBuffer); + compute.SetBuffer(kernel, "slopeOut", slopeBuffer); + compute.SetBuffer(kernel, "gatedOut", gatedBuffer); + compute.SetTexture(kernel, "_NebulaSurfaceHeight", height); + compute.SetVector("_NebulaSurfaceHeight_TexelSize", new Vector4(1f / rampSize, 1f / rampSize, rampSize, rampSize)); + // The grid spans 40000: every sampled position (|xz| to 10000) is inside the ramp's uv range. + Shader.SetGlobalVector("_GridTransform", new Vector4(0f, 0f, 40000f, 0f)); + noiseBuffer = new ComputeBuffer(count, 4); + compute.SetBuffer(kernel, "noiseOut", noiseBuffer); + compute.SetInt("count", count); + + var elapsed = 0.0; + foreach (var target in zoneTimes) + { + // Step the zone to the target by an awkward step; the sum is the zone's time. + while (elapsed < target - 1e-9) + { + var dt = (float) Math.Min(0.37, target - elapsed); + zone.Update(dt); + elapsed += dt; + } + VolumeSampling.LowerFlow(zone.Settings.Flow, zone.ExactTime); + + // The shader got the zone's scroll and cycle: the same zone time Zone.Flow evaluates at. + var zoneScroll = zone.FlowScroll; + var lowered = Shader.GetGlobalVector("_FlowScroll"); + if (Math.Abs(lowered.x - zoneScroll.x) > 1e-6 || Math.Abs(lowered.y - zoneScroll.y) > 1e-6) + Fail($"{label}-lowered-scroll", $"at zone time {elapsed:F3} the shader got _FlowScroll ({lowered.x}, {lowered.y}), the zone's is ({zoneScroll.x}, {zoneScroll.y})"); + if (Math.Abs(Shader.GetGlobalFloat("_FlowCycle") - zone.CyclePhase(flow.Period)) > 1e-6) + Fail($"{label}-lowered-cycle", $"at zone time {elapsed:F3} the shader got _FlowCycle {Shader.GetGlobalFloat("_FlowCycle")}, the zone's phase is {zone.CyclePhase(flow.Period)}"); + if (Shader.GetGlobalFloat("_FlowScale") != flow.GlobalScale || Shader.GetGlobalFloat("_FlowAmplitude") != flow.GlobalAmplitude || + Shader.GetGlobalFloat("_FlowSlopeAmplitude") != flow.SlopeAmplitude || + Shader.GetGlobalFloat("_FlowSwirlAmplitude") != flow.SwirlAmplitude || Shader.GetGlobalFloat("_FlowPeriod") != flow.Period) + Fail($"{label}-lowered-settings", "a flow uniform does not equal the zone's FlowSettings"); + + compute.Dispatch(kernel, (count + 63) / 64, 1, 1); + var globalOut = new Vector3[count]; + var slopeOut = new Vector3[count]; + var gatedOut = new Vector3[count]; + globalBuffer.GetData(globalOut); + slopeBuffer.GetData(slopeOut); + gatedBuffer.GetData(gatedOut); + + var at = $"{label} zone time {elapsed:F2} scroll {zoneScroll.x:F4}"; + for (var i = 0; i < positionCount; i++) + { + var p = positions[i]; + var expected = FlowField.Global(flow, new CultMath.float3(p.x, p.y, p.z), zoneScroll); + Compare($"{label}-global", at, i, new Vector3(expected.x, expected.y, expected.z), globalOut[i], flow.GlobalAmplitude); + } + // flow() is the keyword-gated function the nebula and stardust call: the global term plus, under + // FLOW_SLOPE, the slope term of the ramp's gradient. A flow that is live must not read zero. + var live = 0; + var gatedScale = Math.Max(Math.Abs(flow.GlobalAmplitude), Math.Max(Math.Abs(flow.SlopeAmplitude), Math.Abs(flow.SwirlAmplitude))); + for (var i = 0; i < positionCount; i++) + { + var p = positions[i]; + var expected = FlowField.At(flow, new CultMath.float3(p.x, p.y, p.z), zoneScroll, rampGradient); + var e = new Vector3(expected.x, expected.y, expected.z); + if (e.magnitude > .1f * gatedScale) live++; + Compare($"{label}-flow-keywords", at, i, e, gatedOut[i], gatedScale); + } + if (gatedScale != 0f && live < positionCount / 4) + Fail($"{label}-flow-keywords", $"{at}: only {live} of {positionCount} zone flows are live; the check is vacuous"); + var slopeScale = Math.Max(Math.Abs(flow.SlopeAmplitude), Math.Abs(flow.SwirlAmplitude)); + for (var i = 0; i < gradientCount; i++) + { + var g = gradients[i]; + var expected = FlowField.Slope(flow, new CultMath.float2(g.x, g.y)); + Compare($"{label}-slope", at, i, new Vector3(expected.x, expected.y, expected.z), slopeOut[i], slopeScale); + } + } + } + finally + { + positionBuffer.Release(); gradientBuffer.Release(); globalBuffer.Release(); slopeBuffer.Release(); gatedBuffer.Release(); noiseBuffer?.Release(); UnityEngine.Object.DestroyImmediate(height); + } + } + + // The nebula noise the flow advects evolves on the flow clock VolumeSampling lowers as _NebulaNoiseTime, never on + // _Time: with the speed non-zero, the noise changes when _NebulaNoiseTime does and not otherwise (a frame clock + // would not follow the global set here). + static void CheckNoiseClock(ComputeShader compute) + { + const int count = 64; + var kernel = compute.FindKernel("Evaluate"); + var rng = new System.Random(4217); + var positions = new Vector3[count]; + for (var i = 0; i < count; i++) + positions[i] = new Vector3((float) (rng.NextDouble() * 4000 - 2000), (float) (rng.NextDouble() * 100 - 50), (float) (rng.NextDouble() * 4000 - 2000)); + var buffers = new[] { new ComputeBuffer(count, 12), new ComputeBuffer(count, 8), new ComputeBuffer(count, 12), new ComputeBuffer(count, 12), new ComputeBuffer(count, 12), new ComputeBuffer(count, 4) }; + var height = new Texture2D(1, 1, TextureFormat.RFloat, false); + try + { + buffers[0].SetData(positions); + buffers[1].SetData(new Vector2[count]); + compute.SetBuffer(kernel, "positions", buffers[0]); + compute.SetBuffer(kernel, "gradients", buffers[1]); + compute.SetBuffer(kernel, "globalOut", buffers[2]); + compute.SetBuffer(kernel, "slopeOut", buffers[3]); + compute.SetBuffer(kernel, "gatedOut", buffers[4]); + compute.SetBuffer(kernel, "noiseOut", buffers[5]); + compute.SetTexture(kernel, "_NebulaSurfaceHeight", height); + compute.SetInt("count", count); + Shader.SetGlobalFloat("_NebulaNoiseSpeed", 1f); + float[] Noise(float noiseTime) + { + Shader.SetGlobalFloat("_NebulaNoiseTime", noiseTime); + compute.Dispatch(kernel, 1, 1, 1); + var result = new float[count]; + buffers[5].GetData(result); + return result; + } + var a = Noise(0f); + var b = Noise(3f); + var again = Noise(3f); + int moved = 0, repeated = 0; + for (var i = 0; i < count; i++) + { + if (Math.Abs(a[i] - b[i]) > 1e-4f) moved++; + if (b[i] == again[i]) repeated++; + } + if (moved < count / 2) Fail("nebula-noise-clock", $"only {moved} of {count} noise samples follow _NebulaNoiseTime"); + if (repeated != count) Fail("nebula-noise-clock", $"{count - repeated} of {count} noise samples changed with _NebulaNoiseTime held"); + } + finally + { + foreach (var buffer in buffers) buffer.Release(); + UnityEngine.Object.DestroyImmediate(height); + } + } + + // Error is measured against the term's amplitude; a term with no amplitude must be exactly zero and never NaN. + static void Compare(string check, string at, int index, Vector3 expected, Vector3 actual, float amplitude) + { + var error = (expected - actual).magnitude; + if (float.IsNaN(error)) { Fail(check, $"{at} sample {index}: NaN (expected {expected}, shader {actual})"); return; } + if (amplitude != 0f) _maxError = Math.Max(_maxError, error / Math.Abs(amplitude)); + var tolerance = RelativeTolerance * Math.Abs(amplitude); + if (error > tolerance) + Fail(check, $"{at} sample {index}: expected {expected}, shader {actual}, error {error:G4} > {tolerance:G4}"); + } + } +} diff --git a/Assets/Scripts/Editor/FlowFieldParityVerify.cs.meta b/Assets/Scripts/Editor/FlowFieldParityVerify.cs.meta new file mode 100644 index 000000000..50248c5f3 --- /dev/null +++ b/Assets/Scripts/Editor/FlowFieldParityVerify.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 8fae18f5f32f10f43ba892a097f18caa \ No newline at end of file diff --git a/Assets/Scripts/Editor/FlowFieldSceneVerify.cs b/Assets/Scripts/Editor/FlowFieldSceneVerify.cs new file mode 100644 index 000000000..d39874f33 --- /dev/null +++ b/Assets/Scripts/Editor/FlowFieldSceneVerify.cs @@ -0,0 +1,392 @@ +using System; +using System.IO; +using System.Linq; +using System.Reflection; +using UnityEditor; +using UnityEditor.SceneManagement; +using UnityEngine; +using UnityEngine.Rendering; + +namespace Aetheria.EditorTools +{ + /// + /// Batchmode check for the flow as the scene runs it (campaign aetheria-fauna, cut fauna-flow-field; target + /// invariants flow-one-owner and flow-shader-parity). FlowFieldParityVerify proves the HLSL against FlowField with + /// no scene loaded; this opens ARPG.unity, lets VolumeSampling and Stardust initialise as the game does, drives + /// their own Start and Update with a zone attached, and asserts what the presenters did: + /// - nothing threw and nothing logged an error (a type that cannot initialise in a scene, as VolumeSampling once + /// could when it created its keywords in a static field initializer, throws on its first use); + /// - FLOW_GLOBAL and FLOW_SLOPE are enabled, _FlowAmplitude is the zone's, and the nebula noise clock is the zone's; + /// - the stardust particle buffer changes with the flow and freezes when the zone pauses; + /// - CloudShader pass 0 carries the FLOW_* keywords. + /// The scene is opened before any Aetheria type is touched: run this method alone in its own Unity session, never + /// after FlowFieldParityVerify (which would initialise VolumeSampling outside a MonoBehaviour constructor). + /// Dispatches compute and renders, so it needs a graphics device: run WITHOUT -nographics. + /// Unity -batchmode -projectPath <repo> -executeMethod Aetheria.EditorTools.FlowFieldSceneVerify.Run -logFile <path> + /// Do not pass -quit: Run exits the Editor itself, 0 on success and 1 on any failure. + /// + public static class FlowFieldSceneVerify + { + const string Tag = "[FlowFieldSceneVerify]"; + static bool _ok = true; + + static void OnLog(string message, string stack, LogType type) + { + if ((type == LogType.Error || type == LogType.Exception || type == LogType.Assert) && !message.StartsWith(Tag)) + Fail("logged-error", message.Split('\n')[0]); + } + + static void Fail(string check, string detail) + { + Debug.LogError($"{Tag} FAIL {check}: {detail}"); + _ok = false; + } + + public static void Run() + { + if (SystemInfo.graphicsDeviceType == GraphicsDeviceType.Null) + { + Debug.LogError($"{Tag} FAIL: no graphics device in this session; rerun batchmode without -nographics."); + EditorApplication.Exit(1); + return; + } + + Application.logMessageReceived += OnLog; + try + { + // Before anything else touches the project's types: the scene constructs its MonoBehaviours here. + EditorSceneManager.OpenScene("Assets/Scenes/ARPG.unity", OpenSceneMode.Single); + Check(); + Debug.Log(_ok ? $"{Tag} PASS" : $"{Tag} FAIL: see errors above"); + } + catch (Exception e) + { + Debug.LogError($"{Tag} FAIL exception: {e}"); + _ok = false; + } + finally + { + Application.logMessageReceived -= OnLog; + } + EditorApplication.Exit(_ok ? 0 : 1); + } + + static void Check() + { + var settings = AssetDatabase.LoadAssetAtPath("Assets/Resources/Settings.asset") + ?? throw new InvalidOperationException("No Settings.asset."); + var agm = UnityEngine.Object.FindObjectsByType(FindObjectsInactive.Include, FindObjectsSortMode.None).FirstOrDefault(); + var volume = UnityEngine.Object.FindObjectsByType(FindObjectsInactive.Include, FindObjectsSortMode.None).FirstOrDefault(); + var dust = UnityEngine.Object.FindObjectsByType(FindObjectsInactive.Include, FindObjectsSortMode.None).FirstOrDefault(); + if (agm == null || volume == null || dust == null) + { + Fail("scene-objects", $"ARPG.unity has ActionGameManager={agm != null}, VolumeSampling={volume != null}, Stardust={dust != null}"); + return; + } + + // Every flow term live, so FLOW_SLOPE is on; and the same flow with every amplitude zero. + var on = new FlowSettings + { + GlobalScale = 512f, GlobalAmplitude = 15f, GlobalScrollSpeed = .025f, Period = 8f, SlopeAmplitude = 3f, SwirlAmplitude = 5f + }; + var off = new FlowSettings { GlobalScale = on.GlobalScale, GlobalScrollSpeed = on.GlobalScrollSpeed, Period = on.Period }; + var work = Path.Combine(Path.GetTempPath(), "flow-scene-" + Guid.NewGuid().ToString("N")); + Directory.CreateDirectory(work); + try + { + var zone = FlowFieldParityVerify.BuildZone(settings, work, on, 86400.0 * 3 + 12.3); + typeof(ActionGameManager).GetProperty("Instance").GetSetMethod(true).Invoke(null, new object[] { agm }); + typeof(ActionGameManager).GetProperty("Zone").GetSetMethod(true).Invoke(agm, new object[] { zone }); + if (agm.Settings == null) agm.Settings = settings; + + Call(volume, "Start"); + Call(volume, "Update"); + if (!Shader.IsKeywordEnabled("FLOW_GLOBAL")) Fail("scene-keywords", "FLOW_GLOBAL is not enabled after VolumeSampling.Update"); + if (!Shader.IsKeywordEnabled("FLOW_SLOPE")) Fail("scene-keywords", "FLOW_SLOPE is not enabled after VolumeSampling.Update"); + if (Shader.GetGlobalFloat("_FlowAmplitude") != on.GlobalAmplitude) + Fail("scene-amplitude", $"_FlowAmplitude is {Shader.GetGlobalFloat("_FlowAmplitude")}, the zone's flow has {on.GlobalAmplitude}"); + var scroll = Shader.GetGlobalVector("_FlowScroll"); + if (scroll.x != zone.FlowScroll.x || scroll.y != zone.FlowScroll.y) + Fail("scene-scroll", $"_FlowScroll ({scroll.x}, {scroll.y}) is not the zone's ({zone.FlowScroll.x}, {zone.FlowScroll.y})"); + var noiseTime = Shader.GetGlobalFloat("_NebulaNoiseTime"); + if (noiseTime != (float) zone.ExactTime) + Fail("scene-noise-clock", $"_NebulaNoiseTime is {noiseTime}, the zone's time is {(float) zone.ExactTime}"); + + CheckCloudKeywords(); + + // Stardust follows the flow through its own dispatch: the particle buffer read back each frame. + Call(dust, "Start"); + var bufferField = typeof(Stardust).GetField("_particlesBuffer", BindingFlags.NonPublic | BindingFlags.Instance); + float[] Frame() + { + Call(dust, "Update"); + var buffer = (ComputeBuffer) bufferField.GetValue(dust); + var data = new float[buffer.count * 7]; + buffer.GetData(data); + return data; + } + var flowing = Frame(); + VolumeSampling.LowerFlow(off, VolumeSampling.FlowClock); + var still = Frame(); + if (Differing(flowing, still) == 0) Fail("scene-stardust", "the particle buffer is the same with the zone's flow and with no flow"); + + // A paused zone freezes the particles and the nebula noise clock; a running one moves both. + Call(volume, "Update"); + zone.Update(0f); + Call(volume, "Update"); + if (Differing(flowing, Frame()) != 0) Fail("scene-stardust-pause", "the particle buffer moved while the zone was paused"); + if (Shader.GetGlobalFloat("_NebulaNoiseTime") != noiseTime) Fail("scene-noise-clock", "_NebulaNoiseTime moved while the zone was paused"); + zone.Update(.05f); + Call(volume, "Update"); + if (Differing(flowing, Frame()) == 0) Fail("scene-stardust-run", "the particle buffer did not move while the zone ran"); + if (Shader.GetGlobalFloat("_NebulaNoiseTime") == noiseTime) Fail("scene-noise-clock", "_NebulaNoiseTime did not move while the zone ran"); + + CheckStardustUncullable(dust, bufferField); + CheckStardustUnderFog(dust, bufferField); + } + finally + { + try { Directory.Delete(work, true); } catch { } + } + } + + // The event Stardust itself attaches its draw at, read from the class so the verifier cannot agree with a copy of it. + static CameraEvent DrawEvent() => + (CameraEvent) typeof(Stardust).GetField("DrawEvent", BindingFlags.NonPublic | BindingFlags.Static).GetRawConstantValue(); + + // The dust is a command buffer on the target camera, which no culling sees: with every particle 10000 below the + // camera (far past any box a hand could inflate round it) a render still shows dust, and shows none when the + // same particles have no size. + static void CheckStardustUncullable(Stardust dust, FieldInfo bufferField) + { + var camera = dust.TargetCamera; + if (camera == null) { Fail("scene-stardust-uncullable", "Stardust has no TargetCamera"); return; } + var drawEvent = DrawEvent(); + var attached = camera.GetCommandBuffers(drawEvent).Count(buffer => buffer.name == "Stardust"); + if (attached != 1) Fail("scene-stardust-uncullable", $"{attached} Stardust command buffers at {drawEvent} on the target camera, expected 1"); + foreach (var other in Enum.GetValues(typeof(CameraEvent)).Cast().Where(other => other != drawEvent)) + { + var stray = camera.GetCommandBuffers(other).Count(buffer => buffer.name == "Stardust"); + if (stray != 0) Fail("scene-stardust-uncullable", $"{stray} Stardust command buffers at {other}, expected 0"); + } + + var particles = (ComputeBuffer) bufferField.GetValue(dust); + float[] Layout(float size, Vector3 centre, float below) => DustLayout(particles.count, size, centre, below); + + var transform = camera.transform; + var (position, rotation) = (transform.position, transform.rotation); + var (far, flags, background, mask, target) = (camera.farClipPlane, camera.clearFlags, camera.backgroundColor, camera.cullingMask, camera.targetTexture); + var texture = RenderTexture.GetTemporary(64, 64, 24, RenderTextureFormat.ARGB32); + var readback = new Texture2D(64, 64, TextureFormat.RGBA32, false); + var previous = RenderTexture.active; + // Image effects on the camera would write their own frame over the dust; only the dust draw is under test. + var effects = camera.GetComponents().Where(behaviour => behaviour.enabled).ToArray(); + Color32[] Render(float size, Vector3 centre, float below) + { + Call(dust, "Update"); // on a bounded draw this queues the draw for the camera; here it dispatches the compute + particles.SetData(Layout(size, centre, below)); + camera.Render(); + RenderTexture.active = texture; + readback.ReadPixels(new Rect(0, 0, 64, 64), 0, 0); + readback.Apply(); + return readback.GetPixels32(); + } + try + { + foreach (var effect in effects) effect.enabled = false; + camera.clearFlags = CameraClearFlags.SolidColor; + camera.backgroundColor = Color.black; + camera.cullingMask = 1; + camera.targetTexture = texture; + // control: the camera where the scene put it, dust 100 below, inside any box a hand-set extent would give + transform.SetPositionAndRotation(position, Quaternion.Euler(90f, 0f, 0f)); + camera.farClipPlane = 1000f; + var nearWith = Render(5f, position, 100f); var nearWithout = Render(0f, position, 100f); + var nearDiff = 0; for (var i = 0; i < nearWith.Length; i++) if (!nearWith[i].Equals(nearWithout[i])) nearDiff++; + Debug.Log($"{Tag} stardust near-control differing pixels={nearDiff}"); + if (nearDiff == 0) Fail("scene-stardust-uncullable", "control: dust 100 below the camera drew no pixels"); + transform.SetPositionAndRotation(new Vector3(0f, -40000f, 0f), Quaternion.Euler(90f, 0f, 0f)); + camera.farClipPlane = 30000f; + var withDust = Render(400f, transform.position, 10000f); // the material scales a quad by distance^.33, so at this range it needs this size to cover pixels + var without = Render(0f, transform.position, 10000f); + var differing = 0; + for (var i = 0; i < withDust.Length; i++) + if (!withDust[i].Equals(without[i])) differing++; + if (differing == 0) Fail("scene-stardust-uncullable", "the dust 10000 below the camera drew no pixels"); + } + finally + { + RenderTexture.active = previous; + foreach (var effect in effects) effect.enabled = true; + camera.targetTexture = target; + camera.cullingMask = mask; + camera.backgroundColor = background; + camera.clearFlags = flags; + camera.farClipPlane = far; + transform.SetPositionAndRotation(position, rotation); + RenderTexture.ReleaseTemporary(texture); + UnityEngine.Object.DestroyImmediate(readback); + } + } + + // The nebula is an [ImageEffectOpaque] that fogs the whole ray to a depth the dust never writes (B49): dust drawn + // before it is attenuated by the fog, dust drawn after it sits on top at full strength. The dust's contribution to a + // pixel (render with dust minus render without) is read with the cloud renderer off and on, in an HDR target. + static void CheckStardustUnderFog(Stardust dust, FieldInfo bufferField) + { + const int Size = 128; + var camera = dust.TargetCamera; + var cloud = camera == null ? null : camera.GetComponent(); + if (cloud == null) { Fail("scene-stardust-under-fog", "the target camera has no VolumeCloudRenderer"); return; } + var particles = (ComputeBuffer) bufferField.GetValue(dust); + + var transform = camera.transform; + var (position, rotation) = (transform.position, transform.rotation); + var (far, flags, background, mask, target, hdr) = (camera.farClipPlane, camera.clearFlags, camera.backgroundColor, camera.cullingMask, camera.targetTexture, camera.allowHDR); + var texture = RenderTexture.GetTemporary(Size, Size, 24, RenderTextureFormat.ARGBHalf); + var readback = new Texture2D(Size, Size, TextureFormat.RGBAHalf, false); + var previous = RenderTexture.active; + var effects = camera.GetComponents().Where(behaviour => behaviour.enabled).ToArray(); + var fields = new System.Collections.Generic.List(); + GameObject floor = null; + float[] Render(bool fog, float size) + { + cloud.enabled = fog; + for (var frame = 0; frame < 2; frame++) // the cloud's first frame forces ULTRA and fills its history; the second is the settled one + { + Call(dust, "Update"); + particles.SetData(DustLayout(particles.count, size, position, 100f)); + camera.Render(); + } + RenderTexture.active = texture; + readback.ReadPixels(new Rect(0, 0, Size, Size), 0, 0); + readback.Apply(); + return readback.GetPixels().Select(pixel => pixel.r * .2126f + pixel.g * .7152f + pixel.b * .0722f).ToArray(); + } + try + { + foreach (var effect in effects) effect.enabled = false; + camera.allowHDR = true; + camera.clearFlags = CameraClearFlags.SolidColor; + camera.backgroundColor = Color.black; + camera.cullingMask = 1; + camera.targetTexture = texture; + camera.farClipPlane = 1000f; + transform.SetPositionAndRotation(position, Quaternion.Euler(90f, 0f, 0f)); + // The fog only measures a partial density where depth is written: a pixel with no depth is fogged whole (CloudShader sets + // density 1 past the far plane). A floor under the dust gives the march a finite ray. + floor = GameObject.CreatePrimitive(PrimitiveType.Plane); + floor.transform.position = position + Vector3.down * 200f; + floor.transform.localScale = Vector3.one * 100f; + UnityEngine.Object.DestroyImmediate(floor.GetComponent()); + + // The scene's own nebula fields are textures the game renders; here a uniform fill of white fog stands in for them. + foreach (var (name, format) in new[] { ("_NebulaSurfaceHeight", TextureFormat.RFloat), ("_NebulaPatchHeight", TextureFormat.RHalf), ("_NebulaPatch", TextureFormat.RHalf) }) + Shader.SetGlobalTexture(name, Uniform(format, Color.black, fields)); + Shader.SetGlobalTexture("_NebulaTint", Uniform(TextureFormat.RGBA32, Color.white, fields)); + Shader.DisableKeyword("NOISE_SLOPE"); + Shader.SetGlobalFloat("_NebulaFillDensity", .01f); + Shader.SetGlobalFloat("_NebulaFillDistance", 120f); + Shader.SetGlobalFloat("_NebulaFillExponent", 0f); + Shader.SetGlobalFloat("_NebulaFillOffset", 0f); + Shader.SetGlobalFloat("_NebulaPatchDensity", 0f); + Shader.SetGlobalFloat("_NebulaLuminance", .01f); // a fog dimmer than the dust: dust drawn over it would otherwise read as a negative contribution + Shader.SetGlobalFloat("_ExtinctionCoefficient", .25f); // with the fill density, about 40% of the light to the floor is fogged away + Shader.SetGlobalFloat("_SafetyDistance", -1e6f); // below every sample: only the uniform fill, none of the zone's noise + Shader.SetGlobalFloat("_TintLodExponent", 0f); + + var clearBare = Render(false, 0f); + var clearDust = Render(false, 5f); + var fogBare = Render(true, 0f); + var fogDust = Render(true, 5f); + + var fogShown = 0f; + var (clearSum, fogSum, drawn) = (0f, 0f, 0); + for (var i = 0; i < clearBare.Length; i++) + { + fogShown += Mathf.Abs(fogBare[i] - clearBare[i]) / clearBare.Length; + if (clearDust[i] == clearBare[i]) continue; + drawn++; clearSum += clearDust[i] - clearBare[i]; fogSum += fogDust[i] - fogBare[i]; + } + var (clearMean, fogMean) = (drawn == 0 ? 0f : clearSum / drawn, drawn == 0 ? 0f : fogSum / drawn); + Debug.Log($"{Tag} stardust under fog: fog control mean |difference|={fogShown}, dust pixels={drawn}, dust contribution cloud off={clearMean}, cloud on={fogMean}, ratio={(clearMean == 0f ? 0f : fogMean / clearMean)}"); + if (drawn == 0 || clearMean <= 0f) Fail("scene-stardust-under-fog", "control: the dust drew no pixels with the cloud renderer off"); + else if (fogShown < 1e-3f) Fail("scene-stardust-under-fog", "control: the cloud renderer changed no pixels, so no fog is in view"); + else if (fogMean > .9f * clearMean) Fail("scene-stardust-under-fog", "the dust is not attenuated by the fog in front of it: it was drawn after the nebula composites"); + else if (fogMean < .1f * clearMean) Fail("scene-stardust-under-fog", "the dust is erased, not dimmed, by a partial fog"); + } + finally + { + RenderTexture.active = previous; + foreach (var effect in effects) effect.enabled = true; + camera.allowHDR = hdr; + camera.targetTexture = target; + camera.cullingMask = mask; + camera.backgroundColor = background; + camera.clearFlags = flags; + camera.farClipPlane = far; + transform.SetPositionAndRotation(position, rotation); + RenderTexture.ReleaseTemporary(texture); + UnityEngine.Object.DestroyImmediate(readback); + foreach (var field in fields) UnityEngine.Object.DestroyImmediate(field); + if (floor != null) UnityEngine.Object.DestroyImmediate(floor); + } + } + + static Texture2D Uniform(TextureFormat format, Color colour, System.Collections.Generic.List owner) + { + var texture = new Texture2D(1, 1, format, false) { wrapMode = TextureWrapMode.Clamp }; + texture.SetPixel(0, 0, colour); + texture.Apply(); + owner.Add(texture); + return texture; + } + + // A square patch of particles 4 apart, `below` under `centre`. + static float[] DustLayout(int count, float size, Vector3 centre, float below) + { + var side = Mathf.RoundToInt(Mathf.Sqrt(count)); + var data = new float[count * 7]; + for (var i = 0; i < count; i++) + { + data[i * 7 + 0] = centre.x + ((i % side) - side / 2f) * 4f; + data[i * 7 + 1] = centre.y - below; + data[i * 7 + 2] = centre.z + ((i / side) - side / 2f) * 4f; + data[i * 7 + 3] = data[i * 7 + 4] = data[i * 7 + 5] = 1f; + data[i * 7 + 6] = size; + } + return data; + } + + // CloudShader's pass 0 compiles with the flow keywords (it must #include_with_pragmas the shared include). + static void CheckCloudKeywords() + { + var shader = AssetDatabase.LoadAssetAtPath("Assets/Shaders/Raymarching/CloudShader.shader"); + if (shader == null) { Fail("scene-cloud-keywords", "No CloudShader.shader."); return; } + var keywords = ShaderUtil.GetPassKeywords(shader, new PassIdentifier(0, 0), UnityEditor.Rendering.ShaderType.Fragment) + .Select(keyword => keyword.name).ToArray(); + foreach (var name in new[] { "FLOW_GLOBAL", "FLOW_SLOPE" }) + if (!keywords.Contains(name)) Fail("scene-cloud-keywords", $"CloudShader pass 0 does not carry {name}"); + } + + static int Differing(float[] a, float[] b) + { + var count = 0; + for (var i = 0; i < a.Length; i++) + if (Math.Abs(a[i] - b[i]) > 1e-4f) count++; + return count; + } + + // The presenters' own Start and Update, as the game calls them; an exception is a failure that names the type. + static void Call(object target, string method) + { + var info = target.GetType().GetMethod(method, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); + if (info == null) { Fail("scene-presenter-exception", $"{target.GetType().Name}.{method} not found"); return; } + try { info.Invoke(target, null); } + catch (TargetInvocationException e) + { + Fail("scene-presenter-exception", $"{target.GetType().Name}.{method} threw {e.InnerException?.GetType().Name}"); + } + } + } +} diff --git a/Assets/Scripts/Editor/FlowFieldSceneVerify.cs.meta b/Assets/Scripts/Editor/FlowFieldSceneVerify.cs.meta new file mode 100644 index 000000000..77339880b --- /dev/null +++ b/Assets/Scripts/Editor/FlowFieldSceneVerify.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 25fbd79fca1de49498c3bebf9f63243b \ No newline at end of file diff --git a/Assets/Scripts/Editor/GravityFieldParityVerify.cs b/Assets/Scripts/Editor/GravityFieldParityVerify.cs new file mode 100644 index 000000000..d996d3227 --- /dev/null +++ b/Assets/Scripts/Editor/GravityFieldParityVerify.cs @@ -0,0 +1,428 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using GameCult.Caching; +using UnityEditor; +using UnityEditor.SceneManagement; +using UnityEngine; +using UnityEngine.Rendering; +using CultMath; + +namespace Aetheria.EditorTools +{ + /// + /// Batchmode check for campaign aetheria-gravity, cut grid-lowering: what the Gravity Field pass draws is the sim's + /// height. It builds a zone from Settings.asset's PlanetSettings with three bodies, runs the real lowering + /// (GravityLowering.Lower and CreateField), renders the field through an orthographic camera that culls layer 9 into + /// a float target, and compares every texel with -Zone.GetHeight at the texel centre's world position. It then checks + /// that the texture's gradient points where Zone.GetForce does, and that ARPG.unity and the body prefabs are wired + /// the way the cut leaves them (the gravity cameras cull layer 9 alone, nothing but the run-time field sits on it). + /// + /// Renders, so it needs a graphics device: run WITHOUT -nographics (as FlowFieldParityVerify). + /// Unity -batchmode -projectPath <repo> -executeMethod Aetheria.EditorTools.GravityFieldParityVerify.Run -logFile <path> + /// Do not pass -quit: Run exits the Editor itself, 0 on success and 1 on any failure. + /// + public static class GravityFieldParityVerify + { + const string Tag = "[GravityFieldParityVerify]"; + const int Size = 256; + // Measured on this tree (the "max error" line this run prints): the largest |texel + GetHeight| over the windows of the three + // frames is 0.0103 u, in the moved-again frame's sun window (float32 on both sides, the GPU's log and the closed form's + // single-precision floor of 1.5e-5 per unit strength against the CPU's, the quad's interpolated world position). The + // tolerance is 2.9x that. A band whose terms were drawn from the wrong edge (reference, inner or outer) moves the + // drawn height by whole units. + const float Tolerance = 0.03f; + // The worst angle between the texture's central difference and GetForce (B28: 1.0 degrees median zone, 2.9 worst). + const float GradientDegrees = 3f; + // Below this force (u/s^2) the drawn height differs between neighbouring texels by less than float32 resolves. + const float FlatForce = 1e-3f; + static float _maxError, _maxAngle, _maxTau; + static bool _ok = true; + + static void OnLog(string message, string stack, LogType type) + { + if ((type == LogType.Error || type == LogType.Exception || type == LogType.Assert) && !message.StartsWith(Tag)) + Fail("logged-error", message.Split('\n')[0]); + } + + static void Fail(string check, string detail) + { + Debug.LogError($"{Tag} FAIL {check}: {detail}"); + _ok = false; + } + + public static void Run() + { + if (SystemInfo.graphicsDeviceType == GraphicsDeviceType.Null) + { + Debug.LogError($"{Tag} FAIL: no graphics device in this session; rerun batchmode without -nographics."); + EditorApplication.Exit(1); + return; + } + + Application.logMessageReceived += OnLog; + var work = Path.Combine(Path.GetTempPath(), "gravity-parity-" + Guid.NewGuid().ToString("N")); + Directory.CreateDirectory(work); + ComputeBuffer wells = null; + GameObject field = null; + try + { + var settings = AssetDatabase.LoadAssetAtPath("Assets/Resources/Settings.asset") + ?? throw new InvalidOperationException("No Settings.asset."); + var material = AssetDatabase.LoadAssetAtPath("Assets/Materials/Brushes/Gravity Field.mat") + ?? throw new InvalidOperationException("No Gravity Field.mat."); + + var zone = BuildZone(settings, work, out var orbits, multiRoot: true); + GravityLowering.Lower(zone, 0f, ref wells); + field = GravityLowering.CreateField(material); + + // Three frames through the one buffer, as ZoneRenderer.Update runs it: the bodies as built, then two moves (an + // orbit's Position is what Zone.GetHeight reads). A move keeps the tree's geometry, since a rail never leaves + // its parent's distance and the walk skips a subtree outside its reach: the sun is the root, the planet is + // its Distance from the sun, the planetoid its Distance from the planet. A lowering that mirrors an axis or + // stops refreshing the upload agrees with the sim in the first frame only where it is symmetric. + CheckFrame("built", zone, orbits); + orbits[1].Position = Around(orbits[0], orbits[1], .31f); + orbits[2].Position = Around(orbits[1], orbits[2], .77f); + orbits[5].Position = Around(orbits[1], orbits[5], .41f); + GravityLowering.Lower(zone, 0f, ref wells); + CheckFrame("moved", zone, orbits); + orbits[0].Position = new float2(210f, -95f); + orbits[1].Position = Around(orbits[0], orbits[1], .52f); + orbits[2].Position = Around(orbits[1], orbits[2], .05f); + orbits[5].Position = Around(orbits[1], orbits[5], .93f); + GravityLowering.Lower(zone, 0f, ref wells); + CheckFrame("moved-again", zone, orbits); + if (_maxTau <= 1f) Fail("series-branch", $"the largest tau over the drawn bounded terms is {_maxTau:G4}; no window draws the series branch"); + Debug.Log($"{Tag} largest drawn tau {_maxTau:G4}"); + Debug.Log($"{Tag} max error {_maxError:G4} u (tolerance {Tolerance:G4}); max gradient angle {_maxAngle:F2} degrees (limit {GradientDegrees:F0})"); + + CheckWiring(settings); + Debug.Log(_ok ? $"{Tag} PASS" : $"{Tag} FAIL: see errors above"); + } + catch (Exception e) + { + Debug.LogError($"{Tag} FAIL exception: {e}"); + _ok = false; + } + finally + { + Application.logMessageReceived -= OnLog; + if (field != null) UnityEngine.Object.DestroyImmediate(field); + wells?.Release(); + try { Directory.Delete(work, true); } catch { } + } + EditorApplication.Exit(_ok ? 0 : 1); + } + + static float Core(Zone zone, float mass) => zone.Settings.RocheLimit.Evaluate(mass); + + // Where an orbit lies when it stands `turns` round its parent at its Distance. + static float2 Around(Orbit parent, Orbit child, float turns) => parent.Position + child.Data.Distance * OrbitData.Evaluate(turns); + + static Vector2 At(Orbit orbit) => new Vector2(orbit.Position.x, orbit.Position.y); + + // Orbits 0-2 are the sun, the planet and the planetoid, each window centred where the body is now; orbit 3 is the + // body of no strength, orbit 4 the second sun and orbit 5 the planet's moon inside its Roche limit (whose band has + // tau above 1: the series branch of the shader). The zone window holds all of them; the far window is centred on the + // zone node, so its band (nothing inside A, the zone's mass beyond Beta A) is drawn. A window draws a term when + // the term's disc reaches it; the largest tau over the drawn terms must exceed 1 or the series branch went unchecked. + static void CheckFrame(string frame, Zone zone, Orbit[] orbits) + { + CheckTexels(frame + "-planetoid", zone, At(orbits[2]), 4f * Core(zone, 29.2f)); + CheckTexels(frame + "-planet", zone, At(orbits[1]), 4f * Core(zone, 273.9f)); + CheckTexels(frame + "-sun", zone, At(orbits[0]), 4f * Core(zone, 14152f)); + CheckTexels(frame + "-zone", zone, Vector2.zero, 1.05f * zone.Pack.Radius); + var centre = new Vector2(zone.Wells.Centre.x, zone.Wells.Centre.y); + var span = 0f; + foreach (var root in new[] { orbits[0], orbits[4] }) + span = Math.Max(span, (At(root) - centre).magnitude + zone.Wells.Reach(zone.Orbits.First(o => o.Value == root).Key)); + // The wells have their own windows: out here a texel is 40 u wide, so only the ring from 0.9 A outward, where the + // zone node's band rises and the zone becomes one body, is measured. + CheckTexels(frame + "-far", zone, centre, 1.6f * span, .9f * span); + CheckGradient(zone, orbits.Select(At).ToArray()); + } + + // A sun (14152 at (-130, 85)), its planet (273.9, placed at (610, -240) at the pack's time), the planet's planetoid + // (29.2, placed at (670, -270)) and a body of mass 0, whose well has no strength (a legal body; its curves give + // c = 0 and R = 0), at (1700, 300): a family, so the band terms are drawn (the planet's and the sun's cusps and + // fades), off both axes and asymmetric, so the zone's wells sit where the verify says before any Update and a + // mirrored or swapped axis cannot agree with the sim. The sun and the zero-mass body are fixed roots. + internal static Zone BuildZone(GameSettings settings, string work, out Orbit[] orbits, float radius = 4182f, bool multiRoot = false) + { + var cache = AetheriaStores.Open(Path.Combine(work, "catalog.cc"), Path.Combine(work, "run.cc"), catalogWritable: true); + cache.Upsert(new VerseGrammar { Revision = 1 }); + cache.FlushAsync().Wait(); + var items = new ItemManager(1u, cache, new ProvenanceLedger(), settings.GameplaySettings, _ => { }); + var positions = new List { new Vector2(-130f, 85f), new Vector2(610f, -240f), new Vector2(670f, -270f), new Vector2(1700f, 300f) }; + var masses = new List { 14152f, 273.9f, 29.2f, 0f }; + var parents = new List { -1, 0, 1, -1 }; + if (multiRoot) + { + // A second sun (a second subzone, so the zone node exists) and a moon of the planet 0.6 of its Roche limit away. + positions.Add(new Vector2(-2400f, -1900f)); + masses.Add(3000f); + parents.Add(-1); + positions.Add(positions[1] + new Vector2(-.6f * settings.PlanetSettings.RocheLimit.Evaluate(273.9f), 0f)); + masses.Add(1f); + parents.Add(1); + } + var keys = new CultRecordKey[positions.Count]; + var pack = new ZonePack { Radius = radius }; + for (var i = 0; i < positions.Count; i++) + { + var data = new OrbitData { FixedPosition = new float2(positions[i].x, positions[i].y) }; + if (parents[i] >= 0) + { + var offset = positions[i] - positions[parents[i]]; + data.Parent = new CultRecordRef(keys[parents[i]]); + data.Distance = offset.magnitude; + data.Phase = Mathf.Atan2(offset.y, offset.x) / (2f * Mathf.PI); + } + var orbit = keys[i] = cache.Upsert(data).Key; + var body = cache.Upsert(new PlanetData + { Name = "Body " + i, Orbit = new CultRecordRef(orbit), Mass = masses[i] }).Key; + pack.Orbits.Add(new CultRecordRef(orbit)); + pack.Planets.Add(new CultRecordRef(body)); + } + var zone = new Zone(items, settings.PlanetSettings, pack, new GalaxyZone { Name = "Gravity Parity", Owner = null }, null); + orbits = keys.Select(k => zone.Orbits[k]).ToArray(); + return zone; + } + + // Renders the field through a downward orthographic camera that culls layer 9 only, centred on `centre` with + // half-size `half`, and returns the depth of every texel with the world xz of the texel's centre, which is asked + // of the camera rather than assumed. + static void Render(Vector2 centre, float half, out float[] depth, out Vector2[] world) + { + var rt = new RenderTexture(Size, Size, 0, RenderTextureFormat.RFloat) { filterMode = FilterMode.Point }; + var cameraObject = new GameObject("Gravity Parity Camera"); + var read = new Texture2D(Size, Size, TextureFormat.RFloat, false); + var previous = RenderTexture.active; + try + { + var camera = cameraObject.AddComponent(); + camera.orthographic = true; + camera.orthographicSize = half; + camera.aspect = 1f; + camera.nearClipPlane = .3f; + camera.farClipPlane = 1000f; + camera.cullingMask = 1 << GravityLowering.FieldLayer; + camera.clearFlags = CameraClearFlags.SolidColor; + camera.backgroundColor = Color.black; + camera.allowHDR = false; + camera.allowMSAA = false; + camera.targetTexture = rt; + cameraObject.transform.SetPositionAndRotation(new Vector3(centre.x, 100f, centre.y), Quaternion.Euler(90f, 0f, 0f)); + camera.Render(); + + RenderTexture.active = rt; + read.ReadPixels(new Rect(0, 0, Size, Size), 0, 0); + read.Apply(); + depth = read.GetPixelData(0).ToArray(); + world = new Vector2[Size * Size]; + for (var y = 0; y < Size; y++) + for (var x = 0; x < Size; x++) + { + var p = camera.ViewportToWorldPoint(new Vector3((x + .5f) / Size, (y + .5f) / Size, 100f)); + world[y * Size + x] = new Vector2(p.x, p.z); + } + } + finally + { + RenderTexture.active = previous; + UnityEngine.Object.DestroyImmediate(cameraObject); + UnityEngine.Object.DestroyImmediate(read); + rt.Release(); + UnityEngine.Object.DestroyImmediate(rt); + } + } + + // The largest tau = (a^2 + eps^2) / (b^2 - a^2) over the bounded terms whose disc reaches the window's square. + static void NoteTau(Zone zone, Vector2 centre, float half) + { + foreach (var term in zone.Wells.Terms) + { + if (float.IsPositiveInfinity(term.Outer)) continue; + var at = term.Node.IsSet() ? zone.Orbits[term.Node].Position : zone.Wells.Centre; + if (Math.Abs(at.x - centre.x) > half + term.Outer || Math.Abs(at.y - centre.y) > half + term.Outer) continue; + _maxTau = Math.Max(_maxTau, (term.Inner * term.Inner + term.Softening * term.Softening) / (term.Outer * term.Outer - term.Inner * term.Inner)); + } + } + + static void CheckTexels(string window, Zone zone, Vector2 centre, float half, float ringFrom = 0f) + { + Render(centre, half, out var depth, out var world); + NoteTau(zone, centre, half); + var worst = 0f; + var live = 0; + var measured = 0; + for (var i = 0; i < depth.Length; i++) + { + if ((world[i] - centre).magnitude < ringFrom) continue; + measured++; + var expected = -zone.GetHeight(new float2(world[i].x, world[i].y)); + if (float.IsNaN(depth[i])) { Fail($"{window}-texels", $"texel {i}: NaN"); return; } + var error = Math.Abs(depth[i] - expected); + worst = Math.Max(worst, error); + if (Math.Abs(expected) > 1f) live++; + if (error > Tolerance) + { + Fail($"{window}-texels", $"texel {i} at ({world[i].x:F2}, {world[i].y:F2}): expected {expected:G6}, drawn {depth[i]:G6}, error {error:G4} > {Tolerance:G4}"); + return; + } + } + _maxError = Math.Max(_maxError, worst); + // A window that draws nothing agrees with a zone that is flat: the check must be live. + if (live < measured / 2) Fail($"{window}-texels", $"only {live} of {measured} texels are deeper than 1 u; the check is vacuous"); + Debug.Log($"{Tag} {window}: {depth.Length} texels, max error {worst:G4} u"); + } + + // The texture's central difference (over two 4 u texels, mid-zone) points where GetForce does: depth = -h, so its + // gradient is the force over the exaggeration. This is what the slope readers (the shader's slopeFlow, the nebula + // surface normal, the drawn grid) take from the texture. + static void CheckGradient(Zone zone, Vector2[] bodies) + { + Render(new Vector2(1500f, 0f), 512f, out var depth, out var world); + var compared = 0; + for (var y = 1; y < Size - 1; y++) + for (var x = 1; x < Size - 1; x++) + { + var here = world[y * Size + x]; + if (bodies.Any(b => (b - here).magnitude < 16f)) continue; + // The world step of each texel axis is read from the camera, so a flipped or rotated target is still measured. + var au = world[y * Size + x + 1] - world[y * Size + x - 1]; + var av = world[(y + 1) * Size + x] - world[(y - 1) * Size + x]; + var du = depth[y * Size + x + 1] - depth[y * Size + x - 1]; + var dv = depth[(y + 1) * Size + x] - depth[(y - 1) * Size + x]; + var det = au.x * av.y - au.y * av.x; + var g = new Vector2((du * av.y - dv * au.y) / det, (dv * au.x - du * av.x) / det); + var f = zone.GetForce(new float2(here.x, here.y)); + if (CultMath.math.length(f) < FlatForce) continue; // between the subzones the ground is flat: no direction to compare + var angle = Vector2.Angle(g, new Vector2(f.x, f.y)); + if (float.IsNaN(angle) || angle > GradientDegrees) + { + Fail("gradient", $"at ({here.x:F1}, {here.y:F1}) the drawn slope points {angle:F2} degrees from the force (limit {GradientDegrees:F0})"); + return; + } + _maxAngle = Math.Max(_maxAngle, angle); + compared++; + } + if (compared < Size * Size / 2) Fail("gradient", $"only {compared} texels were compared"); + } + + // Main Menu.unity has no ZoneRenderer, so no Gravity Field and no lowered potential: its gravity cameras draw the + // menu's own brush objects (Boundary on layer 9, the Waves on layer 10) and are presentation by spec (follow-up + // menu-grid-brushes), not a reader of the potential. This pins that: a ZoneRenderer in the menu would make its + // cameras readers of the field, and they would have to cull layer 9 alone like ARPG's. + static void CheckTestSceneWiring() + { + EditorSceneManager.OpenScene("Assets/Scenes/TestScene.unity", OpenSceneMode.Single); + try + { + if (CheckPatchCameras("TestScene.unity") < 1) Fail("wiring", "no Fog Patch Displacement camera in TestScene.unity"); + } + finally + { + EditorSceneManager.NewScene(NewSceneSetup.EmptyScene, NewSceneMode.Single); + } + } + + static void CheckMenuWiring() + { + var scene = EditorSceneManager.OpenScene("Assets/Scenes/Main Menu.unity", OpenSceneMode.Single); + try + { + if (UnityEngine.Object.FindFirstObjectByType(FindObjectsInactive.Include) != null) + Fail("wiring", "Main Menu.unity has a ZoneRenderer: its gravity cameras now read the Gravity Field and must cull layer 9 alone"); + var seen = 0; + foreach (var camera in UnityEngine.Object.FindObjectsByType(FindObjectsInactive.Include, FindObjectsSortMode.None)) + { + if (camera.targetTexture == null || camera.targetTexture.name != "Fog Surface Displacement") continue; + seen++; + const int menuBrushLayers = (1 << 9) | (1 << 10); + if (camera.cullingMask != menuBrushLayers) + Fail("wiring", $"Main Menu camera {camera.name} culls mask {camera.cullingMask}, not the menu brush layers 9 and 10"); + } + if (seen != 1) Fail("wiring", $"{seen} Fog Surface Displacement cameras in Main Menu.unity, expected 1"); + if (CheckPatchCameras("Main Menu.unity") < 1) Fail("wiring", "no Fog Patch Displacement camera in Main Menu.unity"); + } + finally + { + EditorSceneManager.NewScene(NewSceneSetup.EmptyScene, NewSceneMode.Single); + } + } + + // Every scene's Fog Patch Displacement camera: cloudDensity adds the R32 gravity height to the patch texture, so + // a patch camera that culls the gravity layer counts the field twice. Returns how many it found in the open scene. + static int CheckPatchCameras(string sceneName) + { + var found = 0; + foreach (var camera in UnityEngine.Object.FindObjectsByType(FindObjectsInactive.Include, FindObjectsSortMode.None)) + { + if (camera.targetTexture == null || camera.targetTexture.name != "Fog Patch Displacement") continue; + found++; + if ((camera.cullingMask & 1 << GravityLowering.FieldLayer) != 0) + Fail("wiring", $"camera {camera.name} (target Fog Patch Displacement) in {sceneName} culls layer {GravityLowering.FieldLayer}, the gravity layer"); + } + return found; + } + + static void CheckWiring(GameSettings settings) + { + var scene = EditorSceneManager.OpenScene("Assets/Scenes/ARPG.unity", OpenSceneMode.Single); + try + { + var gravityTargets = new[] { "Fog Surface Displacement", "Slime Gravity", "MinimapGravity" }; + var seen = 0; + foreach (var camera in UnityEngine.Object.FindObjectsByType(FindObjectsInactive.Include, FindObjectsSortMode.None)) + { + if (camera.targetTexture == null || !gravityTargets.Contains(camera.targetTexture.name)) continue; + seen++; + if (camera.cullingMask != 1 << GravityLowering.FieldLayer) + Fail("wiring", $"camera {camera.name} (target {camera.targetTexture.name}) culls mask {camera.cullingMask}, not layer {GravityLowering.FieldLayer} alone"); + } + if (seen < gravityTargets.Length) Fail("wiring", $"only {seen} gravity cameras found in ARPG.unity"); + + // The patch texture is half-float: it holds the patch layers only, the nebula reads gravity from the R32 surface. + if (CheckPatchCameras("ARPG.unity") != 1) Fail("wiring", "ARPG.unity does not have exactly 1 Fog Patch Displacement camera"); + + // The map screen's gravity camera has no target until MapRenderer gives it one at run time. + var map = UnityEngine.Object.FindFirstObjectByType(FindObjectsInactive.Include); + if (map == null || map.GravityCamera == null) Fail("wiring", "no MapRenderer.GravityCamera in ARPG.unity"); + else if (map.GravityCamera.cullingMask != 1 << GravityLowering.FieldLayer) + Fail("wiring", $"MapRenderer.GravityCamera culls mask {map.GravityCamera.cullingMask}, not layer {GravityLowering.FieldLayer} alone"); + + var renderer = UnityEngine.Object.FindFirstObjectByType(FindObjectsInactive.Include); + if (renderer == null) Fail("wiring", "no ZoneRenderer in ARPG.unity"); + else if (renderer.GravityField == null || renderer.GravityField.shader.name != "Brushes/Gravity Field") + Fail("wiring", "ZoneRenderer.GravityField is not a Brushes/Gravity Field material"); + + foreach (var r in UnityEngine.Object.FindObjectsByType(FindObjectsInactive.Include, FindObjectsSortMode.None)) + if (r.gameObject.layer == GravityLowering.FieldLayer) + Fail("wiring", $"renderer {r.name} in ARPG.unity sits on layer {GravityLowering.FieldLayer}"); + } + finally + { + EditorSceneManager.NewScene(NewSceneSetup.EmptyScene, NewSceneMode.Single); + } + + CheckMenuWiring(); + CheckTestSceneWiring(); + + foreach (var path in new[] + { + "Assets/Prefabs/RPG/Planets/Planet.prefab", "Assets/Prefabs/RPG/Planets/Gas Giant.prefab", + "Assets/Prefabs/RPG/Planets/Sun.prefab", "Assets/Prefabs/RPG/Wormhole 1.prefab" + }) + { + var prefab = AssetDatabase.LoadAssetAtPath(path); + if (prefab == null) { Fail("wiring", $"no prefab at {path}"); continue; } + foreach (var r in prefab.GetComponentsInChildren(true)) + if (r.gameObject.layer == GravityLowering.FieldLayer) + Fail("wiring", $"renderer {r.name} in {path} sits on layer {GravityLowering.FieldLayer}"); + } + } + } +} diff --git a/Assets/Scripts/Editor/NameTools.cs.meta b/Assets/Scripts/Editor/GravityFieldParityVerify.cs.meta similarity index 83% rename from Assets/Scripts/Editor/NameTools.cs.meta rename to Assets/Scripts/Editor/GravityFieldParityVerify.cs.meta index e0022b308..50646bcbb 100644 --- a/Assets/Scripts/Editor/NameTools.cs.meta +++ b/Assets/Scripts/Editor/GravityFieldParityVerify.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 88b5f578fe63a904b997331630e61416 +guid: 1ceb2bdab0804463b1998471d47e82fa MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/Scripts/Editor/MapBeltPerf.cs b/Assets/Scripts/Editor/MapBeltPerf.cs new file mode 100644 index 000000000..ea3eac5c0 --- /dev/null +++ b/Assets/Scripts/Editor/MapBeltPerf.cs @@ -0,0 +1,116 @@ +using System; +using System.Diagnostics; +using System.IO; +using System.Linq; +using GameCult.Caching; +using UnityEditor; +using CultMath; +using UnityEngine; +using float4 = CultMath.float4; +using Debug = UnityEngine.Debug; + +// The map's belt cost per frame, CPU milliseconds and managed allocation, for belts of 1000, 2250 (the generated +// maximum, Settings.asset) and 4000 asteroids: the base revision's AsteroidBeltUI.Update (MapBeltPerfBase, a verbatim copy) +// and MapPresenter's belt upload and draw, each as the median and interquartile range of 21 runs of 300 frames after +// a warm-up, in this one Unity job. CPU time only: GPU cost is not covered. Needs a GPU device. +// +// Unity -batchmode -projectPath -executeMethod MapBeltPerf.Run -logFile +public static class MapBeltPerf +{ + private const int Warmup = 60, Frames = 300, RunCount = 21; + + public static void Run() + { + var work = Path.Combine(Path.GetTempPath(), $"map-belt-perf-{Guid.NewGuid():N}"); + try + { + Directory.CreateDirectory(work); + foreach (var count in new[] { 1000, 2250, 4000 }) Measure(work, count); + EditorApplication.Exit(0); + } + catch (Exception exception) + { + Debug.LogException(exception); + EditorApplication.Exit(1); + } + } + + private static void Measure(string work, int count) + { + var settings = AssetDatabase.LoadAssetAtPath("Assets/Resources/Settings.asset"); + var cache = AetheriaStores.Open(Path.Combine(work, $"c{count}.cc"), Path.Combine(work, $"r{count}.cc"), catalogWritable: true); + cache.Upsert(new VerseGrammar { Revision = 1 }); + var sunOrbit = cache.Upsert(new OrbitData()).Key; + var sunKey = cache.Upsert(new PlanetData { Name = "Sun", Orbit = new CultRecordRef(sunOrbit), Mass = 400f }).Key; + var beltOrbit = cache.Upsert(new OrbitData { Parent = new CultRecordRef(sunOrbit), Distance = 900f, Phase = .42f }).Key; + var asteroids = Enumerable.Range(0, count).Select(i => new Asteroid + { Distance = 120f + i * .01f, Phase = CultMath.math.frac(i * .618f), Size = CultMath.math.frac(i * .37f + .1f), RotationSpeed = .15f + i * 1e-4f }).ToArray(); + var beltKey = cache.Upsert(new AsteroidBeltData { Orbit = new CultRecordRef(beltOrbit), Asteroids = asteroids }).Key; + var pack = new ZonePack + { + Orbits = { new CultRecordRef(sunOrbit), new CultRecordRef(beltOrbit) }, + Planets = { new CultRecordRef(sunKey), new CultRecordRef(beltKey) }, + Radius = 5000f, Mass = 10000f, Time = 0 + }; + var items = new ItemManager(1u, cache, new ProvenanceLedger(), settings.GameplaySettings, _ => { }); + var zone = new Zone(items, new PlanetSettings + { + BodyRadius = new ExponentialCurve(), WellStrength = new ExponentialCurve { Multiplier = 1f, Exponent = 1f }, + RocheLimit = new ExponentialCurve { Constant = 2f }, + AsteroidSize = new ExponentialLerp { Minimum = 2f, Maximum = 9f, Exponent = 1.7f }, + AsteroidHitpoints = new ExponentialLerp { Minimum = 10f, Maximum = 300f, Exponent = 2f }, + AsteroidRespawnTime = new ExponentialLerp { Minimum = 5f, Maximum = 60f, Exponent = 1f } + }, pack, new GalaxyZone { Name = "Perf", Owner = null }, null); + + var transforms = new float4[count]; + var presenter = new MapPresenter(new Material[0], AssetDatabase.LoadAssetAtPath("Assets/Materials/UI/MapAsteroid.mat"), 4, 4, 3f); + presenter.RegisterBelt(beltKey, transforms); + var baseBelt = new MapBeltPerfBase(zone, zone.AsteroidBelts[beltKey], 4, 4, 3f); + + Report("base", count, Runs(zone, beltKey, transforms, () => baseBelt.Update(transforms, 0f))); + Report("head", count, Runs(zone, beltKey, transforms, () => presenter.Draw(zone, 0))); + presenter.Clear(); + } + + // Each run is Frames frames after Warmup frames; the figure is one run's CPU ms per frame and managed bytes per frame. + private static (double ms, long bytes)[] Runs(Zone zone, CultRecordKey beltKey, float4[] transforms, Action frame) + { + var results = new (double, long)[RunCount]; + var stopwatch = new Stopwatch(); + var time = 0.0; + for (var run = -1; run < RunCount; run++) + { + stopwatch.Reset(); + long allocated = 0; + for (var i = 0; i < Warmup + Frames; i++) + { + zone.EvaluateBelt(beltKey, transforms, time += 0.016); + var bytes = GC.GetAllocatedBytesForCurrentThread(); + if (i >= Warmup) stopwatch.Start(); + frame(); + if (i >= Warmup) stopwatch.Stop(); + if (i >= Warmup) allocated += GC.GetAllocatedBytesForCurrentThread() - bytes; + } + if (run >= 0) results[run] = (stopwatch.Elapsed.TotalMilliseconds / Frames, allocated / Frames); + } + return results; + } + + private static double Quantile(double[] sorted, double q) + { + var at = q * (sorted.Length - 1); + var low = (int)Math.Floor(at); + var high = Math.Min(low + 1, sorted.Length - 1); + return sorted[low] + (sorted[high] - sorted[low]) * (at - low); + } + + private static void Report(string revision, int count, (double ms, long bytes)[] runs) + { + var ms = runs.Select(r => r.ms).OrderBy(v => v).ToArray(); + var bytes = runs.Select(r => (double)r.bytes).OrderBy(v => v).ToArray(); + var units = Process.GetProcessesByName("Unity").Length; + Debug.Log($"[MapBeltPerf] revision={revision} asteroids={count} runs={runs.Length} frames_per_run={Frames} " + + $"cpu_ms_median={Quantile(ms, .5):F4} iqr={Quantile(ms, .25):F4}-{Quantile(ms, .75):F4} " + + $"gc_bytes_median={Quantile(bytes, .5):F0} unity_processes={units} cpus={Environment.ProcessorCount}"); + } +} diff --git a/Assets/Scripts/Editor/MapBeltPerf.cs.meta b/Assets/Scripts/Editor/MapBeltPerf.cs.meta new file mode 100644 index 000000000..5a06251b4 --- /dev/null +++ b/Assets/Scripts/Editor/MapBeltPerf.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 2bf3d3dcd7e3dd940add2640db93e3fe \ No newline at end of file diff --git a/Assets/Scripts/Editor/MapBeltPerfBase.cs b/Assets/Scripts/Editor/MapBeltPerfBase.cs new file mode 100644 index 000000000..6470b9c9a --- /dev/null +++ b/Assets/Scripts/Editor/MapBeltPerfBase.cs @@ -0,0 +1,88 @@ +using GameCult.Caching; +using CultMath; +using UnityEngine; +using static CultMath.math; +using float2 = CultMath.float2; +using float4 = CultMath.float4; +using Random = UnityEngine.Random; + +// The base revision's per-frame belt map path, copied from ZoneRenderer.cs at da6fe033 (class AsteroidBeltUI) so that +// MapBeltPerf can measure it beside MapPresenter in one job. Only the lead it read from ActionGameManager.Clock is +// fixed at zero. Not used by the game. +public class MapBeltPerfBase +{ + private Vector3[] _vertices; + private Vector3[] _normals; + private Vector2[] _uvs; + private int[] _indices; + private CultRecordKey _orbitParent; + private Mesh _mesh; + private float _size; + private Zone _zone; + private AsteroidBelt _belt; + private float _scale; + + public MapBeltPerfBase(Zone zone, AsteroidBelt belt, int spritesheetWidth, int spritesheetHeight, float scale) + { + _belt = belt; + _zone = zone; + var orbit = zone.Orbits[belt.Data.Orbit.Key]; + _orbitParent = orbit.Data.Parent.Key; + _vertices = new Vector3[_belt.Data.Asteroids.Length * 4]; + _normals = new Vector3[_belt.Data.Asteroids.Length * 4]; + _uvs = new Vector2[_belt.Data.Asteroids.Length * 4]; + _indices = new int[_belt.Data.Asteroids.Length * 6]; + _scale = scale; + + var maxDist = 0f; + var spriteSize = float2(1f / spritesheetWidth, 1f / spritesheetHeight); + // vertex order: bottom left, top left, top right, bottom right + for (var i = 0; i < belt.Data.Asteroids.Length; i++) + { + if (belt.Data.Asteroids[i].Distance > maxDist) + maxDist = belt.Data.Asteroids[i].Distance; + var spriteX = Random.Range(0, spritesheetWidth); + var spriteY = Random.Range(0, spritesheetHeight); + + _uvs[i * 4] = new Vector2(spriteX * spriteSize.x, spriteY * spriteSize.y); + _uvs[i * 4 + 1] = new Vector2(spriteX * spriteSize.x, spriteY * spriteSize.y + spriteSize.y); + _uvs[i * 4 + 2] = new Vector2(spriteX * spriteSize.x + spriteSize.x, spriteY * spriteSize.y + spriteSize.y); + _uvs[i * 4 + 3] = new Vector2(spriteX * spriteSize.x + spriteSize.x, spriteY * spriteSize.y); + + _indices[i * 6] = i * 4; + _indices[i * 6 + 1] = i * 4 + 1; + _indices[i * 6 + 2] = i * 4 + 3; + _indices[i * 6 + 3] = i * 4 + 3; + _indices[i * 6 + 4] = i * 4 + 1; + _indices[i * 6 + 5] = i * 4 + 2; + } + + for (var i = 0; i < _normals.Length; i++) _normals[i] = -Vector3.forward; + + _mesh = new Mesh(); + _mesh.vertices = _vertices; + _mesh.uv = _uvs; + _mesh.triangles = _indices; + _mesh.normals = _normals; + _mesh.bounds = new Bounds(Vector3.zero, Vector3.one * maxDist); + _size = maxDist; + } + + public void Update(float4[] transforms, float height) + { + var parentPosition = DrawAhead.Orbit(_zone, _orbitParent, 0f); + for (var i = 0; i < transforms.Length; i++) + { + var transform = transforms[i]; + var rotation = Quaternion.Euler(90, transform.z, 0); + var position = new Vector3(transform.x, height, transform.y); + _vertices[i * 4] = rotation * new Vector3(-transform.w * _scale, -transform.w * _scale, 0) + position; + _vertices[i * 4 + 1] = rotation * new Vector3(-transform.w * _scale, transform.w * _scale, 0) + position; + _vertices[i * 4 + 2] = rotation * new Vector3(transform.w * _scale, transform.w * _scale, 0) + position; + _vertices[i * 4 + 3] = rotation * new Vector3(transform.w * _scale, -transform.w * _scale, 0) + position; + } + + _mesh.bounds = new Bounds(new Vector3(parentPosition.x, 0, parentPosition.y), Vector3.one * (_size * 2)); + _mesh.vertices = _vertices; + } +} diff --git a/Assets/Scripts/Editor/MapBeltPerfBase.cs.meta b/Assets/Scripts/Editor/MapBeltPerfBase.cs.meta new file mode 100644 index 000000000..662341fb1 --- /dev/null +++ b/Assets/Scripts/Editor/MapBeltPerfBase.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: c3e6b631c94f2384c87cf1906907af9f \ No newline at end of file diff --git a/Assets/Scripts/Editor/MapPresenterCapture.cs b/Assets/Scripts/Editor/MapPresenterCapture.cs new file mode 100644 index 000000000..1e0a727f0 --- /dev/null +++ b/Assets/Scripts/Editor/MapPresenterCapture.cs @@ -0,0 +1,119 @@ +using System; +using System.IO; +using UnityEditor; +using UnityEditor.SceneManagement; +using UnityEngine; + +// Proof that a planet icon and a ping tint reach the pixels of the real map cameras when the planet's well is deeper +// than 1000 below the camera. The ARPG scene's own "Map Overlays" and "Map Tint" cameras (position, orthographic size, +// clip planes and culling mask as authored) render into a render texture on a solid black background. For each, in +// order: a control render with nothing drawn; a render with the thing placed 1100 below the camera (a plain quad, and the +// PingEffect prefab), which must equal the control because the far plane clips it; then MapPresenter's draw of the sun +// (well deeper than 2000) or the PingEffect prefab placed where EntityInstance places it, which must differ from the +// control at its pixel. A capture that draws nothing fails the last check, and one that cannot tell drawn from clipped +// fails the middle one. +// +// Unity -batchmode -projectPath -executeMethod MapPresenterCapture.Run -logFile +// +// Needs a GPU device; do not pass -nographics or -quit: Run exits the Editor itself, 0 on success and 1 on any failure. +public static class MapPresenterCapture +{ + private const int Size = 64; + + public static void Run() + { + var work = Path.Combine(Path.GetTempPath(), $"map-presenter-capture-{Guid.NewGuid():N}"); + try + { + Directory.CreateDirectory(work); + Check(work); + Debug.Log("[MapPresenterCapture] ok"); + EditorApplication.Exit(0); + } + catch (Exception exception) + { + Debug.LogException(exception); + EditorApplication.Exit(1); + } + } + + private static void Require(bool condition, string what) + { + if (!condition) throw new InvalidOperationException(what); + } + + private static Camera SceneCamera(string name) + { + foreach (var camera in UnityEngine.Object.FindObjectsByType(FindObjectsInactive.Include, FindObjectsSortMode.None)) + if (camera.name == name) return camera; + throw new InvalidOperationException($"No camera named {name} in the scene."); + } + + private static Color Render(Camera camera, RenderTexture target, Vector3 at) + { + camera.targetTexture = target; + camera.clearFlags = CameraClearFlags.SolidColor; + camera.backgroundColor = Color.black; + camera.Render(); + var viewport = camera.WorldToViewportPoint(new Vector3(at.x, 0, at.z)); + var previous = RenderTexture.active; + RenderTexture.active = target; + var read = new Texture2D(Size, Size, TextureFormat.RGBA32, false); + read.ReadPixels(new Rect(0, 0, Size, Size), 0, 0); + RenderTexture.active = previous; + var pixel = read.GetPixel(Mathf.Clamp((int)(viewport.x * Size), 0, Size - 1), Mathf.Clamp((int)(viewport.y * Size), 0, Size - 1)); + UnityEngine.Object.DestroyImmediate(read); + return pixel; + } + + private static float Distance(Color a, Color b) => Mathf.Abs(a.r - b.r) + Mathf.Abs(a.g - b.g) + Mathf.Abs(a.b - b.b); + + private static void Check(string work) + { + EditorSceneManager.OpenScene("Assets/Scenes/ARPG.unity", OpenSceneMode.Single); + var f = MapPresenterSmoke.Build(work, flatIcons: true); + f.Map.SetMinimapScale(300f); + var target = new RenderTexture(Size, Size, 24, RenderTextureFormat.ARGB32); + var layer = LayerMask.NameToLayer("Minimap"); + + // Planet: the sun's icon through the map overlays camera. + var overlays = SceneCamera("Map Overlays"); + Require((overlays.cullingMask & (1 << layer)) != 0, "The Map Overlays camera does not see the Minimap layer."); + var well = f.Zone.GetHeight(DrawAhead.Orbit(f.Zone, f.Zone.PlanetInstances[f.SunKey].BodyData.Orbit.Key, 0), 0); + Require(well < -1000f, $"The fixture sun's well is {well}, not deeper than 1000."); + Require(f.Map.TryDrawn(f.SunKey, out var sun), "The sun registered no icon."); + var sunAt = sun.GetPosition(); + // Control: the pixel with nothing queued. Then a quad 1100 below the camera, deeper than the far plane, which must + // leave the pixel as it was. Then the presenter's draw, which must change it. Draws queue for the cameras that + // render after them, so the order is empty, deep, drawn. + var empty = Render(overlays, target, sunAt); + var quad = GameObject.CreatePrimitive(PrimitiveType.Quad); + var deepMesh = quad.GetComponent().sharedMesh; + var deepMaterial = new Material(Shader.Find("Unlit/Color")) { color = Color.white }; + UnityEngine.Object.DestroyImmediate(quad); + Graphics.RenderMesh(new RenderParams(deepMaterial) { layer = layer }, deepMesh, 0, + Matrix4x4.TRS(new Vector3(sunAt.x, -1100f, sunAt.z), Quaternion.Euler(90, 0, 0), Vector3.one * 300f)); + var deep = Render(overlays, target, sunAt); + Require(Distance(deep, empty) < .01f, $"A mesh 1100 below the camera drew: {deep} against {empty}."); + f.Map.Draw(f.Zone, 0); + var drawn = Render(overlays, target, sunAt); + Require(Distance(drawn, empty) > .3f, $"The sun's icon is not in the pixels: drawn {drawn}, empty {empty}."); + + // Ping tint: the PingEffect prefab where EntityInstance places it, through the map tint camera. + var tint = SceneCamera("Map Tint"); + var ping = (GameObject)PrefabUtility.InstantiatePrefab(AssetDatabase.LoadAssetAtPath("Assets/Content/Prefabs/PingEffect.prefab")); + ping.transform.localScale = Vector3.one * 300f; + var pingAt = new Vector3(sunAt.x, MapPresenter.PlaneY, sunAt.z); + ping.transform.position = pingAt; + ping.SetActive(false); + var untinted = Render(tint, target, pingAt); + ping.SetActive(true); + ping.transform.position = new Vector3(sunAt.x, -1100f, sunAt.z); + var deepPing = Render(tint, target, pingAt); + Require(Distance(deepPing, untinted) < .01f, $"A ping 1100 below the camera drew: {deepPing} against {untinted}."); + ping.transform.position = pingAt; + var tinted = Render(tint, target, pingAt); + Require(Distance(tinted, untinted) > .02f, $"The ping tint is not in the pixels: with {tinted}, without {untinted}."); + Debug.Log($"[MapPresenterCapture] well={well} sun drawn={drawn} empty={empty} deep={deep}; ping tinted={tinted} untinted={untinted} deep={deepPing}"); + } +} diff --git a/Assets/Scripts/Editor/MapPresenterCapture.cs.meta b/Assets/Scripts/Editor/MapPresenterCapture.cs.meta new file mode 100644 index 000000000..53caa5ee1 --- /dev/null +++ b/Assets/Scripts/Editor/MapPresenterCapture.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: cfa012aaae63b5044bdfd1b6b44ca9da \ No newline at end of file diff --git a/Assets/Scripts/Editor/MapPresenterSmoke.cs b/Assets/Scripts/Editor/MapPresenterSmoke.cs new file mode 100644 index 000000000..cccc4883c --- /dev/null +++ b/Assets/Scripts/Editor/MapPresenterSmoke.cs @@ -0,0 +1,233 @@ +using System; +using System.IO; +using System.Linq; +using System.Reflection; +using GameCult.Caching; +using UnityEditor; +using UnityEngine; +using CultMath; +using CultMath.UnityBridge; +using static CultMath.math; +using float2 = CultMath.float2; +using float3 = CultMath.float3; +using float4 = CultMath.float4; + +// Batch proof of MapPresenter's contract on a real Zone, without a scene: a sun with a very deep well, a belt, and ships +// registered through EntityInstance.SetEntity as the game does. Planet icons draw at the map plane inside both map +// cameras' clip range however deep the well, a rolled and pitched hull's icon turns by yaw alone, every kind registers one +// draw and leaves no icon child behind, a belt is one instanced draw of every asteroid, and an entity's fade reaches its +// icon the frame it is set. Not reached: prefab, mod ship, station and turret instances (they register through the same +// call), and the rendered pixels (a GPU capture). +// +// Unity -batchmode -projectPath -executeMethod MapPresenterSmoke.Run -logFile +// +// Do not pass -quit: Run exits the Editor itself, 0 on success and 1 on any failure. +public static class MapPresenterSmoke +{ + private const BindingFlags Any = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic; + private const int Asteroids = 24; + + public static void Run() + { + var work = Path.Combine(Path.GetTempPath(), $"map-presenter-smoke-{Guid.NewGuid():N}"); + try + { + Directory.CreateDirectory(work); + Check(work); + Debug.Log("[MapPresenterSmoke] ok"); + EditorApplication.Exit(0); + } + catch (Exception exception) + { + Debug.LogException(exception); + EditorApplication.Exit(1); + } + } + + private static void Require(bool condition, string what) + { + if (!condition) throw new InvalidOperationException(what); + } + + private static void Awaken(Component component) => component.GetType().GetMethod("Awake", Any)?.Invoke(component, null); + + // flat: authored lying on the map plane (facing up), as a real icon is; the smoke's own icons are authored upright + // so that their rotation is exactly the yaw. + private static MeshRenderer NewIcon(Transform parent, bool flat) + { + var icon = GameObject.CreatePrimitive(PrimitiveType.Quad); + icon.layer = LayerMask.NameToLayer("Minimap"); + icon.transform.SetParent(parent, false); + if (flat) icon.transform.localRotation = Quaternion.Euler(90, 0, 0); + var renderer = icon.GetComponent(); + renderer.sharedMaterial = new Material(Shader.Find("Unlit/Color")) { color = new Color(1, 1, 1, .8f) }; + return renderer; + } + + // What Build leaves registered with a presenter, for the checks here and for MapPresenterCapture. + internal sealed class Fixture + { + public Zone Zone; + public MapPresenter Map; + public Ship Ship, Other; + public EntityInstance ShipInstance, OtherInstance; + public CultRecordKey SunKey, BeltKey; + public float4[] Belt; + public Transform Roots; + } + + private static void Check(string work) + { + var f = Build(work, flatIcons: false); + Checks(f); + } + + internal static Fixture Build(string work, bool flatIcons) + { + var settings = AssetDatabase.LoadAssetAtPath("Assets/Resources/Settings.asset") + ?? throw new InvalidOperationException("No Settings.asset."); + var planetSettings = new PlanetSettings + { + BodyRadius = new ExponentialCurve(), + WellStrength = new ExponentialCurve { Multiplier = 1f, Exponent = 1f }, + RocheLimit = new ExponentialCurve { Constant = 2f }, + AsteroidSize = new ExponentialLerp { Minimum = 2f, Maximum = 9f, Exponent = 1.7f }, + AsteroidHitpoints = new ExponentialLerp { Minimum = 10f, Maximum = 300f, Exponent = 2f }, + AsteroidRespawnTime = new ExponentialLerp { Minimum = 5f, Maximum = 60f, Exponent = 1f } + }; + var cache = AetheriaStores.Open(Path.Combine(work, "c.cc"), Path.Combine(work, "r.cc"), catalogWritable: true); + cache.Upsert(new VerseGrammar { Revision = 1 }); + var shape = new Shape(5, 4); + foreach (var cell in shape.AllCoordinates) shape[cell] = true; + cache.Upsert(new HullData { Name = "Smoke Hull", HullType = HullType.Ship, Shape = shape, Durability = 1000, Mass = 1000, Armor = 0 }); + var sunOrbit = cache.Upsert(new OrbitData()).Key; + var sunKey = cache.Upsert(new PlanetData { Name = "Sun", Orbit = new CultRecordRef(sunOrbit), Mass = 1e6f }).Key; + var rootOrbit = cache.Upsert(new OrbitData { Parent = new CultRecordRef(sunOrbit), Distance = 4000f, Phase = .17f }).Key; + var beltOrbit = cache.Upsert(new OrbitData { Parent = new CultRecordRef(rootOrbit), Distance = 900f, Phase = .42f }).Key; + var asteroids = Enumerable.Range(0, Asteroids).Select(i => new Asteroid + { Distance = 120f + i * 11.3f, Phase = frac(i * .618f), Size = frac(i * .37f + .1f), RotationSpeed = .15f + i * .037f }).ToArray(); + var beltKey = cache.Upsert(new AsteroidBeltData { Orbit = new CultRecordRef(beltOrbit), Asteroids = asteroids }).Key; + var pack = new ZonePack + { + Orbits = { new CultRecordRef(sunOrbit), new CultRecordRef(rootOrbit), new CultRecordRef(beltOrbit) }, + Planets = { new CultRecordRef(sunKey), new CultRecordRef(beltKey) }, + Radius = 5000f, Mass = 10000f, Time = 0 + }; + var ledger = new ProvenanceLedger(); + for (var i = 1; i <= 8; i++) ledger.Lots[i] = new Lot { Origin = new Attributed(), Quality = 1 }; + var items = new ItemManager(1u, cache, ledger, settings.GameplaySettings, _ => { }); + var zone = new Zone(items, planetSettings, pack, new GalaxyZone { Name = "Smoke", Owner = null }, null); + var hullRef = items.ItemData.RefOf(items.ItemData.GetByName("Smoke Hull")); + var ship = new Ship(items, zone, new EquippableItem { Data = hullRef, Durability = 1000, Lot = 1 }, new EntitySettings()); + var other = new Ship(items, zone, new EquippableItem { Data = hullRef, Durability = 1000, Lot = 2 }, new EntitySettings()); + ship.Position = float3(300, 50, 200); + other.Position = float3(-300, -90, 100); + zone.Admit(ship, piloted: false); + zone.Admit(other, piloted: false); + + // A hull heading 40 degrees from +z, pitched up 89.9 and rolled 30: its forward is almost vertical, where the pose's + // eulerAngles.y is the gimbal decomposition (yaw and roll folded together), not the heading. The heading is the + // forward projected onto the map plane, 40. The fixture asserts the two differ, so a yaw read from eulerAngles + // cannot pass. + var pose = Quaternion.Euler(0, 40, 0) * Quaternion.Euler(-89.9f, 0, 30); + var flatForward = pose * Vector3.forward; + Require(Mathf.Abs(Mathf.DeltaAngle(Mathf.Atan2(flatForward.x, flatForward.z) * Mathf.Rad2Deg, 40f)) < .5f, "The fixture's forward does not head 40."); + Require(Mathf.Abs(Mathf.DeltaAngle(pose.eulerAngles.y, 40f)) > 10f, $"The fixture's eulerAngles.y {pose.eulerAngles.y} is aligned with its heading."); + ship.Direction = float2(Mathf.Sin(40 * Mathf.Deg2Rad), Mathf.Cos(40 * Mathf.Deg2Rad)); + typeof(Ship).GetProperty("Rotation", Any).GetSetMethod(true).Invoke(ship, new object[] { new CultMath.quaternion(pose.x, pose.y, pose.z, pose.w) }); + + var map = new MapPresenter(new Material[0], AssetDatabase.LoadAssetAtPath("Assets/Materials/UI/MapAsteroid.mat"), 4, 4, 3f); + var roots = new GameObject("Smoke Roots").transform; + EntityInstance Bound(Entity entity) + { + var body = new GameObject(entity.Name); + body.transform.SetParent(roots); + var instance = body.AddComponent(); + Awaken(instance); + instance.HullColliders = new HullCollider[0]; + instance.RadiatorHardpoints = new RadiatorHardpoint[0]; + instance.ThrusterHardpoints = new ThrusterHardpoint[0]; + instance.WeaponHardpoints = new WeaponHardpoint[0]; + instance.ArticulationPoints = new ArticulationPoint[0]; + instance.MapIcon = NewIcon(body.transform, flatIcons); + var zoneRenderer = new GameObject("Smoke Zone Renderer").AddComponent(); + zoneRenderer.Settings = settings; + zoneRenderer.MapGravityMaterials = new Material[0]; + Awaken(zoneRenderer); + typeof(ZoneRenderer).GetProperty("Map").GetSetMethod(true).Invoke(zoneRenderer, new object[] { map }); + instance.SetEntity(zoneRenderer, entity); + return instance; + } + var shipInstance = Bound(ship); + var otherInstance = Bound(other); + var sunRoot = new GameObject("Smoke Sun").transform; + sunRoot.SetParent(roots); + map.RegisterPlanet(sunKey, NewIcon(sunRoot, flatIcons), sunRoot); + var belt = new float4[Asteroids]; + map.RegisterBelt(beltKey, belt); + zone.EvaluateBelt(beltKey, belt, DrawAhead.Time(zone, 0)); + map.SetFade(ship, 1f); + map.SetFade(other, 1f); + map.SetMinimapScale(2f); + map.Draw(zone, 0); + return new Fixture { Zone = zone, Map = map, Ship = ship, Other = other, ShipInstance = shipInstance, + OtherInstance = otherInstance, SunKey = sunKey, BeltKey = beltKey, Belt = belt, Roots = roots }; + } + + private static void Checks(Fixture f) + { + var (zone, map, ship, other, sunKey, beltKey, belt, roots) = (f.Zone, f.Map, f.Ship, f.Other, f.SunKey, f.BeltKey, f.Belt, f.Roots); + // Deep planet: the sun's field is deeper than 2000 below the plane, and its icon sits on the map plane inside both + // map cameras' clip range (minimap at y 10, map screen at y 1; near 0.3, far 1000, looking down). + var well = zone.GetHeight(DrawAhead.Orbit(zone, zone.PlanetInstances[sunKey].BodyData.Orbit.Key, 0), 0); + Require(well < -2000f, $"The fixture sun's well is {well}, not below -2000."); + Require(map.TryDrawn(sunKey, out var sunIcon), "The sun registered no icon."); + var y = sunIcon.GetPosition().y; + Require(y < 1f - .3f && y > 10f - 1000f && Mathf.Abs(y - MapPresenter.PlaneY) < .5f, $"The sun's icon is drawn at y {y}, not on the map plane."); + + // Axes: each icon sits at its sim position's planar x and z (a ship at (300, 200), the other at (-300, 100), the sun at + // its orbit), never swapped, and never at the 3D height (the ships ride at y 50 and -90, the sun's well is below -2000). + var shipAt = DrawAhead.Position(ship, 0); + Require(Mathf.Abs(shipAt.x - 300f) < 1e-3f && Mathf.Abs(shipAt.z - 200f) < 1e-3f, $"The ship's sim position is ({shipAt.x}, {shipAt.z}), not (300, 200)."); + var sunAt = DrawAhead.Orbit(zone, zone.PlanetInstances[sunKey].BodyData.Orbit.Key, 0); + Require(map.TryDrawn(ship, out var shipIcon, out _), "The ship registered no icon."); + Require(Mathf.Abs(shipIcon.GetPosition().x - 300f) < 1e-3f && Mathf.Abs(shipIcon.GetPosition().z - 200f) < 1e-3f, + $"The ship's icon is at ({shipIcon.GetPosition().x}, {shipIcon.GetPosition().z}), not its sim position (300, 200)."); + Require(map.TryDrawn(other, out var otherIcon, out _), "The second ship registered no icon."); + Require(Mathf.Abs(otherIcon.GetPosition().x + 300f) < 1e-3f && Mathf.Abs(otherIcon.GetPosition().z - 100f) < 1e-3f, + $"The second ship's icon is at ({otherIcon.GetPosition().x}, {otherIcon.GetPosition().z}), not (-300, 100)."); + Require(Mathf.Abs(sunIcon.GetPosition().x - sunAt.x) < 1e-3f && Mathf.Abs(sunIcon.GetPosition().z - sunAt.y) < 1e-3f, + $"The sun's icon is at ({sunIcon.GetPosition().x}, {sunIcon.GetPosition().z}), not its orbit ({sunAt.x}, {sunAt.y})."); + Require(Mathf.Abs(otherIcon.GetPosition().y - (MapPresenter.PlaneY + MapPresenter.ShipOffset)) < 1e-4f, "The second ship's icon took the 3D height."); + + // Tilted hull: the icon turns by the heading projected onto the map plane (40) times its authored rotation (identity here), with no roll or pitch. + var want = Quaternion.Euler(0, 40, 0); + Require(Quaternion.Angle(shipIcon.rotation, want) < .1f, $"The icon is rotated {shipIcon.rotation.eulerAngles}, not yaw 40 alone."); + Require(Vector3.Angle(shipIcon.rotation * Vector3.up, Vector3.up) < .1f, "The icon's up axis tilted with the hull."); + Require(Mathf.Abs(shipIcon.GetPosition().y - (MapPresenter.PlaneY + MapPresenter.ShipOffset)) < 1e-4f, "The ship's icon left the map plane."); + + // Every kind registers once: three icons drew, and no icon child remains under any registered transform. + Require(map.IconCount == 3 && map.IconDraws == 3, $"{map.IconCount} icons, {map.IconDraws} drawn; expected 3 and 3."); + Require(roots.GetComponentsInChildren(true).Length == 0, "An icon child remains under an entity or planet transform."); + + // A belt is one instanced draw of every asteroid, and its buffer holds this frame's floats. + Require(map.BeltDraws == 1 && map.LastBeltInstances == belt.Length, $"{map.BeltDraws} belt draws of {map.LastBeltInstances} instances; expected 1 of {belt.Length}."); + var read = new float4[belt.Length]; + map.ReadBelt(beltKey, read); + for (var i = 0; i < belt.Length; i++) + Require(read[i].x == belt[i].x && read[i].y == belt[i].y && read[i].z == belt[i].z && read[i].w == belt[i].w, $"Belt buffer differs from the frame's floats at {i}."); + + // Belts draw on the minimap with the map screen closed. + map.OpenMapScreen(false); + map.Draw(zone, 0); + Require(map.BeltDraws == 1, "A belt did not draw on the minimap with the map screen closed."); + + // Fade: half faded reaches the icon's colour alpha on the next draw; faded out draws nothing. + map.SetFade(ship, .5f); + map.Draw(zone, 0); + Require(map.TryDrawn(ship, out _, out var alpha) && Mathf.Abs(alpha - .4f) < 1e-3f, $"Icon alpha {alpha}, expected 0.8 * 0.5."); + map.SetFade(ship, 0f); + map.Draw(zone, 0); + Require(map.IconDraws == 2, $"{map.IconDraws} icons drew with one fully faded out; expected 2."); + } +} diff --git a/Assets/Scripts/Editor/MapPresenterSmoke.cs.meta b/Assets/Scripts/Editor/MapPresenterSmoke.cs.meta new file mode 100644 index 000000000..2fff0ea86 --- /dev/null +++ b/Assets/Scripts/Editor/MapPresenterSmoke.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 58982a1c397cc2f4d9706fd103af6654 \ No newline at end of file diff --git a/Assets/Scripts/Editor/NameTools.cs b/Assets/Scripts/Editor/NameTools.cs deleted file mode 100644 index a048dce89..000000000 --- a/Assets/Scripts/Editor/NameTools.cs +++ /dev/null @@ -1,93 +0,0 @@ -using System.Buffers.Text; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text.RegularExpressions; -using MessagePack; -using CultMath; -using UnityEngine; -using UnityEditor; -using Random = CultMath.Random; - -public class NameTools : EditorWindow -{ - public int NameGeneratorMinLength = 5; - public int NameGeneratorMaxLength = 10; - public int NameGeneratorOrder = 4; - private int minWordLength = 4; - private TextAsset nameFile; - private MarkovNameGenerator _nameGenerator; - private bool _stripNumberTokens; - - - // Add menu named "My Window" to the Window menu - [MenuItem("Window/Aetheria/Name Tools")] - static void Init() - { - // Get existing open window or if none, make a new one: - NameTools window = (NameTools)EditorWindow.GetWindow(typeof(NameTools)); - window.Show(); - } - - bool HasNonASCIIChars(string str) - { - return (System.Text.Encoding.UTF8.GetByteCount(str) != str.Length); - } - - void OnGUI() - { - - nameFile = (TextAsset) EditorGUILayout.ObjectField("Name File", nameFile, typeof(TextAsset), false); - minWordLength = EditorGUILayout.IntField("Minimum File Word Length", minWordLength); - NameGeneratorMinLength = EditorGUILayout.IntField("Generated Minimum Word Length", NameGeneratorMinLength); - NameGeneratorMaxLength = EditorGUILayout.IntField("Generated Maximum Word Length", NameGeneratorMaxLength); - NameGeneratorOrder = EditorGUILayout.IntField("Generator Order", NameGeneratorOrder); - _stripNumberTokens = GUILayout.Toggle(_stripNumberTokens, "Strip Number Tokens"); - - if (GUILayout.Button("Clean Name File")) - { - var lines = nameFile.text.Split('\n'); - using StreamWriter outputFile = new StreamWriter(Path.Combine(Application.dataPath, nameFile.name + ".csv")); - var names = new HashSet(); - foreach (var line in lines) - { - var tokens = line.Split(',', ' '); - foreach (var t in tokens) - { - if (!HasNonASCIIChars(t)) - { - var s = new string(t.Where(c => char.IsLetter(c) || c == '-' || c == '`' || c == '\'').ToArray()).Trim().Trim('`','-'); - if(s.Length >= minWordLength && !names.Contains(s)) - { - names.Add(s); - outputFile.WriteLine(s); - } - } - } - } - } - - if (GUILayout.Button("Process Name File") && nameFile != null) - { - var names = new HashSet(); - var lines = nameFile.text.Split('\n'); - foreach (var line in lines) - { - foreach(var word in line.ToUpperInvariant().Split(' ', ',', '.', '"')) - if (word.Length >= minWordLength && !names.Contains(word)) - names.Add(word); - } - Debug.Log($"Found {lines.Length} lines, with {names.Count} unique names!"); - var random = new Random(1337); - _nameGenerator = new MarkovNameGenerator(ref random, names, NameGeneratorOrder, NameGeneratorMinLength, NameGeneratorMaxLength); - } - - if (_nameGenerator != null) - { - if (GUILayout.Button("Generate Name")) - { - Debug.Log(_nameGenerator.NextName); - } - } - } -} \ No newline at end of file diff --git a/Assets/Scripts/Editor/RockMeshRadius.cs b/Assets/Scripts/Editor/RockMeshRadius.cs new file mode 100644 index 000000000..971284924 --- /dev/null +++ b/Assets/Scripts/Editor/RockMeshRadius.cs @@ -0,0 +1,112 @@ +using System; +using System.Linq; +using UnityEditor; +using UnityEditor.Build; +using UnityEditor.Build.Reporting; +using UnityEditor.SceneManagement; +using UnityEngine; + +// The radius of each rock mesh ZoneRenderer draws (ruling rock-meshes-by-size): the farthest vertex from the mesh origin, which bounds the +// mesh's top under any rotation. DrawAhead.RockScale divides the gameplay radius by it, so the drawn rock is the gameplay rock. It is stored on +// InstancedMesh.Radius in ARPG.unity, because a build cannot read vertices of a mesh without Read/Write import. +// +// Unity -batchmode -nographics -projectPath -executeMethod Aetheria.EditorTools.RockMeshRadius.Fill -logFile +// Unity -batchmode -nographics -projectPath -executeMethod Aetheria.EditorTools.RockMeshRadius.Verify -logFile +// +// Fill measures every AsteroidMeshes entry and saves the scene; Verify fails (exit 1) when any stored radius is not the measured one. +// RockMeshRadiusBuildGate runs the same check before every player build and fails the build, so a mesh with no filled radius cannot ship; +// Gate runs that gate in batch mode. +// Unity -batchmode -nographics -projectPath -executeMethod Aetheria.EditorTools.RockMeshRadius.Gate -logFile +namespace Aetheria.EditorTools +{ + public static class RockMeshRadius + { + private const string Scene = "Assets/Scenes/ARPG.unity"; + private const float Tolerance = 1e-4f; + + public static float Measure(Mesh mesh) => Mathf.Sqrt(mesh.vertices.Max(v => v.sqrMagnitude)); + + public static void Fill() => Batch(() => + { + var scene = EditorSceneManager.OpenScene(Scene, OpenSceneMode.Single); + var (renderer, meshes, measured) = Load(scene); + for (var i = 0; i < meshes.Length; i++) meshes[i].Radius = measured[i]; + EditorUtility.SetDirty(renderer); + EditorSceneManager.MarkSceneDirty(scene); + if (!EditorSceneManager.SaveScene(scene)) throw new InvalidOperationException("The scene did not save."); + return Summary("filled", measured); + }); + + public static void Verify() => Batch(() => Check(OpenSceneMode.Single)); + + // The build gate's own entry in batch mode: exit 1 exactly when a build would fail (RockMeshRadiusBuildGate). + public static void Gate() => Batch(() => + { + try { new RockMeshRadiusBuildGate().OnPreprocessBuild(null); } + catch (BuildFailedException failure) { throw new InvalidOperationException(failure.Message); } + return "the build gate passes"; + }); + + // Throws unless every AsteroidMeshes entry of ARPG.unity has a stored radius equal to its mesh's measured one (a zero radius never does). + public static string Check(OpenSceneMode mode) + { + var scene = EditorSceneManager.OpenScene(Scene, mode); + try + { + var (_, meshes, measured) = Load(scene); + var failures = meshes.Select((m, i) => (m, i)).Where(p => !(measured[p.i] > 0f) || Mathf.Abs(p.m.Radius - measured[p.i]) > Tolerance).ToArray(); + if (failures.Length > 0) + throw new InvalidOperationException("InstancedMesh.Radius differs from the measured one, or is unset, on mesh (run RockMeshRadius.Fill): " + string.Join(", ", + failures.Select(f => f.m.Mesh.name))); + return Summary("ok", measured); + } + finally + { + if (mode == OpenSceneMode.Additive) EditorSceneManager.CloseScene(scene, true); + } + } + + private static (ZoneRenderer renderer, InstancedMesh[] meshes, float[] measured) Load(UnityEngine.SceneManagement.Scene scene) + { + var renderer = UnityEngine.Object.FindObjectsByType(FindObjectsInactive.Include, FindObjectsSortMode.None) + .Single(r => r.gameObject.scene == scene); + var meshes = renderer.AsteroidMeshes; + if (meshes == null || meshes.Length == 0) throw new InvalidOperationException("ARPG.unity's ZoneRenderer has no AsteroidMeshes."); + var bad = meshes.Where(m => m.Mesh == null).ToArray(); + if (bad.Length > 0) throw new InvalidOperationException($"{bad.Length} AsteroidMeshes entries have no mesh."); + return (renderer, meshes, meshes.Select(m => Measure(m.Mesh)).ToArray()); + } + + private static string Summary(string what, float[] measured) + { + var sorted = measured.OrderBy(r => r).ToArray(); + return $"{what}: {sorted.Length} meshes, radius min {sorted[0]:F3} median {sorted[sorted.Length / 2]:F3} max {sorted[^1]:F3}"; + } + + private static void Batch(Func run) + { + try + { + Debug.Log($"[RockMeshRadius] {run()}"); + EditorApplication.Exit(0); + } + catch (Exception exception) + { + Debug.LogException(exception); + EditorApplication.Exit(1); + } + } + } + + // A mesh in AsteroidMeshes with no filled radius must not ship: the build fails, naming the field. + public class RockMeshRadiusBuildGate : IPreprocessBuildWithReport + { + public int callbackOrder => 0; + + public void OnPreprocessBuild(BuildReport report) + { + try { RockMeshRadius.Check(OpenSceneMode.Additive); } + catch (InvalidOperationException failure) { throw new BuildFailedException(failure.Message); } + } + } +} diff --git a/Assets/Scripts/Editor/RockMeshRadius.cs.meta b/Assets/Scripts/Editor/RockMeshRadius.cs.meta new file mode 100644 index 000000000..f95fec963 --- /dev/null +++ b/Assets/Scripts/Editor/RockMeshRadius.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 9ea93f3d164825c4b99a0d07f24d5cf6 \ No newline at end of file diff --git a/Assets/Scripts/Editor/ScenarioPickerCapture.cs b/Assets/Scripts/Editor/ScenarioPickerCapture.cs new file mode 100644 index 000000000..b39dd7a1b --- /dev/null +++ b/Assets/Scripts/Editor/ScenarioPickerCapture.cs @@ -0,0 +1,108 @@ +using System; +using System.Collections.Generic; +using System.IO; +using UnityEditor; +using UnityEditor.SceneManagement; +using UnityEngine; +using UnityEngine.UI; + +// A render of the New Game screen as the game builds it: the real Main Menu scene's panel prototype, docked and filled +// by ScenarioPicker.Dock and ScenarioPicker.Show with every scenario group, on a plain dark background (the cloud +// backdrop is a play-mode renderer). Writes /Temp/scenario-picker.png at 1920x1080, or the path after -pngOut (Unity empties Temp on exit). +// +// Unity -batchmode -projectPath -executeMethod ScenarioPickerCapture.Run [-pngOut ] -logFile +// +// Needs a GPU device; do not pass -nographics or -quit: Run exits the Editor itself, 0 on success and 1 on any failure. +public static class ScenarioPickerCapture +{ + private const int Width = 1920, Height = 1080; + + public static void Run() + { + try + { + Capture(); + EditorApplication.Exit(0); + } + catch (Exception exception) + { + Debug.LogException(exception); + EditorApplication.Exit(1); + } + } + + // The menu's two panes built the way MainMenu.Start builds them, against the Main Menu scene. + internal static (MainMenu menu, PropertiesPanel list, PropertiesPanel detail) Build() + { + EditorSceneManager.OpenScene("Assets/Scenes/Main Menu.unity", OpenSceneMode.Single); + var menu = UnityEngine.Object.FindObjectsByType(FindObjectsInactive.Include, FindObjectsSortMode.None)[0]; + menu.PanelPrototype.gameObject.SetActive(false); + var list = menu.PanelPrototype.Instantiate(); + var detail = menu.PanelPrototype.Instantiate(); + // Edit mode runs no Awake, which is what activates each row a panel adds. + list.Awake(); + detail.Awake(); + ScenarioPicker.Dock(detail, list); + return (menu, list, detail); + } + + internal static List<(string label, Scenario[] scenarios)> AllGroups() => new List<(string label, Scenario[] scenarios)> + { + ("modes", Scenarios.Modes), ("development", Scenarios.Development), ("test arenas", Scenarios.Tests) + }; + + private static void Capture() + { + var (menu, list, detail) = Build(); + menu.Dialog.gameObject.SetActive(false); + list.Title.text = MainMenu.TitleSubtitle("new game", "scenarios"); + ScenarioPicker.Show(list, detail, AllGroups(), _ => { }, () => { }, menu.Dialog.Confirm); + list.RefreshValues(); + detail.RefreshValues(); + + var canvas = menu.GetComponentInParent(true).rootCanvas; + var target = new RenderTexture(Width, Height, 24, RenderTextureFormat.ARGB32); + var cameraObject = new GameObject("ScenarioPickerCapture camera"); + var camera = cameraObject.AddComponent(); + camera.orthographic = true; + camera.orthographicSize = 5; + camera.clearFlags = CameraClearFlags.SolidColor; + camera.backgroundColor = new Color(.04f, .05f, .08f); + camera.cullingMask = 1 << LayerMask.NameToLayer("UI"); + camera.targetTexture = target; + canvas.renderMode = RenderMode.ScreenSpaceCamera; + canvas.worldCamera = camera; + canvas.planeDistance = 10; + canvas.gameObject.SetActive(true); + Canvas.ForceUpdateCanvases(); + LayoutRebuilder.ForceRebuildLayoutImmediate((RectTransform) list.transform); + LayoutRebuilder.ForceRebuildLayoutImmediate((RectTransform) detail.transform); + foreach (var text in list.transform.GetComponentsInChildren()) + text.ForceMeshUpdate(); + Canvas.ForceUpdateCanvases(); + list.Content.GetComponentInParent().onValueChanged.Invoke(Vector2.zero); + camera.Render(); + + var previous = RenderTexture.active; + RenderTexture.active = target; + var read = new Texture2D(Width, Height, TextureFormat.RGBA32, false); + read.ReadPixels(new Rect(0, 0, Width, Height), 0, 0); + RenderTexture.active = previous; + + var background = read.GetPixel(0, 0); + var differing = 0; + foreach (var pixel in read.GetPixels32()) + if (Mathf.Abs(pixel.r / 255f - background.r) + Mathf.Abs(pixel.g / 255f - background.g) + Mathf.Abs(pixel.b / 255f - background.b) > .05f) + differing++; + if (differing < Width * Height / 100) + throw new InvalidOperationException($"The capture is uniform: only {differing} pixels differ from the background."); + + var path = Path.GetFullPath(Path.Combine(Application.dataPath, "..", "Temp", "scenario-picker.png")); + var args = Environment.GetCommandLineArgs(); + var outIndex = Array.IndexOf(args, "-pngOut"); + if (outIndex >= 0) path = Path.GetFullPath(args[outIndex + 1]); + Directory.CreateDirectory(Path.GetDirectoryName(path)); + File.WriteAllBytes(path, read.EncodeToPNG()); + Debug.Log($"[ScenarioPickerCapture] {path} ({differing} of {Width * Height} pixels differ from the background)"); + } +} diff --git a/Assets/Scripts/Editor/ScenarioPickerCapture.cs.meta b/Assets/Scripts/Editor/ScenarioPickerCapture.cs.meta new file mode 100644 index 000000000..ebeb742e8 --- /dev/null +++ b/Assets/Scripts/Editor/ScenarioPickerCapture.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 2e79f280179150e4080250c45e07cd69 \ No newline at end of file diff --git a/Assets/Scripts/Editor/ScenarioPickerVerify.cs b/Assets/Scripts/Editor/ScenarioPickerVerify.cs new file mode 100644 index 000000000..6816cafc9 --- /dev/null +++ b/Assets/Scripts/Editor/ScenarioPickerVerify.cs @@ -0,0 +1,265 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using TMPro; +using UnityEditor; +using UnityEngine; +using UnityEngine.EventSystems; +using UnityEngine.UI; + +// The picker's selection and keyboard rules, driven through the events the game delivers: Move and Cancel reach the +// focused Launch button through ExecuteEvents, as the Input System UI module sends them, and a click is Button.onClick. +// +// Unity -batchmode -projectPath -executeMethod ScenarioPickerVerify.Run -logFile +// +// Exits the Editor itself, 0 when every rule holds and 1 on the first that does not. +public static class ScenarioPickerVerify +{ + private sealed class Fake : Scenario + { + private readonly uint _seed; + private readonly bool _ambient; + public Fake(string name, uint seed = 0, bool ambient = true) { Name = name; _seed = seed; _ambient = ambient; } + public override string Name { get; } + public override string Id => Name.ToLowerInvariant(); + public override string Brief => $"brief of {Name}"; + public override uint Seed => _seed; + public override bool Ambient => _ambient; + public override Galaxy Generate(GalaxyStage stage) => throw new NotSupportedException(); + public override void Stage(ScenarioStage stage) => throw new NotSupportedException(); + } + + private sealed class Screen + { + public ScenarioPicker Picker; + public PropertiesPanel List, Detail; + public Button[] Rows; + public Button Back, Launch; + public readonly List Launched = new List(); + public int Backs; + public Scenario[] A, B, C; + } + + public static void Run() + { + try + { + SelectionFollowsClicksAndArrows(); + ArrowsStopAtTheEnds(); + LeftAndRightAreIgnored(); + LaunchIsOnePathAndFocusClears(); + CancelAndBackAreOnePath(); + DetailPaneFollowsSelection(); + OneGroupHasNoSectionLabel(); + LaunchesOnceHoweverItIsReached(); + ArrowingThroughTheRealListKeepsTheSelectionVisible(); + Debug.Log("[ScenarioPickerVerify] ok"); + EditorApplication.Exit(0); + } + catch (Exception exception) + { + Debug.LogException(exception); + EditorApplication.Exit(1); + } + } + + private static void Require(bool condition, string what) + { + if (!condition) throw new InvalidOperationException(what); + } + + private static Screen Build(bool oneGroup = false, bool real = false) + { + var (menu, list, detail) = ScenarioPickerCapture.Build(); + // Build opens the scene afresh, which destroys the previous EventSystem. + var events = new GameObject("verify EventSystem").AddComponent(); + // Edit mode never calls OnEnable, which is what registers an EventSystem as current. + typeof(EventSystem).GetMethod("OnEnable", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).Invoke(events, null); + var screen = new Screen + { + List = list, Detail = detail, + A = new Scenario[] { new Fake("Alpha", 7), new Fake("Beta") }, + B = new Scenario[] { new Fake("Gamma", ambient: false) }, + C = new Scenario[] { new Fake("Delta"), new Fake("Echo") } + }; + var groups = real ? ScenarioPickerCapture.AllGroups() : oneGroup + ? new List<(string label, Scenario[] scenarios)> { ("modes", screen.A) } + : new List<(string label, Scenario[] scenarios)> { ("modes", screen.A), ("development", screen.B), ("test arenas", screen.C) }; + // The menu builds a panel while it is inactive and shows it afterwards; the picker must find its scroll all the same. + if (real) list.gameObject.SetActive(false); + screen.Picker = ScenarioPicker.Show(list, detail, groups, screen.Launched.Add, () => screen.Backs++, menu.Dialog.Confirm); + var buttons = list.GetComponentsInChildren(false).Where(button => !button.transform.IsChildOf(detail.transform)).Select(button => button.Button).ToArray(); + screen.Rows = buttons.Take(buttons.Length - 1).ToArray(); + screen.Back = buttons.Last(); + screen.Launch = detail.GetComponentsInChildren - private readonly IVertex[] Vertices; - /// - /// The positions - /// - private float[] Positions; - /// - /// The vertex marks - /// - private readonly bool[] VertexVisited; - - private readonly int NumberOfVertices; - - /* - * The triangulation faces are represented in a single pool for objects that are being reused. - * This allows for represent the faces as integers and significantly speeds up many computations. - * - AffectedFaceFlags are used to mark affected faces/ - */ - /// - /// The face pool - /// - internal ConvexFaceInternal[] FacePool; - /// - /// The affected face flags - /// - internal bool[] AffectedFaceFlags; - - /// - /// Used to track the size of the current hull in the Update/RollbackCenter functions. - /// - private int ConvexHullSize; - - /// - /// A list of faces that that are not a part of the final convex hull and still need to be processed. - /// - private readonly FaceList UnprocessedFaces; - - /// - /// A list of faces that form the convex hull. - /// - private readonly IndexBuffer ConvexFaces; - - /// - /// The vertex that is currently being processed. - /// - private int CurrentVertex; - - /// - /// A helper variable to determine the furthest vertex for a particular convex face. - /// - private double MaxDistance; - - /// - /// A helper variable to help determine the index of the vertex that is furthest from the face that is currently being - /// processed. - /// - private int FurthestVertex; - - /// - /// The centroid of the currently computed hull. - /// - private readonly float[] Center; - - /* - * Helper arrays to store faces for adjacency update. - * This is just to prevent unnecessary allocations. - */ - /// - /// The update buffer - /// - private readonly int[] UpdateBuffer; - /// - /// The update indices - /// - private readonly int[] UpdateIndices; - - /// - /// Used to determine which faces need to be updated at each step of the algorithm. - /// - private readonly IndexBuffer TraverseStack; - - /// - /// Used for VerticesBeyond for faces that are on the convex hull. - /// - private readonly IndexBuffer EmptyBuffer; - - /// - /// Used to determine which vertices are "above" (or "beyond") a face - /// - private IndexBuffer BeyondBuffer; - - /// - /// Stores faces that are visible from the current vertex. - /// - private readonly IndexBuffer AffectedFaceBuffer; - - /// - /// Stores faces that form a "cone" created by adding new vertex. - /// - private readonly SimpleList ConeFaceBuffer; - - /// - /// Stores a list of "singular" (or "generate", "planar", etc.) vertices that cannot be part of the hull. - /// - private readonly HashSet SingularVertices; - - /// - /// The connector table helps to determine the adjacency of convex faces. - /// Hashing is used instead of pairwise comparison. This significantly speeds up the computations, - /// especially for higher dimensions. - /// - private readonly ConnectorList[] ConnectorTable; - - /// - /// Manages the memory allocations and storage of unused objects. - /// Saves the garbage collector a lot of work. - /// - private readonly ObjectManager ObjectManager; - - /// - /// Helper class for handling math related stuff. - /// - private readonly MathHelper mathHelper; - private readonly List[] boundingBoxPoints; - private int indexOfDimensionWithLeastExtremes; - private readonly float[] minima; - private readonly float[] maxima; - #endregion - } -} \ No newline at end of file diff --git a/Assets/Scripts/ServerShared/NIH/MIConvexHull/ConvexHull/ConvexHullAlgorithm.Initialize.cs.meta b/Assets/Scripts/ServerShared/NIH/MIConvexHull/ConvexHull/ConvexHullAlgorithm.Initialize.cs.meta deleted file mode 100644 index 35319f3c2..000000000 --- a/Assets/Scripts/ServerShared/NIH/MIConvexHull/ConvexHull/ConvexHullAlgorithm.Initialize.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 48bd00cb6ec8d244f90e1c1608f39074 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scripts/ServerShared/NIH/MIConvexHull/ConvexHull/ConvexHullAlgorithm.MainLoop.cs b/Assets/Scripts/ServerShared/NIH/MIConvexHull/ConvexHull/ConvexHullAlgorithm.MainLoop.cs deleted file mode 100644 index 058b82640..000000000 --- a/Assets/Scripts/ServerShared/NIH/MIConvexHull/ConvexHull/ConvexHullAlgorithm.MainLoop.cs +++ /dev/null @@ -1,635 +0,0 @@ -/****************************************************************************** - * - * The MIT License (MIT) - * - * MIConvexHull, Copyright (c) 2015 David Sehnal, Matthew Campbell - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - *****************************************************************************/ - -using System.Collections.Generic; - -namespace MIConvexHull -{ - /* - * Main part of the algorithm - * Basic idea: - * - Create the initial hull (done in Initialize.cs) - * - * For each face there are "vertices beyond" which are "visible" from it. - * If there are no such vertices, the face is on the hull. - * - * - While there is at least one face with at least one "vertex beyond": - * * Pick the furthest beyond vertex - * * For this vertex: - * > find all faces that are visible from it (TagAffectedFaces) - * > remove them and replace them with a "cone" created by the vertex and the boundary - * of the affected faces, and for each new face, compute "beyond vertices" - * (CreateCone + CommitCone) - * - * + Implement it in way that is fast, but hard to understand and maintain. - */ - - /// - /// Class ConvexHullAlgorithm. - /// - internal partial class ConvexHullAlgorithm - { - /// - /// Tags all faces seen from the current vertex with 1. - /// - /// The current face. - private void TagAffectedFaces(ConvexFaceInternal currentFace) - { - AffectedFaceBuffer.Clear(); - AffectedFaceBuffer.Add(currentFace.Index); - TraverseAffectedFaces(currentFace.Index); - } - - /// - /// Recursively traverse all the relevant faces. - /// - /// The current face. - private void TraverseAffectedFaces(int currentFace) - { - TraverseStack.Clear(); - TraverseStack.Push(currentFace); - AffectedFaceFlags[currentFace] = true; - - while (TraverseStack.Count > 0) - { - var top = FacePool[TraverseStack.Pop()]; - for (var i = 0; i < NumOfDimensions; i++) - { - var adjFace = top.AdjacentFaces[i]; - - if (!AffectedFaceFlags[adjFace] && - mathHelper.GetVertexDistance(CurrentVertex, FacePool[adjFace]) >= PlaneDistanceTolerance) - { - AffectedFaceBuffer.Add(adjFace); - AffectedFaceFlags[adjFace] = true; - TraverseStack.Push(adjFace); - } - } - } - } - - /// - /// Creates a new deferred face. - /// - /// The face. - /// Index of the face. - /// The pivot. - /// Index of the pivot. - /// The old face. - /// DeferredFace. - private DeferredFace MakeDeferredFace(ConvexFaceInternal face, int faceIndex, ConvexFaceInternal pivot, - int pivotIndex, ConvexFaceInternal oldFace) - { - var ret = ObjectManager.GetDeferredFace(); - - ret.Face = face; - ret.FaceIndex = faceIndex; - ret.Pivot = pivot; - ret.PivotIndex = pivotIndex; - ret.OldFace = oldFace; - - return ret; - } - - /// - /// Connect faces using a connector. - /// - /// The connector. - private void ConnectFace(FaceConnector connector) - { - var index = connector.HashCode % Constants.ConnectorTableSize; - var list = ConnectorTable[index]; - - for (var current = list.First; current != null; current = current.Next) - { - if (FaceConnector.AreConnectable(connector, current, NumOfDimensions)) - { - list.Remove(current); - FaceConnector.Connect(current, connector); - current.Face = null; - connector.Face = null; - ObjectManager.DepositConnector(current); - ObjectManager.DepositConnector(connector); - return; - } - } - - list.Add(connector); - } - - /// - /// Removes the faces "covered" by the current vertex and adds the newly created ones. - /// - /// true if XXXX, false otherwise. - private bool CreateCone() - { - var currentVertexIndex = CurrentVertex; - ConeFaceBuffer.Clear(); - - for (var fIndex = 0; fIndex < AffectedFaceBuffer.Count; fIndex++) - { - var oldFaceIndex = AffectedFaceBuffer[fIndex]; - var oldFace = FacePool[oldFaceIndex]; - - // Find the faces that need to be updated - var updateCount = 0; - for (var i = 0; i < NumOfDimensions; i++) - { - var af = oldFace.AdjacentFaces[i]; - if (!AffectedFaceFlags[af]) // Tag == false when oldFaces does not contain af - { - UpdateBuffer[updateCount] = af; - UpdateIndices[updateCount] = i; - ++updateCount; - } - } - - for (var i = 0; i < updateCount; i++) - { - var adjacentFace = FacePool[UpdateBuffer[i]]; - - var oldFaceAdjacentIndex = 0; - var adjFaceAdjacency = adjacentFace.AdjacentFaces; - for (var j = 0; j < adjFaceAdjacency.Length; j++) - { - if (oldFaceIndex == adjFaceAdjacency[j]) - { - oldFaceAdjacentIndex = j; - break; - } - } - - var forbidden = UpdateIndices[i]; // Index of the face that corresponds to this adjacent face - - int oldVertexIndex; - int[] vertices; - - var newFaceIndex = ObjectManager.GetFace(); - var newFace = FacePool[newFaceIndex]; - vertices = newFace.Vertices; - for (var j = 0; j < NumOfDimensions; j++) vertices[j] = oldFace.Vertices[j]; - oldVertexIndex = vertices[forbidden]; - - int orderedPivotIndex; - - // correct the ordering - if (currentVertexIndex < oldVertexIndex) - { - orderedPivotIndex = 0; - for (var j = forbidden - 1; j >= 0; j--) - { - if (vertices[j] > currentVertexIndex) vertices[j + 1] = vertices[j]; - else - { - orderedPivotIndex = j + 1; - break; - } - } - } - else - { - orderedPivotIndex = NumOfDimensions - 1; - for (var j = forbidden + 1; j < NumOfDimensions; j++) - { - if (vertices[j] < currentVertexIndex) vertices[j - 1] = vertices[j]; - else - { - orderedPivotIndex = j - 1; - break; - } - } - } - - vertices[orderedPivotIndex] = CurrentVertex; - - if (!mathHelper.CalculateFacePlane(newFace, Center)) - { - return false; - } - - ConeFaceBuffer.Add(MakeDeferredFace(newFace, orderedPivotIndex, adjacentFace, oldFaceAdjacentIndex, - oldFace)); - } - } - - return true; - } - - /// - /// Commits a cone and adds a vertex to the convex hull. - /// - private void CommitCone() - { - // Fill the adjacency. - for (var i = 0; i < ConeFaceBuffer.Count; i++) - { - var face = ConeFaceBuffer[i]; - - var newFace = face.Face; - var adjacentFace = face.Pivot; - var oldFace = face.OldFace; - var orderedPivotIndex = face.FaceIndex; - - newFace.AdjacentFaces[orderedPivotIndex] = adjacentFace.Index; - adjacentFace.AdjacentFaces[face.PivotIndex] = newFace.Index; - - // let there be a connection. - for (var j = 0; j < NumOfDimensions; j++) - { - if (j == orderedPivotIndex) continue; - var connector = ObjectManager.GetConnector(); - connector.Update(newFace, j, NumOfDimensions); - ConnectFace(connector); - } - - // the id adjacent face on the hull? If so, we can use simple method to find beyond vertices. - if (adjacentFace.VerticesBeyond.Count == 0) - FindBeyondVertices(newFace, oldFace.VerticesBeyond); - // it is slightly more effective if the face with the lower number of beyond vertices comes first. - else if (adjacentFace.VerticesBeyond.Count < oldFace.VerticesBeyond.Count) - FindBeyondVertices(newFace, adjacentFace.VerticesBeyond, oldFace.VerticesBeyond); - else - FindBeyondVertices(newFace, oldFace.VerticesBeyond, adjacentFace.VerticesBeyond); - - // This face will definitely lie on the hull - if (newFace.VerticesBeyond.Count == 0) - { - ConvexFaces.Add(newFace.Index); - UnprocessedFaces.Remove(newFace); - ObjectManager.DepositVertexBuffer(newFace.VerticesBeyond); - newFace.VerticesBeyond = EmptyBuffer; - } - else // Add the face to the list - { - UnprocessedFaces.Add(newFace); - } - - // recycle the object. - ObjectManager.DepositDeferredFace(face); - } - - // Recycle the affected faces. - for (var fIndex = 0; fIndex < AffectedFaceBuffer.Count; fIndex++) - { - var face = AffectedFaceBuffer[fIndex]; - UnprocessedFaces.Remove(FacePool[face]); - ObjectManager.DepositFace(face); - } - } - - /// - /// Check whether the vertex v is beyond the given face. If so, add it to beyondVertices. - /// - /// The face. - /// The beyond vertices. - /// The v. - private void IsBeyond(ConvexFaceInternal face, IndexBuffer beyondVertices, int v) - { - var distance = mathHelper.GetVertexDistance(v, face); - if (distance >= PlaneDistanceTolerance) - { - if (distance > MaxDistance) - { - // If it's within the tolerance distance, use the lex. larger point - if (distance - MaxDistance < PlaneDistanceTolerance) - { // todo: why is this LexCompare necessary. Would seem to favor x over y over z (etc.)? - if (LexCompare(v, FurthestVertex) > 0) - { - MaxDistance = distance; - FurthestVertex = v; - } - } - else - { - MaxDistance = distance; - FurthestVertex = v; - } - } - beyondVertices.Add(v); - } - } - - - /// - /// Compares the values of two vertices. The return value (-1, 0 or +1) are found - /// by first checking the first coordinate and then progressing through the rest. - /// In this way {2, 8} will be a "-1" (less than) {3, 1}. - /// - /// The base vertex index, u. - /// The compared vertex index, v. - /// System.Int32. - private int LexCompare(int u, int v) - { - int uOffset = u * NumOfDimensions, vOffset = v * NumOfDimensions; - for (var i = 0; i < NumOfDimensions; i++) - { - double x = Positions[uOffset + i], y = Positions[vOffset + i]; - var comp = x.CompareTo(y); - if (comp != 0) return comp; - } - return 0; - } - - - /// - /// Used by update faces. - /// - /// The face. - /// The beyond. - /// The beyond1. - private void FindBeyondVertices(ConvexFaceInternal face, IndexBuffer beyond, IndexBuffer beyond1) - { - var beyondVertices = BeyondBuffer; - - MaxDistance = double.NegativeInfinity; - FurthestVertex = 0; - int v; - - for (var i = 0; i < beyond1.Count; i++) VertexVisited[beyond1[i]] = true; - VertexVisited[CurrentVertex] = false; - for (var i = 0; i < beyond.Count; i++) - { - v = beyond[i]; - if (v == CurrentVertex) continue; - VertexVisited[v] = false; - IsBeyond(face, beyondVertices, v); - } - - for (var i = 0; i < beyond1.Count; i++) - { - v = beyond1[i]; - if (VertexVisited[v]) IsBeyond(face, beyondVertices, v); - } - - face.FurthestVertex = FurthestVertex; - - // Pull the old switch a roo (switch the face beyond buffers) - var temp = face.VerticesBeyond; - face.VerticesBeyond = beyondVertices; - if (temp.Count > 0) temp.Clear(); - BeyondBuffer = temp; - } - - /// - /// Finds the beyond vertices. - /// - /// The face. - /// The beyond. - private void FindBeyondVertices(ConvexFaceInternal face, IndexBuffer beyond) - { - var beyondVertices = BeyondBuffer; - - MaxDistance = double.NegativeInfinity; - FurthestVertex = 0; - int v; - - for (var i = 0; i < beyond.Count; i++) - { - v = beyond[i]; - if (v == CurrentVertex) continue; - IsBeyond(face, beyondVertices, v); - } - - face.FurthestVertex = FurthestVertex; - - // Pull the old switch a roo (switch the face beyond buffers) - var temp = face.VerticesBeyond; - face.VerticesBeyond = beyondVertices; - if (temp.Count > 0) temp.Clear(); - BeyondBuffer = temp; - } - - /// - /// Recalculates the centroid of the current hull. - /// - private void UpdateCenter() - { - for (var i = 0; i < NumOfDimensions; i++) Center[i] *= ConvexHullSize; - ConvexHullSize += 1; - var f = 1.0f / ConvexHullSize; - var co = CurrentVertex * NumOfDimensions; - for (var i = 0; i < NumOfDimensions; i++) Center[i] = f * (Center[i] + Positions[co + i]); - } - - /// - /// Removes the last vertex from the center. - /// - private void RollbackCenter() - { - for (var i = 0; i < NumOfDimensions; i++) Center[i] *= ConvexHullSize; - ConvexHullSize -= 1; - var f = ConvexHullSize > 0 ? 1.0f / ConvexHullSize : 0.0f; - var co = CurrentVertex * NumOfDimensions; - for (var i = 0; i < NumOfDimensions; i++) Center[i] = f * (Center[i] - Positions[co + i]); - } - - /// - /// Handles singular vertex. - /// - private void HandleSingular() - { - RollbackCenter(); - SingularVertices.Add(CurrentVertex); - - // This means that all the affected faces must be on the hull and that all their "vertices beyond" are singular. - for (var fIndex = 0; fIndex < AffectedFaceBuffer.Count; fIndex++) - { - var face = FacePool[AffectedFaceBuffer[fIndex]]; - var vb = face.VerticesBeyond; - for (var i = 0; i < vb.Count; i++) - { - SingularVertices.Add(vb[i]); - } - - ConvexFaces.Add(face.Index); - UnprocessedFaces.Remove(face); - ObjectManager.DepositVertexBuffer(face.VerticesBeyond); - face.VerticesBeyond = EmptyBuffer; - } - } - - /// - /// Get a vertex coordinate. In order to reduce speed, all vertex coordinates - /// have been placed in a single array. - /// - /// The vertex index. - /// The index of the dimension. - /// System.Double. - private float GetCoordinate(int vIndex, int dimension) - { - return Positions[vIndex * NumOfDimensions + dimension]; - } - - #region Returning the Results in the proper format - - /// - /// Gets the hull vertices. - /// - /// The type of the t vertex. - /// The data. - /// TVertex[]. - private TVertex[] GetHullVertices(IList data) - { - var cellCount = ConvexFaces.Count; - var hullVertexCount = 0; - - for (var i = 0; i < NumberOfVertices; i++) VertexVisited[i] = false; - - for (var i = 0; i < cellCount; i++) - { - var vs = FacePool[ConvexFaces[i]].Vertices; - for (var j = 0; j < vs.Length; j++) - { - var v = vs[j]; - if (!VertexVisited[v]) - { - VertexVisited[v] = true; - hullVertexCount++; - } - } - } - - var result = new TVertex[hullVertexCount]; - for (var i = 0; i < NumberOfVertices; i++) - { - if (VertexVisited[i]) result[--hullVertexCount] = data[i]; - } - - return result; - } - - /// - /// Finds the convex hull and creates the TFace objects. - /// - /// The type of the t face. - /// The type of the t vertex. - /// TFace[]. - private TFace[] GetConvexFaces() - where TFace : ConvexFace, new() - where TVertex : IVertex - { - var faces = ConvexFaces; - var cellCount = faces.Count; - var cells = new TFace[cellCount]; - - for (var i = 0; i < cellCount; i++) - { - var face = FacePool[faces[i]]; - var vertices = new TVertex[NumOfDimensions]; - for (var j = 0; j < NumOfDimensions; j++) - { - vertices[j] = (TVertex)Vertices[face.Vertices[j]]; - } - - cells[i] = new TFace - { - Vertices = vertices, - Adjacency = new TFace[NumOfDimensions], - Normal = IsLifted ? null : face.Normal - }; - face.Tag = i; - } - - for (var i = 0; i < cellCount; i++) - { - var face = FacePool[faces[i]]; - var cell = cells[i]; - for (var j = 0; j < NumOfDimensions; j++) - { - if (face.AdjacentFaces[j] < 0) continue; - cell.Adjacency[j] = cells[FacePool[face.AdjacentFaces[j]].Tag]; - } - - // Fix the vertex orientation. - if (face.IsNormalFlipped) - { - var tempVert = cell.Vertices[0]; - cell.Vertices[0] = cell.Vertices[NumOfDimensions - 1]; - cell.Vertices[NumOfDimensions - 1] = tempVert; - - var tempAdj = cell.Adjacency[0]; - cell.Adjacency[0] = cell.Adjacency[NumOfDimensions - 1]; - cell.Adjacency[NumOfDimensions - 1] = tempAdj; - } - } - - return cells; - } - - /// - /// For 2D only: Returns the result in counter-clockwise order starting with the element with the lowest X value. - /// If there are multiple vertices with the same minimum X, then the one with the lowest Y is chosen. - /// - /// The type of the vertex. - /// The type of the face. - /// The data. - /// - private ConvexHull Return2DResultInOrder(IList data) - where TVertex : IVertex - where TFace : ConvexFace, new() - { - TFace[] faces = GetConvexFaces(); - var numPoints = faces.Length; - var orderDictionary = new Dictionary(); - foreach (var face in faces) - orderDictionary.Add(face.Vertices[1], face); - var firstPoint = faces[0].Vertices[1]; - var nextPoint = faces[0].Vertices[0]; - var orderedPointList = new List(); - orderedPointList.Add(firstPoint); - var orderedFaceList = new List(); - orderedFaceList.Add(faces[1]); - var lowestXMinIndex = 0; - var k = 0; - while (!nextPoint.Equals(firstPoint)) - { - orderedPointList.Add(nextPoint); - var nextFace = orderDictionary[nextPoint]; - orderedFaceList.Add(nextFace); - if (nextPoint.Position[0] < orderedPointList[lowestXMinIndex].Position[0] - || (nextPoint.Position[0] == orderedPointList[lowestXMinIndex].Position[0] - && nextPoint.Position[1] <= orderedPointList[lowestXMinIndex].Position[1])) - lowestXMinIndex = k; - k++; - nextPoint = nextFace.Vertices[0]; - } - TVertex[] points = new TVertex[numPoints]; - for (int i = 0; i < numPoints; i++) - { - var j = (i + lowestXMinIndex) % numPoints; - points[i] = orderedPointList[j]; - faces[i] = orderedFaceList[j]; - } - return new ConvexHull - { - Points = points, - Faces = faces - }; - } - - #endregion - } -} \ No newline at end of file diff --git a/Assets/Scripts/ServerShared/NIH/MIConvexHull/ConvexHull/ConvexHullAlgorithm.MainLoop.cs.meta b/Assets/Scripts/ServerShared/NIH/MIConvexHull/ConvexHull/ConvexHullAlgorithm.MainLoop.cs.meta deleted file mode 100644 index 8eb122b5b..000000000 --- a/Assets/Scripts/ServerShared/NIH/MIConvexHull/ConvexHull/ConvexHullAlgorithm.MainLoop.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: f7f265217d00ea340b87645242a45181 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scripts/ServerShared/NIH/MIConvexHull/ConvexHull/DataModel.cs b/Assets/Scripts/ServerShared/NIH/MIConvexHull/ConvexHull/DataModel.cs deleted file mode 100644 index 761dd1ccf..000000000 --- a/Assets/Scripts/ServerShared/NIH/MIConvexHull/ConvexHull/DataModel.cs +++ /dev/null @@ -1,237 +0,0 @@ -/****************************************************************************** - * - * The MIT License (MIT) - * - * MIConvexHull, Copyright (c) 2015 David Sehnal, Matthew Campbell - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - *****************************************************************************/ - -namespace MIConvexHull -{ - /// - /// For deferred face addition. - /// - internal sealed class DeferredFace - { - /// - /// The faces. - /// - public ConvexFaceInternal Face, Pivot, OldFace; - - /// - /// The indices. - /// - public int FaceIndex, PivotIndex; - } - - /// - /// A helper class used to connect faces. - /// - internal sealed class FaceConnector - { - /// - /// The edge to be connected. - /// - public int EdgeIndex; - - /// - /// The face. - /// - public ConvexFaceInternal Face; - - /// - /// The hash code computed from indices. - /// - public uint HashCode; - - /// - /// Next node in the list. - /// - public FaceConnector Next; - - /// - /// Prev node in the list. - /// - public FaceConnector Previous; - - /// - /// The vertex indices. - /// - public int[] Vertices; - - /// - /// Ctor. - /// - /// The dimension. - public FaceConnector(int dimension) - { - Vertices = new int[dimension - 1]; - } - - /// - /// Updates the connector. - /// - /// The face. - /// Index of the edge. - /// The dim. - public void Update(ConvexFaceInternal face, int edgeIndex, int dim) - { - Face = face; - EdgeIndex = edgeIndex; - - uint hashCode = 23; - - unchecked - { - var vs = face.Vertices; - int i, c = 0; - for (i = 0; i < edgeIndex; i++) - { - Vertices[c++] = vs[i]; - hashCode += 31*hashCode + (uint) vs[i]; - } - for (i = edgeIndex + 1; i < vs.Length; i++) - { - Vertices[c++] = vs[i]; - hashCode += 31*hashCode + (uint) vs[i]; - } - } - - HashCode = hashCode; - } - - /// - /// Can two faces be connected. - /// - /// a. - /// The b. - /// The dim. - /// true if XXXX, false otherwise. - public static bool AreConnectable(FaceConnector a, FaceConnector b, int dim) - { - if (a.HashCode != b.HashCode) return false; - - var av = a.Vertices; - var bv = b.Vertices; - for (var i = 0; i < av.Length; i++) - { - if (av[i] != bv[i]) return false; - } - - return true; - } - - /// - /// Connect two faces. - /// - /// a. - /// The b. - public static void Connect(FaceConnector a, FaceConnector b) - { - a.Face.AdjacentFaces[a.EdgeIndex] = b.Face.Index; - b.Face.AdjacentFaces[b.EdgeIndex] = a.Face.Index; - } - } - - /// - /// This internal class manages the faces of the convex hull. It is a - /// separate class from the desired user class. - /// - internal sealed class ConvexFaceInternal - { - /// - /// Gets or sets the adjacent face data. - /// - public int[] AdjacentFaces; - - /// - /// The furthest vertex. - /// - public int FurthestVertex; - - /// - /// Index of the face inside the pool. - /// - public int Index; - - /// - /// Is it present in the list. - /// - public bool InList; - - /// - /// Is the normal flipped? - /// - public bool IsNormalFlipped; - - /// - /// Next node in the list. - /// - public ConvexFaceInternal Next; - - /// - /// Gets or sets the normal vector. - /// - public float[] Normal; - - /// - /// Face plane constant element. - /// - public float Offset; - - //public int UnprocessedIndex; - - /// - /// Prev node in the list. - /// - public ConvexFaceInternal Previous; - - /// - /// Used to traverse affected faces and create the Delaunay representation. - /// - public int Tag; - - /// - /// Gets or sets the vertices. - /// - public int[] Vertices; - - /// - /// Gets or sets the vertices beyond. - /// - public IndexBuffer VerticesBeyond; - - /// - /// Initializes a new instance of the class. - /// - /// The dimension. - /// The index. - /// The beyond list. - public ConvexFaceInternal(int dimension, int index, IndexBuffer beyondList) - { - Index = index; - AdjacentFaces = new int[dimension]; - VerticesBeyond = beyondList; - Normal = new float[dimension]; - Vertices = new int[dimension]; - } - } -} \ No newline at end of file diff --git a/Assets/Scripts/ServerShared/NIH/MIConvexHull/ConvexHull/DataModel.cs.meta b/Assets/Scripts/ServerShared/NIH/MIConvexHull/ConvexHull/DataModel.cs.meta deleted file mode 100644 index 411bcb0d5..000000000 --- a/Assets/Scripts/ServerShared/NIH/MIConvexHull/ConvexHull/DataModel.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 58c58e163f4c86e48a6df3ee6c5056c0 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scripts/ServerShared/NIH/MIConvexHull/ConvexHull/MathHelper.cs b/Assets/Scripts/ServerShared/NIH/MIConvexHull/ConvexHull/MathHelper.cs deleted file mode 100644 index 0f030c59d..000000000 --- a/Assets/Scripts/ServerShared/NIH/MIConvexHull/ConvexHull/MathHelper.cs +++ /dev/null @@ -1,480 +0,0 @@ -/****************************************************************************** - * - * The MIT License (MIT) - * - * MIConvexHull, Copyright (c) 2015 David Sehnal, Matthew Campbell - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - *****************************************************************************/ - -using System; -using System.Collections.Generic; -using CultMath; -using static CultMath.math; -using Random = CultMath.Random; - -namespace MIConvexHull -{ - /// - /// A helper class mostly for normal computation. If convex hulls are computed - /// in higher dimensions, it might be a good idea to add a specific - /// FindNormalVectorND function. - /// - internal class MathHelper - { - /// - /// The dimension - /// - private readonly int Dimension; - /// - /// The matrix pivots - /// - private readonly int[] matrixPivots; - /// - /// The n d matrix - /// - private readonly float[] nDMatrix; - /// - /// The n d normal helper vector - /// - private readonly float[] nDNormalHelperVector; - - /// - /// The nt x - /// - private readonly float[] ntX; - /// - /// The nt y - /// - private readonly float[] ntY; - /// - /// The nt z - /// - private readonly float[] ntZ; - - /// - /// The position data - /// - private readonly float[] PositionData; - - private static Random _random = new Random((uint) (DateTime.Now.Ticks % uint.MaxValue)); - - /// - /// Initializes a new instance of the class. - /// - /// The dimension. - /// The positions. - internal MathHelper(int dimension, float[] positions) - { - PositionData = positions; - Dimension = dimension; - - ntX = new float[Dimension]; - ntY = new float[Dimension]; - ntZ = new float[Dimension]; - - nDNormalHelperVector = new float[Dimension]; - nDMatrix = new float[Dimension * Dimension]; - matrixPivots = new int[Dimension]; - } - - /// - /// Calculates the normal and offset of the hyper-plane given by the face's vertices. - /// - /// The face. - /// The center. - /// true if XXXX, false otherwise. - internal bool CalculateFacePlane(ConvexFaceInternal face, float[] center) - { - var vertices = face.Vertices; - var normal = face.Normal; - FindNormalVector(vertices, normal); - - if (float.IsNaN(normal[0])) - { - return false; - } - - var offset = 0.0f; - var centerDistance = 0.0f; - var fi = vertices[0] * Dimension; - for (var i = 0; i < Dimension; i++) - { - var n = normal[i]; - offset += n * PositionData[fi + i]; - centerDistance += n * center[i]; - } - face.Offset = -offset; - centerDistance -= offset; - - if (centerDistance > 0) - { - for (var i = 0; i < Dimension; i++) normal[i] = -normal[i]; - face.Offset = offset; - face.IsNormalFlipped = true; - } - else face.IsNormalFlipped = false; - - return true; - } - - /// - /// Check if the vertex is "visible" from the face. - /// The vertex is "over face" if the return value is > Constants.PlaneDistanceTolerance. - /// - /// The v. - /// The f. - /// The vertex is "over face" if the result is positive. - internal double GetVertexDistance(int v, ConvexFaceInternal f) - { - var normal = f.Normal; - var x = v * Dimension; - var distance = f.Offset; - for (var i = 0; i < normal.Length; i++) distance += normal[i] * PositionData[x + i]; - return distance; - } - - /// - /// Returns the vector the between vertices. - /// - /// To index. - /// From index. - /// System.Double[]. - internal float[] VectorBetweenVertices(int toIndex, int fromIndex) - { - var target = new float[Dimension]; - VectorBetweenVertices(toIndex, fromIndex, target); - return target; - } - /// - /// Returns the vector the between vertices. - /// - /// From index. - /// To index. - /// The target. - /// - private void VectorBetweenVertices(int toIndex, int fromIndex, float[] target) - { - int u = toIndex * Dimension, v = fromIndex * Dimension; - for (var i = 0; i < Dimension; i++) - { - target[i] = PositionData[u + i] - PositionData[v + i]; - } - } - - internal void RandomOffsetToLift(int index, float maxHeight) - { - var liftIndex = (index * Dimension) + Dimension - 1; - PositionData[liftIndex] += 0.0001f * maxHeight * (_random.NextFloat() - 0.5f); - } - #region Find the normal vector of the face - /// - /// Finds normal vector of a hyper-plane given by vertices. - /// Stores the results to normalData. - /// - /// The vertices. - /// The normal data. - private void FindNormalVector(int[] vertices, float[] normalData) - { - switch (Dimension) - { - case 2: - FindNormalVector2D(vertices, normalData); - break; - case 3: - FindNormalVector3D(vertices, normalData); - break; - case 4: - FindNormalVector4D(vertices, normalData); - break; - default: - FindNormalVectorND(vertices, normalData); - break; - } - } - /// - /// Finds 2D normal vector. - /// - /// The vertices. - /// The normal. - private void FindNormalVector2D(int[] vertices, float[] normal) - { - VectorBetweenVertices(vertices[1], vertices[0], ntX); - - var nx = -ntX[1]; - var ny = ntX[0]; - - var norm = sqrt(nx * nx + ny * ny); - - var f = 1.0f / norm; - normal[0] = f * nx; - normal[1] = f * ny; - } - /// - /// Finds 3D normal vector. - /// - /// The vertices. - /// The normal. - private void FindNormalVector3D(int[] vertices, float[] normal) - { - VectorBetweenVertices(vertices[1], vertices[0], ntX); - VectorBetweenVertices(vertices[2], vertices[1], ntY); - - var nx = ntX[1] * ntY[2] - ntX[2] * ntY[1]; - var ny = ntX[2] * ntY[0] - ntX[0] * ntY[2]; - var nz = ntX[0] * ntY[1] - ntX[1] * ntY[0]; - - var norm = sqrt(nx * nx + ny * ny + nz * nz); - - var f = 1.0f / norm; - normal[0] = f * nx; - normal[1] = f * ny; - normal[2] = f * nz; - } - /// - /// Finds 4D normal vector. - /// - /// The vertices. - /// The normal. - private void FindNormalVector4D(int[] vertices, float[] normal) - { - VectorBetweenVertices(vertices[1], vertices[0], ntX); - VectorBetweenVertices(vertices[2], vertices[1], ntY); - VectorBetweenVertices(vertices[3], vertices[2], ntZ); - - var x = ntX; - var y = ntY; - var z = ntZ; - - // This was generated using Mathematica - var nx = x[3] * (y[2] * z[1] - y[1] * z[2]) - + x[2] * (y[1] * z[3] - y[3] * z[1]) - + x[1] * (y[3] * z[2] - y[2] * z[3]); - var ny = x[3] * (y[0] * z[2] - y[2] * z[0]) - + x[2] * (y[3] * z[0] - y[0] * z[3]) - + x[0] * (y[2] * z[3] - y[3] * z[2]); - var nz = x[3] * (y[1] * z[0] - y[0] * z[1]) - + x[1] * (y[0] * z[3] - y[3] * z[0]) - + x[0] * (y[3] * z[1] - y[1] * z[3]); - var nw = x[2] * (y[0] * z[1] - y[1] * z[0]) - + x[1] * (y[2] * z[0] - y[0] * z[2]) - + x[0] * (y[1] * z[2] - y[2] * z[1]); - - var norm = sqrt(nx * nx + ny * ny + nz * nz + nw * nw); - - var f = 1.0f / norm; - normal[0] = f * nx; - normal[1] = f * ny; - normal[2] = f * nz; - normal[3] = f * nw; - } - - /// - /// Finds the normal vector nd. - /// - /// The vertices. - /// The normal. - private void FindNormalVectorND(int[] vertices, float[] normal) - { - /* We need to solve the matrix A n = B where - * - A contains coordinates of vertices as columns - * - B is vector with all 1's. Really, it should be the distance of - * the plane from the origin, but - since we're not worried about that - * here and we will normalize the normal anyway - all 1's suffices. - */ - var iPiv = matrixPivots; - var data = nDMatrix; - var norm = 0.0f; - - // Solve determinants by replacing x-th column by all 1. - for (var x = 0; x < Dimension; x++) - { - for (var i = 0; i < Dimension; i++) - { - var offset = vertices[i] * Dimension; - for (var j = 0; j < Dimension; j++) - { - // maybe I got the i/j mixed up here regarding the representation Math.net uses... - // ...but it does not matter since Det(A) = Det(Transpose(A)). - data[Dimension * i + j] = j == x ? 1.0f : PositionData[offset + j]; - } - } - LUFactor(data, Dimension, iPiv, nDNormalHelperVector); - var coord = 1.0f; - for (var i = 0; i < Dimension; i++) - { - if (iPiv[i] != i) coord *= -data[Dimension * i + i]; // the determinant sign changes on row swap. - else coord *= data[Dimension * i + i]; - } - normal[x] = coord; - norm += coord * coord; - } - - // Normalize the result - var f = 1.0f / sqrt(norm); - for (var i = 0; i < normal.Length; i++) normal[i] *= f; - } - #endregion - - #region Simplex Volume - /// - /// Gets the simplex volume. Prior to having enough edge vectors, the method pads the remaining with all - /// "other numbers". So, yes, this method is not really finding the volume. But a relative volume-like measure. It - /// uses the magnitude of the determinant as the volume stand-in following the Cayley-Menger theorem. - /// - /// The edge vectors. - /// The last index. - /// The big number. - /// System.Double. - internal float GetSimplexVolume(float[][] edgeVectors, int lastIndex, float bigNumber) - { - var A = new float[Dimension * Dimension]; - var index = 0; - for (int i = 0; i < Dimension; i++) - for (int j = 0; j < Dimension; j++) - if (i <= lastIndex) - A[index++] = edgeVectors[i][j]; - else A[index] = (pow(-1, index) * index++) / bigNumber; - // this last term is used for all the vertices in the comparison for the yet determined vertices - // the idea is to come up with sets of numbers that are orthogonal so that an non-zero value will result - // and to choose smallish numbers since the choice of vectors will affect what the end volume is. - // A better way (todo?) is to solve a smaller matrix. However, cases were found in which the obvious smaller vector - // (the upper left) had too many zeros. So, one would need to find the right subset. Indeed choosing a subset - // biases the first dimensions of the others. Perhaps a larger volume would be created from a different vertex - // if another subset of dimensions were used. - return abs(DeterminantDestructive(A)); - } - - /// - /// Determinants the destructive. - /// - /// a. - /// System.Double. - private float DeterminantDestructive(float[] A) - { - switch (Dimension) - { - case 0: - return 0.0f; - case 1: - return A[0]; - case 2: - return A[0] * A[3] - A[1] * A[2]; - case 3: - return A[0] * A[4] * A[8] + A[1] * A[5] * A[6] + A[2] * A[3] * A[7] - - A[0] * A[5] * A[7] - A[1] * A[3] * A[8] - A[2] * A[4] * A[6]; - default: - { - var iPiv = new int[Dimension]; - var helper = new float[Dimension]; - LUFactor(A, Dimension, iPiv, helper); - var det = 1.0f; - for (var i = 0; i < iPiv.Length; i++) - { - det *= A[Dimension * i + i]; - if (iPiv[i] != i) det *= -1; // the determinant sign changes on row swap. - } - return det; - } - } - } - #endregion - - - // Modified from Math.NET - // Copyright (c) 2009-2013 Math.NET - /// - /// Lus the factor. - /// - /// The data. - /// The order. - /// The ipiv. - /// The vec l ucolj. - private static void LUFactor(float[] data, int order, int[] ipiv, float[] vecLUcolj) - { - // Initialize the pivot matrix to the identity permutation. - for (var i = 0; i < order; i++) - { - ipiv[i] = i; - } - - // Outer loop. - for (var j = 0; j < order; j++) - { - var indexj = j * order; - var indexjj = indexj + j; - - // Make a copy of the j-th column to localize references. - for (var i = 0; i < order; i++) - { - vecLUcolj[i] = data[indexj + i]; - } - - // Apply previous transformations. - for (var i = 0; i < order; i++) - { - // Most of the time is spent in the following dot product. - var kmax = Math.Min(i, j); - var s = 0.0f; - for (var k = 0; k < kmax; k++) - { - s += data[k * order + i] * vecLUcolj[k]; - } - - data[indexj + i] = vecLUcolj[i] -= s; - } - - // Find pivot and exchange if necessary. - var p = j; - for (var i = j + 1; i < order; i++) - { - if (abs(vecLUcolj[i]) > abs(vecLUcolj[p])) - { - p = i; - } - } - - if (p != j) - { - for (var k = 0; k < order; k++) - { - var indexk = k * order; - var indexkp = indexk + p; - var indexkj = indexk + j; - var temp = data[indexkp]; - data[indexkp] = data[indexkj]; - data[indexkj] = temp; - } - - ipiv[j] = p; - } - - // Compute multipliers. - if (j < order & data[indexjj] != 0.0f) - { - for (var i = j + 1; i < order; i++) - { - data[indexj + i] /= data[indexjj]; - } - } - } - } - } -} \ No newline at end of file diff --git a/Assets/Scripts/ServerShared/NIH/MIConvexHull/ConvexHull/MathHelper.cs.meta b/Assets/Scripts/ServerShared/NIH/MIConvexHull/ConvexHull/MathHelper.cs.meta deleted file mode 100644 index 920a8673d..000000000 --- a/Assets/Scripts/ServerShared/NIH/MIConvexHull/ConvexHull/MathHelper.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 8bb3327041efa18479319ec117493f8c -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scripts/ServerShared/NIH/MIConvexHull/ConvexHull/ObjectManager.cs b/Assets/Scripts/ServerShared/NIH/MIConvexHull/ConvexHull/ObjectManager.cs deleted file mode 100644 index 66333b74f..000000000 --- a/Assets/Scripts/ServerShared/NIH/MIConvexHull/ConvexHull/ObjectManager.cs +++ /dev/null @@ -1,218 +0,0 @@ -/****************************************************************************** - * - * The MIT License (MIT) - * - * MIConvexHull, Copyright (c) 2015 David Sehnal, Matthew Campbell - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - *****************************************************************************/ - -using System; - -namespace MIConvexHull -{ - /// - /// A helper class for object allocation/storage. - /// This helps the GC a lot as it prevents the creation of about 75% of - /// new face objects (in the case of ConvexFaceInternal). In the case of - /// FaceConnectors and DefferedFaces, the difference is even higher (in most - /// cases O(1) vs O(number of created faces)). - /// - internal class ObjectManager - { - /// - /// The dimension - /// - private readonly int Dimension; - /// - /// The connector stack - /// - private FaceConnector ConnectorStack; - /// - /// The deferred face stack - /// - private readonly SimpleList DeferredFaceStack; - /// - /// The empty buffer stack - /// - private readonly SimpleList EmptyBufferStack; - /// - /// The face pool - /// - private ConvexFaceInternal[] FacePool; - /// - /// The face pool size - /// - private int FacePoolSize; - /// - /// The face pool capacity - /// - private int FacePoolCapacity; - /// - /// The free face indices - /// - private readonly IndexBuffer FreeFaceIndices; - - /// - /// The hull - /// - private readonly ConvexHullAlgorithm Hull; - - /// - /// Create the manager. - /// - /// The hull. - public ObjectManager(ConvexHullAlgorithm hull) - { - Dimension = hull.NumOfDimensions; - Hull = hull; - FacePool = hull.FacePool; - FacePoolSize = 0; - FacePoolCapacity = hull.FacePool.Length; - FreeFaceIndices = new IndexBuffer(); - - EmptyBufferStack = new SimpleList(); - DeferredFaceStack = new SimpleList(); - } - - /// - /// Return the face to the pool for later use. - /// - /// Index of the face. - public void DepositFace(int faceIndex) - { - var face = FacePool[faceIndex]; - var af = face.AdjacentFaces; - for (var i = 0; i < af.Length; i++) - { - af[i] = -1; - } - FreeFaceIndices.Push(faceIndex); - } - - /// - /// Reallocate the face pool, including the AffectedFaceFlags - /// - private void ReallocateFacePool() - { - var newPool = new ConvexFaceInternal[2*FacePoolCapacity]; - var newTags = new bool[2*FacePoolCapacity]; - Array.Copy(FacePool, newPool, FacePoolCapacity); - Buffer.BlockCopy(Hull.AffectedFaceFlags, 0, newTags, 0, FacePoolCapacity*sizeof (bool)); - FacePoolCapacity = 2*FacePoolCapacity; - Hull.FacePool = newPool; - FacePool = newPool; - Hull.AffectedFaceFlags = newTags; - } - - /// - /// Create a new face and put it in the pool. - /// - /// System.Int32. - private int CreateFace() - { - var index = FacePoolSize; - var face = new ConvexFaceInternal(Dimension, index, GetVertexBuffer()); - FacePoolSize++; - if (FacePoolSize > FacePoolCapacity) ReallocateFacePool(); - FacePool[index] = face; - return index; - } - - /// - /// Return index of an unused face or creates a new one. - /// - /// System.Int32. - public int GetFace() - { - if (FreeFaceIndices.Count > 0) return FreeFaceIndices.Pop(); - return CreateFace(); - } - - /// - /// Store a face connector in the "embedded" linked list. - /// - /// The connector. - public void DepositConnector(FaceConnector connector) - { - if (ConnectorStack == null) - { - connector.Next = null; - ConnectorStack = connector; - } - else - { - connector.Next = ConnectorStack; - ConnectorStack = connector; - } - } - - /// - /// Get an unused face connector. If none is available, create it. - /// - /// FaceConnector. - public FaceConnector GetConnector() - { - if (ConnectorStack == null) return new FaceConnector(Dimension); - - var ret = ConnectorStack; - ConnectorStack = ConnectorStack.Next; - ret.Next = null; - return ret; - } - - /// - /// Deposit the index buffer. - /// - /// The buffer. - public void DepositVertexBuffer(IndexBuffer buffer) - { - buffer.Clear(); - EmptyBufferStack.Push(buffer); - } - - /// - /// Get a store index buffer or create a new instance. - /// - /// IndexBuffer. - public IndexBuffer GetVertexBuffer() - { - return EmptyBufferStack.Count != 0 ? EmptyBufferStack.Pop() : new IndexBuffer(); - } - - /// - /// Deposit the deferred face. - /// - /// The face. - public void DepositDeferredFace(DeferredFace face) - { - DeferredFaceStack.Push(face); - } - - /// - /// Get the deferred face. - /// - /// DeferredFace. - public DeferredFace GetDeferredFace() - { - return DeferredFaceStack.Count != 0 ? DeferredFaceStack.Pop() : new DeferredFace(); - } - } -} \ No newline at end of file diff --git a/Assets/Scripts/ServerShared/NIH/MIConvexHull/ConvexHull/ObjectManager.cs.meta b/Assets/Scripts/ServerShared/NIH/MIConvexHull/ConvexHull/ObjectManager.cs.meta deleted file mode 100644 index cb1cf125b..000000000 --- a/Assets/Scripts/ServerShared/NIH/MIConvexHull/ConvexHull/ObjectManager.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: e8d582e97c6824740ba9e1a41641b372 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scripts/ServerShared/NIH/MIConvexHull/Face3.cs b/Assets/Scripts/ServerShared/NIH/MIConvexHull/Face3.cs deleted file mode 100644 index 980e442d0..000000000 --- a/Assets/Scripts/ServerShared/NIH/MIConvexHull/Face3.cs +++ /dev/null @@ -1,8 +0,0 @@ -using System.Collections; -using MIConvexHull; - -public class Face3 : ConvexFace -{ - - -} diff --git a/Assets/Scripts/ServerShared/NIH/MIConvexHull/Face3.cs.meta b/Assets/Scripts/ServerShared/NIH/MIConvexHull/Face3.cs.meta deleted file mode 100644 index ab550e9ac..000000000 --- a/Assets/Scripts/ServerShared/NIH/MIConvexHull/Face3.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 30a2635ffe51545499499ce392b234c8 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scripts/ServerShared/NIH/MIConvexHull/IVertex.cs b/Assets/Scripts/ServerShared/NIH/MIConvexHull/IVertex.cs deleted file mode 100644 index b7217c074..000000000 --- a/Assets/Scripts/ServerShared/NIH/MIConvexHull/IVertex.cs +++ /dev/null @@ -1,53 +0,0 @@ -/****************************************************************************** - * - * The MIT License (MIT) - * - * MIConvexHull, Copyright (c) 2015 David Sehnal, Matthew Campbell - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - *****************************************************************************/ - -namespace MIConvexHull -{ - /// - /// An interface for a structure with nD position. - /// - public interface IVertex - { - /// - /// Position of the vertex. - /// - /// The position. - float[] Position { get; } - } - - /// - /// "Default" vertex. - /// - /// - public class DefaultVertex : IVertex - { - /// - /// Position of the vertex. - /// - /// The position. - public float[] Position { get; set; } - } -} \ No newline at end of file diff --git a/Assets/Scripts/ServerShared/NIH/MIConvexHull/IVertex.cs.meta b/Assets/Scripts/ServerShared/NIH/MIConvexHull/IVertex.cs.meta deleted file mode 100644 index 06195b473..000000000 --- a/Assets/Scripts/ServerShared/NIH/MIConvexHull/IVertex.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: a55f713690988bb48aef7cbd4f01ebc7 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scripts/ServerShared/NIH/MIConvexHull/Triangulation.cs b/Assets/Scripts/ServerShared/NIH/MIConvexHull/Triangulation.cs deleted file mode 100644 index 690071bec..000000000 --- a/Assets/Scripts/ServerShared/NIH/MIConvexHull/Triangulation.cs +++ /dev/null @@ -1,181 +0,0 @@ -/****************************************************************************** - * - * The MIT License (MIT) - * - * MIConvexHull, Copyright (c) 2015 David Sehnal, Matthew Campbell - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - *****************************************************************************/ - -using System.Collections.Generic; -using System.Linq; - -namespace MIConvexHull -{ - /// - /// Simple interface to unify different types of triangulations in the future. - /// - /// The type of the t vertex. - /// The type of the t cell. - public interface ITriangulation - where TCell : TriangulationCell, new() - where TVertex : IVertex - { - /// - /// Triangulation simplexes. For 2D - triangles, 3D - tetrahedrons, etc ... - /// - /// The cells. - IEnumerable Cells { get; } - } - - /// - /// Factory class for creating triangulations. - /// - public static class Triangulation - { - /// - /// Creates the Delaunay triangulation of the input data. - /// - /// The type of the t vertex. - /// The data. - /// The plane distance tolerance (default is 1e-10). If too high, points - /// will be missed. If too low, the algorithm may break. Only adjust if you notice problems. - /// ITriangulation<TVertex, DefaultTriangulationCell<TVertex>>. - public static ITriangulation> CreateDelaunay( - IList data, - float PlaneDistanceTolerance = Constants.DefaultPlaneDistanceTolerance) - where TVertex : IVertex - { - return DelaunayTriangulation>.Create(data, PlaneDistanceTolerance); - } - - /// - /// Creates the Delaunay triangulation of the input data. - /// - /// The data. - /// The plane distance tolerance (default is 1e-10). If too high, points - /// will be missed. If too low, the algorithm may break. Only adjust if you notice problems. - /// ITriangulation<DefaultVertex, DefaultTriangulationCell<DefaultVertex>>. - public static ITriangulation> CreateDelaunay( - IList data, - float PlaneDistanceTolerance = Constants.DefaultPlaneDistanceTolerance) - { - var points = data.Select(p => new DefaultVertex { Position = p }).ToList(); - return DelaunayTriangulation>.Create(points, PlaneDistanceTolerance); - } - - /// - /// Creates the Delaunay triangulation of the input data. - /// - /// The type of the t vertex. - /// The type of the t face. - /// The data. - /// The plane distance tolerance (default is 1e-10). If too high, points - /// will be missed. If too low, the algorithm may break. Only adjust if you notice problems. - /// ITriangulation<TVertex, TFace>. - public static ITriangulation CreateDelaunay(IList data, - float PlaneDistanceTolerance = Constants.DefaultPlaneDistanceTolerance) - where TVertex : IVertex - where TFace : TriangulationCell, new() - { - return DelaunayTriangulation.Create(data, PlaneDistanceTolerance); - } - - - /// - /// Create the voronoi mesh. - /// - /// The type of the t vertex. - /// The type of the t cell. - /// The type of the t edge. - /// The data. - /// The plane distance tolerance (default is 1e-10). If too high, points - /// will be missed. If too low, the algorithm may break. Only adjust if you notice problems. - /// VoronoiMesh<TVertex, TCell, TEdge>. - public static VoronoiMesh CreateVoronoi(IList data, - float PlaneDistanceTolerance = Constants.DefaultPlaneDistanceTolerance) - where TCell : TriangulationCell, new() - where TVertex : IVertex - where TEdge : VoronoiEdge, new() - { - return VoronoiMesh.Create(data, PlaneDistanceTolerance); - } - - /// - /// Create the voronoi mesh. - /// - /// The type of the t vertex. - /// The data. - /// The plane distance tolerance (default is 1e-10). If too high, points - /// will be missed. If too low, the algorithm may break. Only adjust if you notice problems. - /// VoronoiMesh<TVertex, DefaultTriangulationCell<TVertex>, VoronoiEdge<TVertex, DefaultTriangulationCell<TVertex>>>. - public static - VoronoiMesh - , VoronoiEdge>> - CreateVoronoi(IList data, - float PlaneDistanceTolerance = Constants.DefaultPlaneDistanceTolerance) - where TVertex : IVertex - { - return - VoronoiMesh - , VoronoiEdge> - >.Create(data, PlaneDistanceTolerance); - } - - /// - /// Create the voronoi mesh. - /// - /// The data. - /// The plane distance tolerance (default is 1e-10). If too high, points - /// will be missed. If too low, the algorithm may break. Only adjust if you notice problems. - /// VoronoiMesh<DefaultVertex, DefaultTriangulationCell<DefaultVertex>, VoronoiEdge<DefaultVertex, DefaultTriangulationCell<DefaultVertex>>>. - public static - VoronoiMesh - , - VoronoiEdge>> - CreateVoronoi(IList data, - float PlaneDistanceTolerance = Constants.DefaultPlaneDistanceTolerance) - { - var points = data.Select(p => new DefaultVertex { Position = p.ToArray() }).ToList(); - return - VoronoiMesh - , - VoronoiEdge>>.Create(points, PlaneDistanceTolerance); - } - - /// - /// Create the voronoi mesh. - /// - /// The type of the t vertex. - /// The type of the t cell. - /// The data. - /// The plane distance tolerance (default is 1e-10). If too high, points - /// will be missed. If too low, the algorithm may break. Only adjust if you notice problems. - /// VoronoiMesh<TVertex, TCell, VoronoiEdge<TVertex, TCell>>. - public static VoronoiMesh> CreateVoronoi( - IList data, - float PlaneDistanceTolerance = Constants.DefaultPlaneDistanceTolerance) - where TVertex : IVertex - where TCell : TriangulationCell, new() - { - return VoronoiMesh>.Create(data, PlaneDistanceTolerance); - } - } -} \ No newline at end of file diff --git a/Assets/Scripts/ServerShared/NIH/MIConvexHull/Triangulation.cs.meta b/Assets/Scripts/ServerShared/NIH/MIConvexHull/Triangulation.cs.meta deleted file mode 100644 index 2f8f75a85..000000000 --- a/Assets/Scripts/ServerShared/NIH/MIConvexHull/Triangulation.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 0762bfe861ed97749a222fb1c217788a -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scripts/ServerShared/NIH/MIConvexHull/Triangulation/DelaunayTrianglationInternal.cs b/Assets/Scripts/ServerShared/NIH/MIConvexHull/Triangulation/DelaunayTrianglationInternal.cs deleted file mode 100644 index 7209c0ccc..000000000 --- a/Assets/Scripts/ServerShared/NIH/MIConvexHull/Triangulation/DelaunayTrianglationInternal.cs +++ /dev/null @@ -1,96 +0,0 @@ -/****************************************************************************** - * - * The MIT License (MIT) - * - * MIConvexHull, Copyright (c) 2015 David Sehnal, Matthew Campbell - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - *****************************************************************************/ - -using System.Collections.Generic; -using System.Linq; - -namespace MIConvexHull -{ - /* - * Code here handles triangulation related stuff. - */ - - /// - /// Class ConvexHullAlgorithm. - /// - internal partial class ConvexHullAlgorithm - { - /// - /// Computes the Delaunay triangulation. - /// - /// The type of the t vertex. - /// The type of the t cell. - /// The data. - /// The plane distance tolerance. - /// TCell[]. - internal static TCell[] GetDelaunayTriangulation(IList data, - float PlaneDistanceTolerance ) - where TCell : TriangulationCell, new() - where TVertex : IVertex - { - var ch = new ConvexHullAlgorithm(data.Cast().ToArray(), true, PlaneDistanceTolerance); - ch.GetConvexHull(); - ch.RemoveUpperFaces(); - return ch.GetConvexFaces(); - } - - /// - /// Removes up facing Tetrahedrons from the triangulation. - /// - private void RemoveUpperFaces() - { - var delaunayFaces = ConvexFaces; - var dimension = NumOfDimensions - 1; - - // Remove the "upper" faces - for (var i = delaunayFaces.Count - 1; i >= 0; i--) - { - var candidateIndex = delaunayFaces[i]; - var candidate = FacePool[candidateIndex]; - if (candidate.Normal[dimension] >= 0.0) - { - for (var fi = 0; fi < candidate.AdjacentFaces.Length; fi++) - { - var af = candidate.AdjacentFaces[fi]; - if (af >= 0) - { - var face = FacePool[af]; - for (var j = 0; j < face.AdjacentFaces.Length; j++) - { - if (face.AdjacentFaces[j] == candidateIndex) - { - face.AdjacentFaces[j] = -1; - } - } - } - } - delaunayFaces[i] = delaunayFaces[delaunayFaces.Count - 1]; - delaunayFaces.Pop(); - } - } - } - } -} \ No newline at end of file diff --git a/Assets/Scripts/ServerShared/NIH/MIConvexHull/Triangulation/DelaunayTrianglationInternal.cs.meta b/Assets/Scripts/ServerShared/NIH/MIConvexHull/Triangulation/DelaunayTrianglationInternal.cs.meta deleted file mode 100644 index d78b006e2..000000000 --- a/Assets/Scripts/ServerShared/NIH/MIConvexHull/Triangulation/DelaunayTrianglationInternal.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: de8661d86f2667647b9dca59c1c97e9a -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scripts/ServerShared/NIH/MIConvexHull/Triangulation/DelaunayTriangulation.cs b/Assets/Scripts/ServerShared/NIH/MIConvexHull/Triangulation/DelaunayTriangulation.cs deleted file mode 100644 index a22962b23..000000000 --- a/Assets/Scripts/ServerShared/NIH/MIConvexHull/Triangulation/DelaunayTriangulation.cs +++ /dev/null @@ -1,75 +0,0 @@ -/****************************************************************************** - * - * The MIT License (MIT) - * - * MIConvexHull, Copyright (c) 2015 David Sehnal, Matthew Campbell - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - *****************************************************************************/ - -using System; -using System.Collections.Generic; - -namespace MIConvexHull -{ - /// - /// Calculation and representation of Delaunay triangulation. - /// - /// The type of the t vertex. - /// The type of the t cell. - /// - public class DelaunayTriangulation : ITriangulation - where TCell : TriangulationCell, new() - where TVertex : IVertex - { - /// - /// Can only be created using a factory method. - /// - private DelaunayTriangulation() - { - } - - /// - /// Cells of the triangulation. - /// - /// The cells. - public IEnumerable Cells { get; private set; } - - /// - /// Creates the Delaunay triangulation of the input data. - /// - /// The data. - /// The plane distance tolerance (default is 1e-10). If too high, points - /// will be missed. If too low, the algorithm may break. Only adjust if you notice problems. - /// DelaunayTriangulation<TVertex, TCell>. - /// data - /// data - public static DelaunayTriangulation Create(IList data, - float PlaneDistanceTolerance)// = Constants.DefaultPlaneDistanceTolerance) - { - if (data == null) throw new ArgumentNullException("data"); - if (data.Count == 0) return new DelaunayTriangulation { Cells = new TCell[0] }; - - var cells = ConvexHullAlgorithm.GetDelaunayTriangulation(data, PlaneDistanceTolerance); - - return new DelaunayTriangulation { Cells = cells }; - } - } -} \ No newline at end of file diff --git a/Assets/Scripts/ServerShared/NIH/MIConvexHull/Triangulation/DelaunayTriangulation.cs.meta b/Assets/Scripts/ServerShared/NIH/MIConvexHull/Triangulation/DelaunayTriangulation.cs.meta deleted file mode 100644 index fc2ba273c..000000000 --- a/Assets/Scripts/ServerShared/NIH/MIConvexHull/Triangulation/DelaunayTriangulation.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 4b0e872e78d2ab8428b446cfa5c06580 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scripts/ServerShared/NIH/MIConvexHull/Triangulation/TriangulationCell.cs b/Assets/Scripts/ServerShared/NIH/MIConvexHull/Triangulation/TriangulationCell.cs deleted file mode 100644 index 63e9d1f5a..000000000 --- a/Assets/Scripts/ServerShared/NIH/MIConvexHull/Triangulation/TriangulationCell.cs +++ /dev/null @@ -1,51 +0,0 @@ -/****************************************************************************** - * - * The MIT License (MIT) - * - * MIConvexHull, Copyright (c) 2015 David Sehnal, Matthew Campbell - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - *****************************************************************************/ - -namespace MIConvexHull -{ - /// - /// Representation of the triangulation cell. Pretty much the same as ConvexFace, - /// just wanted to distinguish the two. - /// To declare your own face type, use class Face : DelaunayFace(of Vertex, of Face) - /// - /// The type of the t vertex. - /// The type of the t cell. - /// - public abstract class TriangulationCell : ConvexFace - where TVertex : IVertex - where TCell : ConvexFace - { - } - - /// - /// Default triangulation cell. - /// - /// The type of the t vertex. - public class DefaultTriangulationCell : TriangulationCell> - where TVertex : IVertex - { - } -} \ No newline at end of file diff --git a/Assets/Scripts/ServerShared/NIH/MIConvexHull/Triangulation/TriangulationCell.cs.meta b/Assets/Scripts/ServerShared/NIH/MIConvexHull/Triangulation/TriangulationCell.cs.meta deleted file mode 100644 index 29dcef792..000000000 --- a/Assets/Scripts/ServerShared/NIH/MIConvexHull/Triangulation/TriangulationCell.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 808182249e0e66143b65945d9aeb37fe -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scripts/ServerShared/NIH/MIConvexHull/Triangulation/VoronoiEdge.cs b/Assets/Scripts/ServerShared/NIH/MIConvexHull/Triangulation/VoronoiEdge.cs deleted file mode 100644 index 1557352d6..000000000 --- a/Assets/Scripts/ServerShared/NIH/MIConvexHull/Triangulation/VoronoiEdge.cs +++ /dev/null @@ -1,93 +0,0 @@ -/****************************************************************************** - * - * The MIT License (MIT) - * - * MIConvexHull, Copyright (c) 2015 David Sehnal, Matthew Campbell - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - *****************************************************************************/ - -namespace MIConvexHull -{ - /// - /// A class representing an (undirected) edge of the Voronoi graph. - /// - /// The type of the t vertex. - /// The type of the t cell. - public class VoronoiEdge - where TVertex : IVertex - where TCell : TriangulationCell - { - /// - /// Create an instance of the edge. - /// - public VoronoiEdge() - { - } - - /// - /// Create an instance of the edge. - /// - /// The source. - /// The target. - public VoronoiEdge(TCell source, TCell target) - { - Source = source; - Target = target; - } - - /// - /// Source of the edge. - /// - /// The source. - public TCell Source { get; internal set; } - - /// - /// Target of the edge. - /// - /// The target. - public TCell Target { get; internal set; } - - /// - /// ... - /// - /// The object to compare with the current object. - /// true if the specified is equal to this instance; otherwise, false. - public override bool Equals(object obj) - { - var other = obj as VoronoiEdge; - if (other == null) return false; - if (ReferenceEquals(this, other)) return true; - return (Source == other.Source && Target == other.Target) - || (Source == other.Target && Target == other.Source); - } - - /// - /// ... - /// - /// A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. - public override int GetHashCode() - { - var hash = 23; - hash = hash*31 + Source.GetHashCode(); - return hash*31 + Target.GetHashCode(); - } - } -} \ No newline at end of file diff --git a/Assets/Scripts/ServerShared/NIH/MIConvexHull/Triangulation/VoronoiEdge.cs.meta b/Assets/Scripts/ServerShared/NIH/MIConvexHull/Triangulation/VoronoiEdge.cs.meta deleted file mode 100644 index 71c57ddb7..000000000 --- a/Assets/Scripts/ServerShared/NIH/MIConvexHull/Triangulation/VoronoiEdge.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 2f5c388c78c121a47b14c2f4ed26af38 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scripts/ServerShared/NIH/MIConvexHull/Triangulation/VoronoiMesh.cs b/Assets/Scripts/ServerShared/NIH/MIConvexHull/Triangulation/VoronoiMesh.cs deleted file mode 100644 index 3142af854..000000000 --- a/Assets/Scripts/ServerShared/NIH/MIConvexHull/Triangulation/VoronoiMesh.cs +++ /dev/null @@ -1,203 +0,0 @@ -/****************************************************************************** - * - * The MIT License (MIT) - * - * MIConvexHull, Copyright (c) 2015 David Sehnal, Matthew Campbell - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - *****************************************************************************/ - -using System; -using System.Collections.Generic; -using System.Linq; - -namespace MIConvexHull -{ - /// - /// A factory class for creating a Voronoi mesh. - /// - public static class VoronoiMesh - { - /// - /// Create the voronoi mesh. - /// - /// The type of the t vertex. - /// The type of the t cell. - /// The type of the t edge. - /// The data. - /// VoronoiMesh<TVertex, TCell, TEdge>. - public static VoronoiMesh Create(IList data, - float PlaneDistanceTolerance = Constants.DefaultPlaneDistanceTolerance) - where TCell : TriangulationCell, new() - where TVertex : IVertex - where TEdge : VoronoiEdge, new() - { - return VoronoiMesh.Create(data, PlaneDistanceTolerance); - } - - /// - /// Create the voronoi mesh. - /// - /// The type of the t vertex. - /// The data. - /// VoronoiMesh<TVertex, DefaultTriangulationCell<TVertex>, VoronoiEdge<TVertex, DefaultTriangulationCell<TVertex>>>. - public static - VoronoiMesh - , VoronoiEdge>> - Create(IList data, - float PlaneDistanceTolerance = Constants.DefaultPlaneDistanceTolerance) - where TVertex : IVertex - { - return - VoronoiMesh - , VoronoiEdge> - >.Create(data, PlaneDistanceTolerance); - } - - /// - /// Create the voronoi mesh. - /// - /// The data. - /// VoronoiMesh<DefaultVertex, DefaultTriangulationCell<DefaultVertex>, VoronoiEdge<DefaultVertex, DefaultTriangulationCell<DefaultVertex>>>. - public static - VoronoiMesh - , - VoronoiEdge>> - Create(IList data, - float PlaneDistanceTolerance = Constants.DefaultPlaneDistanceTolerance) - { - var points = data.Select(p => new DefaultVertex { Position = p.ToArray() }).ToList(); - return - VoronoiMesh - , - VoronoiEdge>>.Create(points, PlaneDistanceTolerance); - } - - /// - /// Create the voronoi mesh. - /// - /// The type of the t vertex. - /// The type of the t cell. - /// The data. - /// VoronoiMesh<TVertex, TCell, VoronoiEdge<TVertex, TCell>>. - public static VoronoiMesh> Create( - IList data, - float PlaneDistanceTolerance = Constants.DefaultPlaneDistanceTolerance) - where TVertex : IVertex - where TCell : TriangulationCell, new() - { - return VoronoiMesh>.Create(data, PlaneDistanceTolerance); - } - } - - /// - /// A representation of a voronoi mesh. - /// - /// The type of the t edge. - /// The type of the t vertex. - /// The type of the t cell. - public class VoronoiMesh - where TCell : TriangulationCell, new() - where TVertex : IVertex - where TEdge : VoronoiEdge, new() - { - /// - /// Can only be created using a factory method. - /// - private VoronoiMesh() - { - } - - /// - /// Vertices of the diagram. - /// - /// The vertices. - public IEnumerable Vertices { get; private set; } - - /// - /// Edges connecting the cells. - /// The same information can be retrieved Cells' Adjacency. - /// - /// The edges. - public IEnumerable Edges { get; private set; } - - /// - /// Create a Voronoi diagram of the input data. - /// - /// The data. - /// The plane distance tolerance (default is 1e-10). If too high, points - /// will be missed. If too low, the algorithm may break. Only adjust if you notice problems. - /// VoronoiMesh<TVertex, TCell, TEdge>. - /// data - /// data - public static VoronoiMesh Create(IList data, - float PlaneDistanceTolerance = Constants.DefaultPlaneDistanceTolerance) - { - if (data == null) throw new ArgumentNullException("data"); - - var t = DelaunayTriangulation.Create(data, PlaneDistanceTolerance); - var vertices = t.Cells.ToList(); - var edges = new HashSet(new EdgeComparer()); - - foreach (var f in vertices) - { - for (var i = 0; i < f.Adjacency.Length; i++) - { - var af = f.Adjacency[i]; - if (af != null) edges.Add(new TEdge { Source = f, Target = af }); - } - } - - return new VoronoiMesh - { - Vertices = vertices, - Edges = edges.ToList() - }; - } - - /// - /// This is probably not needed, but might make things a tiny bit faster. - /// - /// - private class EdgeComparer : IEqualityComparer - { - /// - /// Equals the specified x. - /// - /// The x. - /// The y. - /// System.Boolean. - public bool Equals(TEdge x, TEdge y) - { - return (x.Source == y.Source && x.Target == y.Target) || (x.Source == y.Target && x.Target == y.Source); - } - - /// - /// Returns a hash code for this instance. - /// - /// The for which a hash code is to be returned. - /// A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. - public int GetHashCode(TEdge obj) - { - return obj.Source.GetHashCode() ^ obj.Target.GetHashCode(); - } - } - } -} \ No newline at end of file diff --git a/Assets/Scripts/ServerShared/NIH/MIConvexHull/Triangulation/VoronoiMesh.cs.meta b/Assets/Scripts/ServerShared/NIH/MIConvexHull/Triangulation/VoronoiMesh.cs.meta deleted file mode 100644 index c87b2415b..000000000 --- a/Assets/Scripts/ServerShared/NIH/MIConvexHull/Triangulation/VoronoiMesh.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: fbb5750f20479844eb4e504302755db9 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scripts/ServerShared/NIH/MIConvexHull/Vertex2.cs b/Assets/Scripts/ServerShared/NIH/MIConvexHull/Vertex2.cs deleted file mode 100644 index e00c7deef..000000000 --- a/Assets/Scripts/ServerShared/NIH/MIConvexHull/Vertex2.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System; -using System.Collections; -using MIConvexHull; -using CultMath; -using static CultMath.math; - -public class Vertex2 : IVertex -{ - public float[] Position => new[] {StoredPosition.x, StoredPosition.y}; - - public float2 StoredPosition; - - public float x { get { return StoredPosition.x; } } - public float y { get { return StoredPosition.y; } } - - public Vertex2(float x, float y) - { - StoredPosition = float2(x, y); - } - - public Vertex2(float2 pos) - { - StoredPosition = pos; - } - - public float2 ToFloat2() { - return StoredPosition; - } - - public float Distance(Vertex2 v) - { - return length(StoredPosition-v.StoredPosition); - } -} diff --git a/Assets/Scripts/ServerShared/NIH/MIConvexHull/Vertex2.cs.meta b/Assets/Scripts/ServerShared/NIH/MIConvexHull/Vertex2.cs.meta deleted file mode 100644 index a314ce4ec..000000000 --- a/Assets/Scripts/ServerShared/NIH/MIConvexHull/Vertex2.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 67d3ec22ea52a2642a14ff864e3017b0 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scripts/ServerShared/NIH/MIConvexHull/Vertex2Object.cs b/Assets/Scripts/ServerShared/NIH/MIConvexHull/Vertex2Object.cs deleted file mode 100644 index a266ddaec..000000000 --- a/Assets/Scripts/ServerShared/NIH/MIConvexHull/Vertex2Object.cs +++ /dev/null @@ -1,16 +0,0 @@ -using CultMath; - -public class Vertex2 : Vertex2 -{ - public T StoredObject { get; } - - public Vertex2(float x, float y, T obj) : base(x, y) - { - StoredObject = obj; - } - - public Vertex2(float2 pos, T obj) : base(pos) - { - StoredObject = obj; - } -} \ No newline at end of file diff --git a/Assets/Scripts/ServerShared/NIH/MIConvexHull/Vertex2Object.cs.meta b/Assets/Scripts/ServerShared/NIH/MIConvexHull/Vertex2Object.cs.meta deleted file mode 100644 index 24639c89b..000000000 --- a/Assets/Scripts/ServerShared/NIH/MIConvexHull/Vertex2Object.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: e42612a273ec490380eaa67bed216a6d -timeCreated: 1615418804 \ No newline at end of file diff --git a/Assets/Scripts/ServerShared/NIH/MIConvexHull/Vertex3.cs b/Assets/Scripts/ServerShared/NIH/MIConvexHull/Vertex3.cs deleted file mode 100644 index a14aea5b1..000000000 --- a/Assets/Scripts/ServerShared/NIH/MIConvexHull/Vertex3.cs +++ /dev/null @@ -1,30 +0,0 @@ -using System.Collections; -using MIConvexHull; -using CultMath; -using static CultMath.math; - -public class Vertex3 : IVertex -{ - public float[] Position => new[] {StoredPosition.x, StoredPosition.y}; - - public float3 StoredPosition; - - public Vertex3(float x, float y, float z) - { - StoredPosition = float3(x, y, z); - } - - public Vertex3(float3 pos) - { - StoredPosition = pos; - } - - public float3 ToFloat3() { - return StoredPosition; - } - - public float Distance(Vertex3 v) - { - return length(StoredPosition-v.StoredPosition); - } -} diff --git a/Assets/Scripts/ServerShared/NIH/MIConvexHull/Vertex3.cs.meta b/Assets/Scripts/ServerShared/NIH/MIConvexHull/Vertex3.cs.meta deleted file mode 100644 index fc1115c36..000000000 --- a/Assets/Scripts/ServerShared/NIH/MIConvexHull/Vertex3.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 3553f231414f28347996a803a79425fa -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scripts/ServerShared/OrbitalEntity.cs b/Assets/Scripts/ServerShared/OrbitalEntity.cs index 93f055804..be1bd893c 100644 --- a/Assets/Scripts/ServerShared/OrbitalEntity.cs +++ b/Assets/Scripts/ServerShared/OrbitalEntity.cs @@ -17,12 +17,16 @@ public class OrbitalEntity : Entity public float SecurityRadius; public LocationStory Story; public bool CanTow; + // What this station is for (StationKinds): its own fact, which under a stand-in hull differs from the hull's kind. + public CultRecordRef Kind; public OrbitalEntity(ItemManager itemManager, Zone zone, EquippableItem hull, CultRecordKey orbit, EntitySettings settings) : base(itemManager, zone, hull, settings) { OrbitData = orbit; } + public override float LayerHeight => ItemManager.GameplaySettings.OrbitalLayerHeight; + public override void Update(float delta) { if (OrbitData.IsSet()) diff --git a/Assets/Scripts/ServerShared/Pilot.cs b/Assets/Scripts/ServerShared/Pilot.cs new file mode 100644 index 000000000..0ef20f96c --- /dev/null +++ b/Assets/Scripts/ServerShared/Pilot.cs @@ -0,0 +1,176 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +using System.Collections.Generic; +using CultMath; + +// A turn demand as a pilot commands it: a rate, or a heading resolved against the hull's facing when it is applied, so a +// held heading keeps steering as the hull turns. +public readonly struct TurnCommand +{ + private readonly bool _toward; + private readonly float _rate; + private readonly float2 _heading; + + private TurnCommand(bool toward, float rate, float2 heading) + { + _toward = toward; + _rate = rate; + _heading = heading; + } + + public static TurnCommand OfRate(float rate) => new TurnCommand(false, rate, default); + public static TurnCommand Toward(float2 heading) => new TurnCommand(true, 0, heading); + + public float Resolve(Ship ship) => _toward ? Steering.Toward(ship, _heading) : _rate; +} + +// The player's target presses, each answered by the entity's own chooser (Entity.TargetNext and the rest) when applied. +public enum TargetVerb +{ + None, + UnderReticle, + NearestEnemy, + Next, + Previous +} + +// The one input an entity's pilot gives it (its agent, the player, a scripted pilot): only own-ship vectors and handles the +// pilot was given (ruling observation-sensors-only). Commands are per entity, never per Flight or side: a side may be one +// ship (ruling brain-one-per-side-r2). PilotApplier.Apply is the only writer of the entity's fields from it; the pilot +// also reads back its own pending decisions this step (Designated, Pulls), because the entity still holds last step's. +// Held fields persist until the pilot replaces them, so a pilot deciding below the sim rate keeps flying (ruling +// lower-game-sim-rate); null leaves the field to whoever wrote it last. One-shots apply once, in order, and are cleared. +public sealed class PilotCommand +{ + public TurnCommand? Turn; + public float2? Movement; + public float3? Aim; + public float? Tractor; + + internal readonly List Designations = new List(); + internal readonly List Selections = new List(); + internal readonly List Hails = new List(); + internal readonly List Uses = new List(); + internal readonly List<(ActivatedBehavior Behavior, bool Pull)> Triggers = new List<(ActivatedBehavior, bool)>(); + internal readonly List<(Entity Other, bool? Hostile, bool Toggle)> Iffs = new List<(Entity, bool?, bool)>(); + internal TargetVerb TargetVerb; + // The step's give verb: a Give, or a stop when its Receiver is null. The last one in a step wins. + internal (Entity Receiver, ItemInstance Item, int Quantity)? GiveVerb; + internal int AimCycles; + internal int ShutdownOverrideToggles, HeatsinkToggles, ShieldToggles, Pings; + + public void Designate(TargetRef target) => Designations.Add(target); + public void SelectItem(EquippedItem item) => Selections.Add(item); + public void Hail(string message) => Hails.Add(message); + public void Use(ConsumableItemData consumable) => Uses.Add(consumable); + public void Pull(ActivatedBehavior behavior) => Triggers.Add((behavior, true)); + public void Release(ActivatedBehavior behavior) => Triggers.Add((behavior, false)); + // The last verb in a step wins. + public void Verb(TargetVerb verb) => TargetVerb = verb; + public void CycleAim() => AimCycles++; + public void Iff(Entity other, bool? hostile) => Iffs.Add((other, hostile, false)); + // A press that flips the stance on the entity's target as both stand when applied, after the step's target verbs and in + // order with Iff, so two in a step cancel. With no target then, it does nothing. + public void ToggleStance() => Iffs.Add((null, null, true)); + // The entity's own switches, pressed: each press flips its switch when applied, so two in a step cancel. + public void ToggleOverrideShutdown() => ShutdownOverrideToggles++; + public void ToggleHeatsinks() => HeatsinkToggles++; + public void ToggleShield() => ShieldToggles++; + public void Ping() => Pings++; + // Offers goods from this entity's hold to a ship alongside (ruling transfer-is-give-only): the quantity of a commodity, + // or the one crafted instance. It replaces any give under way. A give of nothing, or of less than one, is ignored, and + // so is one to oneself when applied. The last give or stop in a step wins. + public void Give(Entity receiver, ItemInstance item, int quantity) + { + if (receiver == null || item == null) return; + var count = item is CraftedItemInstance ? 1 : quantity; + if (count < 1) return; + GiveVerb = (receiver, item, count); + } + public void StopGiving() => GiveVerb = (null, null, 0); + + // The pilot's own pending decisions, which it reads back instead of the ship (that is last step's applied state). + public TargetRef? Designated => Designations.Count > 0 ? Designations[Designations.Count - 1] : (TargetRef?) null; + + // Whether this pilot has commanded a trigger, pull or release, for `behavior` this step. + public bool Commands(ActivatedBehavior behavior) + { + foreach (var trigger in Triggers) + if (ReferenceEquals(trigger.Behavior, behavior)) return true; + return false; + } + + // Whether the last trigger this pilot commanded for `behavior` this step is a pull. + public bool Pulls(ActivatedBehavior behavior) + { + for (var i = Triggers.Count - 1; i >= 0; i--) + if (ReferenceEquals(Triggers[i].Behavior, behavior)) return Triggers[i].Pull; + return false; + } + + internal void ClearOneShots() + { + Designations.Clear(); + Selections.Clear(); + Hails.Clear(); + Uses.Clear(); + Triggers.Clear(); + Iffs.Clear(); + TargetVerb = TargetVerb.None; + GiveVerb = null; + AimCycles = 0; + ShutdownOverrideToggles = HeatsinkToggles = ShieldToggles = Pings = 0; + } +} + +// The one writer of an entity's pilot-controlled fields, called only from Zone.Update. The order is a rule: the target +// lands (a designation, then a chooser verb) before its item is selected or the aim cycled, and the aim before the +// triggers, so a pilot fires along the aim it commands this step. +public static class PilotApplier +{ + public static void Apply(Entity entity) + { + var command = entity.Command; + foreach (var target in command.Designations) + if (!entity.Target.Value.Equals(target)) entity.SetTarget(target); + switch (command.TargetVerb) + { + case TargetVerb.UnderReticle: entity.TargetUnderReticle(); break; + case TargetVerb.NearestEnemy: entity.TargetNearestEnemy(); break; + case TargetVerb.Next: entity.TargetNext(); break; + case TargetVerb.Previous: entity.TargetPrevious(); break; + } + foreach (var item in command.Selections) entity.TrySelectTargetItem(item); + for (var i = 0; i < command.AimCycles; i++) entity.CycleAim(); + foreach (var (other, hostile, toggle) in command.Iffs) + { + if (!toggle) entity.SetIff(other, hostile); + else if (entity.Target.Value.Entity is Entity target) entity.SetIff(target, !entity.IsHostileTo(target)); + } + for (var i = 0; i < command.ShutdownOverrideToggles; i++) entity.OverrideShutdown = !entity.OverrideShutdown; + for (var i = 0; i < command.HeatsinkToggles; i++) entity.HeatsinksEnabled = !entity.HeatsinksEnabled; + if (entity.Shield != null) + for (var i = 0; i < command.ShieldToggles; i++) entity.Shield.Item.Enabled.Value = !entity.Shield.Item.Enabled.Value; + for (var i = 0; i < command.Pings; i++) entity.Sensor?.Ping(); + foreach (var hail in command.Hails) entity.SetMessage(hail); + foreach (var consumable in command.Uses) entity.TryActivateConsumable(consumable); + if (command.GiveVerb is { } give) + { + if (give.Receiver == null) CargoTransfer.End(entity, GiveEnd.Stopped); + else if (!ReferenceEquals(give.Receiver, entity)) CargoTransfer.Begin(entity, new GiveOrder(give.Receiver, give.Item, give.Quantity)); + } + if (command.Aim is float3 aim) entity.Aim = aim; + foreach (var (behavior, pull) in command.Triggers) + if (pull) behavior.Activate(); + else behavior.Deactivate(); + if (entity is Ship ship) + { + if (command.Turn is TurnCommand turn) ship.Turn = turn.Resolve(ship); + if (command.Movement is float2 movement) ship.MovementDirection = movement; + } + if (command.Tractor is float tractor) entity.TractorCommand = tractor; + command.ClearOneShots(); + } +} diff --git a/Assets/Scripts/ServerShared/Pilot.cs.meta b/Assets/Scripts/ServerShared/Pilot.cs.meta new file mode 100644 index 000000000..e13004643 --- /dev/null +++ b/Assets/Scripts/ServerShared/Pilot.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 0ae6251a7a32402cb7f7db7ff1fc5084 \ No newline at end of file diff --git a/Assets/Scripts/ServerShared/PlayerSettings.cs b/Assets/Scripts/ServerShared/PlayerSettings.cs index d3c809fed..54b8537cd 100644 --- a/Assets/Scripts/ServerShared/PlayerSettings.cs +++ b/Assets/Scripts/ServerShared/PlayerSettings.cs @@ -10,7 +10,7 @@ using static CultMath.math; public class PlayerSettings { [Key(0)] public string Name = "Anonymous"; - [Key(2)] public bool TutorialPassed; + // Keys 1 and 2 are retired; an older player.cc that still carries them loads, and they are dropped. [Key(3)] public Dictionary HashedStoryFiles = new Dictionary(); [Key(4)] public PlayerGameplaySettings GameplaySettings = new PlayerGameplaySettings(); [Key(5)] public PlayerInputSettings InputSettings = new PlayerInputSettings(); @@ -63,7 +63,9 @@ public class PlayerGameplaySettings public class PlayerGraphicsSettings { [Key(0)] public Quality NebulaQuality = Quality.Normal; - [Key(1)] public bool ShowAsteroidsInMinimap; + // Key 1, retired: ShowAsteroidsInMinimap (minimap belts always draw) + // How hard the camera shakes when the player's ship takes an impact: 0 off, 1 full (Feedback.Cue). + [Key(2)] public float ScreenShake = 1f; } [MessagePackObject] diff --git a/Assets/Scripts/ServerShared/PowerBus.cs b/Assets/Scripts/ServerShared/PowerBus.cs index f6fb386ec..d0c53b0df 100644 --- a/Assets/Scripts/ServerShared/PowerBus.cs +++ b/Assets/Scripts/ServerShared/PowerBus.cs @@ -11,9 +11,14 @@ using static CultMath.math; // Entity.TryConsumeEnergy/CanConsumeEnergy: at HEAD every draw succeeded as long as one reactor was online, and // any shortfall was silently taxed onto the reactor as heat instead of ever being refused (§0.5). The bus makes // the ceiling real: demand beyond what this tick's generation and stored capacitor charge can cover goes unmet. -// There are no tiers yet (Cut 5 adds them), so a shortfall rations the whole pool by the same fraction for every -// consumer alike -- the death of the old "whoever equipped first drains the capacitors first" hidden priority -// (§0.5), not a replacement for it. +// +// Cut 5 (docs/stats-and-power-cut.md §1.3) replaces the single shared fraction with priority tiers +// (PowerTiers.cs): the total this tick's supply can cover (TotalGrant, unchanged by tiers -- see below) is +// walked tier by tier, lowest number first. A tier is fed in full before the next tier sees anything left; a +// tier with no demand simply passes its whole share down; within a tier, every consumer's own request is +// rationed by the same fraction, so two requests of unequal size still divide proportionally. This is the death +// of the old "whoever equipped first drains the capacitors first" hidden priority (§0.5), replaced with an +// authored one instead of no priority at all. // // Bus capacitors are charged and drained only here (§0b): Reactor no longer touches them, and neither does any // IPowerConsumer. The four instant draws the cut map names (a burst, a shot, a ping, a hit taken) are @@ -32,16 +37,43 @@ public class PowerBus public float TotalGeneration { get; private set; } public float TotalDemand { get; private set; } - // Energy actually delivered this tick: generation first, then whatever stored capacitor charge covers the - // rest, capped at demand. Equal to TotalDemand whenever supply covers it; equal to (generation + available - // charge) otherwise -- never more, which TryConsumeEnergy could never promise (a reactor always paid the - // remainder as heat, so overdraw was invisible at this level). + // Energy actually delivered this tick, summed across every tier: generation first, then whatever stored + // capacitor charge covers the rest, capped at demand. Equal to TotalDemand whenever supply covers it; equal + // to (generation + available charge) otherwise -- never more, which TryConsumeEnergy could never promise (a + // reactor always paid the remainder as heat, so overdraw was invisible at this level). Which consumers that + // total actually reaches is what tiering (below) decides; this figure is unaffected by tiers -- the ceiling + // is a property of supply, not of priority. public float TotalGrant { get; private set; } - // Fraction of every consumer's own request actually granted this tick, shared by every consumer alike (no - // tiers yet). Also written onto every consuming EquippedItem.PowerSupply. + // Aggregate fraction of all demand granted this tick (TotalGrant / TotalDemand) -- a fleet-wide summary, not + // what any one consumer necessarily received. Still written onto every consuming EquippedItem.PowerSupply + // when every tier in play happens to land on the same ratio (single-tier loadouts, the common case in the + // Cut 3/4 test fixtures), but a multi-tier shortfall gives different tiers different ratios -- read + // TierGrantRatio or the item's own PowerSupply for that. public float GrantRatio { get; private set; } = 1f; + // F3 (docs/stats-and-power-cut.md, Soul pass 2026-09-19): the sentinel AllocateTiers writes for a tier with no + // consumers equipped in it at all. Distinct from 1f -- an empty tier has not been "fully supplied," there was + // nothing to supply, and reporting it as 1f is exactly the fully-satisfied signal a UI is meant to read as + // "this tier is fine," on a ship that may be fully blacked out. A reader must treat NaN as "nothing to report + // here," not as satisfied or starved. + public const float NoDemand = float.NaN; + + // Cut 5: this tick's within-tier grant ratio, indexed by PowerTiers.Critical..Utility. 1f means that tier's + // demand was fully met; NoDemand (NaN) means the tier has no consumers at all (see NoDemand above); anything + // else below 1f is exactly the "starved" state a future UI (Cut 8) reads instead of reconstructing it from + // per-item PowerSupply. A tier below a starved one is always 0f -- §1.3's "a tier boundary does not leak". + public float[] TierGrantRatio { get; } = InitFullTiers(); + + // Before the bus has ever run a Step, there is no grant information at all yet -- not "fully supplied," + // "nothing to report" (NoDemand), same as an empty tier reads once Step does run. + private static float[] InitFullTiers() + { + var ratios = new float[PowerTiers.Count]; + for (var i = 0; i < ratios.Length; i++) ratios[i] = NoDemand; + return ratios; + } + // What Reactor.Execute reads to run its own heat/throttle arithmetic (Cut 3: "the arithmetic survives, moved // under the bus's numbers"). Positive: demand left unmet after generation AND stored charge, split evenly // across online reactors for overload heat. Negative: generation left over after demand and after topping up @@ -49,29 +81,71 @@ public class PowerBus // a reported total, not a sink (§1.2). public float NetDraw { get; private set; } + // One equipped item's power request for this tick, captured once so PowerRequest -- which some behaviours + // (Shield, InstantWeapon, Sensor) implement by refreshing their own cached stats -- is never called twice in + // one Step. + private readonly struct Draw + { + public readonly EquippedItem Item; + public readonly int Tier; + public readonly float Request; + public Draw(EquippedItem item, int tier, float request) { Item = item; Tier = tier; Request = request; } + } + + private static bool ClosedByThermostat(EquippedItem item, Behavior consumer) + { + foreach (var behavior in item.BehaviorGroups[consumer.Data.Group].Behaviors) + { + if (behavior == consumer) return false; + if (behavior is Thermotoggle { Open: false }) return true; + } + return false; + } + public void Step(float dt) { var reactors = new List(); var capacitors = new List(); - var consumers = new List(); + var draws = new List(); foreach (var item in _entity.Equipment) foreach (var behavior in item.Behaviors) { switch (behavior) { - case Reactor reactor when reactor.Item.Online.Value: + // F2 (docs/stats-and-power-cut.md, Soul pass 2026-09-19): this must agree with the one predicate + // Entity.Update actually gates Execute on (Active.Value, Entity.cs -- Enabled && Online), in both + // directions. Gating on Online alone let a reactor the player switched off (Enabled = false, so + // Active is false but Online stays true) keep generating here even though Reactor.Execute -- the + // behaviour that produces the heat receipt -- never runs for it: free, heat-free power. Capacitor + // has no IPowerConsumer/generation role and is unconditionally a store regardless of its own + // item's state (mirrors pre-existing behaviour; nothing in the ruling asks for that to change). + case Reactor reactor when item.Active.Value: reactors.Add(reactor); break; case Capacitor capacitor: capacitors.Add(capacitor); break; } - if (behavior is IPowerConsumer consumer) - consumers.Add(consumer); + // The other direction of the same rule: a consumer switched off or shut down (Active.Value false) + // never runs its Execute, so it must never be billed either -- otherwise a disabled item's demand + // starves every live consumer and drains the capacitors for energy nobody spends. + // And a consumer whose group a thermostat has closed ahead of it does not run this tick either, so it is + // not billed: a heater above its target draws nothing. + if (behavior is IPowerConsumer consumer && item.Active.Value && !ClosedByThermostat(item, behavior)) + { + // Cut 5 (docs/stats-and-power-cut.md §1.3): the item's own stored choice wins once it has one; + // PowerTiers.Unassigned only survives past EquippedItem's constructor for a consumer added to + // the game after this unit was minted, which the constructor never saw -- fall back to the + // behaviour's own default rather than stranding it at an invalid tier. + var tier = item.EquippableItem.PowerTier; + if (tier == PowerTiers.Unassigned) tier = consumer.DefaultPowerTier; + tier = clamp(tier, 0, PowerTiers.Count - 1); + draws.Add(new Draw(item, tier, max(0f, consumer.PowerRequest(dt)))); + } } TotalGeneration = reactors.Sum(r => r.Generation(dt)); - TotalDemand = consumers.Sum(c => max(0f, c.PowerRequest(dt))); + TotalDemand = draws.Sum(d => d.Request); var availableCharge = capacitors.Sum(c => c.Charge); var preCapacitorNet = TotalDemand - TotalGeneration; @@ -92,9 +166,56 @@ public class PowerBus TotalGrant = TotalDemand - overload; GrantRatio = TotalDemand <= 1e-4f ? 1f : saturate(TotalGrant / TotalDemand); - foreach (var item in _entity.Equipment) - if (item.Behaviors.Any(b => b is IPowerConsumer)) - item.PowerSupply = GrantRatio; + AllocateTiers(draws); + } + + // Cut 5 (docs/stats-and-power-cut.md §1.3): walks tiers lowest-number-first, feeding each in full before the + // next sees anything. remaining only ever shrinks, and once it hits 0 every later tier's ratio is 0 by the + // same division -- a lower tier can never take from a higher one (§1.3 "a tier boundary does not leak"), + // because a higher tier's share is committed (remaining -= grant) before a lower tier is even considered. + // Within a tier every consumer shares that tier's one ratio against its own request, so two unequal requests + // still divide proportionally -- the same property Cut 3 proved for the whole ship, now proved per tier. + private void AllocateTiers(List draws) + { + var tierDemand = new float[PowerTiers.Count]; + // F3 (docs/stats-and-power-cut.md, Soul pass 2026-09-19): demand alone cannot tell "no consumer is + // equipped in this tier" from "a real consumer is equipped here and its own request happens to be 0 (or + // effectively 0) this tick" -- both sum to the same tierDemand. Only the first is actually empty; the + // second still has an item reading this tier's ratio back as its own PowerSupply, and that item is owed + // a real answer (trivially 1: it asked for nothing, so nothing it could be short of), not NoDemand. + var tierHasConsumer = new bool[PowerTiers.Count]; + foreach (var draw in draws) { tierDemand[draw.Tier] += draw.Request; tierHasConsumer[draw.Tier] = true; } + + var remaining = TotalGrant; + var ratios = TierGrantRatio; + for (var tier = 0; tier < PowerTiers.Count; tier++) + { + // A tier with genuinely no consumers is not satisfied, it is empty: report NoDemand, not the "fully + // supplied" signal 1f. Nothing to subtract from `remaining` either way. + if (!tierHasConsumer[tier]) { ratios[tier] = NoDemand; continue; } + var demand = tierDemand[tier]; + // This used to short-circuit ANY demand at or below 1e-4 the same way as a genuinely empty tier, + // which both reported a grant nobody made (an item reading ratio 1 while the ship generates nothing, + // down to Soul's own probe at 5e-5) and leaked that tier's unsubtracted share to every lower one. A + // consumer requesting truly nothing (demand <= 0f exactly) is trivially fully met; anything above + // that, however tiny, is rationed like any other tier. + if (demand <= 0f) { ratios[tier] = 1f; continue; } + var grant = min(demand, remaining); + ratios[tier] = saturate(grant / demand); + remaining -= grant; + } + + foreach (var draw in draws) + { + draw.Item.PowerSupply = ratios[draw.Tier]; + // Cut 6 (docs/stats-and-power-cut.md): the missing half of the wiring -- a stat with a PowerSupply + // term must recompute when the grant actually moves. Called unconditionally, once per draw per tick, + // the same shape as EquippedItem.UpdatePerformance's own Heat/Durability invalidation: "recomputes at + // most once per tick per (item, stat)," not "only when the value moved." An item with no PowerSupply + // term pays nothing extra -- the resolver's per-source generation bookkeeping (StatResolver.Resolve) + // only ever looks at sources a stat's own Terms declared. + _entity.Resolver.InvalidateSource(draw.Item, StatSource.PowerSupply); + } } // Mirrors Entity.TryConsumeEnergy's old do/while exactly (draw evenly across every capacitor that still has diff --git a/Assets/Scripts/ServerShared/PowerTiers.cs b/Assets/Scripts/ServerShared/PowerTiers.cs new file mode 100644 index 000000000..c7c88233b --- /dev/null +++ b/Assets/Scripts/ServerShared/PowerTiers.cs @@ -0,0 +1,39 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +// Cut 5 (docs/stats-and-power-cut.md §1.3, Q5: "four or five tiers, defaulted per behaviour kind"). Five tiers, +// numbered so the lowest number is fed first -- PowerBus's allocation pass walks 0..Count-1 in order. Naming +// them here, once, means IPowerConsumer.DefaultPowerTier implementations read as a sentence ("Radiator is +// Critical") instead of a bare integer repeated eight times. +// +// Assignment, per behaviour kind, and why: +// - Critical: Radiator. This game has no dedicated life-support behaviour, and heat is the closest thing to +// one -- a starved radiator does not just fail itself, it cascades into wear and eventual shutdown across +// every other item on the hull (EquippedItem.UpdatePerformance). Feed it first or lose the rest anyway. +// - High: Shield. Hull survival the player is actively trading power for; not a life-support constant, so it +// sits below Radiator rather than beside it. +// - Medium: Thruster. Mobility -- needed to hold position, evade, or disengage, but a ship that +// loses thrust for a tick under brownout is inconvenienced, not dead the way an overheating hull is. +// - Low: ConstantWeapon, InstantWeapon. Offense. The ruling's own framing ("low-priority subsystems starve +// first") names weapons as the default example of what a reactor throttle should sacrifice first. +// - Utility: Sensor, EnergyDraw. Everything else, including the generic/unclassified draw -- an item that +// declares power use without asking for a specific tier should not accidentally outrank a named priority. +// +// A tier is a stored player choice once assigned (EquippableItem.PowerTier), not a derivation the bus repeats +// every tick (§1.3 "Derived state: nothing"). These defaults are read exactly once, in EquippedItem's +// constructor, to seed that stored field the first time an item without a chosen tier gets equipped. +public static class PowerTiers +{ + public const int Critical = 0; + public const int High = 1; + public const int Medium = 2; + public const int Low = 3; + public const int Utility = 4; + + public const int Count = 5; + + // EquippableItem.PowerTier's sentinel for "the player has not chosen one and this item has never been + // equipped yet" -- distinct from 0 (Critical), which is a real, meaningful choice. + public const int Unassigned = -1; +} diff --git a/Assets/Scripts/ServerShared/PowerTiers.cs.meta b/Assets/Scripts/ServerShared/PowerTiers.cs.meta new file mode 100644 index 000000000..b3d61cc80 --- /dev/null +++ b/Assets/Scripts/ServerShared/PowerTiers.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: bd20d57dee4a44fa84660631a9c4f5c1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/ServerShared/Provenance.cs b/Assets/Scripts/ServerShared/Provenance.cs index b04a4aeeb..4121332d6 100644 --- a/Assets/Scripts/ServerShared/Provenance.cs +++ b/Assets/Scripts/ServerShared/Provenance.cs @@ -58,8 +58,8 @@ public class ProvenanceLedger } } -// One lot: the design it built, who made it and from what, its rolled workmanship, and how well each design role -// was filled. Immutable once minted; instances carry a LotId, never a copy. +// One lot: the design it built, who made it and from what, its final assembly quality, how well each design role +// was filled, and the branded product it was made as. Immutable once minted; instances carry a LotId, never a copy. [MessagePackObject] public class Lot { @@ -68,18 +68,34 @@ public class Lot [Key(2)] public float Quality; [Key(3)] public List Roles; - // The quality a stat reads for one of the design's roles. An unnamed role, a design without roles, and a lot - // minted before roles existed all fall back to the lot's own workmanship. + // The product the lot was made as: the one owner of which product names its units. Unset for unbranded lots + // (console give, presets, extracted), which brand their maker only. + [Key(4)] public CultRecordRef Product; + + // The quality a stat reads for one of the design's roles: the part's, capped by the lot's own final assembly + // (quality-lean-assembly-hard-ceiling), so a part better than its assembly is worth the assembly. An unnamed role, a + // design without roles, and a role without a fill read the item's effective quality. public float QualityForRole(string role) { - if (string.IsNullOrEmpty(role) || Roles == null) return Quality; + if (string.IsNullOrEmpty(role) || Roles == null) return EffectiveQuality(); foreach (var fill in Roles) - if (fill.Role == role) return fill.Quality; - return Quality; + if (fill.Role == role) return Math.Min(fill.Quality, Quality); + return EffectiveQuality(); + } + + // The item's one quality (effective-quality-mean-of-roles): the mean over its role fills of the part capped by the final + // assembly. Price, tier, heat, durability and wear all read it; a roleless lot reads its assembly. + public float EffectiveQuality() + { + if (Roles == null || Roles.Count == 0) return Quality; + var sum = 0f; + foreach (var fill in Roles) sum += Math.Min(fill.Quality, Quality); + return sum / Roles.Count; } } -// One filled slot: the design's role name and how good the part that went into it turned out to be. +// One filled slot: the design's role name and how good the part that went into it turned out to be. Stats read it through +// Lot.QualityForRole and Lot.EffectiveQuality, capped by the lot's assembly; the raw value is kept for disassembly (named-components-after-demo). [MessagePackObject] public class RoleFill { diff --git a/Assets/Scripts/ServerShared/Recipes.cs b/Assets/Scripts/ServerShared/Recipes.cs new file mode 100644 index 000000000..e434a84a5 --- /dev/null +++ b/Assets/Scripts/ServerShared/Recipes.cs @@ -0,0 +1,138 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using GameCult.Caching; +using MessagePack; +using Newtonsoft.Json; + +// How a good is made: one authored record per output, keyed recipe:, so a second recipe for one output replaces the +// first. A commodity's recipe takes named commodities (Inputs) and roles (RoleInputs), each role filled by any commodity whose +// recipe Fills it, and says which roles it can fill. A role recipe (the output is a design with roles, a ship hull, a piece of +// gear, a consumer good) restates nothing of the design: its role inputs are the design's Roles and their counts. Station and +// Turret hulls take no recipe. +[CultDocument("aetheria.recipedata", "1"), MessagePackObject, JsonObject(MemberSerialization.OptIn)] +public class RecipeData +{ + [JsonProperty("output"), Key(0)] + public CultRecordRef Output; + + [JsonProperty("outputCount"), Key(1)] + public int OutputCount = 1; + + // Commodities one cycle consumes. Empty on a raw good and on a role recipe. + [JsonProperty("inputs"), Key(2)] + public List Inputs = new List(); + + // Seconds of sim time for one cycle. + [JsonProperty("cycle"), Key(3)] + public float Cycle = 1; + + // Crew per running facility; no kind until workforce kinds exist. + [JsonProperty("workforce"), Key(4)] + public int Workforce; + + // Commodities one cycle uses up on the side (power, coolant), per cycle. + [JsonProperty("upkeep"), Key(5)] + public List Upkeep = new List(); + + // The kind of station that runs this recipe. + [JsonProperty("stationKind"), Key(6)] + public CultRecordRef StationKind; + + // Why this good exists in the world, in the operator's reading. Presence is checked, never its meaning. + [JsonProperty("loreHook"), Key(7)] + public string LoreHook; + + // The roles of a design this commodity can fill. Only a commodity's recipe has any. + [JsonProperty("fills"), Key(8)] + public List Fills = new List(); + + // Roles one cycle consumes, any filler will do and the facility picks (ruling ores-fill-metal-roles). Empty on a role recipe; + // records written before key 9 read it as empty. + [JsonProperty("roleInputs"), Key(9)] + public List RoleInputs = new List(); + + public static CultRecordKey KeyOf(CultRecordKey outputKey) => new CultRecordKey("recipe:" + outputKey.Value); +} + +[MessagePackObject, JsonObject(MemberSerialization.OptIn)] +public class CommodityCount +{ + [JsonProperty("commodity"), Key(0)] + public CultRecordRef Commodity; + + [JsonProperty("count"), Key(1)] + public int Count = 1; +} + +// A region gate's trade with the world beyond it: what the outside buys and sells, at what price and at most how fast. +// The union of all records is the outside; keyed outside-market:. +[CultDocument("aetheria.outsidemarketdata", "1"), MessagePackObject, JsonObject(MemberSerialization.OptIn)] +public class OutsideMarketData +{ + [CultName, JsonProperty("name"), Key(0)] + public string Name; + + [JsonProperty("rows"), Key(1)] + public List Rows = new List(); + + public static CultRecordKey KeyOf(string id) => new CultRecordKey("outside-market:" + id); +} + +[MessagePackObject, JsonObject(MemberSerialization.OptIn)] +public class OutsideMarketRow +{ + [JsonProperty("commodity"), Key(0)] + public CultRecordRef Commodity; + + [JsonProperty("price"), Key(1)] + public int Price; + + [JsonProperty("buys"), Key(2)] + public bool Buys; + + [JsonProperty("sells"), Key(3)] + public bool Sells; + + [JsonProperty("ratePerHour"), Key(4)] + public float RatePerHour; +} + +// The one reader of recipes: which recipe makes a good, a recipe's role slots (RoleInputsOf), which commodities fill a role, and +// what a good is by its recipe. +public static class Recipes +{ + public static RecipeData RecipeOf(CultCache catalog, ItemData item) => + item == null ? null : catalog.Get(RecipeData.KeyOf(catalog.RefOf(item).Key)); + + public static bool IsCommodity(ItemData item) => item is SimpleCommodityData || item is CompoundCommodityData; + + public static IReadOnlyList RolesOf(ItemData item) => + (item as CraftedItemData)?.Roles ?? new List(); + + // A recipe whose output is a design with roles: a part list rather than a list of inputs. + public static bool IsRoleRecipe(CultCache catalog, RecipeData recipe) + { + var output = catalog.Get(recipe.Output); + return output is CraftedItemData && RolesOf(output).Count > 0; + } + + // The one reader of a recipe's role slots: the design's Roles for a role recipe, else the recipe's RoleInputs. + public static IReadOnlyList RoleInputsOf(CultCache catalog, RecipeData recipe) => + IsRoleRecipe(catalog, recipe) ? RolesOf(catalog.Get(recipe.Output)) : (IReadOnlyList) recipe.RoleInputs ?? new List(); + + // Raw: takes no commodity and no role. Everything else is processed. Derived, never stored. + public static bool IsRaw(CultCache catalog, RecipeData recipe) => recipe.Inputs.Count == 0 && RoleInputsOf(catalog, recipe).Count == 0; + + // A commodity made by a role recipe: it is assembled from the same components gear is. + public static bool IsConsumerGood(CultCache catalog, RecipeData recipe) => + IsCommodity(catalog.Get(recipe.Output)) && IsRoleRecipe(catalog, recipe); + + // The commodities whose recipes Fill the role, ordered by key so a choice never depends on store order. + public static CultRecordKey[] Fillers(CultCache catalog, string role) => + catalog.GetAll() + .Where(recipe => recipe.Fills != null && recipe.Fills.Contains(role) && IsCommodity(catalog.Get(recipe.Output))) + .Select(recipe => recipe.Output.Key) + .OrderBy(key => key.Value, StringComparer.Ordinal) + .ToArray(); +} diff --git a/Assets/Scripts/ServerShared/Recipes.cs.meta b/Assets/Scripts/ServerShared/Recipes.cs.meta new file mode 100644 index 000000000..f98aa618a --- /dev/null +++ b/Assets/Scripts/ServerShared/Recipes.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3c9a51d7e0b24f68a1e47d92b5c08f31 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/ServerShared/RunGoal.cs b/Assets/Scripts/ServerShared/RunGoal.cs new file mode 100644 index 000000000..454cc5cd2 --- /dev/null +++ b/Assets/Scripts/ServerShared/RunGoal.cs @@ -0,0 +1,44 @@ +using System.Linq; +using CultMath; +using static CultMath.math; + +// The run's goal: whether a zone's boss lives, and so whether the exit gate is open. Engine-free and stateless; the +// answer is derived from Zone.Entities (the death path removes the dead, Zone.cs), so no "boss defeated" flag exists to +// disagree with it, and no presentation decides it. +public static class RunGoal +{ + public static Entity Boss(Zone zone) => zone.Entities.FirstOrDefault(entity => entity.IsBoss); + + public static bool BossAlive(Zone zone) => Boss(zone) != null; + + // The exit gate fails closed: it is open only in the galaxy's exit zone, once a boss was spawned there and no living + // boss remains. An exit zone that never got a boss stays sealed, so a missing boss can never read as a dead one. + public static bool ExitOpen(Zone zone) => + zone.Galaxy?.Exit != null && zone.GalaxyZone == zone.Galaxy.Exit && zone.Pack.BossSpawned && !BossAlive(zone); + + // Where the exit gate sits: at the adjacency wormholes' radius (the zone's radius times the ratio), in the middle of + // the widest angular gap between them, so it shares a point with none. Of exactly equal gaps the first in ascending angle + // wins (the <= below): placement is not saved, so this rule is what keeps the gate still between builds. A zone with no + // neighbours gets the +x axis. + public static float2 ExitGatePosition(Zone zone, float wormholeDistanceRatio) + { + var radius = zone.Pack.Radius * wormholeDistanceRatio; + var angles = zone.GalaxyZone.AdjacentZones + .Select(adjacent => normalize(adjacent.Position - zone.GalaxyZone.Position)) + .Select(direction => atan2(direction.y, direction.x)) + .OrderBy(angle => angle) + .ToArray(); + if (angles.Length == 0) return float2(radius, 0); + + var bestAngle = 0f; + var bestGap = -1f; + for (var i = 0; i < angles.Length; i++) + { + var next = i + 1 < angles.Length ? angles[i + 1] : angles[0] + 2 * PI; + if (next - angles[i] <= bestGap) continue; + bestGap = next - angles[i]; + bestAngle = angles[i] + bestGap / 2; + } + return float2(cos(bestAngle), sin(bestAngle)) * radius; + } +} diff --git a/Assets/Scripts/ServerShared/RunGoal.cs.meta b/Assets/Scripts/ServerShared/RunGoal.cs.meta new file mode 100644 index 000000000..2e3839fad --- /dev/null +++ b/Assets/Scripts/ServerShared/RunGoal.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: de03c3545cb04ce38bf85b713dc5df74 diff --git a/Assets/Scripts/ServerShared/RunStart.cs b/Assets/Scripts/ServerShared/RunStart.cs new file mode 100644 index 000000000..20269e84c --- /dev/null +++ b/Assets/Scripts/ServerShared/RunStart.cs @@ -0,0 +1,89 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Random = CultMath.Random; + +// The owner of a new run (docs/scenarios-cut.md, R.4). Every new run is a scenario: RunStart generates its galaxy, +// generates its arena (the galaxy's entrance zone) under the scenario's Ambient rule, and admits what the scenario +// stages through Zone.Admit, all of it or none of it. A scenario only declares; nothing else generates a new run's +// galaxy, generates or admits its player, or chooses its hull or faction. It holds no Unity type. +public static class RunStart +{ + public sealed class Staged + { + public Ship Player; + public int Credits; // the run's starting credits, as the scenario left them + public List Entities; // what the scenario placed besides the player, in its order + } + + // The scenario's galaxy, at the scenario's seed or, when that is zero, the clock's. + public static Galaxy Generate(Scenario scenario, GalaxyStage stage) + { + stage.SeedFrom(scenario); + return scenario.Generate(stage) ?? throw new InvalidOperationException($"Scenario {scenario.Name} generated no galaxy."); + } + + public static ZonePack GenerateArena(ItemManager itemManager, ZoneGenerationSettings zoneSettings, PlanetSettings planetSettings, Galaxy galaxy, Scenario scenario) + { + SeedItems(itemManager, galaxy, ArenaStep); + return galaxy.Entrance.PackedContents = ZoneGenerator.GenerateZone( + itemManager, zoneSettings, planetSettings, galaxy, galaxy.Entrance, galaxy.IsPrelude, scenario.Ambient); + } + + // Runs the scenario's Stage, then admits its player and everything it placed: each entity's stance set both ways + // with the player, a pilot for each piloted one. Returns null, with every failure listed and the arena unchanged, + // unless the whole scenario staged. + public static Staged Stage(ItemManager itemManager, Zone arena, Scenario scenario, string startingHull, + TutorialGenerationSettings tutorialGenerationSettings, List failures) + { + SeedItems(itemManager, arena.Galaxy, StageStep); + var stage = new ScenarioStage(itemManager, arena, startingHull, tutorialGenerationSettings); + scenario.Stage(stage); + var reported = failures.Count; + failures.AddRange(stage.Failures); + if (!stage.PlayerPlaced) + failures.Add("player: the scenario places no player"); + if (failures.Count > reported) return null; + + var player = stage.PlayerShip; + player.IsPlayerShip = true; + arena.Admit(player, piloted: false); + foreach (var placed in stage.Placed) + { + var hostile = placed.Stance == ScenarioStance.Hostile; + placed.Entity.SetIff(player, hostile); + player.SetIff(placed.Entity, hostile); + arena.Admit(placed.Entity, placed.Piloted, placed.Task); + } + + // A start state includes what a pilot knows (ruling stage-states-pilot-knowledge): its anchor is tracked from the first + // step, by the sensors' own path (info gathered past the detection threshold), so they can lose it like any track. + foreach (var placed in stage.Placed) + if (placed.Knows != null && placed.Piloted) + placed.Entity.EntityInfoGathered[placed.Knows] = (itemManager.GameplaySettings.TargetDetectionInfoThreshold + 1f) / 2f; + return new Staged { Player = player, Credits = stage.Credits, Entities = stage.Placed.Select(placed => placed.Entity).ToList() }; + } + + // A new run's item draws (each lot's quality, each generated fit) come from its galaxy's seed, not the process clock, + // so a fixed seed fixes the arena's gear and the player's fit. Each step draws its own stream, so whatever runs + // between them (populating the level) cannot shift it. + private static void SeedItems(ItemManager itemManager, Galaxy galaxy, uint step) => + itemManager.Random = new Random(ItemSeed(galaxy, step)); + + // The steps of a run that draw items: generating its arena, staging its scenario, and continuing a saved run. + public const uint ArenaStep = 1; + public const uint StageStep = 2; + public const uint ContinueStep = 3; + + // The item seed of an ActionGameManager scene opened with no galaxy. No run is loaded, so nothing a run decides + // draws from it. + public const uint NoRunSeed = 0x5EED0001u; + + // The item stream's seed for one step of a run: the run's seed and the step. Never zero, which no stream accepts. + public static uint ItemSeed(Galaxy galaxy, uint step) + { + var seed = galaxy.Seed * 0x9E3779B1u + step; + if (seed == 0) throw new InvalidOperationException($"Item seed is zero for galaxy seed {galaxy.Seed} at step {step}."); + return seed; + } +} diff --git a/Assets/Scripts/ServerShared/RunStart.cs.meta b/Assets/Scripts/ServerShared/RunStart.cs.meta new file mode 100644 index 000000000..2ccf2e506 --- /dev/null +++ b/Assets/Scripts/ServerShared/RunStart.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 28412ed9a0fc4f95b157846b0b132c27 diff --git a/Assets/Scripts/ServerShared/SavedGame.cs b/Assets/Scripts/ServerShared/SavedGame.cs index 41cd613ac..90ef03566 100644 --- a/Assets/Scripts/ServerShared/SavedGame.cs +++ b/Assets/Scripts/ServerShared/SavedGame.cs @@ -47,6 +47,30 @@ public class SavedGame [Key(12)] public FactionRelationship[] Relationships; + + [Key(13)] + public int Credits; + + // The run's seed (Galaxy.Seed), minted once by GalaxyStage.SeedFrom. Written only by RunSave.Capture and read only + // by Galaxy's save constructor; 0 in a save written before run-seed, which then rolls name-only drops. + [Key(14)] + public uint Seed; + + // The run's resource provinces (Galaxy.Provinces): each province's seed zone index and its type. Written only by + // RunSave.Capture and read only by Galaxy's save constructor; null in a save written before ore geography, which then + // gets Regions, Partition and Deal from its saved graph, boss zones, Exit and seed. + [Key(15)] + public List Provinces; +} + +[MessagePackObject] +public class SavedProvince +{ + [Key(0)] + public int Seed; + + [Key(1)] + public CultRecordRef Type; } // The run's lifecycle over the run store. Only Commit creates SavedGame, SavedZone and ProvenanceLedger records; @@ -55,7 +79,7 @@ public static class RunSave { // The live run as plain documents. Writes nothing. public static (SavedGame Game, SavedZone[] Zones) Capture(CultCache cache, Galaxy galaxy, Zone currentZone, - Entity currentEntity, bool isTutorial, SavedActionBarBinding[] actionBar) + Entity currentEntity, SavedActionBarBinding[] actionBar, int credits) { var factions = galaxy.HomeZones.Keys.ToArray(); var game = new SavedGame @@ -74,8 +98,10 @@ public static class RunSave CurrentZoneEntity = currentZone.Entities.IndexOf(currentEntity), Entrance = Array.IndexOf(galaxy.Zones, galaxy.Entrance), Exit = Array.IndexOf(galaxy.Zones, galaxy.Exit), - IsTutorial = isTutorial, - ActionBarBindings = actionBar + IsTutorial = galaxy.IsPrelude, + ActionBarBindings = actionBar, + Credits = credits, + Seed = galaxy.Seed }; // A zone generated earlier but not loaded this session has no live Contents; its packed contents carry over. @@ -86,11 +112,47 @@ public static class RunSave AdjacentZones = zone.AdjacentZones.Select(az => Array.IndexOf(galaxy.Zones, az)).ToArray(), Factions = zone.Factions.Select(f => Array.IndexOf(factions, f)).ToArray(), Contents = zone.Contents?.PackZone() ?? zone.PackedContents, - Owner = zone.Owner == null ? -1 : Array.IndexOf(factions, zone.Owner) + Owner = zone.Owner == null ? -1 : Array.IndexOf(factions, zone.Owner), + Province = Array.IndexOf(galaxy.Zones, zone.Province.Seed) }).ToArray(); + game.Provinces = galaxy.Provinces.Select(province => new SavedProvince + {Seed = Array.IndexOf(galaxy.Zones, province.Seed), Type = province.Type}).ToList(); return (game, zones); } + // Continue's gate: every design a saved run names (each zone's items and each minted lot) must be one this catalog + // holds. A run made with a mod that is no longer installed is refused, naming the mod ships, before any scene is + // built; the save is never edited to fit. + public static void RequireDesigns(CultCache cache, SavedGame game) + { + var designs = new List(); + foreach (var zoneRef in game.Zones ?? Array.Empty>()) + { + var where = zoneRef.Key.Value; + var zone = cache.Get(zoneRef) ?? throw MalformedSave($"zone {where} has no record"); + // A zone never visited has no contents: legitimately null. + foreach (var pack in zone.Contents?.Entities ?? new List()) + foreach (var item in EntitySerializer.Items(pack)) + designs.Add((item ?? throw MalformedSave($"an item in {where} is null")).Data.Key); + } + foreach (var (number, lot) in Lots(cache).Lots ?? throw MalformedSave("the lot ledger has no lots")) + designs.Add((lot ?? throw MalformedSave($"lot {number} is null")).Design.Key); + var named = designs.Where(key => key.IsSet()).Distinct() + .Where(key => cache.Get(key) == null) + .Select(key => key.Value).OrderBy(key => key, StringComparer.Ordinal).ToArray(); + if (named.Length == 0) return; + const string modHull = "mod-hull:"; + var mods = named.Where(key => key.StartsWith(modHull, StringComparison.Ordinal)).Select(key => key.Substring(modHull.Length)).ToArray(); + var others = named.Where(key => !key.StartsWith(modHull, StringComparison.Ordinal)).ToArray(); + throw new InvalidOperationException("This run names designs the catalog no longer holds" + + (mods.Length > 0 ? $"; missing mod ships: {string.Join(", ", mods)}" : "") + + (others.Length > 0 ? $"; missing other designs: {string.Join(", ", others)}" : "") + + ". Reinstall them, or start a new game."); + } + + private static InvalidOperationException MalformedSave(string where) => + new InvalidOperationException($"This run's save is malformed: {where}. Start a new game."); + // The stored ledger, or a fresh empty one when the run has minted nothing yet. public static ProvenanceLedger Lots(CultCache cache) => cache.GetGlobal() ?? new ProvenanceLedger(); @@ -122,17 +184,37 @@ public static class RunSave } // Removes every run record (SavedGame, SavedZone, OrbitData, BodyData, ProvenanceLedger) in one Commit. - public static void Clear(CultCache cache) + public static void Clear(CultCache cache) => Remove(cache, Records(cache)); + + // A new run replaces the saved one only once it has started: start runs with the saved run still in the store. + // When it returns a value, the saved run's records go. When it returns null or throws, the records it wrote go and + // the saved run stays as it was. + public static T Replace(CultCache cache, Func start) where T : class { - var run = cache.AllStoredDocuments + var saved = Records(cache); + T started = null; + try + { + started = start(); + } + finally + { + Remove(cache, started != null ? saved : Records(cache).Except(saved).ToArray()); + } + return started; + } + + private static CultRecordKey[] Records(CultCache cache) => + cache.AllStoredDocuments .Where(stored => IsRunRecord(stored.Descriptor.DocumentType)) .Select(stored => stored.Key) .ToArray(); + + private static void Remove(CultCache cache, CultRecordKey[] records) => cache.Commit(batch => { - foreach (var key in run) batch.Remove(key); + foreach (var key in records) batch.Remove(key); }); - } public static bool IsRunRecord(Type documentType) => AetheriaStores.RunTypes.Any(home => home.IsAssignableFrom(documentType)); @@ -158,6 +240,11 @@ public class SavedZone [Key(5)] public ZonePack Contents; + + // The seed zone index of the zone's province. Written only by RunSave.Capture and read only by Galaxy's save + // constructor; meaningful only when SavedGame.Provinces is present. + [Key(6)] + public int Province; } [MessagePackObject, diff --git a/Assets/Scripts/ServerShared/Scenario.cs b/Assets/Scripts/ServerShared/Scenario.cs new file mode 100644 index 000000000..72b084866 --- /dev/null +++ b/Assets/Scripts/ServerShared/Scenario.cs @@ -0,0 +1,36 @@ +// A scenario is one way to set up a new run (docs/scenarios-cut.md, R): a script, compiled with the game, that says +// which galaxy to generate and what the run starts with. New Game lists them (Scenarios). RunStart runs one: it +// generates the galaxy through GalaxyStage, the arena under Ambient, and admits what Stage placed through a +// ScenarioStage. A scenario only declares; once staged, everything it placed is ordinary run state. +public abstract class Scenario +{ + public abstract string Name { get; } + + // The scenario's stable identity: kebab-case, unique across Scenarios, never shown to the player, recorded by + // matches and replays. Name is display only. + public abstract string Id { get; } + + // The conditions and what to verify in them, shown under the scenario's button. + public abstract string Brief { get; } + + // Zero draws the seed from the clock, so each launch is a new galaxy. Anything else fixes the galaxy, its + // background, its arena and every fit, each item's maker and workmanship included, so every launch has the same + // layout. + public virtual uint Seed => 0; + + // False: the arena keeps its planets, orbits and stations but generates no ship or turret, so nothing wanders into + // the scenario's conditions. + public virtual bool Ambient => true; + + // Which galaxy the run is in: stage.Main() or stage.Prelude(). + public abstract Galaxy Generate(GalaxyStage stage); + + // What the run starts with: exactly one stage.Player, and anything else the scenario places. + public abstract void Stage(ScenarioStage stage); +} + +public enum ScenarioStance +{ + Neutral, + Hostile +} diff --git a/Assets/Scripts/ServerShared/Scenario.cs.meta b/Assets/Scripts/ServerShared/Scenario.cs.meta new file mode 100644 index 000000000..bea3a0eb2 --- /dev/null +++ b/Assets/Scripts/ServerShared/Scenario.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: da26f6b6c5f34deaa1057177e2dd3262 diff --git a/Assets/Scripts/ServerShared/ScenarioStage.cs b/Assets/Scripts/ServerShared/ScenarioStage.cs new file mode 100644 index 000000000..453ede8ec --- /dev/null +++ b/Assets/Scripts/ServerShared/ScenarioStage.cs @@ -0,0 +1,231 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using CultMath; +using GameCult.Caching; +using static CultMath.math; +using float2 = CultMath.float2; +using float3 = CultMath.float3; + +// The run half of a scenario's vocabulary (docs/scenarios-cut.md, R.4). A scenario's Stage builds its fits and places +// them here; nothing joins the arena until Stage returns with no failure, and then RunStart admits it all at once. +// Every verb names what it could not do instead of throwing, so one bad name in a script lists every bad name. +// Designs, hulls and products are named as the catalog names them. Only RunStart builds a stage. +public sealed class ScenarioStage +{ + private readonly ItemManager _items; + private readonly Func _choose; + private readonly List _failures = new List(); + private readonly List _placed = new List(); + private int _placements; + + internal ScenarioStage(ItemManager items, Zone arena, string startingHull, TutorialGenerationSettings tutorialGenerationSettings) + { + _items = items; + Arena = arena; + StartingHull = startingHull; + TutorialGenerationSettings = tutorialGenerationSettings; + Credits = items.GameplaySettings.StartingCredits; + // A design named without a product is chosen by the generator's ChooseProduct. The stage outfits with no faction, + // so every maker is reachable and the run's seed draws. + _choose = new LoadoutGenerator(ref items.Random, items, arena.Galaxy, arena.GalaxyZone, null, 2).ChooseProduct; + } + + public Galaxy Galaxy => Arena.Galaxy; + public Zone Arena { get; } + public string StartingHull { get; } + public TutorialGenerationSettings TutorialGenerationSettings { get; } + + // What the run starts with: the gameplay settings' starting credits unless the scenario sets another amount. + public int Credits { get; set; } + + internal IReadOnlyList Failures => _failures; + internal bool PlayerPlaced { get; private set; } + internal Ship PlayerShip { get; private set; } + internal IReadOnlyList Placed => _placed; + + internal sealed class Placement + { + public Entity Entity; + public ScenarioStance Stance; + public bool Piloted; + public AgentTask Task; + // What the pilot already knows at the start: an entity its sensors hold a track of (Approach). Seeded through the + // sensors' own state at admission, so they may lose it honestly. + public Entity Knows; + } + + // A hull fitted slot by slot: each slot a design or a product, the hull cell it goes in, and its rotation. A name is + // a design (open: the stage chooses its product) or a product (pinned: that brand). + public ScenarioFit Fit(string hull, params (string design, int2 cell, ItemRotation rotation)[] slots) => + FitAt(hull, null, slots); + + // The same fit with every lot it mints (hull, slots, unbranded) at the stated quality, drawing nothing. A fit a scenario's + // checks rest on states its quality, so the check does not ride the item stream. + public ScenarioFit Fit(string hull, float quality, params (string design, int2 cell, ItemRotation rotation)[] slots) => + FitAt(hull, quality, slots); + + private ScenarioFit FitAt(string hull, float? quality, (string design, int2 cell, ItemRotation rotation)[] slots) + { + var where = $"fit {hull}"; + var (hullData, hullProduct) = NamedOrProduct(hull, where); + var loadout = new Loadout { Name = hull, WeaponGroups = new int[0][] }; + if (hullData != null) loadout.Hull = _items.ItemData.RefOf(hullData); + if (hullProduct != null) loadout.HullProduct = _items.ItemData.RefOf(hullProduct); + foreach (var (design, cell, rotation) in slots) + { + var (data, product) = NamedOrProduct(design, where); + if (data == null) continue; + loadout.Slots.Add(new LoadoutSlot + { + Design = _items.ItemData.RefOf(data), Position = cell, Rotation = rotation, + Product = product == null ? default : _items.ItemData.RefOf(product) + }); + } + return hullData != null && loadout.Slots.Count == slots.Length ? new ScenarioFit(loadout, quality) : null; + } + + // A hull with nothing fitted. + public ScenarioFit Bare(string hull) => Fit(hull); + + // A fit generated as the game generates its ships, for the faction when one is given, from the run's item draws, + // which RunStart seeds from the galaxy's seed. An empty hull means any ship hull. + public ScenarioFit Generated(string hull, Faction faction = null) + { + var generator = new LoadoutGenerator(ref _items.Random, _items, Galaxy, Arena.GalaxyZone, faction, 2); + var pack = generator.GenerateShipLoadout(data => string.IsNullOrEmpty(hull) || data.Name == hull); + if (pack != null) return new ScenarioFit(pack); + _failures.Add($"generated: no ship hull named {hull}"); + return null; + } + + // A loadout preset from the catalog, as capturepreset or Studio wrote it. + public ScenarioFit Preset(string name) + { + var preset = _items.ItemData.GetAll().FirstOrDefault(loadout => loadout.Name == name); + if (preset != null) return new ScenarioFit(preset); + _failures.Add($"preset {name}: no such preset"); + return null; + } + + // The player's ship. A run has exactly one, and it is a ship hull. + public Ship Player(ScenarioFit fit, float2 at, float2 facing = default) + { + if (PlayerPlaced) + { + _failures.Add("player: the scenario places a second player"); + return null; + } + PlayerPlaced = true; + var entity = Build(fit, "player", at, facing); + if (entity == null) return null; + if (entity is Ship ship) return PlayerShip = ship; + _failures.Add($"player: {entity.Name} is not a ship hull"); + return null; + } + + // Anything else in the arena. A stance holds both ways between it and the player. A piloted ship gets the zone's + // pilot; an unpiloted entity has none and goes nowhere on its own unless it is placed moving: velocity is the planar + // velocity it starts with, and the sim carries it from there. A turret hull stays where it is put. + public Entity Place(ScenarioFit fit, float2 at, float2 facing = default, ScenarioStance stance = ScenarioStance.Neutral, bool piloted = false, + float2 velocity = default) + { + var where = $"entity {_placements++}"; + var entity = Build(fit, where, at, facing); + if (entity == null) return null; + entity.Velocity = velocity; + if (piloted && !(entity is Ship)) _failures.Add($"{where}: {entity.Name} is not a ship hull, so it cannot be piloted"); + _placed.Add(new Placement { Entity = entity, Stance = stance, Piloted = piloted }); + return entity; + } + + // The task a piloted entity starts on: it closes on the target and holds there (the flight's follow task, standoff + // nothing), in place of the patrol circuit the zone would draw for it. The pilot starts knowing it (RunStart seeds a sensor track). A check that rests on where a pilot goes states + // it here, so the pilot's course is the scenario's and not a draw. An entity that is not placed and piloted, or a + // target that is not placed, is a failure. + public void Approach(Entity entity, Entity target) + { + var placement = _placed.FirstOrDefault(p => ReferenceEquals(p.Entity, entity)); + if (placement == null || !placement.Piloted) { _failures.Add($"approach: {entity?.Name ?? "no entity"} is not a placed, piloted ship"); return; } + if (target == null) { _failures.Add("approach: no target to close on"); return; } + // The one production handle minted from truth: the stage states the pilot's knowledge of its anchor (ruling + // stage-states-pilot-knowledge), and RunStart seeds the matching sensor track. The view still answers about the + // anchor only while the pilot's sensors hold it. + placement.Task = new FollowTask { Anchor = PilotView.Handle(target), Standoff = 0f }; + placement.Knows = target; + } + + // Items in the entity's first cargo bay, one per name. A name is an equippable or consumable design (open: the stage + // chooses its product) or a product of one (pinned); a name that is neither is a failure. + public void Cargo(Entity entity, params string[] names) + { + if (entity == null) return; + var where = $"cargo of {entity.Name}"; + var bay = entity.CargoBays.FirstOrDefault(); + foreach (var name in names) + { + var (data, product) = NamedOrProduct(name, where, found => found is EquippableItemData || found is ConsumableItemData); + if (data == null) continue; + var build = Loadouts.Resolve(_items, _items.ItemData.RefOf(data), + product == null ? default : _items.ItemData.RefOf(product), _choose, where, _failures); + if (build == null) continue; + if (bay == null || !bay.TryStore(build())) + _failures.Add($"{where}: no room for {name}"); + } + } + + private Entity Build(ScenarioFit fit, string where, float2 at, float2 facing) + { + if (fit == null) return null; // the verb that made it named why + + Entity entity; + if (fit.Pack != null) entity = EntitySerializer.Unpack(_items, Arena, fit.Pack); + else + { + var failures = new List(); + entity = Loadouts.Materialize(_items, Arena, fit.Loadout, _choose, failures, fit.Quality); + _failures.AddRange(failures.Select(failure => $"{where} ({fit.Loadout.Name}): {failure}")); + if (entity == null) return null; + } + + entity.Position = float3(at.x, 0, at.y); + if (lengthsq(facing) > 0) entity.Direction = normalize(facing); + return entity; + } + + // A name is a design, or else exactly one product (names are unique) whose design is a T passing among: the design + // and that product. Neither is Named's failure. + private (T design, FactionProductData product) NamedOrProduct(string name, string where, Func among = null) where T : CraftedItemData + { + var cache = _items.ItemData; + var products = cache.GetAll().Where(p => p.Name == name && cache.Get(p.Design) is T design && (among == null || among(design))).Take(2).ToArray(); + if (products.Length == 1 && !cache.GetAll().Any(data => data.Name == name && (among == null || among(data)))) + return ((T) cache.Get(products[0].Design), products[0]); + return (Named(name, where, among), null); + } + + private T Named(string name, string where, Func among = null) where T : CraftedItemData + { + var named = _items.ItemData.GetAll().Where(data => data.Name == name && (among == null || among(data))).Take(2).ToArray(); + if (named.Length == 1) return named[0]; + _failures.Add(named.Length == 0 ? $"{where}: no design named {name}" : $"{where}: more than one design is named {name}"); + return null; + } +} + +// What a scenario places: a fit built from named designs or a preset, or a ship generated as the game generates them. +// Only ScenarioStage makes one. +public sealed class ScenarioFit +{ + internal readonly Loadout Loadout; + internal readonly EntityPack Pack; + internal readonly float? Quality; + + internal ScenarioFit(Loadout loadout, float? quality = null) + { + Loadout = loadout; + Quality = quality; + } + + internal ScenarioFit(EntityPack pack) => Pack = pack; +} diff --git a/Assets/Scripts/ServerShared/ScenarioStage.cs.meta b/Assets/Scripts/ServerShared/ScenarioStage.cs.meta new file mode 100644 index 000000000..91b73afb6 --- /dev/null +++ b/Assets/Scripts/ServerShared/ScenarioStage.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d8cd00dc23604dfb91e128e1a9a4a3d5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/ServerShared/Scenarios.meta b/Assets/Scripts/ServerShared/Scenarios.meta new file mode 100644 index 000000000..d6472c75c --- /dev/null +++ b/Assets/Scripts/ServerShared/Scenarios.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 35866d82219241ae9fdb0030039afbed +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/ServerShared/Scenarios/AiFusedDiscipline.cs b/Assets/Scripts/ServerShared/Scenarios/AiFusedDiscipline.cs new file mode 100644 index 000000000..beb4235da --- /dev/null +++ b/Assets/Scripts/ServerShared/Scenarios/AiFusedDiscipline.cs @@ -0,0 +1,37 @@ +using static CultMath.math; +using static ItemRotation; + +public sealed class AiFusedDiscipline : Scenario +{ + public override string Name => "AI Fused Discipline"; + public override string Id => "ai-fused-discipline"; + public override string Brief => "A Djinni; a piloted neutral Longinus carrying a Smoke Proximity and a piloted hostile Longinus whose only weapon is " + + "Smoke Refused. Verify: the hostile closes on you and never fires its refused weapon; the neutral never fires its " + + "fused one."; + public override uint Seed => 110; + public override bool Ambient => false; + + public static readonly CultMath.float2 Hostile = float2(0, 700), Neutral = float2(500, 300); + + public override Galaxy Generate(GalaxyStage stage) => stage.Prelude(DemoTerminus.Cast); + + public override void Stage(ScenarioStage stage) + { + ScenarioFit Armed(string weapon) => stage.Fit("Longinus", + ("Cockpit 2x2", int2(2, 6), None), + ("Large Drive", int2(1, 0), Reversed), + ("Large Drive", int2(3, 0), Reversed), + ("Rugged Drive", int2(2, 14), CounterClockwise), + ("Rugged Drive", int2(3, 14), Clockwise), + ("Compact Reactor", int2(2, 4), None), + (weapon, int2(1, 8), None), + ("Radiator", int2(2, 2), CounterClockwise), + ("Radiator", int2(3, 2), Clockwise), + ("not if i see you first", int2(3, 10), None), // Compact Sensor + ("Panopticon Prime", int2(1, 6), Clockwise)); // Fire Control Array + + stage.Player(stage.Generated("Djinni"), float2(0, 0)); + stage.Place(Armed("Smoke Refused"), Hostile, facing: float2(0, -1), stance: ScenarioStance.Hostile, piloted: true); + stage.Place(Armed("Smoke Proximity"), Neutral, facing: float2(-1, 0), piloted: true); + } +} diff --git a/Assets/Scripts/ServerShared/Scenarios/AiFusedDiscipline.cs.meta b/Assets/Scripts/ServerShared/Scenarios/AiFusedDiscipline.cs.meta new file mode 100644 index 000000000..5994a43a7 --- /dev/null +++ b/Assets/Scripts/ServerShared/Scenarios/AiFusedDiscipline.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0d71dbf0ab5847a6ab58f96a50678ac7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/ServerShared/Scenarios/Arcs.cs b/Assets/Scripts/ServerShared/Scenarios/Arcs.cs new file mode 100644 index 000000000..f0c3f5553 --- /dev/null +++ b/Assets/Scripts/ServerShared/Scenarios/Arcs.cs @@ -0,0 +1,61 @@ +using static CultMath.math; +using static ItemRotation; + +public sealed class Arcs : Scenario +{ + public override string Name => "Arcs"; + public override string Id => "arcs"; + public override string Brief => "The Smoke Test Hull with forward mounts and a side mount on each flank; a bare hull off the bow, one off " + + "the stern, one abeam to port, one abeam to starboard, and a hostile turret. Verify: the hull keeps its " + + "heading while you aim at the stern hull, and the forward guns hold. Designate the bow hull and fire with the " + + "aim anywhere: the forward guns fire on it and hit. The side guns fire at their beam hull and never through " + + "the hull. Designate the starboard hull, aim ahead and fire its group: it fires on the hull without the aim " + + "and the port group holds; undesignate and aim to port: the port group fires free. The turret tracks you " + + "all the way round."; + public override uint Seed => 103; + public override bool Ambient => false; + + // Where the targets sit: the player is at the origin facing +z. The forward mounts fire forward, the starboard mount + // (Clockwise) along +x and the port mount (CounterClockwise) along -x. + public static readonly CultMath.float2 Bow = float2(0, 400), Stern = float2(0, -400), Turret = float2(600, 300), + Port = float2(-400, 0), Starboard = float2(400, 0); + + public override Galaxy Generate(GalaxyStage stage) => stage.Prelude(); + + public override void Stage(ScenarioStage stage) + { + var fighter = stage.Fit("Smoke Test Hull", + ("Cockpit 2x2", int2(4, 6), None), + ("Large Drive", int2(3, 0), Reversed), + ("Large Drive", int2(5, 0), Reversed), + ("Rugged Drive", int2(4, 14), CounterClockwise), + ("Rugged Drive", int2(5, 14), Clockwise), + ("Compact Reactor", int2(4, 4), None), + ("GT 3K", int2(2, 5), None), // Guided Missile Launcher + ("GT 3K", int2(7, 5), None), // Guided Missile Launcher + ("FastBlast+-", int2(3, 8), None), // Cell Blaster + ("FastBlast+-", int2(6, 8), None), // Cell Blaster + ("Radiator", int2(4, 2), CounterClockwise), + ("Radiator", int2(5, 2), Clockwise), + ("not if i see you first", int2(5, 10), None), // Compact Sensor + ("Panopticon Prime", int2(3, 6), Clockwise), // Fire Control Array + ("🫳🔫", int2(8, 4), Clockwise), // Autocannon + ("ChargeBlast SG", int2(0, 4), CounterClockwise)); // Charged Scatter Blaster + var turret = stage.Fit("Turret", + ("ClearPath", int2(1, 2), None), // Light Machine Gun + ("ClearPath", int2(5, 2), None), // Light Machine Gun + ("Long Radiator", int2(0, 2), CounterClockwise), + ("Long Radiator", int2(7, 2), Clockwise), + ("Compact Reactor", int2(3, 3), None), + ("Turret Control Module", int2(3, 5), None), + ("not if i see you first", int2(4, 5), None), // Compact Sensor + ("Panopticon Prime", int2(3, 6), None)); // Fire Control Array + + stage.Player(fighter, float2(0, 0), facing: float2(0, 1)); + stage.Place(stage.Bare("Longinus"), Bow); + stage.Place(stage.Bare("Longinus"), Stern); + stage.Place(turret, Turret, stance: ScenarioStance.Hostile); + stage.Place(stage.Bare("Longinus"), Port); + stage.Place(stage.Bare("Longinus"), Starboard); + } +} diff --git a/Assets/Scripts/ServerShared/Scenarios/Arcs.cs.meta b/Assets/Scripts/ServerShared/Scenarios/Arcs.cs.meta new file mode 100644 index 000000000..70bff8250 --- /dev/null +++ b/Assets/Scripts/ServerShared/Scenarios/Arcs.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 724a07b881f34e8c9b32b3f2f338ac78 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/ServerShared/Scenarios/Belt.cs b/Assets/Scripts/ServerShared/Scenarios/Belt.cs new file mode 100644 index 000000000..50c815f6d --- /dev/null +++ b/Assets/Scripts/ServerShared/Scenarios/Belt.cs @@ -0,0 +1,50 @@ +using System.Linq; +using static CultMath.math; +using static ItemRotation; + +public sealed class Belt : Scenario +{ + public override string Name => "Belt"; + public override string Id => "belt"; + public override string Brief => "The biggest asteroid belt the generator made, with the Longinus parked 100 m outside its ring, facing along it, " + + "and nothing else in the arena. Verify: next and previous target step through the rocks and the reticle sweeps " + + "across the belt without a hitch; Previous with nothing targeted takes the farthest rock; the target indicator " + + "sits on the rock it names."; + + // Seeds 1-90 scanned for the arena whose entrance zone holds the belt with the most asteroids once the generator + // placed belts by their parent's window (children-within-reach): seed 86, a belt of 484 rocks. The next four: + // 55 (478), 83 (402), 64 (383), 63 (323). 37 of the 90 arenas hold no belt. + public override uint Seed => 86; + public override bool Ambient => false; + + public override Galaxy Generate(GalaxyStage stage) => stage.Prelude(DemoTerminus.Cast); + + public override void Stage(ScenarioStage stage) + { + var fighter = stage.Fit("Longinus", + ("Cockpit 2x2", int2(2, 6), None), + ("Large Drive", int2(1, 0), Reversed), + ("Large Drive", int2(3, 0), Reversed), + ("Rugged Drive", int2(2, 14), CounterClockwise), + ("Rugged Drive", int2(3, 14), Clockwise), + ("Compact Reactor", int2(2, 4), None), + ("GT 3K", int2(0, 5), None), // Guided Missile Launcher + ("GT 3K", int2(5, 5), None), // Guided Missile Launcher + ("DragOnBreath", int2(1, 8), None), // Lightning Projector + ("FastBlast+-", int2(4, 8), None), // Cell Blaster + ("Radiator", int2(2, 2), CounterClockwise), + ("Radiator", int2(3, 2), Clockwise), + ("not if i see you first", int2(3, 10), None), // Compact Sensor + ("Panopticon Prime", int2(1, 6), Clockwise)); // Fire Control Array + + // The belt is a ring about its parent's position at the belt orbit's distance. The player stands 100 m outside + // it, at the point nearest the origin, facing along the ring. + var arena = stage.Arena; + var belt = arena.Planets.Values.OfType().OrderByDescending(candidate => candidate.Asteroids.Length).First(); + var orbit = arena.Orbits[belt.Orbit.Key].Data; + var centre = arena.GetOrbitPosition(orbit.Parent.Key); + var outward = lengthsq(centre) > 0f ? normalize(-centre) : float2(1, 0); + var at = centre + outward * (orbit.Distance + 100f); + stage.Player(fighter, at, facing: float2(-outward.y, outward.x)); + } +} diff --git a/Assets/Scripts/ServerShared/Scenarios/Belt.cs.meta b/Assets/Scripts/ServerShared/Scenarios/Belt.cs.meta new file mode 100644 index 000000000..375ec1cb9 --- /dev/null +++ b/Assets/Scripts/ServerShared/Scenarios/Belt.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6177c598b87544d6bb0cefdfb4f01acc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/ServerShared/Scenarios/Crossing.cs b/Assets/Scripts/ServerShared/Scenarios/Crossing.cs new file mode 100644 index 000000000..61529d6d9 --- /dev/null +++ b/Assets/Scripts/ServerShared/Scenarios/Crossing.cs @@ -0,0 +1,58 @@ +using static CultMath.math; +using static ItemRotation; + +public sealed class Crossing : Scenario +{ + public override string Name => "Crossing"; + public override string Id => "crossing"; + public override string Brief => "A Lightning Projector at the starboard gun and a Cell Blaster at the port gun, an unpiloted Djinni coasting across the bow " + + "close ahead and an unpiloted one waiting at range. The crosser is launched to port at 50 m/s and only coasts: nothing steers it, " + + "its hull drag slows it to about 25 m/s at the bow line, and it does not shoot back. Make the pass coasting: give no throttle until the Djinni has crossed the bow, then fly freely " + + "(thrusting from the start carries you past it). Verify: as the Djinni crosses close, FastBlast lands some and projector " + + "almost none; against the Djinni at range both land. Fly it again without the Fire Control Array: " + + "with it the small gun lands more."; + public override uint Seed => 112; + public override bool Ambient => false; + + // Where the Djinni sit: the player is at Origin facing +z. Origin is 250 m or more from every body, where the zone's + // pull is weakest (about 1.4 u/s^2; the sum of the wells never drops to nothing, and at the old origin the player sat on the star). + // The crosser is unpiloted and placed moving at the Djinni's 50 m/s cap, so its pass is ballistic: bent by the field and slowed + // by hull drag (it reaches the bow line at about 25 m/s relative to the player, 3.6 s in), and nothing steers it. + // CrosserAt is the centre of the start window in which the pass holds: shifting it by 10 m along either axis keeps the pass + // inside the test's time and distance windows (CrossingHoldsAcrossTheStartWindow). + // The waiting Djinni sits inside the Lightning Projector's arc at 80% of its Range. + public static readonly CultMath.float2 Origin = float2(724, 124); + public static readonly CultMath.float2 CrosserAt = Origin + float2(-128, 45), CrosserFacing = float2(1, 0), CrosserVelocity = float2(50, 0); + // The fighter is staged at this quality, so its gear and the range below do not ride the item stream. + public const float StagedQuality = .6f; + // The Lightning Projector's Range in metres at the staged fit: 996.99 after the three seconds the test settles for + // (EvSettle); it falls toward 864 m as the projector heats. The fit as it stood at 0f5def17 (unstaged, its draws on the + // item stream) measured 1216.4. + public const float ProjectorRange = 997f; + public static readonly CultMath.float2 Waiting = Origin + float2(0, ProjectorRange * .8f); + + public override Galaxy Generate(GalaxyStage stage) => stage.Prelude(DemoTerminus.Cast); + + public override void Stage(ScenarioStage stage) + { + var fighter = stage.Fit("Longinus", StagedQuality, + ("Cockpit 2x2", int2(2, 6), None), + ("Large Drive", int2(1, 0), Reversed), + ("Large Drive", int2(3, 0), Reversed), + ("Rugged Drive", int2(2, 14), CounterClockwise), + ("Rugged Drive", int2(3, 14), Clockwise), + ("Compact Reactor", int2(2, 4), None), + ("GT 3K", int2(0, 5), None), // Guided Missile Launcher + ("GT 3K", int2(5, 5), None), // Guided Missile Launcher + ("DragOnBreath", int2(1, 8), None), // Lightning Projector + ("FastBlast+-", int2(4, 8), None), // Cell Blaster + ("Radiator", int2(2, 2), CounterClockwise), + ("Radiator", int2(3, 2), Clockwise), + ("not if i see you first", int2(3, 10), None), // Compact Sensor + ("Panopticon Prime", int2(1, 6), Clockwise)); // Fire Control Array + + stage.Player(fighter, Origin, facing: float2(0, 1)); + stage.Place(stage.Generated("Djinni"), CrosserAt, facing: CrosserFacing, stance: ScenarioStance.Hostile, velocity: CrosserVelocity); + stage.Place(stage.Bare("Djinni"), Waiting); + } +} diff --git a/Assets/Scripts/ServerShared/Scenarios/Crossing.cs.meta b/Assets/Scripts/ServerShared/Scenarios/Crossing.cs.meta new file mode 100644 index 000000000..2787758ab --- /dev/null +++ b/Assets/Scripts/ServerShared/Scenarios/Crossing.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0cc3edfb4b0e4ea485cce71354f41748 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/ServerShared/Scenarios/DemoTerminus.cs b/Assets/Scripts/ServerShared/Scenarios/DemoTerminus.cs new file mode 100644 index 000000000..f4dce7be7 --- /dev/null +++ b/Assets/Scripts/ServerShared/Scenarios/DemoTerminus.cs @@ -0,0 +1,42 @@ +using float2 = CultMath.float2; + +// The demo: one gate, one region and one boss, with a fixed cast. The Pirates are the protagonist's ostensible +// employer, Zhestokost the antagonist whose home is the boss zone and the exit, Lucent Media and Aeronautics Unlimited +// the neutrals. A prelude galaxy of that cast; the player, who is not a Pirate, flies the base Longinus. +public sealed class DemoTerminus : Scenario +{ + public static readonly TutorialGenerationSettings Cast = new TutorialGenerationSettings + { + ProtagonistFaction = "Pirates", + AntagonistFaction = "Zhe", + BufferFaction = "Luc", + NeutralFactions = new[] { "Aero" }, + QuestFaction = null, + ZoneCount = 64, + LinkDensity = .5f + }; + + public override string Name => "Terminus (Demo)"; + public override string Id => "demo-terminus"; + public override string Brief => "One gate, one region, one boss. Allied: the Pirates. Opposed: Zhestokost. " + + "Neutral: Lucent Media and Aeronautics Unlimited."; + + public override Galaxy Generate(GalaxyStage stage) + { + var galaxy = stage.Prelude(Cast); + galaxy.PlaceGate(galaxy.ResolveFaction(Cast.AntagonistFaction)); + return galaxy; + } + + public override void Stage(ScenarioStage stage) + { + var galaxy = stage.Galaxy; + var pirates = galaxy.ResolveFaction(Cast.ProtagonistFaction); + galaxy.FactionRelationships[pirates] = FactionRelationship.Friendly; + galaxy.FactionRelationships[galaxy.ResolveFaction(Cast.AntagonistFaction)] = FactionRelationship.Hated; + galaxy.FactionRelationships[galaxy.ResolveFaction(Cast.BufferFaction)] = FactionRelationship.Neutral; + foreach (var neutral in Cast.NeutralFactions) + galaxy.FactionRelationships[galaxy.ResolveFaction(neutral)] = FactionRelationship.Neutral; + stage.Player(stage.Generated("Longinus"), float2.zero); + } +} diff --git a/Assets/Scripts/ServerShared/Scenarios/DemoTerminus.cs.meta b/Assets/Scripts/ServerShared/Scenarios/DemoTerminus.cs.meta new file mode 100644 index 000000000..706f1bf0e --- /dev/null +++ b/Assets/Scripts/ServerShared/Scenarios/DemoTerminus.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5ba7152d3c8b46a98924a4148be550db +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/ServerShared/Scenarios/DjinniShakedown.cs b/Assets/Scripts/ServerShared/Scenarios/DjinniShakedown.cs new file mode 100644 index 000000000..43d23d0b3 --- /dev/null +++ b/Assets/Scripts/ServerShared/Scenarios/DjinniShakedown.cs @@ -0,0 +1,25 @@ +using float2 = CultMath.float2; + +public sealed class DjinniShakedown : Scenario +{ + public override string Name => "Djinni Shakedown"; + public override string Id => "djinni-shakedown"; + public override string Brief => "A fitted Djinni in empty space, facing +z, with a bare hull dead ahead and one abeam. Verify: its thrusters " + + "move and turn it; with the hull offline and thrusters firing, its speed does not run away. Its " + + "articulated ballistic barrel points at the hull ahead when it bears, and rests at the arc edge while you " + + "aim at the hull abeam."; + public override uint Seed => 101; + public override bool Ambient => false; + + // Where the targets sit: the ballistic mount faces +z, so Ahead is inside its arc and Abeam outside it. + public static readonly float2 Ahead = new float2(0, 400), Abeam = new float2(400, 0); + + public override Galaxy Generate(GalaxyStage stage) => stage.Prelude(); + + public override void Stage(ScenarioStage stage) + { + stage.Player(stage.Generated("Djinni"), float2.zero); + stage.Place(stage.Bare("Longinus"), Ahead); + stage.Place(stage.Bare("Longinus"), Abeam); + } +} diff --git a/Assets/Scripts/ServerShared/Scenarios/DjinniShakedown.cs.meta b/Assets/Scripts/ServerShared/Scenarios/DjinniShakedown.cs.meta new file mode 100644 index 000000000..4f25ab345 --- /dev/null +++ b/Assets/Scripts/ServerShared/Scenarios/DjinniShakedown.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1afb559630c241ed813ddd3c444c618b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/ServerShared/Scenarios/Duel.cs b/Assets/Scripts/ServerShared/Scenarios/Duel.cs new file mode 100644 index 000000000..67bca118d --- /dev/null +++ b/Assets/Scripts/ServerShared/Scenarios/Duel.cs @@ -0,0 +1,39 @@ +using static CultMath.math; +using static ItemRotation; + +public sealed class Duel : Scenario +{ + public override string Name => "Duel"; + public override string Id => "duel"; + public override string Brief => "One piloted, hostile Longinus with slow guided missiles and a Light Laser in its hold. Verify: rolled " + + "hits and near-misses, subsystem aim, beam reads above bow, armour takes the missile, loot keeps its brand."; + public override uint Seed => 104; + public override bool Ambient => false; + + public override Galaxy Generate(GalaxyStage stage) => stage.Prelude(); + + public override void Stage(ScenarioStage stage) + { + var fighter = stage.Fit("Longinus", + ("Cockpit 2x2", int2(2, 6), None), + ("Large Drive", int2(1, 0), Reversed), + ("Large Drive", int2(3, 0), Reversed), + ("Rugged Drive", int2(2, 14), CounterClockwise), + ("Rugged Drive", int2(3, 14), Clockwise), + ("Compact Reactor", int2(2, 4), None), + ("GT 3K", int2(0, 5), None), // Guided Missile Launcher + ("GT 3K", int2(5, 5), None), // Guided Missile Launcher + ("FastBlast+-", int2(1, 8), None), // Cell Blaster + ("FastBlast+-", int2(4, 8), None), // Cell Blaster + ("Radiator", int2(2, 2), CounterClockwise), + ("Radiator", int2(3, 2), Clockwise), + ("not if i see you first", int2(3, 10), None), // Compact Sensor + ("Capacitor", int2(1, 5), None), + ("Panopticon Prime", int2(1, 6), Clockwise), // Fire Control Array + ("Store-All Plus", int2(2, 8), None)); // Cargo Bay + + stage.Player(fighter, float2(0, 0)); + var rival = stage.Place(fighter, float2(0, 900), facing: float2(0, -1), stance: ScenarioStance.Hostile, piloted: true); + stage.Cargo(rival, "Spectra"); + } +} diff --git a/Assets/Scripts/ServerShared/Scenarios/Duel.cs.meta b/Assets/Scripts/ServerShared/Scenarios/Duel.cs.meta new file mode 100644 index 000000000..4acea5ed7 --- /dev/null +++ b/Assets/Scripts/ServerShared/Scenarios/Duel.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f6ba813d4a9447c89e1bbb6997b7ac35 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/ServerShared/Scenarios/FusedRounds.cs b/Assets/Scripts/ServerShared/Scenarios/FusedRounds.cs new file mode 100644 index 000000000..7498465c3 --- /dev/null +++ b/Assets/Scripts/ServerShared/Scenarios/FusedRounds.cs @@ -0,0 +1,55 @@ +using static CultMath.math; +using static ItemRotation; + +public sealed class FusedRounds : Scenario +{ + public override string Name => "Fused Rounds"; + public override string Id => "fused-rounds"; + public override string Brief => "The Smoke Test Hull with Smoke Proximity, Smoke Delayed and a Cluster Cannon; a hostile bare Longinus at mid range, a bare " + + "hull dead ahead, a fragile one to starboard, a close one inside the proximity blast radius, and one astern. " + + "Verify with nothing selected: aim past every hull and the round bursts at max range along the aim; aim at the hull " + + "ahead and it stops and bursts on it; fire the Cluster Cannon at the fragile hull and, once it is hurt, a Smoke " + + "Proximity round at it: the hull dies before the round lands, no burst. Select the astern hull: the round fires and bursts at its range along the arc edge. Select the " + + "close hull: the burst is pushed out to the blast radius from your centre. A Smoke Proximity burst beside the " + + "Longinus damages where the model shows the blast; a Smoke Delayed round into its nose bursts inside. The HUD " + + "reads Direct, Burst at N m or Refused for the fused weapons and a percentage for the Cluster Cannon, and the " + + "smoke weapons show no Manufacturer row."; + public override uint Seed => 108; + public override bool Ambient => false; + + // Where everything sits: the player is at the origin facing +z. Ahead lies on the initial aim line, inside every forward + // mount's arc. Fragile is a bare Longinus inside the Cluster Cannon's effective range (full damage; the scenario test reads the bound from the weapon); Close is inside Smoke Proximity's blast radius + // (8 m from the ship's centre) and beside the aim line, not across it; Stern is outside every mount's arc. + public static readonly CultMath.float2 Mid = float2(-200, 600), Ahead = float2(0, 300), Fragile = float2(80, 240), + Close = float2(6.4f, 4f), Stern = float2(0, -400); + + // The shooter is staged at this quality, so the damage its Cluster Cannon deals does not ride the item stream. + public const float StagedQuality = .6f; + + public override Galaxy Generate(GalaxyStage stage) => stage.Prelude(DemoTerminus.Cast); + + public override void Stage(ScenarioStage stage) + { + var shooter = stage.Fit("Smoke Test Hull", StagedQuality, + ("Cockpit 2x2", int2(4, 6), None), + ("Large Drive", int2(3, 0), Reversed), + ("Large Drive", int2(5, 0), Reversed), + ("Rugged Drive", int2(4, 14), CounterClockwise), + ("Rugged Drive", int2(5, 14), Clockwise), + ("Compact Reactor", int2(4, 4), None), + ("Smoke Proximity", int2(3, 8), None), + ("Smoke Delayed", int2(6, 8), None), + ("DeathCluster", int2(5, 17), None), // Cluster Cannon + ("Radiator", int2(4, 2), CounterClockwise), + ("Radiator", int2(5, 2), Clockwise), + ("not if i see you first", int2(5, 10), None), // Compact Sensor + ("Panopticon Prime", int2(3, 6), Clockwise)); // Fire Control Array + + stage.Player(shooter, float2(0, 0), facing: float2(0, 1)); + stage.Place(stage.Bare("Longinus"), Mid, stance: ScenarioStance.Hostile); + stage.Place(stage.Bare("Longinus"), Ahead); + stage.Place(stage.Bare("Longinus"), Fragile); + stage.Place(stage.Bare("Longinus"), Close); + stage.Place(stage.Bare("Longinus"), Stern); + } +} diff --git a/Assets/Scripts/ServerShared/Scenarios/FusedRounds.cs.meta b/Assets/Scripts/ServerShared/Scenarios/FusedRounds.cs.meta new file mode 100644 index 000000000..0e96bab70 --- /dev/null +++ b/Assets/Scripts/ServerShared/Scenarios/FusedRounds.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4afe22415e8546849f2366c39a40fd8f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/ServerShared/Scenarios/LauncherAngles.cs b/Assets/Scripts/ServerShared/Scenarios/LauncherAngles.cs new file mode 100644 index 000000000..61a798b1c --- /dev/null +++ b/Assets/Scripts/ServerShared/Scenarios/LauncherAngles.cs @@ -0,0 +1,37 @@ +using static CultMath.math; +using static ItemRotation; + +public sealed class LauncherAngles : Scenario +{ + public override string Name => "Launcher Angles"; + public override string Id => "launcher-angles"; + public override string Brief => "A Guided Missile Launcher, a Swarm Rocket Pod and two Cell Blasters; a hostile bare Longinus broadside on, another beside it. " + + "Verify: hits pulse only the facing edge; a Swarm Rocket Pod round whose target dies fades unexploded."; + public override uint Seed => 105; + public override bool Ambient => false; + + public override Galaxy Generate(GalaxyStage stage) => stage.Prelude(); + + public override void Stage(ScenarioStage stage) + { + var launcher = stage.Fit("Longinus", + ("Cockpit 2x2", int2(2, 6), None), + ("Large Drive", int2(1, 0), Reversed), + ("Large Drive", int2(3, 0), Reversed), + ("Rugged Drive", int2(2, 14), CounterClockwise), + ("Rugged Drive", int2(3, 14), Clockwise), + ("Compact Reactor", int2(2, 4), None), + ("GT 3K", int2(0, 5), None), // Guided Missile Launcher + ("Leonid", int2(5, 5), None), // Swarm Rocket Pod + ("FastBlast+-", int2(1, 8), None), // Cell Blaster + ("FastBlast+-", int2(4, 8), None), // Cell Blaster + ("Radiator", int2(2, 2), CounterClockwise), + ("Radiator", int2(3, 2), Clockwise), + ("not if i see you first", int2(3, 10), None), // Compact Sensor + ("Panopticon Prime", int2(1, 6), Clockwise)); // Fire Control Array + + stage.Player(launcher, float2(0, 0)); + stage.Place(stage.Bare("Longinus"), float2(0, 900), facing: float2(1, 0), stance: ScenarioStance.Hostile); + stage.Place(stage.Bare("Longinus"), float2(300, 700)); + } +} diff --git a/Assets/Scripts/ServerShared/Scenarios/LauncherAngles.cs.meta b/Assets/Scripts/ServerShared/Scenarios/LauncherAngles.cs.meta new file mode 100644 index 000000000..82a27fcac --- /dev/null +++ b/Assets/Scripts/ServerShared/Scenarios/LauncherAngles.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 58cfaf062ddf458c99c12f3652243b45 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/ServerShared/Scenarios/LockOn.cs b/Assets/Scripts/ServerShared/Scenarios/LockOn.cs new file mode 100644 index 000000000..4f8c4dfa9 --- /dev/null +++ b/Assets/Scripts/ServerShared/Scenarios/LockOn.cs @@ -0,0 +1,64 @@ +using static CultMath.math; +using static ItemRotation; + +public sealed class LockOn : Scenario +{ + public override string Name => "Lock On"; + public override string Id => "lock-on"; + public override string Brief => "A hostile closes from out of sight, finds you and locks. Verify: no warning at first; once it locks, one " + + "indicator appears toward it and tightens as the lock grows; break line of sight or range and it vanishes; " + + "your own ping shows no incoming paint on its side, only the lock does."; + public override uint Seed => 1; + public override bool Ambient => false; + + // The hostile starts about 4000 m off, ahead and to port of the player, facing the player. At that range its passive + // sensors hold no track of the player (the test asks the sim's own PassiveInfo against the detection threshold). The + // hostile is ordered to close on the player, finds it and locks. The zone's pull carries it off the staged line, so the + // warning must point at where the hostile was when the paint was stamped, which the test checks against the poses of + // that tick. At Duel's 900 m (and at 600 m) it sees and locks within a second. + public static readonly CultMath.float2 HostileAt = float2(-2000, 3450); + + // The fit's lots are minted at this quality, the one Crossing and the other RunStart scenarios stage (the brief states no + // other), and the hostile's order is to close on the player, so the lock follows from the staged situation and not + // from item draws or the pilot's drawn circuit (ruling scenario-stages-hostile-task). + const float StagedQuality = .6f; + + private readonly CultMath.float2 _hostileAt; + private readonly float _quality; + + public LockOn() : this(HostileAt, StagedQuality) { } + + // The staged inputs, open to a test that moves each a little and asks that the scenario still hold. + internal LockOn(CultMath.float2 hostileAt, float quality) + { + _hostileAt = hostileAt; + _quality = quality; + } + + public override Galaxy Generate(GalaxyStage stage) => stage.Prelude(DemoTerminus.Cast); + + public override void Stage(ScenarioStage stage) + { + var fighter = stage.Fit("Longinus", _quality, + ("Cockpit 2x2", int2(2, 6), None), + ("Large Drive", int2(1, 0), Reversed), + ("Large Drive", int2(3, 0), Reversed), + ("Rugged Drive", int2(2, 14), CounterClockwise), + ("Rugged Drive", int2(3, 14), Clockwise), + ("Compact Reactor", int2(2, 4), None), + ("GT 3K", int2(0, 5), None), // Guided Missile Launcher + ("GT 3K", int2(5, 5), None), // Guided Missile Launcher + ("FastBlast+-", int2(1, 8), None), // Cell Blaster + ("FastBlast+-", int2(4, 8), None), // Cell Blaster + ("Radiator", int2(2, 2), CounterClockwise), + ("Radiator", int2(3, 2), Clockwise), + ("not if i see you first", int2(3, 10), None), // Compact Sensor + ("Capacitor", int2(1, 5), None), + ("Panopticon Prime", int2(1, 6), Clockwise), // Fire Control Array + ("Store-All Plus", int2(2, 8), None)); // Cargo Bay + + var player = stage.Player(fighter, float2(0, 0), facing: float2(0, 1)); + var hostile = stage.Place(fighter, _hostileAt, facing: normalize(-_hostileAt), stance: ScenarioStance.Hostile, piloted: true); + stage.Approach(hostile, player); + } +} diff --git a/Assets/Scripts/ServerShared/Scenarios/LockOn.cs.meta b/Assets/Scripts/ServerShared/Scenarios/LockOn.cs.meta new file mode 100644 index 000000000..1512201c0 --- /dev/null +++ b/Assets/Scripts/ServerShared/Scenarios/LockOn.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3f0b6d2a9c7e4a1b8d5e2c6f7a9b0c14 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/ServerShared/Scenarios/LongHaul.cs b/Assets/Scripts/ServerShared/Scenarios/LongHaul.cs new file mode 100644 index 000000000..18e158247 --- /dev/null +++ b/Assets/Scripts/ServerShared/Scenarios/LongHaul.cs @@ -0,0 +1,15 @@ +using float2 = CultMath.float2; + +public sealed class LongHaul : Scenario +{ + public override string Name => "Long Haul"; + public override string Id => "long-haul"; + public override string Brief => "A standard ship in a populated galaxy. Verify: memory stays flat across zones with kills; " + + "warp, quit and Continue keep items, tier and brand; death disables Continue."; + public override uint Seed => 106; + + public override Galaxy Generate(GalaxyStage stage) => stage.Prelude(); + + public override void Stage(ScenarioStage stage) => + stage.Player(stage.Generated(stage.StartingHull), float2.zero); +} diff --git a/Assets/Scripts/ServerShared/Scenarios/LongHaul.cs.meta b/Assets/Scripts/ServerShared/Scenarios/LongHaul.cs.meta new file mode 100644 index 000000000..984d274d6 --- /dev/null +++ b/Assets/Scripts/ServerShared/Scenarios/LongHaul.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3a7911611f9845709e9ae5ba34d91dfb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/ServerShared/Scenarios/MainGalaxy.cs b/Assets/Scripts/ServerShared/Scenarios/MainGalaxy.cs new file mode 100644 index 000000000..3e4482d3c --- /dev/null +++ b/Assets/Scripts/ServerShared/Scenarios/MainGalaxy.cs @@ -0,0 +1,14 @@ +using float2 = CultMath.float2; + +// The full galaxy: factions drawn from the catalog, bosses on the road to the exit, entered in the starting hull. +public sealed class MainGalaxy : Scenario +{ + public override string Name => "Main Galaxy"; + public override string Id => "main-galaxy"; + public override string Brief => "The full galaxy: factions drawn at random, bosses guarding the road to the exit."; + + public override Galaxy Generate(GalaxyStage stage) => stage.Main(); + + public override void Stage(ScenarioStage stage) => + stage.Player(stage.Generated(stage.StartingHull), float2.zero); +} diff --git a/Assets/Scripts/ServerShared/Scenarios/MainGalaxy.cs.meta b/Assets/Scripts/ServerShared/Scenarios/MainGalaxy.cs.meta new file mode 100644 index 000000000..4e862188d --- /dev/null +++ b/Assets/Scripts/ServerShared/Scenarios/MainGalaxy.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c7f6bdb3ed7b4b1aa137569c7e79bccd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/ServerShared/Scenarios/Pursuit.cs b/Assets/Scripts/ServerShared/Scenarios/Pursuit.cs new file mode 100644 index 000000000..d6d630a88 --- /dev/null +++ b/Assets/Scripts/ServerShared/Scenarios/Pursuit.cs @@ -0,0 +1,61 @@ +using static CultMath.math; +using static ItemRotation; + +public sealed class Pursuit : Scenario +{ + // The pursuer starts astern, inside the 400 at which VapourCloudTests.ACloudBreaksALockAtRange shows a fresh vent + // cloud breaking a sensor's lock, and well outside the 40 at which AStrongCloseSensorBurnsThrough shows a close + // sensor burning through. + private const float Astern = 300; + + public override string Name => "Pursuit"; + public override string Id => "pursuit"; + public override string Brief => "A hostile Longinus on your tail; a Mine Launcher fitted, three Coolant Vents and two Thruster " + + "Overdrives aboard. Verify: lay mines in its path, the mine pulses slowly after 2 s, fast when " + + "the hostile is near, explodes 2 s later; vent and coast to lose it; overdrive away."; + public override uint Seed => 111; + public override bool Ambient => false; + + public override Galaxy Generate(GalaxyStage stage) => stage.Prelude(DemoTerminus.Cast); + + public override void Stage(ScenarioStage stage) + { + var layer = stage.Fit("Longinus", + ("Cockpit 2x2", int2(2, 6), None), + ("Large Drive", int2(1, 0), Reversed), + ("Large Drive", int2(3, 0), Reversed), + ("Rugged Drive", int2(2, 14), CounterClockwise), + ("Rugged Drive", int2(3, 14), Clockwise), + ("Compact Reactor", int2(2, 4), None), + ("parting gift", int2(0, 5), None), // Mine Launcher + ("Leonid", int2(5, 5), None), // Swarm Rocket Pod + ("FastBlast+-", int2(1, 8), None), // Cell Blaster + ("FastBlast+-", int2(4, 8), None), // Cell Blaster + ("Radiator", int2(2, 2), CounterClockwise), + ("Radiator", int2(3, 2), Clockwise), + ("not if i see you first", int2(3, 10), None), // Compact Sensor + ("Panopticon Prime", int2(1, 6), Clockwise), // Fire Control Array + ("Store-All Plus", int2(2, 8), None)); // Cargo Bay + var pursuer = stage.Fit("Longinus", + ("Cockpit 2x2", int2(2, 6), None), + ("Large Drive", int2(1, 0), Reversed), + ("Large Drive", int2(3, 0), Reversed), + ("Rugged Drive", int2(2, 14), CounterClockwise), + ("Rugged Drive", int2(3, 14), Clockwise), + ("Compact Reactor", int2(2, 4), None), + ("GT 3K", int2(0, 5), None), // Guided Missile Launcher + ("GT 3K", int2(5, 5), None), // Guided Missile Launcher + ("FastBlast+-", int2(1, 8), None), // Cell Blaster + ("FastBlast+-", int2(4, 8), None), // Cell Blaster + ("Radiator", int2(2, 2), CounterClockwise), + ("Radiator", int2(3, 2), Clockwise), + ("not if i see you first", int2(3, 10), None), // Compact Sensor + ("Capacitor", int2(1, 5), None), + ("Panopticon Prime", int2(1, 6), Clockwise), // Fire Control Array + ("Store-All Plus", int2(2, 8), None)); // Cargo Bay + + var player = stage.Player(layer, float2(0, 0), facing: float2(0, 1)); + stage.Cargo(player, "Morning Fog", "Morning Fog", "Morning Fog", "send it", "send it"); + stage.Place(pursuer, float2(0, -Astern), facing: float2(0, 1), stance: ScenarioStance.Hostile, piloted: true); + } +} diff --git a/Assets/Scripts/ServerShared/Scenarios/Pursuit.cs.meta b/Assets/Scripts/ServerShared/Scenarios/Pursuit.cs.meta new file mode 100644 index 000000000..375cb139b --- /dev/null +++ b/Assets/Scripts/ServerShared/Scenarios/Pursuit.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4b0587057e6a4618bf63944364298870 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/ServerShared/Scenarios/RefusedRounds.cs b/Assets/Scripts/ServerShared/Scenarios/RefusedRounds.cs new file mode 100644 index 000000000..88cdd3fdb --- /dev/null +++ b/Assets/Scripts/ServerShared/Scenarios/RefusedRounds.cs @@ -0,0 +1,41 @@ +using static CultMath.math; +using static ItemRotation; + +public sealed class RefusedRounds : Scenario +{ + public override string Name => "Refused Rounds"; + public override string Id => "refused-rounds"; + public override string Brief => "The Smoke Test Hull with Smoke Refused, Smoke Refused Beam, Smoke Refused Charge and an Autocannon; a bare Longinus " + + "dead ahead. Each smoke weapon's blast radius is wider than its range, so it can never be fired. Verify: pull each " + + "trigger and a refused shot costs no ammo, energy, heat, sound, visibility or cooldown, the beam never starts and " + + "the charged weapon never starts charging; the Autocannon fires normally."; + public override uint Seed => 109; + public override bool Ambient => false; + + // The one target, ahead of the nose: inside every forward mount's arc. + public static readonly CultMath.float2 Target = float2(0, 300); + + public override Galaxy Generate(GalaxyStage stage) => stage.Prelude(DemoTerminus.Cast); + + public override void Stage(ScenarioStage stage) + { + var shooter = stage.Fit("Smoke Test Hull", + ("Cockpit 2x2", int2(4, 6), None), + ("Large Drive", int2(3, 0), Reversed), + ("Large Drive", int2(5, 0), Reversed), + ("Rugged Drive", int2(4, 14), CounterClockwise), + ("Rugged Drive", int2(5, 14), Clockwise), + ("Compact Reactor", int2(4, 4), None), + ("Smoke Refused", int2(3, 8), None), + ("Smoke Refused Beam", int2(6, 8), None), + ("Smoke Refused Charge", int2(3, 17), None), + ("🫳🔫", int2(5, 17), None), // Autocannon + ("Radiator", int2(4, 2), CounterClockwise), + ("Radiator", int2(5, 2), Clockwise), + ("not if i see you first", int2(5, 10), None), // Compact Sensor + ("Panopticon Prime", int2(3, 6), Clockwise)); // Fire Control Array + + stage.Player(shooter, float2(0, 0), facing: float2(0, 1)); + stage.Place(stage.Bare("Longinus"), Target); + } +} diff --git a/Assets/Scripts/ServerShared/Scenarios/RefusedRounds.cs.meta b/Assets/Scripts/ServerShared/Scenarios/RefusedRounds.cs.meta new file mode 100644 index 000000000..45c0cde82 --- /dev/null +++ b/Assets/Scripts/ServerShared/Scenarios/RefusedRounds.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c72528ae3b7144989483462543f2de88 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/ServerShared/Scenarios/Scenarios.cs b/Assets/Scripts/ServerShared/Scenarios/Scenarios.cs new file mode 100644 index 000000000..752b33e28 --- /dev/null +++ b/Assets/Scripts/ServerShared/Scenarios/Scenarios.cs @@ -0,0 +1,14 @@ +// Every way to set up a new run, in the order New Game lists them. Modes are what a release build lists; Development +// are the other ways the game sets up a run and Tests are arenas built to check one system each, both listed only in +// editor and development builds. +public static class Scenarios +{ + public static readonly Scenario[] Modes = { new DemoTerminus() }; + + public static readonly Scenario[] Development = { new TutorialGalaxy(), new MainGalaxy() }; + + public static readonly Scenario[] Tests = + { + new DjinniShakedown(), new StarvedReactor(), new Arcs(), new Duel(), new LauncherAngles(), new WeaponFeel(), new FusedRounds(), new RefusedRounds(), new AiFusedDiscipline(), new LongHaul(), new Pursuit(), new Crossing(), new Belt(), new LockOn() + }; +} diff --git a/Assets/Scripts/ServerShared/Scenarios/Scenarios.cs.meta b/Assets/Scripts/ServerShared/Scenarios/Scenarios.cs.meta new file mode 100644 index 000000000..4c856d4d9 --- /dev/null +++ b/Assets/Scripts/ServerShared/Scenarios/Scenarios.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 12f60a9ad25c4aa0a9b8b098d385ea0e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/ServerShared/Scenarios/StarvedReactor.cs b/Assets/Scripts/ServerShared/Scenarios/StarvedReactor.cs new file mode 100644 index 000000000..2f3dff97b --- /dev/null +++ b/Assets/Scripts/ServerShared/Scenarios/StarvedReactor.cs @@ -0,0 +1,33 @@ +using static CultMath.math; +using static ItemRotation; + +public sealed class StarvedReactor : Scenario +{ + public override string Name => "Starved Reactor"; + public override string Id => "starved-reactor"; + public override string Brief => "Two Light Lasers on a Muon Fusion Reactor, which can fall to a quarter of the Compact Reactor's charge, and a bare hull " + + "to shoot. Verify: starvation reads as starvation, brownout degrades, refills stutter."; + public override uint Seed => 102; + public override bool Ambient => false; + + public override Galaxy Generate(GalaxyStage stage) => stage.Prelude(); + + public override void Stage(ScenarioStage stage) + { + var starved = stage.Fit("Longinus", + ("Cockpit 2x2", int2(2, 6), None), + ("Large Drive", int2(1, 0), Reversed), + ("Large Drive", int2(3, 0), Reversed), + ("Rugged Drive", int2(2, 14), CounterClockwise), + ("Rugged Drive", int2(3, 14), Clockwise), + ("Muon Fusion Reactor", int2(2, 4), None), + ("Spectra", int2(1, 8), None), // Light Laser + ("Spectra", int2(4, 8), None), // Light Laser + ("Radiator", int2(2, 2), CounterClockwise), + ("Radiator", int2(3, 2), Clockwise), + ("not if i see you first", int2(3, 10), None), // Compact Sensor + ("Panopticon Prime", int2(1, 6), Clockwise)); // Fire Control Array + stage.Player(starved, float2(0, 0)); + stage.Place(stage.Bare("Longinus"), float2(0, 400)); + } +} diff --git a/Assets/Scripts/ServerShared/Scenarios/StarvedReactor.cs.meta b/Assets/Scripts/ServerShared/Scenarios/StarvedReactor.cs.meta new file mode 100644 index 000000000..e13077120 --- /dev/null +++ b/Assets/Scripts/ServerShared/Scenarios/StarvedReactor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 91a81ac4784c4066969cac11ac1937b0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/ServerShared/Scenarios/TutorialGalaxy.cs b/Assets/Scripts/ServerShared/Scenarios/TutorialGalaxy.cs new file mode 100644 index 000000000..1ff521865 --- /dev/null +++ b/Assets/Scripts/ServerShared/Scenarios/TutorialGalaxy.cs @@ -0,0 +1,17 @@ +using float2 = CultMath.float2; + +// New Game as it has always been: a prelude galaxy, entered in the starting hull of the protagonist faction. +public sealed class TutorialGalaxy : Scenario +{ + public override string Name => "Tutorial Galaxy"; + public override string Id => "tutorial-galaxy"; + public override string Brief => "A small galaxy of fixed factions, entered in a ship of the protagonist faction."; + + public override Galaxy Generate(GalaxyStage stage) => stage.Prelude(); + + public override void Stage(ScenarioStage stage) + { + var protagonist = stage.Galaxy.ResolveFaction(stage.TutorialGenerationSettings.ProtagonistFaction); + stage.Player(stage.Generated(stage.StartingHull, protagonist), float2.zero); + } +} diff --git a/Assets/Scripts/ServerShared/Scenarios/TutorialGalaxy.cs.meta b/Assets/Scripts/ServerShared/Scenarios/TutorialGalaxy.cs.meta new file mode 100644 index 000000000..3f7c8777a --- /dev/null +++ b/Assets/Scripts/ServerShared/Scenarios/TutorialGalaxy.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 94d688b37c5044dd9b67865c706d8918 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/ServerShared/Scenarios/WeaponFeel.cs b/Assets/Scripts/ServerShared/Scenarios/WeaponFeel.cs new file mode 100644 index 000000000..0817cfa80 --- /dev/null +++ b/Assets/Scripts/ServerShared/Scenarios/WeaponFeel.cs @@ -0,0 +1,39 @@ +using static CultMath.math; +using static ItemRotation; + +public sealed class WeaponFeel : Scenario +{ + public override string Name => "Weapon Feel"; + public override string Id => "weapon-feel"; + public override string Brief => "The Smoke Test Hull with a Charged Scatter Blaster, an Autocannon and a Cell Blaster burst weapon; a bare Longinus dead ahead. " + + "Verify: Charged Scatter Blaster and Autocannon fire with effects, particles and action-bar icons; the burst weapon's " + + "cadence is as before; a fast release-and-press on the Charged Scatter Blaster starts no second charge."; + public override uint Seed => 107; + public override bool Ambient => false; + + // The one target, ahead of the nose: inside every forward mount's arc. + public static readonly CultMath.float2 Target = float2(0, 400); + + public override Galaxy Generate(GalaxyStage stage) => stage.Prelude(DemoTerminus.Cast); + + public override void Stage(ScenarioStage stage) + { + var shooter = stage.Fit("Smoke Test Hull", + ("Cockpit 2x2", int2(4, 6), None), + ("Large Drive", int2(3, 0), Reversed), + ("Large Drive", int2(5, 0), Reversed), + ("Rugged Drive", int2(4, 14), CounterClockwise), + ("Rugged Drive", int2(5, 14), Clockwise), + ("Compact Reactor", int2(4, 4), None), + ("ChargeBlast SG", int2(3, 17), None), // Charged Scatter Blaster + ("🫳🔫", int2(5, 17), None), // Autocannon + ("FastBlast+-", int2(3, 8), None), // Cell Blaster + ("Radiator", int2(4, 2), CounterClockwise), + ("Radiator", int2(5, 2), Clockwise), + ("not if i see you first", int2(5, 10), None), // Compact Sensor + ("Panopticon Prime", int2(3, 6), Clockwise)); // Fire Control Array + + stage.Player(shooter, float2(0, 0), facing: float2(0, 1)); + stage.Place(stage.Bare("Longinus"), Target); + } +} diff --git a/Assets/Scripts/ServerShared/Scenarios/WeaponFeel.cs.meta b/Assets/Scripts/ServerShared/Scenarios/WeaponFeel.cs.meta new file mode 100644 index 000000000..6ea88923e --- /dev/null +++ b/Assets/Scripts/ServerShared/Scenarios/WeaponFeel.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 74c554ab5a6a4ac5ad0334a29135dc7f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/ServerShared/SchematicUnderlay.cs b/Assets/Scripts/ServerShared/SchematicUnderlay.cs new file mode 100644 index 000000000..09f3d4118 --- /dev/null +++ b/Assets/Scripts/ServerShared/SchematicUnderlay.cs @@ -0,0 +1,36 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +using System.Collections.Generic; +using System.Linq; +using CultMath; + +// A mod hull's line-art schematic laid under its cell grids. The one rule for where the lines land: the line art's +// top-down bounding box is stretched, per axis, onto the hull Shape's cell rect [0, Width] x [0, Height] as the hull +// drawer sets it, never onto the occupied cells (underlay-fits-hull-bounds). Display only: nothing is derived from the +// model into the schematic or back (schematic-and-model-are-separate-spaces). +public static class SchematicUnderlay +{ + // Points are Blender Z-up XYZ in the Ship Root frame, nose toward -Y and starboard toward -X, so the schematic's + // x (starboard right) is -X and its y (forward up) is -Y. Output is in hull cell units, index-aligned with `lines`. + public static float2[][] Fit(IReadOnlyList lines, Shape hull) + { + if (lines == null || lines.Count == 0 || hull == null) return new float2[0][]; + var top = lines.Select(line => Enumerable.Range(0, (line?.Points?.Length ?? 0) / 3) + .Select(i => new float2(-line.Points[i * 3], -line.Points[i * 3 + 1])).ToArray()).ToArray(); + var all = top.SelectMany(line => line).ToArray(); + if (all.Length == 0) return top; + + var minX = all.Min(p => p.x); + var maxX = all.Max(p => p.x); + var minY = all.Min(p => p.y); + var maxY = all.Max(p => p.y); + return top.Select(line => line.Select(p => new float2( + Stretch(p.x, minX, maxX, hull.Width), Stretch(p.y, minY, maxY, hull.Height))).ToArray()).ToArray(); + } + + // min lands on 0 and max on `size`; an axis with no extent sits at the midpoint. + private static float Stretch(float value, float min, float max, int size) => + max > min ? (value - min) / (max - min) * size : size / 2f; +} diff --git a/Assets/Scripts/ServerShared/SchematicUnderlay.cs.meta b/Assets/Scripts/ServerShared/SchematicUnderlay.cs.meta new file mode 100644 index 000000000..d6120a641 --- /dev/null +++ b/Assets/Scripts/ServerShared/SchematicUnderlay.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 77b6dfe49272456a9f976d2578732d8a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/ServerShared/Sensing.cs b/Assets/Scripts/ServerShared/Sensing.cs new file mode 100644 index 000000000..3a678fde9 --- /dev/null +++ b/Assets/Scripts/ServerShared/Sensing.cs @@ -0,0 +1,224 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +using System.Linq; +using CultMath; + +// Light signatures split by channel (ruling visibility-per-capability-reveal): an observer learns what a ship +// is by which channel carries the light. Append-only: values are serialized in VisibilityData. +public enum SignatureChannel +{ + Thermal, + Reflection, + DrivePlume, + LaunchFlash, + Emission +} + +public readonly struct Signature +{ + public readonly SignatureChannel Channel; + public readonly float Strength; + public readonly EquippedItem Item; + // The class this act claims: the true item's Data unless its ship's EW claims otherwise (aetheria-ew, + // classify-from-belief). Stamped by Entity.SetSignature from the ship's claim. + public readonly EquippableItemData Claimed; + + public Signature(SignatureChannel channel, float strength, EquippedItem item, EquippableItemData claimed) + { + Channel = channel; + Strength = strength; + Item = item; + Claimed = claimed; + } + + public Signature WithStrength(float strength) => new Signature(Channel, strength, Item, Claimed); +} + +// What a painted ship learns of a beam on it (ruling sensor-stat-set item 4): a Search paint is a ping sweeping +// it (Strength 0); a Track paint is a lock (Strength is the emitter's own lock progress, 0..1, ruling +// lock-warning-strength). A Scan paint is a held scanner: Strength is its scan progress 0..1 (ruling scan-is-an-act). +// Never summed. +public enum PaintMode +{ + Search, + Track, + Scan +} + +// An ally's ping crossed `Subject` at `IlluminatedRange` through `IlluminatedObscuration`; `MaxRange` is that +// sensor's PingRange. Posted on the crossing tick and read for one tick by the receiving ship's own sensors. +public readonly struct PingReturn +{ + public readonly Entity Subject; + public readonly float IlluminatedRange; + public readonly float IlluminatedObscuration; + public readonly float MaxRange; + + public PingReturn(Entity subject, float illuminatedRange, float illuminatedObscuration, float maxRange) + { + Subject = subject; + IlluminatedRange = illuminatedRange; + IlluminatedObscuration = illuminatedObscuration; + MaxRange = maxRange; + } +} + +// An item's emission this tick, heard by another ship's Sense within `HearRange` x its HearingMultiple x obscuration; +// it decides nothing by itself. +public readonly struct ActiveEmission +{ + public readonly EquippedItem Item; + public readonly float HearRange; + // The class this emission claims (see Signature.Claimed); stamped by Entity.Emit. + public readonly EquippableItemData Claimed; + + public ActiveEmission(EquippedItem item, float hearRange, EquippableItemData claimed) + { + Item = item; + HearRange = hearRange; + Claimed = claimed; + } +} + +public readonly struct PaintWarning +{ + public readonly float2 Bearing; + public readonly EquippableItemData EmitterClass; + public readonly PaintMode Mode; + public readonly float Strength; + + public PaintWarning(float2 bearing, EquippableItemData emitterClass, PaintMode mode, float strength) + { + Bearing = bearing; + EmitterClass = emitterClass; + Mode = mode; + Strength = strength; + } +} + +// What an observer has seen `Item` do (ruling visibility-per-capability-reveal): the channel it showed on, the +// bearing at that act and the zone clock then. Held per (subject, item) in the observer's Entity; the latest act +// replaces the earlier one. Position is never carried: only the track gives it. `Item` stays the true item: it is the +// book's key and what aim reads. `Claimed` is the class the act claimed, and is what every classifying reader reads +// (aetheria-ew, classify-from-belief). A null `Channel` is a reveal by the observer's own scan (Entity.RecordInspection), +// whose `Claimed` is the subject's claim for the item. +public readonly struct Reveal +{ + public readonly EquippedItem Item; + public readonly EquippableItemData Claimed; + public readonly SignatureChannel? Channel; + public readonly float2 Bearing; + public readonly float Time; + + public Reveal(EquippedItem item, SignatureChannel? channel, float2 bearing, float time, EquippableItemData claimed) + { + Item = item; + Claimed = claimed; + Channel = channel; + Bearing = bearing; + Time = time; + } +} + +// What an observer aims at on its target (Entity.AimedAt): exactly one of a revealed item or a mount of the hull the observer +// believes the target to be (Entity.LayoutOf), or nothing. A mount is a believed position, never the true item on it. +public readonly struct AimTarget +{ + public readonly EquippedItem Item; + public readonly HardpointData Mount; + + private AimTarget(EquippedItem item, HardpointData mount) + { + Item = item; + Mount = mount; + } + + public static AimTarget None => default; + public static AimTarget OfItem(EquippedItem item) => new AimTarget(item, null); + public static AimTarget OfMount(HardpointData mount) => new AimTarget(null, mount); +} + +// One weapon or gear row of a ship's schematic as its viewer is entitled to read it (aetheria-ew, classify-from-belief; ruling +// ew-claim-weapon-measure-ruled). Made only by Entity.SchematicRows. `Item` is the true item: the selection mark's key and, +// on the viewer's own ship, the live gear. `Claimed` is the class the row shows. The range label is the live range on +// the viewer's own ship and the claimed design's rated range on any other; a row whose claimed class is not a weapon has +// no range. The viewer never sees a target item's quality, wear or power. A renderer shows these and decides nothing. +// A mount row (`Mount` set, `Item` and `Claimed` null) is a hardpoint of the hull the viewer believes the ship to be, with +// nothing of the ship's claimed on it: where something is, not what. +public readonly struct SchematicRow +{ + public readonly EquippedItem Item; + public readonly EquippableItemData Claimed; + public readonly HardpointData Mount; + private readonly bool _own; + + internal SchematicRow(EquippedItem item, EquippableItemData claimed, bool own) + { + Item = item; + Claimed = claimed; + Mount = null; + _own = own; + } + + internal SchematicRow(HardpointData mount) : this() + { + Mount = mount; + } + + // What a renderer compares to know the rows changed. Range is a reading, not part of the key. + public (EquippedItem, EquippableItemData, HardpointData) Key => (Item, Claimed, Mount); + + // Whether this row is the one `aim` points at: a claimed-item row by its item, a mount row by its mount. + public bool Marks(AimTarget aim) => Item != null ? aim.Item == Item : aim.Mount != null && aim.Mount == Mount; + + public float? Range => _own + ? Item.Behaviors.OfType().First().Range + : Claimed?.Behaviors.OfType().FirstOrDefault()?.RatedRange; +} + +// A subject's removal from a zone as the zone recorded it (death, dock, warp, any removal): where it was and how +// bright its light was (its Visibility at removal). Judged by each observer's Sense under the +// light-act gate; notification only, one tick long, it decides nothing. +public readonly struct Departure +{ + public readonly Entity Subject; + public readonly float2 Position; + public readonly float Signature; + + public Departure(Entity subject, float2 position, float signature) + { + Subject = subject; + Position = position; + Signature = signature; + } +} + +// How much an observer holds of one subject, derived on read by Entity.ContactOf from its track, its reveals and +// the zone clock. Detected: tracked, or a reveal younger than GameplaySettings.BearingMemory. Tracked: exactly +// membership of VisibleEntities. Classified: detected, with any reveal in the book. Identified: the track has reached +// TargetGearInfoThreshold, and holds a hull belief: Profile, the hull class this observer believes the subject is (null +// below Identified; aetheria-ew, classify-from-belief; seen-through arrives with the judge). Bearing is the true +// bearing while tracked, else the freshest reveal's. +public readonly struct Contact +{ + public readonly bool Detected; + public readonly bool Tracked; + public readonly bool Classified; + public readonly bool Identified; + public readonly float2 Bearing; + public readonly float Info; + public readonly HullData Profile; + + public Contact(bool detected, bool tracked, bool classified, bool identified, float2 bearing, float info, HullData profile) + { + Profile = profile; + Detected = detected; + Tracked = tracked; + Classified = classified; + Identified = identified; + Bearing = bearing; + Info = info; + } +} diff --git a/Assets/Scripts/ServerShared/Sensing.cs.meta b/Assets/Scripts/ServerShared/Sensing.cs.meta new file mode 100644 index 000000000..0cffdf792 --- /dev/null +++ b/Assets/Scripts/ServerShared/Sensing.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a3c91e5d7b2f4086b1d4e9f07c6a2358 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/ServerShared/Settings.cs b/Assets/Scripts/ServerShared/Settings.cs index ff5980109..8326f76da 100644 --- a/Assets/Scripts/ServerShared/Settings.cs +++ b/Assets/Scripts/ServerShared/Settings.cs @@ -13,26 +13,27 @@ using static CultMath.math; [Serializable, MessagePackObject(keyAsPropertyName:true), JsonObject] public class PlanetSettings { - public float ZoneDepthExponent; - public float ZoneDepth; - public float ZoneBoundaryFog; - public ExponentialCurve GravityDepth; - public ExponentialCurve GravityRadius; - public ExponentialCurve WaveDepth; - public ExponentialCurve WaveRadius; - public ExponentialCurve WaveFrequency; - public ExponentialCurve WaveSpeed; public ExponentialCurve LightRadius; public ExponentialCurve BodyRadius; - public float AsteroidVerticalOffset = -5f; + + // The closest a child may orbit its parent, in u, by the parent's mass, and the Plummer softening of the parent's + // well (the steepest slope, 0.5 c / eps, sits at the Roche limit). Authored like BodyRadius, never per body. + public ExponentialCurve RocheLimit = new ExponentialCurve(); + + // A body's well strength by its mass (GravityField): c in u^2/s^2. The pull is c d / (d^2 + eps^2) inside a family and + // c(family mass) beyond it (WellTree); eps is the Roche limit. + public ExponentialCurve WellStrength = new ExponentialCurve(); + + // The one global exaggeration of gravity height: height = potential / K, in u/s^2 per unit of height. + public float HeightExaggeration = 1f; public ExponentialLerp AsteroidSize; public ExponentialLerp AsteroidHitpoints; public ExponentialLerp AsteroidRespawnTime; - public float GravityStrength; - public float MiningDifficulty = 500f; public float SecureAreaRadiusMultiplier = .45f; - public ExponentialCurve OrbitPeriod; + + // The global flow stardust and nebula follow and the sim knows (FlowField). Zero flow by default. + public FlowSettings Flow = new FlowSettings(); } [Serializable, MessagePackObject(keyAsPropertyName:true), JsonObject] @@ -43,14 +44,6 @@ public class GalaxyShapeSettings public float TwistExponent = 2; } -[Serializable, MessagePackObject(keyAsPropertyName:true), JsonObject] -public class NameGeneratorSettings -{ - public int NameGeneratorMinLength = 5; - public int NameGeneratorMaxLength = 10; - public int NameGeneratorOrder = 4; -} - [Serializable, MessagePackObject(keyAsPropertyName:true), JsonObject] public class SectorBackgroundSettings { @@ -90,6 +83,8 @@ public class SectorGenerationSettings { public float LinkDensity = .5f; public int ZoneCount = 128; + // Zones per resource province (Provinces.Partition): calibration, not a gate. + public int ProvinceZones = Provinces.DefaultZonesPerProvince; public int MegaCount; public int BossCount; } @@ -104,12 +99,13 @@ public class TutorialGenerationSettings public string QuestFaction; public float LinkDensity = .5f; public int ZoneCount = 32; + // Zones per resource province (Provinces.Partition): calibration, not a gate. + public int ProvinceZones = Provinces.DefaultZonesPerProvince; } [Serializable, MessagePackObject(keyAsPropertyName:true), JsonObject] public class ZoneGenerationSettings { - public ExponentialCurve PlanetSafetyRadius; public float MassFloor = 1; public float SunMass = 10000; @@ -134,6 +130,20 @@ public class ZoneGenerationSettings public ExponentialCurve AsteroidCount; public ExponentialLerp AsteroidRotationSpeed; + // Trojan swarms (ruling trojans-ride-host-period-with-stations): the chance a planet or gas giant with a body for a parent + // carries one, each swarm's length along the orbit (turns) and radial half-width (a fraction of the host's distance), and + // the rocks round each of L4 and L5 by host distance. 0 here: a settings object built in code draws none. + public float TrojanProbability = 0f; + public float TrojanArc = .07f; + public float TrojanHalfWidth = .06f; + public ExponentialCurve TrojanCount = new ExponentialCurve { Exponent = 1f, Multiplier = .04f, Constant = 8f }; + + // Laned belts (rulings lanes-two-sided-visual-margin, lane-narrow): the chance a belt candidate that kept its body and has + // room on both sides carries a laned belt, and the lane's half-width in the host's body radii (1.5 by ruling). LaneProbability + // is 0 here: a settings object built in code draws no lane. + public float LaneProbability = 0f; + public float LaneBodyRadii = 1.5f; + public float ResourceDensityMinimum = .1f; public float ResourceDensityMaximum = 1.5f; @@ -141,6 +151,9 @@ public class ZoneGenerationSettings public float SunSecondaryColorDistance = .25f; public float SunLightSaturation = .5f; public float SunFogTintSaturation = .5f; + // The green band no sun colour may take, as fractions of the hue circle (75 to 165 degrees: chartreuse through spring green). + public float SunHueExcludedStart = 75f / 360f; + public float SunHueExcludedEnd = 165f / 360f; public ExponentialLerp GasGiantBandCount; public float GasGiantBandColorSeparation = .25f; @@ -162,6 +175,11 @@ public class GameplaySettings public EntitySettings DefaultEntitySettings; public RarityTier[] Tiers; public ExponentialLerp QualityPriceModifier; + // What a station pays for goods, as a fraction of their price, scaled further by the item's condition. + public float SellFraction = .5f; + // What a station charges to restore worn gear, as a fraction of the price of the wear. + public float RepairFraction = .25f; + public int StartingCredits = 15000000; public float DurabilityQualityExponent = 2; public float DurabilityQualityMin = 2; public float DurabilityQualityMax = .25f; @@ -169,6 +187,21 @@ public class GameplaySettings public float ThermalQualityMin = 2; public float ThermalQualityMax = .25f; public float DefaultShutdownPerformance = .25f; + // Global flight tuning over every thruster's authored push (not its turning) and every hull's authored Drag. Push is a tenth, the + // ratio gravity fell by in the honest-wells cut (aetheria-gravity:field-strength-ruled, 5 to 0.5 u/s^2): most ships + // cannot climb straight out of a well and use orbits instead; an overspecced hull still can. + public float ThrustScale = .1f; + public float DragScale = 1f; + // Free-floating bodies (floating items, mines): drag on a launch velocity, drag on the force-driven drift, and + // how strongly the zone force accelerates it. + public float FloatingBodyDrag = .05f; + public float FloatingBodyLaunchDrag = .2f; + public float FloatingBodyGravity = 1f; + // Loot: the chance each equipped item (the hull excepted) drops when its carrier dies, the launch speed of a + // dropped item, and how many seconds a floating item lasts. + public float LootDropProbability = .25f; + public float LootDropVelocity = 25f; + public float FloatingItemLifetime = 30f; public float SevereHeatstrokeRiskThreshold = .25f; public float WormholeDepth = 1000; public float WormholeExitVelocity = 20; @@ -181,6 +214,8 @@ public class GameplaySettings public int WeaponGroupCount = 6; public float WarpDistance = 25; public float DockingDistance = 25; + // Units per second one pilot gives to a ship within DockingDistance; a commodity unit or one crafted item. + public float TransferRate = 2; public float ProductionPersonalityLerp = .05f; public float MessageDuration = 4f; public float TargetPersistenceDuration = 3; @@ -202,20 +237,83 @@ public class GameplaySettings public float LockIndicatorNoiseAmplitude = 50f; public ExponentialLerp LockIndicatorFrequency; public ExponentialLerp LockSpinSpeed; - public float TorqueFloor; public float TorqueMultiplier; - public float AetherTorqueMultiplier; - public float AetherHeatMultiplier; public float VisibilityDecay; + // Seconds a reveal's bearing keeps a ship Detected after its last act with no track (Entity.ContactOf). + public float BearingMemory = 6; public float TargetInfoDecay; public float TargetDetectionInfoThreshold; - public float TargetArmorInfoThreshold; + // Also the Identified threshold: the track level at which a ship's hull class, and with it its layout, is known. public float TargetGearInfoThreshold; public float ConvergenceMinimumDistance; + public float FiringArc = 120; + // Cut 2 (docs/fire-control-cut.md, Q4): what an entity with no working targeting system fires with -- + // the ceiling FireControl.Accuracy falls back to (Resolution 1, Precision 0 alongside it). Authored low + // on purpose ("really, really bad," operator 2026-09-19): .05 against the two catalog designs' own + // Accuracy ranges (the authoring spec this cut produces proposes .45-.6 for the 1-cell design and + // .65-.85 for the 2-cell one) leaves unaided fire capable of hitting something close, slow and + // unaware, and little else. One authored setting, easy to find and turn -- the operator rules the real + // figure in play. + public float UnaidedAccuracy = .05f; + // Cut 5 (docs/fire-control-cut.md, 5.1, Soul finding 3): the unaided fallback for Tracking, alongside + // UnaidedAccuracy above -- an entity with no working targeting system used to fall back to Tracking 0, + // which Commit turned into a hard wall (any nonzero deviation was an automatic miss). Ten world units of + // fire-time-projection deviation forgiveness is the first guess and the operator's knob, the same shape + // as UnaidedAccuracy: authored deliberately bad, not authored broken. + public float UnaidedTracking = 10f; + // Cut 6d (docs/fire-control-cut.md): the unaided fallback for Precision, alongside UnaidedAccuracy and + // UnaidedTracking above -- FireControl.Precision falls back to this the same way it already falls back to + // UnaidedAccuracy/UnaidedTracking. Precision is now a grouping tightness (FireControl.Sigma = 1/Precision, + // in hull-schematic cell units), not the old coin-flip probability, so the unaided floor has to be + // authored on that scale. .3 -> sigma 3.33 cells: against the live catalog's own hulls (Longinus 6x17, + // Zenith 12x12, Turret 8x8) that puts pOnHull at the hull's own centre of mass around .5-.84 -- broadly + // sprayed across the whole silhouette (sigma is a large fraction of the hull's own width) while still + // landing on the ship more often than not. A tighter floor (e.g. .1, sigma 10) was tried first and + // rejected: it drove pOnHull for the same hulls down to .08-.18, reading as "can't hit the broad side of a + // barn" rather than "sprays the silhouette." First guess, the same deliberately-bad shape as its two + // siblings; the operator rules the real figure in play. + public float UnaidedPrecision = .3f; public float AgentRangeExponent = .25f; public float AgentForwardLerp = .5f; public float AgentMaxForwardDistance = 50; - public float AgentFiringMinDot = .99f; + + // Cut 3 (docs/fire-control-cut.md): first guesses: the headless fixture is the tuning harness, the + // operator smoke is the arbiter (§ Risks). + // + // How long before impact a shot's outcome commits (R4). Deviation counts up to this horizon; after it + // the result is frozen and the rest of the flight is pure choreography. + public float CommitHorizon = .5f; + + // The window of fire control's solution: how far ahead a target's reach counts (Reach, Evasion) and the time + // constant of the manoeuvre track that observes it. A fire-control constant, not a weapon or missile stat. First + // guess; the operator rules the real figure in play. + public float SolutionWindow = .75f; + + // World units per hull-schematic cell, used only by FireControl.HitProbability's angular-size term + // (pSpread) to turn a hull's cell footprint into a real-world silhouette size at range. + public float SchematicCellSize = 2f; + + // Restitution of a hull striking a hull (Contacts.Step): the speed at which a pair separates along the contact + // normal is this times the speed at which it closed. 0 is perfectly inelastic, 1 perfectly elastic. + public float ContactRestitution = .5f; + + // Heights above the field of the ship plane, the orbital layer (stations, turrets: every OrbitalEntity) and the floater + // layer (loot, mines): orbitals above ships and floaters below them, so no ship ever touches either (ruling + // aetheria-gravity:orbitals-above-floaters-below). + public float ShipLayerHeight = 3f; + public float OrbitalLayerHeight = 15f; + public float FloaterLayerHeight = 0f; + + // The floor an AI's own predicted hit probability (FireControl.HitProbability) must clear before it counts + // a firing solution worth taking (Combat.cs, TurretController.cs). Player fire is gated on arc alone + // (Weapon.ArcAllowsFire, Q2) -- this threshold is an AI fire-discipline heuristic, not part of the roll. + public float AgentMinHitProbability = .2f; + + // Cut 4 (docs/fire-control-cut.md): how often a continuous weapon (ConstantWeapon) rolls a discrete + // outcome for Damage * this interval, through the same FireControl.Fire/Step pair a discrete shot uses -- + // a beam is a sequence of rolls, not a continuous truth. First guess; the headless fixture is the tuning + // harness, the operator smoke is the arbiter, same as Cut 3's other first guesses. + public float BeamResolveInterval = .25f; } [Serializable, MessagePackObject(keyAsPropertyName: true), JsonObject] @@ -224,5 +322,4 @@ public class RarityTier public string Name; public float Quality; public float3 Color; - public float Rarity; } \ No newline at end of file diff --git a/Assets/Scripts/ServerShared/Ship.cs b/Assets/Scripts/ServerShared/Ship.cs index 0190f4f02..1266f5c90 100644 --- a/Assets/Scripts/ServerShared/Ship.cs +++ b/Assets/Scripts/ServerShared/Ship.cs @@ -1,4 +1,4 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public +/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ @@ -9,7 +9,6 @@ using System.Linq; using System.Reflection; using MessagePack; using Newtonsoft.Json; -using UniRx; using CultMath; using static CultMath.math; using quaternion = CultMath.quaternion; @@ -17,6 +16,8 @@ using quaternion = CultMath.quaternion; [MessagePackObject] public class Ship : Entity { + public override float LayerHeight => ItemManager.GameplaySettings.ShipLayerHeight; + // [Key("bindings")] public Dictionary Bindings = new Dictionary(); //[IgnoreMember] public int HullHardpointCount; @@ -24,19 +25,18 @@ public class Ship : Entity // [IgnoreMember] public Dictionary Contacts = new Dictionary(); // [IgnoreMember] public Targetable Target; public Entity HomeEntity; - public float2 MovementDirection; + // The pilot-controlled hull fields. PilotApplier, in the zone step, is their pilot-side writer, from the command the + // pilot (player input or the ship's agent) gave the entity; no Unity script can set them. Runtime only, never packed. + public float2 MovementDirection { get; internal set; } + // The one facing command, -1..1, positive clockwise; a heading becomes a demand only through Steering.Toward. + public float Turn { get; internal set; } public bool IsPlayerShip; - private HashSet _thrusterItems; private Thruster[] _allThrusters; - private HashSet _forwardThrusters; - private HashSet _reverseThrusters; - private HashSet _rightThrusters; - private HashSet _leftThrusters; - private HashSet _clockwiseThrusters; - private HashSet _counterClockwiseThrusters; - private HashSet _aetherDriveItems; - private HashSet _aetherDrives; + // One column per thruster (its effect per unit throttle, in the body frame) and the throttles the allocator answers with. + private float3[] _columns; + private float[] _throttles; + private readonly ThrustAllocator _allocator = new ThrustAllocator(); private bool _exitingWormhole = false; private bool _enteringWormhole = false; @@ -47,23 +47,6 @@ public class Ship : Entity private float2 _wormholeExitVelocity; public bool WormholeAnimationInProgress => _enteringWormhole || _exitingWormhole; - public float ForwardThrust { get; private set; } - public float ReverseThrust { get; private set; } - public float LeftStrafeThrust { get; private set; } - public float RightStrafeThrust { get; private set; } - public float ClockwiseTorque { get; private set; } - public float CounterClockwiseTorque { get; private set; } - public float LeftStrafeTotalTorque { get; private set; } - private List LeftStrafeTorqueThrusters = new List(); - public float RightStrafeTotalTorque { get; private set; } - private List RightStrafeTorqueThrusters = new List(); - - public float TurnTime(float2 direction) - { - var angleDiff = Direction.Angle(normalize(direction)); - var clockwise = dot(direction, Direction.Rotate(ItemRotation.Clockwise)) > 0; - return angleDiff / ((clockwise ? ClockwiseTorque : CounterClockwiseTorque) / Mass); - } public event Action OnExitedWormhole; public event Action OnEnteredWormhole; @@ -81,7 +64,7 @@ public class Ship : Entity public void EnterWormhole(float2 wormholePosition) { - Target.Value = null; + SetTarget(TargetRef.None); _wormholeAnimationProgress = 0; _enteringWormhole = true; _wormholeEntryPosition = Position.xz; @@ -93,218 +76,111 @@ public class Ship : Entity { base.Activate(); - _aetherDrives = new HashSet(GetBehaviors()); - _aetherDriveItems = new HashSet(_aetherDrives.Select(x => x.Item)); - _allThrusters = GetBehaviors().ToArray(); - _thrusterItems = new HashSet(_allThrusters.Select(x=>x.Item)); - - _forwardThrusters = new HashSet(_allThrusters - .Where(x => x.Item.EquippableItem.Rotation == ItemRotation.Reversed)); - - _reverseThrusters = new HashSet(_allThrusters - .Where(x => x.Item.EquippableItem.Rotation == ItemRotation.None)); - - _rightThrusters = new HashSet(_allThrusters - .Where(x => x.Item.EquippableItem.Rotation == ItemRotation.CounterClockwise)); - - _leftThrusters = new HashSet(_allThrusters - .Where(x => x.Item.EquippableItem.Rotation == ItemRotation.Clockwise)); - - _counterClockwiseThrusters = new HashSet(_allThrusters - .Where(x => x.Torque < -ItemManager.GameplaySettings.TorqueFloor)); - - _clockwiseThrusters = new HashSet(_allThrusters - .Where(x => x.Torque > ItemManager.GameplaySettings.TorqueFloor)); + _columns = new float3[_allThrusters.Length]; + _throttles = new float[_allThrusters.Length]; } public Ship(ItemManager itemManager, Zone zone, EquippableItem hull, EntitySettings settings) : base(itemManager, zone, hull, settings) { - ItemDestroyed.Where(item=>_thrusterItems.Contains(item)).Subscribe(RemoveThruster); - ItemDestroyed.Where(item=>_aetherDriveItems.Contains(item)).Subscribe(RemoveAetherDrive); - } - - private void RemoveAetherDrive(EquippedItem item) - { - _aetherDriveItems.Remove(item); - _aetherDrives.Remove(item.GetBehavior()); - } - - private void RemoveThruster(EquippedItem item) - { - _thrusterItems.Remove(item); - var thruster = item.GetBehavior(); - if (_forwardThrusters.Contains(thruster)) _forwardThrusters.Remove(thruster); - if (_reverseThrusters.Contains(thruster)) _reverseThrusters.Remove(thruster); - if (_rightThrusters.Contains(thruster)) _rightThrusters.Remove(thruster); - if (_leftThrusters.Contains(thruster)) _leftThrusters.Remove(thruster); - if (_clockwiseThrusters.Contains(thruster)) _clockwiseThrusters.Remove(thruster); - if (_counterClockwiseThrusters.Contains(thruster)) _counterClockwiseThrusters.Remove(thruster); } #region ThrustCalculation - private void RecalculateThrust() - { - RecalculateForwardThrust(); - RecalculateReverseThrust(); - RecalculateLeftStrafeThrust(); - RecalculateRightStrafeThrust(); - RecalculateClockwiseTorque(); - RecalculateCounterClockwiseTorque(); - } - - private void RecalculateForwardThrust() - { - ForwardThrust = 0; - foreach (var thruster in _forwardThrusters) - if (thruster.Item.Active.Value) - ForwardThrust += thruster.Thrust; + // What this ship can do at this instant (see ManoeuvreEnvelope): the box extremes of the thrusters' columns at their + // live thrust (zero when unpowered or not Active), because it reports what the ship can do now. The allocator solves + // with Column(NominalThrust), the full-grant column, because a column promises what a thruster does at a full grant + // and the allocator must not reshape its answer as the grant moves. Same geometry (Thruster.Column), different thrust. + // Derived each update, never saved. + public ManoeuvreEnvelope Envelope { get; private set; } - foreach (var drive in _aetherDrives) - if (drive.Item.Active.Value) - ForwardThrust += drive.Thrust.x; - } - - private void RecalculateReverseThrust() + private void RecalculateEnvelope() { - ReverseThrust = 0; - foreach (var thruster in _reverseThrusters) - if (thruster.Item.Active.Value) - ReverseThrust += thruster.Thrust; - - foreach (var drive in _aetherDrives) - if (drive.Item.Active.Value) - ReverseThrust += drive.Thrust.x; - } - - private void RecalculateLeftStrafeThrust() - { - LeftStrafeThrust = 0; - LeftStrafeTotalTorque = 0; - foreach (var thruster in _leftThrusters) + float forward = 0, back = 0, left = 0, right = 0, clockwise = 0, counterClockwise = 0; + foreach (var thruster in _allThrusters) { - if(thruster.Item.Active.Value) - { - LeftStrafeThrust += thruster.Thrust; - LeftStrafeTotalTorque += thruster.Torque * thruster.Thrust; - } + var column = thruster.Column(thruster.Item != null && thruster.Item.PowerSupply > 1e-4f ? thruster.Thrust : 0f); + forward += max(column.y, 0f); + back += max(-column.y, 0f); + left += max(-column.x, 0f); + right += max(column.x, 0f); + clockwise += max(column.z, 0f); + counterClockwise += max(-column.z, 0f); } - LeftStrafeTorqueThrusters.Clear(); - foreach(var thruster in _leftThrusters) - if (abs(sign(thruster.Torque) - sign(LeftStrafeTotalTorque)) < .01f) - LeftStrafeTorqueThrusters.Add(thruster); - - foreach (var drive in _aetherDrives) - if (drive.Item.Active.Value) - LeftStrafeThrust += drive.Thrust.y; - } - - private void RecalculateRightStrafeThrust() - { - RightStrafeThrust = 0; - RightStrafeTotalTorque = 0; - foreach (var thruster in _rightThrusters) - { - if(thruster.Item.Active.Value) - { - RightStrafeThrust += thruster.Thrust; - RightStrafeTotalTorque += thruster.Torque * thruster.Thrust; - } - } - RightStrafeTorqueThrusters.Clear(); - foreach(var thruster in _rightThrusters) - if (abs(sign(thruster.Torque) - sign(RightStrafeTotalTorque)) < .01f) - RightStrafeTorqueThrusters.Add(thruster); - - foreach (var drive in _aetherDrives) - if (drive.Item.Active.Value) - RightStrafeThrust += drive.Thrust.y; - } - - private void RecalculateClockwiseTorque() - { - ClockwiseTorque = 0; - foreach (var thruster in _clockwiseThrusters) - if (thruster.Item.Active.Value) - ClockwiseTorque += thruster.Torque; - - foreach (var drive in _aetherDrives) - if (drive.Item.Active.Value) - ClockwiseTorque += drive.Thrust.z; - } - - private void RecalculateCounterClockwiseTorque() - { - CounterClockwiseTorque = 0; - foreach (var thruster in _counterClockwiseThrusters) - if (thruster.Item.Active.Value) - CounterClockwiseTorque -= thruster.Torque; - - foreach (var drive in _aetherDrives) - if (drive.Item.Active.Value) - CounterClockwiseTorque += drive.Thrust.z; + Envelope = new ManoeuvreEnvelope(forward, back, left, right, clockwise, counterClockwise); } #endregion + // The player's turn axis as a fraction of the hull's yaw extreme, banded so each thruster joins over an equal share of + // the input. The allocator serves a turn by the thrusters with the least translation per unit of yaw first and brings in + // the next as they saturate; here the thrusters yawing the asked way are ranked by that ratio, equal ratios form one band, + // and band i fills over input [i/k, (i+1)/k]. A hull whose best-ratio thrusters hold a small share of its yaw then gets + // half the travel of a two-band turn before its drives join, instead of the first tenth. Full input is still full yaw. + public float BandedTurn(float axis) + { + axis = clamp(axis, -1f, 1f); + if (axis == 0 || _allThrusters == null) return axis; + var direction = axis > 0 ? 1f : -1f; + var thrusters = new List<(float ratio, float yaw)>(); + var total = 0f; + foreach (var thruster in _allThrusters) + { + var column = thruster.Column(thruster.NominalThrust); + var yaw = column.z * direction; + if (!(yaw > 0)) continue; + thrusters.Add((length(float2(column.x, column.y)) / yaw, yaw)); + total += yaw; + } + if (!(total > 0)) return axis; + thrusters.Sort((a, b) => a.ratio.CompareTo(b.ratio)); + var bands = new List(); + var bandRatio = float.NaN; + foreach (var (ratio, yaw) in thrusters) + { + if (bands.Count > 0 && abs(ratio - bandRatio) <= .02f * max(bandRatio, 1e-6f)) bands[bands.Count - 1] += yaw; + else { bands.Add(yaw); bandRatio = ratio; } + } + var travel = abs(axis) * bands.Count; + var band = min((int)travel, bands.Count - 1); + var served = 0f; + for (var i = 0; i < band; i++) served += bands[i]; + served += (travel - band) * bands[band]; + return direction * min(served / total, 1f); + } + + // Called by Entity.Update once the items' performance is current and before the power bus is stepped and the items + // execute: liveness, thrust and the throttles they decide are one phase, the one Execute acts on. The lock is a + // bound on the allocator's solve; intent reaches the allocator here and nowhere else. + protected override void UpdateThrottles() + { + if (_exitingWormhole || _enteringWormhole) return; + RecalculateEnvelope(); + for (var i = 0; i < _allThrusters.Length; i++) + _columns[i] = _allThrusters[i].Column(_allThrusters[i].NominalThrust); + _allocator.Allocate(_columns, MovementDirection, Turn, _throttles, ThrottleLocked); + for (var i = 0; i < _allThrusters.Length; i++) _allThrusters[i].Axis = _throttles[i]; + } + public override void Update(float delta) { - if (_active && !_exitingWormhole && !_enteringWormhole) + // No drag below top speed: ships coast and orbits do not decay; drag bleeds off only the excess over the hull's top + // speed (aetheria-gravity:ruling:no-drag-below-top-speed). The VelocityLimit clamp still caps it, so the excess is + // what this step's forces added; a soft cap, where surfing the beat is a temporary boost, is the ruling's other half. + // A docked ship has no flight of its own: its parent owns its pose (Entity.Update). + if (Parent == null) { - RecalculateThrust(); - foreach (var thruster in _allThrusters) thruster.Axis = 0; - var rightThrusterTorqueCompensation = abs(RightStrafeTotalTorque) / RightStrafeTorqueThrusters.Count; - foreach (var thruster in _rightThrusters) - { - var thrust = 0f; - thrust += MovementDirection.x; - if (RightStrafeTorqueThrusters.Contains(thruster)) - thrust -= MovementDirection.x * (rightThrusterTorqueCompensation / (abs(thruster.Torque) * thruster.Thrust)); - thruster.Axis = thrust; - } - var leftThrusterTorqueCompensation = abs(LeftStrafeTotalTorque) / LeftStrafeTorqueThrusters.Count; - foreach (var thruster in _leftThrusters) - { - var thrust = 0f; - thrust += -MovementDirection.x; - if (LeftStrafeTorqueThrusters.Contains(thruster)) - thrust += MovementDirection.x * (leftThrusterTorqueCompensation / (abs(thruster.Torque) * thruster.Thrust)); - thruster.Axis = thrust; - } - foreach (var thruster in _forwardThrusters) thruster.Axis += MovementDirection.y; - foreach (var thruster in _reverseThrusters) thruster.Axis += -MovementDirection.y; + var velocityMagnitude = length(Velocity); + var topSpeed = float.PositiveInfinity; + foreach (var limit in GetBehaviors()) topSpeed = min(topSpeed, limit.Limit); + if (velocityMagnitude > topSpeed) + Velocity = normalize(Velocity) * (topSpeed + decay(velocityMagnitude - topSpeed, HullData.Drag * ItemManager.GameplaySettings.DragScale, delta)); - var look = normalize(LookDirection.xz); - var deltaRot = dot(look, normalize(Direction).Rotate(ItemRotation.Clockwise)); - if (abs(deltaRot) < .01f) - { - deltaRot = 0; - Direction = lerp(Direction, look, min(delta, 1)); - } - deltaRot = pow(abs(deltaRot), .5f) * sign(deltaRot); - - foreach (var thruster in _clockwiseThrusters) thruster.Axis += deltaRot; - foreach (var thruster in _counterClockwiseThrusters) thruster.Axis += -deltaRot; + Position.xz += Velocity * delta; - foreach (var drive in _aetherDrives) - drive.Axis = float3(MovementDirection.y, MovementDirection.x, deltaRot); + Velocity += Zone.GetForce(Position.xz) * delta; } - - var velocityMagnitude = length(Velocity); - if(velocityMagnitude > .01f) - Velocity = normalize(Velocity) * decay(velocityMagnitude, HullData.Drag, delta); - - Position.xz += Velocity * delta; - var normal = Zone.GetNormal(Position.xz); - var force = new float2(normal.x, normal.z); - var forceMagnitude = lengthsq(force); - if (forceMagnitude > .001f) - { - var fa = 1 / (1 - forceMagnitude) - 1; - Velocity += normalize(force) * Zone.Settings.GravityStrength * fa; - } var shipRight = Direction.Rotate(ItemRotation.Clockwise); var forward = cross(float3(shipRight.x, 0, shipRight.y), normal); Rotation = quaternion.LookRotation(forward, normal); diff --git a/Assets/Scripts/ServerShared/ShipAuthoring.cs b/Assets/Scripts/ServerShared/ShipAuthoring.cs new file mode 100644 index 000000000..3962fa468 --- /dev/null +++ b/Assets/Scripts/ServerShared/ShipAuthoring.cs @@ -0,0 +1,536 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using GameCult.Caching; +using GameCult.Caching.MessagePack; +using MessagePack; + +// A mod ship's visual package: model, anchors, schematic lines. The hull semantics (cells, hardpoints, stats) live in +// the ship's own HullData record beside this one, and HullData.Visual is the only binding between the two. +[CultDocument("aetheria.ship_authoring", "1"), MessagePackObject] +public sealed class ShipAuthoring +{ + [CultName, Key(0)] public string Id; + // Key 1 held the embedded HullData until S1; it is retired and never reused. + [Key(2)] public string ModelAsset; + [Key(3)] public List Anchors = new List(); + [Key(4)] public List SchematicLines = new List(); + // The moving parts of the rig, presentation only (ruling rig-is-presentation): no joint value feeds the simulation. + [Key(5)] public List Joints = new List(); +} + +// A rig joint: a bone of the model's armature. Axes are three floats per degree of freedom, a unit vector in Ship Root +// space at rest (glTF axes, +Y up); Min and Max are that degree of freedom's limits in degrees. +[MessagePackObject] +public sealed class ShipJoint +{ + // The bone's aetheria.id, which is also its GLB node id. + [Key(0)] public string Id; + // The nearest joint above this one in the model, or null for a root joint. + [Key(1)] public string Parent; + [Key(2)] public float[] Axes; + [Key(3)] public float[] Min; + [Key(4)] public float[] Max; +} + +[MessagePackObject] +public sealed class ShipAnchor +{ + // Stable semantic identity. HullData.Hardpoints[].Transform names this ID for mounts. + [Key(0)] public string Id; + // One of: map-icon, hull-collider, shield, tractor, thruster-emitter, weapon-mount, + // weapon-muzzle, or radiator-mesh. + [Key(1)] public string Role; + // Stable node ID in the compiled model, never a Blender display name. + [Key(2)] public string ModelNodeId; + // Only child roles use ParentId; e.g. a muzzle names its weapon hardpoint. + [Key(3)] public string ParentId; + [Key(4)] public int Order; + // On a weapon-mount anchor: the id of the nearest joint above its node in the model; null or empty is a fixed mount. + [Key(5)] public string Joint; +} + +// Evaluated or baked Grease Pencil stroke coordinates in Blender's right-handed Z-up +// space. The runtime renderer owns its coordinate conversion and camera projection. +[MessagePackObject] +public sealed class ShipPolyline +{ + [Key(0)] public string Layer; + [Key(1)] public string Material; + [Key(2)] public float[] Points; + [Key(3)] public float[] Radii; + [Key(4)] public float[] Opacities; + [Key(5)] public bool Cyclic; + [Key(6)] public float[] Color; +} + +public static class ShipAuthoringStore +{ + // ShipAnchor.Role's vocabulary. + private static readonly HashSet Roles = new HashSet(StringComparer.Ordinal) + { + "map-icon", "hull-collider", "shield", "tractor", "thruster-emitter", "weapon-mount", "weapon-muzzle", "radiator-mesh" + }; + + // The anchor role a visible hardpoint's mount plays, or null for an internal hardpoint, which has no anchor. + private static string MountRole(HardpointType type) => + type == HardpointType.Thruster ? "thruster-emitter" : + type == HardpointType.Radiator ? "radiator-mesh" : + IsWeapon(type) ? "weapon-mount" : null; + + public static bool IsWeapon(HardpointType type) => + type == HardpointType.Energy || type == HardpointType.Ballistic || type == HardpointType.Launcher; + + public static CultCache Open(string path, bool writable = false) + { + var cache = new CultCache(); + try + { + cache.AddBackingStore(new SingleFileMessagePackBackingStore(path, !writable), new[] { typeof(HullData), typeof(ShipAuthoring), typeof(FactionProductData) }); + return cache; + } + catch + { + cache.Dispose(); + throw; + } + } + + // Writes one ship's two records under their deterministic keys, the shape Load expects. + public static void Write(CultCache cache, HullData hull, ShipAuthoring visual) + { + cache.UpsertAsync(typeof(HullData), hull, ShipModCatalog.HullKey(visual.Id)).GetAwaiter().GetResult(); + cache.UpsertAsync(typeof(ShipAuthoring), visual, ShipModCatalog.AuthoringKey(visual.Id)).GetAwaiter().GetResult(); + } + + // A package's product by one maker. These two are the only product writers; the key is the ship and the maker, so a + // maker has at most one product of the hull and writing again replaces it. + public static void WriteProduct(CultCache cache, string shipId, FactionProductData product) => + cache.UpsertAsync(typeof(FactionProductData), product, ShipModCatalog.ProductKey(shipId, product.Manufacturer.Key)).GetAwaiter().GetResult(); + + public static bool DeleteProduct(CultCache cache, string shipId, CultRecordKey maker) => + cache.Remove(ShipModCatalog.ProductKey(shipId, maker)); + + // A new mod hull that flies like a shipped one. Every member of the reference is copied through the type's own + // MessagePack round trip, so a member added to HullData later is copied too; then the six that are the shipped ship's + // own body and layout are reset: Name, Shape (one occupied cell, so the record loads), Hardpoints, Prefab, Schematic, + // and Visual, which names this mod's visual record. + public static HullData HullLike(HullData reference, string name, string shipId) + { + var options = CultDocumentMessagePackSerialization.OptionsFor(typeof(HullData).Assembly); + var hull = MessagePackSerializer.Deserialize(MessagePackSerializer.Serialize(reference, options), options); + hull.Name = name; + hull.Shape = new Shape(); + hull.Hardpoints = new List(); + hull.Prefab = null; + hull.Schematic = null; + hull.Visual = new CultRecordRef(ShipModCatalog.AuthoringKey(shipId)); + return hull; + } + + // The structure of a ship file, without judging its content (drafts load): exactly one hull and one visual, each at + // its deterministic key, the hull naming that visual by its typed ref, and the hull's products, each at its maker's key. + public static (HullData Hull, ShipAuthoring Visual, FactionProductData[] Products) Load(string path) + { + RefuseLegacyEmbeddedHull(path); + try { return LoadRecords(path); } + catch (Exception error) when (error is InvalidDataException or MessagePackSerializationException) + { + throw new InvalidOperationException($"{path}: a record does not decode as its schema: {error.Message}", error); + } + catch (NotSupportedException error) + { + throw new InvalidOperationException($"{path}: not a readable ship file: {error.Message}", error); + } + } + + // Key 1 of ShipAuthoring held the whole hull before S1. The type no longer has that member, so a deserialized record + // shows nothing of it, and a file that still carries one would load as a ship silently ignoring its old hull. The + // raw payload is the only place the old shape is visible. + private static void RefuseLegacyEmbeddedHull(string path) + { + if (!File.Exists(path)) return; + var bytes = File.ReadAllBytes(path); + if (bytes.Length == 0) return; + CultPersistedStoreSnapshot snapshot; + try { snapshot = CultDocumentMessagePackSerialization.DeserializeSnapshot(bytes); } + catch (Exception error) when (error is MessagePackSerializationException or NotSupportedException) + { + throw new InvalidOperationException($"{path}: not a readable ship file: {error.Message}", error); + } + var schema = typeof(ShipAuthoring).GetCustomAttribute().SchemaName; + foreach (var record in snapshot.Records) + { + if (snapshot.SchemaCatalog.FirstOrDefault(entry => entry.SchemaId == record.SchemaId)?.SchemaName != schema) continue; + var reader = new MessagePackReader(record.Payload); + if (reader.NextMessagePackType != MessagePackType.Array) continue; + var slots = reader.ReadArrayHeader(); + for (var slot = 0; slot < slots; slot++) + { + if (slot == RetiredHullKey && !reader.TryReadNil()) + throw new InvalidOperationException($"{path}: {record.Key}: legacy embedded hull at retired key {RetiredHullKey} of the ship authoring record. " + + $"Migrate it: write the hull as its own hull record at mod-hull: naming the visual, and rewrite the ship authoring record without key {RetiredHullKey}."); + if (slot != RetiredHullKey) reader.Skip(); + } + } + } + + private const int RetiredHullKey = 1; + + private static (HullData Hull, ShipAuthoring Visual, FactionProductData[] Products) LoadRecords(string path) + { + using var cache = Open(path); + var hulls = cache.GetAll().ToArray(); + var visuals = cache.GetAll().ToArray(); + if (visuals.Length != 1) + throw new InvalidOperationException($"{path} must hold exactly one ship authoring record, found {visuals.Length}."); + if (hulls.Length != 1) + throw new InvalidOperationException($"{path} must hold exactly one hull record, found {hulls.Length}."); + var (hull, visual) = (hulls[0], visuals[0]); + if (!cache.TryGetHandle(hull).Value.Key.Equals(ShipModCatalog.HullKey(visual.Id)) || + !cache.TryGetHandle(visual).Value.Key.Equals(ShipModCatalog.AuthoringKey(visual.Id))) + throw new InvalidOperationException($"{path}: {visual.Id}: records must be stored under {ShipModCatalog.HullKey(visual.Id).Value} and {ShipModCatalog.AuthoringKey(visual.Id).Value}."); + var products = cache.GetAll().ToArray(); + foreach (var product in products) + { + if (!product.Manufacturer.IsSet() || ShipModCatalog.IsModKey(product.Manufacturer.Key)) + throw new InvalidOperationException($"{path}: {visual.Id}: a product needs a manufacturer that is a shipped faction."); + var productKey = ShipModCatalog.ProductKey(visual.Id, product.Manufacturer.Key); + if (!cache.TryGetHandle(product).Value.Key.Equals(productKey)) + throw new InvalidOperationException($"{path}: {visual.Id}: a product must be stored at {productKey.Value}."); + if (!product.Design.IsSet() || !product.Design.Key.Equals(ShipModCatalog.HullKey(visual.Id))) + throw new InvalidOperationException($"{path}: {visual.Id}: a product must name the package hull {ShipModCatalog.HullKey(visual.Id).Value} as its design."); + } + return (hull, visual, products); + } + + public static (HullData Hull, ShipAuthoring Visual, FactionProductData[] Products) Read(string path) + { + var (hull, visual, products) = Load(path); + ValidateLoaded(hull, visual, products); + return (hull, visual, products); + } + + // Every judgement a loaded package's records face, in one place: Read, and validate on a draft with no model yet, call it. + public static void ValidateLoaded(HullData hull, ShipAuthoring visual, FactionProductData[] products) + { + Validate(hull, visual); + ValidateProducts(hull, visual, products); + } + + // What a package may sell: every product named, no name twice, and a price above 0, because generation skips price 0. + private static void ValidateProducts(HullData hull, ShipAuthoring visual, FactionProductData[] products) + { + if (products.Length == 0) return; + if (products.Any(product => string.IsNullOrWhiteSpace(product.Name))) + throw new InvalidOperationException($"{visual.Id}: every product needs a name."); + if (products.Select(product => product.Name).Distinct(StringComparer.Ordinal).Count() != products.Length) + throw new InvalidOperationException($"{visual.Id}: product names must be unique within the package."); + if (hull.Price <= 0) + throw new InvalidOperationException($"{visual.Id}: a hull with products needs a price above 0 (generation skips price 0)."); + } + + // A hull names one body: a Unity prefab (shipped hulls) or a ShipAuthoring record (mod ships), never both, so no + // consumer needs a precedence rule. A whitespace-only Prefab is unset. Every path that validates or composes hulls + // calls this. + public static void RequireOneBody(HullData hull, string label) + { + if (!string.IsNullOrWhiteSpace(hull.Prefab) && hull.Visual.IsSet()) + throw new InvalidOperationException($"{label}: a hull names one body, but this one names both a Unity prefab and a visual record."); + } + + // The one ship-ID rule, shared by Validate and ship-authoring create. The ID becomes a folder name on every platform, so + // Windows device names (alone or before a dot) and a trailing dot are refused too. The messages name the rule, never the value. + public static void RequireShipId(string id) + { + if (string.IsNullOrWhiteSpace(id)) throw new InvalidOperationException("Ship ID is required."); + if (!(id[0] >= 'a' && id[0] <= 'z' || id[0] >= '0' && id[0] <= '9') || id.Any(c => + !(c >= 'a' && c <= 'z' || c >= '0' && c <= '9' || c == '.' || c == '_' || c == '-'))) + throw new InvalidOperationException("Ship ID must use lower-case ASCII letters, digits, dots, underscores, or hyphens."); + if (id[id.Length - 1] == '.') throw new InvalidOperationException("Ship ID must not end with a dot."); + var stem = id.Split('.')[0]; + if (stem is "con" or "prn" or "aux" or "nul" + || stem.Length == 4 && (stem.StartsWith("com") || stem.StartsWith("lpt")) && stem[3] >= '1' && stem[3] <= '9') + throw new InvalidOperationException("Ship ID must not be a Windows device name."); + } + + // The one semantic check every path shares: the hull and its visual, judged together. + public static void Validate(HullData hull, ShipAuthoring ship) + { + if (ship == null) throw new InvalidOperationException("Ship authoring record is null."); + RequireShipId(ship.Id); + if (hull == null) throw new InvalidOperationException($"{ship.Id}: hull data is required."); + if (string.IsNullOrWhiteSpace(hull.Name)) throw new InvalidOperationException($"{ship.Id}: hull name is required."); + if (hull.Shape?.Cells == null || !hull.Shape.Cells.Cast().Any(occupied => occupied)) + throw new InvalidOperationException($"{ship.Id}: schematic must contain at least one cell."); + RequireOneBody(hull, ship.Id); + if (hull.HullType == HullType.Ship && !(hull.Behaviors ?? new List()).Any(behavior => behavior is VelocityLimitData)) + throw new InvalidOperationException($"{ship.Id}: a ship hull needs a top speed (VelocityLimit)."); + if (!hull.Visual.Key.Equals(ShipModCatalog.AuthoringKey(ship.Id))) + throw new InvalidOperationException($"{ship.Id}: the hull must name its visual record {ShipModCatalog.AuthoringKey(ship.Id).Value}."); + if (string.IsNullOrWhiteSpace(ship.ModelAsset) || Path.IsPathRooted(ship.ModelAsset) || + ship.ModelAsset.Replace('\\', '/').Split('/').Any(part => part == "..")) + throw new InvalidOperationException($"{ship.Id}: model asset must be a relative package path."); + + var anchors = ship.Anchors ?? throw new InvalidOperationException($"{ship.Id}: anchors are required."); + var ids = new HashSet(StringComparer.Ordinal); + var nodeIds = new HashSet(StringComparer.Ordinal); + foreach (var anchor in anchors) + { + if (anchor == null || string.IsNullOrWhiteSpace(anchor.Id) || !ids.Add(anchor.Id)) + throw new InvalidOperationException($"{ship.Id}: anchor IDs must be present and unique."); + if (string.IsNullOrWhiteSpace(anchor.ModelNodeId)) + throw new InvalidOperationException($"{ship.Id}: anchor {anchor.Id} needs a model node ID."); + if (!nodeIds.Add(anchor.ModelNodeId)) + throw new InvalidOperationException($"{ship.Id}: model node {anchor.ModelNodeId} is claimed by more than one anchor."); + } + foreach (var anchor in anchors) + if (!Roles.Contains(anchor.Role)) + throw new InvalidOperationException($"{ship.Id}: anchor {anchor.Id} has unknown role '{anchor.Role}'."); + foreach (var role in new[] { "map-icon", "hull-collider", "shield", "tractor" }) + if (anchors.Count(anchor => anchor.Role == role) != 1) + throw new InvalidOperationException($"{ship.Id}: exactly one {role} anchor is required."); + + var mounts = new Dictionary(StringComparer.Ordinal); + var occupiedHardpointCells = new HashSet<(int x, int y)>(); + foreach (var hardpoint in hull.Hardpoints ?? new List()) + { + if (hardpoint == null || string.IsNullOrWhiteSpace(hardpoint.Transform) || mounts.ContainsKey(hardpoint.Transform)) + throw new InvalidOperationException($"{ship.Id}: hardpoint IDs must be present and unique."); + mounts.Add(hardpoint.Transform, hardpoint); + if (!Enum.IsDefined(typeof(HardpointType), hardpoint.Type)) + throw new InvalidOperationException($"{ship.Id}: hardpoint {hardpoint.Transform} has an unknown type {(int)hardpoint.Type}."); + if (!Enum.IsDefined(typeof(ItemRotation), hardpoint.Rotation)) + throw new InvalidOperationException($"{ship.Id}: hardpoint {hardpoint.Transform} has an unknown rotation {(int)hardpoint.Rotation}."); + if (!float.IsFinite(hardpoint.Armor) || hardpoint.Armor < 0 || !float.IsFinite(hardpoint.FiringArc) || hardpoint.FiringArc < 0) + throw new InvalidOperationException($"{ship.Id}: hardpoint {hardpoint.Transform} armor and firing arc must be finite and not negative."); + // A thruster's gimbal range is the judge's alone, a row of one included: no thruster swings further than a turn. + if (hardpoint.Type == HardpointType.Thruster && hardpoint.FiringArc > 360f) + throw new InvalidOperationException($"{ship.Id}: thruster hardpoint {hardpoint.Transform} firing arc may be at most 360 degrees."); + if (!string.IsNullOrEmpty(hardpoint.Row) && hardpoint.Type != HardpointType.Thruster) + throw new InvalidOperationException($"{ship.Id}: hardpoint {hardpoint.Transform} is a {hardpoint.Type} hardpoint, and only a Thruster hardpoint may state a row."); + if (hardpoint.Shape?.Cells == null || !hardpoint.Shape.Cells.Cast().Any(occupied => occupied)) + throw new InvalidOperationException($"{ship.Id}: hardpoint {hardpoint.Transform} has no cells."); + for (var cellX = 0; cellX < hardpoint.Shape.Width; cellX++) + for (var cellY = 0; cellY < hardpoint.Shape.Height; cellY++) + { + if (!hardpoint.Shape.Cells[cellX, cellY]) continue; + var x = hardpoint.Position.x + cellX; + var y = hardpoint.Position.y + cellY; + if (x < 0 || y < 0 || x >= hull.Shape.Width || y >= hull.Shape.Height || !hull.Shape.Cells[x, y]) + throw new InvalidOperationException($"{ship.Id}: hardpoint {hardpoint.Transform} lies outside the hull schematic."); + if (!occupiedHardpointCells.Add((x, y))) + throw new InvalidOperationException($"{ship.Id}: hardpoint {hardpoint.Transform} overlaps another hardpoint."); + } + // Only a hardpoint that shows on the model has a mount anchor, and its type fixes the role that anchor plays. + var mountAnchor = anchors.FirstOrDefault(anchor => anchor.Id == hardpoint.Transform); + var mountRole = MountRole(hardpoint.Type); + if (mountRole == null && mountAnchor != null) + throw new InvalidOperationException($"{ship.Id}: {hardpoint.Type} hardpoint {hardpoint.Transform} is internal, so no anchor may take its id."); + if (mountRole != null && mountAnchor == null) + throw new InvalidOperationException($"{ship.Id}: {hardpoint.Type} hardpoint {hardpoint.Transform} has no model anchor."); + if (mountRole != null && mountAnchor.Role != mountRole) + throw new InvalidOperationException($"{ship.Id}: {hardpoint.Type} hardpoint {hardpoint.Transform} needs a {mountRole} anchor of that id."); + } + foreach (var row in mounts.Values.Where(hardpoint => hardpoint.Type == HardpointType.Thruster && !string.IsNullOrEmpty(hardpoint.Row)) + .GroupBy(hardpoint => hardpoint.Row, StringComparer.Ordinal)) + { + var lead = row.First(); + foreach (var hardpoint in row) + if (hardpoint.Rotation != lead.Rotation || hardpoint.FiringArc != lead.FiringArc) + throw new InvalidOperationException($"{ship.Id}: thruster hardpoints {lead.Transform} and {hardpoint.Transform} are in row {row.Key} and must share Rotation and FiringArc."); + if (!(lead.FiringArc > 0f)) + throw new InvalidOperationException($"{ship.Id}: thruster row {row.Key} must state a gimbal FiringArc above 0."); + } + foreach (var anchor in anchors) + { + if (!string.IsNullOrEmpty(anchor.ParentId) && !mounts.ContainsKey(anchor.ParentId)) + throw new InvalidOperationException($"{ship.Id}: anchor {anchor.Id} has unknown hardpoint parent {anchor.ParentId}."); + // A mount-role anchor is the mount of a hardpoint of its type, never a loose node. The hardpoint loop above has + // already refused one whose id names a hardpoint of another type, so here it only has to name a hardpoint. + if ((RigChains.Actuates(anchor.Role) || anchor.Role == "radiator-mesh") && !mounts.ContainsKey(anchor.Id)) + throw new InvalidOperationException($"{ship.Id}: {anchor.Role} anchor {anchor.Id} must be the mount of a hardpoint of its type."); + if (anchor.Role == "weapon-muzzle" && + (string.IsNullOrEmpty(anchor.ParentId) || !IsWeapon(mounts[anchor.ParentId].Type))) + throw new InvalidOperationException($"{ship.Id}: muzzle {anchor.Id} must be parented to a weapon hardpoint's mount."); + } + foreach (var hardpoint in mounts.Values.Where(hardpoint => IsWeapon(hardpoint.Type))) + if (!anchors.Any(anchor => anchor.Role == "weapon-muzzle" && anchor.ParentId == hardpoint.Transform)) + throw new InvalidOperationException($"{ship.Id}: weapon hardpoint {hardpoint.Transform} needs at least one muzzle anchor."); + ValidateRig(ship, anchors, mounts, nodeIds); + + foreach (var line in ship.SchematicLines ?? new List()) + { + var points = line?.Points; + if (points == null || points.Length < 6 || points.Length % 3 != 0 || + points.Any(value => float.IsNaN(value) || float.IsInfinity(value))) + throw new InvalidOperationException($"{ship.Id}: schematic line needs finite XYZ points."); + var count = points.Length / 3; + if (line.Radii != null && line.Radii.Length != count || + line.Opacities != null && line.Opacities.Length != count) + throw new InvalidOperationException($"{ship.Id}: schematic line point attributes have the wrong length."); + if (line.Radii != null && line.Radii.Any(value => float.IsNaN(value) || float.IsInfinity(value) || value < 0) || + line.Opacities != null && line.Opacities.Any(value => float.IsNaN(value) || value < 0 || value > 1)) + throw new InvalidOperationException($"{ship.Id}: schematic line radius and opacity must be finite and in range."); + if (line.Color != null && (line.Color.Length != 4 || + line.Color.Any(value => float.IsNaN(value) || float.IsInfinity(value)))) + throw new InvalidOperationException($"{ship.Id}: schematic line color must be finite RGBA."); + } + } + + // A degree of freedom counts as yaw when its axis lies within 5 degrees of Ship Root up (glTF +Y). + private static readonly float YawAxisCos = MathF.Cos(5f * MathF.PI / 180f); + + // The joints, which anchors ride them, and whether each driven joint's chain can sweep the arc its guns state. The + // joints are presentation, so this judges only that the rig could point the gun where the hardpoint says it may fire. + private static void ValidateRig(ShipAuthoring ship, List anchors, Dictionary mounts, HashSet nodeIds) + { + var joints = ship.Joints ?? new List(); + var byId = new Dictionary(StringComparer.Ordinal); + foreach (var joint in joints) + { + if (joint == null || string.IsNullOrWhiteSpace(joint.Id) || byId.ContainsKey(joint.Id)) + throw new InvalidOperationException($"{ship.Id}: joint IDs must be present and unique."); + if (nodeIds.Contains(joint.Id)) + throw new InvalidOperationException($"{ship.Id}: joint {joint.Id} is also an anchor's model node."); + byId.Add(joint.Id, joint); + } + foreach (var joint in joints) + { + var dofs = joint.Min?.Length ?? 0; + if (dofs < 1 || joint.Max?.Length != dofs || joint.Axes?.Length != 3 * dofs) + throw new InvalidOperationException($"{ship.Id}: joint {joint.Id} needs one or more degrees of freedom: Axes holds three values each, Min and Max one each."); + for (var dof = 0; dof < dofs; dof++) + { + var (x, y, z) = (joint.Axes[3 * dof], joint.Axes[3 * dof + 1], joint.Axes[3 * dof + 2]); + var (min, max) = (joint.Min[dof], joint.Max[dof]); + if (!float.IsFinite(x) || !float.IsFinite(y) || !float.IsFinite(z) || !float.IsFinite(min) || !float.IsFinite(max)) + throw new InvalidOperationException($"{ship.Id}: joint {joint.Id} axes and limits must be finite."); + if (MathF.Abs(MathF.Sqrt(x * x + y * y + z * z) - 1f) > 1e-3f) + throw new InvalidOperationException($"{ship.Id}: joint {joint.Id} axis {dof} must be a unit vector."); + if (min < -180f || max > 180f || min > max) + throw new InvalidOperationException($"{ship.Id}: joint {joint.Id} limits {dof} must satisfy -180 <= Min <= Max <= 180."); + } + if (!string.IsNullOrEmpty(joint.Parent) && !byId.ContainsKey(joint.Parent)) + throw new InvalidOperationException($"{ship.Id}: joint {joint.Id} has an unknown parent joint."); + } + foreach (var joint in joints) + { + var step = joint; + for (var depth = 0; !string.IsNullOrEmpty(step.Parent); depth++) + { + if (depth >= joints.Count) + throw new InvalidOperationException($"{ship.Id}: joint {joint.Id} is on a parent cycle."); + step = byId[step.Parent]; + } + } + + foreach (var anchor in anchors.Where(anchor => !string.IsNullOrEmpty(anchor.Joint))) + { + if (anchor.Role == "radiator-mesh") + throw new InvalidOperationException($"{ship.Id}: {anchor.Role} anchor {anchor.Id} may not ride a joint."); + if (!RigChains.Actuates(anchor.Role)) + throw new InvalidOperationException($"{ship.Id}: {anchor.Role} anchor {anchor.Id} may not name a joint; only a weapon mount or a thruster emitter rides one."); + if (!byId.ContainsKey(anchor.Joint)) + throw new InvalidOperationException($"{ship.Id}: {anchor.Role} anchor {anchor.Id} names an unknown joint."); + } + + // A joint has one actuator (ruling one-joint-one-actuator), and RigChains.Drives is the only place that says what drives a + // joint: a joint carrying two actuators, or whose reach passes through a joint another actuator drives, is refused here, + // whatever the two actuators are. + var drives = RigChains.Drives(ship).Select(drive => (drive.Joint, Hardpoint: mounts[drive.Anchor.Id])).ToArray(); + foreach (var onJoint in drives.GroupBy(drive => drive.Joint, StringComparer.Ordinal)) + { + var lead = onJoint.First().Hardpoint; + var other = onJoint.Select(drive => drive.Hardpoint).FirstOrDefault(hardpoint => RigChains.Actuator(hardpoint) != RigChains.Actuator(lead)); + if (other != null) + throw new InvalidOperationException($"{ship.Id}: joint {onJoint.Key} carries more than one actuator ({lead.Transform} and {other.Transform}); a joint has one actuator."); + } + var driven = RigChains.Driven(ship); + foreach (var joint in driven) + { + var through = RigChains.Chain(ship, joint).SkipLast(1).FirstOrDefault(driven.Contains); + if (through != null) + throw new InvalidOperationException($"{ship.Id}: joint {joint} reaches through joint {through}, which another actuator drives; a joint has one actuator."); + } + + var ridden = drives.Where(drive => IsWeapon(drive.Hardpoint.Type)).ToArray(); + foreach (var (_, hardpoint) in ridden) + if (!(hardpoint.FiringArc > 0f)) + throw new InvalidOperationException($"{ship.Id}: weapon hardpoint {hardpoint.Transform} rides a joint, so it must state its firing arc above 0."); + foreach (var group in ridden.GroupBy(mount => mount.Joint, StringComparer.Ordinal)) + { + var lead = group.First().Hardpoint; + foreach (var (_, hardpoint) in group) + if (hardpoint.Rotation != lead.Rotation || hardpoint.FiringArc != lead.FiringArc) + throw new InvalidOperationException($"{ship.Id}: weapon hardpoints {lead.Transform} and {hardpoint.Transform} ride joint {group.Key} and must share Rotation and FiringArc."); + var reach = YawReach(ship, group.Key); + if (reach < lead.FiringArc) + throw new InvalidOperationException($"{ship.Id}: joint {group.Key} chain reaches {reach} degrees of yaw, short of the {lead.FiringArc} degree firing arc of {lead.Transform}."); + } + + // A thruster row is a gimbal: its hardpoints' stated FiringArc is how far the row swings, so a row on a joint rides it + // whole, and the joint's chain must be able to sweep that arc. A hardpoint with no Row is a row of one. + var thrusters = mounts.Values.Where(hardpoint => hardpoint.Type == HardpointType.Thruster).ToArray(); + var tilted = drives.Where(drive => drive.Hardpoint.Type == HardpointType.Thruster).ToArray(); + foreach (var (_, hardpoint) in tilted) + if (!(hardpoint.FiringArc > 0f)) + throw new InvalidOperationException($"{ship.Id}: thruster hardpoint {hardpoint.Transform} rides a joint, so it must state its firing arc above 0; a fixed thruster may not ride a joint."); + foreach (var onJoint in tilted.GroupBy(drive => drive.Joint, StringComparer.Ordinal)) + { + var lead = onJoint.First().Hardpoint; + var members = string.IsNullOrEmpty(lead.Row) ? new[] { lead } : thrusters.Where(hardpoint => hardpoint.Row == lead.Row).ToArray(); + foreach (var member in members) + if (!tilted.Any(drive => drive.Hardpoint == member && drive.Joint == onJoint.Key)) + throw new InvalidOperationException($"{ship.Id}: thruster hardpoint {member.Transform} is in the row of {lead.Transform} on joint {onJoint.Key} and must ride it too; a row rides one joint whole."); + var reach = YawReach(ship, onJoint.Key); + if (reach < lead.FiringArc) + throw new InvalidOperationException($"{ship.Id}: joint {onJoint.Key} chain reaches {reach} degrees of yaw, short of the {lead.FiringArc} degree gimbal arc of {lead.Transform}."); + } + } + + // The yaw a driven joint's chain can sweep: the summed range of every degree of freedom whose axis is yaw, capped at a turn. + private static float YawReach(ShipAuthoring ship, string jointId) + { + var joints = ship.Joints.ToDictionary(joint => joint.Id, StringComparer.Ordinal); + var reach = 0f; + foreach (var joint in RigChains.Chain(ship, jointId).Select(id => joints[id])) + for (var dof = 0; dof < joint.Min.Length; dof++) + if (MathF.Abs(joint.Axes[3 * dof + 1]) >= YawAxisCos) + reach += joint.Max[dof] - joint.Min[dof]; + return MathF.Min(reach, 360f); + } +} + +// A rig's actuators and the joints they drive. An actuator is a weapon mount or a thruster emitter that names a joint; a gun +// group (every gun on a joint) or a thruster row is one actuator, and a joint has at most one (ruling one-joint-one-actuator). +// This is the only place that says which anchors are actuators, so the judge, the binder and the plan all follow it. +public static class RigChains +{ + public static bool Actuates(string role) => role == "weapon-mount" || role == "thruster-emitter"; + + // Every actuator anchor that names a joint, with the joint it drives. + public static IEnumerable<(string Joint, ShipAnchor Anchor)> Drives(ShipAuthoring ship) => + ship.Anchors.Where(anchor => Actuates(anchor.Role) && !string.IsNullOrEmpty(anchor.Joint)).Select(anchor => (anchor.Joint, anchor)); + + public static HashSet Driven(ShipAuthoring ship) => + new HashSet(Drives(ship).Select(drive => drive.Joint), StringComparer.Ordinal); + + // The actuator a mount belongs to: all guns on a joint are one, a thruster is its row, and a thruster of no row is its own. + public static string Actuator(HardpointData hardpoint) => + ShipAuthoringStore.IsWeapon(hardpoint.Type) ? "weapon" : string.IsNullOrEmpty(hardpoint.Row) ? "thruster:" + hardpoint.Transform : "row:" + hardpoint.Row; + + // The joint and its ancestors, root-first. The judge refuses a driven joint whose ancestors another actuator drives, + // so for an accepted ship this is the whole chain the actuator's reach is summed over. + public static string[] Chain(ShipAuthoring ship, string jointId) + { + var joints = ship.Joints.ToDictionary(joint => joint.Id, StringComparer.Ordinal); + var chain = new List { jointId }; + for (var parent = joints[jointId].Parent; !string.IsNullOrEmpty(parent); parent = joints[parent].Parent) + chain.Add(parent); + chain.Reverse(); + return chain.ToArray(); + } +} diff --git a/Assets/Scripts/ServerShared/ShipAuthoring.cs.meta b/Assets/Scripts/ServerShared/ShipAuthoring.cs.meta new file mode 100644 index 000000000..b9d7af3b4 --- /dev/null +++ b/Assets/Scripts/ServerShared/ShipAuthoring.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 0da6676b1995425fa66187e8e58956e7 diff --git a/Assets/Scripts/ServerShared/ShipModCatalog.cs b/Assets/Scripts/ServerShared/ShipModCatalog.cs new file mode 100644 index 000000000..e9ed613a2 --- /dev/null +++ b/Assets/Scripts/ServerShared/ShipModCatalog.cs @@ -0,0 +1,350 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using GameCult.Caching; +using Newtonsoft.Json.Linq; +using System.Text; + +// Builds the one catalog snapshot CultCache needs. Sources remain the shipped catalog and each +// mod-owned ship.cc; this output is disposable and never becomes an authoring surface. +public static class ShipModCatalog +{ + public sealed class Package + { + public HullData Hull; + public ShipAuthoring Visual; + public string ModelPath; + public Dictionary NodeIndices; + // The package's own products, read from its ship.cc; empty for a package taken from the catalog, where gameplay reads products. + public FactionProductData[] Products = Array.Empty(); + } + + public static CultRecordKey HullKey(string id) => new CultRecordKey("mod-hull:" + id); + public static CultRecordKey AuthoringKey(string id) => new CultRecordKey("mod-ship:" + id); + + public static CultRecordKey ProductKey(string id, CultRecordKey maker) => new CultRecordKey("mod-product:" + id + ":" + maker.Value); + + // A key a package owns. Any record may reference one (ruling catalog-is-a-package-stack); one whose package is removed + // fails closed where it is read. + public static bool IsModKey(CultRecordKey key) => + key.IsSet() && (key.Value.StartsWith("mod-hull:", StringComparison.Ordinal) || key.Value.StartsWith("mod-ship:", StringComparison.Ordinal) || key.Value.StartsWith("mod-product:", StringComparison.Ordinal)); + + // A package left out of the composition, named by its directory, with every reason it was left out. + public sealed class Exclusion + { + public string Package; + public string Reason; + public override string ToString() => $"{Package}: {Reason}"; + } + + public sealed class Composition + { + // Ship IDs of the packages composed into the derived catalog, in directory order. + public string[] Included; + // Packages that failed on their own or collided with the catalog or with each other, in directory order. + public Exclusion[] Excluded; + } + + // One bad package never stops the rest. Each package is read and validated on its own; one that fails is excluded and + // named. A collision (with the shipped catalog, or with another package's hull name) excludes every package involved, + // since neither has a claim to the name. The derived catalog holds the shipped catalog plus the included packages. + // Unsafe inputs and outputs (a missing catalog, a derived file that would replace a source) still throw: nothing is composed. + public static Composition Compose(string shippedCatalog, string outputCatalog, string modsRoot, CultDocumentRegistry registry = null) + { + var source = Path.GetFullPath(shippedCatalog); + var output = Path.GetFullPath(outputCatalog); + var root = Path.GetFullPath(modsRoot); + if (!File.Exists(source)) throw new FileNotFoundException("Shipped catalog is missing", source); + if (!Directory.Exists(root)) throw new DirectoryNotFoundException($"Mod root is missing: {root}"); + if (string.Equals(source, output, StringComparison.OrdinalIgnoreCase)) + throw new InvalidOperationException("The derived catalog cannot replace the shipped catalog."); + if (output.StartsWith(root + Path.DirectorySeparatorChar, StringComparison.OrdinalIgnoreCase)) + throw new InvalidOperationException("The derived catalog cannot replace a mod source or asset."); + + var reasons = new SortedDictionary>(StringComparer.Ordinal); + void Exclude(string package, string reason) + { + if (!reasons.TryGetValue(package, out var list)) reasons[package] = list = new List(); + list.Add(reason); + } + var packages = new List<(string Directory, Package Package)>(); + foreach (var directory in Directory.GetDirectories(root).OrderBy(path => path, StringComparer.Ordinal)) + { + var path = Path.Combine(directory, "ship.cc"); + if (!File.Exists(path)) continue; + var name = Path.GetFileName(directory); + // A package can fail in any way a hostile or broken file can, so its failure is quarantined whatever it is. + try { packages.Add((name, ReadPackage(path))); } + catch (Exception error) { Exclude(name, error.Message); } + } + + Directory.CreateDirectory(Path.GetDirectoryName(output)); + // The store keeps a lock file beside every file it opens, so the working copy gets its own directory and the + // whole directory goes away, whatever the store left in it. + var workspace = output + "." + Guid.NewGuid().ToString("N") + ".tmp"; + var temporary = Path.Combine(workspace, "catalog.cc"); + try + { + Directory.CreateDirectory(workspace); + File.Copy(source, temporary); + Composition composition; + using (var cache = AetheriaStores.Open(temporary, catalogWritable: true, registry: registry)) + { + // Collisions are judged against the shipped records alone, before any package is written, so the + // verdict does not depend on directory order. CultCache indexes names per concrete type and lets the + // last writer win, and GetByName over a base type throws on a match across subtypes: a mod hull named + // like any shipped item, or like another mod's hull, would make name lookups wrong or throw. + var keys = new HashSet(cache.AllStoredDocuments.Select(record => record.Key)); + var itemNames = new HashSet(cache.GetAll().Select(item => item.Name), StringComparer.Ordinal); + var shipIds = new HashSet(cache.GetAll().Select(existing => existing.Id), StringComparer.Ordinal); + var factionKeys = new HashSet(cache.GetAll().Select(faction => cache.TryGetHandle(faction).Value.Key)); + var productNames = new HashSet(cache.GetAll().Select(product => product.Name), StringComparer.Ordinal); + foreach (var (directory, package) in packages) + { + var (hull, ship) = (package.Hull, package.Visual); + if (keys.Contains(HullKey(ship.Id)) || keys.Contains(AuthoringKey(ship.Id))) + Exclude(directory, $"a mod key collides with an existing catalog record."); + if (itemNames.Contains(hull.Name)) + Exclude(directory, $"hull name '{hull.Name}' collides with an existing catalog item."); + if (shipIds.Contains(ship.Id)) + Exclude(directory, $"ship ID collides with an existing catalog ship authoring record."); + if (StationKinds.HullKindFault(cache, hull) is { } kindFault) Exclude(directory, kindFault); + foreach (var product in package.Products) + { + if (!factionKeys.Contains(product.Manufacturer.Key)) + Exclude(directory, $"product '{product.Name}' names a manufacturer the shipped catalog holds no faction for."); + if (keys.Contains(ProductKey(ship.Id, product.Manufacturer.Key))) + Exclude(directory, $"a mod product key collides with an existing catalog record."); + if (productNames.Contains(product.Name)) + Exclude(directory, $"product name '{product.Name}' collides with an existing catalog product."); + } + } + foreach (var claim in packages.GroupBy(package => package.Package.Hull.Name, StringComparer.Ordinal).Where(group => group.Count() > 1)) + foreach (var (directory, package) in claim) + Exclude(directory, $"hull name '{claim.Key}' is also claimed by " + + string.Join(", ", claim.Where(other => other.Directory != directory).Select(other => other.Directory)) + "."); + foreach (var claim in packages.SelectMany(package => package.Package.Products.Select(product => (package.Directory, product.Name))) + .GroupBy(entry => entry.Name, StringComparer.Ordinal).Where(group => group.Select(entry => entry.Directory).Distinct().Count() > 1)) + foreach (var directory in claim.Select(entry => entry.Directory).Distinct()) + Exclude(directory, $"product name '{claim.Key}' is also claimed by " + + string.Join(", ", claim.Select(entry => entry.Directory).Where(other => other != directory).Distinct()) + "."); + + var included = packages.Where(package => !reasons.ContainsKey(package.Directory)).Select(package => package.Package).ToArray(); + foreach (var package in included) + { + // Verbatim: the mod store's own records, under the keys it already holds them at. + ShipAuthoringStore.Write(cache, package.Hull, package.Visual); + foreach (var product in package.Products) ShipAuthoringStore.WriteProduct(cache, package.Visual.Id, product); + } + // Shipped hulls too: the derived catalog must not hold a hull that names two bodies. + foreach (var hull in cache.GetAll()) + ShipAuthoringStore.RequireOneBody(hull, hull.Name); + cache.FlushAsync().GetAwaiter().GetResult(); + composition = new Composition + { + Included = included.Select(package => package.Visual.Id).ToArray(), + Excluded = reasons.Select(entry => new Exclusion { Package = entry.Key, Reason = string.Join("; ", entry.Value) }).ToArray() + }; + } + if (File.Exists(output)) File.Replace(temporary, output, null); + else File.Move(temporary, output); + return composition; + } + finally + { + if (Directory.Exists(workspace)) Directory.Delete(workspace, true); + } + } + + public static Package ReadPackage(string shipPath) + { + var path = Path.GetFullPath(shipPath); + var (hull, ship, products) = ShipAuthoringStore.Read(path); + return Bind(hull, ship, products, Path.GetDirectoryName(path), path); + } + + // The package a catalog hull names: its two records come from the catalog, and only the GLB comes from the mod + // directory (//). Gameplay reads a mod ship through this, never through its ship.cc. + public static Package PackageOf(CultCache catalog, HullData hull, string modsRoot) + { + var ship = catalog.Get(hull.Visual) ?? + throw new InvalidOperationException($"{hull.Name}: the catalog holds no visual record {hull.Visual.Key.Value}."); + ShipAuthoringStore.Validate(hull, ship); + var directory = Path.Combine(Path.GetFullPath(modsRoot), ship.Id); + return Bind(hull, ship, Array.Empty(), directory, Path.Combine(directory, "ship.cc")); + } + + // The one game-side choice of catalog: the shipped file when no package is installed or none survives composition, + // otherwise the derived file, composed afresh from the shipped one and the surviving packages. Recomposed every + // call, so the derived file is never stale and never an authority. Excluded packages come back named, for the menu. + public static (string Catalog, Exclusion[] Excluded) ResolveCatalog(string shippedCatalog, string derivedCatalog, string modsRoot, + CultDocumentRegistry registry = null) + { + if (!Directory.Exists(modsRoot) || + !Directory.GetDirectories(modsRoot).Any(directory => File.Exists(Path.Combine(directory, "ship.cc")))) + return (shippedCatalog, Array.Empty()); + Composition composition; + // A failure of the composition itself (an unwritable derived path, say) is still a mod problem, never a reason not to boot. + try { composition = Compose(shippedCatalog, derivedCatalog, modsRoot, registry); } + catch (Exception error) { return (shippedCatalog, new[] { new Exclusion { Package = "(all mods)", Reason = error.Message } }); } + return (composition.Included.Length == 0 ? shippedCatalog : derivedCatalog, composition.Excluded); + } + + // The one uninstall: presence under Mods is the only enablement (MR1), so a package leaves by moving, never by deletion, + // to /RemovedMods/ (' (2)' and on when taken). Moving it back reinstalls it. + // Returns the destination. Compose and ResolveCatalog never read RemovedMods. + public static string RemovePackage(string modsRoot, string package) + { + var root = Path.GetFullPath(modsRoot).TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar); + // Containment, not a blacklist: the package must resolve to a strict child of the mods folder whose final name is + // the name given. A name the filesystem rewrites ('...', 'a.', 'a ', 'CON', 'a:b') resolves to something else. + if (!IsPackageName(package)) throw new ArgumentException("Not a mod package name.", nameof(package)); + var source = ChildOf(root, package) ?? throw new ArgumentException("Not a mod package name.", nameof(package)); + var info = new DirectoryInfo(source); + if (!info.Exists) throw new DirectoryNotFoundException("The package is not a directory under the mods folder."); + if (info.Attributes.HasFlag(FileAttributes.ReparsePoint)) + throw new ArgumentException("A package that is a link is not removed.", nameof(package)); + var removed = RemovedRoot(modsRoot); + Directory.CreateDirectory(removed); + var destination = ChildOf(removed, package); + for (var copy = 2; destination != null && (Directory.Exists(destination) || File.Exists(destination)); copy++) + destination = ChildOf(removed, $"{package} ({copy})"); + if (destination == null) throw new ArgumentException("Not a mod package name.", nameof(package)); + Directory.Move(source, destination); + return destination; + } + + private static readonly string[] ReservedDeviceNames = + { "CON", "PRN", "AUX", "NUL", "COM1", "COM2", "COM3", "COM4", "COM5", "COM6", "COM7", "COM8", "COM9", + "LPT1", "LPT2", "LPT3", "LPT4", "LPT5", "LPT6", "LPT7", "LPT8", "LPT9" }; + + // A name Windows keeps as written: no separator, stream colon or wildcard, no trailing dot or space, and + // not a device name (with or without an extension). Held on every platform so a mod moves the same way everywhere. + private static bool IsPackageName(string name) => + !string.IsNullOrEmpty(name) && name != "(all mods)" && + name.IndexOfAny(Path.GetInvalidFileNameChars()) < 0 && name.IndexOfAny(new[] { ':', '*', '?', '"', '<', '>', '|', '/', '\\' }) < 0 && + name.All(character => character >= ' ') && !name.EndsWith('.') && !name.EndsWith(' ') && + !ReservedDeviceNames.Contains(name.Split('.')[0].TrimEnd(' '), StringComparer.OrdinalIgnoreCase); + + // The full path of `name` directly under `root`, or null when the filesystem would resolve it anywhere else or under + // another name. The comparison is of resolved path segments, never of a string prefix ('Mods2' is not inside 'Mods'). + private static string ChildOf(string root, string name) + { + var full = Path.GetFullPath(Path.Combine(root, name)); + return string.Equals(Path.GetDirectoryName(full), root, StringComparison.Ordinal) && + string.Equals(Path.GetFileName(full), name, StringComparison.Ordinal) ? full : null; + } + + private static string RemovedRoot(string modsRoot) => + Path.Combine(Path.GetDirectoryName(Path.GetFullPath(modsRoot).TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar)), "RemovedMods"); + + private static Package Bind(HullData hull, ShipAuthoring ship, FactionProductData[] products, string directory, string path) + { + if (!string.Equals(Path.GetFileName(directory), ship.Id, StringComparison.Ordinal)) + throw new InvalidOperationException($"{path}: ship ID must match its package directory name."); + var modelPath = Path.GetFullPath(Path.Combine(directory, ship.ModelAsset)); + // Containment is ShipAuthoringStore.Validate's job: it refuses rooted and `..` model paths before this line. + if (!File.Exists(modelPath) || !string.Equals(Path.GetExtension(modelPath), ".glb", StringComparison.Ordinal)) + throw new InvalidOperationException($"{ship.Id}: model asset must name an existing GLB inside its package."); + var modelNodes = ReadNodeIds(modelPath); + foreach (var anchor in ship.Anchors) + if (!modelNodes.ContainsKey(anchor.ModelNodeId)) + throw new InvalidOperationException($"{ship.Id}: model has no node with aetheria.id={anchor.ModelNodeId} for anchor {anchor.Id}."); + // Assemble reads a renderer or collider mesh from these anchors' nodes and refuses without one, and reads the shield + // node's scale as three positive radii (ruling thrusters-radiators-are-meshes). These refusals stand in for Assemble's + // throws, so a package Compose includes is one the importer's assembler can build; the exhaust emission surface and + // the glowing radiator are meshes by that same ruling. A weapon mount and a tractor may be empties. + foreach (var anchor in ship.Anchors) + if ((anchor.Role == "thruster-emitter" || anchor.Role == "radiator-mesh" || anchor.Role == "map-icon" || anchor.Role == "hull-collider") && + !modelNodes[anchor.ModelNodeId].HasMesh) + throw new InvalidOperationException($"{ship.Id}: {anchor.Role} anchor {anchor.Id} needs a mesh, but model node {anchor.ModelNodeId} has none."); + foreach (var anchor in ship.Anchors) + if (anchor.Role == "shield" && !modelNodes[anchor.ModelNodeId].PositiveScale) + throw new InvalidOperationException($"{ship.Id}: shield anchor {anchor.Id} needs three positive scale radii on model node {anchor.ModelNodeId}, with no matrix."); + BindRig(ship, modelNodes); + CultRecordRefs.Validate(hull); + return new Package + { + Hull = hull, Visual = ship, Products = products, ModelPath = modelPath, + NodeIndices = modelNodes.ToDictionary(node => node.Key, node => node.Value.Index, StringComparer.Ordinal) + }; + } + + // The rig the record states must be the rig the model has: every joint is a node, each joint's Parent and each mount's + // Joint is the nearest joint above its node, ancestors without an id being walked through by ReadNodeIds, and a radiator + // mesh sits under no joint. + private static void BindRig(ShipAuthoring ship, Dictionary nodes) + { + var joints = new HashSet((ship.Joints ?? new List()).Select(joint => joint.Id), StringComparer.Ordinal); + var idAt = nodes.ToDictionary(node => (int)node.Value.Index, node => node.Key); + // Parent is already the nearest ancestor that carries an id, so the walk up is the chain of those. + string JointAbove(string nodeId) + { + // glTF forbids cycles; the bound keeps a malformed model from hanging the binder. + var parent = nodes[nodeId].Parent; + for (var steps = 0; parent >= 0 && steps <= nodes.Count; steps++, parent = nodes[idAt[parent]].Parent) + if (joints.Contains(idAt[parent])) return idAt[parent]; + return null; + } + + foreach (var joint in ship.Joints ?? new List()) + { + if (!nodes.ContainsKey(joint.Id)) + throw new InvalidOperationException($"{ship.Id}: model has no node with aetheria.id={joint.Id} for a joint."); + if (!string.Equals(JointAbove(joint.Id) ?? "", joint.Parent ?? "", StringComparison.Ordinal)) + throw new InvalidOperationException($"{ship.Id}: joint {joint.Id} must name the nearest joint above its model node as its Parent."); + } + foreach (var anchor in ship.Anchors.Where(anchor => RigChains.Actuates(anchor.Role) || anchor.Role == "radiator-mesh")) + { + var above = JointAbove(anchor.ModelNodeId); + if (string.Equals(above ?? "", anchor.Joint ?? "", StringComparison.Ordinal)) continue; + throw new InvalidOperationException(anchor.Role == "radiator-mesh" + ? $"{ship.Id}: {anchor.Role} anchor {anchor.Id} sits under a joint in the model." + : $"{ship.Id}: {(anchor.Role == "weapon-mount" ? "weapon mount" : "thruster emitter")} {anchor.Id} must name the nearest joint above its model node as its Joint."); + } + } + + // No matrix, and every scale component (default 1) above zero: what Assemble's shield radii need. + private static bool PositiveScale(JObject node) => + node["matrix"] == null && (node["scale"] == null || node["scale"].Select(component => (double)component).All(component => component > 0)); + + // GLB is the xenos asset boundary. Only its node extras, whether each node names a mesh, and its nearest identified ancestor's node index + // (-1 for none) are read here, plus whether the node's scale is three positive radii with no matrix; geometry belongs to the runtime importer. + public static Dictionary ReadNodeIds(string path) + { + using var stream = File.OpenRead(path); + using var reader = new BinaryReader(stream); + if (stream.Length < 20 || reader.ReadUInt32() != 0x46546C67 || reader.ReadUInt32() != 2 || + reader.ReadUInt32() != stream.Length) + throw new InvalidOperationException($"{path}: invalid GLB 2 header."); + var chunkLength = reader.ReadUInt32(); + if (reader.ReadUInt32() != 0x4E4F534A || chunkLength > stream.Length - stream.Position) + throw new InvalidOperationException($"{path}: missing GLB JSON chunk."); + var json = JObject.Parse(Encoding.UTF8.GetString(reader.ReadBytes((int)chunkLength))); + var ids = new Dictionary(StringComparer.Ordinal); + var nodes = (json["nodes"]?.OfType() ?? Enumerable.Empty()).ToArray(); + var parents = Enumerable.Repeat(-1, nodes.Length).ToArray(); + for (var parent = 0; parent < nodes.Length; parent++) + foreach (var child in nodes[parent]["children"]?.Select(token => (int)token) ?? Enumerable.Empty()) + if (child >= 0 && child < nodes.Length) parents[child] = parent; + uint index = 0; + foreach (var node in nodes) + { + var id = (string)node["extras"]?["aetheria.id"]; + if (string.IsNullOrEmpty(id)) { index++; continue; } + if (!ids.TryAdd(id, (index, node["mesh"] != null && node["mesh"].Type != JTokenType.Null, IdentifiedAncestor(parents, nodes, (int)index), PositiveScale(node)))) + throw new InvalidOperationException($"{path}: duplicate GLB node aetheria.id={id}."); + index++; + } + return ids; + } + + private static int IdentifiedAncestor(int[] parents, JObject[] nodes, int index) + { + var parent = parents[index]; + for (var steps = 0; parent >= 0 && steps <= nodes.Length; steps++, parent = parents[parent]) + if (!string.IsNullOrEmpty((string)nodes[parent]["extras"]?["aetheria.id"])) return parent; + return -1; + } +} diff --git a/Assets/Scripts/ServerShared/ShipModCatalog.cs.meta b/Assets/Scripts/ServerShared/ShipModCatalog.cs.meta new file mode 100644 index 000000000..c81d1965d --- /dev/null +++ b/Assets/Scripts/ServerShared/ShipModCatalog.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 708d45e8a4144a6e89bcf40e96b0975a diff --git a/Assets/Scripts/ServerShared/ShipModPlan.cs b/Assets/Scripts/ServerShared/ShipModPlan.cs new file mode 100644 index 000000000..6f659edac --- /dev/null +++ b/Assets/Scripts/ServerShared/ShipModPlan.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +// Which anchor fills which slot of a ship's component arrays. Pure over (hull, visual) so the Unity assembler only +// follows it: the hull's hardpoint type decides what a mount is, the anchor's role decides which node plays the part. +public sealed class ShipModPlan +{ + public string MapIcon; + public string HullCollider; + public string Shield; + public string Tractor; + // Mount ids whose anchor (role thruster-emitter / radiator-mesh) is the emitter / mesh node itself. + public string[] Thrusters; + public string[] Radiators; + // Each weapon mount (role weapon-mount) and its muzzle anchors, by Order then id. + public (string Mount, string[] Muzzles)[] Weapons; + // One entry per driven joint (one a weapon mount names), by its first weapon in hull order: the joint, its chain + // root-first (RigChains), and the lead mount (the joint's first weapon in hull order) with that mount's first muzzle. + // Presentation only: the assembler rigs these and nothing here reaches the simulation. + public (string Joint, string[] Chain, string LeadMount, string LeadMuzzle)[] Rigs; + + // Maps a pair Validate accepts; every rule about which anchor may play which part is Validate's, so this refuses nothing. + public static ShipModPlan Build(HullData hull, ShipAuthoring visual) + { + ShipAuthoringStore.Validate(hull, visual); + var hardpoints = hull.Hardpoints ?? new List(); + string Only(string wanted) => visual.Anchors.Single(anchor => anchor.Role == wanted).Id; + string[] Mounts(HardpointType type) => hardpoints.Where(hardpoint => hardpoint.Type == type).Select(hardpoint => hardpoint.Transform).ToArray(); + var muzzles = visual.Anchors.Where(anchor => anchor.Role == "weapon-muzzle") + .OrderBy(anchor => anchor.Order).ThenBy(anchor => anchor.Id, StringComparer.Ordinal).ToArray(); + + var weapons = hardpoints.Where(hardpoint => ShipAuthoringStore.IsWeapon(hardpoint.Type)).Select(hardpoint => hardpoint.Transform).ToHashSet(StringComparer.Ordinal); + var jointOf = RigChains.Drives(visual).Where(drive => weapons.Contains(drive.Anchor.Id)) + .ToDictionary(drive => drive.Anchor.Id, drive => drive.Joint, StringComparer.Ordinal); + var leads = hardpoints.Where(hardpoint => jointOf.ContainsKey(hardpoint.Transform)).GroupBy(hardpoint => jointOf[hardpoint.Transform], StringComparer.Ordinal) + .Select(group => (Joint: group.Key, Lead: group.First().Transform)); + + return new ShipModPlan + { + MapIcon = Only("map-icon"), + HullCollider = Only("hull-collider"), + Shield = Only("shield"), + Tractor = Only("tractor"), + Thrusters = Mounts(HardpointType.Thruster), + Radiators = Mounts(HardpointType.Radiator), + Weapons = hardpoints.Where(hardpoint => ShipAuthoringStore.IsWeapon(hardpoint.Type)).Select(hardpoint => ( + hardpoint.Transform, + muzzles.Where(muzzle => muzzle.ParentId == hardpoint.Transform).Select(muzzle => muzzle.Id).ToArray())).ToArray(), + Rigs = leads.Select(rig => (rig.Joint, RigChains.Chain(visual, rig.Joint), rig.Lead, + muzzles.First(muzzle => muzzle.ParentId == rig.Lead).Id)).ToArray() + }; + } +} diff --git a/Assets/Scripts/ServerShared/ShipModPlan.cs.meta b/Assets/Scripts/ServerShared/ShipModPlan.cs.meta new file mode 100644 index 000000000..6235b5279 --- /dev/null +++ b/Assets/Scripts/ServerShared/ShipModPlan.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: b45caa5f5ad9c164b8a295528f1b4951 \ No newline at end of file diff --git a/Assets/Scripts/ServerShared/SimClock.cs b/Assets/Scripts/ServerShared/SimClock.cs new file mode 100644 index 000000000..ee260a50b --- /dev/null +++ b/Assets/Scripts/ServerShared/SimClock.cs @@ -0,0 +1,76 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +using System; + +// The one relation between simulation time and real time. Real seconds go in; whole fixed steps come out, each +// handed to the caller's step action with the same Step. Nothing else in the game converts frame time to sim time, +// and nothing integrates a sim quantity on this clock: presenters read Lead to draw ahead of the latest step +// (DrawAhead) and decide no sim fact. +public sealed class SimClock +{ + // The longest real time one frame may feed. A hitch (a load, a breakpoint) is a slow frame, not a burst of + // catch-up steps. + public const float MaxFrameSeconds = .1f; + + // Game steps per real second at design speed 1, and the sim seconds one step carries. The one owner of the game's + // tick: every driver of a game history steps Zone.Update by GameStep. Design speed (ruling sim-speed-surface) will + // set Step = DesignSpeed / TickRate in ForGame and nowhere else. + public const int TickRate = 30; + public const float GameStep = 1f / TickRate; + + public static SimClock ForGame() => new SimClock(GameStep, TickRate); + + private readonly double _period; + private double _accumulator; + private bool _advancing; + + public SimClock(float step, float stepsPerRealSecond) + { + if (!(step > 0)) throw new ArgumentOutOfRangeException(nameof(step)); + if (!(stepsPerRealSecond > 0)) throw new ArgumentOutOfRangeException(nameof(stepsPerRealSecond)); + Step = step; + StepsPerRealSecond = stepsPerRealSecond; + _period = 1.0 / stepsPerRealSecond; + } + + // Sim seconds per step, fixed for the clock's life. + public float Step { get; } + + public float StepsPerRealSecond { get; } + + public long Steps { get; private set; } + + // Sim seconds since the last step, 0 <= Lead < Step. + public float Lead => (float) (_accumulator * StepsPerRealSecond * Step); + + // Forgets the real time paid toward the next step (a new zone starts between steps). A step cannot do this to the + // clock that is running it. + public void Reset() + { + if (_advancing) throw new InvalidOperationException("A step cannot reset the clock that is running it."); + _accumulator = 0; + } + + // Feeds real seconds (negative counts as none, one frame counts at most MaxFrameSeconds) and runs the whole + // steps they pay for. Returns how many ran. + public int Advance(float realSeconds, Action step) + { + _accumulator += Math.Min(Math.Max(realSeconds, 0f), MaxFrameSeconds); + var ran = 0; + _advancing = true; + try + { + while (_accumulator >= _period) + { + _accumulator -= _period; + step(Step); + Steps++; + ran++; + } + } + finally { _advancing = false; } + return ran; + } +} diff --git a/Assets/Scripts/ServerShared/SimClock.cs.meta b/Assets/Scripts/ServerShared/SimClock.cs.meta new file mode 100644 index 000000000..30e06c489 --- /dev/null +++ b/Assets/Scripts/ServerShared/SimClock.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7a9e3edac65f4a8e8313bdbfe69ccebd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/ServerShared/SimulationDice.cs b/Assets/Scripts/ServerShared/SimulationDice.cs new file mode 100644 index 000000000..adc440299 --- /dev/null +++ b/Assets/Scripts/ServerShared/SimulationDice.cs @@ -0,0 +1,43 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +using Random = CultMath.Random; + +// Structured simulation seeds: the one place a zone seed, a stream and an ordinal become a generator. Every +// draw is a pure function of its arguments, never of a shared stream, so one roll cannot perturb another. +public static class SimulationDice +{ + public const uint LootStream = 1; + public const uint MineStream = 2; + // A pilot's own decisions, ordinal Agent.Id: its preferred engagement range and its patrol circuit. AI behaviour + // never rides ItemManager.Random, so minting items cannot change how a pilot fights. + public const uint CombatSampleStream = 3; + public const uint PatrolStream = 4; + // Generation placement of an unpacked ship packed at the origin, ordinal its 1-based index in the pack, on the zone's + // seed (CombatSeed): the run seed feeds drops and mines only (ruling run-seed-drops-only), and placement never rides + // ItemManager.Random. + public const uint ScatterStream = 5; + + // 9.1 (docs/fire-control-cut.md): fmix32, MurmurHash3's 32-bit finalizer -- xor-shift, multiply, + // xor-shift, multiply, xor-shift. Diffuses a structured seed (a zone seed XORed with a small, + // low-bits-only id) across every bit before the first xorshift draw reads it, so two seeds that differ + // only in their low bits still land on uncorrelated first outputs. Caller-side mixing only -- + // CultMath.Random itself is unchanged. FireControl.Commit's per-shot seed is built on this verbatim. + public static uint Mix(uint seed) + { + seed ^= seed >> 16; + seed *= 0x85ebca6bu; + seed ^= seed >> 13; + seed *= 0xc2b2ae35u; + seed ^= seed >> 16; + return seed; + } + + // The generator for the `ordinal`th roll of `stream` in the zone identified by `zoneSeed`. + public static Random For(uint zoneSeed, uint stream, uint ordinal) + { + var seed = Mix(Mix(zoneSeed ^ Mix(stream)) ^ ordinal); + return new Random(seed == 0 ? 1u : seed); + } +} diff --git a/Assets/Scripts/ServerShared/SimulationDice.cs.meta b/Assets/Scripts/ServerShared/SimulationDice.cs.meta new file mode 100644 index 000000000..c32cf0aba --- /dev/null +++ b/Assets/Scripts/ServerShared/SimulationDice.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: da428be21afa46a991b55ab9b794d192 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/ServerShared/StatResolver.cs b/Assets/Scripts/ServerShared/StatResolver.cs index bbd3ea542..7062fbd9e 100644 --- a/Assets/Scripts/ServerShared/StatResolver.cs +++ b/Assets/Scripts/ServerShared/StatResolver.cs @@ -141,6 +141,9 @@ public class StatResolver { set.Scale.Remove(modifierKey); set.Constant.Remove(modifierKey); + // An entry with nothing attached is no entry: a modifier that is gone leaves no trace in the resolver. + if (set.Scale.Count == 0 && set.Constant.Count == 0) + _modifiers.Remove(entry); } _cache.Remove(entry); } diff --git a/Assets/Scripts/ServerShared/StationKinds.cs b/Assets/Scripts/ServerShared/StationKinds.cs new file mode 100644 index 000000000..dad1ce2aa --- /dev/null +++ b/Assets/Scripts/ServerShared/StationKinds.cs @@ -0,0 +1,161 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using GameCult.Caching; +using MessagePack; +using Newtonsoft.Json; + +// What a station is for: one authored catalog record per kind (mining, trade-hub, shipyard...). The catalog's list of +// these records is the one list of station kinds. A kind names no hull: the hull names its kind (HullData.Kind), and +// which hull a faction builds for a kind is derived from the products that faction makes (StationKinds), so a package can +// add a faction's model of a kind without editing any kind record. Records are keyed station-kind:. +[CultDocument("aetheria.stationkinddata", "1"), MessagePackObject, JsonObject(MemberSerialization.OptIn)] +public class StationKindData +{ + [CultName, JsonProperty("name"), Key(0)] + public string Name; + + [JsonProperty("description"), Key(1)] + public string Description; + + // A faction with no model of this kind builds the stand-in's hull and the station stays this kind. Ignored once the + // faction offers a model of this kind. + [JsonProperty("standIns"), Key(2)] + public List StandIns = new List(); + + public static CultRecordKey KeyOf(string id) => new CultRecordKey("station-kind:" + id); +} + +[MessagePackObject, JsonObject(MemberSerialization.OptIn)] +public class StationKindStandIn +{ + [JsonProperty("faction"), Key(0)] + public CultRecordRef Faction; + + // The kind whose model this faction builds in place of the owning kind's. + [JsonProperty("kind"), Key(1)] + public CultRecordRef Kind; +} + +// The one owner of which kinds a faction builds, which kind a station gets, and which hull kind stands in. +public static class StationKinds +{ + // The kinds this faction can place: those of the station hulls its products offer, and those that stand in for it. + // Ordered by key so a choice never depends on store order. Empty for no faction. + public static CultRecordRef[] KindsOf(CultCache catalog, Faction faction) + { + if (faction == null) return Array.Empty>(); + var kinds = new HashSet(OfferedStationHulls(catalog, faction).Select(hull => hull.Kind.Key.Value), StringComparer.Ordinal); + foreach (var kind in catalog.GetAll()) + if (kind.StandIns.Any(standIn => catalog.Get(standIn.Faction) == faction)) + kinds.Add(catalog.RefOf(kind).Key.Value); + return Ordered(kinds); + } + + // The kinds this faction places that a station can be drawn for: those whose hull kind (its own model, else its stand-in's) some + // maker offers. A stand-in whose model has not landed leaves its kind out. + public static CultRecordRef[] FieldableKindsOf(CultCache catalog, Faction faction) => + KindsOf(catalog, faction).Where(kind => HasModel(catalog, faction, kind) || LiveStandIn(catalog, faction, kind).IsSet()).ToArray(); + + // A station's kind: a stable pick among the faction's kinds it can field, by the station's site, which generation names by the + // zone's seed and the station's place in its orbit order (never by a key the cache mints). It draws nothing from any random + // stream, so adding the kind to generation moves no other roll. A kind the faction places but cannot field (neither its own + // model nor a stand-in's hull kind is carried by any offered station hull) is not in the pool; a faction left with no kind to + // field falls back to any kind some offered station hull carries, logged, and the hull draw then falls back to any maker. + // Unset when the catalog has none. + public static CultRecordRef Choose(CultCache catalog, Faction faction, string site, Action log = null) + { + var pool = FieldableKindsOf(catalog, faction); + if (pool.Length == 0) + { + pool = Ordered(OfferedKinds(catalog)); + if (pool.Length == 0) return default; + log?.Invoke($"{faction?.Name ?? "This galaxy"} builds no station kind it can field; placing a station of any kind some maker offers."); + } + return pool[(int) (site.StableHash() % (uint) pool.Length)]; + } + + // The kind of hull a faction builds for a station kind: the kind itself when the faction offers a model of it (a model + // wins over a stale stand-in), else the kind its stand-in names when some maker offers that, else the kind itself (the hull + // draw then falls back to any maker). + public static CultRecordRef HullKindFor(CultCache catalog, Faction faction, CultRecordRef kind) + { + if (!kind.IsSet() || HasModel(catalog, faction, kind)) return kind; + var standIn = LiveStandIn(catalog, faction, kind); + return standIn.IsSet() ? standIn : kind; + } + + private static bool HasModel(CultCache catalog, Faction faction, CultRecordRef kind) => + OfferedStationHulls(catalog, faction).Any(hull => hull.Kind.Key.Equals(kind.Key)); + + // The kind the faction's stand-in names for this kind, when some maker offers a hull of it; else unset. + private static CultRecordRef LiveStandIn(CultCache catalog, Faction faction, CultRecordRef kind) + { + var standIn = catalog.Get(kind)?.StandIns.FirstOrDefault(entry => catalog.Get(entry.Faction) == faction); + return standIn != null && standIn.Kind.IsSet() && OfferedKinds(catalog).Contains(standIn.Kind.Key.Value) ? standIn.Kind : default; + } + + // What is wrong with a hull's kind, or null: a Station hull names a kind the catalog holds, and no other hull names one. + // The one rule, applied to the catalog on Open and to each mod package on Compose. + public static string HullKindFault(CultCache catalog, HullData hull) + { + if (hull.HullType == HullType.Station) + { + if (!hull.Kind.IsSet()) + return $"Station hull '{hull.Name}' has no Kind; a station hull names the station kind it is built to be."; + if (catalog.Get(hull.Kind) == null) + return $"Station hull '{hull.Name}' Kind names no station kind this catalog holds."; + } + else if (hull.Kind.IsSet()) + return $"Hull '{hull.Name}' is a {hull.HullType} and names a Kind; only a station hull has one."; + return null; + } + + // Open refuses a malformed kind catalog, naming the record and field. Every Station hull names a kind the catalog holds + // and no other hull names one; every stand-in names a faction and a kind the catalog holds, is never its own kind, and + // does not stand on another stand-in for the same faction (one hop). A caller that gives kindlessStation is the owner + // of the catalog being repaired: a Station hull with no Kind is reported to it by name instead of refused. + public static void Validate(CultCache catalog, Action kindlessStation = null) + { + foreach (var hull in catalog.GetAll()) + { + var fault = HullKindFault(catalog, hull); + if (fault == null) continue; + if (kindlessStation != null && hull.HullType == HullType.Station && !hull.Kind.IsSet()) kindlessStation(fault); + else throw new InvalidOperationException(fault); + } + foreach (var kind in catalog.GetAll()) + { + var self = catalog.RefOf(kind).Key; + for (var i = 0; i < kind.StandIns.Count; i++) + { + var entry = kind.StandIns[i]; + var at = $"Station kind '{kind.Name}' StandIns[{i}]"; + var faction = catalog.Get(entry.Faction); + if (faction == null) throw new InvalidOperationException($"{at}.Faction names no faction this catalog holds."); + var other = catalog.Get(entry.Kind); + if (other == null) throw new InvalidOperationException($"{at}.Kind names no station kind this catalog holds."); + if (entry.Kind.Key.Equals(self)) throw new InvalidOperationException($"{at}.Kind is the kind itself; a kind cannot stand in for itself."); + if (other.StandIns.Any(next => catalog.Get(next.Faction) == faction)) + throw new InvalidOperationException($"{at}.Kind stands in for the same faction itself; a stand-in is one hop."); + } + } + } + + // The hull kinds some maker offers: the pool a station can always be drawn from. + private static HashSet OfferedKinds(CultCache catalog) => + new HashSet(DrawableStationProducts(catalog).Select(entry => entry.hull.Kind.Key.Value), StringComparer.Ordinal); + + private static IEnumerable OfferedStationHulls(CultCache catalog, Faction faction) => + DrawableStationProducts(catalog).Where(entry => catalog.Get(entry.product.Manufacturer) == faction).Select(entry => entry.hull); + + // The station hulls a hull draw can reach (LoadoutGenerator.IsDrawable, the one definition), with the product that sells each. + private static IEnumerable<(FactionProductData product, HullData hull)> DrawableStationProducts(CultCache catalog) => + catalog.GetAll() + .Select(product => (product, hull: catalog.Get(product.Design) as HullData)) + .Where(entry => entry.hull != null && entry.hull.HullType == HullType.Station && entry.hull.Kind.IsSet() && + LoadoutGenerator.IsDrawable(catalog, entry.product, entry.hull)); + + private static CultRecordRef[] Ordered(IEnumerable keys) => + keys.OrderBy(key => key, StringComparer.Ordinal).Select(key => new CultRecordRef(new CultRecordKey(key))).ToArray(); +} diff --git a/Assets/Scripts/ServerShared/StationKinds.cs.meta b/Assets/Scripts/ServerShared/StationKinds.cs.meta new file mode 100644 index 000000000..8e29291ad --- /dev/null +++ b/Assets/Scripts/ServerShared/StationKinds.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7b3e1a94c2d84f6e9a05d1c8e4f27b63 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/ServerShared/StationServices.cs b/Assets/Scripts/ServerShared/StationServices.cs new file mode 100644 index 000000000..153fc595d --- /dev/null +++ b/Assets/Scripts/ServerShared/StationServices.cs @@ -0,0 +1,156 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +// What a station pays for goods and charges to mend gear. The one owner of the sell price, the repair cost, and the +// two commits that move goods or restore durability against the run's credits; TradeMenu shows these numbers and +// decides none of them. It holds no Unity type. Credits are the caller's: a refusal leaves them, the cargo and the +// durabilities exactly as they were. +public static class StationServices +{ + // What the station charges for the item, or for `quantity` units of a commodity (a crafted item is one unit). The + // number TradeMenu shows, checks against the run's credits and charges. + public static int BuyPrice(ItemManager items, ItemInstance item, int quantity = 1) + { + switch (item) + { + case CraftedItemInstance crafted: + return items.GetPrice(crafted); + case SimpleCommodity commodity: + return (int) Math.Min((long) items.GetData(commodity).Price * quantity, int.MaxValue); + default: + throw new ArgumentException($"{item?.GetType().Name ?? "null"} has no buy price.", nameof(item)); + } + } + + // What the station pays for the item: its price, scaled by SellFraction and by its condition. A commodity has no + // wear, so it sells at the fraction alone; a simple commodity's price is per unit. + public static int SellPrice(ItemManager items, ItemInstance item) + { + var fraction = (double) items.GameplaySettings.SellFraction; + switch (item) + { + case CraftedItemInstance crafted: + return SellValue(items.GetPrice(crafted), fraction, Condition(items, crafted)); + case SimpleCommodity commodity: + return (int) Math.Floor((long) items.GetData(commodity).Price * commodity.Quantity * fraction); + default: + throw new ArgumentException($"{item?.GetType().Name ?? "null"} has no sell price.", nameof(item)); + } + } + + // What the station charges to restore the entity's hull armour, hull and every item it carries to design: each + // piece's share of its price in proportion to its wear, scaled by the repair fraction, rounded up. Armour has no + // price of its own, so the worn share of the hull's total armour is charged as that share of the hull's price. + public static int RepairCost(ItemManager items, Entity entity) + { + var fraction = RepairFraction(items); + long total = (long) Math.Ceiling(ArmourWear(entity) * items.GetPrice(entity.Hull) * fraction); + foreach (var gear in Gear(entity)) total += RepairShare(items, gear, fraction); + return (int) Math.Min(total, int.MaxValue); + } + + // What the station charges for each unit of wear it mends: RepairFraction, but never less than SellFraction, so + // mending an item before selling it never pays more than the repair cost. + private static double RepairFraction(ItemManager items) => + Math.Max(items.GameplaySettings.RepairFraction, items.GameplaySettings.SellFraction); + + // The worn share of the entity's armour, 0 when it is whole or has none. + private static double ArmourWear(Entity entity) + { + double max = 0, worn = 0; + for (var x = 0; x < entity.MaxArmor.GetLength(0); x++) + for (var y = 0; y < entity.MaxArmor.GetLength(1); y++) + { + max += entity.MaxArmor[x, y]; + worn += Math.Max(0, entity.MaxArmor[x, y] - entity.Armor[x, y]); + } + return max > 0 ? worn / max : 0; + } + + // The purchase: the station charges BuyPrice, and `deliver` puts the goods where they go. Credits are checked + // and charged here, at the same boundary as TryRepair: a price equal to the credits held is affordable. + public static BuyResult TryBuy(ItemManager items, ItemInstance item, int quantity, ref int credits, Func deliver) + { + var price = BuyPrice(items, item, quantity); + if (price > credits) return BuyResult.ShortOfCredits; + if (!deliver()) return BuyResult.NoRoom; + credits -= price; + return BuyResult.Bought; + } + + // The purchase of `quantity` units of a station stack, delivered as one lot. A bay holds no stack above its + // design's MaxStack, so a stack the station holds is a lot already; a stack above it comes from outside a bay and is + // refused, as is a purchase of more than the stack holds or of a stack that holds nothing. All of that is refused + // before anything moves, so `deliver` moves units the station has and the charge is for the units it delivered. + public static BuyResult TryBuyLots(ItemManager items, SimpleCommodity stock, int quantity, ref int credits, Func deliver) + { + if (quantity < 1 || quantity > stock.Quantity || stock.Quantity > items.GetData(stock).MaxStack) return BuyResult.NoRoom; + return TryBuy(items, stock, quantity, ref credits, () => deliver(quantity)); + } + + // The quantity a Buy Quantity field may hold: what was typed, at most what the credits cover and what the station + // has, and never below one unit (a price the credits do not cover is then refused as short of credits). + public static int BuyableQuantity(ItemManager items, SimpleCommodity stock, int typed, int credits) => + Math.Max(1, Math.Min(Math.Min(typed, credits / BuyPrice(items, stock)), stock.Quantity)); + + // The sale: the item leaves the bay for one of the station's cargo bays and the station pays SellPrice. False, + // with the item in its bay and the credits unchanged, when no station bay can take it. + public static bool TrySell(EquippedCargoBay from, Entity station, ItemInstance item, ref int credits) + { + var price = SellPrice(station.ItemManager, item); + var moved = item is SimpleCommodity commodity + ? station.CargoBays.Any(bay => from.TryTransferItem(bay, commodity, commodity.Quantity)) + : station.CargoBays.Any(bay => from.TryTransferItem(bay, (CraftedItemInstance) item)); + if (!moved) return false; + credits += price; + return true; + } + + // The repair: armour and every durability go back to design and the station charges RepairCost. False, with + // nothing restored, when the credits fall short. + public static bool TryRepair(Entity entity, ref int credits) + { + var items = entity.ItemManager; + var cost = RepairCost(items, entity); + if (cost > credits) return false; + foreach (var gear in Gear(entity)) + if (items.GetData(gear) is EquippableItemData design && design.Durability > 0) + gear.Durability = design.Durability; + Array.Copy(entity.MaxArmor, entity.Armor, entity.MaxArmor.Length); + credits -= cost; + return true; + } + + // Equipment holds the hull itself, so the hull is in the sum once. + private static IEnumerable Gear(Entity entity) => + entity.Equipment.Select(equipped => equipped.EquippableItem) + .Concat(entity.CargoBays.Select(bay => bay.EquippableItem)) + .Concat(entity.DockingBays.Select(bay => bay.EquippableItem)); + + // Instance durability over the design's, for gear that wears; everything else is as good as new. + private static double Condition(ItemManager items, CraftedItemInstance item) + { + if (!(item is EquippableItem gear) || !(items.GetData(gear) is EquippableItemData design) || design.Durability <= 0) + return 1; + return Math.Max(0, Math.Min(1, gear.Durability / (double) design.Durability)); + } + + // The sell value of a price at a condition, rounded down. The one place the sell rounding lives: RepairShare + // prices the sell value a repair adds from the same function, so the two cannot round apart. + private static int SellValue(int price, double fraction, double condition) => + (int) Math.Floor(price * fraction * condition); + + // The share of the repair charge for one piece of gear: its wear at the repair fraction, rounded up, and never + // less than the sell value the repair adds, so mending before selling never nets credits. + private static long RepairShare(ItemManager items, EquippableItem gear, double fraction) + { + var price = items.GetPrice(gear); + var condition = Condition(items, gear); + var sellFraction = (double) items.GameplaySettings.SellFraction; + var added = SellValue(price, sellFraction, 1) - SellValue(price, sellFraction, condition); + return Math.Max(added, (long) Math.Ceiling((1 - condition) * price * fraction)); + } +} + +public enum BuyResult { Bought, ShortOfCredits, NoRoom } diff --git a/Assets/Scripts/ServerShared/StationServices.cs.meta b/Assets/Scripts/ServerShared/StationServices.cs.meta new file mode 100644 index 000000000..c184b64d8 --- /dev/null +++ b/Assets/Scripts/ServerShared/StationServices.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: efc90d4ec994710468cd5df6ed2c2739 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/ServerShared/Steering.cs b/Assets/Scripts/ServerShared/Steering.cs new file mode 100644 index 000000000..de477332f --- /dev/null +++ b/Assets/Scripts/ServerShared/Steering.cs @@ -0,0 +1,24 @@ +using System; +using CultMath; +using static CultMath.math; + +// The one law that turns a wanted heading into a facing command. Ship.Update reads only Ship.Turn; whoever +// wants the hull to face somewhere (the player's face-the-aim state, an agent state) asks here and writes Turn. +public static class Steering +{ + const float Deadband = .01f; + + // Positive is clockwise. Lateral component of the heading with sqrt shaping and a deadband; a heading + // behind the hull turns at full demand (its lateral component alone would vanish at exactly astern). + // A zero or non-finite heading holds course. + public static float Toward(Ship ship, float2 heading) + { + if (!float.IsFinite(heading.x) || !float.IsFinite(heading.y) || lengthsq(heading) < 1e-12f) return 0f; + var dir = normalize(ship.Direction); + var wanted = normalize(heading); + var d = dot(wanted, dir.Rotate(ItemRotation.Clockwise)); + if (dot(wanted, dir) < 0f) return d < 0f ? -1f : 1f; + if (abs(d) < Deadband) return 0f; + return sqrt(abs(d)) * sign(d); + } +} diff --git a/Assets/Scripts/ServerShared/Steering.cs.meta b/Assets/Scripts/ServerShared/Steering.cs.meta new file mode 100644 index 000000000..bf9a98148 --- /dev/null +++ b/Assets/Scripts/ServerShared/Steering.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 8b84ac5db42877d45b7f6286cc2e2b93 \ No newline at end of file diff --git a/Assets/Scripts/ServerShared/Targeting.meta b/Assets/Scripts/ServerShared/Targeting.meta new file mode 100644 index 000000000..39f43376e --- /dev/null +++ b/Assets/Scripts/ServerShared/Targeting.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7c083d5830b0418cbf8e34158465d764 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/ServerShared/Targeting/BeltTargets.cs b/Assets/Scripts/ServerShared/Targeting/BeltTargets.cs new file mode 100644 index 000000000..3e12536c3 --- /dev/null +++ b/Assets/Scripts/ServerShared/Targeting/BeltTargets.cs @@ -0,0 +1,300 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +using System; +using System.Collections.Generic; +using GameCult.Caching; +using CultMath; +using static CultMath.math; +using float2 = CultMath.float2; + +// Mining index: one belt's rocks as targets. Derived from the belt's data, the zone's settings and zone time when the +// zone builds the belt, and never saved. +// +// Rocks are grouped into bands of neighbouring orbit distance. Within a band they are sorted by where they stood on +// their orbits (in turns, as AsteroidBelt.Pose measures them) at the band's key time. A rock's turn at a later time is +// its key plus elapsed / period, and a band's periods lie close together, so the rocks near a point lie in one arc of +// keys, widened by elapsed time times the band's rate spread. A band sheared past ShearLimit is re-sorted at the +// current time, at most RekeyBudget bands per search, so no single search pays for the whole belt; one that is not +// re-sorted is still searched correctly through its wider arc. Each band is split into segments of consecutive keys, +// and each segment's part of the arc is a region, bounded by the annular sector it can occupy. +public sealed class BeltTargets : ITargetProvider +{ + private const int RocksPerBand = 256; + private const int RocksPerSegment = 32; + private const double ShearLimit = 1.0 / 64; + private const int RekeyBudget = 8; + + private readonly Zone _zone; + private readonly CultRecordKey _field; + private readonly AsteroidBeltData _data; + private readonly double[] _periods; + private readonly Band[] _bands; + // No rock of the belt, whole or worn, is wider than this (AsteroidSize's bound over every argument). + private readonly float _largestRadius; + + private sealed class Band + { + public float Inner, Outer; // the least and greatest orbit distance among the band's rocks + public double SlowestRate, FastestRate; // turns per second: 1 / period + public double KeyTime; + public int[] Rocks; + public double[] Keys; // each rock's turn at KeyTime, ascending, in [0, 1) + } + + public BeltTargets(Zone zone, CultRecordKey field, AsteroidBeltData data, PlanetSettings settings, double time) + { + _zone = zone; + _field = field; + _data = data; + var size = settings.AsteroidSize; + _largestRadius = size.Exponent > 0 ? max(abs(size.Minimum), abs(size.Maximum)) : float.PositiveInfinity; + + var count = data.Asteroids.Length; + _periods = new double[count]; + var order = new int[count]; + var distances = new float[count]; + for (var i = 0; i < count; i++) + { + order[i] = i; + distances[i] = data.Asteroids[i].Distance; + // The belt's own periods (Zone.PeriodAround), the very floats Pose divides by. + _periods[i] = zone.AsteroidBelts[field].Periods[i]; + } + Array.Sort(distances, order); + _bands = new Band[(count + RocksPerBand - 1) / RocksPerBand]; + for (var b = 0; b < _bands.Length; b++) + { + var start = b * RocksPerBand; + var length = Math.Min(RocksPerBand, count - start); + var band = new Band + { + Inner = distances[start], Outer = distances[start + length - 1], + SlowestRate = double.PositiveInfinity, FastestRate = double.NegativeInfinity, + Rocks = new int[length], Keys = new double[length] + }; + Array.Copy(order, start, band.Rocks, 0, length); + foreach (var rock in band.Rocks) + { + var rate = 1.0 / _periods[rock]; + band.SlowestRate = Math.Min(band.SlowestRate, rate); + band.FastestRate = Math.Max(band.FastestRate, rate); + } + Rekey(band, time); + _bands[b] = band; + } + } + + // Diagnostic only: how many bands have been re-sorted since the belt was built, so a test can pin the budget. + public long Rekeys { get; private set; } + + private void Rekey(Band band, double time) + { + Rekeys++; + band.KeyTime = time; + for (var j = 0; j < band.Rocks.Length; j++) + band.Keys[j] = Turn(time / _periods[band.Rocks[j]] + _data.Asteroids[band.Rocks[j]].Phase); + Array.Sort(band.Keys, band.Rocks); + } + + public void Regions(in TargetSearch search, List into) + { + var time = _zone.ExactTime; + var centre = _zone.GetOrbitPosition(_zone.Orbits[_data.Orbit.Key].Data.Parent.Key); + var offset = search.Position - centre; + var distance = length(offset); + var turn = Turn(atan2(offset.y, offset.x) / (2 * Math.PI)); + // Slack covers float rounding in Pose and in these bounds; it only ever widens a region. + var slack = 1e-4f * (_bands[_bands.Length - 1].Outer + distance) + 1e-3f; + var reach = search.Reach + slack; + var half = distance <= reach ? 1.0 : Math.Asin(reach / distance) / (2 * Math.PI) + 1e-6; + var budget = RekeyBudget; + + // The first band whose outer edge reaches the search. + int lo = 0, hi = _bands.Length; + while (lo < hi) + { + var mid = (lo + hi) / 2; + if (_bands[mid].Outer < distance - reach) lo = mid + 1; + else hi = mid; + } + for (var b = lo; b < _bands.Length && _bands[b].Inner <= distance + reach; b++) + { + var band = _bands[b]; + if (Math.Abs(time - band.KeyTime) * (band.FastestRate - band.SlowestRate) > ShearLimit && budget > 0) + { + Rekey(band, time); + budget--; + } + Drift(band, time, out var leastDrift, out var mostDrift); + var width = 2 * half + (mostDrift - leastDrift); + if (!(width < 1)) + { + AddSegments(search, b, 0, band.Keys.Length, centre, distance, turn, slack, into); + continue; + } + // Keys whose rock can now lie within half a window of the search's own turn. + var from = Turn(turn - half - mostDrift); + var to = from + width; + AddSegments(search, b, LowerBound(band.Keys, from), UpperBound(band.Keys, Math.Min(to, 1.0)), centre, distance, turn, slack, into); + if (to > 1) AddSegments(search, b, 0, UpperBound(band.Keys, to - 1), centre, distance, turn, slack, into); + } + } + + public void Candidates(in TargetSearch search, in TargetRegion region, List into) + { + var band = _bands[region.Group]; + for (var j = region.Start; j < region.End; j++) + { + var chunk = new ChunkId(_field, band.Rocks[j]); + if (_zone.ChunkExists(chunk)) into.Add(new TargetCandidate(chunk, _zone.ChunkPose(_field, chunk.Index).xy)); + } + } + + // The keys [start, end) of one band, one region per segment they cross, each bounded by the sector its rocks can + // occupy now: the band's distances, and the turns of its first and last key widened by the band's drift. + private void AddSegments(in TargetSearch search, int b, int start, int end, float2 centre, float distance, double turn, float slack, List into) + { + var band = _bands[b]; + Drift(band, _zone.ExactTime, out var leastDrift, out var mostDrift); + var crossSection = _zone.FieldCrossSection(_data); + for (var s = start; s < end; s = (s / RocksPerSegment + 1) * RocksPerSegment) + { + var e = Math.Min(end, (s / RocksPerSegment + 1) * RocksPerSegment); + var sector = new Sector + { + Inner = band.Inner, Outer = band.Outer, + From = band.Keys[s] + leastDrift - 1e-6, + Width = band.Keys[e - 1] - band.Keys[s] + (mostDrift - leastDrift) + 2e-6 + }; + sector.Range(distance, turn, out var nearest, out var farthest); + nearest = max(0f, nearest - slack); + sector.Bearing(search.Position - centre, out var bearing, out var bearingHalf); + var light = 0f; + foreach (var sun in _zone.Suns()) + { + var fromSun = sun.Orbit.Position - centre; + sector.Range(length(fromSun), Turn(atan2(fromSun.y, fromSun.x) / (2 * Math.PI)), out var sunNearest, out _); + light += Zone.SunLight(sun, max(0f, sunNearest - slack)); + } + var cells = _largestRadius / _zone.SchematicCellSize; + into.Add(new TargetRegion + { + Provider = this, + Group = b, Start = s, End = e, + Nearest = nearest, + Farthest = farthest + slack, + BearingCentre = bearing, + BearingHalfWidth = min((float) PI, bearingHalf + slack / max(distance, 1e-3f) + 1e-5f), + MaxVisibility = crossSection * PI * cells * cells * light * 1.0001f + }); + } + } + + private static void Drift(Band band, double time, out double least, out double most) + { + var elapsed = time - band.KeyTime; + least = Math.Min(elapsed * band.SlowestRate, elapsed * band.FastestRate); + most = Math.Max(elapsed * band.SlowestRate, elapsed * band.FastestRate); + } + + private static double Turn(double turns) => turns - Math.Floor(turns); + + private static int LowerBound(double[] keys, double value) + { + int lo = 0, hi = keys.Length; + while (lo < hi) + { + var mid = (lo + hi) / 2; + if (keys[mid] < value) lo = mid + 1; + else hi = mid; + } + return lo; + } + + private static int UpperBound(double[] keys, double value) + { + int lo = 0, hi = keys.Length; + while (lo < hi) + { + var mid = (lo + hi) / 2; + if (keys[mid] <= value) lo = mid + 1; + else hi = mid; + } + return lo; + } + + // An annular sector about the belt centre: distances [Inner, Outer], turns [From, From + Width] (a Width of 1 or + // more is the whole annulus). + private struct Sector + { + public float Inner, Outer; + public double From, Width; + + // The nearest and farthest a point `distance` from the centre at `turn` can be from any point of the sector. + public void Range(float distance, double turn, out float nearest, out float farthest) + { + double offAngle, farAngle; + if (Width >= 1) + { + offAngle = 0; + farAngle = Math.PI; + } + else + { + var into = Turn(turn - From); + offAngle = into <= Width ? 0 : Math.Min(into - Width, 1 - into) * 2 * Math.PI; + // The sector point farthest in angle: the antipode if the sector holds it, else the farther end. + farAngle = Turn(turn + .5 - From) <= Width + ? Math.PI + : Math.Max(Separation(turn, From), Separation(turn, From + Width)) * 2 * Math.PI; + } + if (offAngle == 0) + nearest = max(max(Inner - distance, distance - Outer), 0f); + else + { + // On the nearer edge ray: the closest point of the segment [Inner, Outer] along it. + var along = clamp(distance * (float) Math.Cos(offAngle), Inner, Outer); + nearest = Apart(distance, along, offAngle); + } + farthest = max(Apart(distance, Inner, farAngle), Apart(distance, Outer, farAngle)); + } + + // A circle that holds the sector, seen from `from` (relative to the belt centre): the bearing to its centre + // and the half-width of the bearings it covers (pi when `from` is inside it). + public void Bearing(float2 from, out float centre, out float halfWidth) + { + float2 middle; + float radius; + if (Width >= .5) + { + middle = float2.zero; + radius = Outer; + } + else + { + var middleTurn = (From + Width / 2) * 2 * Math.PI; + var halfAngle = Width * Math.PI; + var middleRadius = (Inner + Outer) / 2; + middle = middleRadius * float2((float) Math.Cos(middleTurn), (float) Math.Sin(middleTurn)); + radius = max(Apart(middleRadius, Inner, halfAngle), Apart(middleRadius, Outer, halfAngle)); + } + var toMiddle = middle - from; + var apart = length(toMiddle); + centre = atan2(toMiddle.y, toMiddle.x); + halfWidth = apart <= radius ? (float) PI : asin(radius / apart); + } + + // How far apart two points are at distances a and b from the centre, `angle` radians apart about it. + private static float Apart(float a, float b, double angle) => + (float) Math.Sqrt(Math.Max(0, (double) a * a + (double) b * b - 2.0 * a * b * Math.Cos(angle))); + + // The angle in turns between two turns, in [0, .5]. + private static double Separation(double a, double b) + { + var d = Turn(a - b); + return Math.Min(d, 1 - d); + } + } +} diff --git a/Assets/Scripts/ServerShared/Targeting/BeltTargets.cs.meta b/Assets/Scripts/ServerShared/Targeting/BeltTargets.cs.meta new file mode 100644 index 000000000..853bba9c2 --- /dev/null +++ b/Assets/Scripts/ServerShared/Targeting/BeltTargets.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d33fc585810446f7b0a9319196c74633 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/ServerShared/Targeting/EntityTargets.cs b/Assets/Scripts/ServerShared/Targeting/EntityTargets.cs new file mode 100644 index 000000000..f4103e6d0 --- /dev/null +++ b/Assets/Scripts/ServerShared/Targeting/EntityTargets.cs @@ -0,0 +1,39 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +using System.Collections.Generic; +using static CultMath.math; + +// Mining index: entities as targets. Perception stays Entity's: the only entities a search can be offered are those +// already in its observer's VisibleEntities, so the one region carries no visibility bound (they are already seen). +public sealed class EntityTargets : ITargetProvider +{ + public void Regions(in TargetSearch search, List into) + { + var observer = search.Observer; + if (observer == null || observer.VisibleEntities.Count == 0) return; + var nearest = float.PositiveInfinity; + var farthest = 0f; + foreach (var entity in observer.VisibleEntities) + { + var distance = length(entity.Position.xz - search.Position); + nearest = min(nearest, distance); + farthest = max(farthest, distance); + } + into.Add(new TargetRegion + { + Provider = this, + Nearest = nearest, + Farthest = farthest, + BearingHalfWidth = PI, + MaxVisibility = float.PositiveInfinity + }); + } + + public void Candidates(in TargetSearch search, in TargetRegion region, List into) + { + foreach (var entity in search.Observer.VisibleEntities) + into.Add(new TargetCandidate(entity, entity.Position.xz)); + } +} diff --git a/Assets/Scripts/ServerShared/Targeting/EntityTargets.cs.meta b/Assets/Scripts/ServerShared/Targeting/EntityTargets.cs.meta new file mode 100644 index 000000000..49bb99318 --- /dev/null +++ b/Assets/Scripts/ServerShared/Targeting/EntityTargets.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1db47cd187504dbb97994e4b8c436ef1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/ServerShared/Targeting/TargetingIndex.cs b/Assets/Scripts/ServerShared/Targeting/TargetingIndex.cs new file mode 100644 index 000000000..62f5cf6da --- /dev/null +++ b/Assets/Scripts/ServerShared/Targeting/TargetingIndex.cs @@ -0,0 +1,155 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +using System.Collections.Generic; +using CultMath; +using static CultMath.math; +using float2 = CultMath.float2; + +// Mining index (docs/aetheria-release-map.md, L3-L5; operator 2026-10-01: "don't specialize the indexing too much +// towards asteroid belts"): one targeting index per zone (Zone.Targets), fed by providers. It owns which targetable +// things can lie in a region and an upper bound on how visible they can be. Each provider owns its own things' +// motion and bounds. Whether one target is actually visible stays with Entity (ChunkVisible, VisibleEntities): every +// answer here is a superset the caller filters exactly. Nothing in the index names a belt or a rock. + +// One thing that can be targeted, with where it stands on the plane now. +public readonly struct TargetCandidate +{ + public readonly TargetRef Target; + public readonly float2 Position; + + public TargetCandidate(TargetRef target, float2 position) + { + Target = target; + Position = position; + } +} + +// Who is searching, from where, how far, and how well they can see. A null Observer perceives no entities. +// ReachPerVisibility is Entity.DetectionReachPerVisibility: no target of visibility v farther than v times it can be +// detected. Infinity applies no visibility bound. +public readonly struct TargetSearch +{ + public readonly float2 Position; + public readonly float Reach; + public readonly Entity Observer; + public readonly float ReachPerVisibility; + + public TargetSearch(float2 position, float reach, Entity observer = null, float reachPerVisibility = float.PositiveInfinity) + { + Position = position; + Reach = reach; + Observer = observer; + ReachPerVisibility = reachPerVisibility; + } +} + +// A group of a provider's things, with bounds that hold for every one of them at the time it was made: planar +// distance from the searcher in [Nearest, Farthest], bearing from the searcher (radians, as atan2 measures it) +// within BearingHalfWidth of BearingCentre (pi means any bearing), and visibility at most MaxVisibility. +// Group, Start and End are the provider's own: the index only hands the region back to it. +public struct TargetRegion +{ + public ITargetProvider Provider; + public int Group, Start, End; + public float Nearest, Farthest; + public float BearingCentre, BearingHalfWidth; + public float MaxVisibility; + + // Whether anything in this region can both lie within reach and be detected by the searcher. + public bool CanHold(in TargetSearch search) => + !(Nearest > search.Reach) && !(Nearest > MaxVisibility * search.ReachPerVisibility); +} + +public interface ITargetProvider +{ + // Regions that together hold every one of this provider's things within the search's reach, added to `into`. + void Regions(in TargetSearch search, List into); + + // The things of one region this provider made for this search, with their positions now, added to `into`. + void Candidates(in TargetSearch search, in TargetRegion region, List into); +} + +// A best-first question: the candidate with the least key wins. Bound must never exceed the key of any candidate the +// region holds (positive infinity skips the region). Key returns false for a candidate that is not eligible. +// Precedes breaks a tie between two equal keys. +public interface ITargetKey +{ + float Bound(in TargetRegion region); + bool Key(in TargetCandidate candidate, out float key); + bool Precedes(in TargetCandidate a, in TargetCandidate b); +} + +public sealed class TargetingIndex +{ + private readonly List _providers = new List(); + private readonly List _regions = new List(); + private readonly List _candidates = new List(); + private readonly List<(float bound, int region)> _order = new List<(float, int)>(); + + // Diagnostic only: how many candidates the index has posed and tested, ever. Tests pin a query's cost with it + // rather than with timing. + public long Examined { get; private set; } + + public void Add(ITargetProvider provider) => _providers.Add(provider); + + // Every candidate within the search's reach whose region can be detected, written into `into` (cleared first), + // in no particular order. Reach is exact; detection is only bounded, so the caller still tests it. + public void Within(in TargetSearch search, List into) + { + into.Clear(); + _regions.Clear(); + foreach (var provider in _providers) provider.Regions(search, _regions); + foreach (var region in _regions) + { + if (!region.CanHold(search)) continue; + _candidates.Clear(); + region.Provider.Candidates(search, region, _candidates); + foreach (var candidate in _candidates) + { + Examined++; + if (length(candidate.Position - search.Position) <= search.Reach) into.Add(candidate); + } + } + } + + // The eligible candidate within reach with the least key, or false if there is none. Regions are opened in order + // of their bound, and the search stops at the first region whose bound is greater than the best key found: + // Hjaltason and Samet's best-first browsing over the providers' flat region sets. + public bool Best(in TargetSearch search, TKey query, out TargetCandidate best) where TKey : ITargetKey + { + best = default; + var found = false; + var bestKey = float.PositiveInfinity; + _regions.Clear(); + _order.Clear(); + foreach (var provider in _providers) provider.Regions(search, _regions); + for (var i = 0; i < _regions.Count; i++) + { + if (!_regions[i].CanHold(search)) continue; + var bound = query.Bound(_regions[i]); + if (!float.IsPositiveInfinity(bound)) _order.Add((bound, i)); + } + _order.Sort((a, b) => a.bound.CompareTo(b.bound)); + foreach (var (bound, index) in _order) + { + if (found && bound > bestKey) break; + _candidates.Clear(); + var region = _regions[index]; + region.Provider.Candidates(search, region, _candidates); + foreach (var candidate in _candidates) + { + Examined++; + if (!(length(candidate.Position - search.Position) <= search.Reach) || !query.Key(candidate, out var key)) continue; + if (!found || key < bestKey || key == bestKey && query.Precedes(candidate, best)) + { + best = candidate; + bestKey = key; + found = true; + } + } + } + return found; + } +} diff --git a/Assets/Scripts/ServerShared/Targeting/TargetingIndex.cs.meta b/Assets/Scripts/ServerShared/Targeting/TargetingIndex.cs.meta new file mode 100644 index 000000000..4b40c10b0 --- /dev/null +++ b/Assets/Scripts/ServerShared/Targeting/TargetingIndex.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9fef7cc648f2498ebd24e1d0ca61b5c3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/ServerShared/ThrustAllocator.cs b/Assets/Scripts/ServerShared/ThrustAllocator.cs new file mode 100644 index 000000000..148b98d29 --- /dev/null +++ b/Assets/Scripts/ServerShared/ThrustAllocator.cs @@ -0,0 +1,112 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +using System; +using CultMath; + +/// +/// Turns intent (which way to go, which way to turn) into every thruster's throttle, whatever the thrusters' actual +/// strength and position. One per ship. A column is one thruster's effect per unit throttle: x starboard acceleration, +/// y forward acceleration, z clockwise yaw rate in rad/s. Throttles are bounded to [0,1]. +/// +/// One solve per call over the n throttles and four error variables (the unwanted or +/// missing translation on each half-axis, paid for linearly). Yaw is a heavily weighted row, so a hold is exact and a +/// turn is served first; the linear translation cost means the actuator with the least translation per unit of turn +/// serves first and the next joins only as it saturates. Nothing classifies a column as attitude or drive: the onset +/// at which a second actuator joins a turn falls out of the columns. +/// +public sealed class ThrustAllocator +{ + const float TranslationWeight = 100f; + const float YawWeight = 1000f; + const float ErrorCostWeight = .3f; + const float ErrorCostOffset = 10f; + const float Ridge = .1f; + const float ErrorMax = 2f; + const double KktRelativeTolerance = 1e-12; + const int ErrorVariables = 4; + const int FixedRows = 3 + ErrorVariables; + + int _columns = -1; + float[] _a, _b, _lo, _hi, _x, _workspace; + + /// + /// Solves the throttles for the intent. is the throttle lock: every thruster whose + /// column pushes forward is bounded below at full, the stick is ignored (forward is the only translation asked, so + /// nothing fires against the floored drives), and the turn is served by what remains. + /// + public void Allocate(ReadOnlySpan columns, float2 move, float turn, Span throttle, bool forwardFloor = false) + { + var n = columns.Length; + if (n != _columns) Resize(n); + for (var i = 0; i < n; i++) throttle[i] = 0; + if (forwardFloor) move = new float2(0, 1); + for (var i = 0; i < n; i++) _lo[i] = forwardFloor && columns[i].y > 0 ? 1f : 0f; + + // Nothing asked, nothing fired: that is a fact about the intent, decided before the solve. The solver's warm + // start is left as the last solved point, which is where the next non-zero call resumes. + if (Intent(move, turn, 0) == 0 && Intent(move, turn, 1) == 0 && Intent(move, turn, 2) == 0) return; + + var vars = n + ErrorVariables; + var rows = FixedRows + n; + + // Rows 0 and 1 are the translation axes (starboard, forward), row 2 the yaw. + for (var axis = 0; axis < 3; axis++) + { + float plus = 0, minus = 0; + for (var i = 0; i < n; i++) + { + var c = Component(columns[i], axis); + if (c > 0) plus += c; + else if (c < 0) minus -= c; + } + var extreme = Math.Max(plus, minus); + var intent = Intent(move, turn, axis); + var weight = axis == 2 ? YawWeight : TranslationWeight; + // Intent is a fraction of the half-axis extreme it points into. + var demand = intent >= 0 ? intent * plus : intent * minus; + var scale = extreme > 0 ? weight / extreme : 0f; + var row = axis * vars; + for (var i = 0; i < n; i++) _a[row + i] = Component(columns[i], axis) * scale; + _b[axis] = demand * scale; + if (axis < 2) + { + var errorWeight = extreme > 0 ? weight : 0f; + _a[row + n + 2 * axis] = -errorWeight; + _a[row + n + 2 * axis + 1] = errorWeight; + } + } + + // A linear cost on each error variable, as w*e = -w*kappa, and a ridge on each throttle. + for (var k = 0; k < ErrorVariables; k++) + { + _a[(3 + k) * vars + n + k] = ErrorCostWeight; + _b[3 + k] = -ErrorCostWeight * ErrorCostOffset; + } + for (var i = 0; i < n; i++) _a[(FixedRows + i) * vars + i] = Ridge; + + var status = BoundedLeastSquares.Solve(rows, vars, _a, _b, _lo, _hi, _x, _workspace, out _, KktRelativeTolerance); + if (status == BoundedLeastSquaresStatus.InvalidInput) return; + for (var i = 0; i < n; i++) throttle[i] = _x[i]; + } + + static float Intent(float2 move, float turn, int axis) => + Math.Min(Math.Max(axis == 0 ? move.x : axis == 1 ? move.y : turn, -1f), 1f); + + static float Component(float3 c, int axis) => axis == 0 ? c.x : axis == 1 ? c.y : c.z; + + void Resize(int n) + { + _columns = n; + var vars = n + ErrorVariables; + var rows = FixedRows + n; + _a = new float[rows * vars]; + _b = new float[rows]; + _lo = new float[vars]; + _hi = new float[vars]; + _x = new float[vars]; + _workspace = new float[BoundedLeastSquares.WorkspaceLength(vars)]; + for (var i = 0; i < vars; i++) _hi[i] = i < n ? 1f : ErrorMax; + } +} diff --git a/Assets/Scripts/ServerShared/ThrustAllocator.cs.meta b/Assets/Scripts/ServerShared/ThrustAllocator.cs.meta new file mode 100644 index 000000000..d7b82c1b3 --- /dev/null +++ b/Assets/Scripts/ServerShared/ThrustAllocator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5b0e3f7a9c2d4e61a8f4d3c7b1e90a26 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/ServerShared/VapourClouds.cs b/Assets/Scripts/ServerShared/VapourClouds.cs new file mode 100644 index 000000000..9f4a44603 --- /dev/null +++ b/Assets/Scripts/ServerShared/VapourClouds.cs @@ -0,0 +1,32 @@ +using CultMath; +using static CultMath.math; +using float2 = CultMath.float2; + +// A vented vapour cloud: a free-floating disc that thins every sensor sight line through it. Not an Entity, +// never priced or rolled, never saved. Zone.Vent is the only adder and Zone's cloud step the only remover; +// Zone.Obscuration is the one reader detection uses. +public sealed class VapourCloud +{ + public FloatingBodyId Id; + public KinematicBody Body; + public double VentedAt; + public float Lifetime; + public float Radius; + // The opacity at the moment of venting; it fades linearly to nothing over Lifetime. + public float Opacity; + public Entity Venter; + + // A cloud with no lifetime divides by zero; saturate maps the NaN and the infinity to nothing left. + public float OpacityAt(double now) => + saturate(Opacity) * saturate(1f - (float) (now - VentedAt) / Lifetime); + + // Whether the segment a-b reaches the disc: the closest point of the segment to the centre lies within the + // radius. A cloud past either end of the segment touches it only if it is near that end. + public bool Touches(float2 a, float2 b) + { + var ab = b - a; + var length2 = lengthsq(ab); + var t = length2 > 0f ? saturate(dot(Body.Position - a, ab) / length2) : 0f; + return lengthsq(Body.Position - (a + ab * t)) <= Radius * Radius; + } +} diff --git a/Assets/Scripts/ServerShared/VapourClouds.cs.meta b/Assets/Scripts/ServerShared/VapourClouds.cs.meta new file mode 100644 index 000000000..cdaa4b80d --- /dev/null +++ b/Assets/Scripts/ServerShared/VapourClouds.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ced45a9738974452b0065b57ee527e8a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/ServerShared/VerseGrammar.cs b/Assets/Scripts/ServerShared/VerseGrammar.cs new file mode 100644 index 000000000..00e24833d --- /dev/null +++ b/Assets/Scripts/ServerShared/VerseGrammar.cs @@ -0,0 +1,108 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +using System; +using System.Collections.Generic; +using GameCult.Caching; +using MessagePack; + +// The verse grammar (aetheria-release, cut verse-grammar; ghostlight-verse rulings verse-grammar-home-ruled and +// verse-verbs-two-render-paths): the verbs a Ghostlight-simulated Aetheria world may use, each rendering by exactly one +// path the game already has, with typed participant roles. Aetheria owns which verbs exist and how each renders; +// Ghostlight owns what each does to world state. Nothing in the game runtime reads these documents. +[CultDocument("aetheria.verse_grammar", "1"), CultGlobal, MessagePackObject] +public class VerseGrammar +{ + [Key(1)] public int Revision; + [Key(2)] public string Description; +} + +// How a verb is shown: filmed in-engine as a ship action, or presented as an Aetheria conversation. +public enum VerseRenderPath +{ + ShipAction = 1, + Conversation = 2, +} + +// What kind of thing a role binds. +public enum VerseReferentKind +{ + Person = 1, + Faction = 2, + Population = 3, + Place = 4, + Cargo = 5, +} + +[MessagePackObject] +public class VerseRole +{ + [Key(1)] public string Name; + [Key(2)] public VerseReferentKind Binds; +} + +// The actor is the invoking subject and is never a role. +[CultDocument("aetheria.verse_verb", "1"), MessagePackObject] +public class VerseVerb +{ + [CultName, Key(1)] public string Name; + [Key(2)] public VerseRenderPath RenderPath; + [Key(3)] public VerseRole[] Roles = Array.Empty(); + [Key(4)] public string Description; +} + +public static class VerseGrammarValidation +{ + public const int VerbNameMaxLength = 48; + public const int RoleNameMaxLength = 32; + + // The invoking subject, never a role (Ghostlight refuses a world affordance that names it: ReservedRole). + public const string ActorRole = "actor"; + + // Canonical: a lower-case letter, then lower-case letters, digits and underscores, at most maxLength characters. + private static bool Canonical(string name, int maxLength) + { + if (name == null || name.Length == 0 || name.Length > maxLength) return false; + if (name[0] < 'a' || name[0] > 'z') return false; + foreach (var c in name) + if (!((c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || c == '_')) return false; + return true; + } + + // Every verb valid and no two sharing a name: a verb is found by name (Ghostlight refuses DuplicateAffordanceKind). + public static void ValidateAll(IEnumerable verbs) + { + var seen = new HashSet(StringComparer.Ordinal); + foreach (var verb in verbs) + { + Validate(verb); + if (!seen.Add(verb.Name)) + throw new InvalidOperationException($"VerseVerb \"{verb.Name}\": duplicate verb name."); + } + } + + // Canonical names, unique role names, defined enum values. A failure names the field and the rule, and the verb once + // its name is known canonical; it never prints a value the author wrote that is itself the fault. + public static void Validate(VerseVerb verb) + { + if (!Canonical(verb.Name, VerbNameMaxLength)) + throw new InvalidOperationException($"VerseVerb.Name: not a canonical verb name ([a-z][a-z0-9_], 1 to {VerbNameMaxLength} characters)."); + if (!Enum.IsDefined(typeof(VerseRenderPath), verb.RenderPath)) + throw new InvalidOperationException($"VerseVerb \"{verb.Name}\" RenderPath: not a defined render path."); + if (verb.Roles == null) + throw new InvalidOperationException($"VerseVerb \"{verb.Name}\" Roles: missing."); + var seen = new HashSet(StringComparer.Ordinal); + foreach (var role in verb.Roles) + { + if (role == null || !Canonical(role.Name, RoleNameMaxLength)) + throw new InvalidOperationException($"VerseVerb \"{verb.Name}\" Roles.Name: not a canonical role name ([a-z][a-z0-9_], 1 to {RoleNameMaxLength} characters)."); + if (role.Name == ActorRole) + throw new InvalidOperationException($"VerseVerb \"{verb.Name}\" Roles.Name: reserved for the invoking subject, never a role."); + if (!seen.Add(role.Name)) + throw new InvalidOperationException($"VerseVerb \"{verb.Name}\" Roles.Name: duplicate role name."); + if (!Enum.IsDefined(typeof(VerseReferentKind), role.Binds)) + throw new InvalidOperationException($"VerseVerb \"{verb.Name}\" Roles.Binds: not a defined referent kind."); + } + } +} diff --git a/Assets/Scripts/ServerShared/VerseGrammar.cs.meta b/Assets/Scripts/ServerShared/VerseGrammar.cs.meta new file mode 100644 index 000000000..084f027cb --- /dev/null +++ b/Assets/Scripts/ServerShared/VerseGrammar.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3f1a7c52d9e84b6aa0c15e7b2d4f8a91 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/ServerShared/WellTree.cs b/Assets/Scripts/ServerShared/WellTree.cs new file mode 100644 index 000000000..5f9f408e6 --- /dev/null +++ b/Assets/Scripts/ServerShared/WellTree.cs @@ -0,0 +1,435 @@ +using System; +using System.Collections.Generic; +using GameCult.Caching; +using CultMath; +using static CultMath.math; +using float2 = CultMath.float2; + +/// +/// An orbit as the well tree reads it: where it hangs on the tree and the mass of the well-bearing body on it (0 for none). +/// Extent is the outermost distance from the parent of anything riding this orbit's rail (a belt orbit: its outermost +/// asteroid; any other orbit: its Distance). Anchor is a parentless orbit's stationary position, ignored with a parent. +/// +public readonly struct WellNode +{ + public readonly CultRecordKey Key, Parent; + public readonly float Distance, Phase, Mass, Extent; + public readonly float2 Anchor; + + public WellNode(CultRecordKey key, CultRecordKey parent, float distance, float phase, float mass, float extent, float2 anchor) + { + Key = key; + Parent = parent; + Distance = distance; + Phase = phase; + Mass = mass; + Extent = extent; + Anchor = anchor; + } +} + +/// +/// The one owner of which gravity terms a zone has: the orbit tree turned into band terms (GravityField is the law of one +/// term). Built once from the pack's orbits and the authored curves, never reading time; the caller passes positions. +/// +/// Every node F (a body, or a bodyless node with its ring group standing in for the body) contributes at its own position +/// c(m_F) U(eps(m_F), L_F, B_F) + c(M_F) [ U(eps(M_F), max(B_F, Gamma Lam_F), Lam_F) - U(eps(M_F), L_F, B_F) ] +/// m_F is the body's mass, M_F the family's, c and eps the WellStrength and RocheLimit curves. L_F is the outermost +/// child's extent: inside it the node pulls exactly as its body alone. B_F, the support, bounds every descendant term: +/// beyond it the family pulls exactly as one body of mass M_F, out to max(B_F, Gamma Lam_F), and is gone at its reach +/// Lam_F. A zone's sole massive root has infinite reach, so its far field is exactly c(M_zone). A zone of several massive +/// roots (subzones) has one zone node, which is not an orbit: at the roots' centre of mass it owns the only global term, +/// c(M_zone) U_global less c(M_zone) U(eps, A, Beta A), nothing inside A and the whole zone as one body beyond Beta A; +/// each root is bounded to its own subzone (SubzoneReach). +/// A body with no massive descendants is one term c(m) U(eps(m), Gamma Lam, Lam). Beyond a node's reach its whole +/// subtree contributes exactly nothing, so Force and Potential skip it: the walk is exact, not an approximation. +/// +public sealed class WellTree +{ + /// Orbits whose distances differ by no more than this are on one ring (a binary, a ring of siblings). + public const float RingWindow = .1f; + + /// A band term of the field: Strength x GravityField's U(Softening, Inner, Outer) at Node's position, less Reference. + public readonly struct Term + { + public readonly CultRecordKey Node; + public readonly float Strength, Softening, Inner, Outer, Reference; + + public Term(CultRecordKey node, float strength, float softening, float inner, float outer, float reference) + { + Node = node; + Strength = strength; + Softening = softening; + Inner = inner; + Outer = outer; + Reference = reference; + } + } + + private readonly Dictionary _index = new Dictionary(); + private CultRecordKey[] _key; + private int[][] _kids; + private int[] _roots; + private int[][] _ring; + private int[] _termStart, _termCount; + private float[] _distance, _phase, _reach, _support, _extent; + private float2[] _anchor; + private int[] _massiveRoots; + private float _packRadius; + private int _zoneStart, _zoneCount; + private Term[] _terms; + + /// Where the zone node's terms sit (the family-mass-weighted mean of the massive roots' anchors); meaningful when it has terms. + public float2 Centre { get; private set; } + + /// Every term of the zone, grouped by node, the zone node's last (its Node is unset: it sits at Centre): what the lowering uploads and the shader sums. + public IReadOnlyList Terms => _terms; + + private WellTree() { } + + /// A node's reach in its parent's field (+inf for a zone's sole massive root; a subzone's radius for a root of several); 0 for an orbit that carries no mass. + public float Reach(CultRecordKey node) => _reach[_index[node]]; + + /// A node's support B: every term of its descendants lies inside it, so beyond it the family is one body. + public float Support(CultRecordKey node) => _support[_index[node]]; + + /// + /// A well's strength and softening at a mass, from the authored curves (the one place they are read and checked). + /// A mass of 0 is no well. + /// + public static (float Strength, float Softening) Curves(PlanetSettings settings, float mass) + { + var strength = settings.WellStrength.Evaluate(mass); + var softening = settings.RocheLimit.Evaluate(mass); + if (!(strength >= 0f) || float.IsInfinity(strength)) + throw new InvalidOperationException("A body's well strength must be finite and not negative (PlanetSettings.WellStrength)."); + if (strength > 0 && !(softening > 0f && !float.IsInfinity(softening))) + throw new InvalidOperationException("A body's Roche limit, which is its softening, must be positive and finite (PlanetSettings.RocheLimit)."); + return (strength, softening); + } + + /// + /// The tree of a zone's orbits. `packRadius` is where the global terms are zero: each carries its own potential there + /// as its Reference (a bounded term is already 0 beyond its outer edge, so it needs none). + /// + public static WellTree Build(IReadOnlyList nodes, PlanetSettings settings, float packRadius) + { + var tree = new WellTree(); + var n = nodes.Count; + tree._key = new CultRecordKey[n]; + tree._distance = new float[n]; + tree._phase = new float[n]; + tree._extent = new float[n]; + tree._anchor = new float2[n]; + tree._packRadius = packRadius; + for (var i = 0; i < n; i++) + { + tree._extent[i] = nodes[i].Extent; + tree._anchor[i] = nodes[i].Anchor; + tree._index[nodes[i].Key] = i; + tree._key[i] = nodes[i].Key; + tree._distance[i] = nodes[i].Distance; + tree._phase[i] = nodes[i].Phase; + } + + var parent = new int[n]; + var kids = new List[n]; + var depth = new int[n]; + for (var i = 0; i < n; i++) kids[i] = new List(); + for (var i = 0; i < n; i++) + { + parent[i] = nodes[i].Parent.IsSet() && tree._index.TryGetValue(nodes[i].Parent, out var p) ? p : -1; + if (parent[i] >= 0) kids[parent[i]].Add(i); + } + for (var i = 0; i < n; i++) + for (var a = parent[i]; a >= 0; a = parent[a]) depth[i]++; + var roots = new List(); + for (var i = 0; i < n; i++) + if (parent[i] < 0) roots.Add(i); + tree._roots = roots.ToArray(); + var deepestFirst = new int[n]; + for (var i = 0; i < n; i++) deepestFirst[i] = i; + Array.Sort(deepestFirst, (x, y) => depth[y] != depth[x] ? depth[y].CompareTo(depth[x]) : x.CompareTo(y)); + + var body = new float[n]; // the body's own mass + var family = new float[n]; // the family's mass M_F + for (var i = 0; i < n; i++) family[i] = body[i] = nodes[i].Mass; + foreach (var i in deepestFirst) + if (parent[i] >= 0) family[parent[i]] += family[i]; + + // Massive roots are the zone's subzones; with two or more, their centre of mass is the zone node's position. + var massive = new List(); + foreach (var r in roots) + if (family[r] > 0) massive.Add(r); + tree._massiveRoots = massive.ToArray(); + var centre = float2.zero; + var total = 0f; + foreach (var r in massive) + { + centre += tree._anchor[r] * family[r]; + total += family[r]; + } + tree.Centre = total > 0f ? centre / total : float2.zero; + + tree._kids = new int[n][]; + var ring = tree._ring = new int[n][]; + for (var i = 0; i < n; i++) + { + tree._kids[i] = kids[i].ToArray(); + ring[i] = RingOf(kids[i], family, tree._distance); + } + + BuildReaches(tree, parent, body, family, ring, deepestFirst, out var lower, out var group); + for (var i = 0; i < n; i++) + if (body[i] > 0) ring[i] = null; // a ring stands in for a body only on a bodyless node + tree.EmitTerms(parent, body, family, ring, lower, group, settings, packRadius); + return tree; + } + + // The massive children of a node at its innermost massive distance, within RingWindow of it; null when there are none. + private static int[] RingOf(List kids, float[] family, float[] distance) + { + var inner = float.PositiveInfinity; + foreach (var k in kids) + if (family[k] > 0) inner = Math.Min(inner, distance[k]); + if (float.IsPositiveInfinity(inner)) return null; + var members = new List(); + foreach (var k in kids) + if (family[k] > 0 && distance[k] - inner <= RingWindow) members.Add(k); + return members.ToArray(); + } + + // The massive children of a bodyless node that stand in for its body: their mass, the ring's distance and its support. + private readonly struct RingGroup + { + public readonly float Mass, Inner, Support; + public RingGroup(float mass, float inner, float support) + { + Mass = mass; + Inner = inner; + Support = support; + } + } + + // Children before parents: a family's support needs its children's reaches. lower = L_F, the outermost child's extent. + private static void BuildReaches(WellTree t, int[] parent, float[] body, float[] family, int[][] ring, int[] order, + out float[] lower, out RingGroup[] group) + { + var n = parent.Length; + var d = t._distance; + lower = new float[n]; + group = new RingGroup[n]; + t._support = new float[n]; + t._reach = new float[n]; + foreach (var i in order) + { + var low = 0f; + foreach (var k in t._kids[i]) low = Math.Max(low, t._extent[k]); + var support = GravityField.Beta * low; + foreach (var k in t._kids[i]) support = Math.Max(support, t._extent[k] + t._reach[k]); + if (family[i] > 0 && body[i] <= 0) + { + // Bodyless: its ring group stands in for a body (it has massive children, or it would carry no mass). + var inner = float.PositiveInfinity; + var mass = 0f; + foreach (var j in ring[i]) + { + inner = Math.Min(inner, d[j]); + mass += family[j]; + } + var ringSupport = GravityField.Beta * inner; + foreach (var j in ring[i]) ringSupport = Math.Max(ringSupport, d[j] + t._reach[j]); + low = Math.Max(low, ringSupport); + support = Math.Max(support, GravityField.Beta * low); + group[i] = new RingGroup(mass, inner, ringSupport); + } + lower[i] = low; + t._support[i] = support; + if (family[i] <= 0) continue; + var floor = GravityField.Beta * support; + var p = parent[i]; + float reach; + if (p < 0) reach = t.SubzoneReach(i, floor); + else if (body[p] <= 0 && ring[p] != null && ring[p].Length >= 2 && Array.IndexOf(ring[p], i) >= 0) + reach = Math.Max(GravityField.RingReach * d[i], floor); + else reach = Math.Max(GravityField.Reach * d[i], floor); + t._reach[i] = reach > 0f ? reach : 0f; + } + } + + // A root's reach: the floor (Beta x support) or the subzone reach, whichever is more. The subzone shape is decided in the + // public static SubzoneReach (multi-root-isolated-subzones): the generator calls the same function, so Reach x the nearest + // root's distance is spelled once and the roots' windows are fitted to it (root-window-floor). + private float SubzoneReach(int root, float floor) + { + var anchors = new List(); + foreach (var other in _massiveRoots) anchors.Add(_anchor[other]); + return Math.Max(SubzoneReach(anchors, Array.IndexOf(_massiveRoots, root)), floor); + } + + /// + /// A subzone root's reach among the zone's massive roots' anchors: a sole massive root is the whole zone (+inf, so its + /// global term is the far field); with several, each root is bounded to GravityField.Reach x the distance to the nearest + /// other root (multi-root-isolated-subzones). The superposed-inside option is not a change to this return: it needs every + /// root's support, and roots are processed one at a time. + /// + public static float SubzoneReach(IReadOnlyList anchors, int root) + { + if (anchors.Count < 2) return float.PositiveInfinity; + var nearest = float.PositiveInfinity; + for (var other = 0; other < anchors.Count; other++) + if (other != root) nearest = Math.Min(nearest, length(anchors[other] - anchors[root])); + return GravityField.Reach * nearest; + } + + private void EmitTerms(int[] parent, float[] body, float[] family, int[][] ring, float[] lower, RingGroup[] group, + PlanetSettings settings, float packRadius) + { + var n = parent.Length; + var terms = new List(); + _termStart = new int[n]; + _termCount = new int[n]; + for (var i = 0; i < n; i++) + { + _termStart[i] = terms.Count; + if (family[i] <= 0 || !(_reach[i] > 0f)) continue; + var global = float.IsPositiveInfinity(_reach[i]); + var fadeFrom = global ? float.PositiveInfinity : Math.Max(_support[i], GravityField.Gamma * _reach[i]); + void Add(float strength, float softening, float inner, float outer) => terms.Add(new Term(_key[i], strength, softening, inner, + outer, float.IsPositiveInfinity(outer) ? strength * GravityField.Potential(softening, inner, outer, packRadius) : 0f)); + if (body[i] > 0 && family[i] <= body[i]) + { + var (c, eps) = Curves(settings, body[i]); + Add(c, eps, fadeFrom, _reach[i]); + _termCount[i] = terms.Count - _termStart[i]; + continue; + } + if (body[i] > 0) + { + var (c, eps) = Curves(settings, body[i]); + Add(c, eps, lower[i], _support[i]); + } + else + { + var (c, eps) = Curves(settings, group[i].Mass); + Add(c, eps, lower[i], _support[i]); + Add(-c, eps, group[i].Inner, group[i].Support); + } + var (cf, ef) = Curves(settings, family[i]); + Add(cf, ef, fadeFrom, _reach[i]); + Add(-cf, ef, lower[i], _support[i]); + _termCount[i] = terms.Count - _termStart[i]; + } + _zoneStart = terms.Count; + if (_massiveRoots.Length >= 2) + { + var total = 0f; + var span = 0f; + foreach (var r in _massiveRoots) + { + total += family[r]; + span = Math.Max(span, length(_anchor[r] - Centre) + _reach[r]); + } + var (c, eps) = Curves(settings, total); + terms.Add(new Term(default, c, eps, float.PositiveInfinity, float.PositiveInfinity, + c * GravityField.Potential(eps, float.PositiveInfinity, float.PositiveInfinity, packRadius))); + if (span > 0f) terms.Add(new Term(default, -c, eps, span, GravityField.Beta * span, 0f)); + } + _zoneCount = terms.Count - _zoneStart; + _terms = terms.ToArray(); + } + + // One node's own terms at distance r from it, toward its centre. + private float PullOf(int node, float r) => PullOf(_termStart[node], _termCount[node], r); + + private float PullOf(int start, int count, float r) + { + var pull = 0f; + for (var t = start; t < start + count; t++) + { + var term = _terms[t]; + pull += term.Strength * GravityField.Pull(term.Softening, term.Inner, term.Outer, r); + } + return pull; + } + + /// + /// The field's force at p (toward the wells, u/s^2): every node's terms, walked from the roots; a subtree is skipped + /// the moment p is outside its reach, which is exact. `positionAt(orbit, time)` is the caller's, so this never owns time. + /// + public float2 Force(float2 p, Func positionAt, double time) + { + var force = float2.zero; + var toZone = Centre - p; + var rz = length(toZone); + if (_zoneCount > 0 && rz > 0f) force += toZone / rz * PullOf(_zoneStart, _zoneCount, rz); + foreach (var root in _roots) ForceFrom(root, p, positionAt, time, ref force); + return force; + } + + private void ForceFrom(int node, float2 p, Func positionAt, double time, ref float2 force) + { + var offset = positionAt(_key[node], time) - p; + var r = length(offset); + if (r > 0f) + force += offset / r * PullOf(node, r); + foreach (var kid in _kids[node]) + if (length(positionAt(_key[kid], time) - p) < _reach[kid]) ForceFrom(kid, p, positionAt, time, ref force); + } + + /// The field's potential at p: every node's terms less their references, walked as Force walks. + public float Potential(float2 p, Func positionAt, double time) + { + var sum = 0f; + var rz = length(Centre - p); + for (var t = _zoneStart; t < _zoneStart + _zoneCount; t++) + sum += _terms[t].Strength * GravityField.Potential(_terms[t].Softening, _terms[t].Inner, _terms[t].Outer, rz) - _terms[t].Reference; + foreach (var root in _roots) sum += PotentialFrom(root, p, positionAt, time); + return sum; + } + + private float PotentialFrom(int node, float2 p, Func positionAt, double time) + { + var r = length(positionAt(_key[node], time) - p); + var sum = 0f; + for (var t = _termStart[node]; t < _termStart[node] + _termCount[node]; t++) + { + var term = _terms[t]; + sum += term.Strength * GravityField.Potential(term.Softening, term.Inner, term.Outer, r) - term.Reference; + } + foreach (var kid in _kids[node]) + if (length(positionAt(_key[kid], time) - p) < _reach[kid]) sum += PotentialFrom(kid, p, positionAt, time); + return sum; + } + + /// + /// The pull (toward the node, u/s^2) a rail at `distance` round `parentOrbit` is given: the node's own terms at that + /// distance. A ring member of a bodyless node adds each other member's own terms at their chord (positions at t = 0), + /// projected toward the node. Infinite period for a pull of 0 is the caller's. + /// + public float PullAround(CultRecordKey parentOrbit, float distance, CultRecordKey self) + { + var node = _index[parentOrbit]; + var pull = PullOf(node, distance); + var members = _ring[node]; + if (members == null || members.Length < 2) return pull; + if (_index.TryGetValue(self, out var me) && Array.IndexOf(members, me) >= 0) return pull + PartnersPull(members, me); + return pull; + } + + // What the other members of a ring pull member m with, along the direction from m to the node. + private float PartnersPull(int[] members, int m) + { + var at = _distance[m] * OrbitData.Evaluate(_phase[m]); + var sum = 0f; + foreach (var q in members) + { + if (q == m) continue; + var chord = _distance[q] * OrbitData.Evaluate(_phase[q]) - at; + var r = length(chord); + if (r <= 0f || _distance[m] <= 0f) continue; + sum += PullOf(q, r) * dot(chord / r, -at / _distance[m]); + } + return sum; + } +} diff --git a/Assets/Scripts/ServerShared/WellTree.cs.meta b/Assets/Scripts/ServerShared/WellTree.cs.meta new file mode 100644 index 000000000..6834ea3c2 --- /dev/null +++ b/Assets/Scripts/ServerShared/WellTree.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: da20befcb0f606b4ab1165988b836096 \ No newline at end of file diff --git a/Assets/Scripts/ServerShared/Wormhole.cs b/Assets/Scripts/ServerShared/Wormhole.cs index bad43b9fd..fd93e51ca 100644 --- a/Assets/Scripts/ServerShared/Wormhole.cs +++ b/Assets/Scripts/ServerShared/Wormhole.cs @@ -4,4 +4,6 @@ public class Wormhole { public float2 Position; public GalaxyZone Target; + // The run's exit gate: it leads nowhere (Target is null) and ends the run when RunGoal.ExitOpen. + public bool Exit; } \ No newline at end of file diff --git a/Assets/Scripts/ServerShared/WwiseMetadata.cs b/Assets/Scripts/ServerShared/WwiseMetadata.cs deleted file mode 100644 index 30b88ad29..000000000 --- a/Assets/Scripts/ServerShared/WwiseMetadata.cs +++ /dev/null @@ -1,92 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using Newtonsoft.Json; - -[JsonObject] -public class WwiseMetadataFile -{ - public WwiseMetaSoundBanksInfo SoundBanksInfo; -} - -[JsonObject] -public class WwiseMetaSoundBanksInfo -{ - public WwiseMetaSoundBank[] SoundBanks; - - private Dictionary _soundBanks; - public WwiseMetaSoundBank GetSoundBank(uint id) - { - if (_soundBanks == null) _soundBanks = SoundBanks.ToDictionary(sb => sb.Id); - return _soundBanks[id]; - } - - private Dictionary _soundBankNames; - public WwiseMetaSoundBank GetSoundBank(string name) - { - if (_soundBankNames == null) _soundBankNames = SoundBanks.ToDictionary(sb => sb.ShortName); - return _soundBankNames[name]; - } -} - -[JsonObject] -public class WwiseMetaSoundBank -{ - public uint Id; - public string ShortName; - public string ObjectPath; - public WwiseMetaObject[] IncludedEvents; - public WwiseMetaObject[] GameParameters; - - public WwiseMetaObject GetEvent(WeaponAudioEvent weaponAudioEvent) - { - return weaponAudioEvent switch - { - WeaponAudioEvent.Fire => IncludedEvents?.FirstOrDefault(e => e.Name.EndsWith("_fire")), - WeaponAudioEvent.Hit => IncludedEvents?.FirstOrDefault(e => e.Name.EndsWith("_hit")), - WeaponAudioEvent.Miss => IncludedEvents?.FirstOrDefault(e => e.Name.EndsWith("_miss")), - _ => throw new ArgumentOutOfRangeException(nameof(weaponAudioEvent), weaponAudioEvent, null) - }; - } - - public WwiseMetaObject GetEvent(ChargedWeaponAudioEvent chargedWeaponAudioEvent) - { - return chargedWeaponAudioEvent switch - { - ChargedWeaponAudioEvent.Start => IncludedEvents?.FirstOrDefault(e => e.Name.EndsWith("_charge_play")), - ChargedWeaponAudioEvent.Stop => IncludedEvents?.FirstOrDefault(e => e.Name.EndsWith("_charge_stop")), - ChargedWeaponAudioEvent.Fail => IncludedEvents?.FirstOrDefault(e => e.Name.EndsWith("_fail")), - _ => throw new ArgumentOutOfRangeException(nameof(chargedWeaponAudioEvent), chargedWeaponAudioEvent, null) - }; - } - - public WwiseMetaObject GetEvent(LoopingAudioEvent loopingAudioEvent) - { - return loopingAudioEvent switch - { - LoopingAudioEvent.Play => IncludedEvents?.FirstOrDefault(e => e.Name.EndsWith("_play")), - LoopingAudioEvent.Stop => IncludedEvents?.FirstOrDefault(e => e.Name.EndsWith("_stop")), - _ => throw new ArgumentOutOfRangeException(nameof(loopingAudioEvent), loopingAudioEvent, null) - }; - } - - public WwiseMetaObject GetParameter(SpecialAudioParameter audioParameter) - { - return audioParameter switch - { - SpecialAudioParameter.ShipVelocity => GameParameters?.FirstOrDefault(p => p.Name == "ship_velocity"), - SpecialAudioParameter.ChargeLevel => GameParameters?.FirstOrDefault(p => p.Name == "charge_level"), - SpecialAudioParameter.TargetLock => GameParameters?.FirstOrDefault(p => p.Name == "target_locking"), - SpecialAudioParameter.Intensity => GameParameters?.FirstOrDefault(p => p.Name == "sfx_shared_intensity"), - _ => throw new ArgumentOutOfRangeException(nameof(audioParameter), audioParameter, null) - }; - } -} - -[JsonObject] -public class WwiseMetaObject -{ - public uint Id; - public string Name; - public string ObjectPath; -} \ No newline at end of file diff --git a/Assets/Scripts/ServerShared/WwiseMetadata.cs.meta b/Assets/Scripts/ServerShared/WwiseMetadata.cs.meta deleted file mode 100644 index d9deda43b..000000000 --- a/Assets/Scripts/ServerShared/WwiseMetadata.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 0a12363ee8ef43b399bf91ca099947a9 -timeCreated: 1619664281 \ No newline at end of file diff --git a/Assets/Scripts/ServerShared/WwiseSoundBinding.cs b/Assets/Scripts/ServerShared/WwiseSoundBinding.cs deleted file mode 100644 index da7a97548..000000000 --- a/Assets/Scripts/ServerShared/WwiseSoundBinding.cs +++ /dev/null @@ -1,22 +0,0 @@ -using MessagePack; -using Newtonsoft.Json; - -[MessagePackObject, JsonObject(MemberSerialization.OptIn)] -public class WwiseSoundBinding -{ - [Key(0), JsonProperty("playEvent")] - public uint PlayEvent; -} - -[MessagePackObject, JsonObject(MemberSerialization.OptIn)] -public class WwiseLoopingSoundBinding : WwiseSoundBinding -{ - [Key(1), JsonProperty("stopEvent")] - public uint StopEvent; -} - -// public class WwiseParameterBinding -// { -// [Key(0), JsonProperty("parameter")] -// public uint Parameter; -// } \ No newline at end of file diff --git a/Assets/Scripts/ServerShared/WwiseSoundBinding.cs.meta b/Assets/Scripts/ServerShared/WwiseSoundBinding.cs.meta deleted file mode 100644 index b996ffa72..000000000 --- a/Assets/Scripts/ServerShared/WwiseSoundBinding.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 2e128c1cb68f481c9a846344e8283014 -timeCreated: 1619729875 \ No newline at end of file diff --git a/Assets/Scripts/ServerShared/Zone.cs b/Assets/Scripts/ServerShared/Zone.cs index edfd043bf..6ba9ef7d7 100644 --- a/Assets/Scripts/ServerShared/Zone.cs +++ b/Assets/Scripts/ServerShared/Zone.cs @@ -6,19 +6,51 @@ using System; using System.Collections; using System.Collections.Generic; using System.Linq; -using System.Threading; -using System.Threading.Tasks; using GameCult.Caching; using UniRx; using CultMath; using static CultMath.math; using float2 = CultMath.float2; -using Random = CultMath.Random; public class Zone { public Action Log; - public ReactiveCollection Entities = new ReactiveCollection(); + + // Membership, in admission order. Admit and Remove are the only writers; everyone else reads this view, which has + // no mutating member, so the death watch below follows membership by construction. + private readonly ReactiveCollection _entities = new ReactiveCollection(); + public MemberView Entities { get; } + + public sealed class MemberView : IReadOnlyReactiveCollection + { + private readonly ReactiveCollection _members; + internal MemberView(ReactiveCollection members) => _members = members; + public int Count => _members.Count; + public Entity this[int index] => _members[index]; + public int IndexOf(Entity entity) => _members.IndexOf(entity); + public bool Contains(Entity entity) => _members.Contains(entity); + public IEnumerator GetEnumerator() => _members.GetEnumerator(); + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); + public UniRx.IObservable> ObserveAdd() => _members.ObserveAdd(); + public UniRx.IObservable ObserveCountChanged(bool notifyCurrentCount = false) => _members.ObserveCountChanged(notifyCurrentCount); + public UniRx.IObservable> ObserveMove() => _members.ObserveMove(); + public UniRx.IObservable> ObserveRemove() => _members.ObserveRemove(); + public UniRx.IObservable> ObserveReplace() => _members.ObserveReplace(); + public UniRx.IObservable ObserveReset() => _members.ObserveReset(); + } + + // Laid mines, in lay order. Zone owns their existence: Lay is the one adder, the mine step the one remover, + // and every removal is a blast. Runtime state, never saved. + public ReactiveCollection Mines = new ReactiveCollection(); + + // Vented vapour clouds, in vent order. Zone owns their existence: Vent is the one adder, StepClouds the one + // remover, and Obscuration the one reader that detection uses. Runtime state, never saved. + public ReactiveCollection Clouds = new ReactiveCollection(); + + // Floating items (death drops, jettisoned cargo), in release order. Zone owns their existence: Release is the one + // adder; StepFloatingItems (expiry) and TryPickUp are the only removers. TryHold, Free and Remove-of-the-holder + // are the only writers of FloatingItem.Holder. Runtime state, never saved. + public ReactiveCollection FloatingItems = new ReactiveCollection(); public Dictionary Planets = new Dictionary(); public Dictionary PlanetInstances = new Dictionary(); @@ -26,37 +58,133 @@ public class Zone public Dictionary AsteroidBelts = new Dictionary(); public PlanetSettings Settings; + // Mining index (docs/aetheria-release-map.md, L3-L5): every targetable thing in the zone, fed by providers -- + // the entities, and one provider per belt. The reticle, cycling and any range query over rocks go through it; + // nothing else scans a belt. + public readonly TargetingIndex Targets = new TargetingIndex(); + private readonly List _suns = new List(); + private HashSet _updatedOrbits = new HashSet(); private ItemManager _itemManager; private double _time; - private Random _random; public List Agents = new List(); + // One flight per side, created on its first piloted join. A side is a faction, or one unaffiliated ship + // (brain-one-per-side-r2). A flight owns what its members target and do (Agents/Flight.cs). + private readonly Dictionary _flights = new Dictionary(); + public IEnumerable Flights => _flights.Values; - private List BeltUpdates = new List(); + // Cut 2 (docs/mining-cut.md): chunk wear, keyed by chunk. Zone.Wear is the only writer; ChunkExists and + // ChunkRadius are the only readers besides the pack/unpack round trip below. + private Dictionary _wear = new Dictionary(); + + // Cut 3 (docs/fire-control-cut.md, 0b table): Zone owns the pending-shot collection and the ShotId + // namespace; FireControl owns every transition a shot goes through. ShotCommitted publishes once a shot's + // outcome is decided (R4's commit horizon); ShotResolved republishes the same, unchanged outcome at + // arrival, right before the shot is removed. Presentations are the only readers of either. + public List PendingShots = new List(); + public Subject ShotCommitted = new Subject(); + public Subject ShotResolved = new Subject(); + // Contacts.Step publishes each hull-on-hull contact it resolves; presentations are the only readers. + public Subject Contacted = new Subject(); + private int _nextShotId; + public int NextShotId() => ++_nextShotId; + + // The committed shot a presentation was handed the id of by OnFire. It carries what the simulation decided + // -- the target it flies at (null for a round that carries none) and where it bursts -- so a presentation + // reads that rather than the shooter's current selection. + public bool TryGetShot(int shotId, out PendingShot shot) + { + foreach (var pending in PendingShots) + if (pending.ShotId == shotId) + { + shot = pending; + return true; + } + shot = default; + return false; + } + + private readonly List _departures = new List(); + internal IReadOnlyList Departures => _departures; public float Time { get => (float) _time; } + + // Zone time at full precision, for the index's orbital keys, which must agree with ChunkPose's own. + public double ExactTime => _time; public ZonePack Pack { get; } public GalaxyZone GalaxyZone { get; } public Galaxy Galaxy { get; } + // Cut 6b (docs/fire-control-cut.md, 6.1, Soul finding 6): one zone, one stable identity -- a galaxy seed + // reproduces it, and nothing else in the zone (an NPC joining, a shop opening, a wormhole exit) can + // perturb it. FireControl.Commit builds its own local generator from this and the shot's own id instead + // of touching a shared stream. + public uint CombatSeed { get; } + + // The zone's drop dice (loot and mine scatter): CombatSeed mixed with its run's seed (ruling loot-seed-in-save), so a + // new game drops differently and a reloaded save repeats. Mix(0) is 0, so a zone with no galaxy rolls on CombatSeed. + public uint DropSeed { get; } + + // The one source of floating item and mine ids: zone-scoped, from 1, never reused. Runtime state, not saved. + private uint _lastBodyId; + public FloatingBodyId NextBodyId() => new FloatingBodyId(++_lastBodyId); + + // The death ordinal of the loot dice: the nth death in this zone rolls on SimulationDice.For(DropSeed, LootStream, n). + private uint _deaths; + + // The zone-scoped agent ordinal, from 1, never reused: the key of a pilot's own dice. + private uint _lastAgentId; + public uint NextAgentId() => ++_lastAgentId; + + // One death subscription per member entity: Admit creates it together with the membership, Remove disposes it + // together with the membership, and nothing else touches either. + private readonly Dictionary _deathWatches = new Dictionary(); + public Zone(ItemManager itemManager, PlanetSettings settings, ZonePack pack, GalaxyZone galaxyZone, Galaxy galaxy) { + Entities = new MemberView(_entities); _time = pack.Time; GalaxyZone = galaxyZone; Galaxy = galaxy; Pack = pack; _itemManager = itemManager; Settings = settings; - _random = new Random(galaxyZone?.Name.StableHash() ?? 1337u); + _orbitPositionAt = OrbitPositionAt; + CombatSeed = galaxyZone?.Name.StableHash() ?? 1337u; + DropSeed = CombatSeed ^ SimulationDice.Mix(galaxy?.Seed ?? 0u); var cache = itemManager.ItemData; + // Cut 5, 5.6 (docs/fire-control-cut.md, Soul finding 7; operator ruling Q3): death removes the ship, + // in the simulation, not only in Unity's own loot-drop subscription. One subscription point covers + // every join, whichever caller admits the entity (deserialization below, a jump, a spawned turret) -- + // ObserveAdd fires for all of them. Forbidden writer: no presentation may remove an entity from Zone. + // The death watch lives exactly as long as the entity's membership in this zone: installed on admission, + // disposed on removal (death, dock, jump), so an entity admitted again never holds a second one. + // The one record of a removal for observers (ruling reveal-ends-on-perception): read by the next Sense pass. + _entities.ObserveRemove().Subscribe(remove => _departures.Add(new Departure(remove.Value, remove.Value.Position.xz, + remove.Value.Visibility))); + + // Leaving Entities, by death, docking or a transfer, is leaving the zone's pilots: the agent and its flight + // membership go with the ship, so nothing keeps flying a hull that is not here. + Entities.ObserveRemove().Subscribe(remove => + { + var agent = Agents.FirstOrDefault(a => a.Ship == remove.Value); + if (agent == null) return; + Agents.Remove(agent); + foreach (var flight in _flights.Values) flight.Leave(agent); + // A side of one is gone with its ship. + if (remove.Value.Faction == null) _flights.Remove(remove.Value); + }); + + Targets.Add(new EntityTargets()); + foreach (var orbit in pack.Orbits) { - Orbits.Add(orbit.Key, new Orbit(Settings, cache.Get(orbit))); + Orbits.Add(orbit.Key, new Orbit(cache.Get(orbit))); } foreach (var body in pack.Planets) @@ -66,10 +194,15 @@ public class Zone switch (planet) { case AsteroidBeltData belt: + // Mining Cut 3 (Q16 B): a belt from before field kinds existed gets its kind here, once, by + // the rule generation uses, and keeps it. + FieldKinds.Ensure(body.Key.Value, belt, cache, GalaxyZone?.Province?.Type ?? default); AsteroidBelts[body.Key] = new AsteroidBelt(belt); break; case SunData sun: - PlanetInstances.Add(body.Key, new Sun(settings, sun, Orbits[planet.Orbit.Key])); + var sunInstance = new Sun(settings, sun, Orbits[planet.Orbit.Key]); + PlanetInstances.Add(body.Key, sunInstance); + _suns.Add(sunInstance); break; case GasGiantData gas: PlanetInstances.Add(body.Key, new GasGiant(settings, gas, Orbits[planet.Orbit.Key])); @@ -80,74 +213,352 @@ public class Zone } } + // Orbits, bodies and belts exist: the field's terms are built once, and every rail's period is derived from them. + var wellMass = new Dictionary(); + foreach (var body in PlanetInstances) + if (body.Value.WellStrength > 0) + wellMass.TryAdd(Planets[body.Key].Orbit.Key, body.Value.BodyData.Mass); + var beltExtent = new Dictionary(); + foreach (var belt in AsteroidBelts) + { + var rail = Planets[belt.Key].Orbit.Key; + beltExtent[rail] = AsteroidBelt.Extent(belt.Value.Data, Orbits[rail].Data.Distance); + } + var wellNodes = new List(); + foreach (var orbit in Orbits) + { + var data = orbit.Value.Data; + wellNodes.Add(new WellNode(orbit.Key, data.Parent.Key, data.Distance, data.Phase, + wellMass.TryGetValue(orbit.Key, out var mass) ? mass : 0f, + beltExtent.TryGetValue(orbit.Key, out var reach) ? reach : data.Distance, + data.FixedPosition + OrbitData.Evaluate(frac(data.Phase)) * data.Distance)); // a root's stationary place: Offset at an infinite period + } + Wells = WellTree.Build(wellNodes, settings, pack.Radius); + foreach (var orbit in Orbits) + orbit.Value.Period = orbit.Value.Data.Parent.IsSet() + ? PeriodAround(orbit.Value.Data.Parent.Key, orbit.Value.Data.Distance, orbit.Key) + : float.PositiveInfinity; + foreach (var belt in AsteroidBelts) + { + var beltOrbit = Planets[belt.Key].Orbit.Key; + var beltParent = Orbits[beltOrbit].Data.Parent.Key; + for (var i = 0; i < belt.Value.Periods.Length; i++) + belt.Value.Periods[i] = belt.Value.Data.RidesRail + ? Orbits[beltOrbit].Period // a swarm's rocks ride their rail (trojans-ride-host-period-with-stations) + : PeriodAround(beltParent, belt.Value.Data.Asteroids[i].Distance, beltOrbit); + } + + PopulatedRadius = ComputePopulatedRadius(); + + // Aetheria gravity (target invariant zone-valid-before-tick): every orbit is placed at the pack's time + // when the zone is built, so each well, light and body pose read before the first Update is where the + // body is. Velocity stays zero until the first Update differences two placed positions. + foreach (var orbit in Orbits) + GetOrbitPosition(orbit.Key); + + // BeltTargets copies the belts' periods, so it is built after them. + foreach (var belt in AsteroidBelts) + Targets.Add(new BeltTargets(this, belt.Key, belt.Value.Data, settings, _time)); + + // Cut 2 (docs/mining-cut.md): read after belts are built so a later ChunkExists/ChunkRadius call has + // Planets/AsteroidBelts populated. A pack from before key 6 existed has ChunkWear == null (nullable + // persistence rule); that reads as no wear rather than throwing. + if (pack.ChunkWear != null) + foreach (var wear in pack.ChunkWear) + _wear[new ChunkId(wear.Field, wear.Index)] = new ChunkWear { Damage = wear.Damage, BrokenUntil = wear.BrokenUntil }; + + var ordinal = 0u; foreach (var entityPack in pack.Entities) { + ordinal++; var entity = EntitySerializer.Unpack(_itemManager, this, entityPack); - Entities.Add(entity); - entity.Activate(); - if (entity is Ship {IsPlayerShip: false} ship) - { - Agents.Add(CreateAgent(ship)); - if (lengthsq(ship.Position) < 1) - ship.Position = _itemManager.Random.NextFloat3(float3(-pack.Radius * .5f), float3(pack.Radius * .5f)); - } + var ship = entity as Ship; + Admit(entity, piloted: ship is {IsPlayerShip: false}); + // Generation placement, not admission: a ship packed at the origin is scattered across the zone, on the + // zone's own dice, so nothing drawn from the item stream can move it. + if (ship is {IsPlayerShip: false} && lengthsq(ship.Position) < 1) + ship.Position = SimulationDice.For(CombatSeed, SimulationDice.ScatterStream, ordinal) + .NextFloat3(float3(-pack.Radius * .5f), float3(pack.Radius * .5f)); } // TODO: Associate planets with stored entities for planetary colonies } - private Agent CreateAgent(Ship ship) + // The one admission into this zone (docs/scenarios-cut.md, 2.2): the only writer of membership and the only + // creator of agents. Construction, new-run staging (RunStart), warp arrival, undock and the console's spawned + // turret all join through here. A piloted entity gets the zone's Minion; an unpiloted one gets no agent at all. + // Only a ship can be piloted. The death watch is installed here, for every join, whichever caller admits it. + // An entity that is already a member is refused: it would hold a second watch and a second agent. + // A piloted entity starts on the zone's drawn patrol circuit unless the caller states its task (a scenario's approach). + public void Admit(Entity entity, bool piloted, AgentTask task = null) { - var agent = new Minion(ship); - var task = new PatrolOrbitsTask(); - task.Circuit = Orbits.OrderBy(_ => _itemManager.Random.NextFloat()).Take(4).Select(x => x.Key).ToArray(); - agent.Task = task; + if (_entities.Contains(entity)) throw new InvalidOperationException("entity: already a member of this zone"); + _entities.Add(entity); + _deathWatches.Add(entity, entity.Death.Subscribe(_ => { DropLoot(entity); Remove(entity); entity.Deactivate(); })); + entity.Activate(); + if (piloted) Agents.Add(CreateAgent((Ship) entity, task)); + } + + // The one removal from this zone (death, dock, jump): membership and its death watch leave together, and so does the + // entity's give, which ends GiverGone unless a dock already ended it. False, and nothing changes, when the entity is + // not a member. The caller deactivates; Remove does not. + public bool Remove(Entity entity) + { + if (!_entities.Remove(entity)) return false; + CargoTransfer.End(entity, GiveEnd.GiverGone); + _deathWatches.Remove(entity, out var watch); + watch.Dispose(); + foreach (var floating in FloatingItems) + if (ReferenceEquals(floating.Holder, entity)) Free(floating.Id); + return true; + } + + private static object SideOf(Ship ship) => (object) ship.Faction ?? ship; + + private Agent CreateAgent(Ship ship, AgentTask stated) + { + var key = SideOf(ship); + if (!_flights.TryGetValue(key, out var flight)) + _flights[key] = flight = new Flight(ship.Faction?.Doctrine, _itemManager.GameplaySettings); + var id = NextAgentId(); + var agent = new Minion(ship, flight.Combatant) { Id = id }; + flight.Join(agent, stated ?? PatrolCircuit(id)); return agent; } + private PatrolOrbitsTask PatrolCircuit(uint id) + { + var dice = SimulationDice.For(CombatSeed, SimulationDice.PatrolStream, id); + return new PatrolOrbitsTask { Circuit = Orbits.OrderBy(_ => dice.NextFloat()).Take(4).Select(x => x.Key).ToArray() }; + } + public ZonePack PackZone() { return new ZonePack { Radius = Pack.Radius, Mass = Pack.Mass, - Entities = Entities.Select(EntitySerializer.Pack).ToList(), + Entities = _entities.Select(EntitySerializer.Pack).ToList(), Orbits = Orbits.Keys.Select(key => new CultRecordRef(key)).ToList(), Planets = Planets.Keys.Select(key => new CultRecordRef(key)).ToList(), - Time = _time + Time = _time, + BossSpawned = Pack.BossSpawned, + // Cut 2 (docs/mining-cut.md): drop entries that carry no live information -- healed (no damage) and + // not currently broken -- so a save never accumulates wear rows for chunks nobody has touched since + // they last respawned. + ChunkWear = _wear + .Where(kv => !IsExpired(kv.Value)) + .Select(kv => new ChunkWearPack { Field = kv.Key.Field, Index = kv.Key.Index, Damage = kv.Value.Damage, BrokenUntil = kv.Value.BrokenUntil }) + .ToList() }; } - public void AddOrbit(OrbitData orbit) - { - Orbits.Add(_itemManager.ItemData.RefOf(orbit).Key, new Orbit(Settings, orbit)); - } + private bool IsExpired(ChunkWear wear) => wear.Damage <= 0f && (!wear.BrokenUntil.HasValue || wear.BrokenUntil.Value <= _time); public void Update(float deltaTime) { _time += deltaTime; _updatedOrbits.Clear(); - foreach (var t in BeltUpdates) - t.Wait(); - BeltUpdates.Clear(); + // Every previous position is taken before any orbit is placed: GetOrbitPosition places a parent as a + // side effect of placing its child, so differencing inside one loop would depend on dictionary order. + foreach (var orbit in Orbits) + orbit.Value.PreviousPosition = orbit.Value.Position; foreach (var orbit in Orbits) { - orbit.Value.PreviousPosition = orbit.Value.Position; orbit.Value.Position = GetOrbitPosition(orbit.Key); orbit.Value.Velocity = (orbit.Value.Position - orbit.Value.PreviousPosition) / deltaTime; } - foreach (var belt in AsteroidBelts) + foreach (var flight in _flights.Values) flight.Update(deltaTime); + // Every pilot's command is applied by PilotApplier, once per step. Entities with no agent (the player, a scripted + // pilot, a lone ship) first, as the player's input lands before the step; then each agent applies right after it + // decides, so the next agent sees it as it saw the direct writes this replaced. + var agents = Agents.ToArray(); + var piloted = new HashSet(); + foreach (var agent in agents) piloted.Add(agent.Ship); + foreach (var entity in Entities.ToArray()) + if (!piloted.Contains(entity)) PilotApplier.Apply(entity); + foreach (var agent in agents) { - Array.Copy(belt.Value.NewTransforms, belt.Value.Transforms, belt.Value.Transforms.Length); - belt.Value.OrbitPosition = belt.Value.NewOrbitPosition; - BeltUpdates.Add(Task.Run(() => UpdateAsteroidTransforms(belt.Key))); + agent.Update(deltaTime); + PilotApplier.Apply(agent.Ship); } - foreach(var agent in Agents) - agent.Update(deltaTime); + var entities = Entities.ToArray(); + foreach (var entity in entities) entity.PublishInbox(); + foreach (var entity in entities) entity.Update(deltaTime); + foreach (var entity in entities) entity.Sense(); + _departures.Clear(); - foreach (var entity in Entities.ToArray()) entity.Update(deltaTime); + CargoTransfer.Step(this, deltaTime); + StepMines(deltaTime); + StepClouds(deltaTime); + StepFloatingItems(deltaTime); + + // Hull contact (cut sim-contact): after every entity has moved and the mines and clouds have taken + // their toll, so only hulls still in the zone touch, and before shots resolve against the result. + Contacts.Step(this); + + // Cut 3: after every entity has had its chance to fire this tick, age and resolve the shots that + // firing queued. A shot fired this tick with a flight time shorter than CommitHorizon commits and + // resolves in this same call. + FireControl.Step(this, deltaTime); + } + + public void Lay(Mine mine) + { + mine.LaidAt = _time; + Mines.Add(mine); + } + + public void Vent(VapourCloud cloud) + { + cloud.Id = NextBodyId(); + cloud.VentedAt = _time; + Clouds.Add(cloud); + } + + // The one adder of floating items: death drops and jettison both come here. The item drifts as a KinematicBody + // launched at `velocity` and expires after FloatingItemLifetime. + public FloatingItem Release(ItemInstance item, float2 position, float2 velocity) + { + var floating = new FloatingItem + { + Id = NextBodyId(), Item = item, Body = new KinematicBody { Position = position, Velocity = velocity }, + ReleasedAt = _time, Lifetime = _itemManager.GameplaySettings.FloatingItemLifetime + }; + FloatingItems.Add(floating); + return floating; + } + + // The one commit of a pickup: the first of the taker's cargo bays that accepts the item stores it and the item + // stops floating. Otherwise nothing changes. + // An item held by another entity is refused: one holder per item holds at the commit as well. + public bool TryPickUp(Entity taker, FloatingBodyId id) + { + var floating = FloatingItems.FirstOrDefault(f => f.Id.Equals(id)); + if (floating == null || (floating.Holder != null && !ReferenceEquals(floating.Holder, taker))) return false; + if (!taker.CargoBays.Any(bay => bay.TryStore(floating.Item))) return false; + FloatingItems.Remove(floating); + return true; + } + + // The tractor beam's claim on a floating item: false if it is absent or already held. The item stays where it is + // until its pull begins; StepFloatingItems places it from then on. + public bool TryHold(Entity holder, FloatingBodyId id) + { + var floating = FloatingItems.FirstOrDefault(f => f.Id.Equals(id)); + if (floating == null || floating.Holder != null) return false; + floating.Holder = holder; + floating.HeldFrom = floating.Body.Position; + floating.HeldProgress = 0; + return true; + } + + // How far along its pull to the holder a held item is, 0..1. + public void SetHeldProgress(FloatingBodyId id, float progress) + { + var floating = FloatingItems.FirstOrDefault(f => f.Id.Equals(id)); + if (floating?.Holder != null) floating.HeldProgress = saturate(progress); + } + + // Lets a held item go: it floats on from where it is with the Velocity and Drift it had. + public void Free(FloatingBodyId id) + { + var floating = FloatingItems.FirstOrDefault(f => f.Id.Equals(id)); + if (floating == null) return; + floating.Holder = null; + floating.HeldProgress = 0; + } + + // Called from the death subscription, before the entity leaves the zone: one generator per death. Each equipped + // item but the hull drops on a LootDropProbability draw; every cargo stack drops whole. Each drop leaves from the + // dead entity's position at a random heading. Draw order: Equipment order (the probability draw, then the heading + // of a dropped item), then each cargo bay's stacks in CargoBays order (a heading each). + private void DropLoot(Entity dead) + { + var settings = _itemManager.GameplaySettings; + var random = SimulationDice.For(DropSeed, SimulationDice.LootStream, ++_deaths); + var at = new float2(dead.Position.x, dead.Position.z); + float2 Heading() { var angle = random.NextFloat() * 2f * PI; return float2(cos(angle), sin(angle)); } + foreach (var equipped in dead.Equipment.ToArray()) + { + if (equipped == dead.EquippedHull || !(random.NextFloat() < settings.LootDropProbability)) continue; + Release(equipped.EquippableItem, at, Heading() * settings.LootDropVelocity); + } + foreach (var bay in dead.CargoBays.ToArray()) + foreach (var stack in bay.Cargo.Keys.ToArray()) + Release(stack, at, Heading() * settings.LootDropVelocity); + } + + // After StepClouds and before FireControl.Step: each floating item drifts as a KinematicBody on the zone's force + // and is removed once its lifetime has run out. A held item is neither integrated nor expired: it is placed + // between where it was claimed and its holder, now that the entities have moved. + // The curve a held item rides from where it was claimed to its holder: the one owner, which the test scene's + // stand-in sim and tendril call rather than spell again. + public static float HeldPull(float progress) => smoothstep(0f, 1f, progress); + + private void StepFloatingItems(float deltaTime) + { + var settings = _itemManager.GameplaySettings; + foreach (var floating in FloatingItems.ToArray()) + { + if (floating.Holder != null) + { + floating.Body.Position = lerp(floating.HeldFrom, floating.Holder.Position.xz, HeldPull(floating.HeldProgress)); + continue; + } + floating.Body.Step(deltaTime, GetForce(floating.Body.Position), settings); + if (floating.ReleasedAt + floating.Lifetime <= _time) FloatingItems.Remove(floating); + } + } + + // The fraction of a sight line's signal that survives the clouds between `a` and `b`: the product of + // (1 - opacity now) over every cloud whose disc the segment touches, so 1f when none does. Derived from the + // live clouds at each call and stored nowhere; Sensor.Gain is where it enters detection. + public float Obscuration(float2 a, float2 b) + { + var through = 1f; + for (var i = 0; i < Clouds.Count; i++) + { + var cloud = Clouds[i]; + if (cloud.Touches(a, b)) through *= 1f - cloud.OpacityAt(_time); + } + return through; + } + + // After StepMines: each cloud drifts as a KinematicBody on the zone's force, as a mine does, and is removed + // once its lifetime has run out. Nothing else removes a cloud. + private void StepClouds(float deltaTime) + { + var settings = _itemManager.GameplaySettings; + foreach (var cloud in Clouds.ToArray()) + { + cloud.Body.Step(deltaTime, GetForce(cloud.Body.Position), settings); + if (cloud.VentedAt + cloud.Lifetime <= _time) Clouds.Remove(cloud); + } + } + + // After the entity loop and before FireControl.Step, in lay order: each mine drifts as a KinematicBody, is + // triggered by the first eligible hull its armed disc touches, and detonates through FireControl.Detonate at + // its trigger plus fuse delay or at its lifetime, whatever its layer does (ruling mine-owner-leash). The + // blast reads no faction; only the trigger does. + private void StepMines(float deltaTime) + { + var settings = _itemManager.GameplaySettings; + foreach (var mine in Mines.ToArray()) + { + mine.Body.Step(deltaTime, GetForce(mine.Body.Position), settings); + + if (mine.TriggeredAt == null && mine.Armed(_time) && + Entities.Any(entity => mine.Triggers(entity) && FireControl.Touches(entity, mine.Body.Position, mine.BlastRadius))) + mine.TriggeredAt = _time; + + var fused = mine.TriggeredAt + mine.FuseDelay <= _time; + if (!fused && mine.LaidAt + mine.Lifetime > _time) continue; + Mines.Remove(mine); + FireControl.Detonate(this, mine.Body.Position, mine.BlastRadius, mine.Damage, mine.DamageType); + } } // Determine orbital position recursively, caching parent positions to avoid repeated calculations @@ -164,30 +575,72 @@ public class Zone if (!_updatedOrbits.Contains(orbitID)) { - var orbit = Orbits[orbitID]; - float2 pos = float2.zero; - if (orbit.Period > .01f) - { - var phase = (float) frac(_time / orbit.Period); - pos = OrbitData.Evaluate(frac(phase + orbit.Data.Phase)) * orbit.Data.Distance; - - if (float.IsNaN(pos.x)) - { - //_context.Log("Orbit position is NaN, something went very wrong!"); - pos = float2.zero; - } - } - - var parentPosition = !Orbits[orbitID].Data.Parent.IsSet() - ? Orbits[orbitID].Data.FixedPosition : - GetOrbitPosition(orbit.Data.Parent.Key); - Orbits[orbitID].Position = parentPosition + pos; + Orbits[orbitID].Position = RailAt(orbitID, _time); _updatedOrbits.Add(orbitID); } return Orbits[orbitID].Position; } + // The rail law, once: where an orbit sits from its parent's node at a time. An infinite period (a parentless orbit, + // or one with no field to circle in) leaves the orbit at its phase: frac(t / inf) is 0. + private static float2 Offset(Orbit orbit, double time) + { + var pos = float2.zero; + if (orbit.Period > .01f) + { + var phase = (float) frac(time / orbit.Period); + pos = OrbitData.Evaluate(frac(phase + orbit.Data.Phase)) * orbit.Data.Distance; + + if (float.IsNaN(pos.x)) + pos = float2.zero; + } + + return pos; + } + + // The same rail law at any time, with no memo read or written: a parent is its own rail at that time. + private float2 RailAt(CultRecordKey orbitID, double time) + { + if (!orbitID.IsSet()) + return float2.zero; + if (!Orbits.TryGetValue(orbitID, out var orbit)) + { + Log?.Invoke("Requested orbit is not part of this zone!"); + return float2.zero; + } + var parentPosition = !orbit.Data.Parent.IsSet() ? orbit.Data.FixedPosition : RailAt(orbit.Data.Parent.Key, time); + return parentPosition + Offset(orbit, time); + } + + // Where an orbit is at a time: pure, writes nothing. At the step's own time it is the step's memo (GetOrbitPosition); + // at any other time (a presenter's drawn time) it is the rail law evaluated there. + public float2 OrbitPositionAt(CultRecordKey orbitID, double time) + { + if (!orbitID.IsSet()) + return float2.zero; + if (!Orbits.ContainsKey(orbitID)) + { + Log?.Invoke("Requested orbit is not part of this zone!"); + return float2.zero; + } + + return time == _time ? GetOrbitPosition(orbitID) : RailAt(orbitID, time); + } + + /// The zone's gravity: the terms of its orbit tree (WellTree owns which exist and the walk that sums them). + public WellTree Wells { get; } + + private readonly Func _orbitPositionAt; + + // The one owner of a rail's period (Orbit.Period, AsteroidBelt.Periods): 2 pi sqrt(d / a), a being the pull the field + // gives at distance d from the node being orbited (WellTree.PullAround). No pull gives an infinite period. + private float PeriodAround(CultRecordKey parentOrbit, float distance, CultRecordKey self) + { + var a = Wells.PullAround(parentOrbit, distance, self); + return a > 0 && distance > 0 ? 2 * PI * sqrt(distance / a) : float.PositiveInfinity; + } + public float2 GetOrbitVelocity(CultRecordKey orbit) { if (Orbits.ContainsKey(orbit)) @@ -195,115 +648,92 @@ public class Zone return float2.zero; } - public int NearestAsteroid(CultRecordKey planetDataID, float2 position) + // Cut 2 (docs/mining-cut.md): the index is in range for its field and the chunk is not broken at zone time. + // Respawn is a comparison against zone time, never a per-tick loop or a write on read. + public bool ChunkExists(ChunkId chunk) { - var beltData = Planets[planetDataID] as AsteroidBeltData; - - var asteroidPositions = AsteroidBelts[planetDataID].Transforms; - - int nearest = 0; - float nearestDistance = Single.MaxValue; - for (int i = 0; i < beltData.Asteroids.Length; i++) - { - var dist = lengthsq(asteroidPositions[i].xz - position); - if (AsteroidExists(planetDataID, i) && dist < nearestDistance) - { - nearest = i; - nearestDistance = dist; - } - } - - return nearest; + if (!(Planets.TryGetValue(chunk.Field, out var body) && body is AsteroidBeltData beltData)) + return false; + if (chunk.Index < 0 || chunk.Index >= beltData.Asteroids.Length) + return false; + return !(_wear.TryGetValue(chunk, out var wear) && wear.BrokenUntil.HasValue && wear.BrokenUntil.Value > _time); } - public bool AsteroidExists(CultRecordKey planetDataID, int asteroid) => ((AsteroidBeltData) Planets[planetDataID]).Asteroids.Length > asteroid && asteroid >= 0; - - private void UpdateAsteroidTransforms(CultRecordKey planetDataID) + // Cut 2: the size rule of AsteroidBelt.Size (Cut 1), now reading wear from its one owner (Zone) instead of + // per-belt dictionaries. A broken chunk (BrokenUntil in the future) has no size; an unbroken, undamaged + // chunk reads its authored size; a damaged one shrinks toward it. + public float ChunkRadius(ChunkId chunk) { - var beltData = Planets[planetDataID] as AsteroidBeltData; + var belt = AsteroidBelts[chunk.Field]; + if (!_wear.TryGetValue(chunk, out var wear)) + return belt.UndamagedSize(chunk.Index, Settings); + if (wear.BrokenUntil.HasValue && wear.BrokenUntil.Value > _time) + return 0f; + if (wear.Damage <= 0f) + return belt.UndamagedSize(chunk.Index, Settings); + return belt.DamagedSize(chunk.Index, wear.Damage, Settings); + } - var belt = AsteroidBelts[planetDataID]; + // Cut 2: the only writer of chunk wear. Returns whether this hit broke the chunk. The break threshold is + // strictly greater-than, matching the deleted per-tick miner's own comparison against accumulated damage: + // damage exactly equal to hitpoints does not yet break the chunk, only damage that exceeds them does. + // A chunk that is currently broken (zone time < BrokenUntil) absorbs nothing: this hit did not break it + // (it was already broken), and its wear stays zeroed until it respawns and starts fresh. + public bool Wear(ChunkId chunk, float damage) + { + _wear.TryGetValue(chunk, out var wear); + if (wear.BrokenUntil.HasValue && wear.BrokenUntil.Value > _time) + return false; - var orbitData = Orbits[beltData.Orbit.Key].Data; - belt.NewOrbitPosition = GetOrbitPosition(orbitData.Parent.Key); + var beltData = (AsteroidBeltData) Planets[chunk.Field]; + var size = beltData.Asteroids[chunk.Index].Size; + var hitpoints = Settings.AsteroidHitpoints.Evaluate(size); + + var newDamage = wear.Damage + damage; + + if (newDamage > hitpoints) + { + var respawnTime = Settings.AsteroidRespawnTime.Evaluate(size); + _wear[chunk] = new ChunkWear { Damage = 0f, BrokenUntil = _time + respawnTime }; + return true; + } + + _wear[chunk] = new ChunkWear { Damage = newDamage, BrokenUntil = null }; + return false; + } + + // Cut 1 (docs/mining-cut.md): a chunk's pose is a pure function of zone time, computed when asked. No stored + // pose survives a tick; the sim and the renderer both read it fresh through here. + public float4 ChunkPose(CultRecordKey belt, int index) => ChunkPose(belt, index, _time); + + // The same pose at any time: the sim reads it at _time, a presenter at the drawn time (DrawAhead.Time). + public float4 ChunkPose(CultRecordKey belt, int index, double time) + { + var beltData = Planets[belt] as AsteroidBeltData; + var parentPosition = OrbitPositionAt(Orbits[beltData.Orbit.Key].Data.Parent.Key, time); + var size = ChunkRadius(new ChunkId(belt, index)); + return AsteroidBelts[belt].Pose(index, time, parentPosition, size); + } + + // Mining Cut 3 (docs/mining-cut-refresh.md): how bright a chunk is -- Reflector's rule (cross-section × the light + // on it), with the field kind's reflectivity per schematic cell times the chunk's area in cells. Computed when + // asked; nothing about it is stored. A worn chunk shrinks and dims; a broken one, or one of a kindless belt, is dark. + public float ChunkVisibility(ChunkId chunk) + { + if (!ChunkExists(chunk)) return 0f; + var kind = _itemManager.ItemData.Get(((AsteroidBeltData) Planets[chunk.Field]).Kind); + if (kind == null) return 0f; + var cells = ChunkRadius(chunk) / _itemManager.GameplaySettings.SchematicCellSize; + return kind.CrossSection * PI * cells * cells * GetLight(ChunkPose(chunk.Field, chunk.Index).xy); + } + + public void EvaluateBelt(CultRecordKey belt, Span into, double time) + { + var beltData = Planets[belt] as AsteroidBeltData; + var parentPosition = OrbitPositionAt(Orbits[beltData.Orbit.Key].Data.Parent.Key, time); + var beltInstance = AsteroidBelts[belt]; for (var i = 0; i < beltData.Asteroids.Length; i++) - { - float size; - if(belt.RespawnTimers.ContainsKey(i)) size = 0; - else if (belt.Damage.ContainsKey(i)) - { - var asteroidHitpoints = Settings.AsteroidHitpoints.Evaluate(beltData.Asteroids[i].Size); - var damage = (asteroidHitpoints - belt.Damage[i]) / asteroidHitpoints; - size = Settings.AsteroidSize.Evaluate(damage * beltData.Asteroids[i].Size); - } - else size = Settings.AsteroidSize.Evaluate(beltData.Asteroids[i].Size); - - var rot = (float) (_time * beltData.Asteroids[i].RotationSpeed % (PI * 2)); - var pos = OrbitData.Evaluate((float) frac(_time / Settings.OrbitPeriod.Evaluate(beltData.Asteroids[i].Distance) + - beltData.Asteroids[i].Phase)) * beltData.Asteroids[i].Distance + belt.NewOrbitPosition; - //belt.NewPositions[i] = float3(pos.x, GetHeight(pos) + Settings.AsteroidVerticalOffset, pos.y); - belt.NewTransforms[i] = float4(pos.x, pos.y, rot, size); - } - } - - public OrbitData CreateOrbit(CultRecordKey parent, float2 position) - { - var parentPosition = GetOrbitPosition(parent); - var delta = position - parentPosition; - var distance = length(delta); - var period = Settings.OrbitPeriod.Evaluate(distance); - var phase = atan2(delta.y, delta.x) / (PI * 2); - var currentPhase = frac(_time / period); - var storedPhase = (float) frac(phase - currentPhase); - - var orbit = new OrbitData - { - Distance = distance, - Parent = new CultRecordRef(parent), - Phase = storedPhase - }; - Orbits.Add(_itemManager.ItemData.Upsert(orbit).Key, new Orbit(Settings, orbit)); - return orbit; - } - - public void MineAsteroid(Entity miner, CultRecordKey asteroidBelt, int asteroid, float damage, float efficiency, float penetration) - { - var beltData = Planets[asteroidBelt] as AsteroidBeltData; - var belt = AsteroidBelts[asteroidBelt]; - //var asteroidTransform = belt.Transforms[asteroid]; - - var size = beltData.Asteroids[asteroid].Size; - var asteroidHitpoints = Settings.AsteroidHitpoints.Evaluate(size); - - if (!belt.Damage.ContainsKey(asteroid)) - belt.Damage[asteroid] = 0; - belt.Damage[asteroid] = belt.Damage[asteroid] + damage; - - if (!belt.MiningAccumulator.ContainsKey((miner, asteroid))) - belt.MiningAccumulator[(miner, asteroid)] = 0; - belt.MiningAccumulator[(miner, asteroid)] = belt.MiningAccumulator[(miner, asteroid)] + damage; - - if (belt.Damage[asteroid] > asteroidHitpoints) - { - belt.RespawnTimers[asteroid] = Settings.AsteroidRespawnTime.Evaluate(size); - belt.Damage.Remove(asteroid); - belt.MiningAccumulator.Remove((miner, asteroid)); - return; - } - - var resourceCount = beltData.Resources.Sum(x => x.Value); - var resource = beltData.Resources.MaxBy(x => pow(x.Value, 1f / penetration) * _random.NextFloat()); - if (efficiency * _random.NextFloat() * belt.MiningAccumulator[(miner, asteroid)] * resourceCount / Settings.MiningDifficulty > 1) - { - belt.MiningAccumulator.Remove((miner, asteroid)); - // var newSimpleCommodity = new SimpleCommodity - // { - // Data = resource.Key, - // Quantity = 1 - // }; - // TODO: Drop item onto the Grid - //miner.AddCargo(newSimpleCommodity); - } + into[i] = beltInstance.Pose(i, time, parentPosition, ChunkRadius(new ChunkId(belt, i))); } public SecurityLevel GetSecurityLevel(float2 pos) @@ -323,62 +753,73 @@ public class Zone return security; } - public float GetHeight(float2 position) + // The extent of the populated area, from the zone's origin: owned here; presenters read it, nothing authors it. A static + // bound on where anything can be, so it holds at every time and reads nothing the pack's Radius decides: for each body, + // its orbit chain's reach plus its Roche limit; for each belt, the chain's reach to the orbit its asteroids circle (the + // belt orbit's parent) plus the belt's own Radius, its largest asteroid Distance. + public float PopulatedRadius { get; } + + private float ComputePopulatedRadius() { - var result = -PowerPulse(length(position)/(Pack.Radius*2), Settings.ZoneDepthExponent) * Settings.ZoneDepth; + var radius = 0f; foreach (var body in PlanetInstances.Values) - { - var p = position - body.Orbit.Position; //GetOrbitPosition(body.BodyData.Orbit) - var distSqr = lengthsq(p); - var gravityRadius = body.GravityWellRadius; - if (distSqr < gravityRadius*gravityRadius) - { - var depth = body.GravityWellDepth; - result -= PowerPulse(sqrt(distSqr) / gravityRadius, body.BodyData.GravityDepthExponent) * depth; - } - - if (body is GasGiant gas) - { - var waveRadius = gas.GravityWavesRadius; - if(distSqr < waveRadius*waveRadius) - { - var depth = gas.GravityWavesDepth; - var frequency = Settings.WaveFrequency.Evaluate(body.BodyData.Mass); - var speed = gas.GravityWavesSpeed; - result -= RadialWaves(sqrt(distSqr) / waveRadius, 8, 1.25f, frequency, (float) (_time * speed)) * depth; - } - } - } - - return result; + radius = max(radius, ChainReach(body.BodyData.Orbit.Key) + body.RocheLimit); + foreach (var belt in AsteroidBelts) + radius = max(radius, ChainReach(Orbits[Planets[belt.Key].Orbit.Key].Data.Parent.Key) + belt.Value.Radius); + return radius; } + // The most an orbit can lie from the origin: the root's offset plus every orbit Distance down the chain to it. + private float ChainReach(CultRecordKey key) + { + var reach = 0f; + while (key.IsSet() && Orbits.TryGetValue(key, out var orbit)) + { + if (orbit.Data.Parent.IsSet()) reach += orbit.Data.Distance; + else reach += length(orbit.Data.FixedPosition); + key = orbit.Data.Parent.Key; + } + return reach; + } + + public float GetHeight(float2 position) => GetHeight(position, _time); + + // The field at a time: each term sits where its node's rail puts it then. The sim reads it at _time, a presenter at + // the drawn time, so a ship rides the same slope the drawn planet's well makes. + public float GetHeight(float2 position, double time) => Wells.Potential(position, _orbitPositionAt, time) / Settings.HeightExaggeration; + public float GetLight(float2 position) { var light = 0f; - foreach (var body in PlanetInstances.Values) - { - if (body is Sun sun) - { - var p = position - body.Orbit.Position; - var distSqr = lengthsq(p); - var lightRadius = sun.LightRadius; - if (distSqr < lightRadius * lightRadius) - { - light += PowerPulse(sqrt(distSqr) / lightRadius, 8); - } - } - } - + foreach (var sun in _suns) + light += SunLight(sun, length(position - sun.Orbit.Position)); return light; } - public float2 GetForce(float2 position) - { - var normal = GetNormal(position); - var f = new float2(normal.x, normal.z); - return f * Settings.GravityStrength * lengthsq(f); - } + // One sun's light at `distance` from it. It never grows with distance, so the light at the nearest point of a + // region bounds the light anywhere in it (BeltTargets' visibility bound). + public static float SunLight(Sun sun, float distance) => + distance < sun.LightRadius ? PowerPulse(distance / sun.LightRadius, 8) : 0f; + + internal IReadOnlyList Suns() => _suns; + internal float SchematicCellSize => _itemManager.GameplaySettings.SchematicCellSize; + internal float FieldCrossSection(AsteroidBeltData belt) => _itemManager.ItemData.Get(belt.Kind)?.CrossSection ?? 0f; + + // The one source of gravitational acceleration (u/s^2): the walk of the zone's terms (WellTree). Ships, floating items, + // clouds and mines all read it, and so does Flow. It is the gradient of the potential GetHeight draws, so the two + // cannot disagree. + public float2 GetForce(float2 position) => Wells.Force(position, _orbitPositionAt, _time); + + // The global flow velocity at `position` in zone time, in u/s (FlowField is the law). The slope term reads the + // downhill direction, which is the force. + public float3 Flow(float3 position) => + FlowField.At(Settings.Flow, position, FlowScroll, GetForce(position.xz)); + + // The flow's noise scroll at zone time (Zone.Flow evaluates at exactly this); lowered to the shaders' _FlowScroll. + public float2 FlowScroll => FlowField.Scroll(Settings.Flow, _time); + + // The phase of a cycle of `period` seconds at zone time, for presenters that animate on the flow. + public float CyclePhase(float period) => FlowField.Cycle(_time, period); public static float PowerPulse(float x, float exponent) { @@ -387,22 +828,12 @@ public class Zone return pow((x + 1) * (1 - x), exponent); } - public static float RadialWaves(float x, float maskExponent, float sineExponent, float frequency, float phase) + // The surface normal of the drawn height (potential / K), derived from the force. Display only (ship tilt): the + // sim never reads it as a force. + public float3 GetNormal(float2 pos) { - //x *= 2; - return PowerPulse(x, maskExponent) * cos(pow(x*2, sineExponent) * frequency + phase); - } - - public float3 GetNormal(float2 pos, float step = .1f, float mul = 1) - { - float hL = GetHeight(new float2(pos.x - step, pos.y)) * mul; - float hR = GetHeight(new float2(pos.x + step, pos.y)) * mul; - float hD = GetHeight(new float2(pos.x, pos.y - step)) * mul; - float hU = GetHeight(new float2(pos.x, pos.y + step)) * mul; - - // Deduce terrain normal - float3 normal = new float3((hL - hR), (hD - hU), step*2); - return normalize(normal).xzy; + var slope = GetForce(pos) / Settings.HeightExaggeration; + return normalize(new float3(slope.x, 1f, slope.y)); } } @@ -411,10 +842,13 @@ public class Planet public Orbit Orbit; protected readonly PlanetSettings Settings; public BodyData BodyData; - public float GravityWellDepth; - public float GravityWellRadius; public float BodyRadius; + // The well (GravityField): strength c by mass, and the Roche limit, which is both the closest a child may orbit and + // the well's softened core radius R (one curve of mass, never per body). Both are authored PlanetSettings curves. + public float WellStrength; + public float RocheLimit; + public Planet(PlanetSettings settings, BodyData data, Orbit orbit) { Settings = settings; @@ -426,30 +860,17 @@ public class Planet public void CalculateProperties() { BodyRadius = Settings.BodyRadius.Evaluate(BodyData.Mass) * BodyData.BodyRadiusMultiplier; - GravityWellRadius = Settings.GravityRadius.Evaluate(BodyData.Mass) * BodyData.GravityRadiusMultiplier; - GravityWellDepth = Settings.GravityDepth.Evaluate(BodyData.Mass) * BodyData.GravityDepthMultiplier; + (WellStrength, RocheLimit) = WellTree.Curves(Settings, BodyData.Mass); } } public class GasGiant : Planet { public GasGiantData GasGiantData; - public float GravityWavesDepth; - public float GravityWavesRadius; - public float GravityWavesSpeed; public GasGiant(PlanetSettings settings, GasGiantData data, Orbit orbit) : base(settings, data, orbit) { GasGiantData = data; - CalculateProperties(); - } - - public new void CalculateProperties() - { - base.CalculateProperties(); - GravityWavesDepth = Settings.WaveDepth.Evaluate(BodyData.Mass) * GasGiantData.WaveDepthMultiplier; - GravityWavesRadius = Settings.WaveRadius.Evaluate(BodyData.Mass) * GasGiantData.WaveRadiusMultiplier; - GravityWavesSpeed = Settings.WaveSpeed.Evaluate(BodyData.Mass) * GasGiantData.WaveSpeedMultiplier; } } @@ -474,22 +895,107 @@ public class Sun : GasGiant public class AsteroidBelt { public AsteroidBeltData Data; - public float4[] Transforms; // x, y, rotation, scale - public float4[] NewTransforms; // x, y, rotation, scale public float Radius { get; } - public float2 OrbitPosition; - public float2 NewOrbitPosition; - public Dictionary RespawnTimers = new Dictionary(); - public Dictionary Damage = new Dictionary(); - public Dictionary<(Entity, int), float> MiningAccumulator = new Dictionary<(Entity, int), float>(); + + // Each asteroid's orbital period, in seconds: derived once at zone build by Zone.PeriodAround (the field at the + // asteroid's own distance from the belt's parent), the only period Pose and BeltTargets divide by. + public float[] Periods { get; } public AsteroidBelt(AsteroidBeltData data) { Data = data; - Transforms = new float4[data.Asteroids.Length]; - NewTransforms = new float4[data.Asteroids.Length]; + Periods = new float[data.Asteroids.Length]; Radius = data.Asteroids.Max(a => a.Distance); } + + // What the belt's rail adds to its parent's L_F (WellTree): an annulus reaches its outermost rock, whose period reads the + // field there; a swarm riding its rail reaches only the rail, whose period every rock shares. The one belt extent rule: + // Zone, ZoneGenerator's clearance tree and the station tests all read it. + public static float Extent(AsteroidBeltData data, float railDistance) => + data.RidesRail ? railDistance : Math.Max(data.Asteroids.Max(a => a.Distance), railDistance); + + // Cut 1 (docs/mining-cut.md): the formula of Zone.cs:269-271 verbatim, `time` in double as `_time` was used. + // The only place a chunk pose is computed; no per-tick copy survives it. Cut 2: size is no longer read from + // per-belt storage -- Zone owns wear now, so the caller (Zone.ChunkPose/EvaluateBelt) computes it through + // Zone.ChunkRadius and passes it in. + public float4 Pose(int index, double time, float2 parentPosition, float size) + { + var asteroid = Data.Asteroids[index]; + var rot = (float) (time * asteroid.RotationSpeed % (PI * 2)); + var pos = OrbitData.Evaluate((float) frac(time / Periods[index] + asteroid.Phase)) * asteroid.Distance + parentPosition; + return float4(pos.x, pos.y, rot, size); + } + + // Cut 1's size rule (Zone.cs:259-267), split in Cut 2 into its undamaged and damaged halves now that wear + // lives on Zone instead of here. Neither reads wear directly; the caller (Zone.ChunkRadius) decides which + // applies and supplies the damage. + public float UndamagedSize(int index, PlanetSettings settings) => settings.AsteroidSize.Evaluate(Data.Asteroids[index].Size); + + public float DamagedSize(int index, float damage, PlanetSettings settings) + { + var asteroidHitpoints = settings.AsteroidHitpoints.Evaluate(Data.Asteroids[index].Size); + var remaining = (asteroidHitpoints - damage) / asteroidHitpoints; + return settings.AsteroidSize.Evaluate(remaining * Data.Asteroids[index].Size); + } +} + +// Cut 2 (docs/mining-cut.md): a chunk is (field, index). "Field" is deliberate, not "belt" -- the operator's +// ruling generalizes chunks to other kinds of debris field later; only AsteroidBelt/AsteroidBeltData, the one +// live field kind, keep their existing names. +public readonly struct ChunkId : IEquatable +{ + public readonly CultRecordKey Field; + public readonly int Index; + + public ChunkId(CultRecordKey field, int index) + { + Field = field; + Index = index; + } + + public bool Equals(ChunkId other) => Field.Equals(other.Field) && Index == other.Index; + public override bool Equals(object obj) => obj is ChunkId other && Equals(other); + public override int GetHashCode() => (Field.GetHashCode() * 397) ^ Index; +} + +// Mining Cut 3 (docs/mining-cut-refresh.md, Q2 A): what an entity targets -- another entity, a chunk, or nothing. +// One slot holds either kind (Entity.Target, written only by Entity.SetTarget). A chunk never equals an entity. +// There is deliberately no == operator: a comparison against null or an entity must say which side it means. +public readonly struct TargetRef : IEquatable +{ + public readonly Entity Entity; + public readonly ChunkId? Chunk; + + public TargetRef(Entity entity) + { + Entity = entity; + Chunk = null; + } + + public TargetRef(ChunkId chunk) + { + Entity = null; + Chunk = chunk; + } + + public static TargetRef None => default; + public bool IsNone => Entity == null && !Chunk.HasValue; + + public static implicit operator TargetRef(Entity entity) => new TargetRef(entity); + public static implicit operator TargetRef(ChunkId chunk) => new TargetRef(chunk); + + public bool Equals(TargetRef other) => ReferenceEquals(Entity, other.Entity) && Nullable.Equals(Chunk, other.Chunk); + public override bool Equals(object obj) => obj is TargetRef other && Equals(other); + public override int GetHashCode() => Chunk.HasValue ? Chunk.Value.GetHashCode() : Entity?.GetHashCode() ?? 0; +} + +// Cut 2: wear on one chunk. BrokenUntil is the absolute zone time the chunk respawns at; null means the chunk +// carries damage (or none) but is not currently broken. Respawn is read lazily by comparing to zone time -- +// nothing decrements or clears this on a timer. +public struct ChunkWear +{ + public float Damage; + public double? BrokenUntil; } public class Orbit @@ -498,11 +1004,13 @@ public class Orbit public float2 Velocity = float2.zero; public float2 Position = float2.zero; public float2 PreviousPosition = float2.zero; - public float Period; - public Orbit(PlanetSettings settings, OrbitData data) + // Seconds per turn, written only by the Zone constructor (Zone.PeriodAround); infinite when the orbit has no + // field to circle in. + public float Period { get; internal set; } + + public Orbit(OrbitData data) { Data = data; - Period = settings.OrbitPeriod.Evaluate(data.Distance); } } diff --git a/Assets/Scripts/ServerShared/ZoneData.cs b/Assets/Scripts/ServerShared/ZoneData.cs index 90158fdb4..a08895aaa 100644 --- a/Assets/Scripts/ServerShared/ZoneData.cs +++ b/Assets/Scripts/ServerShared/ZoneData.cs @@ -5,6 +5,7 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Linq; using GameCult.Caching; using MessagePack; using Newtonsoft.Json; @@ -35,7 +36,37 @@ public class ZonePack [JsonProperty("time"), Key(5)] public double Time; + // Cut 2 (docs/mining-cut.md): chunk wear (damage taken, broken-until time), keyed by chunk. Nullable, not + // defaulted to an empty list: an older record has no key 6 at all, and MessagePack fills a missing trailing + // key with nil, which a reference-typed field reads back as null. ARunWithoutKeySixLoadsWhole pins that a + // record from before this key existed loads with no wear, rather than throwing or silently reading a + // default instance. + [JsonProperty("chunkWear"), Key(6)] + public List ChunkWear; + // True once this zone's boss has been spawned. The dead boss leaves no entity, so this is the one fact that tells a + // slain boss from one that never existed; RunGoal.ExitOpen reads it. Written only by ZoneGenerator, carried by PackZone. + [JsonProperty("bossSpawned"), Key(7)] + public bool BossSpawned; +} + +// Cut 2 (docs/mining-cut.md): one packed wear entry for one chunk. "Field" names the body that owns the chunk +// (an asteroid belt today; the operator's ruling generalizes chunks to other kinds of debris field later), not +// "belt" -- the chunk surface itself must not bake in the one live field kind. +[MessagePackObject, JsonObject(MemberSerialization.OptIn)] +public class ChunkWearPack +{ + [JsonProperty("field"), Key(0)] + public CultRecordKey Field; + + [JsonProperty("index"), Key(1)] + public int Index; + + [JsonProperty("damage"), Key(2)] + public float Damage; + + [JsonProperty("brokenUntil"), Key(3)] + public double? BrokenUntil; } [JsonObject(MemberSerialization.OptIn)] @@ -50,20 +81,10 @@ public abstract class BodyData [JsonProperty("mass"), Key(3)] public float Mass = 0; - [CultReference(typeof(SimpleCommodityData), many: true), JsonProperty("resources"), Key(4)] - public Dictionary, float> Resources = new Dictionary, float>(); + // MessagePack key 4 belonged to the removed stored Resources; do not reuse it. A belt's yield is derived by FieldKinds.Yield. [JsonProperty("bodyRadiusMul")] [Key(5)] public float BodyRadiusMultiplier = 1; - - [JsonProperty("gravRadiusMul")] [Key(6)] - public float GravityRadiusMultiplier = 1; - - [JsonProperty("depthMul")] [Key(7)] - public float GravityDepthMultiplier = 1; - - [JsonProperty("depthExp")] [Key(8)] - public float GravityDepthExponent = 16; } [CultDocument("aetheria.planetdata", "1"), MessagePackObject, JsonObject(MemberSerialization.OptIn)] @@ -77,6 +98,339 @@ public class AsteroidBeltData : BodyData { [JsonProperty("asteroids"), Key(9)] public Asteroid[] Asteroids; + + // Mining Cut 3 (docs/mining-cut-refresh.md, Q16 B): the belt's field kind, chosen once and saved. Unset on a + // belt from before this key existed (MessagePack leaves a missing trailing key at its default); Zone assigns + // it on first load through FieldKinds.Ensure, the same function generation uses. + [JsonProperty("kind"), Key(10)] + public CultRecordRef Kind; + + // A Trojan swarm (ruling trojans-ride-host-period-with-stations): every rock rides the belt's rail at the rail's period, so + // the swarm keeps its shape. False on a belt from before this key (MessagePack leaves a missing trailing key at its default), + // which keeps each rock on its own distance's period: an annulus. + [JsonProperty("ridesRail"), Key(11)] + public bool RidesRail; +} + +// Mining Cut 3 (docs/mining-cut-refresh.md, Q11): a kind of debris field, an authored catalog record. A chunk's +// reflectivity comes from its field's kind; its yields (ore geography, ruling ores-are-regional) are the ores a belt of +// this kind holds before a province weights them. FieldKinds.Yield is the one reader. +[CultDocument("aetheria.fieldkinddata", "1"), MessagePackObject, JsonObject(MemberSerialization.OptIn)] +public class FieldKindData +{ + [CultName, JsonProperty("name"), Key(0)] + public string Name = ""; + + // Reflectivity per schematic cell of chunk area: a chunk reflects CrossSection × its area in cells × the light + // on it (Zone.ChunkVisibility), the rule Reflector applies to a hull. + [JsonProperty("crossSection"), Key(1)] + public float CrossSection; + + // How often generation picks this kind, relative to the others (FieldKinds.Assign). Zero never picks it. + [JsonProperty("generationWeight"), Key(2)] + public float GenerationWeight = 1; + + // The ores a belt of this kind holds. Empty on a kind from before this key (MessagePack leaves a missing trailing key at its default). + [JsonProperty("yields"), Key(3)] + public List Yields = new List(); +} + +// One ore a kind of field holds: Abundance of Commodity before the belt's province weights it. A Regional ore is held only +// where the province lists it (ruling ores-are-regional: some ores exist only in some provinces); any other entry is held +// everywhere, scaled by the province's factor for it. +[MessagePackObject, JsonObject(MemberSerialization.OptIn)] +public class FieldYield +{ + [JsonProperty("commodity"), Key(0)] + public CultRecordRef Commodity; + + [JsonProperty("abundance"), Key(1)] + public float Abundance; + + [JsonProperty("regional"), Key(2)] + public bool Regional; +} + +// Ore geography (rulings provinces-within-regions, ores-are-regional): a kind of ground, authored. A region deals its +// provinces' types from a deck holding GenerationWeight cards of each type (ruling province-types-dealt-per-region); +// a province's type weights which kinds its belts draw and which ores a kind holds there. +[CultDocument("aetheria.provincedata", "1"), MessagePackObject, JsonObject(MemberSerialization.OptIn)] +public class ProvinceData +{ + [CultName, JsonProperty("name"), Key(0)] + public string Name = ""; + + // The number of cards of this type in a region's deck. Zero is never dealt. + [JsonProperty("generationWeight"), Key(1)] + public int GenerationWeight = 1; + + // Multiplies the kind's own GenerationWeight in a belt's draw; a kind not listed is multiplied by one. + [JsonProperty("kinds"), Key(2)] + public List Kinds = new List(); + + // Multiplies an ore's Abundance wherever it is held; an ore not listed is multiplied by one, or by zero when the + // kind's entry for it is Regional. + [JsonProperty("ores"), Key(3)] + public List Ores = new List(); +} + +[MessagePackObject, JsonObject(MemberSerialization.OptIn)] +public class ProvinceKindWeight +{ + [JsonProperty("kind"), Key(0)] + public CultRecordRef Kind; + + [JsonProperty("weight"), Key(1)] + public float Weight = 1; +} + +[MessagePackObject, JsonObject(MemberSerialization.OptIn)] +public class ProvinceOre +{ + [JsonProperty("commodity"), Key(0)] + public CultRecordRef Commodity; + + [JsonProperty("weight"), Key(1)] + public float Weight = 1; +} + +// Mining Cut 3 (Q16 B): the one owner of which kind a belt is. Ore geography: and of what it yields. +public static class FieldKinds +{ + // The one weighted pick: an index into weights, chosen by a stable hash of the site (the same site and the same + // weights always give the same index), never one whose weight is not positive. -1 when no weight is positive. + internal static int Pick(string site, double[] weights) + { + var pick = site.StableHash() / 4294967296.0 * weights.Sum(); + var last = -1; + for (var i = 0; i < weights.Length; i++) + { + if (weights[i] <= 0) continue; + last = i; + if (pick < weights[i]) return i; + pick -= weights[i]; + } + return last; + } + + // A weighted pick among the catalog's kinds, by a stable hash of the belt's site: the same site, catalog and province + // type always give the same kind. A kind's weight is its GenerationWeight times its province's factor for it; a belt with + // no province type (unset, or naming nothing the catalog holds) draws unweighted. Generation names a belt by the zone's + // seed and the belt's place in generation order (never by the key the cache mints, which differs every run); a belt saved + // without a kind is named by its key. Kinds are ordered by key so the pick does not depend on store order. + // Unset when the catalog has no kind with positive weight. + public static CultRecordRef Assign(string site, CultCache catalog, CultRecordRef province) + { + var type = catalog.Get(province); + var kinds = catalog.GetAll() + .Select(kind => + { + var key = catalog.RefOf(kind).Key; + var factor = Factor(type?.Kinds.Where(entry => entry.Kind.Key.Equals(key)).Select(entry => (double) entry.Weight), 1.0); + // Both must be positive: two negatives do not multiply into a weight. + return (Key: key, Weight: kind.GenerationWeight > 0f && factor > 0.0 ? kind.GenerationWeight * factor : 0.0); + }) + .Where(kind => kind.Weight > 0.0) + .OrderBy(kind => kind.Key.Value, StringComparer.Ordinal) + .ToArray(); + if (kinds.Length == 0) return default; + + return new CultRecordRef(kinds[Pick(site, kinds.Select(kind => kind.Weight).ToArray())].Key); + } + + // A province's factor for one entry: the sum of its listings, or the default when it lists none. + private static double Factor(IEnumerable listed, double unlisted) + { + var weights = listed?.ToArray(); + return weights == null || weights.Length == 0 ? unlisted : weights.Sum(); + } + + // Gives a belt with no kind its kind and saves it; a belt that has one keeps it, whatever the catalog now says. + // Generation (ZoneGenerator) and first load (Zone) both call this, so there is one assignment rule. + public static void Ensure(string site, AsteroidBeltData belt, CultCache cache, CultRecordRef province) + { + if (belt.Kind.IsSet()) return; + belt.Kind = Assign(site, cache, province); + if (belt.Kind.IsSet()) cache.Upsert(belt); + } + + // What a belt of this kind holds in a zone of this province: each of the kind's yields, its Abundance times the + // province's factor for the ore (unlisted: one, or zero when the yield is Regional), summed per commodity, in commodity + // key order, zero amounts dropped. Derived on every call, never stored. Empty for an unset kind. + public static (CultRecordRef Commodity, float Amount)[] Yield(CultRecordRef kind, + CultRecordRef province, CultCache catalog) + { + var data = catalog.Get(kind); + if (data == null) return Array.Empty<(CultRecordRef, float)>(); + var type = catalog.Get(province); + return data.Yields + .Select(yield => (yield.Commodity, Amount: yield.Abundance * Factor( + type?.Ores.Where(ore => ore.Commodity.Key.Equals(yield.Commodity.Key)).Select(ore => (double) ore.Weight), yield.Regional ? 0.0 : 1.0))) + .GroupBy(yield => yield.Commodity.Key.Value, StringComparer.Ordinal) + .OrderBy(group => group.Key, StringComparer.Ordinal) + .Select(group => (group.First().Commodity, Amount: (float) group.Sum(yield => yield.Amount))) + .Where(yield => yield.Amount > 0f) + .ToArray(); + } +} + +// Ore geography (rulings provinces-within-regions, boss-zone-is-near-side, province-partition-by-size, province-types-dealt-per-region). +// Pure functions of the zone graph, the run seed and the catalog: nothing here draws from Galaxy's Random stream, stores membership +// or reads who owns what. Galaxy builds provinces once, in its generation and save constructors, and nothing re-partitions them. +public static class Provinces +{ + // Zones per province when a settings object does not say (SectorGenerationSettings.ProvinceZones): calibration, not a rule. + public const int DefaultZonesPerProvince = 8; + + // A boss zone sits on the near side of its border: its crossing links are its links to zones in the component of exit in + // the graph without it. The one definition, read by Regions (which cuts them) and ExtraExits (which prunes all but one). + // exit unset (-1) gives none, and a boss zone that is the exit has none. Ordered by boss, then far zone. + public static (int Boss, int Far)[] CrossingLinks(int[][] adjacency, IReadOnlyCollection bossZones, int exit) + { + var links = new List<(int Boss, int Far)>(); + if (exit >= 0) + foreach (var boss in bossZones.Distinct().Where(boss => boss != exit).OrderBy(boss => boss)) + { + var exitSide = Flood(adjacency, exit, (a, b) => b != boss); + foreach (var next in adjacency[boss].OrderBy(next => next)) + if (exitSide[next]) links.Add((boss, next)); + } + return links.ToArray(); + } + + // The crossing links to prune so each boss zone keeps one exit: all of them but the link to the boss zone's successor on + // exitPath (the zones from the entrance to the exit), which is the link the run goes through. The generator's exit path + // passes through every boss zone by one of its crossing links; a boss zone off exitPath, last on it, or followed by a zone + // it has no crossing link to breaks that, and throws naming the boss zone rather than guessing which link to keep. + public static (int Boss, int Far)[] ExtraExits(int[][] adjacency, IReadOnlyCollection bossZones, int exit, int[] exitPath) + { + var extra = new List<(int Boss, int Far)>(); + foreach (var links in CrossingLinks(adjacency, bossZones, exit).GroupBy(link => link.Boss)) + { + var at = Array.IndexOf(exitPath, links.Key); + var kept = at >= 0 && at + 1 < exitPath.Length ? exitPath[at + 1] : -1; + if (!links.Any(link => link.Far == kept)) + throw new InvalidOperationException($"boss zone {links.Key} has no crossing link to its successor on the exit path, so no exit to keep"); + extra.AddRange(links.Where(link => link.Far != kept)); + } + return extra.ToArray(); + } + + // Each zone's region, named by the region's least zone index. Cutting every boss zone's crossing links (CrossingLinks) + // leaves the regions as the connected components. Every zone, boss zones included, is in exactly one. + public static int[] Regions(int[][] adjacency, IReadOnlyCollection bossZones, int exit) + { + var cut = CrossingLinks(adjacency, bossZones, exit).Select(link => (Math.Min(link.Boss, link.Far), Math.Max(link.Boss, link.Far))).ToHashSet(); + + var regionOf = new int[adjacency.Length]; + Array.Fill(regionOf, -1); + for (var start = 0; start < adjacency.Length; start++) + { + if (regionOf[start] >= 0) continue; + var members = Flood(adjacency, start, (a, b) => !cut.Contains((Math.Min(a, b), Math.Max(a, b)))); + for (var i = 0; i < members.Length; i++) if (members[i]) regionOf[i] = start; + } + return regionOf; + } + + // Each zone's province, named by the province's seed zone index. A region of size s takes max(1, round(s / zonesPerProvince)) + // seeds: the first is the zone with the least hash of the run seed, each next the zone farthest (in-region hops) from the + // seeds chosen so far, ties by that hash; then every zone joins the nearest seed, ties to the earlier seed. A province is + // contiguous and never crosses a region. + public static int[] Partition(int[][] adjacency, int[] regionOf, uint runSeed, int zonesPerProvince) + { + var seedOf = new int[adjacency.Length]; + uint Hash(int index) => $"{runSeed}:province-seed:{index}".StableHash(); + foreach (var region in Enumerable.Range(0, adjacency.Length).GroupBy(zone => regionOf[zone]).OrderBy(group => group.Key)) + { + var zones = region.ToArray(); + var count = Math.Min(zones.Length, Math.Max(1, (int) Math.Round((double) zones.Length / Math.Max(1, zonesPerProvince), MidpointRounding.AwayFromZero))); + var seeds = new List { zones.OrderBy(Hash).ThenBy(zone => zone).First() }; + while (seeds.Count < count) + { + var hops = Grow(adjacency, regionOf, seeds.ToArray()).Hops; + seeds.Add(zones.Where(zone => !seeds.Contains(zone)).OrderByDescending(zone => hops[zone]).ThenBy(Hash).ThenBy(zone => zone).First()); + } + var owner = Grow(adjacency, regionOf, seeds.ToArray()).Owner; + foreach (var zone in zones) seedOf[zone] = seeds[owner[zone]]; + } + return seedOf; + } + + // A region's hand of province types, one per province in ascending seed-zone order. Types are dealt without replacement from + // a deck of GenerationWeight cards per type (catalog types in key order), each draw one weighted pick over the cards remaining + // at a site named by the run seed, the region and the draw's place; the deck is restored whole when it runs out. An empty + // deck deals every province an unset type. + public static CultRecordRef[] Deal(int regionKey, int seedCount, uint runSeed, CultCache catalog) + { + var types = catalog.GetAll() + .Where(type => type.GenerationWeight > 0) + .Select(type => (Ref: catalog.RefOf(type), Cards: type.GenerationWeight)) + .OrderBy(type => type.Ref.Key.Value, StringComparer.Ordinal) + .ToArray(); + var hand = new CultRecordRef[seedCount]; + if (types.Length == 0) return hand; + + var remaining = types.Select(type => type.Cards).ToArray(); + for (var n = 0; n < seedCount; n++) + { + if (remaining.Sum() == 0) remaining = types.Select(type => type.Cards).ToArray(); + var card = FieldKinds.Pick($"{runSeed}:province-deal:{regionKey}:{n}", remaining.Select(cards => (double) cards).ToArray()); + remaining[card]--; + hand[n] = types[card].Ref; + } + return hand; + } + + // Every zone reachable from start over the links the filter allows. + private static bool[] Flood(int[][] adjacency, int start, Func allowed) + { + var reached = new bool[adjacency.Length]; + var stack = new Stack(); + reached[start] = true; + stack.Push(start); + while (stack.Count > 0) + { + var zone = stack.Pop(); + foreach (var next in adjacency[zone]) + if (!reached[next] && allowed(zone, next)) + { + reached[next] = true; + stack.Push(next); + } + } + return reached; + } + + // Breadth-first growth from seeds inside their regions, level by level: each zone's hops to the nearest seed and the rank + // (place in seeds) of the earliest seed among those that reach it first. + private static (int[] Owner, int[] Hops) Grow(int[][] adjacency, int[] regionOf, int[] seeds) + { + var owner = new int[adjacency.Length]; + var hops = new int[adjacency.Length]; + Array.Fill(owner, -1); + for (var rank = 0; rank < seeds.Length; rank++) + { + owner[seeds[rank]] = rank; + hops[seeds[rank]] = 0; + } + var frontier = seeds.ToList(); + for (var level = 1; frontier.Count > 0; level++) + { + var claims = new Dictionary(); + foreach (var zone in frontier) + foreach (var next in adjacency[zone]) + if (owner[next] < 0 && regionOf[next] == regionOf[zone]) + claims[next] = claims.TryGetValue(next, out var rank) ? Math.Min(rank, owner[zone]) : owner[zone]; + foreach (var claim in claims) + { + owner[claim.Key] = claim.Value; + hops[claim.Key] = level; + } + frontier = claims.Keys.OrderBy(zone => zone).ToList(); + } + return (owner, hops); + } } [CultDocument("aetheria.gasgiantdata", "1"), MessagePackObject, JsonObject(MemberSerialization.OptIn)] @@ -97,18 +451,6 @@ public class GasGiantData : BodyData [JsonProperty("albedoRotationSpeed"), Key(13)] public float AlbedoRotationSpeed = 1; - [JsonProperty("gravRadiusMul")] [Key(14)] - public float WaveRadiusMultiplier = 1; - - [JsonProperty("depthMul")] [Key(15)] - public float WaveDepthMultiplier = 1; - - [JsonProperty("depthExp")] [Key(16)] - public float WaveDepthExponent = 8; - - [JsonProperty("depthExp")] [Key(17)] - public float WaveSpeedMultiplier = 8; - [JsonProperty("materialOverrides"), Key(18)] public List MaterialOverrides = new List(); diff --git a/Assets/Scripts/ServerShared/ZoneGenerator.cs b/Assets/Scripts/ServerShared/ZoneGenerator.cs index c36d5e9f6..5b82a9a1a 100644 --- a/Assets/Scripts/ServerShared/ZoneGenerator.cs +++ b/Assets/Scripts/ServerShared/ZoneGenerator.cs @@ -35,17 +35,22 @@ public static class ZoneGenerator private const int MaximumPlacementSamples = 32; + // ambient: false keeps the planets, orbits and stations but generates no ship and no turret, so nothing wanders + // into a scenario's authored conditions (docs/scenarios-cut.md, 2.1). The rule is applied here, not by pruning. public static ZonePack GenerateZone( ItemManager itemManager, ZoneGenerationSettings zoneSettings, + PlanetSettings planetSettings, Galaxy galaxy, GalaxyZone galaxyZone, - bool isTutorial = false) + bool isTutorial = false, + bool ambient = true) { var pack = new ZonePack(); var cache = itemManager.ItemData; - var random = new Random(galaxyZone.Name.StableHash() ^ (uint) pcg3d(galaxyZone.Position).x); + var seed = galaxyZone.Name.StableHash() ^ (uint) pcg3d(galaxyZone.Position).x; + var random = new Random(seed); var density = saturate(galaxy.Background.CloudDensity(galaxyZone.Position)/2); pack.Radius = zoneSettings.ZoneRadius.Evaluate(density); @@ -85,13 +90,17 @@ public static class ZoneGenerator } var totalArea = occupiedAreas.Sum(c => c.Area); - foreach (var c in occupiedAreas) + // Every area root is massive, so a root's reach is Reach x its nearest area's centre (WellTree.SubzoneReach) + var centres = occupiedAreas.Select(c => c.Center).ToList(); + for (var k = 0; k < occupiedAreas.Count; k++) { - planets.AddRange(GenerateEntities(zoneSettings, ref random, c.Area / totalArea * pack.Mass, c.Radius, c.Center)); + var c = occupiedAreas[k]; + planets.AddRange(GenerateEntities(zoneSettings, planetSettings, ref random, c.Area / totalArea * pack.Mass, c.Radius, c.Center, + WellTree.SubzoneReach(centres, k))); } } else - planets.AddRange(GenerateEntities(zoneSettings, ref random, pack.Mass, pack.Radius, float2.zero)); + planets.AddRange(GenerateEntities(zoneSettings, planetSettings, ref random, pack.Mass, pack.Radius, float2.zero, float.PositiveInfinity)); // Every orbit is a record; parents link to records, so each orbit holds its key before any child names it var orbitMap = new Dictionary(); @@ -109,7 +118,8 @@ public static class ZoneGenerator } pack.Orbits = planets.Select(planet => cache.RefOf(orbitMap[planet])).ToList(); - pack.Planets = planets.Where(p=>!p.Empty).Select(planet => + var beltOf = new Dictionary(); + pack.Planets = planets.Where(p=>!p.Empty).Select((planet, index) => { BodyType bodyType = planet.Belt ? BodyType.Asteroid : planet.Mass > zoneSettings.SunMass ? BodyType.Sun : @@ -140,11 +150,12 @@ public static class ZoneGenerator planetData.Orbit = cache.RefOf(orbitMap[planet]); if (planetData is AsteroidBeltData beltData) { + beltOf[planet] = beltData; beltData.Asteroids = Enumerable.Range(0, (int) zoneSettings.AsteroidCount.Evaluate(beltData.Mass * orbitMap[planet].Distance)) .Select(_ => new Asteroid { - Distance = orbitMap[planet].Distance + random.NextFloat()*(random.NextFloat()-.5f)*zoneSettings.AsteroidBeltWidth.Evaluate(orbitMap[planet].Distance), + Distance = orbitMap[planet].Distance + random.NextFloat()*(random.NextFloat()-.5f)*2*planet.BeltHalfWidth, Phase = random.NextFloat(), Size = random.NextFloat(), RotationSpeed = zoneSettings.AsteroidRotationSpeed.Evaluate(random.NextFloat()) @@ -156,8 +167,10 @@ public static class ZoneGenerator { if (gas is SunData sun) { - float primary = random.NextFloat(); - float secondary = frac(primary + 1 + zoneSettings.SunSecondaryColorDistance * (random.NextFloat() > .5 ? 1 : -1)); + var hueDraw = random.NextFloat(); + float primary = ColorMath.HueOutsideBand(hueDraw, zoneSettings.SunHueExcludedStart, zoneSettings.SunHueExcludedEnd); + float secondary = ColorMath.SecondaryHueOutsideBand(hueDraw, random.NextFloat() > .5, zoneSettings.SunSecondaryColorDistance, + zoneSettings.SunHueExcludedStart, zoneSettings.SunHueExcludedEnd); gas.Colors = new [] { float4(ColorMath.HsvToRgb(float3(primary, zoneSettings.SunColorSaturation, .5f)), 0), @@ -197,27 +210,132 @@ public static class ZoneGenerator } // A body is named for the first eight characters of the key the cache mints for it - planetData.Name = cache.Upsert(planetData).Key.Value.Substring(0, 8); + var bodyKey = cache.Upsert(planetData).Key; + planetData.Name = bodyKey.Value.Substring(0, 8); + // Mining Cut 3 (Q16 B): a belt's field kind is chosen here, at generation, and saved with it. + if (planetData is AsteroidBeltData generatedBelt) FieldKinds.Ensure($"{seed}:belt:{index}", generatedBelt, cache, galaxyZone.Province?.Type ?? default); return cache.Upsert(planetData); }).ToList(); + // Trojan swarms (rulings trojans-first, trojans-ride-host-period-with-stations): a belt on a copy of its host's rail, its + // rocks round both L4 and L5. Drawn from a stream of its own, so no other draw in the zone moves; not a GeneratorPlanet, + // so it takes no slot and no station candidacy sees it. A standing binary leaves a bodyless node (Empty) that keeps its + // pair's mass and a parent, so the Empty guard is what keeps a swarm off a rail no body is on. + var swarmRandom = new Random(seed ^ TrojanStream); + var swarmHosts = new HashSet(); + foreach (var host in planets.Where(p => p.Parent != null && !p.Parent.Empty && !p.Empty && !p.Belt && p.Distance > 0 + && p.Mass > zoneSettings.PlanetMass && p.Mass <= zoneSettings.SunMass)) + { + if (swarmRandom.NextFloat() >= zoneSettings.TrojanProbability) continue; + swarmHosts.Add(host); + var hostOrbit = orbitMap[host]; + var rail = new OrbitData { Parent = hostOrbit.Parent, Distance = hostOrbit.Distance, Phase = hostOrbit.Phase }; + pack.Orbits.Add(cache.Upsert(rail)); + var swarm = new AsteroidBeltData + { + Orbit = cache.RefOf(rail), RidesRail = true, + Asteroids = TrojanRocks(zoneSettings, ref swarmRandom, rail.Distance, rail.Phase) + }; + BodyData swarmBody = swarm; + var swarmKey = cache.Upsert(swarmBody).Key; + swarm.Name = swarmKey.Value.Substring(0, 8); + FieldKinds.Ensure($"{seed}:swarm:{swarmHosts.Count}", swarm, cache, galaxyZone.Province?.Type ?? default); + pack.Planets.Add(cache.Upsert(swarmBody)); + } + + // Laned belts (rulings belt-shapes-direction, lanes-two-sided-visual-margin): a belt candidate that kept its body carries + // an annulus on a copy of its rail that fills its slot less a lane round the body, rocks on both sides. The lane is sized + // against the body the player sees (LaneBodyRadii body radii a side), and only a body whose slot holds a band at least + // that wide on both sides gets one. One belt shape per parent, and none on a swarm host. Drawn from a stream of its own, + // so no other draw in the zone moves; its rocks sit inside the host's slot, below the next sibling's spacing, so they + // raise no L_F and no support: the lane moves no well, period or height. + var laneRandom = new Random(seed ^ LaneStream); + var shaped = new HashSet(planets.Where(p => p.Belt).Select(p => p.Parent)); + foreach (var host in planets.Where(p => p.BeltCandidate && !p.Belt)) + { + if (laneRandom.NextFloat() >= zoneSettings.LaneProbability) continue; + var lane = zoneSettings.LaneBodyRadii * planetSettings.BodyRadius.Evaluate(host.Mass); + if (swarmHosts.Contains(host) || shaped.Contains(host.Parent) || !LaneHost(host, lane)) continue; + shaped.Add(host.Parent); + var hostOrbit = orbitMap[host]; + var rail = new OrbitData { Parent = hostOrbit.Parent, Distance = hostOrbit.Distance, Phase = hostOrbit.Phase }; + pack.Orbits.Add(cache.Upsert(rail)); + var laned = new AsteroidBeltData + { + Orbit = cache.RefOf(rail), + Asteroids = LaneRocks(zoneSettings, ref laneRandom, host.Mass, rail.Distance, lane, host.SlotInner, host.SlotOuter) + }; + BodyData lanedBody = laned; + var lanedKey = cache.Upsert(lanedBody).Key; + laned.Name = lanedKey.Value.Substring(0, 8); + FieldKinds.Ensure($"{seed}:lane:{shaped.Count}", laned, cache, galaxyZone.Province?.Type ?? default); + pack.Planets.Add(cache.Upsert(lanedBody)); + } + + // The generator's own well tree, for clearance only (the Zone builds its own): what a rail must stay out of is the body's + // support, or its Roche margin if more. A belt's extent is the rule Zone reads (AsteroidBelt.Extent). Swarm and lane rails + // are left out: a swarm's extent is its own rail, a copy of its host's, and a lane's outer rock sits inside its host's slot, + // below the next sibling's spacing, so neither raises an L_F or a support. + var wellNodes = planets.Select(p => new WellNode(cache.RefOf(orbitMap[p]).Key, p.Parent == null ? default : cache.RefOf(orbitMap[p.Parent]).Key, + p.Distance, p.Phase, p.Empty || p.Belt ? 0f : p.Mass, + p.Belt ? AsteroidBelt.Extent(beltOf[p], p.Distance) : p.Distance, p.FixedPosition)).ToList(); + var wells = WellTree.Build(wellNodes, planetSettings, pack.Radius); + float Extent(GeneratorPlanet p) + { + var key = cache.RefOf(orbitMap[p]).Key; + var roche = p.Empty || p.Belt ? 0f : WellTree.Curves(planetSettings, p.Mass).Softening * RocheMargin; + return Math.Max(wells.Support(key), roche); + } + bool Massive(GeneratorPlanet p) => wells.Reach(cache.RefOf(orbitMap[p]).Key) > 0f; + var nearestFaction = galaxy.Factions.MinBy(f => galaxy.HomeZones[f].Distance[galaxyZone]); var nearestFactionHomeZone = galaxy.HomeZones[nearestFaction]; - var factionPresence = nearestFaction.InfluenceDistance - nearestFactionHomeZone.Distance[galaxyZone] + 1; + var factionPresence = galaxy.InfluenceOf(nearestFaction) - nearestFactionHomeZone.Distance[galaxyZone] + 1; var storyStations = galaxyZone.Locations.Where(story => story.Type == LocationType.Station).ToArray(); var stationCount = (int)(random.NextFloat() * (factionPresence + 1)) + storyStations.Length; - var potentialLagrangePoints = planets - .Where(p => p.Parent != null && p.Parent.Children - .TrueForAll(c => !(c != p && abs(c.Distance - p.Distance) < .1f))) // Filter Rosettes + // Enemy count below is based on this pre-override value, so the tutorial entrance doesn't gain an enemy + // just because its station got forced. + var baseStationCount = stationCount; + // Operator ruling, 2026-09-25 (docs/locomotion-cut.md, "Tutorial station"): the entrance zone always + // gets a generated faction station with a docking bay, deterministically. Galaxy.cs halves influence and + // picks the lowest-influence unowned zone for Entrance, which otherwise rolls stationCount 0 on every + // seed. galaxy.Entrance is reference-identity, not a name comparison. + var isTutorialEntrance = isTutorial && galaxyZone == galaxy.Entrance; + if (isTutorialEntrance && stationCount < 1) stationCount = 1; + // A station's source is a well-bearing body alone on its ring whose rail clears every massive sibling's extent (the + // sibling's support, or its Roche margin if more) and the largest reach of any station or turret hull: whatever hull + // is built there, its Lagrange orbit then sits clear of any other body. + var cellSize = itemManager.GameplaySettings.SchematicCellSize; + var largestReach = cache.GetAll().Where(h => h.HullType == HullType.Station || h.HullType == HullType.Turret) + .Select(h => h.Reach(cellSize)).DefaultIfEmpty(0f).Max(); + var candidates = planets + .Where(p => p.Parent != null && !p.Empty && !p.Belt + && p.Parent.Children.TrueForAll(c => c == p || (abs(c.Distance - p.Distance) >= WellTree.RingWindow + && (!Massive(c) || abs(c.Distance - p.Distance) > Extent(c) + largestReach)))) .OrderBy(p => p.Distance) .ToArray(); - // Pick a selection from the middle of the distribution - var selectedStationOrbits = potentialLagrangePoints - .Skip(potentialLagrangePoints.Length / 2) - .Take(stationCount) - .Select(p=>orbitMap[p]) - .ToArray(); + // (the rail, how far a body on it keeps others out, whether it is a station's own orbit rather than a base's) + var sources = candidates.Skip(candidates.Length / 2).Take(stationCount) + .Select(p => (orbit: orbitMap[p], extent: Extent(p), direct: false)).ToArray(); + if (isTutorialEntrance && candidates.Length == 0) + { + // The entrance gets a station whatever its bodies: it orbits a root node beyond its ring group (or, for a body, its + // whole family), never at a ring member's distance, and sits there, not at a Lagrange point. + var roots = planets.Where(p => p.Parent == null).ToList(); + var rootNode = roots.FirstOrDefault(p => p.Children.Count > 0) ?? (roots.Count > 1 ? roots.OrderByDescending(p => p.Mass).First() : null); + if (rootNode == null) + throw new InvalidOperationException( + "The tutorial entrance zone must always get a station, but it has no candidate orbit at all -- every planet in the zone is a parentless root."); + var distance = rootNode.Empty + ? (1 + GravityField.RingReach) * GravityField.Beta * rootNode.Children.Where(Massive).Min(c => c.Distance) + : Extent(rootNode); + var direct = new OrbitData { Parent = cache.RefOf(orbitMap[rootNode]), Distance = distance, Phase = random.NextFloat() }; + pack.Orbits.Add(cache.Upsert(direct)); + sources = new[] { (orbit: direct, extent: float.NegativeInfinity, direct: true) }; + } + var selectedStationOrbits = sources.Select(x => x.orbit).ToArray(); + var extentOf = sources.ToDictionary(x => x.orbit, x => x.extent); var loadoutGenerators = new Dictionary(); @@ -228,51 +346,81 @@ public static class ZoneGenerator return loadoutGenerators[faction]; } + // L4 or L5: 60 degrees (one sixth of a turn) ahead of or behind the planet on its orbit. Phase is in turns. OrbitData CreateLagrangeOrbit(OrbitData baseOrbit) { + if (sources.First(x => x.orbit == baseOrbit).direct) return baseOrbit; var lagrangeOrbit = new OrbitData { Parent = baseOrbit.Parent, Distance = baseOrbit.Distance, - Phase = baseOrbit.Phase + PI / 3 * sign(random.NextFloat() - .5f) + Phase = baseOrbit.Phase + sign(random.NextFloat() - .5f) / 6f, }; pack.Orbits.Add(cache.Upsert(lagrangeOrbit)); return lagrangeOrbit; } - void PlaceTurret(OrbitData orbit, LoadoutGenerator loadoutGenerator, int distanceMultiplier) + // A turret co-orbits with its station, on one side of it (side is -1 behind, +1 ahead), clear of the body inside + // it on that side by one of the turret's own radii: its centre sits innerReach + 2 turretReach beyond that + // body's. Every body's reach counts, so turrets of differing reach clear each other. Phase is in turns, so the + // arc length divides by the orbit's circumference. Returns where the turret sits (signed arc from the station) + // and its reach, or null when there is no turret hull to generate, before any orbit is created. + (float arc, float reach, bool placed)? PlaceTurret(OrbitData orbit, LoadoutGenerator loadoutGenerator, float side, float innerArc, float innerReach, + OrbitData baseOrbit) { - var phase = 20f * distanceMultiplier / orbit.Distance; + var turret = loadoutGenerator.GenerateTurretLoadout(); + if (turret == null) return null; + var turretReach = (itemManager.GetData(turret.Hull) as HullData).Reach(itemManager.GameplaySettings.SchematicCellSize); + var arc = innerArc + side * (innerReach + 2 * turretReach); + // A turret whose centre is within the base body's extent plus its own reach of the base is not placed: its side stops. + var phase = orbit.Phase + arc / (2 * PI * orbit.Distance); + if (2 * orbit.Distance * abs(sin(PI * (phase - baseOrbit.Phase))) < extentOf[baseOrbit] + turretReach) + { + itemManager.Log("A turret was not placed: its station's base body is within its reach (story-turret-tail-clearance)."); + return (arc, turretReach, false); + } var turretOrbit = new OrbitData { Parent = orbit.Parent, Distance = orbit.Distance, - Phase = orbit.Phase + phase + Phase = phase + }; pack.Orbits.Add(cache.Upsert(turretOrbit)); - var turret = loadoutGenerator.GenerateTurretLoadout(); - if (turret == null) return; turret.Orbit = cache.RefOf(turretOrbit); pack.Entities.Add(turret); + return (arc, turretReach, true); } - void PlaceTurrets(OrbitData orbit, LoadoutGenerator loadoutGenerator, int count) + // Turrets flank the station alternately, behind then ahead, each side growing outward from the station. + void PlaceTurrets(OrbitData orbit, LoadoutGenerator loadoutGenerator, int count, float stationReach, OrbitData baseOrbit) { + var arcs = new float[2]; + var stopped = new bool[2]; + var reaches = new[] { stationReach, stationReach }; for(int t=0; t + (itemManager.GetData(station.Hull) as HullData).Reach(itemManager.GameplaySettings.SchematicCellSize); + for (var i = 0; i < storyStations.Length; i++) { var story = storyStations[i]; + if (i >= selectedStationOrbits.Length) { itemManager.Log($"Story station for {story.Faction?.Name} has no rail clear of the bodies; its story has nowhere to live!"); continue; } var orbit = selectedStationOrbits[i]; var lagrangeOrbit = CreateLagrangeOrbit(orbit); - var station = GetLoadoutGenerator(story.Faction).GenerateStationLoadout(); + var station = GetLoadoutGenerator(story.Faction).GenerateStationLoadout( + StationKinds.Choose(cache, story.Faction, $"{seed}:station:{i}", itemManager.Log)); if (station == null) { itemManager.Log($"Story station for {story.Faction?.Name} could not be generated; its story has nowhere to live!"); @@ -284,7 +432,7 @@ public static class ZoneGenerator station.Story = i; pack.Entities.Add(station); - PlaceTurrets(lagrangeOrbit, GetLoadoutGenerator(story.Faction), story.Turrets); + if (ambient) PlaceTurrets(lagrangeOrbit, GetLoadoutGenerator(story.Faction), story.Turrets, StationReach(station), orbit); } for (var i = storyStations.Length; i < selectedStationOrbits.Length; i++) @@ -293,17 +441,55 @@ public static class ZoneGenerator var security = (SecurityLevel) ((int) ((1f - pow(random.NextFloat(), factionPresence / 2f)) * 3f)); var lagrangeOrbit = CreateLagrangeOrbit(orbit); - var station = GetLoadoutGenerator(nearestFaction).GenerateStationLoadout(); - if (station == null) continue; + var station = GetLoadoutGenerator(nearestFaction).GenerateStationLoadout( + StationKinds.Choose(cache, nearestFaction, $"{seed}:station:{i}", itemManager.Log)); + if (station == null) + { + if (isTutorialEntrance) + throw new InvalidOperationException( + $"The tutorial entrance zone must always get a station, but {nearestFaction?.Name} has no station loadout to generate."); + continue; + } station.Orbit = cache.RefOf(lagrangeOrbit); station.SecurityLevel = security; station.SecurityRadius = pack.Radius; pack.Entities.Add(station); - PlaceTurrets(lagrangeOrbit, GetLoadoutGenerator(nearestFaction), 2); + if (ambient) PlaceTurrets(lagrangeOrbit, GetLoadoutGenerator(nearestFaction), 2, StationReach(station), orbit); } - var enemyCount = (int)(random.NextFloat() * factionPresence * 2) + stationCount; + // A boss zone gets its faction's boss whether or not the zone is ambient: the boss is the run's goal, not + // wandering traffic. The boss is its faction's boss Loadout, built whole by Loadouts.Materialize and never drawn + // (ruling boss-gear-is-a-loadout); ChooseProduct only brands a design-only slot. RunGoal reads the mark; nothing + // else decides whether a boss lives. + foreach (var bossFaction in galaxy.BossZones.Where(entry => entry.Value == galaxyZone).Select(entry => entry.Key)) + { + var loadout = Loadouts.BossOf(itemManager.ItemData, bossFaction, out var refusal); + if (loadout == null) + { + itemManager.Log($"{bossFaction.Name} has no boss: it {Loadouts.Describe(refusal)}. Its boss zone has no boss to kill."); + continue; + } + var failures = new List(); + var entity = Loadouts.Materialize(itemManager, null, loadout, design => GetLoadoutGenerator(bossFaction).ChooseProduct(design), failures); // the generator exists only once the Loadout is known to fit + if (entity == null) + { + itemManager.Log($"{bossFaction.Name}'s boss Loadout {loadout.Name} cannot be built: {string.Join("; ", failures)}"); + continue; + } + entity.Faction = bossFaction; + var boss = EntitySerializer.Pack(entity); + boss.Boss = true; + pack.Entities.Add(boss); + pack.BossSpawned = true; + } + + if (galaxyZone == galaxy.Exit && !pack.BossSpawned) + itemManager.Log("Galaxy.Exit has no boss: Galaxy.BossZones does not map a boss faction to the exit zone, or its boss Loadout is unset, missing or cannot be built (ZoneGenerator exit-without-boss). The exit gate stays sealed."); + + if (!ambient) return pack; + + var enemyCount = (int)(random.NextFloat() * factionPresence * 2) + baseStationCount; for (int i = 0; i < enemyCount; i++) { var ship = GetLoadoutGenerator(nearestFaction).GenerateShipLoadout(); @@ -336,22 +522,15 @@ public static class ZoneGenerator public static Faction[] EligibleWandererFactions(Faction[] factions, Faction owner, Faction nearest) => factions.Where(f => f != owner && f != nearest).ToArray(); - // static float ResourceValue(ref Random random, ZoneGenerationSettings settings, SimpleCommodityData resource, float density) - // { - // return random.NextPowerDistribution(resource.Minimum, resource.Maximum, resource.Exponent, - // 1 / lerp(settings.ResourceDensityMinimum, settings.ResourceDensityMaximum, density)); - // } - - public static GeneratorPlanet[] GenerateEntities(ZoneGenerationSettings settings, ref Random random, float mass, float radius, float2 fixedPosition) + public static GeneratorPlanet[] GenerateEntities(ZoneGenerationSettings settings, PlanetSettings planetSettings, ref Random random, float mass, float radius, float2 fixedPosition, + float rootReach) { var root = new GeneratorPlanet { FixedPosition = fixedPosition, Settings = settings, - Mass = mass, - ChildDistanceMaximum = radius * .75f, - ChildDistanceMinimum = settings.PlanetSafetyRadius.Evaluate(mass) - }; + Mass = mass + }; // There is some chance of generating a rosette or binary system // Probabilities which are fixed for the entire galaxy are in GlobalData, contained in the GameContext @@ -368,8 +547,6 @@ public static class ZoneGenerator count: (int)(random.NextFloat(1, 3) * random.NextFloat(1, 2)), massMulMin: .6f, massMulMax: .8f, - distMulMin: 1.25f, - distMulMax: 1.75f, jupiterJump: 1, massFraction: .1f); @@ -383,8 +560,6 @@ public static class ZoneGenerator count: (int) (random.NextFloat(1, 3 * m) + random.NextFloat(1, 3 * m)), massMulMin: 0.75f, massMulMax: 2.5f, - distMulMin: 1 + m * .25f, - distMulMax: 1.05f + m * .5f, jupiterJump: random.NextFloat() * random.NextFloat() * 10 + 1, massFraction: .5f ); @@ -398,8 +573,6 @@ public static class ZoneGenerator count: random.NextInt(5, 15), massMulMin: 0.75f, massMulMax: 2.5f, - distMulMin: 1.1f, - distMulMax: 1.25f, jupiterJump: random.NextFloat() * random.NextFloat() * 10 + 1, massFraction: .25f ); @@ -440,8 +613,6 @@ public static class ZoneGenerator count: planet.Mass < settings.GasGiantMass ? random.NextInt(1, 3) : random.NextInt(2, 6), massMulMin: .75f, massMulMax: 1.5f, - distMulMin: 1.05f, - distMulMax: 1.25f, jupiterJump: 1, massFraction: .15f); // Planetary satellites are not nearly as massive as planets themselves } @@ -456,16 +627,198 @@ public static class ZoneGenerator : root.AllPlanets().Where(p => p != root && p.Mass < settings.BeltMassCeiling && !binaries.Contains(p) && p.Children.Count == 0); foreach(var planet in beltCandidates.Reverse()) + { + planet.BeltCandidate = true; if (random.NextFloat() < settings.BeltProbability && !planet.Parent.Children.Any(p=>p.Belt)) planet.Belt = true; + } var totalMass = root.AllPlanets().Sum(p => p.Mass); var rootMass = root.Mass; foreach (var planet in root.AllPlanets()) planet.Mass = (planet.Mass / totalMass) * rootMass; + Place(root, planetSettings, radius, rootReach); + return root.AllPlanets().ToArray(); } + + // Placement (tail-taming-law-r3-band-loose-cusp, c4-proceed-and-fly): a child sits at least RocheMargin of its parent's Roche + // limits out; a massive child of a body also far enough that its own pull peak beats CuspMargin times its parent's pull there; + // siblings sit SiblingSpacing of a reach apart. Every other number is a GravityField constant. + public const float RocheMargin = 1.5f; + + private const uint TrojanStream = 0x9E3779B9u; + + // A swarm's rocks: alternately round L4 and L5 of the rail at `distance` and `phase`, each within half an arc of its point + // along the orbit and a half-width of the rail across it, thickest at the point. + public static Asteroid[] TrojanRocks(ZoneGenerationSettings settings, ref Random random, float distance, float phase) + { + var rocks = new Asteroid[2 * (int) settings.TrojanCount.Evaluate(distance)]; + for (var i = 0; i < rocks.Length; i++) + rocks[i] = new Asteroid + { + Distance = distance * (1 + random.NextFloat() * (random.NextFloat() - .5f) * 2 * settings.TrojanHalfWidth), + Phase = frac(phase + (i % 2 == 0 ? 1f : -1f) / 6f + random.NextFloat() * (random.NextFloat() - .5f) * settings.TrojanArc), + Size = random.NextFloat(), + RotationSpeed = settings.AsteroidRotationSpeed.Evaluate(random.NextFloat()) + }; + return rocks; + } + + private const uint LaneStream = 0x85EBCA6Bu; + + // Whether a placed body can carry a lane of half-width `lane`: its slot holds a band at least that wide on both sides + // (ruling lanes-two-sided-visual-margin), and it is not its parent's outermost child (ruling lane-not-outermost). Place + // stretches the chain to the window, so an outermost child's outer side is the window, not a sibling's spacing; a lane's outer + // band there would reach past every sibling's extent and raise its parent's support, and lanes move nothing else in the zone. + // An only child is its parent's outermost. + public static bool LaneHost(GeneratorPlanet host, float lane) => + host.Parent.Children.Any(c => c.Distance > host.Distance) + && host.SlotInner <= host.Distance - 2 * lane && host.SlotOuter >= host.Distance + 2 * lane; + + // A laned belt's rocks: the count an annulus of the host's mass at `distance` would draw, over the bands [inner, distance - lane] + // and [distance + lane, outer], each rock in a band by its area and drawn across it as the annulus draws across its width. + public static Asteroid[] LaneRocks(ZoneGenerationSettings settings, ref Random random, float mass, float distance, float lane, float inner, float outer) + { + float Sq(float x) => x * x; + var innerArea = Sq(distance - lane) - Sq(inner); + var share = innerArea / (innerArea + Sq(outer) - Sq(distance + lane)); + var rocks = new Asteroid[(int) settings.AsteroidCount.Evaluate(mass * distance)]; + for (var i = 0; i < rocks.Length; i++) + { + var innerBand = random.NextFloat() < share; + var a = innerBand ? inner : distance + lane; + var b = innerBand ? distance - lane : outer; + rocks[i] = new Asteroid + { + Distance = (a + b) / 2 + random.NextFloat() * (random.NextFloat() - .5f) * (b - a), + Phase = random.NextFloat(), + Size = random.NextFloat(), + RotationSpeed = settings.AsteroidRotationSpeed.Evaluate(random.NextFloat()) + }; + } + return rocks; + } + public const float CuspMargin = 1.5f; + public const float SiblingSpacing = .5f; + + /// + /// The one placement pass: gives every generated node its distance and every belt its half width, top-down. A body's children + /// are laid inside-out at the nearest the rules allow, the lightest family is folded into the parent (its mass kept) while the + /// outermost overflows the window, and the rest are stretched geometrically so the outermost sits at the window's edge. A + /// non-root's window ends before its own fade (Gamma x Reach x its distance); a root's, in a zone of several, ends under + /// rootReach / Beta so its support never meets another root's (root-window-floor), and is 0.75 x the area radius at most. + /// A rosette's ring is one orbit, and a member may itself be bodyless, which counts as one body of its family's mass; once its members have settled (their own children folded in), it folds into its node, + /// which becomes a body, if it cannot keep its heaviest member outside its Roche margin. Ported from docs/research/gravity-well-law/replace.py. + /// + public static void Place(GeneratorPlanet root, PlanetSettings planetSettings, float radius, float rootReach) + { + var q = 1 / (1 - SiblingSpacing * GravityField.Reach); + float Roche(float mass) => WellTree.Curves(planetSettings, mass).Softening; + float Strength(float mass) => WellTree.Curves(planetSettings, mass).Strength; + float WellMass(GeneratorPlanet p) => p.Empty || p.Belt ? 0f : p.Mass; + float Family(GeneratorPlanet p) => (p.Empty ? 0f : p.Mass) + p.Children.Sum(c => Family(c)); + // A bodyless node pulls from afar as one body of its family's mass, which it becomes if its ring cannot stand (binaries-orbited-from-afar) + float OneBody(GeneratorPlanet p) => p.Empty ? Family(p) : WellMass(p); + // A folded family joins its target: a body takes its mass, a bodyless node (whose own Mass is no mass) takes it as a child, + // which its own Settle then places. + void Fold(GeneratorPlanet node, GeneratorPlanet into) + { + node.Parent.Children.Remove(node); + if (into.Empty) { node.Parent = into; into.Children.Add(node); } + else into.Mass += Family(node); + } + + void PlaceChildren(List children, Func lower, float upper, GeneratorPlanet into) + { + upper *= 1 - 1e-6f; + float AtLeast(GeneratorPlanet child, float edge) + { + var m = OneBody(child); + var mInto = OneBody(into); + return m <= 0 || mInto <= 0 ? edge : Math.Max(edge, 2 * CuspMargin * Roche(m) * Strength(mInto) / Strength(m)); + } + + var lo = 0f; + var positions = new List(); + while (children.Count > 0) + { + lo = lower(); + positions.Clear(); + for (var k = 0; k < children.Count; k++) + positions.Add(AtLeast(children[k], k == 0 ? lo : Math.Max(lo, positions[k - 1] * q))); + if (positions[positions.Count - 1] <= upper) break; + var lightest = children.OrderBy(c => Family(c)).First(); + Fold(lightest, into); + children.Remove(lightest); + } + if (children.Count == 0) return; + + var g = children.Count > 1 ? pow(upper / positions[positions.Count - 1], 1f / (children.Count - 1)) : 1f; + for (var k = 0; k < children.Count; k++) + children[k].Distance = positions[k] * pow(g, k); + // Every child's slot: from the lower bound and the previous sibling's spacing out to the next sibling's spacing and the + // window. Place is the only writer of a slot; a belt fills its own, and the lane pass reads a body's. A belt is an + // interval inside its slot, the authored width the widest it may be. + var outer = 0f; + for (var k = 0; k < children.Count; k++) + { + var c = children[k]; + c.SlotInner = Math.Max(lo, outer * q); + c.SlotOuter = k + 1 < children.Count ? Math.Min(upper, children[k + 1].Distance / q) : upper; + if (!c.Belt) { outer = c.Distance; continue; } + var inner = c.SlotInner; + var outerLimit = c.SlotOuter; + c.Distance = (inner + outerLimit) / 2; + var half = Math.Max(0f, Math.Min(c.Settings.AsteroidBeltWidth.Evaluate(c.Distance), outerLimit - inner) / 2); + c.BeltHalfWidth = half; + outer = c.Distance + half; + } + } + + var chordCap = new Dictionary(); // a ring member's children stay within .2 of the nearest partner's chord + void Settle(GeneratorPlanet node) + { + var isRoot = node.Parent == null; + var reach = isRoot ? rootReach : GravityField.Reach * node.Distance; + var share = isRoot ? 1 / GravityField.Beta : GravityField.Gamma; + var cap = isRoot ? .75f * radius : float.PositiveInfinity; + var upper = Math.Min(cap, share * reach / Math.Max(GravityField.Beta, 1 + GravityField.Reach)); + if (chordCap.TryGetValue(node, out var chord)) upper = Math.Min(upper, chord); + if (WellMass(node) > 0) + { + PlaceChildren(node.Children.ToList(), () => RocheMargin * Roche(WellMass(node)), upper, node); + foreach (var child in node.Children.ToList()) Settle(child); + return; + } + + var ring = node.Children.Where(c => c.Ring && OneBody(c) > 0).ToList(); + if (ring.Count == 0) { foreach (var child in node.Children.ToList()) Settle(child); return; } + var heavy = ring.OrderByDescending(OneBody).First(); + var ringDistance = Math.Min(.5f * cap, share * reach / (GravityField.Beta * GravityField.Beta * (1 + GravityField.RingReach))); + PlaceChildren(node.Children.Where(c => !ring.Contains(c)).ToList(), + () => (1 + GravityField.RingReach) * ringDistance * GravityField.Beta, upper, heavy); + foreach (var member in ring) + { + member.Distance = ringDistance; + chordCap[member] = .2f * 2 * ringDistance * sin(PI / ring.Count); + Settle(member); + } + // A member's mass is final only once it has settled (its own overflowing children fold into it). + if (ringDistance < RocheMargin * Roche(ring.Max(OneBody))) + { + // The ring cannot keep its heaviest member outside its Roche margin inside its node's reach: the node is one body. + node.Empty = false; + node.Mass = 0; + foreach (var child in node.Children.ToList()) Fold(child, node); + return; + } + foreach (var child in node.Children.Where(c => !ring.Contains(c)).ToList()) Settle(child); + } + + Settle(root); + } } // All orbiting bodies are referred to here as "Planets" @@ -477,11 +830,18 @@ public class GeneratorPlanet public float Distance; public float Phase; public float Mass; - //public float Period; - public float ChildDistanceMinimum; - public float ChildDistanceMaximum; + // A belt's half width, written by ZoneGenerator.Place: the belt fills the slot between its siblings' spacing, the parent's + // Roche margin and the parent's window, up to the authored width (ruling belt-fills-its-slot). + public float BeltHalfWidth; public bool Empty = false; public bool Belt = false; + // The interval Place gives a child between its previous sibling's spacing and the next sibling's spacing or the window; zero + // on a ring member, which has no slot. + public float SlotInner, SlotOuter; + // A childless light body, not a binary or root rosette member, that could have become a belt (set by GenerateEntities). + public bool BeltCandidate; + // A member of a rosette's ring, which Place puts on one orbit round its bodyless parent. + public bool Ring = false; public List Children = new List(); // Planets orbiting this one are referred to as children public GeneratorPlanet Parent; public float2 FixedPosition; @@ -492,12 +852,10 @@ public class GeneratorPlanet return new[]{this}.Concat(Children.SelectMany(c=>c.AllPlanets())); } - // Create children that fill a single orbit, equally spaced + // Create children that fill a single orbit, equally spaced; Place sets the orbit's radius // https://en.wikipedia.org/wiki/Klemperer_rosette public void ExpandRosette(ref Random random, int vertices) { - //Debug.Log("Expanding Rosette"); - // Rosette children replace the parent, parent orbital node is left empty Empty = true; @@ -507,61 +865,37 @@ public class GeneratorPlanet // Proportion of the masses of sequential pairs is random, but only for even vertex counts var proportion = vertices % 2 == 0 ? random.NextFloat(.5f,.95f) : .5f; - // Place children at a fixed distance in the center of the range - var dist = (ChildDistanceMinimum + ChildDistanceMaximum) / 2; - - // Position of first child - var p0 = new float2(0, dist); - - // Position of second child - var p1 = OrbitData.Evaluate(1.0f / vertices) * dist; - - // Maximum child distance is half the distance to the neighbor minus the neighbor's radius - var p0ChildDist = (distance(p0, p1) * proportion - Settings.PlanetSafetyRadius.Evaluate(sharedMass * (1 - proportion))) * .75f; - var p1ChildDist = (distance(p0, p1) * (1 - proportion) - Settings.PlanetSafetyRadius.Evaluate(sharedMass * proportion)) * .75f; - for (int i = 0; i < vertices; i++) { - var child = new GeneratorPlanet + Children.Add(new GeneratorPlanet { Settings = Settings, Parent = this, Mass = sharedMass * (i % 2 == 0 ? proportion : 1 - proportion), // Masses alternate - Distance = dist, Phase = (float) i / vertices, - ChildDistanceMaximum = (i % 2 == 0 ? p0ChildDist : p1ChildDist) - }; - child.ChildDistanceMinimum = Settings.PlanetSafetyRadius.Evaluate(child.Mass) * 2; - //child.Period = Settings..Evaluate(child.Distance); - Children.Add(child); + Ring = true + }); } - - ChildDistanceMinimum = dist + p0ChildDist; } - // Create children that mimic the distribution of planetary masses in the solar system - public void ExpandSolar(ref Random random, int count, float massMulMin, float massMulMax, float distMulMin, float distMulMax, float jupiterJump, float massFraction) + // Create children that mimic the distribution of planetary masses in the solar system, inside-out in list order; + // Place gives them their distances + public void ExpandSolar(ref Random random, int count, float massMulMin, float massMulMax, float jupiterJump, float massFraction) { - //Debug.Log("Expanding Solar"); - // Expansion is impossible when child space is full - if (count == 0 || ChildDistanceMaximum < ChildDistanceMinimum) + if (count == 0) return; var masses = new float[count]; - var distances = new float[count]; // Accumulate total mass - // Initialize first mass and distance, actual number doesn't matter since total mass will be divided proportionally - float massTotal = distances[0] = masses[0] = 1; + // Initialize first mass, actual number doesn't matter since total mass will be divided proportionally + float massTotal = masses[0] = 1; - // Masses and distances multiply from one planet to the next + // Masses multiply from one planet to the next // Mass typically increases exponentially as you go further out // jupiterJump is an additional mass multiplier applied after half of the planets for (var i = 1; i < count; i++) - { massTotal += masses[i] = masses[i - 1] * random.NextFloat(massMulMin, massMulMax) * (count/2==i ? jupiterJump : 1); - distances[i] = distances[i - 1] * random.NextFloat(distMulMin, distMulMax); - } // Add some randomness to child masses for (var i = 0; i < masses.Length; i++) @@ -571,38 +905,17 @@ public class GeneratorPlanet for (var i = 0; i < count; i++) masses[i] = masses[i] / massTotal * Mass * massFraction; - // Map child distances to range between minimum and maximum - if (count > 1) - { - var oldDistances = (float[]) distances.Clone(); - for (var i = 0; i < count; i++) - distances[i] = lerp(ChildDistanceMinimum, ChildDistanceMaximum, - (oldDistances[i] - oldDistances[0]) / (oldDistances[count - 1] - oldDistances[0])) + Settings.PlanetSafetyRadius.Evaluate(masses[i]); - } - for (var i = 0; i < count; i++) { // Only instantiate children above the mass floor if (masses[i] > Settings.MassFloor) - { - var child = new GeneratorPlanet + Children.Add(new GeneratorPlanet { Settings = Settings, Parent = this, Mass = masses[i], - Distance = distances[i], Phase = random.NextFloat() - }; - //child.Period = Context.GlobalData.OrbitalPeriod(child.Distance); - child.ChildDistanceMinimum = Settings.PlanetSafetyRadius.Evaluate(child.Mass) * 2; - // Maximum child distance of child is the smallest distance to either of its neighbors - child.ChildDistanceMaximum = min(i == 0 ? child.Distance - ChildDistanceMinimum : child.Distance - distances[i - 1], - i < count - 1 ? distances[i + 1] - child.Distance : float.PositiveInfinity); - if (float.IsNaN(child.Distance)) - throw new NotFiniteNumberException($"Planet created with NaN distance, something went very wrong!"); - if (child.ChildDistanceMaximum > child.ChildDistanceMinimum) - Children.Add(child); - } + }); } } } diff --git a/Assets/Scripts/UI/ConsoleView.cs b/Assets/Scripts/UI/ConsoleView.cs index fcde87e29..64e0a4597 100644 --- a/Assets/Scripts/UI/ConsoleView.cs +++ b/Assets/Scripts/UI/ConsoleView.cs @@ -50,7 +50,9 @@ public class ConsoleView : MonoBehaviour { Keyboard.current.onTextInput += c => { - if (!Visible || c == '`') return; + // Text input also delivers control characters (backspace as '\b', enter as '\r'); editing keys are + // handled in Update, so only printable characters are text. + if (!Visible || c == '`' || char.IsControl(c)) return; InputString += c; }; InputString = ""; @@ -81,7 +83,7 @@ public class ConsoleView : MonoBehaviour { if (!Visible) return; - if(keyboard.deleteKey.wasPressedThisFrame && InputString.Length>0) + if((keyboard.backspaceKey.wasPressedThisFrame || keyboard.deleteKey.wasPressedThisFrame) && InputString.Length>0) { InputString = InputString.Substring(0, InputString.Length - 1); } diff --git a/Assets/Scripts/UI/FieldTester.cs b/Assets/Scripts/UI/FieldTester.cs index 0e955e3f5..493b0b60e 100644 --- a/Assets/Scripts/UI/FieldTester.cs +++ b/Assets/Scripts/UI/FieldTester.cs @@ -26,6 +26,10 @@ public class FieldTester : MonoBehaviour public Camera Camera; public FieldDriver TestField; public PropertiesPanel Properties; + // The scene's slow viewing timings for a grab, published as the events' phase durations. + public float GrabExtendTime; + public float GrabEnvelopTime; + public float GrabPullTime; private AetheriaInput _input; private bool _forceThrust; @@ -49,6 +53,14 @@ public class FieldTester : MonoBehaviour private List<(float lerp, float time, Transform transform)> _pickups = new List<(float lerp, float time, Transform transform)>(); + // This scene stands in for the simulation, so it owns its pickup's grab timeline and pose: one grab at a time. + private bool _grabbing; + private int _grabIndex; + private float _grabElapsed; + private float3 _grabStart; + private bool _envelopPublished; + private bool _pullPublished; + private void Start() { _input = new AetheriaInput(); @@ -59,10 +71,7 @@ public class FieldTester : MonoBehaviour if (binder == null) Debug.LogError("FieldTester expects a CapabilityPresentationBinder on TestField's GameObject; no capability events will reach the field."); else - binder.Bind(_capabilityEvents, - grabTargetResolver: handle => handle >= 0 && handle < _pickups.Count ? _pickups[handle].transform : null, - grabInitialVelocityResolver: handle => Vector3.forward * - (PickupTravelDistance / lerp(PickupTravelTimeMin, PickupTravelTimeMax, _pickups[handle].lerp))); + binder.Bind(_capabilityEvents); // Impact absorption (fork L): what used to be FieldDriver's own click handler is now this // scene's stand-in for whatever will eventually detect a hit and publish AbsorbEvent. @@ -73,7 +82,7 @@ public class FieldTester : MonoBehaviour { var damageType = DamageTypeCycle[_nextDamageTypeIndex]; _nextDamageTypeIndex = (_nextDamageTypeIndex + 1) % DamageTypeCycle.Length; - _capabilityEvents.PublishAbsorb(new AbsorbEvent(hit.point.ToCultMath(), ray.direction.ToCultMath(), TestField.TestMagnitude, damageType)); + _capabilityEvents.PublishAbsorb(new AbsorbEvent(hit.point.ToCultMath(), ray.direction.ToCultMath(), TestField.TestMagnitude, damageType, AbsorbLayer.Shield)); }; } @@ -99,12 +108,16 @@ public class FieldTester : MonoBehaviour var click = pickup.GetComponent(); click.OnClick += (collider, data, ray, hit) => { - if (!TestField.CanGrab) return; + if (_grabbing) return; click.Clear(); - var p = _pickups[i1]; - _capabilityEvents.PublishGrab(new GrabEvent(i1, GrabPhase.Started, p.transform.position.ToCultMath(), 0)); - p.transform = null; - _pickups[i1] = p; + _grabbing = true; + _grabIndex = i1; + _grabElapsed = 0; + _envelopPublished = _pullPublished = false; + _grabStart = _pickups[i1].transform.position.ToCultMath(); + var id = new FloatingBodyId((uint) i1); + _capabilityEvents.PublishGrab(new GrabEvent(id, GrabPhase.Started, _grabStart, 0)); + _capabilityEvents.PublishGrab(new GrabEvent(id, GrabPhase.Extend, _grabStart, GrabExtendTime)); }; pickup.ScanLabelContainer.gameObject.SetActive(false); @@ -117,6 +130,45 @@ public class FieldTester : MonoBehaviour } } + // Publishes Envelop and Pull once each at their cumulative boundaries, holds the pickup still until the pull and + // then moves it along the same smoothstep as Zone's held pose, and ends with Completed and the pickup's removal. + private void AdvanceGrab() + { + _grabElapsed += Time.deltaTime; + var id = new FloatingBodyId((uint) _grabIndex); + var pullStart = GrabExtendTime + GrabEnvelopTime; + if (!_envelopPublished && _grabElapsed >= GrabExtendTime) + { + _envelopPublished = true; + _capabilityEvents.PublishGrab(new GrabEvent(id, GrabPhase.Envelop, _grabStart, GrabEnvelopTime)); + } + if (!_pullPublished && _grabElapsed >= pullStart) + { + _pullPublished = true; + _capabilityEvents.PublishGrab(new GrabEvent(id, GrabPhase.Pull, _grabStart, GrabPullTime)); + } + var pickup = _pickups[_grabIndex].transform; + pickup.position = PulledPosition(_grabStart, TestField.transform.position.ToCultMath(), _grabElapsed, + GrabExtendTime, GrabEnvelopTime, GrabPullTime).ToUnity(); + if (_pullPublished && PullProgress(_grabElapsed, GrabExtendTime, GrabEnvelopTime, GrabPullTime) >= 1) + { + _capabilityEvents.PublishGrab(new GrabEvent(id, GrabPhase.Completed, pickup.position.ToCultMath(), 0)); + Destroy(pickup.gameObject); + var p = _pickups[_grabIndex]; + p.transform = null; + _pickups[_grabIndex] = p; + _grabbing = false; + } + } + + // How far along the pull a grab is `elapsed` seconds in: 0 through Extend and Envelop, then 0..1 over the pull. + public static float PullProgress(float elapsed, float extend, float envelop, float pull) => + saturate((elapsed - extend - envelop) / max(pull, 1e-4f)); + + // Where the stand-in sim holds its pickup: still through Extend and Envelop, then along Zone's held-pose curve. + public static float3 PulledPosition(float3 start, float3 holder, float elapsed, float extend, float envelop, float pull) => + lerp(start, holder, Zone.HeldPull(PullProgress(elapsed, extend, envelop, pull))); + private void Update() { var move = _forceThrust ? float2(0,1) : _input.Player.Move.ReadValue().ToCultMath(); @@ -144,10 +196,12 @@ public class FieldTester : MonoBehaviour _capabilityEvents.PublishThrust(new ThrustEvent(_push, min(length(_push), 1), float2(_frontTwist, _rearTwist))); + if (_grabbing) AdvanceGrab(); + for (var i = 0; i < _pickups.Count; i++) { var (l, time, t) = _pickups[i]; - if (t == null) continue; + if (t == null || (_grabbing && i == _grabIndex)) continue; time = frac(time + Time.deltaTime / lerp(PickupTravelTimeMin, PickupTravelTimeMax, l)); t.localScale = Vector3.one * lerp(PickupSizeMin, PickupSizeMax, l) * Zone.PowerPulse(time - .5f, ScaleExponent); t.position = new Vector3(t.position.x, t.position.y, (time - .5f) * PickupTravelDistance); diff --git a/Assets/Scripts/UI/HUD/SchematicDisplay.cs b/Assets/Scripts/UI/HUD/SchematicDisplay.cs index 65c3b1f7f..57f545960 100644 --- a/Assets/Scripts/UI/HUD/SchematicDisplay.cs +++ b/Assets/Scripts/UI/HUD/SchematicDisplay.cs @@ -22,8 +22,6 @@ public class SchematicDisplay : MonoBehaviour public GameObject ShieldIcon; public Image HeatsinkBackground; - public GameObject AetherDriveUi; - public TextMeshProUGUI EnergyLabel; public TextMeshProUGUI CockpitTemperatureLabel; public TextMeshProUGUI RadiatorTemperatureLabel; @@ -32,9 +30,6 @@ public class SchematicDisplay : MonoBehaviour public TextMeshProUGUI VisibilityLabel; public TextMeshProUGUI HullDurabilityLabel; public TextMeshProUGUI DistanceLabel; - public TextMeshProUGUI ForwardRPMLabel; - public TextMeshProUGUI StrafeRPMLabel; - public TextMeshProUGUI TurnRPMLabel; public RectTransform SensorCooldownFill; public RectTransform EnergyFill; @@ -42,9 +37,6 @@ public class SchematicDisplay : MonoBehaviour public RectTransform HeatstrokeMeterFill; public RectTransform HypothermiaMeterFill; public RectTransform HeatstrokeLimitFill; - public RectTransform ForwardRPMFill; - public RectTransform StrafeRPMFill; - public RectTransform TurnRPMFill; private Entity _entity; private EquippableItem _hull; @@ -55,7 +47,6 @@ public class SchematicDisplay : MonoBehaviour private HeatStorage[] _heatStorages; private EquippedCargoBay[] _cargoBays; private SchematicDisplayItem[] _schematicItems; - private AetherDrive _aetherDrive; private bool _enemy; private Entity _player; @@ -67,7 +58,8 @@ public class SchematicDisplay : MonoBehaviour public class SchematicDisplayItem { - public EquippedItem Item; + // The row Entity.SchematicRows derived: which item, which class and which range it shows. + public SchematicRow Row; public SchematicListElement ListElement; public IProgressBehavior Cooldown; // public ItemUsage ItemUsage; @@ -78,20 +70,16 @@ public class SchematicDisplay : MonoBehaviour { _enemy = player != null; _player = player; - if (_schematicItems != null) - foreach (var item in _schematicItems) - { - item.ListElement.GetComponent().ReturnToPool(); - } + ReturnRows(); _entity = entity; + if (VisibilityLabel) + VisibilityLabel.gameObject.SetActive(!_enemy); if (!_enemy) { _cockpit = entity.GetBehavior(); _reactor = entity.GetBehavior(); _capacitors = entity.GetBehaviors().ToArray(); - _aetherDrive = entity.GetBehavior(); - AetherDriveUi.SetActive(_aetherDrive != null); _radiators = entity.GetBehaviors().ToArray(); if (_radiators.Length == 0) @@ -106,21 +94,41 @@ public class SchematicDisplay : MonoBehaviour CargoTemperatureLabel.text = "N/A"; } - _schematicItems = entity.Equipment - .Where(x => x.Behaviors.Any(b => b.Data is WeaponData)) + BuildRows(Rows()); + } + + // Which rows, which class and which range label are Entity.SchematicRows' decision (aetheria-ew, classify-from-belief); + // this display only renders them. + private IEnumerable Rows() => (_player ?? _entity).SchematicRows(_entity); + + private void ReturnRows() + { + if (_schematicItems == null) return; + foreach (var item in _schematicItems) + item.ListElement.GetComponent().ReturnToPool(); + _schematicItems = null; + } + + private void BuildRows(IEnumerable rows) + { + _schematicItems = rows .Select(x => new SchematicDisplayItem { - Item = x, + Row = x, ListElement = ListElementPrototype.Instantiate(), - Cooldown = _enemy ? null : (IProgressBehavior) x.Behaviors.FirstOrDefault(b=> b is IProgressBehavior), + Cooldown = _enemy ? null : (IProgressBehavior) x.Item.Behaviors.FirstOrDefault(b=> b is IProgressBehavior), // ItemUsage = _enemy ? null : (ItemUsage) x.Behaviors.FirstOrDefault(b=> b is ItemUsage), - Weapon = (Weapon) x.Behaviors.FirstOrDefault(b=>b is Weapon) + Weapon = _enemy ? null : (Weapon) x.Item.Behaviors.FirstOrDefault(b=>b is Weapon) }) .ToArray(); foreach (var x in _schematicItems) { - if(x.Item.Data is WeaponItemData weaponItemData) + if (x.Row.Mount != null) + x.ListElement.ShowGear(x.Row.Mount.Type, null); + else if(x.Row.Claimed is WeaponItemData weaponItemData) x.ListElement.ShowWeapon(weaponItemData); + else + x.ListElement.ShowGear(x.Row.Claimed.HardpointType, x.Row.Claimed.Name); //x.ListElement.Label.text = x.Item.EquippableItem.Name; if (!_enemy) { @@ -183,25 +191,28 @@ public class SchematicDisplay : MonoBehaviour EnergyFill.anchorMax = new Vector2(charge / maxCharge, 1); EnergyLabel.text = $"{((int)charge).ToString()}/{((int)maxCharge).ToString()} + ({((int)_reactor.Draw).ToString()})"; } - - if (_aetherDrive != null) - { - ForwardRPMLabel.text = ActionGameManager.PlayerSettings.Format(_aetherDrive.Rpm.x); - ForwardRPMFill.anchorMax = new Vector2(_aetherDrive.Rpm.x / _aetherDrive.MaximumRpm, 1); - - StrafeRPMLabel.text = ActionGameManager.PlayerSettings.Format(_aetherDrive.Rpm.y); - StrafeRPMFill.anchorMax = new Vector2(_aetherDrive.Rpm.y / _aetherDrive.MaximumRpm, 1); - - TurnRPMLabel.text = ActionGameManager.PlayerSettings.Format(_aetherDrive.Rpm.z); - TurnRPMFill.anchorMax = new Vector2(_aetherDrive.Rpm.z / _aetherDrive.MaximumRpm, 1); - } } // else // { // DistanceLabel.text = $"{(int)length(_entity.Position - _player.Position)}"; // } - if(VisibilityLabel) + // A reveal gained or ended after selection changes the rows with no event to hook: rebuild when the + // revealed set differs from the rows' items. + if (_enemy && !Rows().Select(r => r.Key).SequenceEqual(_schematicItems.Select(x => x.Row.Key))) + { + ReturnRows(); + BuildRows(Rows()); + } + + // Cut 2 (docs/fire-control-cut.md): marks whichever row is the player's current aim point. + // Re-checked every frame (not just on ShowShip) because ResolvedAim can drop on its own + // as info decays, with no event to hook. + if (_enemy && _schematicItems != null) + foreach (var x in _schematicItems) + x.ListElement.SetSelected(x.Row.Marks(_player.ResolvedAim)); + + if(VisibilityLabel && !_enemy) VisibilityLabel.text = ((int)_entity.Visibility).ToString(); if(HullDurabilityFill) @@ -217,11 +228,11 @@ public class SchematicDisplay : MonoBehaviour { if (!_enemy) { - var itemData = _entity.ItemManager.GetData(x.Item.EquippableItem); - x.ListElement.HeatFill.anchorMax = new Vector2(unlerp(itemData.MinimumTemperature, itemData.MaximumTemperature, x.Item.Temperature), 0); + var itemData = _entity.ItemManager.GetData(x.Row.Item.EquippableItem); + x.ListElement.HeatFill.anchorMax = new Vector2(unlerp(itemData.MinimumTemperature, itemData.MaximumTemperature, x.Row.Item.Temperature), 0); if (x.Cooldown != null) x.ListElement.CooldownFill.anchorMax = new Vector2(x.Cooldown.Progress, 1); - x.ListElement.DurabilityLabel.text = $"{(int)(x.Item.EquippableItem.Durability / itemData.Durability * 100)}%"; + x.ListElement.DurabilityLabel.text = $"{(int)(x.Row.Item.EquippableItem.Durability / itemData.Durability * 100)}%"; if (x.Weapon.WeaponData.AmmoType.IsSet()) { if(x.Weapon.WeaponData.MagazineSize > 1) @@ -231,10 +242,11 @@ public class SchematicDisplay : MonoBehaviour } } - if (x.Weapon.WeaponData != null) + if (x.ListElement.RangeLabel) { - if(x.ListElement.RangeLabel) - x.ListElement.RangeLabel.text = ((int) x.Weapon.Range).ToString(); + var range = x.Row.Range; + x.ListElement.RangeLabel.gameObject.SetActive(range.HasValue); + if (range.HasValue) x.ListElement.RangeLabel.text = ((int) range.Value).ToString(); } } } diff --git a/Assets/Scripts/UI/HUD/SchematicListElement.cs b/Assets/Scripts/UI/HUD/SchematicListElement.cs index 8b6829379..b42bf4632 100644 --- a/Assets/Scripts/UI/HUD/SchematicListElement.cs +++ b/Assets/Scripts/UI/HUD/SchematicListElement.cs @@ -15,12 +15,65 @@ public class SchematicListElement : MonoBehaviour public RectTransform CooldownFill; public RectTransform HeatFill; + // Cut 2 (docs/fire-control-cut.md): marks this row as the current aim point (Entity.ResolvedAim) + // on an enemy schematic. Unassigned in a prefab that has not been wired up in the Unity editor yet + // (unavailable in this pass) -- SetSelected below is a no-op until then, not a null reference. + public GameObject SelectedIndicator; + private List _iconInstances = new List(); - public void ShowWeapon(WeaponItemData weapon) + // A gear row names its class; created on first use as VisibleTargetIndicator.ShowLabel creates its own (no scene or + // prefab edit) and hidden by every other row kind, because pools are shared. + private TextMeshProUGUI _nameLabel; + + private void ClearIcons() { foreach(var prototype in _iconInstances) prototype.ReturnToPool(); _iconInstances.Clear(); + } + + private void SetName(string name) + { + var show = !string.IsNullOrEmpty(name); + if (_nameLabel == null) + { + if (!show) return; + var child = new GameObject("Name", typeof(RectTransform)); + child.transform.SetParent(transform, false); + _nameLabel = child.AddComponent(); + _nameLabel.fontSize = 14; + _nameLabel.alignment = TextAlignmentOptions.Left; + _nameLabel.raycastTarget = false; + var rect = _nameLabel.rectTransform; + rect.anchorMin = new Vector2(0, 0); + rect.anchorMax = new Vector2(1, 1); + rect.offsetMin = new Vector2(40, 0); + rect.offsetMax = Vector2.zero; + } + _nameLabel.gameObject.SetActive(show); + if (show && _nameLabel.text != name) _nameLabel.text = name; + } + + // A revealed item that is not a weapon: its hardpoint's icon and, when given, its class name. Layout-aim reuses this with + // a null name for mount rows. + public void ShowGear(HardpointType type, string name) + { + ClearIcons(); + var icon = IconPrototype.Instantiate(); + _iconInstances.Add(icon.GetComponent()); + icon.sprite = Settings.GetIcon(type); + SetName(name); + } + + public void SetSelected(bool selected) + { + if (SelectedIndicator != null) SelectedIndicator.SetActive(selected); + } + + public void ShowWeapon(WeaponItemData weapon) + { + ClearIcons(); + SetName(null); var caliberIcon = IconPrototype.Instantiate(); _iconInstances.Add(caliberIcon.GetComponent()); diff --git a/Assets/Scripts/UI/HUD/VisibleTargetIndicator.cs b/Assets/Scripts/UI/HUD/VisibleTargetIndicator.cs index f12220bd7..db512492e 100644 --- a/Assets/Scripts/UI/HUD/VisibleTargetIndicator.cs +++ b/Assets/Scripts/UI/HUD/VisibleTargetIndicator.cs @@ -2,10 +2,35 @@ using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; +using TMPro; public class VisibleTargetIndicator : MonoBehaviour { public RectTransform Transform; public Image Fill; public PlaceUIElementWorldspace Place; + public TextMeshProUGUI Label; + + // Null or empty hides the label; the first non-empty text creates it as a child (no scene or prefab edit) and keeps it. + // Pools are shared, so hide the label before the indicator returns to its pool. + public void ShowLabel(string text) + { + var show = !string.IsNullOrEmpty(text); + if (Label == null) + { + if (!show) return; + var child = new GameObject("Label", typeof(RectTransform)); + child.transform.SetParent(transform, false); + Label = child.AddComponent(); + Label.fontSize = 14; + Label.alignment = TextAlignmentOptions.Top; + Label.raycastTarget = false; + var rect = Label.rectTransform; + rect.anchorMin = rect.anchorMax = new Vector2(.5f, 0); + rect.pivot = new Vector2(.5f, 1); + rect.sizeDelta = new Vector2(200, 24); + } + Label.gameObject.SetActive(show); + if (show && Label.text != text) Label.text = text; + } } diff --git a/Assets/Scripts/UI/MainMenu.cs b/Assets/Scripts/UI/MainMenu.cs index 8ace9b3c3..9eef387ca 100644 --- a/Assets/Scripts/UI/MainMenu.cs +++ b/Assets/Scripts/UI/MainMenu.cs @@ -5,29 +5,25 @@ using System.IO; using System.Linq; using System.Threading; using System.Threading.Tasks; -using MessagePack; using TMPro; using UniRx; using UnityEngine; using UnityEngine.SceneManagement; using UnityEngine.UI; using static CultMath.math; -using float2 = CultMath.float2; -using Random = UnityEngine.Random; public class MainMenu : MonoBehaviour { public VolumeCloudRenderer CloudRenderer; public GameSettings Settings; public ConfirmationDialog Dialog; - public bool InGame; public Prototype PanelPrototype; public float FadeTime = .5f; public float FadeDistance = 512; public float FadeAlphaExponent = 2; public float FadePositionExponent = 2; - private (PropertiesPanel panel, CanvasGroup group) _currentMenu, _nextMenu; + private (PropertiesPanel panel, CanvasGroup group, PropertiesPanel detail) _currentMenu, _nextMenu; private bool _fadeFromRight; private float _fadeLerp; private bool _fading; @@ -42,10 +38,14 @@ public class MainMenu : MonoBehaviour _panelPosition = PanelPrototype.transform.position; var panel1 = PanelPrototype.Instantiate(); - _currentMenu = (panel1, panel1.GetComponent()); + var detail1 = PanelPrototype.Instantiate(); + ScenarioPicker.Dock(detail1, panel1); + _currentMenu = (panel1, panel1.GetComponent(), detail1); var panel2 = PanelPrototype.Instantiate(); - _nextMenu = (panel2, panel2.GetComponent()); + var detail2 = PanelPrototype.Instantiate(); + ScenarioPicker.Dock(detail2, panel2); + _nextMenu = (panel2, panel2.GetComponent(), detail2); _currentMenu.panel.gameObject.SetActive(false); //_saveDirectory = ActionGameManager.GameDataDirectory.CreateSubdirectory("Saves"); @@ -78,7 +78,7 @@ public class MainMenu : MonoBehaviour } } - private string TitleSubtitle(string title, string subtitle) => $"{title}\n{subtitle}"; + public static string TitleSubtitle(string title, string subtitle) => $"{title}\n{subtitle}"; private void Fade(bool fromRight) { @@ -89,90 +89,46 @@ public class MainMenu : MonoBehaviour _fadeFromRight = fromRight; } - private void ShowMain() + private static bool _exclusionsShown; + + // Starts the next screen on an empty panel with a title and its scenario detail pane hidden and empty. + private void Next(string title) { _nextMenu.panel.Clear(); - _nextMenu.panel.Title.text = TitleSubtitle("aetheria", "terminus"); - if (!InGame) + _nextMenu.panel.Title.text = title; + _nextMenu.detail.Clear(); + _nextMenu.detail.gameObject.SetActive(false); + } + + private void ShowMain() + { + Next(TitleSubtitle("aetheria", "terminus")); + if (ActionGameManager.CurrentGalaxy == null) { - // A run exists only as the run store's SavedGame global. + // No run is live: at the title, after death, or after a new run failed to start. A saved run exists only as + // the run store's SavedGame global. var cache = ActionGameManager.CultCache; + if (ActionGameManager.ModExclusions.Length > 0 && !_exclusionsShown) + { + _exclusionsShown = true; + RefuseMods("Some mods were not loaded", ActionGameManager.ModExclusions); + } var saved = cache.GetGlobal(); if (saved == null && cache.AllStoredDocuments.Any(stored => RunSave.IsRunRecord(stored.Descriptor.DocumentType))) Debug.Log("run store has no SavedGame; Continue disabled"); _nextMenu.panel.AddButton("Continue", saved == null ? (Action) null : () => { - ActionGameManager.IsTutorial = saved.IsTutorial; + try { RunSave.RequireDesigns(cache, saved); } + catch (InvalidOperationException error) { Refuse("Cannot continue this run", error.Message); return; } ActionGameManager.CurrentGalaxy = new Galaxy(cache, saved, Debug.Log); - SceneManager.LoadScene("ARPG"); + EnterGame(); }); } _nextMenu.panel.AddButton("New Game", () => { - RunSave.Clear(ActionGameManager.CultCache); - var generatorState = "Loading Database Contents"; - Action setState = s => generatorState = s; - + ShowScenarios(); Fade(true); - _nextMenu.panel.gameObject.SetActive(false); - Dialog.Clear(); - Dialog.Title.text = "Generating Galaxy"; - Dialog.AddProperty(() => generatorState); - Dialog.Show(); - - if (ActionGameManager.PlayerSettings.TutorialPassed) - { - var backgroundSettings = MessagePackSerializer.Deserialize( - MessagePackSerializer.Serialize(Settings.SectorBackgroundSettings)); - backgroundSettings.NoisePosition = Random.value * 1000; - ActionGameManager.IsTutorial = false; - Task.Run(() => - { - var sector = new Galaxy( - Settings.SectorGenerationSettings, - backgroundSettings, - Settings.NameGeneratorSettings, - ActionGameManager.CultCache, - Debug.Log, - setState); - Observable.NextFrame().Subscribe(_ => - { - ActionGameManager.CurrentGalaxy = sector; - SceneManager.LoadScene("ARPG"); - }); - }).ContinueWith(t => Debug.LogException(t.Exception), TaskContinuationOptions.OnlyOnFaulted); - } - else - { - var backgroundSettings = MessagePackSerializer.Deserialize( - MessagePackSerializer.Serialize(Settings.TutorialBackgroundSettings)); - int iteration = 1; - do - { - backgroundSettings.NoisePosition = Random.value * 1000; - setState($"Finding Galaxy Position: iteration {iteration++}"); - } while (backgroundSettings.CloudDensity(float2(0.5f)) < .5f); - - ActionGameManager.IsTutorial = true; - Task.Run(() => - { - var sector = new Galaxy( - Settings.TutorialGenerationSettings, - backgroundSettings, - Settings.NameGeneratorSettings, - ActionGameManager.CultCache, - ActionGameManager.PlayerSettings, - ActionGameManager.GameDataDirectory.CreateSubdirectory("Narrative"), - Debug.Log, - setState); - Observable.NextFrame().Subscribe(_ => - { - ActionGameManager.CurrentGalaxy = sector; - SceneManager.LoadScene("ARPG"); - }); - }).ContinueWith(t => Debug.LogException(t.Exception), TaskContinuationOptions.OnlyOnFaulted); - } }); _nextMenu.panel.AddButton("Settings", () => @@ -183,10 +139,130 @@ public class MainMenu : MonoBehaviour _nextMenu.panel.AddButton("Quit", Application.Quit); } + // New Game: every way to set up a run, each with its brief. A release build lists only the modes; the other ways + // to set up a run and the test arenas are listed only in editor and development builds. + private void ShowScenarios() + { + Next(TitleSubtitle("new game", "scenarios")); + var groups = new List<(string label, Scenario[] scenarios)> { ("modes", Scenarios.Modes) }; + if (Debug.isDebugBuild) + { + groups.Add(("development", Scenarios.Development)); + groups.Add(("test arenas", Scenarios.Tests)); + } + ScenarioPicker.Show(_nextMenu.panel, _nextMenu.detail, groups, Launch, () => + { + ShowMain(); + Fade(false); + }, Dialog.Confirm); + } + + // The only way into a new run: generates the scenario's galaxy off the main thread and enters the game, where + // StartGame has RunStart stage it and only then replaces the saved run. A galaxy that cannot generate is refused + // here, with the saved run untouched. + private void Launch(Scenario scenario) + { + var generatorState = "Loading Database Contents"; + + Fade(true); + _nextMenu.panel.gameObject.SetActive(false); + Dialog.Clear(); + Dialog.Title.text = "Generating Galaxy"; + Dialog.AddProperty(() => generatorState); + Dialog.Show(); + + var stage = new GalaxyStage( + Settings.SectorGenerationSettings, + Settings.SectorBackgroundSettings, + Settings.TutorialGenerationSettings, + Settings.TutorialBackgroundSettings, + ActionGameManager.CultCache, + ActionGameManager.PlayerSettings, + ActionGameManager.GameDataDirectory.CreateSubdirectory("Narrative"), + Debug.Log, + state => generatorState = state); + Task.Run(() => RunStart.Generate(scenario, stage)).ContinueWith(generation => + Observable.NextFrame().Subscribe(_ => + { + if (generation.IsFaulted) + { + Debug.LogException(generation.Exception); + ShowMain(); + Fade(false); + Refuse($"{scenario.Name} could not generate its galaxy", generation.Exception.GetBaseException().Message); + return; + } + ActionGameManager.CurrentGalaxy = generation.Result; + ActionGameManager.PendingScenario = scenario; + EnterGame(); + })); + } + + // The one way into the game scene. Mod ship prototypes import asynchronously at boot, so the scene waits for them, + // and a preload that could not run at all stops here with its reason rather than in the first zone. + private void EnterGame() => StartCoroutine(EnterGameWhenModShipsAreReady()); + + private IEnumerator EnterGameWhenModShipsAreReady() + { + var loading = ShipModShips.Loading; + while (!loading.IsCompleted) yield return null; + if (loading.IsFaulted) + { + if (loading.Exception.GetBaseException() is ShipModShips.ImportFault fault) RefuseMods("Mod ships failed to load", fault.Faults); + else Refuse("Mod ships failed to load", loading.Exception.GetBaseException().Message); + yield break; + } + SceneManager.LoadScene("ARPG"); + } + + public void Refuse(string title, string reason) + { + Debug.LogError($"{title}: {reason}"); + Dialog.Clear(); + Dialog.Title.text = title; + Dialog.AddProperty(() => reason); + Dialog.Show(onCancel: () => { }, cancelText: "OK"); + } + + // Refuse for faults that name mod packages: each distinct package gets a Remove button, the one RemovePackage. The catalog + // stays as this boot opened it, so the dialog says that removal takes effect at the next launch. + private readonly HashSet _removedPackages = new(); + + public void RefuseMods(string title, ShipModCatalog.Exclusion[] faults) + { + // A package moved aside this session stays named but loses its button: this boot's catalog still holds it. + var open = faults.Where(fault => !_removedPackages.Contains(fault.Package)).ToArray(); + var reason = string.Join("\n", faults.Select(fault => fault.ToString())); + Debug.LogError($"{title}: {reason}"); + Dialog.Clear(); + Dialog.Title.text = title; + Dialog.AddProperty(() => reason); + foreach (var package in open.Select(fault => fault.Package).Where(package => package != "(all mods)").Distinct()) + Dialog.AddButton($"Remove {package}", () => Remove(title, faults, package)); + Dialog.Show(onCancel: () => { }, cancelText: "OK"); + } + + private void Remove(string title, ShipModCatalog.Exclusion[] faults, string package) + { + string destination; + try { destination = ShipModCatalog.RemovePackage(ActionGameManager.ModsPath, package); } + catch (Exception error) + { + Refuse($"Could not remove {package}", $"{error.Message} Remove it by hand from {ActionGameManager.ModsPath}."); + return; + } + _removedPackages.Add(package); + var done = $"{package} moved to {destination}. Mods load at launch: restart Aetheria to play without it, or move it back into Mods to reinstall."; + Debug.Log(done); + Dialog.Clear(); + Dialog.Title.text = $"Removed {package}"; + Dialog.AddProperty(() => done); + Dialog.Show(onConfirm: Application.Quit, onCancel: () => { if (faults.Any(fault => fault.Package != "(all mods)" && !_removedPackages.Contains(fault.Package))) RefuseMods(title, faults); }, confirmText: "Quit", cancelText: "OK"); + } + private void ShowSettings() { - _nextMenu.panel.Clear(); - _nextMenu.panel.Title.text = "settings"; + Next("settings"); _nextMenu.panel.AddButton("Gameplay", () => { @@ -221,8 +297,7 @@ public class MainMenu : MonoBehaviour private void ShowGameplaySettings() { - _nextMenu.panel.Clear(); - _nextMenu.panel.Title.text = TitleSubtitle("gameplay", "settings"); + Next(TitleSubtitle("gameplay", "settings")); _nextMenu.panel.AddField("Name", () => ActionGameManager.PlayerSettings.Name, s => ActionGameManager.PlayerSettings.Name = s); @@ -244,8 +319,7 @@ public class MainMenu : MonoBehaviour private void ShowGraphicsSettings() { - _nextMenu.panel.Clear(); - _nextMenu.panel.Title.text = TitleSubtitle("graphics", "settings"); + Next(TitleSubtitle("graphics", "settings")); _nextMenu.panel.AddField("Nebula Quality", () => (int)ActionGameManager.PlayerSettings.GraphicsSettings.NebulaQuality, i => @@ -254,12 +328,14 @@ public class MainMenu : MonoBehaviour CloudRenderer.quality = ActionGameManager.PlayerSettings.GraphicsSettings.NebulaQuality; }, Enum.GetNames(typeof(Quality))); - _nextMenu.panel.AddField("Show Asteroids in Minimap", - () => ActionGameManager.PlayerSettings.GraphicsSettings.ShowAsteroidsInMinimap, - b => ActionGameManager.PlayerSettings.GraphicsSettings.ShowAsteroidsInMinimap = b); + _nextMenu.panel.AddField("Screen Shake", + () => ActionGameManager.PlayerSettings.GraphicsSettings.ScreenShake, + f => ActionGameManager.PlayerSettings.GraphicsSettings.ScreenShake = f, + 0, 1); _nextMenu.panel.AddButton("Back", () => { + ActionGameManager.SavePlayerSettings(); ShowSettings(); Fade(false); }); @@ -267,8 +343,7 @@ public class MainMenu : MonoBehaviour private void ShowInputSettings() { - _nextMenu.panel.Clear(); - _nextMenu.panel.Title.text = TitleSubtitle("input", "settings"); + Next(TitleSubtitle("input", "settings")); _nextMenu.panel.AddButton("Back", () => { @@ -279,8 +354,7 @@ public class MainMenu : MonoBehaviour private void ShowAudioSettings() { - _nextMenu.panel.Clear(); - _nextMenu.panel.Title.text = TitleSubtitle("audio", "settings"); + Next(TitleSubtitle("audio", "settings")); _nextMenu.panel.AddButton("Back", () => { diff --git a/Assets/Scripts/UI/Menu/MapRenderer.cs b/Assets/Scripts/UI/Menu/MapRenderer.cs index e8b1d49bb..d6e585872 100644 --- a/Assets/Scripts/UI/Menu/MapRenderer.cs +++ b/Assets/Scripts/UI/Menu/MapRenderer.cs @@ -51,10 +51,7 @@ public class MapRenderer : MonoBehaviour TintCamera.gameObject.SetActive(true); InfluenceCamera.gameObject.SetActive(true); Title.text = $"Zone: {GameManager.Zone.GalaxyZone.Name}"; - - // If hiding minimap asteroids, turn them back on for the map screen - if (!ActionGameManager.PlayerSettings.GraphicsSettings.ShowAsteroidsInMinimap) - ZoneRenderer.ShowAsteroidUI = true; + GameManager.ZoneRenderer.Map.OpenMapScreen(true); } private void OnDisable() @@ -67,10 +64,7 @@ public class MapRenderer : MonoBehaviour GravityCamera.gameObject.SetActive(false); TintCamera.gameObject.SetActive(false); InfluenceCamera.gameObject.SetActive(false); - - // If hiding minimap asteroids, turn them back off when leaving the map screen - if (!ActionGameManager.PlayerSettings.GraphicsSettings.ShowAsteroidsInMinimap) - ZoneRenderer.ShowAsteroidUI = false; + GameManager.ZoneRenderer.Map.OpenMapScreen(false); } void ReleaseTextures() @@ -129,6 +123,6 @@ public class MapRenderer : MonoBehaviour InfluenceCamera.transform.position = pos; InfluenceCamera.orthographicSize = _size.y * Scale * .5f; - GameManager.ZoneRenderer.SetIconSize(IconSize * Scale); + GameManager.ZoneRenderer.Map.SetMapScreenScale(IconSize * Scale); } } diff --git a/Assets/Scripts/UI/Menu/TradeMenu.cs b/Assets/Scripts/UI/Menu/TradeMenu.cs index 9bc285b75..13345f88a 100644 --- a/Assets/Scripts/UI/Menu/TradeMenu.cs +++ b/Assets/Scripts/UI/Menu/TradeMenu.cs @@ -3,7 +3,6 @@ using System.Collections; using System.Collections.Generic; using System.Linq; using System.Reflection; -using System.Runtime.Remoting.Contexts; using TMPro; using UnityEngine; using UnityEngine.UI; @@ -26,9 +25,9 @@ public class TradeMenu : MonoBehaviour public TextMeshProUGUI CreditsLabel; private EquippedCargoBay _targetCargo; + // False lists the station's wares to buy; true lists the selected bay's goods to sell. + private bool _selling; private (ItemFilter filter, HardpointType type) _hardpointFilter; - private (ItemFilter filter, SimpleCommodityCategory type) _commodityFilter; - private (ItemFilter filter, CompoundCommodityCategory type) _compoundCommodityFilter; private List<(ItemFilter filter, Type type)> _behaviorFilters = new List<(ItemFilter filter, Type type)>(); public EquippedCargoBay Inventory { get; set; } @@ -37,6 +36,7 @@ public class TradeMenu : MonoBehaviour { if (GameManager.DockedEntity == null) return; _targetCargo = GameManager.DockingBay; + _selling = false; TargetCargoLabel.text = "Docking Bay"; Properties.GameManager = GameManager; UpdateCreditsLabel(); @@ -60,14 +60,6 @@ public class TradeMenu : MonoBehaviour if (_hardpointFilter.filter != null) hardpointTypes = hardpointTypes.Where(x => x != _hardpointFilter.type); - IEnumerable commodityTypes = (SimpleCommodityCategory[]) Enum.GetValues(typeof(SimpleCommodityCategory)); - if (_commodityFilter.filter != null) - commodityTypes = commodityTypes.Where(x => x != _commodityFilter.type); - - IEnumerable compoundCommodityTypes = (CompoundCommodityCategory[]) Enum.GetValues(typeof(CompoundCommodityCategory)); - if (_compoundCommodityFilter.filter != null) - compoundCommodityTypes = compoundCommodityTypes.Where(x => x != _compoundCommodityFilter.type); - ContextMenu.AddDropdown("Gear Type", hardpointTypes .Select(x => (Enum.GetName(typeof(HardpointType), x), () => { @@ -80,75 +72,10 @@ public class TradeMenu : MonoBehaviour Populate(); }; } - if(_commodityFilter.filter) - { - _commodityFilter.filter.GetComponent().ReturnToPool(); - _commodityFilter.filter = null; - } - if(_compoundCommodityFilter.filter) - { - _compoundCommodityFilter.filter.GetComponent().ReturnToPool(); - _compoundCommodityFilter.filter = null; - } - _hardpointFilter.filter.Label.text = $"Hardpoint: {Enum.GetName(typeof(HardpointType), x)}"; _hardpointFilter.type = x; Populate(); }, true))); - ContextMenu.AddDropdown("Simple Commodity", commodityTypes - .Select(x => (Enum.GetName(typeof(SimpleCommodityCategory), x), () => - { - if (!_commodityFilter.filter) - { - _commodityFilter.filter = FilterPrototype.Instantiate(); - _commodityFilter.filter.OnDisable += () => - { - _commodityFilter.filter = null; - Populate(); - }; - } - if(_hardpointFilter.filter) - { - _hardpointFilter.filter.GetComponent().ReturnToPool(); - _hardpointFilter.filter = null; - } - if(_compoundCommodityFilter.filter) - { - _compoundCommodityFilter.filter.GetComponent().ReturnToPool(); - _compoundCommodityFilter.filter = null; - } - - _commodityFilter.filter.Label.text = $"Hardpoint: {Enum.GetName(typeof(SimpleCommodityCategory), x)}"; - _commodityFilter.type = x; - Populate(); - }, true))); - ContextMenu.AddDropdown("Compound Commodity", compoundCommodityTypes - .Select(x => (Enum.GetName(typeof(CompoundCommodityCategory), x), () => - { - if (!_compoundCommodityFilter.filter) - { - _compoundCommodityFilter.filter = FilterPrototype.Instantiate(); - _compoundCommodityFilter.filter.OnDisable += () => - { - _compoundCommodityFilter.filter = null; - Populate(); - }; - } - if(_hardpointFilter.filter) - { - _hardpointFilter.filter.GetComponent().ReturnToPool(); - _hardpointFilter.filter = null; - } - if(_commodityFilter.filter) - { - _commodityFilter.filter.GetComponent().ReturnToPool(); - _commodityFilter.filter = null; - } - - _compoundCommodityFilter.filter.Label.text = $"Hardpoint: {Enum.GetName(typeof(CompoundCommodityCategory), x)}"; - _compoundCommodityFilter.type = x; - Populate(); - }, true))); ContextMenu.AddDropdown("Item Behavior", typeof(BehaviorData).GetAllChildClasses() .Where(x=> x.GetCustomAttribute() != null && _behaviorFilters.All(f => f.type != x)) .Select(x=> (x.Name.FormatTypeName(), () => @@ -186,42 +113,39 @@ public class TradeMenu : MonoBehaviour void Populate() { - var columns = new List<(string name, int size, Func<(ItemInstance item, ItemData data), Func> output, Func sortKey)>(); + var columns = new List<(string name, int size, Func<(ItemInstance item, ItemData data), Func> output, Func<(ItemInstance item, ItemData data), IComparable> sortKey)>(); columns.Add(("Name", 3, x => () => x.item is CraftedItemInstance craftedItemInstance ? - $"{x.data.Name}" : - x.data.Name, - data => data.Name)); + $"{GameManager.ItemManager.Title(x.item)}" : + GameManager.ItemManager.Title(x.item), + x => GameManager.ItemManager.Title(x.item))); if(_hardpointFilter.filter==null) columns.Add(("Type", 2, x => () => { - if (x.data is SimpleCommodityData s) return Enum.GetName(typeof(SimpleCommodityCategory), s.Category); - if(x.data is CompoundCommodityData c) return Enum.GetName(typeof(CompoundCommodityCategory), c.Category); + if (x.data is SimpleCommodityData || x.data is CompoundCommodityData) return "Commodity"; if(x.data is EquippableItemData e) return Enum.GetName(typeof(HardpointType), e.HardpointType); return "None"; }, - data => + x => { - if (data is SimpleCommodityData s) return (int) s.Category; - var offset = Enum.GetValues(typeof(SimpleCommodityCategory)).Length; - if(data is CompoundCommodityData c) return (int) c.Category + offset; - offset += Enum.GetValues(typeof(CompoundCommodityCategory)).Length; - if(data is EquippableItemData e) return (int) e.HardpointType + offset; + var data = x.data; + if (data is SimpleCommodityData || data is CompoundCommodityData) return 0; + if (data is EquippableItemData e) return 1 + (int) e.HardpointType; return 0; })); columns.Add(("Mass", 1, x => () => ActionGameManager.PlayerSettings.Format(x.data.Mass), - data => data.Mass)); + x => x.data.Mass)); columns.Add(("Price", 1, - x => () => (x.item is CraftedItemInstance craftedItemInstance ? GameManager.ItemManager.GetPrice(craftedItemInstance) : x.data.Price).ToString("N0"), - data => data.Price)); + x => () => ShownPrice(x.item).ToString("N0"), + x => ShownPrice(x.item))); columns.Add(("Size", 1, x => () => $"{x.data.Shape.Width}x{x.data.Shape.Height}", - data => data.Shape.Width*data.Shape.Height)); + x => x.data.Shape.Width*x.data.Shape.Height)); - var items = Inventory.Cargo.Keys + var items = (_selling ? _targetCargo : Inventory).Cargo.Keys .Select(ii=>(ii, GameManager.ItemManager.GetData(ii))); if (MinimumSizeFilter.gameObject.activeSelf) @@ -234,12 +158,6 @@ public class TradeMenu : MonoBehaviour !(MaximumSizeFilter.Width.text.Length > 0 && i.data.Shape.Width > int.Parse(MaximumSizeFilter.Width.text) || MaximumSizeFilter.Height.text.Length > 0 && i.data.Shape.Height > int.Parse(MaximumSizeFilter.Height.text))); - if(_commodityFilter.filter != null) - items = items.Where(i => i.data is SimpleCommodityData s && s.Category == _commodityFilter.type); - - if(_compoundCommodityFilter.filter != null) - items = items.Where(i => i.data is CompoundCommodityData c && c.Category == _compoundCommodityFilter.type); - if (_hardpointFilter.filter != null) items = items.Where(i => i.data is EquippableItemData e && e.HardpointType == _hardpointFilter.type); @@ -255,8 +173,9 @@ public class TradeMenu : MonoBehaviour { var behavior = ((EquippableItemData) x.data).Behaviors.FirstOrDefault(b => type.IsInstanceOfType(b)); return () => ActionGameManager.PlayerSettings.Format((float) field.GetValue(behavior)); - }, data => + }, x => { + var data = x.data; var behavior = ((EquippableItemData) data).Behaviors.FirstOrDefault(b => type.IsInstanceOfType(b)); return (float) field.GetValue(behavior); })); @@ -265,8 +184,9 @@ public class TradeMenu : MonoBehaviour { var behavior = ((EquippableItemData) x.data).Behaviors.FirstOrDefault(b => type.IsInstanceOfType(b)); return () => ((int) field.GetValue(behavior)).ToString(); - }, data => + }, x => { + var data = x.data; var behavior = ((EquippableItemData) data).Behaviors.FirstOrDefault(b => type.IsInstanceOfType(b)); return (int) field.GetValue(behavior); })); @@ -276,8 +196,9 @@ public class TradeMenu : MonoBehaviour { var behavior = ((EquippableItemData) x.data).Behaviors.FirstOrDefault(b => type.IsInstanceOfType(b)); return () => ActionGameManager.PlayerSettings.Format(((PerformanceStat) field.GetValue(behavior)).Max); - }, data => + }, x => { + var data = x.data; var behavior = ((EquippableItemData) data).Behaviors.FirstOrDefault(b => type.IsInstanceOfType(b)); return ((PerformanceStat) field.GetValue(behavior)).Max; })); @@ -294,8 +215,9 @@ public class TradeMenu : MonoBehaviour return (_targetCargo.ItemsOfType.ContainsKey(GameManager.ItemManager.ItemData.RefOf(x.data).Key) ? _targetCargo.ItemsOfType[GameManager.ItemManager.ItemData.RefOf(x.data).Key].Cast().Sum(s=>s.Quantity) : 0).ToString(); return (_targetCargo.ItemsOfType.ContainsKey(GameManager.ItemManager.ItemData.RefOf(x.data).Key) ? _targetCargo.ItemsOfType[GameManager.ItemManager.ItemData.RefOf(x.data).Key].Count : 0).ToString(); }, - data => + x => { + var data = x.data; if (data is HullData) return GameManager.DockedEntity.Children.Count(s => s.Hull.Data.Key.Equals(GameManager.ItemManager.ItemData.RefOf(data).Key) && s is Ship {IsPlayerShip: true}); if(data is SimpleCommodityData) @@ -311,11 +233,12 @@ public class TradeMenu : MonoBehaviour Columns = columns.Select(x => new SpreadsheetEntryColumn { Output = x.output(i), - SortKey = x.sortKey(i.data) + SortKey = x.sortKey(i) }).ToArray(), OnClick = () => Properties.Inspect(i.item), OnDoubleClick = () => { + if (_selling) return; switch (i.item) { case CraftedItemInstance c: @@ -330,7 +253,13 @@ public class TradeMenu : MonoBehaviour }, OnRightClick = () => { - if (i.item is SimpleCommodity s) + if (_selling) + { + ContextMenu.Clear(); + ContextMenu.AddOption($"Sell ({StationServices.SellPrice(GameManager.ItemManager, i.item):N0})", () => Sell(i.item)); + ContextMenu.Show(); + } + else if (i.item is SimpleCommodity s) { ContextMenu.Clear(); ContextMenu.AddOption("Buy Quantity", @@ -338,10 +267,10 @@ public class TradeMenu : MonoBehaviour { int quantity = 1; Dialog.Clear(); - Dialog.Title.text = $"Buying {i.data.Name}"; + Dialog.Title.text = $"Buying {GameManager.ItemManager.Title(i.item)}"; Dialog.AddField("Quantity", () => quantity, - q => quantity = min(min(q, GameManager.Credits / i.data.Price), s.Quantity)); + q => quantity = StationServices.BuyableQuantity(GameManager.ItemManager, s, q, GameManager.Credits)); Dialog.Show(() => { Buy(s,quantity); @@ -356,6 +285,11 @@ public class TradeMenu : MonoBehaviour })); } + // The price the list shows and sorts by: what the station pays for the player's goods, what it charges otherwise. + private int ShownPrice(ItemInstance item) => _selling + ? StationServices.SellPrice(GameManager.ItemManager, item) + : StationServices.BuyPrice(GameManager.ItemManager, item); + private void UpdateCreditsLabel() { if (CreditsLabel != null) @@ -364,83 +298,70 @@ public class TradeMenu : MonoBehaviour } } + private void Sell(ItemInstance item) + { + if (StationServices.TrySell(_targetCargo, GameManager.DockedEntity, item, ref GameManager.Credits)) + { + UpdateCreditsLabel(); + Populate(); + return; + } + Dialog.Clear(); + Dialog.Title.text = "Unable to sell: Station Cargo Full!"; + Dialog.Show(); + Dialog.MoveToCursor(); + } + + private void Repair() + { + if (StationServices.TryRepair(GameManager.CurrentEntity, ref GameManager.Credits)) + { + UpdateCreditsLabel(); + return; + } + Dialog.Clear(); + Dialog.Title.text = "Unable to repair: Insufficient Credits!"; + Dialog.Show(); + Dialog.MoveToCursor(); + } + private void Buy(CraftedItemInstance item) { var data = GameManager.ItemManager.GetData(item); - var price = GameManager.ItemManager.GetPrice(item); - if (price < GameManager.Credits) + if (data is HullData hullData && hullData.HullType != HullType.Ship) + throw new ArgumentException("Attempted to buy non-ship hull from station, WTF are you doing?!"); + Bought(StationServices.TryBuy(GameManager.ItemManager, item, 1, ref GameManager.Credits, () => { - if (data is HullData hullData) + if (data is HullData) { - if (hullData.HullType != HullType.Ship) throw new ArgumentException("Attempted to buy non-ship hull from station, WTF are you doing?!"); - - var ship = new Ship(GameManager.ItemManager, GameManager.Zone, item as EquippableItem, GameManager.ItemManager.GameplaySettings.DefaultEntitySettings) { IsPlayerShip = true }; - ship.SetParent(GameManager.DockedEntity); - - GameManager.Credits -= data.Price; - UpdateCreditsLabel(); + GameManager.CommissionShip(item as EquippableItem); + return true; } - else if (Inventory.TryTransferItem(_targetCargo, item)) - { - GameManager.Credits -= price; - UpdateCreditsLabel(); - } - else - { - Dialog.Clear(); - Dialog.Title.text = "Unable to buy: Insufficient Cargo Space!"; - Dialog.Show(); - Dialog.MoveToCursor(); - return; - } - } - else - { - Dialog.Clear(); - Dialog.Title.text = "Unable to buy: Insufficient Credits!"; - Dialog.Show(); - Dialog.MoveToCursor(); - return; - } + return Inventory.TryTransferItem(_targetCargo, item); + })); } private void Buy(SimpleCommodity simpleCommodity, int quantity) { - var data = GameManager.ItemManager.GetData(simpleCommodity); - // Up-rounded integer division from https://stackoverflow.com/a/503201 - int lots = (quantity - 1) / data.MaxStack + 1; - int remaining = quantity; - for (int i = 0; i < lots; i++) - { - int q = min(remaining, data.MaxStack); - if (q * data.Price < GameManager.Credits) - { - if (Inventory.TryTransferItem(_targetCargo, simpleCommodity, quantity)) - { - GameManager.Credits -= q * data.Price; - UpdateCreditsLabel(); - remaining -= q; - } - else - { - Dialog.Clear(); - Dialog.Title.text = "Unable to buy: Insufficient Cargo Space!"; - Dialog.Show(); - Dialog.MoveToCursor(); - return; - } - } - else - { - Dialog.Clear(); - Dialog.Title.text = "Unable to buy: Insufficient Credits!"; - Dialog.Show(); - Dialog.MoveToCursor(); - return; - } + Bought(StationServices.TryBuyLots(GameManager.ItemManager, simpleCommodity, quantity, ref GameManager.Credits, + lot => Inventory.TryTransferItem(_targetCargo, simpleCommodity, lot))); + } - + // Refreshes the credits after a purchase, or tells the player why the station refused it. + private bool Bought(BuyResult result) + { + if (result == BuyResult.Bought) + { + UpdateCreditsLabel(); + return true; } + Dialog.Clear(); + Dialog.Title.text = result == BuyResult.NoRoom + ? "Unable to buy: Insufficient Cargo Space!" + : "Unable to buy: Insufficient Credits!"; + Dialog.Show(); + Dialog.MoveToCursor(); + return false; } void Start() @@ -470,6 +391,13 @@ public class TradeMenu : MonoBehaviour } } } + ContextMenu.AddOption(_selling ? "Buy Goods" : "Sell Goods", () => + { + _selling = !_selling; + Populate(); + }); + var repairCost = StationServices.RepairCost(GameManager.ItemManager, GameManager.CurrentEntity); + if (repairCost > 0) ContextMenu.AddOption($"Repair ({repairCost:N0})", Repair); ContextMenu.Show(); }); } diff --git a/Assets/Scripts/UI/Properties Panel/CurveField.cs b/Assets/Scripts/UI/Properties Panel/CurveField.cs index 48c992890..d2e8b43e0 100644 --- a/Assets/Scripts/UI/Properties Panel/CurveField.cs +++ b/Assets/Scripts/UI/Properties Panel/CurveField.cs @@ -20,8 +20,7 @@ public class CurveField : MonoBehaviour public Image CurrentX; public Image CurrentY; - private BezierCurve _curve; - //private Func _xFunc; + private Func _y; public void SetCurrent(float x) { @@ -29,46 +28,33 @@ public class CurveField : MonoBehaviour CurrentY.gameObject.SetActive(true); var xrect = CurrentX.GetComponent(); var yrect = CurrentY.GetComponent(); - var y = _curve.Evaluate(x); + var y = _y(x); xrect.anchorMin = new Vector2(x, 0); xrect.anchorMax = new Vector2(x, y); yrect.anchorMin = new Vector2(x, y); yrect.anchorMax = new Vector2(x, y); } - public void Show(string label, BezierCurve curve, Func xFunc, bool showMax = false) + // Segments + 1 uniform samples of y over [0, 1], labelled by xFunc; the middle label sits at midX. + public void Show(string label, Func y, Func xFunc, float midX = .5f) { - _curve = curve; - //_xFunc = xFunc; + _y = y; CurrentX.gameObject.SetActive(false); CurrentY.gameObject.SetActive(false); Title.text = label; var points = new List(); - var keys = curve.Keys.Select(v => new Vector2(v.x, v.y)); - if (curve.Keys[0].x > .01f) keys = keys.Prepend(new Vector2(0, curve.Keys[0].y)); - if (curve.Keys[curve.Keys.Length-1].x < .99f) keys = keys.Append(new Vector2(1, curve.Keys[curve.Keys.Length-1].y)); - var keysArray = keys.ToArray(); - for (int i = 0; i < keysArray.Length - 1; i++) + for (int j = 0; j <= Segments; j++) { - for (int j = 0; j < Segments; j++) - { - var x = lerp(keysArray[i].x, keysArray[i + 1].x, (float) j / Segments); - points.Add(new Vector2(x, curve.Evaluate(x))); - } + var x = (float) j / Segments; + points.Add(new Vector2(x, y(x))); } - points.Add(new Vector2(1, curve.Evaluate(1))); Line.Points = points.ToArray(); MinLabel.text = xFunc(0); MaxLabel.text = xFunc(1); - if (showMax) - { - var midX = curve.Maximum; - MidLabel.text = xFunc(midX); - var rect = MidLabel.GetComponent(); - rect.anchorMin = new Vector2(midX, rect.anchorMin.y); - rect.anchorMax = new Vector2(midX, rect.anchorMax.y); - } - else MidLabel.text = xFunc(.5f); + MidLabel.text = xFunc(midX); + var rect = MidLabel.GetComponent(); + rect.anchorMin = new Vector2(midX, rect.anchorMin.y); + rect.anchorMax = new Vector2(midX, rect.anchorMax.y); } } diff --git a/Assets/Scripts/UI/Properties Panel/PropertiesPanel.cs b/Assets/Scripts/UI/Properties Panel/PropertiesPanel.cs index 3e8a3c5ae..053e148b8 100644 --- a/Assets/Scripts/UI/Properties Panel/PropertiesPanel.cs +++ b/Assets/Scripts/UI/Properties Panel/PropertiesPanel.cs @@ -376,7 +376,6 @@ public class PropertiesPanel : MonoBehaviour sheet.AddStat("Manufacturer", () => maker.Name); if (product != null) { - AddProperty(product.Name); AddProperty(product.Description); } } @@ -387,7 +386,7 @@ public class PropertiesPanel : MonoBehaviour private void AddEquippableItemProperties(EquippableItem item, Func statValueFunction) { - if (item.Durability < .01f) + if (item.IsDestroyed) { return; } @@ -424,16 +423,21 @@ public class PropertiesPanel : MonoBehaviour if (gearData.Behaviors.FirstOrDefault(b => b is WeaponData) is WeaponData weapon) { var range = AddCurveField(); - range.Show("Damage Range", weapon.DamageCurve, t => ActionGameManager.PlayerSettings.Format(lerp(statValueFunction(weapon.MinRange), statValueFunction(weapon.Range), t))); + var min = statValueFunction(weapon.MinRange); + var effective = statValueFunction(weapon.EffectiveRange); + var max = statValueFunction(weapon.Range); + range.Show("Damage Range", + t => WeaponData.RangeFactor(min, effective, max, weapon.DamageAtMaxRange, lerp(min, max, t)), + t => ActionGameManager.PlayerSettings.Format(lerp(min, max, t)), + effective < max ? saturate(unlerp(min, max, effective)) : .5f); } } private string GetTitle(EquippableItem item) { - var data = GameManager.ItemManager.GetData(item); var (tier, upgrades) = GameManager.ItemManager.GetTier(item); return - $"{data.Name} ({tier.Name}{new string('+', upgrades)})"; + $"{GameManager.ItemManager.Title(item)} ({tier.Name}{new string('+', upgrades)})"; } public void Inspect(EquippedItem item) @@ -475,7 +479,7 @@ public class PropertiesPanel : MonoBehaviour var gearData = GameManager.ItemManager.GetData(item.EquippableItem); var statusSheet = AddStatSheet(); - if (item.EquippableItem.Durability < .01f) + if (item.EquippableItem.IsDestroyed) statusSheet.AddStat("Durability", () => "Item Destroyed!"); else statusSheet.AddStat("Durability", () => $"{(int)(item.EquippableItem.Durability / gearData.Durability * 100)}%"); statusSheet.AddStat("Temperature", () => ActionGameManager.PlayerSettings.FormatTemperature(item.Temperature)); diff --git a/Assets/Scripts/UI/ScenarioPicker.cs b/Assets/Scripts/UI/ScenarioPicker.cs new file mode 100644 index 000000000..e0cd93134 --- /dev/null +++ b/Assets/Scripts/UI/ScenarioPicker.cs @@ -0,0 +1,289 @@ +using System; +using System.Collections.Generic; +using UniRx; +using UniRx.Triggers; +using TMPro; +using UnityEngine; +using UnityEngine.Events; +using UnityEngine.EventSystems; +using UnityEngine.InputSystem.UI; +using UnityEngine.UI; + +// The New Game screen: scenario names on the left pane by group, the selected scenario's brief, seed and ambient on a +// docked right pane, one Launch. This class owns which scenario is selected (one index into the rows it built); +// everything the screen shows about a scenario, and what Launch and Enter launch, reads that index. Keys arrive only as +// Input System UI events on the focused Launch button, so Enter and a mouse click are the same Button.onClick. +public sealed class ScenarioPicker +{ + private readonly List _scenarios = new List(); + private readonly List _groupLabels = new List(); + private readonly List