private void ApplyTooltip(Vector3Int mapPosition, SelectionCoinController coinController, BuildingManager.BuildingAction buildingAction) { GameObject buildingLogic = BuildingManager.instance._positionToBuildingLogic[mapPosition]; BuildingHealth health = buildingLogic.GetComponent <BuildingHealth>(); BuildingLogicBase logic = buildingLogic.GetComponent <BuildingLogicBase>(); switch (buildingAction) { case BuildingManager.BuildingAction.UPGRADE_HEALTH: coinController.titleText = "Upgrade: Add Walls"; coinController.bodyText = "Add walls to the building, upgrading its health."; coinController.cost = BuildingManager.GetHealthUpgradeCost(health); coinController.benefit = health.PredictHealthUpgradeIncrease(); return; case BuildingManager.BuildingAction.UPGRADE_PRODUCTION: coinController.titleText = "Upgrade: Renovate Building"; coinController.bodyText = "Improve the efficiency of this building."; coinController.cost = BuildingManager.GetProductionUpgradeCost(logic); return; case BuildingManager.BuildingAction.REPAIR: coinController.titleText = "Repair"; coinController.bodyText = "Repair this building to full health. Cost based on damage."; coinController.cost = BuildingManager.instance.GetRepairCost(health); coinController.benefit = health.MaxHealth - health.CurrentHealth; return; } }
private void ApplyTooltip(SelectionCoinController coinController, BuildingData buildingData) { BuildingInfo buildingInfo = buildingData.LogicPrefab.GetComponent <BuildingInfo>(); coinController.titleText = buildingData.tooltipTitle; coinController.bodyText = buildingData.tooltipDescription; coinController.cost = buildingInfo.BaseCost; coinController.benefit = buildingData.LogicPrefab.GetComponent <BuildingHealth>().BaseHealthData[0]; }
private IEnumerator DoSelectMenu <TOption>( Vector3Int mapPosition, Func <TOption[]> getOptions, Predicate <TOption> canAfford, Func <TOption, Sprite> getPreviewSprite, Action <int, TOption> executeSelection, Action <SelectionCoinController, TOption> applyTooltip ) { _active = true; _clickedAgain = false; Vector3 worldPosition = BuildingManager.Map.GetCellCenterWorld(mapPosition); Vector3 canvasPosition = WorldToCanvasPosition(worldPosition); TOption[] options = getOptions(); GameObject[] coins = new GameObject[options.Length]; Coroutine[] animations = new Coroutine[options.Length]; Vector3[] endPositions = new Vector3[options.Length]; Vector3 borderCompensation = Vector3.zero; RectTransform canvasRectTransform = Canvas.GetComponent <RectTransform>(); Vector2 canvasSize = canvasRectTransform.rect.size; for (int i = 0; i < options.Length; i++) { float angle = Mathf.Lerp(0, 2 * Mathf.PI, (float)i / options.Length); endPositions[i] = canvasPosition + new Vector3(-Mathf.Sin(angle), Mathf.Cos(angle)) * CoinNormalRange; Vector2 min = new Vector2(endPositions[i].x, endPositions[i].y) - SelectionCoinPrefab.GetComponent <RectTransform>().sizeDelta / 2; Vector2 max = new Vector2(endPositions[i].x, endPositions[i].y) + SelectionCoinPrefab.GetComponent <RectTransform>().sizeDelta / 2; if (min.x < BorderPadding) { borderCompensation.x = Mathf.Max(borderCompensation.x, BorderPadding - min.x); } if (min.y < BorderPadding) { borderCompensation.y = Mathf.Max(borderCompensation.y, BorderPadding - min.y); } if (max.x > canvasSize.x - BorderPadding) { borderCompensation.x = Mathf.Min(borderCompensation.x, canvasSize.x - BorderPadding - max.x); } if (max.y > canvasSize.y - BorderPadding) { borderCompensation.y = Mathf.Min(borderCompensation.y, canvasSize.y - BorderPadding - max.y); } } Debug.Log($"Border compensation {borderCompensation}"); for (int i = 0; i < options.Length; i++) { coins[i] = Instantiate(SelectionCoinPrefab, Canvas.transform); Image previewImage = coins[i].transform.GetChild(0).GetChild(0).GetComponent <Image>(); previewImage.sprite = getPreviewSprite(options[i]); coins[i].GetComponent <RectTransform>().anchoredPosition = canvasPosition; SelectionCoinController coinController = coins[i].AddComponent <SelectionCoinController>(); coinController.MenuController = this; coinController.OptionIndex = i; coinController.HighlightScale = CoinHighlightScale; coinController.HighlightTime = CoinHighlightTime; coinController.FullyActive = false; applyTooltip(coinController, options[i]); if (canAfford(options[i])) { coinController.CanAfford = true; } else { coinController.CanAfford = false; foreach (Image image in coins[i].GetComponentsInChildren <Image>()) { Color imageColor = image.color; imageColor.r *= 0.5f; imageColor.g *= 0.5f; imageColor.b *= 0.5f; image.color = imageColor; } } animations[i] = StartCoroutine(ExtendCoin( coins[i], endPositions[i] + borderCompensation )); } foreach (Coroutine coroutine in animations) { yield return(coroutine); } SelectedIndex = null; for (int i = 0; i < coins.Length; i++) { SelectionCoinController coinController = coins[i].GetComponent <SelectionCoinController>(); if (coinController.CanAfford) { coinController.FullyActive = true; } } yield return(new WaitUntil(() => _clickedAgain || SelectedIndex.HasValue)); for (int i = 0; i < coins.Length; i++) { Destroy(coins[i].GetComponent <SelectionCoinController>()); if (SelectedIndex.HasValue && SelectedIndex.Value == i) { animations[i] = null; continue; } animations[i] = StartCoroutine(RetractCoin(coins[i], canvasPosition)); } foreach (Coroutine coroutine in animations) { yield return(coroutine); } if (SelectedIndex.HasValue) { int index = SelectedIndex.Value; executeSelection(index, options[index]); yield return(StartCoroutine(RetractCoin(coins[index], coins[index].GetComponent <RectTransform>().anchoredPosition))); } for (int i = 0; i < coins.Length; i++) { Destroy(coins[i]); } _active = false; }