예제 #1
0
 public override float NegotiateDamage(float damage, UnitAction action)
 {
     if (action.actionType() == UnitAction.ActionType.Melee)
     {
         return(damage / 2);
     }
     else if (action.actionType() == UnitAction.ActionType.Ranged)
     {
         return(damage * 2);
     }
     else
     {
         return(damage);
     }
 }
예제 #2
0
    public void OnMouseEnter()
    {
        Unit       unit       = Unit.current;
        UnitAction unitAction = unit.Actions()[actionIndex].GetComponent <UnitAction>();

        StanceInformation.Show(unitAction.Name(), unitAction.MpCost().ToString(), unitAction.actionType().ToString() + " -- " + unitAction.Description());
    }
예제 #3
0
    public static void ConfirmAction(Cursor cursor)
    {
        UnitAction action = Unit.Subject().Actions()[selectedActionIndex].GetComponent <UnitAction>();

        if (action.actionType() == UnitAction.ActionType.Ranged)
        {
            foreach (Buff buff in Unit.Subject().Buffs())
            {
                if (!buff.CanUseRanged())
                {
                    Alert.Show("Cannot use ranged abilities");
                    return;
                }
            }
        }
        if (action.actionType() == UnitAction.ActionType.Support)
        {
            foreach (Buff buff in Unit.Subject().Buffs())
            {
                if (!buff.CanUseSupport())
                {
                    Alert.Show("Cannot use support abilities");
                    return;
                }
            }
        }
        if (action.actionType() == UnitAction.ActionType.Magic)
        {
            foreach (Buff buff in Unit.Subject().Buffs())
            {
                if (!buff.CanUseMagic())
                {
                    Alert.Show("Cannot use magic abilities");
                    return;
                }
            }
        }
        SetState(State.ConfirmTarget);
        CursorController.HideConfirmAttackCursors();
        CursorController.ShowConfirmActionCursors(cursor);
        CursorController.ShowActionRangeCursors(cursor, selectedActionIndex);
    }
예제 #4
0
    public static void ShowActionCursors(Unit unit, int actionIndex)
    {
        showingActionCursors = true;
        UnitAction action = unit.Actions()[actionIndex].GetComponent <UnitAction>();

        ActionInformation.Show(action.Name(), action.MpCost().ToString(), action.actionType().ToString() + " -- " + action.Description());

        Unit.Coordinate projectedCoordinate = unit.ProjectedCoordinate();

        int xPos = projectedCoordinate.xPos;
        int zPos = projectedCoordinate.zPos;

        List <Cursor> tiles = Helpers.GetRadialTiles(xPos, zPos, action.MaxDistance(), action.MaxHeightDifference(), action.CanTargetOthers(), action.MinDistance(), action.HeightAssisted());

        foreach (Cursor tile in tiles)
        {
            if (IsValidTarget(Unit.Subject(), action, tile, xPos, zPos))
            {
                tile.SetAttack();
            }
        }
    }
예제 #5
0
    public void SetUnit(UnitConfig unitConfig, int index, ConfigTypes configType)
    {
        transform.Find("InfoPanel").Find("UnitName").GetComponent <Text>().text  = unitConfig.unitName;
        transform.Find("InfoPanel").Find("UnitClass").GetComponent <Text>().text = unitConfig.unitClass.Name();

        int           i           = 0;
        List <string> actions     = unitConfig.unitClass.Actions();
        List <string> unitActions = unitConfig.actions;

        if (configType == ConfigTypes.Stance)
        {
            actions     = unitConfig.unitClass.Stances();
            unitActions = unitConfig.stances;
        }

        foreach (Transform entry in transform.Find("Grid"))
        {
            bool enableClick = true;
            int  c           = i;

            entry.GetComponent <Button>().onClick.RemoveAllListeners();

            if (i < actions.Count)
            {
                entry.gameObject.active = true;

                string label       = "";
                string description = "";
                string mpCost      = "";

                if (configType == ConfigTypes.Stance)
                {
                    label       = unitConfig.stanceMap[actions[c]].Name();
                    description = unitConfig.stanceMap[actions[c]].Description();
                    mpCost      = "0";
                }
                else
                {
                    UnitAction action = unitConfig.actionMap[actions[c]];
                    label       = unitConfig.actionMap[actions[c]].Name();
                    description = action.actionType().ToString() + " -- " + action.Description();
                    if (action.VariableMp())
                    {
                        mpCost = "Variable";
                    }
                    else
                    {
                        mpCost = unitConfig.actionMap[actions[c]].MpCost().ToString();
                    }
                }

                entry.Find("Text").GetComponent <Text>().text = label;

                entry.Find("Text").GetComponent <Text>().color = Color.white;

                if (actions[c] == unitActions[index])
                {
                    entry.Find("Text").GetComponent <Text>().color = Color.green;
                }
                else if (unitActions.Contains(actions[c]))
                {
                    enableClick = false;
                    entry.Find("Text").GetComponent <Text>().color = new Color(1, 1, 1, .5f);
                }

                ActionConfigButton configButton = entry.GetComponent <ActionConfigButton>();
                configButton.actionName  = label;
                configButton.description = description;
                configButton.mpCost      = mpCost;

                if (enableClick)
                {
                    entry.GetComponent <Button>().onClick.AddListener(
                        () => {
                        ActionInformation.Hide();
                        this.SetAction(unitConfig, index, actions[c], configType);
                    });
                }
            }
            else
            {
                entry.gameObject.active = false;
            }

            i++;
        }
    }
예제 #6
0
    public void ReceiveDamage(int damage, Unit aggressor, UnitAction action)
    {
        bool backAttacked =
            aggressor.playerIndex != this.playerIndex &&
            action.actionType() == UnitAction.ActionType.Melee &&
            !aggressor.GetComponent <UnitMovement>().TraversedAlertTile();

        float calculatedDamage = damage;
        int   startingHp       = currentHp;

        foreach (Buff buff in Buffs())
        {
            if (action.actionType() == UnitAction.ActionType.Melee)
            {
                calculatedDamage /= buff.MeleeResistMod();
            }

            if (buff.CommunicableType() == action.actionType())
            {
                action.Unit().ReceiveBuff(Instantiate(buff.gameObject, Vector3.zero, Quaternion.identity));
            }
        }

        foreach (Buff buff in action.Unit().Buffs())
        {
            if (buff.CommunicableType() == action.actionType())
            {
                ReceiveBuff(Instantiate(buff.gameObject, Vector3.zero, Quaternion.identity));
            }
        }

        if (action.Affinity() != Helpers.Affinity.None)
        {
            if (action.Affinity() == affinity)
            {
                calculatedDamage *= 0.5f;
            }

            if (affinity == Helpers.Affinity.None)
            {
                SetAffinity(action.Affinity());
            }

            if (
                (action.Affinity() == Helpers.Affinity.Water && affinity == Helpers.Affinity.Fire) ||
                (action.Affinity() == Helpers.Affinity.Fire && affinity == Helpers.Affinity.Earth) ||
                (action.Affinity() == Helpers.Affinity.Earth && affinity == Helpers.Affinity.Water)
                )
            {
                calculatedDamage *= 2;
                SetAffinity(action.Affinity());
            }
        }

        calculatedDamage = backAttacked ? calculatedDamage + 5 : Stance().NegotiateDamage(calculatedDamage, action);

        RevealCurrentStance();

        int actualReceivedDamage = Mathf.RoundToInt(calculatedDamage);

        currentHp -= actualReceivedDamage;

        System.Action showHits = () =>
        {
            GameObject hitsObject = Instantiate(hitsPrefab, transform.position, Quaternion.identity);
            hitsObject.transform.parent             = GameObject.Find("Popups").transform;
            hitsObject.transform.position           = transform.Find("UIAnchors").Find("Damage").position;
            hitsObject.GetComponent <Hits>().damage = "-" + actualReceivedDamage.ToString() + " HP";
        };

        GameObject     stanceDialogueObject = Instantiate(actionDialoguePrefab, transform.position, Quaternion.identity);
        ActionDialogue dialogue             = stanceDialogueObject.GetComponent <ActionDialogue>();
        string         messageToDisplay     = Stance().Name();

        if (backAttacked)
        {
            messageToDisplay += " (Back)";
        }
        dialogue.message  = messageToDisplay;
        dialogue.unit     = this;
        dialogue.whenDone = showHits;
        dialogue.color    = Color.green;

        stanceDialogueObject.transform.parent   = GameObject.Find("Popups").transform;
        stanceDialogueObject.transform.position = transform.Find("UIAnchors").Find("Points").position;

        if (actualReceivedDamage >= startingHp)
        {
            Die(aggressor);
        }
    }