From adfb200a91f752861a41286ed76add5213df4020 Mon Sep 17 00:00:00 2001 From: Reinier Vens Date: Fri, 5 Mar 2021 14:31:18 +0000 Subject: [PATCH] Wormholes --- .gitignore | 1 - .../.idea/contentModel.xml | 4 +- Assembly-CSharp.csproj | 1 + Assets/Materials/Brushes/Fog Tint.mat | 2 +- .../Materials/Brushes/Wormhole Gravity 1.mat | 80 ++++ .../Brushes/Wormhole Gravity 1.mat.meta | 8 + Assets/Materials/Brushes/Wormhole Gravity.mat | 80 ++++ .../Brushes/Wormhole Gravity.mat.meta | 8 + .../Materials/Brushes/Wormhole Lighting.mat | 83 ++++ .../Brushes/Wormhole Lighting.mat.meta | 8 + Assets/Materials/Brushes/Wormhole Waves.mat | 84 ++++ .../Materials/Brushes/Wormhole Waves.mat.meta | 8 + Assets/Materials/UI/Map Gravity Lines.mat | 2 +- Assets/Prefabs/RPG/Wormhole 1.prefab | 360 ++++++++++++++++++ Assets/Prefabs/RPG/Wormhole 1.prefab.meta | 7 + Assets/Resources/Aetheria.inputactions | 19 + Assets/Resources/Settings.asset | 4 +- Assets/Scenes/ARPG.unity | 6 +- Assets/Scripts/AetheriaInput.cs | 29 ++ Assets/Scripts/Gameplay/ActionGameManager.cs | 60 ++- Assets/Scripts/Gameplay/GameSettings.cs | 1 + .../Scripts/Sector Display/SectorRenderer.cs | 30 +- .../ServerShared/Behaviors/Behaviors.cs | 4 +- .../Behaviors/{Heatsink.cs => HeatStorage.cs} | 10 +- .../{Heatsink.cs.meta => HeatStorage.cs.meta} | 0 .../ServerShared/Behaviors/Thruster.cs | 2 +- .../Scripts/ServerShared/Behaviors/Weapon.cs | 6 +- Assets/Scripts/ServerShared/Behaviors/Wear.cs | 7 +- Assets/Scripts/ServerShared/ItemData.cs | 4 +- Assets/Scripts/ServerShared/Settings.cs | 7 + Assets/Scripts/ServerShared/Ship.cs | 104 ++++- Assets/Scripts/ServerShared/Wormhole.cs | 6 + Assets/Scripts/ServerShared/Wormhole.cs.meta | 3 + Assets/Scripts/UI/SchematicDisplay.cs | 23 +- Assets/Shaders/Brushes/WormholeBrush.shader | 85 +++++ .../Shaders/Brushes/WormholeBrush.shader.meta | 10 + Economy.Shared.Unity.csproj | 5 +- GameData/AetherDB.msgpack | Bin 0 -> 58992 bytes 38 files changed, 1102 insertions(+), 59 deletions(-) create mode 100644 Assets/Materials/Brushes/Wormhole Gravity 1.mat create mode 100644 Assets/Materials/Brushes/Wormhole Gravity 1.mat.meta create mode 100644 Assets/Materials/Brushes/Wormhole Gravity.mat create mode 100644 Assets/Materials/Brushes/Wormhole Gravity.mat.meta create mode 100644 Assets/Materials/Brushes/Wormhole Lighting.mat create mode 100644 Assets/Materials/Brushes/Wormhole Lighting.mat.meta create mode 100644 Assets/Materials/Brushes/Wormhole Waves.mat create mode 100644 Assets/Materials/Brushes/Wormhole Waves.mat.meta create mode 100644 Assets/Prefabs/RPG/Wormhole 1.prefab create mode 100644 Assets/Prefabs/RPG/Wormhole 1.prefab.meta rename Assets/Scripts/ServerShared/Behaviors/{Heatsink.cs => HeatStorage.cs} (75%) rename Assets/Scripts/ServerShared/Behaviors/{Heatsink.cs.meta => HeatStorage.cs.meta} (100%) create mode 100644 Assets/Scripts/ServerShared/Wormhole.cs create mode 100644 Assets/Scripts/ServerShared/Wormhole.cs.meta create mode 100644 Assets/Shaders/Brushes/WormholeBrush.shader create mode 100644 Assets/Shaders/Brushes/WormholeBrush.shader.meta create mode 100644 GameData/AetherDB.msgpack diff --git a/.gitignore b/.gitignore index 9a8f469c8..ffb77ca05 100644 --- a/.gitignore +++ b/.gitignore @@ -76,4 +76,3 @@ Economy.Shared/obj/ # JetBrains Rider .idea folder .idea/ -AetherDB.msgpack diff --git a/.idea/.idea.Aetheria-Economy/.idea/contentModel.xml b/.idea/.idea.Aetheria-Economy/.idea/contentModel.xml index dd3baa66b..61d5712d6 100644 --- a/.idea/.idea.Aetheria-Economy/.idea/contentModel.xml +++ b/.idea/.idea.Aetheria-Economy/.idea/contentModel.xml @@ -1531,7 +1531,7 @@ - + @@ -2028,6 +2028,7 @@ + @@ -2107,6 +2108,7 @@ + diff --git a/Assembly-CSharp.csproj b/Assembly-CSharp.csproj index 8399bb3b2..81b735da5 100644 --- a/Assembly-CSharp.csproj +++ b/Assembly-CSharp.csproj @@ -425,6 +425,7 @@ + diff --git a/Assets/Materials/Brushes/Fog Tint.mat b/Assets/Materials/Brushes/Fog Tint.mat index 3df0db1a7..06bd02ee6 100644 --- a/Assets/Materials/Brushes/Fog Tint.mat +++ b/Assets/Materials/Brushes/Fog Tint.mat @@ -78,6 +78,6 @@ Material: - _UVSec: 0 - _ZWrite: 1 m_Colors: - - _Color: {r: 0.1764706, g: 0.31764707, b: 0.1254902, a: 1} + - _Color: {r: 0.65882355, g: 0.39265883, b: 0.5376236, a: 1} - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} m_BuildTextureStacks: [] diff --git a/Assets/Materials/Brushes/Wormhole Gravity 1.mat b/Assets/Materials/Brushes/Wormhole Gravity 1.mat new file mode 100644 index 000000000..da07be3e0 --- /dev/null +++ b/Assets/Materials/Brushes/Wormhole Gravity 1.mat @@ -0,0 +1,80 @@ +%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: Wormhole Gravity 1 + m_Shader: {fileID: 4800000, guid: 268da230635cfb34ab4ed6ad39503fa0, 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: 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_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _Depth: 54 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _Power: 4 + - _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 Gravity 1.mat.meta b/Assets/Materials/Brushes/Wormhole Gravity 1.mat.meta new file mode 100644 index 000000000..7d40d0332 --- /dev/null +++ b/Assets/Materials/Brushes/Wormhole Gravity 1.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 244f3e4c0c030a24b8d7aa944895bdcf +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/Brushes/Wormhole Gravity.mat b/Assets/Materials/Brushes/Wormhole Gravity.mat new file mode 100644 index 000000000..9e2773c0f --- /dev/null +++ b/Assets/Materials/Brushes/Wormhole Gravity.mat @@ -0,0 +1,80 @@ +%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: Wormhole Gravity + m_Shader: {fileID: 4800000, guid: 268da230635cfb34ab4ed6ad39503fa0, 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: 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_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _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 Gravity.mat.meta b/Assets/Materials/Brushes/Wormhole Gravity.mat.meta new file mode 100644 index 000000000..30ec9b01d --- /dev/null +++ b/Assets/Materials/Brushes/Wormhole Gravity.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a9ef17c902709ce41a837c54b809184b +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/Brushes/Wormhole Lighting.mat b/Assets/Materials/Brushes/Wormhole Lighting.mat new file mode 100644 index 000000000..c9129a099 --- /dev/null +++ b/Assets/Materials/Brushes/Wormhole Lighting.mat @@ -0,0 +1,83 @@ +%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: Wormhole Lighting + m_Shader: {fileID: 4800000, guid: 268da230635cfb34ab4ed6ad39503fa0, 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: 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_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _Depth: 4 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _Frequency: 6.2832 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _Phase: 0 + - _Power: 12 + - _SinePower: 1.25 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 0.5058824, b: 0.86, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + m_BuildTextureStacks: [] diff --git a/Assets/Materials/Brushes/Wormhole Lighting.mat.meta b/Assets/Materials/Brushes/Wormhole Lighting.mat.meta new file mode 100644 index 000000000..942e2e70d --- /dev/null +++ b/Assets/Materials/Brushes/Wormhole Lighting.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8d101bf8c1287cb49a4bd68fe8824246 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/Brushes/Wormhole Waves.mat b/Assets/Materials/Brushes/Wormhole Waves.mat new file mode 100644 index 000000000..cbe3e86e7 --- /dev/null +++ b/Assets/Materials/Brushes/Wormhole Waves.mat @@ -0,0 +1,84 @@ +%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: Wormhole Waves + m_Shader: {fileID: 4800000, guid: 8681ac064d59d15458d16cc9b884262c, 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: 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_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _Depth: 24 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _Frequency: 2 + - _FrequencyDist: 60 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _Power: 2 + - _SinePower: 1.25 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _Speed: 10 + - _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 new file mode 100644 index 000000000..1e5f35dd3 --- /dev/null +++ b/Assets/Materials/Brushes/Wormhole Waves.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ef2f6090d5cc14a4e9ce38def3bed9ac +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/UI/Map Gravity Lines.mat b/Assets/Materials/UI/Map Gravity Lines.mat index 48c6efff5..4701ebcc6 100644 --- a/Assets/Materials/UI/Map Gravity Lines.mat +++ b/Assets/Materials/UI/Map Gravity Lines.mat @@ -86,7 +86,7 @@ Material: - _Mode: 0 - _OcclusionStrength: 1 - _Parallax: 0.02 - - _Scale: 5.4972186 + - _Scale: 5.9919047 - _SmoothnessTextureChannel: 0 - _SpecularHighlights: 1 - _SrcBlend: 1 diff --git a/Assets/Prefabs/RPG/Wormhole 1.prefab b/Assets/Prefabs/RPG/Wormhole 1.prefab new file mode 100644 index 000000000..b03d01009 --- /dev/null +++ b/Assets/Prefabs/RPG/Wormhole 1.prefab @@ -0,0 +1,360 @@ +%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 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 463084220523011477} + m_Layer: 0 + m_Name: Wormhole 1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &463084220523011477 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4837153162502999620} + m_LocalRotation: {x: 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: + - {fileID: 8222188360457572195} + - {fileID: 1030590306481442051} + - {fileID: 581261949390603689} + - {fileID: 8249320701965103923} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &5989754434710127254 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8249320701965103923} + - component: {fileID: 1358808915677722173} + - component: {fileID: 6450194732864552839} + m_Layer: 13 + m_Name: Fog Tint + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &8249320701965103923 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5989754434710127254} + 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: 1} + m_Children: [] + m_Father: {fileID: 463084220523011477} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} +--- !u!33 &1358808915677722173 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5989754434710127254} + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &6450194732864552839 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5989754434710127254} + 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: 8d101bf8c1287cb49a4bd68fe8824246, 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 &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/RPG/Wormhole 1.prefab.meta b/Assets/Prefabs/RPG/Wormhole 1.prefab.meta new file mode 100644 index 000000000..be5e7b3fa --- /dev/null +++ b/Assets/Prefabs/RPG/Wormhole 1.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 4a77c480b4bb2a148954bd57dfe91d0b +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Aetheria.inputactions b/Assets/Resources/Aetheria.inputactions index e1de4fff5..69c58c533 100644 --- a/Assets/Resources/Aetheria.inputactions +++ b/Assets/Resources/Aetheria.inputactions @@ -156,6 +156,14 @@ "expectedControlType": "Button", "processors": "", "interactions": "" + }, + { + "name": "EnterWormhole", + "type": "Button", + "id": "c918ac22-b029-4805-9c85-e615a52641f2", + "expectedControlType": "Button", + "processors": "", + "interactions": "" } ], "bindings": [ @@ -554,6 +562,17 @@ "action": "Toggle Heatsinks", "isComposite": false, "isPartOfComposite": false + }, + { + "name": "", + "id": "95817d40-4c8d-4660-bd68-a93afe74b6e1", + "path": "/#(V)", + "interactions": "", + "processors": "", + "groups": "Keyboard&Mouse", + "action": "EnterWormhole", + "isComposite": false, + "isPartOfComposite": false } ] }, diff --git a/Assets/Resources/Settings.asset b/Assets/Resources/Settings.asset index e1b23fafe..5a0bd17e7 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:203a866610401607644a06056190ce969e9914e852f09d6b2bbe70e11c6262d6 -size 7648 +oid sha256:caa407a313b4aca849d2e92d32552c3202bb09e790e4dcadf813102cb37a39bf +size 7879 diff --git a/Assets/Scenes/ARPG.unity b/Assets/Scenes/ARPG.unity index e4b323457..edc4e04e5 100644 --- a/Assets/Scenes/ARPG.unity +++ b/Assets/Scenes/ARPG.unity @@ -4553,7 +4553,7 @@ MonoBehaviour: EnergyLabel: {fileID: 0} CockpitTemperatureLabel: {fileID: 0} RadiatorTemperatureLabel: {fileID: 0} - HeatsinkTemperatureLabel: {fileID: 0} + HeatStorageTemperatureLabel: {fileID: 0} CargoTemperatureLabel: {fileID: 517688448} VisibilityLabel: {fileID: 858665366} HullDurabilityLabel: {fileID: 2101419019} @@ -13046,6 +13046,8 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: bed3b49fe74863340b2a75f3d0517e86, type: 3} m_Name: m_EditorClassIdentifier: + WormholePrefab: {fileID: 463084220523011477, guid: 4a77c480b4bb2a148954bd57dfe91d0b, + type: 3} EntityFadeTime: 3 EffectManagerParent: {fileID: 134113271} FogCameraParent: {fileID: 1547889399} @@ -29475,7 +29477,7 @@ MonoBehaviour: EnergyLabel: {fileID: 804489113} CockpitTemperatureLabel: {fileID: 212527384} RadiatorTemperatureLabel: {fileID: 1752418078} - HeatsinkTemperatureLabel: {fileID: 1060591360} + HeatStorageTemperatureLabel: {fileID: 1060591360} CargoTemperatureLabel: {fileID: 388927456} VisibilityLabel: {fileID: 2122035461} HullDurabilityLabel: {fileID: 697075017} diff --git a/Assets/Scripts/AetheriaInput.cs b/Assets/Scripts/AetheriaInput.cs index b3117ec87..6538fc5dc 100644 --- a/Assets/Scripts/AetheriaInput.cs +++ b/Assets/Scripts/AetheriaInput.cs @@ -169,6 +169,14 @@ public class @AetheriaInput : IInputActionCollection, IDisposable ""expectedControlType"": ""Button"", ""processors"": """", ""interactions"": """" + }, + { + ""name"": ""EnterWormhole"", + ""type"": ""Button"", + ""id"": ""c918ac22-b029-4805-9c85-e615a52641f2"", + ""expectedControlType"": ""Button"", + ""processors"": """", + ""interactions"": """" } ], ""bindings"": [ @@ -567,6 +575,17 @@ public class @AetheriaInput : IInputActionCollection, IDisposable ""action"": ""Toggle Heatsinks"", ""isComposite"": false, ""isPartOfComposite"": false + }, + { + ""name"": """", + ""id"": ""95817d40-4c8d-4660-bd68-a93afe74b6e1"", + ""path"": ""/#(V)"", + ""interactions"": """", + ""processors"": """", + ""groups"": ""Keyboard&Mouse"", + ""action"": ""EnterWormhole"", + ""isComposite"": false, + ""isPartOfComposite"": false } ] }, @@ -1152,6 +1171,7 @@ public class @AetheriaInput : IInputActionCollection, IDisposable m_Player_TargetNext = m_Player.FindAction("Target Next", throwIfNotFound: true); m_Player_TargetNearest = m_Player.FindAction("Target Nearest", throwIfNotFound: true); m_Player_ToggleHeatsinks = m_Player.FindAction("Toggle Heatsinks", throwIfNotFound: true); + m_Player_EnterWormhole = m_Player.FindAction("EnterWormhole", throwIfNotFound: true); // UI m_UI = asset.FindActionMap("UI", throwIfNotFound: true); m_UI_Navigate = m_UI.FindAction("Navigate", throwIfNotFound: true); @@ -1236,6 +1256,7 @@ public class @AetheriaInput : IInputActionCollection, IDisposable private readonly InputAction m_Player_TargetNext; private readonly InputAction m_Player_TargetNearest; private readonly InputAction m_Player_ToggleHeatsinks; + private readonly InputAction m_Player_EnterWormhole; public struct PlayerActions { private @AetheriaInput m_Wrapper; @@ -1259,6 +1280,7 @@ public class @AetheriaInput : IInputActionCollection, IDisposable public InputAction @TargetNext => m_Wrapper.m_Player_TargetNext; public InputAction @TargetNearest => m_Wrapper.m_Player_TargetNearest; public InputAction @ToggleHeatsinks => m_Wrapper.m_Player_ToggleHeatsinks; + public InputAction @EnterWormhole => m_Wrapper.m_Player_EnterWormhole; public InputActionMap Get() { return m_Wrapper.m_Player; } public void Enable() { Get().Enable(); } public void Disable() { Get().Disable(); } @@ -1325,6 +1347,9 @@ public class @AetheriaInput : IInputActionCollection, IDisposable @ToggleHeatsinks.started -= m_Wrapper.m_PlayerActionsCallbackInterface.OnToggleHeatsinks; @ToggleHeatsinks.performed -= m_Wrapper.m_PlayerActionsCallbackInterface.OnToggleHeatsinks; @ToggleHeatsinks.canceled -= m_Wrapper.m_PlayerActionsCallbackInterface.OnToggleHeatsinks; + @EnterWormhole.started -= m_Wrapper.m_PlayerActionsCallbackInterface.OnEnterWormhole; + @EnterWormhole.performed -= m_Wrapper.m_PlayerActionsCallbackInterface.OnEnterWormhole; + @EnterWormhole.canceled -= m_Wrapper.m_PlayerActionsCallbackInterface.OnEnterWormhole; } m_Wrapper.m_PlayerActionsCallbackInterface = instance; if (instance != null) @@ -1386,6 +1411,9 @@ public class @AetheriaInput : IInputActionCollection, IDisposable @ToggleHeatsinks.started += instance.OnToggleHeatsinks; @ToggleHeatsinks.performed += instance.OnToggleHeatsinks; @ToggleHeatsinks.canceled += instance.OnToggleHeatsinks; + @EnterWormhole.started += instance.OnEnterWormhole; + @EnterWormhole.performed += instance.OnEnterWormhole; + @EnterWormhole.canceled += instance.OnEnterWormhole; } } } @@ -1584,6 +1612,7 @@ public class @AetheriaInput : IInputActionCollection, IDisposable void OnTargetNext(InputAction.CallbackContext context); void OnTargetNearest(InputAction.CallbackContext context); void OnToggleHeatsinks(InputAction.CallbackContext context); + void OnEnterWormhole(InputAction.CallbackContext context); } public interface IUIActions { diff --git a/Assets/Scripts/Gameplay/ActionGameManager.cs b/Assets/Scripts/Gameplay/ActionGameManager.cs index aa2af1aaa..f8a9c982e 100644 --- a/Assets/Scripts/Gameplay/ActionGameManager.cs +++ b/Assets/Scripts/Gameplay/ActionGameManager.cs @@ -17,6 +17,7 @@ using UnityEngine.InputSystem; using UnityEngine.UI; using static Unity.Mathematics.math; using float2 = Unity.Mathematics.float2; +using quaternion = Unity.Mathematics.quaternion; using Random = UnityEngine.Random; public class ActionGameManager : MonoBehaviour @@ -85,6 +86,21 @@ public class ActionGameManager : MonoBehaviour File.WriteAllBytes(Path.Combine(_loadoutPath.FullName, $"{pack.Name}.preset"), MessagePackSerializer.Serialize(pack)); } + public void GenerateLevel() + { + var zonePack = ZoneGenerator.GenerateZone( + settings: Settings.ZoneSettings, + // mapLayers: Context.MapLayers, + // resources: Context.Resources, + mass: Settings.DefaultZoneMass, + radius: Settings.DefaultZoneRadius + ); + + Zone = new Zone(Settings.PlanetSettings, zonePack); + Zone.Log = s => Debug.Log($"Zone: {s}"); + SectorRenderer.LoadZone(Zone); + } + void Start() { AkSoundEngine.RegisterGameObj(gameObject); @@ -95,27 +111,14 @@ public class ActionGameManager : MonoBehaviour ItemData = new DatabaseCache(); ItemData.Load(_filePath.FullName); ItemManager = new ItemManager(ItemData, Settings.GameplaySettings, Debug.Log); + SectorRenderer.ItemManager = ItemManager; Loadouts.AddRange(_loadoutPath.EnumerateFiles("*.preset") .Select(fi => MessagePackSerializer.Deserialize(File.ReadAllBytes(fi.FullName)))); - var zoneFile = Path.Combine(_filePath.FullName, "Home.zone"); + //var zoneFile = Path.Combine(_filePath.FullName, "Home.zone"); - // If the game has already been run, there will be a Home file containing a ZonePack; if not, generate one - var zonePack = File.Exists(zoneFile) ? - MessagePackSerializer.Deserialize(File.ReadAllBytes(zoneFile)): - ZoneGenerator.GenerateZone( - settings: Settings.ZoneSettings, - // mapLayers: Context.MapLayers, - // resources: Context.Resources, - mass: Settings.DefaultZoneMass, - radius: Settings.DefaultZoneRadius - ); - - Zone = new Zone(Settings.PlanetSettings, zonePack); - Zone.Log = s => Debug.Log($"Zone: {s}"); - SectorRenderer.ItemManager = ItemManager; - SectorRenderer.LoadZone(Zone); + GenerateLevel(); _input = new AetheriaInput(); _input.Global.Enable(); @@ -189,6 +192,23 @@ public class ActionGameManager : MonoBehaviour else Undock(); }; + _input.Player.EnterWormhole.performed += context => + { + foreach (var wormhole in SectorRenderer.WormholeInstances.Keys) + { + if (length(wormhole.Position - CurrentShip.Position.xz) < Settings.GameplaySettings.WormholeExitRadius) + { + CurrentShip.EnterWormhole(wormhole.Position); + CurrentShip.OnEnteredWormhole += () => + { + GenerateLevel(); + CurrentShip.ExitWormhole(SectorRenderer.WormholeInstances.Keys.First().Position, + Settings.GameplaySettings.WormholeExitVelocity * ItemManager.Random.NextFloat2Direction()); + }; + } + } + }; + _input.Player.ToggleHeatsinks.performed += context => { CurrentShip.HeatsinksEnabled = !CurrentShip.HeatsinksEnabled; @@ -197,13 +217,15 @@ public class ActionGameManager : MonoBehaviour _input.Player.TargetReticle.performed += context => { - var underReticle = Zone.Entities.Where(x => x != CurrentShip).MaxBy(x => dot(normalize(x.Position - CurrentShip.Position), CurrentShip.LookDirection)); + var underReticle = Zone.Entities.Where(x => x != CurrentShip) + .MaxBy(x => dot(normalize(x.Position - CurrentShip.Position), CurrentShip.LookDirection)); CurrentShip.Target.Value = CurrentShip.Target.Value == underReticle ? null : underReticle; }; _input.Player.TargetNearest.performed += context => { - CurrentShip.Target.Value = Zone.Entities.Where(x=>x!=CurrentShip).MaxBy(x => length(x.Position - CurrentShip.Position)); + CurrentShip.Target.Value = Zone.Entities.Where(x=>x!=CurrentShip) + .MaxBy(x => length(x.Position - CurrentShip.Position)); }; _input.Player.TargetNext.performed += context => @@ -599,7 +621,7 @@ public class ActionGameManager : MonoBehaviour foreach(var agent in _shipAgents) agent.Update(Time.deltaTime); Zone.Update(_time, Time.deltaTime); - SectorRenderer.Time = _time; + SectorRenderer.GameTime = _time; } private void LateUpdate() diff --git a/Assets/Scripts/Gameplay/GameSettings.cs b/Assets/Scripts/Gameplay/GameSettings.cs index 4052f92b6..df6dfc311 100644 --- a/Assets/Scripts/Gameplay/GameSettings.cs +++ b/Assets/Scripts/Gameplay/GameSettings.cs @@ -10,6 +10,7 @@ using UnityEngine; [CreateAssetMenu(fileName = "Sector Display Properties", menuName = "Aetheria/Sector Display Properties")] public class GameSettings : ScriptableObject { + public float WormholeDistanceRatio; public float DefaultZoneRadius; public float DefaultZoneMass; public float DefaultViewDistance; diff --git a/Assets/Scripts/Sector Display/SectorRenderer.cs b/Assets/Scripts/Sector Display/SectorRenderer.cs index d6f5e6aa6..dc5af1c9d 100644 --- a/Assets/Scripts/Sector Display/SectorRenderer.cs +++ b/Assets/Scripts/Sector Display/SectorRenderer.cs @@ -18,6 +18,7 @@ using float2 = Unity.Mathematics.float2; public class SectorRenderer : MonoBehaviour { + public Transform WormholePrefab; public float EntityFadeTime; public Transform EffectManagerParent; public Transform FogCameraParent; @@ -76,6 +77,8 @@ public class SectorRenderer : MonoBehaviour private Entity _perspectiveEntity; private IDisposable[] _perspectiveSubscriptions = new IDisposable[2]; + public Dictionary WormholeInstances = new Dictionary(); + public Zone Zone { get; private set; } public ItemManager ItemManager { get; set; } @@ -108,7 +111,7 @@ public class SectorRenderer : MonoBehaviour } } - public float Time { get; set; } + public float GameTime { get; set; } public float ViewDistance { @@ -176,7 +179,7 @@ public class SectorRenderer : MonoBehaviour Debug.Log("WTF!"); } } - _tourPlanets.Add((x.Value.Body.transform, parent.Body.transform)); + //_tourPlanets.Add((x.Value.Body.transform, parent.Body.transform)); } } @@ -184,10 +187,26 @@ public class SectorRenderer : MonoBehaviour LoadEntity(entity); zone.Entities.ObserveAdd().Subscribe(e => LoadEntity(e.Value)); zone.Entities.ObserveRemove().Subscribe(e => UnloadEntity(e.Value)); + + var southernWormhole = new Wormhole {Position = float2(0, -Settings.DefaultZoneRadius * Settings.WormholeDistanceRatio)}; + AddWormhole(southernWormhole); + + var northernWormhole = new Wormhole {Position = float2(0, Settings.DefaultZoneRadius * Settings.WormholeDistanceRatio)}; + AddWormhole(northernWormhole); + } + + public void AddWormhole(Wormhole wormhole) + { + var instance = Instantiate(WormholePrefab); + instance.position = new Vector3(wormhole.Position.x, 0, wormhole.Position.y); + WormholeInstances.Add(wormhole, instance.gameObject); } public void ClearZone() { + foreach (var wormhole in WormholeInstances.Values) Destroy(wormhole); + WormholeInstances.Clear(); + if (Planets.Count > 0) { foreach (var planet in Planets.Values) @@ -195,6 +214,11 @@ public class SectorRenderer : MonoBehaviour DestroyImmediate(planet.gameObject); } Planets.Clear(); + // foreach (var beltObject in _beltObjects.Values) + // { + // beltObject. + // } + _beltObjects.Clear(); _beltMeshes.Clear(); _beltMatrices.Clear(); _tourPlanets.Clear(); @@ -386,7 +410,7 @@ public class SectorRenderer : MonoBehaviour planet.Value.Body.transform.localPosition = new Vector3(0, Zone.GetHeight(p) + planetInstance.BodyRadius.Value * 2, 0); if(planet.Value is GasGiantObject gasGiantObject) { - gasGiantObject.GravityWaves.material.SetFloat("_Phase", Time * ((GasGiant) Zone.PlanetInstances[planet.Key]).GravityWavesSpeed.Value); + gasGiantObject.GravityWaves.material.SetFloat("_Phase", GameTime * ((GasGiant) Zone.PlanetInstances[planet.Key]).GravityWavesSpeed.Value); if(!(planet.Value is SunObject)) { var toParent = normalize(Zone.GetOrbitPosition(Zone.Orbits[planetInstance.BodyData.Orbit].Data.Parent) - p); diff --git a/Assets/Scripts/ServerShared/Behaviors/Behaviors.cs b/Assets/Scripts/ServerShared/Behaviors/Behaviors.cs index bf3e2e8cb..bd20e3520 100644 --- a/Assets/Scripts/ServerShared/Behaviors/Behaviors.cs +++ b/Assets/Scripts/ServerShared/Behaviors/Behaviors.cs @@ -89,7 +89,7 @@ public abstract class PersistentBehaviorData Union(6, typeof(ReflectorData)), Union(7, typeof(ShieldData)), Union(8, typeof(ThrusterData)), - // Union(9, typeof(TurningData)), + Union(9, typeof(WearData)), Union(10, typeof(VelocityConversionData)), Union(11, typeof(VelocityLimitData)), Union(12, typeof(FactoryData)), @@ -113,7 +113,7 @@ public abstract class PersistentBehaviorData // Union(30, typeof(HaulingControllerData)), Union(31, typeof(CapacitorData)), Union(32, typeof(CockpitData)), - Union(33, typeof(HeatsinkData)), + Union(33, typeof(HeatStorageData)), Union(34, typeof(TurretControllerData)), Union(35, typeof(InstantWeaponData)), Union(36, typeof(ConstantWeaponData)), diff --git a/Assets/Scripts/ServerShared/Behaviors/Heatsink.cs b/Assets/Scripts/ServerShared/Behaviors/HeatStorage.cs similarity index 75% rename from Assets/Scripts/ServerShared/Behaviors/Heatsink.cs rename to Assets/Scripts/ServerShared/Behaviors/HeatStorage.cs index af0242977..7bd52b7cc 100644 --- a/Assets/Scripts/ServerShared/Behaviors/Heatsink.cs +++ b/Assets/Scripts/ServerShared/Behaviors/HeatStorage.cs @@ -9,17 +9,17 @@ using Unity.Mathematics; using static Unity.Mathematics.math; [MessagePackObject, JsonObject(MemberSerialization.OptIn), RuntimeInspectable] -public class HeatsinkData : BehaviorData +public class HeatStorageData : BehaviorData { public override IBehavior CreateInstance(ItemManager context, Entity entity, EquippedItem item) { - return new Heatsink(context, this, entity, item); + return new HeatStorage(context, this, entity, item); } } -public class Heatsink : IBehavior +public class HeatStorage : IBehavior { - private HeatsinkData _data; + private HeatStorageData _data; public Entity Entity { get; } public EquippedItem Item { get; } @@ -27,7 +27,7 @@ public class Heatsink : IBehavior public BehaviorData Data => _data; - public Heatsink(ItemManager context, HeatsinkData data, Entity entity, EquippedItem item) + public HeatStorage(ItemManager context, HeatStorageData data, Entity entity, EquippedItem item) { Context = context; _data = data; diff --git a/Assets/Scripts/ServerShared/Behaviors/Heatsink.cs.meta b/Assets/Scripts/ServerShared/Behaviors/HeatStorage.cs.meta similarity index 100% rename from Assets/Scripts/ServerShared/Behaviors/Heatsink.cs.meta rename to Assets/Scripts/ServerShared/Behaviors/HeatStorage.cs.meta diff --git a/Assets/Scripts/ServerShared/Behaviors/Thruster.cs b/Assets/Scripts/ServerShared/Behaviors/Thruster.cs index b7e59a5be..2cf70147b 100644 --- a/Assets/Scripts/ServerShared/Behaviors/Thruster.cs +++ b/Assets/Scripts/ServerShared/Behaviors/Thruster.cs @@ -73,6 +73,6 @@ public class Thruster : IAnalogBehavior var vis = _input * Context.Evaluate(_data.Visibility, Item); if(!Entity.VisibilitySources.ContainsKey(this) || vis > Entity.VisibilitySources[this]) Entity.VisibilitySources[this] = vis; - return true; + return _input > .01f; } } \ No newline at end of file diff --git a/Assets/Scripts/ServerShared/Behaviors/Weapon.cs b/Assets/Scripts/ServerShared/Behaviors/Weapon.cs index fb124377d..3762e3672 100644 --- a/Assets/Scripts/ServerShared/Behaviors/Weapon.cs +++ b/Assets/Scripts/ServerShared/Behaviors/Weapon.cs @@ -8,6 +8,7 @@ using System.Linq; using MessagePack; using Newtonsoft.Json; using Unity.Mathematics; +using static Unity.Mathematics.math; [Union(0, typeof(InstantWeaponData)), Union(1, typeof(LauncherData)), @@ -123,7 +124,10 @@ public abstract class Weapon : IActivatedBehavior Visibility = Context.Evaluate(_data.Visibility, Item); Spread = Context.Evaluate(_data.Spread, Item); Velocity = Context.Evaluate(_data.Velocity, Item); - Wear = Context.Evaluate(_itemData.WearDamage, Item); + Wear = (1 - pow(_itemData.Performance(Item.Temperature), + (1 - pow(Item.EquippableItem.Quality, Context.GameplaySettings.QualityWearExponent)) * + Context.GameplaySettings.ThermalWearExponent) + ) * _itemData.Durability; } public virtual bool Execute(float delta) diff --git a/Assets/Scripts/ServerShared/Behaviors/Wear.cs b/Assets/Scripts/ServerShared/Behaviors/Wear.cs index 272709473..8b6e68567 100644 --- a/Assets/Scripts/ServerShared/Behaviors/Wear.cs +++ b/Assets/Scripts/ServerShared/Behaviors/Wear.cs @@ -12,7 +12,7 @@ using static Unity.Mathematics.math; public class WearData : BehaviorData { [TemperatureInspectable, JsonProperty("perSecond"), Key(1)] - public bool PerSecond; + public bool PerSecond = true; public override IBehavior CreateInstance(ItemManager context, Entity entity, EquippedItem item) { @@ -42,7 +42,10 @@ public class Wear : IBehavior public bool Execute(float delta) { - var wear = Context.Evaluate(_itemData.WearDamage, Item); + var wear = (1 - pow(_itemData.Performance(Item.Temperature), + (1 - pow(Item.EquippableItem.Quality, Context.GameplaySettings.QualityWearExponent)) * + Context.GameplaySettings.ThermalWearExponent) + ) * _itemData.Durability / _itemData.ThermalResilience; if (_data.PerSecond) wear *= delta; Item.EquippableItem.Durability -= wear; return true; diff --git a/Assets/Scripts/ServerShared/ItemData.cs b/Assets/Scripts/ServerShared/ItemData.cs index e866c3d33..dfc66915c 100644 --- a/Assets/Scripts/ServerShared/ItemData.cs +++ b/Assets/Scripts/ServerShared/ItemData.cs @@ -297,8 +297,8 @@ public abstract class EquippableItemData : CraftedItemData [InspectableAnimationCurve, JsonProperty("performanceCurve"), Key(17)] public float4[] HeatPerformanceCurve; - [InspectableField, JsonProperty("wearDamage"), Key(18)] - public PerformanceStat WearDamage = new PerformanceStat(); + [InspectableField, JsonProperty("resilience"), Key(18)] + public float ThermalResilience = 1; [IgnoreMember] public abstract HardpointType HardpointType { get; } diff --git a/Assets/Scripts/ServerShared/Settings.cs b/Assets/Scripts/ServerShared/Settings.cs index a8e9fb7c8..9af5d9b5b 100644 --- a/Assets/Scripts/ServerShared/Settings.cs +++ b/Assets/Scripts/ServerShared/Settings.cs @@ -88,6 +88,13 @@ public class ZoneGenerationSettings [Serializable, MessagePackObject(keyAsPropertyName: true), JsonObject] public class GameplaySettings { + public float WormholeDepth = 1000; + public float WormholeExitVelocity = 20; + public float WormholeExitRadius = 50; + public float WormholeAnimationDuration = 4; + public float WormholeExitCurveStart = .8f; + public float ThermalWearExponent = .01f; + public float QualityWearExponent = 2; public int TriggerGroupCount = 6; public float WarpDistance = 25; public float DockingDistance = 25; diff --git a/Assets/Scripts/ServerShared/Ship.cs b/Assets/Scripts/ServerShared/Ship.cs index 9369a5a74..80793afa4 100644 --- a/Assets/Scripts/ServerShared/Ship.cs +++ b/Assets/Scripts/ServerShared/Ship.cs @@ -34,7 +34,15 @@ public class Ship : Entity private HashSet _leftThrusters; private HashSet _clockwiseThrusters; private HashSet _counterClockwiseThrusters; - + + private bool _exitingWormhole = false; + private bool _enteringWormhole = false; + private float _wormholeAnimationProgress; + private float2 _wormholeEntryPosition; + private float2 _wormholeEntryDirection; + private float2 _wormholePosition; + private float2 _wormholeExitVelocity; + public float ForwardThrust { get; private set; } public float ReverseThrust { get; private set; } public float LeftStrafeThrust { get; private set; } @@ -52,9 +60,30 @@ public class Ship : Entity var clockwise = dot(direction, Direction.Rotate(ItemRotation.Clockwise)) > 0; return angleDiff / ((clockwise ? ClockwiseTorque : CounterClockwiseTorque) / Mass); } + + public event Action OnExitedWormhole; + public event Action OnEnteredWormhole; public quaternion Rotation { get; private set; } + public void ExitWormhole(float2 wormholePosition, float2 exitVelocity) + { + _exitingWormhole = true; + _wormholeAnimationProgress = 0; + _wormholePosition = wormholePosition; + _wormholeExitVelocity = exitVelocity; + Direction = normalize(exitVelocity); + } + + public void EnterWormhole(float2 wormholePosition) + { + _wormholeAnimationProgress = 0; + _enteringWormhole = true; + _wormholeEntryPosition = Position.xz; + _wormholeEntryDirection = normalize(_wormholeEntryPosition-wormholePosition); + _wormholePosition = wormholePosition; + } + public override void Activate() { base.Activate(); @@ -113,6 +142,8 @@ public class Ship : Entity ItemOnline.Subscribe(CheckForThruster); } + #region ThrustCalculation + private void RecalculateForwardThrust() { ForwardThrust = 0; @@ -187,10 +218,11 @@ public class Ship : Entity } } + #endregion + public override void Update(float delta) { - Position.xz += Velocity * delta; - if (_active) + if (_active && !_exitingWormhole) { foreach (var thruster in _allThrusters) thruster.Axis = 0; var rightThrusterTorqueCompensation = abs(RightStrafeTotalTorque) / RightStrafeTorqueThrusters.Length; @@ -226,6 +258,9 @@ public class Ship : Entity foreach (var thruster in _clockwiseThrusters) thruster.Axis += deltaRot; foreach (var thruster in _counterClockwiseThrusters) thruster.Axis += -deltaRot; } + + Position.xz += Velocity * delta; + var normal = Zone.GetNormal(Position.xz); var force = new float2(normal.x, normal.z); var forceMagnitude = lengthsq(force); @@ -239,6 +274,69 @@ public class Ship : Entity Rotation = quaternion.LookRotation(forward, normal); base.Update(delta); + + if (_exitingWormhole) + { + _wormholeAnimationProgress += delta / ItemManager.GameplaySettings.WormholeAnimationDuration; + if(_wormholeAnimationProgress < 1) + { + if (_wormholeAnimationProgress < ItemManager.GameplaySettings.WormholeExitCurveStart) + { + Position.xz = _wormholePosition; + Rotation = quaternion.LookRotation(float3(0, 1, 0), float3(-Direction.x, 0, -Direction.y)); + } + else + { + var exitLerp = _wormholeAnimationProgress - ItemManager.GameplaySettings.WormholeExitCurveStart / + (1 - ItemManager.GameplaySettings.WormholeExitCurveStart); + exitLerp *= exitLerp; // Square the interpolation variable to produce curve with zero slope at start + Position.xz = _wormholePosition + normalize(_wormholeExitVelocity) * exitLerp * ItemManager.GameplaySettings.WormholeExitRadius; + Rotation = quaternion.LookRotation( + lerp(float3(0, 1, 0), forward, exitLerp), + lerp(float3(-Direction.x, 0, -Direction.y), normal, exitLerp)); + } + + Position.y = Position.y - lerp(ItemManager.GameplaySettings.WormholeDepth, 0, _wormholeAnimationProgress); + } + else + { + _exitingWormhole = false; + OnExitedWormhole?.Invoke(); + OnExitedWormhole = null; + Velocity = _wormholeExitVelocity; + } + } + + if (_enteringWormhole) + { + _wormholeAnimationProgress += delta / ItemManager.GameplaySettings.WormholeAnimationDuration; + if(_wormholeAnimationProgress < 1) + { + if (_wormholeAnimationProgress < 1 - ItemManager.GameplaySettings.WormholeExitCurveStart) + { + var enterLerp = _wormholeAnimationProgress / (1 - ItemManager.GameplaySettings.WormholeExitCurveStart); + enterLerp *= enterLerp; // Square the interpolation variable to produce curve with zero slope at vertical + Position.xz = lerp(_wormholeEntryPosition, _wormholePosition, enterLerp); + Rotation = quaternion.LookRotation( + lerp(forward, float3(0, -1, 0), enterLerp), + lerp(normal, float3(-_wormholeEntryDirection.x, 0, -_wormholeEntryDirection.y), enterLerp)); + } + else + { + Position.xz = _wormholePosition; + Rotation = quaternion.LookRotation(float3(0, -1, 0), + float3(-_wormholeEntryDirection.x, 0, -_wormholeEntryDirection.y)); + } + + Position.y = Position.y - lerp(0, ItemManager.GameplaySettings.WormholeDepth, _wormholeAnimationProgress); + } + else + { + _enteringWormhole = false; + OnEnteredWormhole?.Invoke(); + OnEnteredWormhole = null; + } + } } } diff --git a/Assets/Scripts/ServerShared/Wormhole.cs b/Assets/Scripts/ServerShared/Wormhole.cs new file mode 100644 index 000000000..e1446c07b --- /dev/null +++ b/Assets/Scripts/ServerShared/Wormhole.cs @@ -0,0 +1,6 @@ +using Unity.Mathematics; + +public class Wormhole +{ + public float2 Position; +} \ No newline at end of file diff --git a/Assets/Scripts/ServerShared/Wormhole.cs.meta b/Assets/Scripts/ServerShared/Wormhole.cs.meta new file mode 100644 index 000000000..538a13036 --- /dev/null +++ b/Assets/Scripts/ServerShared/Wormhole.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: b5a943b5358a47a199ad5e7271c14032 +timeCreated: 1614907192 \ No newline at end of file diff --git a/Assets/Scripts/UI/SchematicDisplay.cs b/Assets/Scripts/UI/SchematicDisplay.cs index 989964c57..1e819e905 100644 --- a/Assets/Scripts/UI/SchematicDisplay.cs +++ b/Assets/Scripts/UI/SchematicDisplay.cs @@ -6,6 +6,7 @@ using TMPro; using UnityEngine; using UnityEngine.UI; using Unity.Mathematics; +using UnityEngine.Serialization; using static Unity.Mathematics.math; public class SchematicDisplay : MonoBehaviour @@ -22,7 +23,7 @@ public class SchematicDisplay : MonoBehaviour public TextMeshProUGUI EnergyLabel; public TextMeshProUGUI CockpitTemperatureLabel; public TextMeshProUGUI RadiatorTemperatureLabel; - public TextMeshProUGUI HeatsinkTemperatureLabel; + [FormerlySerializedAs("HeatsinkTemperatureLabel")] public TextMeshProUGUI HeatStorageTemperatureLabel; public TextMeshProUGUI CargoTemperatureLabel; public TextMeshProUGUI VisibilityLabel; public TextMeshProUGUI HullDurabilityLabel; @@ -45,7 +46,7 @@ public class SchematicDisplay : MonoBehaviour private Cockpit _cockpit; private Reactor _reactor; private Capacitor[] _capacitors; - private Heatsink[] _heatsinks; + private HeatStorage[] _heatStorages; private EquippedCargoBay[] _cargoBays; private SchematicDisplayItem[] _schematicItems; private Graphic[] _groupGraphics; @@ -115,9 +116,9 @@ public class SchematicDisplay : MonoBehaviour if (_radiators.Length == 0) RadiatorTemperatureLabel.text = "N/A"; - _heatsinks = entity.GetBehaviors().ToArray(); - if (_heatsinks.Length == 0) - HeatsinkTemperatureLabel.text = "N/A"; + _heatStorages = entity.GetBehaviors().ToArray(); + if (_heatStorages.Length == 0) + HeatStorageTemperatureLabel.text = "N/A"; _cargoBays = entity.CargoBays.ToArray(); if (_cargoBays.Length == 0) @@ -222,12 +223,12 @@ public class SchematicDisplay : MonoBehaviour $"{((int)(_radiators.Max(r => r.Temperature) - 273.15f)).ToString()}°C"; HeatsinkBackground.color = _entity.HeatsinksEnabled ? HeaderElementEnabledColor : HeaderElementDisabledColor; - if (_heatsinks.Length == 1) - HeatsinkTemperatureLabel.text = $"{((int)(_heatsinks[0].Item.Temperature - 273.15f)).ToString()}°C"; - else if (_heatsinks.Length > 1) - HeatsinkTemperatureLabel.text = - $"{((int)(_heatsinks.Min(r => r.Item.Temperature) - 273.15f)).ToString()}-" + - $"{((int)(_heatsinks.Max(r => r.Item.Temperature) - 273.15f)).ToString()}°C"; + if (_heatStorages.Length == 1) + HeatStorageTemperatureLabel.text = $"{((int)(_heatStorages[0].Item.Temperature - 273.15f)).ToString()}°C"; + else if (_heatStorages.Length > 1) + HeatStorageTemperatureLabel.text = + $"{((int)(_heatStorages.Min(r => r.Item.Temperature) - 273.15f)).ToString()}-" + + $"{((int)(_heatStorages.Max(r => r.Item.Temperature) - 273.15f)).ToString()}°C"; if (_cargoBays.Length == 1) CargoTemperatureLabel.text = $"{((int)(_cargoBays[0].Temperature - 273.15f)).ToString()}°C"; diff --git a/Assets/Shaders/Brushes/WormholeBrush.shader b/Assets/Shaders/Brushes/WormholeBrush.shader new file mode 100644 index 000000000..c57627f90 --- /dev/null +++ b/Assets/Shaders/Brushes/WormholeBrush.shader @@ -0,0 +1,85 @@ +Shader "Brushes/Wormhole Brush" { +Properties { + _Depth ("Depth", Float) = 0.5 + _Power("Envelope Power", Float) = 1.25 + _Frequency("Frequency", Float) = 6.2832 + _FrequencyDist("Distance Frequency", Float) = 6.2832 + _Speed("Speed", Float) = 0 + _SinePower("Sine Power", Float) = 1.25 +} + +Category { + Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" "PreviewType"="Plane" } + Blend One One + ColorMask RGB + Cull Off Lighting Off ZWrite Off + + SubShader { + Pass { + + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma target 2.0 + + #include "UnityCG.cginc" + + float _Depth; + float _Power; + float _Frequency; + float _FrequencyDist; + float _Speed; + float _SinePower; + + struct appdata_t { + float4 vertex : POSITION; + fixed4 color : COLOR; + float2 texcoord : TEXCOORD0; + }; + + struct v2f { + float4 vertex : SV_POSITION; + fixed4 color : COLOR; + float2 texcoord : TEXCOORD0; + }; + + float4 _MainTex_ST; + + v2f vert (appdata_t v) + { + v2f o; + o.vertex = UnityObjectToClipPos(v.vertex); + o.color = v.color; + o.texcoord = v.texcoord; + return o; + } + + float almostIdentity(float x, float m, float n) + { + if (x>m) return x; + + const float a = 2.0f*n - m; + const float b = 2.0f*m - 3.0f*n; + const float t = x / m; + + return (a*t + b)*t*t + n; + } + + float powerPulse( float x, float power ) + { + x = saturate(abs(x)); + return pow((x + 1.0f) * (1.0f - x), power); + } + + fixed4 frag (v2f i) : SV_Target + { + float2 uv2 = i.texcoord - float2(.5,.5); + float dist = length(uv2); + float ang = atan2(uv2.y,uv2.x); + return _Depth * powerPulse(dist * 2,_Power) * (cos(ang*_Frequency+dist*_FrequencyDist+_Time.x*_Speed)+1); + } + ENDCG + } + } +} +} diff --git a/Assets/Shaders/Brushes/WormholeBrush.shader.meta b/Assets/Shaders/Brushes/WormholeBrush.shader.meta new file mode 100644 index 000000000..6bccf4a95 --- /dev/null +++ b/Assets/Shaders/Brushes/WormholeBrush.shader.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 8681ac064d59d15458d16cc9b884262c +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + preprocessorOverride: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Economy.Shared.Unity.csproj b/Economy.Shared.Unity.csproj index 2e941db4b..fa7f1787d 100644 --- a/Economy.Shared.Unity.csproj +++ b/Economy.Shared.Unity.csproj @@ -483,7 +483,7 @@ - + @@ -517,13 +517,14 @@ + - + diff --git a/GameData/AetherDB.msgpack b/GameData/AetherDB.msgpack new file mode 100644 index 0000000000000000000000000000000000000000..d9f22ffe9cb65d36a57ac8d5647864bea9bb1660 GIT binary patch literal 58992 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