using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using TMPro; namespace CryingSnow.FarmingIsland { public class Minimap : MonoBehaviour { [Tooltip("Size of each tile on the minimap.")] [SerializeField] private Vector2 minimapTileSize = new Vector2(100, 100); [Tooltip("Color used for island tiles.")] [SerializeField] private Color islandColor = Color.white; [Tooltip("Color used for bridge tiles.")] [SerializeField] private Color bridgeColor = Color.white; [Tooltip("Content area where minimap elements are placed.")] [SerializeField] private Transform minimapContent; [Tooltip("RectTransform representing the player's icon on the minimap.")] [SerializeField] private RectTransform playerIcon; [Tooltip("Text component for displaying travel message using boat.")] [SerializeField] private TMP_Text travelMessage; [Tooltip("Sprites used for different prop icons (IProp.Location).")] [SerializeField] private Sprite[] propSprites; private int islandSize => IslandManager.Instance.IslandSize; private List islandTiles = new List(); private List purchaserIcons = new List(); private List propIcons = new List(); private List dockButtons = new List(); private PlayerController _player; private PlayerController player { get { if (_player == null) _player = FindFirstObjectByType(); return _player; } } public void Show(bool allowTravel = false) { gameObject.SetActive(true); player.IsControllable = false; CreateIslandTiles(); CreatePropLocations(); CreatePurchaserIcons(); dockButtons.ForEach(db => db.enabled = allowTravel); travelMessage.gameObject.SetActive(allowTravel); playerIcon.anchoredPosition = GetMinimapPosition(player.transform.position); playerIcon.SetAsLastSibling(); AudioManager.Instance.PlaySFX(AudioID.UI_Select); } public void Hide() { gameObject.SetActive(false); player.IsControllable = true; AudioManager.Instance.PlaySFX(AudioID.UI_Decline); } private void CreateIslandTiles() { var islands = IslandManager.Instance.UnlockedIslands; while (islandTiles.Count < islands.Count) { var island = islands[islandTiles.Count]; var islandTileObj = new GameObject(island.name + " Tile"); islandTileObj.transform.SetParent(minimapContent, false); var islandTile = islandTileObj.AddComponent(); islandTile.rectTransform.anchoredPosition = GetMinimapPosition(island.GetPosition()); islandTile.rectTransform.sizeDelta = minimapTileSize; islandTile.color = island.IsBridge ? bridgeColor : islandColor; islandTiles.Add(islandTile); } } private void CreatePropLocations() { var propLocations = IslandManager.Instance.PropLocations; while (propIcons.Count < propLocations.Count) { var propLocation = propLocations[propIcons.Count]; var propIconObj = new GameObject($"{propLocation.Item2} {propLocation.Item1}"); propIconObj.transform.SetParent(minimapContent, false); var propIcon = propIconObj.AddComponent(); propIcon.rectTransform.anchoredPosition = GetMinimapPosition(propLocation.Item1); propIcon.rectTransform.sizeDelta = minimapTileSize * 0.8f; propIcon.sprite = propSprites[(int)propLocation.Item2]; propIcons.Add(propIcon); if (propLocation.Item2 == Location.Dock) { var dockButton = propIconObj.AddComponent(); dockButton.Initialize(() => { var destination = propLocation.Item1 + (Vector3.forward * islandSize); player.Teleport(destination); Hide(); }); dockButtons.Add(dockButton); } } } private void CreatePurchaserIcons() { var purchasers = IslandManager.Instance.Purchasers; purchaserIcons.ForEach(icon => Destroy(icon.gameObject)); purchaserIcons.Clear(); foreach (var purchaser in purchasers) { var purchaserObj = new GameObject($"Purchaser Icon{purchaser}"); purchaserObj.transform.SetParent(minimapContent, false); var purchaserIcon = purchaserObj.AddComponent(); purchaserIcon.text = "$"; purchaserIcon.alignment = TextAlignmentOptions.CenterGeoAligned; purchaserIcon.fontStyle = FontStyles.Bold; purchaserIcon.fontSize = 100; purchaserIcon.rectTransform.anchoredPosition = GetMinimapPosition(purchaser.Position); purchaserIcon.rectTransform.sizeDelta = minimapTileSize; purchaserIcons.Add(purchaserIcon); } } private Vector2 GetMinimapPosition(Vector3 position) { Vector2 minimapPosition = new Vector2(position.x, position.z); return minimapPosition * (minimapTileSize / islandSize); } } }