diff --git a/.idea/.idea.Aetheria-Economy/.idea/contentModel.xml b/.idea/.idea.Aetheria-Economy/.idea/contentModel.xml
index 39176016e..c98b5121b 100644
--- a/.idea/.idea.Aetheria-Economy/.idea/contentModel.xml
+++ b/.idea/.idea.Aetheria-Economy/.idea/contentModel.xml
@@ -1769,6 +1769,7 @@
+
diff --git a/Assembly-CSharp.csproj b/Assembly-CSharp.csproj
index c0ac61422..aaf570c39 100644
--- a/Assembly-CSharp.csproj
+++ b/Assembly-CSharp.csproj
@@ -890,6 +890,7 @@
+
diff --git a/Assets/Prefabs/Child.prefab b/Assets/Prefabs/Child.prefab
new file mode 100644
index 000000000..0369f7863
--- /dev/null
+++ b/Assets/Prefabs/Child.prefab
@@ -0,0 +1,107 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &7411673047664575939
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 8582307304163871840}
+ - component: {fileID: 1433927532033689244}
+ - component: {fileID: 1757477368280699322}
+ - component: {fileID: 8954320188269079158}
+ - component: {fileID: 7783581834528059211}
+ m_Layer: 0
+ m_Name: Child
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &8582307304163871840
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7411673047664575939}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: -0.6599999, z: 0}
+ m_LocalScale: {x: 0.25000015, y: 0.25000015, z: 0}
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!33 &1433927532033689244
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7411673047664575939}
+ m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!23 &1757477368280699322
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7411673047664575939}
+ 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: 658219dea0cf83049b6ab46c2f3436ed, 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
+--- !u!64 &8954320188269079158
+MeshCollider:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7411673047664575939}
+ m_Material: {fileID: 0}
+ m_IsTrigger: 0
+ m_Enabled: 1
+ serializedVersion: 3
+ m_Convex: 0
+ m_CookingOptions: 14
+ m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!114 &7783581834528059211
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7411673047664575939}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 52538a3309c36fc4583c964a1c0b705f, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
diff --git a/Assets/Prefabs/Child.prefab.meta b/Assets/Prefabs/Child.prefab.meta
new file mode 100644
index 000000000..5a0224bc7
--- /dev/null
+++ b/Assets/Prefabs/Child.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: dfe057045c1f88945ae9256f34d7c8e6
+PrefabImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Prefabs/Entity.prefab b/Assets/Prefabs/Entity.prefab
new file mode 100644
index 000000000..222b543e9
--- /dev/null
+++ b/Assets/Prefabs/Entity.prefab
@@ -0,0 +1,359 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &7667578565016065614
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 7667578565016065613}
+ - component: {fileID: 7667578565016065611}
+ - component: {fileID: 7667578565016065612}
+ - component: {fileID: 7667578565016065609}
+ - component: {fileID: 7667578565016065610}
+ m_Layer: 0
+ m_Name: Icon
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &7667578565016065613
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7667578565016065614}
+ 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_Children: []
+ m_Father: {fileID: 7667578565413050542}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!33 &7667578565016065611
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7667578565016065614}
+ m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!23 &7667578565016065612
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7667578565016065614}
+ 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: 524c72939685743438cb17ce839664e7, 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
+--- !u!64 &7667578565016065609
+MeshCollider:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7667578565016065614}
+ m_Material: {fileID: 0}
+ m_IsTrigger: 0
+ m_Enabled: 1
+ serializedVersion: 3
+ m_Convex: 0
+ m_CookingOptions: 14
+ m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!114 &7667578565016065610
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7667578565016065614}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 52538a3309c36fc4583c964a1c0b705f, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+--- !u!1 &7667578565413050543
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 7667578565413050542}
+ - component: {fileID: 5800314421439145179}
+ m_Layer: 0
+ m_Name: Entity
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &7667578565413050542
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7667578565413050543}
+ 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_Children:
+ - {fileID: 7667578565016065613}
+ - {fileID: 7667578566386612334}
+ m_Father: {fileID: 0}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &5800314421439145179
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7667578565413050543}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 4d8b39205d8cd404bae28355b1ed1596, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ Icon: {fileID: 7667578565016065612}
+ Label: {fileID: 7667578566386612333}
+--- !u!1 &7667578566386612335
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 7667578566386612334}
+ - component: {fileID: 7667578566386612330}
+ - component: {fileID: 7667578566386612331}
+ - component: {fileID: 7667578566386612332}
+ - component: {fileID: 7667578566386612333}
+ m_Layer: 0
+ m_Name: Label
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &7667578566386612334
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7667578566386612335}
+ m_LocalRotation: {x: -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: 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}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 1, y: 1}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!23 &7667578566386612330
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7667578566386612335}
+ m_Enabled: 1
+ m_CastShadows: 0
+ m_ReceiveShadows: 0
+ m_DynamicOccludee: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RenderingLayerMask: 1
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: 21677577810600300, guid: ef74c4c30ca5ced4489f28b914006aad, 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
+--- !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}
+--- !u!222 &7667578566386612332
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7667578566386612335}
+ m_CullTransparentMesh: 0
+--- !u!114 &7667578566386612333
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7667578566386612335}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 9541d86e2fd84c1d9990edf0852d74ab, 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_text: 'Regular Name
+
+'
+ m_isRightToLeft: 0
+ m_fontAsset: {fileID: 11400000, guid: ef74c4c30ca5ced4489f28b914006aad, type: 2}
+ m_sharedMaterial: {fileID: 21677577810600300, guid: ef74c4c30ca5ced4489f28b914006aad,
+ 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_overrideHtmlColors: 0
+ m_faceColor:
+ serializedVersion: 2
+ rgba: 4294967295
+ m_outlineColor:
+ serializedVersion: 2
+ rgba: 4278190080
+ m_fontSize: 2
+ m_fontSizeBase: 2
+ m_fontWeight: 400
+ m_enableAutoSizing: 0
+ m_fontSizeMin: 18
+ m_fontSizeMax: 72
+ m_fontStyle: 0
+ m_textAlignment: 258
+ m_characterSpacing: 1.38
+ m_wordSpacing: 0
+ m_lineSpacing: 0
+ m_lineSpacingMax: 0
+ m_paragraphSpacing: 0
+ m_charWidthMaxAdj: 0
+ m_enableWordWrapping: 0
+ m_wordWrappingRatios: 0.4
+ m_overflowMode: 0
+ m_firstOverflowCharacterIndex: -1
+ m_linkedTextComponent: {fileID: 0}
+ m_isLinkedTextComponent: 0
+ m_isTextTruncated: 0
+ m_enableKerning: 1
+ m_enableExtraPadding: 0
+ checkPaddingRequired: 0
+ m_isRichText: 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_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}
+ 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/Entity.prefab.meta b/Assets/Prefabs/Entity.prefab.meta
new file mode 100644
index 000000000..91900f482
--- /dev/null
+++ b/Assets/Prefabs/Entity.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 6aa81281891c79e4dabe3be35be479cd
+PrefabImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scenes/Main.unity b/Assets/Scenes/Main.unity
index 41d150c3b..81fb9a72e 100644
--- a/Assets/Scenes/Main.unity
+++ b/Assets/Scenes/Main.unity
@@ -11186,16 +11186,22 @@ MonoBehaviour:
TechTabButton: {fileID: 1250888060}
GalaxyZonePrototype: {fileID: 559120531}
GalaxyZoneLinkPrototype: {fileID: 899487252}
- ZoneObjectPrefab: {fileID: 5321404118521994133, guid: f9521191d31952a42a76632d158de0d3,
+ ZoneGravityObjectPrefab: {fileID: 5321404118521994133, guid: f9521191d31952a42a76632d158de0d3,
+ type: 3}
+ ZoneObjectPrefab: {fileID: 5800314421439145179, guid: 6aa81281891c79e4dabe3be35be479cd,
type: 3}
ZoneShipPrefab: {fileID: 795352744099449573, guid: 7c1524f8ce57a9943920988eae00c86e,
type: 3}
BeltPrefab: {fileID: 349597964696402918, guid: 1f1bfa2175a13b647888e2949e0cb138,
type: 3}
+ ChildEntityPrefab: {fileID: 1757477368280699322, guid: dfe057045c1f88945ae9256f34d7c8e6,
+ type: 3}
PlanetoidSprite: {fileID: 2800000, guid: 823d8a1c4e071994087624c39f62b319, type: 3}
PlanetSprite: {fileID: 2800000, guid: 0d2acbd593b7fd349b0b26b4844733ef, type: 3}
GasGiantSprite: {fileID: 2800000, guid: 39505115515c61f4db3c5c5397a5ba49, type: 3}
OrbitalSprite: {fileID: 2800000, guid: 97bce58bfe43bfa40870ca062cfb7ec1, type: 3}
+ ShipSprite: {fileID: 2800000, guid: 4eee2b60a0b77e248885aed0587c6329, type: 3}
+ TurretSprite: {fileID: 2800000, guid: 4eee2b60a0b77e248885aed0587c6329, type: 3}
SunSprite: {fileID: 2800000, guid: 6ca81c82c86205648a1a243805aae5c9, type: 3}
WormholeSprite: {fileID: 2800000, guid: 6d0b27330fdcc8347b1e09a2d17a0673, type: 3}
SelectedColor: {r: 1, g: 0.44583336, b: 0.050000012, a: 1}
@@ -11206,6 +11212,9 @@ MonoBehaviour:
ZoneMassPower: 0.25
AsteroidSpritesheetWidth: 4
AsteroidSpritesheetHeight: 4
+ ChildEntityDistance: 0.66
+ ChildEntityScale: 0.25
+ ChildEntityOffsetDegrees: 30
--- !u!4 &1126386501
Transform:
m_ObjectHideFlags: 0
diff --git a/Assets/Scripts/Editor/DatabaseInspector.cs b/Assets/Scripts/Editor/DatabaseInspector.cs
index 89fa37ffd..cad57e00f 100644
--- a/Assets/Scripts/Editor/DatabaseInspector.cs
+++ b/Assets/Scripts/Editor/DatabaseInspector.cs
@@ -1181,7 +1181,7 @@ public class DatabaseInspector : EditorWindow
(currentEventType == EventType.DragUpdated || currentEventType == EventType.DragPerform))
{
var guid = (Guid) DragAndDrop.GetGenericData("Item");
- var dragItem = DatabaseCache.Get(guid) as ItemData;
+ var dragItem = DatabaseCache.Get(guid) as CraftedItemData;
if (currentEventType == EventType.DragUpdated)
DragAndDrop.visualMode = dragItem != null ? DragAndDropVisualMode.Copy : DragAndDropVisualMode.Rejected;
else if (currentEventType == EventType.DragPerform && dragItem != null)
diff --git a/Assets/Scripts/Galaxy.cs b/Assets/Scripts/Galaxy.cs
index 70b9aa9d5..d0a66d43e 100644
--- a/Assets/Scripts/Galaxy.cs
+++ b/Assets/Scripts/Galaxy.cs
@@ -21,7 +21,7 @@ public class Galaxy : ScriptableObject
[Serializable]
public class GalaxyMapData
{
- public GlobalData GlobalData = new GlobalData() {ID = Guid.NewGuid()};
+ public GlobalData GlobalData = new GlobalData();
[HideInInspector]
public GalaxyMapLayerData StarDensity;
diff --git a/Assets/Scripts/ServerShared/Behaviors/FactoryBehavior.cs b/Assets/Scripts/ServerShared/Behaviors/FactoryBehavior.cs
index f4e1830a9..6a5e06d89 100644
--- a/Assets/Scripts/ServerShared/Behaviors/FactoryBehavior.cs
+++ b/Assets/Scripts/ServerShared/Behaviors/FactoryBehavior.cs
@@ -84,7 +84,6 @@ public class Factory : IBehavior, IPersistentBehavior
{
Context = Context,
Data = blueprintItemData.ID,
- ID = Guid.NewGuid(),
Ingredients = _reservedStock.Select(ii=>ii.ID).ToList(),
Quality = quality,
Blueprint = _blueprint
@@ -98,7 +97,6 @@ public class Factory : IBehavior, IPersistentBehavior
{
Context = Context,
Data = blueprintItemData.ID,
- ID = Guid.NewGuid(),
Ingredients = _reservedStock.Select(ii=>ii.ID).ToList(),
Quality = quality,
Blueprint = _blueprint
@@ -118,7 +116,6 @@ public class Factory : IBehavior, IPersistentBehavior
{
Context = Context,
Data = simpleCommodityData.ID,
- ID = Guid.NewGuid(),
Quantity = blueprint.Quantity
};
Context.Cache.Add(newSimpleCommodity);
@@ -181,7 +178,6 @@ public class Factory : IBehavior, IPersistentBehavior
{
Context = Context,
Data = simpleCommodity.Data,
- ID = Guid.NewGuid(),
Quantity = blueprintQuantity
};
simpleCommodity.Quantity -= blueprintQuantity;
diff --git a/Assets/Scripts/ServerShared/Behaviors/TowingController.cs b/Assets/Scripts/ServerShared/Behaviors/TowingController.cs
index 2861a00dc..d08b99ccd 100644
--- a/Assets/Scripts/ServerShared/Behaviors/TowingController.cs
+++ b/Assets/Scripts/ServerShared/Behaviors/TowingController.cs
@@ -50,6 +50,10 @@ public class TowingController : IBehavior, IPersistentBehavior, IController, IIn
public bool Update(float delta)
{
+ var towingTask = _context.Cache.Get(_towingTask);
+ if (towingTask == null)
+ return false;
+
if (_path.Any())
{
_locomotion.Update(delta);
@@ -64,7 +68,6 @@ public class TowingController : IBehavior, IPersistentBehavior, IController, IIn
}
else
{
- var towingTask = _context.Cache.Get(_towingTask);
var destination = float2(0);
var velocity = float2(0);
if (_towingPhase == TowingPhase.Pickup)
@@ -97,19 +100,17 @@ public class TowingController : IBehavior, IPersistentBehavior, IController, IIn
_velocityMatch.OnMatch += () =>
{
var target = _context.ZoneEntities[_entity.Zone][towingTask.Station];
- _entity.Children.Add(towingTask.Station);
- target.Parent = _entity.ID;
+ _context.SetParent(target, _entity);
_towingPhase = TowingPhase.Delivery;
_movementPhase = MovementPhase.Locomotion;
};
else
_velocityMatch.OnMatch += () =>
{
- var orbit = _context.CreateOrbit(towingTask.OrbitParent, _entity.Position);
-
var target = _context.ZoneEntities[_entity.Zone][towingTask.Station] as OrbitalEntity;
- _entity.Children.Remove(towingTask.Station);
- target.Parent = Guid.Empty;
+ _context.RemoveParent(target);
+
+ var orbit = _context.CreateOrbit(towingTask.OrbitParent, _entity.Position);
target.OrbitData = orbit.ID;
};
}
diff --git a/Assets/Scripts/ServerShared/DatabaseItems.cs b/Assets/Scripts/ServerShared/DatabaseItems.cs
index 50595c87b..9ce26ce91 100644
--- a/Assets/Scripts/ServerShared/DatabaseItems.cs
+++ b/Assets/Scripts/ServerShared/DatabaseItems.cs
@@ -135,6 +135,9 @@ public class LoadoutData : DatabaseEntry, INamedEntry
[JsonProperty("items"), Key(3)]
public List Items = new List();
+ [InspectableDatabaseLink(typeof(SimpleCommodityData)), JsonProperty("resourceRequirements"), Key(4)]
+ public Dictionary SimpleCargo = new Dictionary();
+
[IgnoreMember] public string EntryName
{
get => Name;
diff --git a/Assets/Scripts/ServerShared/Entity.cs b/Assets/Scripts/ServerShared/Entity.cs
index 147dd6d4e..fded7b6d2 100644
--- a/Assets/Scripts/ServerShared/Entity.cs
+++ b/Assets/Scripts/ServerShared/Entity.cs
@@ -13,7 +13,7 @@ using static Unity.Mathematics.math;
Union(0, typeof(Ship)),
Union(1, typeof(OrbitalEntity)),
JsonObject(MemberSerialization.OptIn), JsonConverter(typeof(JsonKnownTypesConverter))]
-public abstract class Entity : DatabaseEntry, IMessagePackSerializationCallbackReceiver
+public abstract class Entity : DatabaseEntry, IMessagePackSerializationCallbackReceiver, INamedEntry
{
[JsonProperty("temperature"), Key(1)] public float Temperature;
[JsonProperty("energy"), Key(2)] public float Energy;
@@ -27,6 +27,7 @@ public abstract class Entity : DatabaseEntry, IMessagePackSerializationCallbackR
[JsonProperty("hull"), Key(10)] public Guid Hull; // Type: Gear
[JsonProperty("persistedBehaviorData"), Key(11)] public Dictionary PersistedBehaviors;
[JsonProperty("corporation"), Key(12)] public Guid Corporation;
+ [JsonProperty("name"), Key(13)] public string Name;
// [IgnoreMember] protected List Behaviors;
[IgnoreMember] public Guid Zone;
@@ -44,10 +45,15 @@ public abstract class Entity : DatabaseEntry, IMessagePackSerializationCallbackR
[IgnoreMember] public float SpecificHeat { get; private set; }
[IgnoreMember] public float Visibility => VisibilitySources.Values.Sum();
+ [IgnoreMember] public string EntryName
+ {
+ get => Name;
+ set => Name = value;
+ }
+
public Entity(GameContext context, Guid hull, IEnumerable items, IEnumerable cargo, Guid zone)
{
- ID = Guid.NewGuid();
Context = context;
Zone = zone;
@@ -120,7 +126,8 @@ public abstract class Entity : DatabaseEntry, IMessagePackSerializationCallbackR
SpecificHeat = Context.Cache.Get(Hull).HeatCapacity +
EquippedItems.Select(i => Context.Cache.Get(i)).Sum(i => i.HeatCapacity) +
- Cargo.Select(i => Context.Cache.Get(i)).Sum(ii => ii.HeatCapacity);
+ Cargo.Select(i => Context.Cache.Get(i)).Sum(ii => ii.HeatCapacity) +
+ Children.Select(i => Context.Cache.Get(i)).Sum(c=>c.SpecificHeat);
}
public IEnumerable GetBehaviors() where T : class, IBehavior
diff --git a/Assets/Scripts/ServerShared/GameContext.cs b/Assets/Scripts/ServerShared/GameContext.cs
index 8e5715fdd..416e5102b 100644
--- a/Assets/Scripts/ServerShared/GameContext.cs
+++ b/Assets/Scripts/ServerShared/GameContext.cs
@@ -30,6 +30,8 @@ public class GameContext
private Dictionary _orbitVelocities = new Dictionary();
private Dictionary _orbitPositions = new Dictionary();
private Dictionary _previousOrbitPositions = new Dictionary();
+ private Dictionary _asteroidPositions = new Dictionary();
+ private Dictionary _asteroidPositionsUpdated = new Dictionary();
private Guid _forceLoadZone;
private Type[] _statObjects;
@@ -102,6 +104,9 @@ public class GameContext
: float2.zero;
}
+ foreach (var asteroids in _asteroidPositions.Keys)
+ _asteroidPositionsUpdated[asteroids] = false;
+
foreach (var corporation in Cache.GetAll())
{
foreach (var tasks in corporation.Tasks
@@ -222,6 +227,28 @@ public class GameContext
return _orbitVelocities.ContainsKey(orbit) ? _orbitVelocities[orbit] : float2.zero;
}
+ public float3[] GetAsteroidTransforms(Guid planetDataID)
+ {
+ var planetData = Cache.Get(planetDataID);
+ if (!_asteroidPositions.ContainsKey(planetDataID))
+ {
+ _asteroidPositions[planetDataID] = new float3[planetData.Asteroids.Length];
+ _asteroidPositionsUpdated[planetDataID] = false;
+ }
+
+ if (_asteroidPositionsUpdated[planetDataID])
+ return _asteroidPositions[planetDataID];
+ for (var i = 0; i < planetData.Asteroids.Length; i++)
+ {
+ _asteroidPositions[planetDataID][i] = float3(
+ OrbitData.Evaluate((float) frac(Time / -OrbitalPeriod(planetData.Asteroids[i].x) * GlobalData.OrbitSpeedMultiplier +
+ planetData.Asteroids[i].y)) * planetData.Asteroids[i].x,
+ (float) (Time * planetData.Asteroids[i].w % 360.0));
+ }
+
+ return _asteroidPositions[planetDataID];
+ }
+
public OrbitData CreateOrbit(Guid parent, float2 position)
{
var parentOrbit = Cache.Get(parent);
@@ -236,7 +263,6 @@ public class GameContext
{
Context = this,
Distance = distance,
- ID = Guid.NewGuid(),
Parent = parent,
Period = period,
Phase = storedPhase,
@@ -511,6 +537,138 @@ public class GameContext
return stat.Min;
return result;
}
+
+ public Entity CreateEntity(Guid zone, Guid corporation, Guid loadout)
+ {
+ if (!(Cache.Get(loadout) is LoadoutData loadoutData))
+ {
+ _logger("Attempted to spawn invalid loadout ID");
+ return null;
+ }
+
+ if (!(Cache.Get(loadoutData.Hull) is HullData hullData))
+ {
+ _logger("Attempted to spawn loadout with invalid hull ID");
+ return null;
+ }
+
+ if (!(Cache.Get(zone) is ZoneData zoneData))
+ {
+ _logger("Attempted to spawn entity with invalid zone ID");
+ return null;
+ }
+
+ if (!(Cache.Get(corporation) is Corporation corpData))
+ {
+ _logger("Attempted to spawn entity with invalid corporation ID");
+ return null;
+ }
+
+ var gearData = loadoutData.Items
+ .Take(hullData.Hardpoints.Count)
+ .Where(id => id != Guid.Empty)
+ .Select(id => Cache.Get(id))
+ .ToArray();
+
+ if (gearData.Any(g=>g==null))
+ {
+ _logger("Attempted to spawn loadout with invalid gear ID");
+ return null;
+ }
+
+ var cargoData = loadoutData.Items
+ .Skip(hullData.Hardpoints.Count)
+ .Where(id => id != Guid.Empty)
+ .Select(id => Cache.Get(id))
+ .ToArray();
+
+ if (cargoData.Any(g=>g==null))
+ {
+ _logger("Attempted to spawn loadout with invalid cargo ID");
+ return null;
+ }
+
+ var gear = gearData
+ .Select(gd => CreateInstance(gd.ID, GlobalData.StartingGearQualityMin, GlobalData.StartingGearQualityMax))
+ .ToArray();
+
+ if (gear.Any(g=>g==null))
+ return null;
+
+ foreach(var g in gear)
+ Cache.Add(g);
+
+ var cargo = cargoData
+ .Select(gd => CreateInstance(gd.ID, GlobalData.StartingGearQualityMin, GlobalData.StartingGearQualityMax))
+ .ToArray();
+
+ if (cargo.Any(g=>g==null))
+ return null;
+
+ foreach(var c in cargo)
+ Cache.Add(c);
+
+ var simpleCargo = loadoutData.SimpleCargo?
+ .Select(x => CreateInstance(x.Key, x.Value))
+ .ToArray() ?? new SimpleCommodity[0];
+
+ if (simpleCargo.Any(g=>g==null))
+ return null;
+
+ foreach(var c in simpleCargo)
+ Cache.Add(c);
+
+ var hull = CreateInstance(loadoutData.Hull, GlobalData.StartingGearQualityMin, GlobalData.StartingGearQualityMax);
+
+ if(hull==null)
+ return null;
+
+ // Load target zone if not yet loaded
+ if (!_loadedZones.Contains(zone))
+ LoadZone(zone);
+
+ if (hullData.HullType == HullType.Ship)
+ {
+ var entity = new Ship(this, hull.ID, gear.Select(g => g.ID),
+ cargo.Select(c => c.ID).Concat(simpleCargo.Select(c => c.ID)), zone)
+ {
+ Name = $"{loadoutData.Name} {Random.NextInt(1,255):X}"
+ };
+ Cache.Add(entity);
+
+ ZoneEntities[zone][entity.ID] = entity;
+ return entity;
+ }
+
+ if (hullData.HullType == HullType.Station)
+ {
+ var distance = lerp(.2f, .8f, Random.NextFloat()) * zoneData.Radius;
+ var orbit = new OrbitData
+ {
+ Context = this,
+ Distance = distance,
+ Parent = _orbits
+ .Select(id => Cache.Get(id))
+ .First(orbitData => orbitData.Zone == zone && orbitData.Parent == Guid.Empty).ID,
+ Period = OrbitalPeriod(distance),
+ Phase = Random.NextFloat(),
+ Zone = zone
+ };
+ Cache.Add(orbit);
+
+ var entity = new OrbitalEntity(this, hull.ID, gear.Select(g => g.ID),
+ cargo.Select(c => c.ID).Concat(simpleCargo.Select(c => c.ID)), orbit.ID, zone)
+ {
+ Name = $"{loadoutData.Name} {Random.NextInt(1,255):X}"
+ };
+ Cache.Add(entity);
+
+ ZoneEntities[zone][entity.ID] = entity;
+ return entity;
+ }
+
+ return null;
+ }
public SimpleCommodity CreateInstance(Guid data, int count)
{
@@ -519,15 +677,14 @@ public class GameContext
return new SimpleCommodity
{
Data = data,
- Quantity = count,
- ID = Guid.NewGuid()
+ Quantity = count
};
_logger("Attempted to create Simple Commodity instance using missing or incorrect item id");
return null;
}
- public CraftedItemInstance CreateInstance(Guid data, float quality)
+ public CraftedItemInstance CreateInstance(Guid data, float qualityMin, float qualityMax)
{
var item = Cache.Get(data);
if (item == null)
@@ -548,7 +705,7 @@ public class GameContext
var ingredient = Cache.Get(ci.Key);
return ingredient is SimpleCommodityData
? (IEnumerable) new[] {CreateInstance(ci.Key, ci.Value)}
- : Enumerable.Range(0, ci.Value).Select(i => CreateInstance(ci.Key, quality));
+ : Enumerable.Range(0, ci.Value).Select(i => CreateInstance(ci.Key, qualityMin, qualityMax));
})
.ToList();
@@ -560,9 +717,8 @@ public class GameContext
{
Context = this,
Data = data,
- ID = Guid.NewGuid(),
Ingredients = ingredients.Select(i=>i.ID).ToList(),
- Quality = quality,
+ Quality = Random.NextFloat(qualityMin, qualityMax),
Blueprint = blueprint.ID
};
newGear.Durability = Evaluate(equippableItemData.Durability, newGear);
@@ -574,9 +730,8 @@ public class GameContext
{
Context = this,
Data = data,
- ID = Guid.NewGuid(),
Ingredients = ingredients.Select(i=>i.ID).ToList(),
- Quality = quality,
+ Quality = Random.NextFloat(qualityMin, qualityMax),
Blueprint = blueprint.ID
};
Cache.Add(newCommodity);
@@ -615,4 +770,21 @@ public class GameContext
searched.Add(s);
}
}
+
+ public void SetParent(Entity child, Entity parent)
+ {
+ child.Parent = parent.ID;
+ parent.Children.Add(child.ID);
+ parent.RecalculateMass();
+ }
+
+ public void RemoveParent(Entity child)
+ {
+ if (child.Parent == Guid.Empty)
+ return;
+
+ var parent = Cache.Get(child.Parent);
+ parent.Children.Remove(child.ID);
+ child.Parent = Guid.Empty;
+ }
}
\ No newline at end of file
diff --git a/Assets/Scripts/ServerShared/GlobalData.cs b/Assets/Scripts/ServerShared/GlobalData.cs
index 9ba8411c1..21589ec8e 100644
--- a/Assets/Scripts/ServerShared/GlobalData.cs
+++ b/Assets/Scripts/ServerShared/GlobalData.cs
@@ -133,6 +133,12 @@ public class GlobalData : DatabaseEntry
[InspectableField, JsonProperty("resourceDensityMaximum"), Key(41)]
public float ResourceDensityMaximum = 1.5f;
+
+ [InspectableField, JsonProperty("startingGearQualityMin"), Key(42)]
+ public float StartingGearQualityMin = .1f;
+
+ [InspectableField, JsonProperty("startingGearQualityMax"), Key(43)]
+ public float StartingGearQualityMax = .5f;
public float PlanetRadius(float mass)
{
diff --git a/Assets/Scripts/ServerShared/ZoneGenerator.cs b/Assets/Scripts/ServerShared/ZoneGenerator.cs
index 232d7592b..665fba7fe 100644
--- a/Assets/Scripts/ServerShared/ZoneGenerator.cs
+++ b/Assets/Scripts/ServerShared/ZoneGenerator.cs
@@ -54,9 +54,8 @@ public class ZoneGenerator
// Create orbit database entries
orbitData = planets.Select(planet =>
{
- var data = new OrbitData()
+ var data = new OrbitData
{
- ID = Guid.NewGuid(),
Distance = planet.Distance,
Period = planet.Period,
Phase = planet.Phase,
@@ -95,7 +94,6 @@ public class ZoneGenerator
var planetData = new PlanetData
{
Mass = planet.Mass,
- ID = Guid.NewGuid(),
Orbit = orbitMap[planet].ID,
Zone = zone.ID,
Belt = planet.Belt,
diff --git a/Assets/Scripts/StrategyGameManager.cs b/Assets/Scripts/StrategyGameManager.cs
index a0d40b6fb..4ef82bed1 100644
--- a/Assets/Scripts/StrategyGameManager.cs
+++ b/Assets/Scripts/StrategyGameManager.cs
@@ -43,15 +43,19 @@ public class StrategyGameManager : MonoBehaviour
[Section("Prefabs & Prototypes")]
public Prototype GalaxyZonePrototype;
public Prototype GalaxyZoneLinkPrototype;
+ public ZoneGravityObject ZoneGravityObjectPrefab;
public ZoneObject ZoneObjectPrefab;
public ZoneShip ZoneShipPrefab;
public MeshFilter BeltPrefab;
+ public MeshRenderer ChildEntityPrefab;
[Section("Textures")]
public Texture2D PlanetoidSprite;
public Texture2D PlanetSprite;
public Texture2D GasGiantSprite;
public Texture2D OrbitalSprite;
+ public Texture2D ShipSprite;
+ public Texture2D TurretSprite;
public Texture2D SunSprite;
public Texture2D WormholeSprite;
@@ -64,6 +68,9 @@ public class StrategyGameManager : MonoBehaviour
public float ZoneMassPower = .5f;
public int AsteroidSpritesheetWidth = 4;
public int AsteroidSpritesheetHeight = 4;
+ public float ChildEntityDistance = .66f;
+ public float ChildEntityScale = .25f;
+ public float ChildEntityOffsetDegrees = 30f;
private DatabaseCache _cache;
private GameContext _context;
@@ -74,10 +81,11 @@ public class StrategyGameManager : MonoBehaviour
private Guid _selectedZone;
private GalaxyZone _selectedGalaxyZone;
private Dictionary _galaxyZoneObjects = new Dictionary();
- private Dictionary _zoneObjects = new Dictionary(); // Key is Orbit
+ private Dictionary _zoneGravityObjects = new Dictionary(); // Key is Orbit
private Dictionary _zoneBelts = new Dictionary();
private Dictionary _zoneShips = new Dictionary();
- private List _wormholes = new List();
+ private Dictionary _zoneOrbitals = new Dictionary();
+ private List _wormholes = new List();
private Vector3 _galaxyCameraPos = -Vector3.forward;
private float _galaxyOrthoSize = 50;
private Material _boundaryMaterial;
@@ -88,6 +96,7 @@ public class StrategyGameManager : MonoBehaviour
private Guid _playerCorporation;
private Dictionary _corpOptionMap = new Dictionary();
private CorporationMenuItem _selectedParent;
+ private Dictionary _childEntityPositions = new Dictionary();
void Start()
{
@@ -124,7 +133,6 @@ public class StrategyGameManager : MonoBehaviour
player = new Player
{
Context = _context,
- ID = Guid.NewGuid(),
Username = Environment.UserName
};
_cache.Add(player);
@@ -171,7 +179,6 @@ public class StrategyGameManager : MonoBehaviour
var newCorp = new Corporation
{
Context = _context,
- ID = Guid.NewGuid(),
Name = CorpNameInputField.text,
Parent = _corpOptionMap[_selectedParent]
};
@@ -181,8 +188,17 @@ public class StrategyGameManager : MonoBehaviour
GameMenuRoot.gameObject.SetActive(true);
CorpMenuRoot.gameObject.SetActive(false);
- _selectedZone = _cache.Get(newCorp.Parent).HomeZone;
+ var parentCorp = _cache.Get(newCorp.Parent);
+ _selectedZone = parentCorp.HomeZone;
ZoneTabButton.OnPointerClick(null);
+
+ var entities = new List();
+ foreach(var loadout in parentCorp.InitialFleet)
+ for(int i=0; i e is OrbitalEntity);
+ foreach (var ship in entities.Where(e => e is Ship))
+ _context.SetParent(ship, colony);
}
};
}
@@ -277,7 +293,7 @@ public class StrategyGameManager : MonoBehaviour
PropertiesPanel.Clear();
PropertiesPanel.Title.text = _context.GlobalData.GalaxyName;
PropertiesPanel.AddSection("Galaxy");
- PropertiesPanel.AddProperty("Sectors", $"{_context.GalaxyZones.Count}");
+ PropertiesPanel.AddProperty("Sectors", () => $"{_context.GalaxyZones.Count}");
}
private void PopulateZoneProperties(Guid zone)
@@ -286,7 +302,7 @@ public class StrategyGameManager : MonoBehaviour
var zoneData = _cache.Get(zone);
PropertiesPanel.Title.text = zoneData.Name;
PropertiesPanel.AddSection("Sector");
- PropertiesPanel.AddProperty("Planets", $"{zoneData.Planets.Length}");
+ PropertiesPanel.AddProperty("Planets", () => $"{zoneData.Planets.Length}");
}
private void PopulateTechProperties()
@@ -294,9 +310,9 @@ public class StrategyGameManager : MonoBehaviour
PropertiesPanel.Clear();
PropertiesPanel.Title.text = "Technologies";
var count = _context.Cache.GetAll().Count();
- PropertiesPanel.AddProperty("Discovered Techs", $"{count}");
- PropertiesPanel.AddProperty("Available Techs", $"{count}");
- PropertiesPanel.AddProperty("Researched Techs", $"{count}");
+ PropertiesPanel.AddProperty("Discovered Techs", () => $"{count}");
+ PropertiesPanel.AddProperty("Available Techs", () => $"{count}");
+ PropertiesPanel.AddProperty("Researched Techs", () => $"{count}");
}
private void Update()
@@ -314,7 +330,7 @@ public class StrategyGameManager : MonoBehaviour
}
if (_currentTab == ZoneTabButton && _populatedZone == _selectedZone)
{
- foreach (var planet in _zoneObjects)
+ foreach (var planet in _zoneGravityObjects)
{
planet.Value.transform.position = float3(_context.GetOrbitPosition(planet.Key) * ZoneSizeScale, .1f);
}
@@ -333,9 +349,135 @@ public class StrategyGameManager : MonoBehaviour
thrusterScale.x = ship.Key.Axes[ship.Key.GetAxis()].Value;
ship.Value.Thruster.localScale = thrusterScale;
}
+
+ var entities = _context.GetEntities(_populatedZone);
+ var shipGameObjects = _zoneShips.Keys.ToList();
+ var orbitalGameObjects = _zoneOrbitals.Keys.ToList();
+ var zoneShips = entities.Where(e => e is Ship && e.Parent == Guid.Empty).Cast();
+ var zoneOrbitals = entities.Where(e => e is OrbitalEntity && e.Parent == Guid.Empty).Cast();
+
+ void PopulateChildObjects(ZoneObject zoneObject, Entity entity)
+ {
+ if (zoneObject.Children.Count != entity.Children.Count)
+ {
+ foreach(var child in zoneObject.Children)
+ Destroy(child.gameObject);
+ zoneObject.Children.Clear();
+ var positions = GetChildEntityPositions(entity.Children.Count);
+ foreach (var child in entity.Children)
+ {
+ var childEntity = _context.Cache.Get(child);
+ var childGameObject = Instantiate(ChildEntityPrefab, zoneObject.transform);
+ childGameObject.material.SetTexture("_MainTex", childEntity is Ship ? ShipSprite : OrbitalSprite );
+ childGameObject.GetComponent().OnClick += (collider, data) =>
+ {
+ if (data.button == PointerEventData.InputButton.Left)
+ PopulatePropertiesPanel(child);
+ else if (data.button == PointerEventData.InputButton.Right)
+ ShowContextMenu(child);
+ };
+ zoneObject.Children.Add(childGameObject);
+ }
+
+ for (int i = 0; i < entity.Children.Count; i++)
+ zoneObject.Children[i].transform.localPosition = (Vector2) positions[i];
+ }
+ }
+
+ foreach (var ship in zoneShips)
+ {
+ if (!_zoneShips.ContainsKey(ship))
+ {
+ var zoneShip = Instantiate(ZoneShipPrefab, ZoneRoot);
+ zoneShip.Icon.GetComponent().OnClick += (collider, data) =>
+ {
+ if (data.button == PointerEventData.InputButton.Left)
+ PopulatePropertiesPanel(ship.ID);
+ else if (data.button == PointerEventData.InputButton.Right)
+ ShowContextMenu(ship.ID);
+ };
+ zoneShip.Label.text = ship.Name;
+ _zoneShips[ship] = zoneShip;
+ }
+
+ _zoneShips[ship].transform.position = float3(ship.Position * ZoneSizeScale, .05f);
+ _zoneShips[ship].Icon.transform.up = (Vector2) ship.Direction;
+ var thrusterScale = _zoneShips[ship].Thruster.localScale;
+ thrusterScale.x = ship.Axes[ship.GetAxis()].Value;
+ _zoneShips[ship].Thruster.localScale = thrusterScale;
+
+ PopulateChildObjects(_zoneShips[ship], ship);
+
+ shipGameObjects.Remove(ship);
+ }
+
+ // We have removed all game objects which are associated with active entities
+ // Any game objects remaining are orphans and must be executed
+ foreach(var ship in shipGameObjects)
+ {
+ Destroy(_zoneShips[ship].gameObject);
+ _zoneShips.Remove(ship);
+ }
+
+ foreach (var orbital in zoneOrbitals)
+ {
+ if (!_zoneOrbitals.ContainsKey(orbital))
+ {
+ var zoneOrbital = Instantiate(ZoneObjectPrefab, ZoneRoot);
+ zoneOrbital.Icon.material.SetTexture("_MainTex", OrbitalSprite );
+ zoneOrbital.Icon.GetComponent().OnClick += (collider, data) =>
+ {
+ if (data.button == PointerEventData.InputButton.Left)
+ PopulatePropertiesPanel(orbital.ID);
+ else if (data.button == PointerEventData.InputButton.Right)
+ ShowContextMenu(orbital.ID);
+ };
+ zoneOrbital.Label.text = orbital.Name;
+ _zoneOrbitals[orbital] = zoneOrbital;
+ }
+
+ _zoneOrbitals[orbital].transform.position = float3(orbital.Position * ZoneSizeScale, .05f);
+ _zoneOrbitals[orbital].Icon.transform.up = (Vector2) orbital.Direction;
+
+ PopulateChildObjects(_zoneOrbitals[orbital], orbital);
+
+ orbitalGameObjects.Remove(orbital);
+ }
+
+ foreach(var orbital in orbitalGameObjects)
+ {
+ Destroy(_zoneOrbitals[orbital].gameObject);
+ _zoneOrbitals.Remove(orbital);
+ }
}
}
+ private float2[] GetChildEntityPositions(int count)
+ {
+ if (!_childEntityPositions.ContainsKey(count))
+ {
+ var down = float2(0, -ChildEntityDistance);
+ var positions = new float2[count];
+ if (count % 2 == 1)
+ {
+ positions[0] = down;
+ for (int i = 1; i < count; i++)
+ positions[i] = mul(float3(down, 1), Unity.Mathematics.float3x3.RotateZ(
+ Mathf.Deg2Rad * ChildEntityOffsetDegrees * ((i - 1) / 2 + 1) * (i % 2 == 1 ? 1 : -1))).xy;
+ }
+ else
+ {
+ for (int i = 0; i < count; i++)
+ positions[i] = mul(float3(down, 1), Unity.Mathematics.float3x3.RotateZ(
+ Mathf.Deg2Rad * ((ChildEntityOffsetDegrees * (i / 2 + 1) - ChildEntityOffsetDegrees/2) * (i % 2 == 1 ? 1 : -1)))).xy;
+ }
+
+ _childEntityPositions[count] = positions;
+ }
+
+ return _childEntityPositions[count];
+ }
+
private void OnApplicationQuit()
{
if (TestMode)
@@ -344,11 +486,12 @@ public class StrategyGameManager : MonoBehaviour
}
}
- void ShowContextMenu(object clickTarget)
+ void ShowContextMenu(Guid clickTarget)
{
+ var targetObject = _context.Cache.Get(clickTarget);
ContextMenu.gameObject.SetActive(true);
ContextMenu.Clear();
- if (clickTarget is PlanetData planet)
+ if (targetObject is PlanetData planet)
{
ContextMenu.AddOption("Test Option 1", () => Debug.Log("Test Option 1 Selected"));
ContextMenu.AddOption("Test Option 2", () => Debug.Log("Test Option 2 Selected"));
@@ -360,9 +503,38 @@ public class StrategyGameManager : MonoBehaviour
});
ContextMenu.AddOption("Test Option 3", () => Debug.Log("Test Option 3 Selected"));
}
+ else
+ {
+ ContextMenu.gameObject.SetActive(false);
+ return;
+ }
ContextMenu.Show();
}
+ void PopulatePropertiesPanel(Guid clickTarget)
+ {
+ var targetObject = _context.Cache.Get(clickTarget);
+
+ if (targetObject is PlanetData planet)
+ {
+ PropertiesPanel.Clear();
+ PropertiesPanel.Title.text = planet.Name;
+ if(planet.Belt)
+ PropertiesPanel.AddSection("Asteroid Belt");
+ else
+ PropertiesPanel.AddSection(planet.Mass > _context.GlobalData.SunMass ? "Star" :
+ planet.Mass > _context.GlobalData.GasGiantMass ? "Gas Giant" :
+ planet.Mass > _context.GlobalData.PlanetMass ? "Planet" :
+ "Planetoid");
+ PropertiesPanel.AddProperty("Mass", () => $"{planet.Mass}");
+ PropertiesPanel.AddList("Resources", planet.Resources.Select(resource =>
+ {
+ var itemData = _context.Cache.Get(resource.Key);
+ return new Tuple(itemData.Name, $"{resource.Value:0}");
+ }));
+ }
+ }
+
void PopulateGalaxy()
{
_galaxyPopulated = true;
@@ -463,8 +635,8 @@ public class StrategyGameManager : MonoBehaviour
void PopulateZone()
{
// Delete all the existing zone contents
- foreach (var zoneObject in _zoneObjects.Values) Destroy(zoneObject.gameObject);//zoneObject.GetComponent().ReturnToPool();
- _zoneObjects.Clear();
+ foreach (var zoneObject in _zoneGravityObjects.Values) Destroy(zoneObject.gameObject);//zoneObject.GetComponent().ReturnToPool();
+ _zoneGravityObjects.Clear();
foreach (var zoneObject in _wormholes) Destroy(zoneObject.gameObject); //zoneObject.GetComponent().ReturnToPool();
_wormholes.Clear();
foreach (var belt in _zoneBelts.Values) Destroy(belt.Transform.gameObject);
@@ -490,8 +662,8 @@ public class StrategyGameManager : MonoBehaviour
var planetData = _cache.Get(planet);
if (!planetData.Belt)
{
- var planetObject = Instantiate(ZoneObjectPrefab, ZoneRoot);
- _zoneObjects[planetData.Orbit] = planetObject;
+ var planetObject = Instantiate(ZoneGravityObjectPrefab, ZoneRoot);
+ _zoneGravityObjects[planetData.Orbit] = planetObject;
planetObject.Label.text = planetData.Name;
planetObject.GravityMesh.gameObject.SetActive(true);
planetObject.GravityMesh.transform.localScale =
@@ -509,50 +681,23 @@ public class StrategyGameManager : MonoBehaviour
planetObject.Icon.GetComponent().OnClick += (collider, data) =>
{
if (data.button == PointerEventData.InputButton.Left)
- {
- PropertiesPanel.Clear();
- PropertiesPanel.Title.text = planetData.Name;
- PropertiesPanel.AddSection(planetData.Mass > _context.GlobalData.SunMass ? "Star" :
- planetData.Mass > _context.GlobalData.GasGiantMass ? "Gas Giant" :
- planetData.Mass > _context.GlobalData.PlanetMass ? "Planet" :
- "Planetoid");
- PropertiesPanel.AddProperty("Mass", $"{planetData.Mass}");
- PropertiesPanel.AddList("Resources", planetData.Resources.Select(resource =>
- {
- var itemData = _context.Cache.Get(resource.Key);
- return new Tuple(itemData.Name, $"{resource.Value:0}");
- }));
- }
- else if (data.button == PointerEventData.InputButton.Right)
- {
- ShowContextMenu(planetData);
- }
+ PopulatePropertiesPanel(planetData.ID);
+ else if (data.button == PointerEventData.InputButton.Right)
+ ShowContextMenu(planetData.ID);
};
}
else
{
var beltObject = Instantiate(BeltPrefab, ZoneRoot);
var collider = beltObject.GetComponent();
- var belt = new AsteroidBelt(_context, beltObject, collider, planetData, AsteroidSpritesheetWidth, AsteroidSpritesheetHeight, ZoneSizeScale);
+ var belt = new AsteroidBelt(_context, beltObject, collider, planetData.ID, AsteroidSpritesheetWidth, AsteroidSpritesheetHeight, ZoneSizeScale);
_zoneBelts[_cache.Get(planetData.Orbit).Parent] = belt;
beltObject.GetComponent().OnClick += (_, data) =>
{
if (data.button == PointerEventData.InputButton.Left)
- {
- PropertiesPanel.Clear();
- PropertiesPanel.Title.text = planetData.Name;
- PropertiesPanel.AddSection("Asteroid Belt");
- PropertiesPanel.AddProperty("Mass", $"{planetData.Mass}");
- PropertiesPanel.AddList("Resources", planetData.Resources.Select(resource =>
- {
- var itemData = _context.Cache.Get(resource.Key);
- return new Tuple(itemData.Name, $"{resource.Value:0}");
- }));
- }
- else if (data.button == PointerEventData.InputButton.Right)
- {
- ShowContextMenu(planetData);
- }
+ PopulatePropertiesPanel(planetData.ID);
+ else if (data.button == PointerEventData.InputButton.Right)
+ ShowContextMenu(planetData.ID);
};
}
}
@@ -565,7 +710,7 @@ public class StrategyGameManager : MonoBehaviour
foreach (var wormhole in zoneData.Wormholes)
{
var otherZone = _context.GalaxyZones[wormhole];
- var wormholeObject = Instantiate(ZoneObjectPrefab, ZoneRoot);
+ var wormholeObject = Instantiate(ZoneGravityObjectPrefab, ZoneRoot);
_wormholes.Add(wormholeObject);
wormholeObject.transform.position = (Vector2) (_context.WormholePosition(zoneData.ID, wormhole) * ZoneSizeScale);
wormholeObject.GravityMesh.gameObject.SetActive(false);
@@ -603,62 +748,71 @@ public class StrategyGameManager : MonoBehaviour
return;
}
+ var loadoutData = _context.Cache.GetAll().FirstOrDefault(l => l.Name == args[1]);
+ if (loadoutData == null)
+ {
+ Debug.Log($"Loadout with name \"{args[1]}\" not found!");
+ return;
+ }
+
+ _context.CreateEntity(_populatedZone, _playerCorporation, loadoutData.ID);
+
// Parse first argument as hull name, default to Fighter if argument missing
- HullData hullData;
- if (args.Length > 1)
- {
- hullData = _cache.GetAll().FirstOrDefault(h => h.Name == args[1]);
- if (hullData == null)
- {
- Debug.Log($"Hull with name \"{args[1]}\" not found!");
- return;
- }
- }
- else
- {
- hullData = _cache.GetAll().FirstOrDefault(h => h.Name == "Fighter");
- }
- var hull = _context.CreateInstance(hullData.ID, .9f) as Gear;
-
- List gear = new List();
- if (args.Length > 2)
- {
- foreach (string arg in args.Skip(2))
- {
- var gearData = _cache.GetAll().FirstOrDefault(h => h.Name == arg);
- if (gearData == null)
- {
- Debug.Log($"Gear with name \"{arg}\" not found!");
- return;
- }
- gear.Add(_context.CreateInstance(gearData.ID, .9f) as Gear);
- }
- }
- else
- {
- // If no gear arguments supplied and we're spawning a ship, get the first thruster and put it in
- if (args[0] == "ship")
- {
- var thrusterData = _cache.GetAll().FirstOrDefault(g => g.Behaviors.Any(b => b is ThrusterData));
- var thruster = _context.CreateInstance(thrusterData.ID, .9f) as Gear;
- gear.Add(thruster);
- }
- }
-
- if (args[0] == "ship")
- {
- var entity = new Ship(_context, hull.ID, gear.Select(i=>i.ID), Enumerable.Empty(), _populatedZone);
- _context.Cache.Add(entity);
- _context.ZoneEntities[_populatedZone][entity.ID] = entity;
- //_context.Agents.Add(new AgentController(_context, _populatedZone, entity.ID));
- var zoneShip = Instantiate(ZoneShipPrefab, ZoneRoot);
- zoneShip.Label.text = $"Ship {_zoneShips.Count}";
- _zoneShips[entity] = zoneShip;
- }
- else
- {
- Debug.Log($"Unknown entity type: \"{args[0]}\"");
- }
+ // HullData hullData;
+ // if (args.Length > 1)
+ // {
+ // hullData = _cache.GetAll().FirstOrDefault(h => h.Name == args[1]);
+ // if (hullData == null)
+ // {
+ // Debug.Log($"Hull with name \"{args[1]}\" not found!");
+ // return;
+ // }
+ // }
+ // else
+ // {
+ // hullData = _cache.GetAll().FirstOrDefault(h => h.Name == "Fighter");
+ // }
+ // var hull = _context.CreateInstance(hullData.ID, .9f) as Gear;
+ //
+ // List gear = new List();
+ // if (args.Length > 2)
+ // {
+ // foreach (string arg in args.Skip(2))
+ // {
+ // var gearData = _cache.GetAll().FirstOrDefault(h => h.Name == arg);
+ // if (gearData == null)
+ // {
+ // Debug.Log($"Gear with name \"{arg}\" not found!");
+ // return;
+ // }
+ // gear.Add(_context.CreateInstance(gearData.ID, .9f) as Gear);
+ // }
+ // }
+ // else
+ // {
+ // // If no gear arguments supplied and we're spawning a ship, get the first thruster and put it in
+ // if (args[0] == "ship")
+ // {
+ // var thrusterData = _cache.GetAll().FirstOrDefault(g => g.Behaviors.Any(b => b is ThrusterData));
+ // var thruster = _context.CreateInstance(thrusterData.ID, .9f) as Gear;
+ // gear.Add(thruster);
+ // }
+ // }
+ //
+ // if (args[0] == "ship")
+ // {
+ // var entity = new Ship(_context, hull.ID, gear.Select(i=>i.ID), Enumerable.Empty(), _populatedZone);
+ // _context.Cache.Add(entity);
+ // _context.ZoneEntities[_populatedZone][entity.ID] = entity;
+ // //_context.Agents.Add(new AgentController(_context, _populatedZone, entity.ID));
+ // var zoneShip = Instantiate(ZoneShipPrefab, ZoneRoot);
+ // zoneShip.Label.text = $"Ship {_zoneShips.Count}";
+ // _zoneShips[entity] = zoneShip;
+ // }
+ // else
+ // {
+ // Debug.Log($"Unknown entity type: \"{args[0]}\"");
+ // }
}
void newzone(string[] args)
@@ -738,12 +892,12 @@ public class AsteroidBelt
private Vector3[] _normals;
private Vector2[] _uvs;
private int[] _indices;
- private PlanetData _data;
+ private Guid _data;
private GameContext _context;
private Mesh _mesh;
private float _zoneScale;
- public AsteroidBelt(GameContext context, MeshFilter meshFilter, MeshCollider collider, PlanetData data, int spritesheetWidth, int spritesheetHeight, float zoneScale)
+ public AsteroidBelt(GameContext context, MeshFilter meshFilter, MeshCollider collider, Guid data, int spritesheetWidth, int spritesheetHeight, float zoneScale)
{
Transform = collider.transform;
_context = context;
@@ -751,18 +905,19 @@ public class AsteroidBelt
_filter = meshFilter;
_collider = collider;
_zoneScale = zoneScale;
- _vertices = new Vector3[data.Asteroids.Length*4];
- _normals = new Vector3[data.Asteroids.Length*4];
- _uvs = new Vector2[data.Asteroids.Length*4];
- _indices = new int[data.Asteroids.Length*6];
+ var planetData = context.Cache.Get(data);
+ _vertices = new Vector3[planetData.Asteroids.Length*4];
+ _normals = new Vector3[planetData.Asteroids.Length*4];
+ _uvs = new Vector2[planetData.Asteroids.Length*4];
+ _indices = new int[planetData.Asteroids.Length*6];
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 < _data.Asteroids.Length; i++)
+ for (var i = 0; i < planetData.Asteroids.Length; i++)
{
- if (_data.Asteroids[i].x > maxDist)
- maxDist = _data.Asteroids[i].x;
+ if (planetData.Asteroids[i].x > maxDist)
+ maxDist = planetData.Asteroids[i].x;
var spriteX = Random.Range(0, spritesheetWidth);
var spriteY = Random.Range(0, spritesheetHeight);
@@ -797,16 +952,16 @@ public class AsteroidBelt
public void Update()
{
- for (var i = 0; i < _data.Asteroids.Length; i++)
+ var planetData = _context.Cache.Get(_data);
+ var asteroidTransforms = _context.GetAsteroidTransforms(_data);
+ for (var i = 0; i < planetData.Asteroids.Length; i++)
{
- var rotation = Quaternion.Euler(0, 0, (float) (_context.Time * _data.Asteroids[i].w % 360.0));
- var position = (Vector3) (Vector2)
- OrbitData.Evaluate((float) frac(_context.Time / -_context.OrbitalPeriod(_data.Asteroids[i].x) *
- _context.GlobalData.OrbitSpeedMultiplier + _data.Asteroids[i].y)) * (_data.Asteroids[i].x * _zoneScale);
- _vertices[i * 4] = rotation * new Vector3(-_data.Asteroids[i].z,-_data.Asteroids[i].z,0) + position;
- _vertices[i * 4 + 1] = rotation * new Vector3(-_data.Asteroids[i].z,_data.Asteroids[i].z,0) + position;
- _vertices[i * 4 + 2] = rotation * new Vector3(_data.Asteroids[i].z,_data.Asteroids[i].z,0) + position;
- _vertices[i * 4 + 3] = rotation * new Vector3(_data.Asteroids[i].z,-_data.Asteroids[i].z,0) + position;
+ var rotation = Quaternion.Euler(0, 0, asteroidTransforms[i].z);
+ var position = (Vector3) (Vector2) asteroidTransforms[i].xy * _zoneScale;
+ _vertices[i * 4] = rotation * new Vector3(-planetData.Asteroids[i].z,-planetData.Asteroids[i].z,0) + position;
+ _vertices[i * 4 + 1] = rotation * new Vector3(-planetData.Asteroids[i].z,planetData.Asteroids[i].z,0) + position;
+ _vertices[i * 4 + 2] = rotation * new Vector3(planetData.Asteroids[i].z,planetData.Asteroids[i].z,0) + position;
+ _vertices[i * 4 + 3] = rotation * new Vector3(planetData.Asteroids[i].z,-planetData.Asteroids[i].z,0) + position;
}
_mesh.vertices = _vertices;
diff --git a/Assets/Scripts/TechTreeMsagl.cs b/Assets/Scripts/TechTreeMsagl.cs
index ac4eea7ff..93c807998 100644
--- a/Assets/Scripts/TechTreeMsagl.cs
+++ b/Assets/Scripts/TechTreeMsagl.cs
@@ -333,10 +333,10 @@ public class TechTreeMsagl : MonoBehaviour
PropertiesPanel.Clear();
var blueprint = (BlueprintData) vertex.UserData;
PropertiesPanel.Title.text = blueprint.Name;
- PropertiesPanel.AddProperty("Research Time", $"{blueprint.ResearchTime:0.##} MH");
- PropertiesPanel.AddProperty("Produces", $"{blueprint.Quantity} {Context.Cache.Get(blueprint.Item).Name}");
- PropertiesPanel.AddProperty("Production Quality", $"{Mathf.RoundToInt(blueprint.Quality * 100)}%");
- PropertiesPanel.AddProperty("Production Time", $"{blueprint.ProductionTime:0.##} MH");
+ PropertiesPanel.AddProperty("Research Time", () => $"{blueprint.ResearchTime:0.##} MH");
+ PropertiesPanel.AddProperty("Produces", () => $"{blueprint.Quantity} {Context.Cache.Get(blueprint.Item).Name}");
+ PropertiesPanel.AddProperty("Production Quality", () => $"{Mathf.RoundToInt(blueprint.Quality * 100)}%");
+ PropertiesPanel.AddProperty("Production Time", () => $"{blueprint.ProductionTime:0.##} MH");
PropertiesPanel.AddList("Ingredients", blueprint.Ingredients.Select(ingredient =>
{
var ingredientData = Context.Cache.Get(ingredient.Key);
diff --git a/Assets/Scripts/UI/PropertyLabel.cs b/Assets/Scripts/UI/PropertyLabel.cs
index 22532c96d..a35f98c1f 100644
--- a/Assets/Scripts/UI/PropertyLabel.cs
+++ b/Assets/Scripts/UI/PropertyLabel.cs
@@ -1,4 +1,5 @@
-using System.Collections;
+using System;
+using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
@@ -7,4 +8,10 @@ public class PropertyLabel : MonoBehaviour
{
public TextMeshProUGUI Name;
public TextMeshProUGUI Value;
+ public Func ValueFunction;
+
+ private void Update()
+ {
+ Value.text = ValueFunction?.Invoke() ?? "";
+ }
}
diff --git a/Assets/Scripts/UI/ReadOnlyPropertiesPanel.cs b/Assets/Scripts/UI/ReadOnlyPropertiesPanel.cs
index 89bccfb93..88b6cf131 100644
--- a/Assets/Scripts/UI/ReadOnlyPropertiesPanel.cs
+++ b/Assets/Scripts/UI/ReadOnlyPropertiesPanel.cs
@@ -21,11 +21,11 @@ public class ReadOnlyPropertiesPanel : MonoBehaviour
Destroy(property);
}
- public void AddProperty(string name, string value)
+ public void AddProperty(string name, Func value)
{
var property = Instantiate(PropertyPrefab, transform);
property.Name.text = name;
- property.Value.text = value;
+ property.ValueFunction = value;
_properties.Add(property.gameObject);
}
diff --git a/Assets/Scripts/UI/ZoneGravityObject.cs b/Assets/Scripts/UI/ZoneGravityObject.cs
new file mode 100644
index 000000000..7e679fc10
--- /dev/null
+++ b/Assets/Scripts/UI/ZoneGravityObject.cs
@@ -0,0 +1,9 @@
+using System.Collections;
+using System.Collections.Generic;
+using TMPro;
+using UnityEngine;
+
+public class ZoneGravityObject : ZoneObject
+{
+ public MeshRenderer GravityMesh;
+}
diff --git a/Assets/Scripts/UI/ZoneGravityObject.cs.meta b/Assets/Scripts/UI/ZoneGravityObject.cs.meta
new file mode 100644
index 000000000..76336c665
--- /dev/null
+++ b/Assets/Scripts/UI/ZoneGravityObject.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 17a379c98cd100d4c8548e22c676d246
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/UI/ZoneObject.cs b/Assets/Scripts/UI/ZoneObject.cs
index a682565d1..65d4b2d80 100644
--- a/Assets/Scripts/UI/ZoneObject.cs
+++ b/Assets/Scripts/UI/ZoneObject.cs
@@ -5,9 +5,10 @@ using UnityEngine;
public class ZoneObject : MonoBehaviour
{
- public MeshRenderer GravityMesh;
-
public MeshRenderer Icon;
public TextMeshPro Label;
+
+ [HideInInspector]
+ public List Children = new List();
}
diff --git a/Assets/Scripts/UI/ZoneObject.cs.meta b/Assets/Scripts/UI/ZoneObject.cs.meta
index 76336c665..824280b0f 100644
--- a/Assets/Scripts/UI/ZoneObject.cs.meta
+++ b/Assets/Scripts/UI/ZoneObject.cs.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
-guid: 17a379c98cd100d4c8548e22c676d246
+guid: 4d8b39205d8cd404bae28355b1ed1596
MonoImporter:
externalObjects: {}
serializedVersion: 2
diff --git a/Assets/Scripts/UI/ZoneShip.cs b/Assets/Scripts/UI/ZoneShip.cs
index 0f37f3edb..81407f0d3 100644
--- a/Assets/Scripts/UI/ZoneShip.cs
+++ b/Assets/Scripts/UI/ZoneShip.cs
@@ -3,10 +3,7 @@ using System.Collections.Generic;
using TMPro;
using UnityEngine;
-public class ZoneShip : MonoBehaviour
+public class ZoneShip : ZoneObject
{
- public MeshRenderer Icon;
-
- public TextMeshPro Label;
public Transform Thruster;
}