diff --git a/NewHorizons/Builder/ShipLog/MapModeBuilder.cs b/NewHorizons/Builder/ShipLog/MapModeBuilder.cs index cfe6051d..849d4d79 100644 --- a/NewHorizons/Builder/ShipLog/MapModeBuilder.cs +++ b/NewHorizons/Builder/ShipLog/MapModeBuilder.cs @@ -47,9 +47,10 @@ namespace NewHorizons.Builder.ShipLog public static ShipLogAstroObject[][] ConstructMapMode(string systemName, GameObject transformParent, int layer) { MapModeObject rootObject = ConstructPrimaryNode(systemName); + Material greyScaleMaterial = GameObject.Find(ShipLogHandler.PAN_ROOT_PATH + "/TimberHearth/Sprite").GetComponent().material; if (rootObject.mainBody != null) { - MakeAllNodes(ref rootObject, transformParent, layer); + MakeAllNodes(ref rootObject, transformParent, greyScaleMaterial, layer); } int maxAmount = Main.BodyDict[Main.Instance.CurrentStarSystem].Count; @@ -80,13 +81,13 @@ namespace NewHorizons.Builder.ShipLog } } - private static void MakeAllNodes(ref MapModeObject parentNode, GameObject parent, int layer) + private static void MakeAllNodes(ref MapModeObject parentNode, GameObject parent, Material greyScaleMaterial, int layer) { - MakeNode(ref parentNode, parent, layer); + MakeNode(ref parentNode, parent, greyScaleMaterial, layer); for (var i = 0; i < parentNode.children.Count; i++) { MapModeObject child = parentNode.children[i]; - MakeAllNodes(ref child, parent, layer); + MakeAllNodes(ref child, parent, greyScaleMaterial, layer); parentNode.children[i] = child; } } @@ -117,7 +118,7 @@ namespace NewHorizons.Builder.ShipLog return newImageGO; } - private static void CreateShipLogAstroObject(GameObject nodeGO, ref MapModeObject node, GameObject referenceUnviewedSprite, int layer) + private static void CreateShipLogAstroObject(GameObject nodeGO, ref MapModeObject node, GameObject referenceUnviewedSprite, Material greyScaleMaterial, int layer) { const float unviewedIconOffset = 15; ShipLogAstroObject astroObject = nodeGO.AddComponent(); @@ -126,6 +127,14 @@ namespace NewHorizons.Builder.ShipLog string imagePath = node.mainBody.Config.ShipLog?.mapMode?.revealedSprite ?? "DEFAULT"; string outlinePath = node.mainBody.Config.ShipLog?.mapMode?.outlineSprite ?? imagePath; astroObject._imageObj = CreateImage(nodeGO, node.mainBody.Mod.Assets, imagePath, node.mainBody.Config.Name + " Revealed", layer); + if (ShipLogHandler.BodyHasEntries(node.mainBody)) + { + Image revealedImage = astroObject._imageObj.GetComponent(); + astroObject._greyscaleMaterial = greyScaleMaterial; + revealedImage.material = greyScaleMaterial; + revealedImage.color = Color.white; + astroObject._image = revealedImage; + } astroObject._outlineObj = CreateImage(nodeGO, node.mainBody.Mod.Assets, outlinePath, node.mainBody.Config.Name + " Outline", layer); astroObject._unviewedObj = Object.Instantiate(referenceUnviewedSprite, nodeGO.transform, false); @@ -143,7 +152,7 @@ namespace NewHorizons.Builder.ShipLog node.astroObject = astroObject; } - private static void ConnectNodeToLastSibling(MapModeObject node) + private static void ConnectNodeToLastSibling(MapModeObject node, Material greyScaleMaterial) { Vector2 fromPosition = node.astroObject.transform.localPosition; Vector2 toPosition = node.lastSibling.astroObject.transform.localPosition; @@ -167,14 +176,14 @@ namespace NewHorizons.Builder.ShipLog }; ShipLogDetail linkDetail = newLink.AddComponent(); - linkDetail.Init(linkDetailInfo, linkImage, linkImage); + linkDetail.Init(linkDetailInfo, linkImage, linkImage, greyScaleMaterial); transform.SetParent(node.astroObject.transform); transform.SetAsFirstSibling(); newLink.SetActive(true); } - private static void MakeDetail(ShipLogModule.ShipLogDetailInfo info, Transform parent, IModAssets assets) + private static void MakeDetail(ShipLogModule.ShipLogDetailInfo info, Transform parent, IModAssets assets, Material greyScaleMaterial) { GameObject detailGameObject = new GameObject("Detail"); detailGameObject.transform.SetParent(parent); @@ -192,11 +201,11 @@ namespace NewHorizons.Builder.ShipLog Image outlineImage = CreateImage(detailGameObject, assets, outlinePath, "Detail Outline", parent.gameObject.layer).GetComponent(); ShipLogDetail detail = detailGameObject.AddComponent(); - detail.Init(info, revealedImage, outlineImage); + detail.Init(info, revealedImage, outlineImage, greyScaleMaterial); detailGameObject.SetActive(true); } - private static void MakeDetails(MapModeObject node) + private static void MakeDetails(MapModeObject node, Material greyScaleMaterial) { if (node.mainBody.Config.ShipLog?.mapMode?.details?.Length > 0) { @@ -211,13 +220,13 @@ namespace NewHorizons.Builder.ShipLog foreach (ShipLogModule.ShipLogDetailInfo detailInfo in node.mainBody.Config.ShipLog.mapMode.details) { - MakeDetail(detailInfo, detailsTransform, node.mainBody.Mod.Assets); + MakeDetail(detailInfo, detailsTransform, node.mainBody.Mod.Assets, greyScaleMaterial); } detailsParent.SetActive(true); } } - private static void MakeNode(ref MapModeObject node, GameObject parent, int layer) + private static void MakeNode(ref MapModeObject node, GameObject parent, Material greyScaleMaterial, int layer) { const float padding = 250f; @@ -246,9 +255,9 @@ namespace NewHorizons.Builder.ShipLog transform.localPosition = new Vector3(position.x, position.y, 0); transform.localRotation = Quaternion.identity; transform.localScale = Vector3.one * scale; - CreateShipLogAstroObject(newNodeGO, ref node, GameObject.Find("Ship_Body/Module_Cabin/Systems_Cabin/ShipLogPivot/ShipLog/ShipLogPivot/ShipLogCanvas/MapMode/ScaleRoot/PanRoot/TimberHearth/UnviewedIcon"), layer); - if (node.lastSibling != null) ConnectNodeToLastSibling(node); - MakeDetails(node); + CreateShipLogAstroObject(newNodeGO, ref node, GameObject.Find(ShipLogHandler.PAN_ROOT_PATH + "/TimberHearth/UnviewedIcon"), greyScaleMaterial, layer); + if (node.lastSibling != null) ConnectNodeToLastSibling(node, greyScaleMaterial); + MakeDetails(node, greyScaleMaterial); transform.SetAsFirstSibling(); } diff --git a/NewHorizons/Components/ShipLogDetail.cs b/NewHorizons/Components/ShipLogDetail.cs index c6f77304..e1936a30 100644 --- a/NewHorizons/Components/ShipLogDetail.cs +++ b/NewHorizons/Components/ShipLogDetail.cs @@ -1,4 +1,5 @@ -using NewHorizons.External; +using System; +using NewHorizons.External; using OWML.Common; using UnityEngine; using UnityEngine.UI; @@ -8,17 +9,19 @@ namespace NewHorizons.Components { public class ShipLogDetail : MonoBehaviour { - private Image revealedImage; - private Image outlineImage; - private ShipLogModule.ShipLogDetailInfo detailInfo; + private Image _revealedImage; + private Image _outlineImage; + private Material _greyScaleMaterial; + private ShipLogModule.ShipLogDetailInfo _detailInfo; - public void Init(ShipLogModule.ShipLogDetailInfo info, Image revealed, Image outline) + public void Init(ShipLogModule.ShipLogDetailInfo info, Image revealed, Image outline, Material greyScale) { - detailInfo = info; - revealedImage = revealed; - outlineImage = outline; - revealedImage.enabled = false; - outlineImage.enabled = false; + _detailInfo = info; + _revealedImage = revealed; + _outlineImage = outline; + _greyScaleMaterial = greyScale; + _revealedImage.enabled = false; + _outlineImage.enabled = false; } public void UpdateState(ShipLogEntry.State parentState) @@ -26,22 +29,32 @@ namespace NewHorizons.Components switch (parentState) { case ShipLogEntry.State.Explored: - outlineImage.enabled = false; - revealedImage.enabled = true; + _outlineImage.enabled = false; + _revealedImage.enabled = true; + SetGreyScale(false); break; case ShipLogEntry.State.Rumored: - revealedImage.enabled = false; - outlineImage.enabled = true; + _outlineImage.enabled = false; + _revealedImage.enabled = true; + SetGreyScale(true); break; case ShipLogEntry.State.Hidden: - revealedImage.enabled = false; - outlineImage.enabled = !detailInfo.invisibleWhenHidden; + _revealedImage.enabled = false; + _outlineImage.enabled = !_detailInfo.invisibleWhenHidden; break; case ShipLogEntry.State.None: - revealedImage.enabled = false; - outlineImage.enabled = false; + _revealedImage.enabled = false; + _outlineImage.enabled = false; + break; + default: + Logger.LogError("Invalid ShipLogEntryState for " + _revealedImage.transform.parent.parent.gameObject.name); break; } } + + private void SetGreyScale(bool greyScale) + { + _revealedImage.material = (greyScale ? _greyScaleMaterial : null); + } } } \ No newline at end of file diff --git a/NewHorizons/Handlers/ShipLogHandler.cs b/NewHorizons/Handlers/ShipLogHandler.cs index ff565b54..098592f2 100644 --- a/NewHorizons/Handlers/ShipLogHandler.cs +++ b/NewHorizons/Handlers/ShipLogHandler.cs @@ -33,7 +33,7 @@ namespace NewHorizons.Builder.Handlers public static string GetAstroObjectId(NewHorizonsBody body) { - if (_astroIdToBody.ContainsValue(body)) + if (BodyHasEntries(body)) { return CollectionUtilities.KeyByValue(_astroIdToBody, body); } @@ -42,5 +42,10 @@ namespace NewHorizons.Builder.Handlers return body.Config.Name; } } + + public static bool BodyHasEntries(NewHorizonsBody body) + { + return _astroIdToBody.ContainsValue(body); + } } }