Exemplo n.º 1
0
    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;
        }
    }
Exemplo n.º 2
0
    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];
    }
Exemplo n.º 3
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;
    }