Ejemplo n.º 1
0
    /// <summary>
    /// Could make this target the unit position instead
    /// </summary>
    /// <param name="unit"></param>
    /// <returns></returns>
    Unit FindTarget(Unit unit)
    {
        Unit result          = null;
        int  closestDistance = 0;
        int  thisDistance;

        foreach (KeyValuePair <Vector3Int, Unit> playerUnit in unitsManager.GetAllPlayerUnits())
        {
            Stack <Vector3Int> path = astar.GetPath(unit.BoardPos, playerUnit.Key);
            if (closestDistance == 0)
            {
                closestDistance = path.Count;
                result          = playerUnit.Value;
            }
            else
            {
                thisDistance = path.Count;
                if (thisDistance < closestDistance)
                {
                    result          = playerUnit.Value;
                    closestDistance = thisDistance;
                }
            }
        }
        return(result);
    }
Ejemplo n.º 2
0
    /// <summary>
    ///
    /// </summary>
    /// <param name="position"></param>
    /// <returns></returns>
    bool SelectableUnitClicked(Vector3Int position)
    {
        Dictionary <Vector3Int, Unit> allUnits = unitsManager.GetAllPlayerUnits();
        bool contain = allUnits.ContainsKey(position);

        if (!contain)
        {
            return(false);
        }
        else
        {
            Unit unit = allUnits[position];
            unitAttackRange = unit.AttackRange;
            unitMoveRange   = unit.MovementSpeed;
            if (unit.HasMoved)
            {
                return(false);
            }
            else
            {
                return(true);
            }
        }
    }
Ejemplo n.º 3
0
    /// <summary>
    /// Initiates combat sequence
    /// </summary>
    /// <param name="attacker"></param>
    /// <param name="defender"></param>
    public IEnumerator Fight(Vector3Int attackerPos, Vector3Int defenderPos)
    {
        Unit attacker = unitsManager.GetUnit(attackerPos);
        Unit defender = unitsManager.GetUnit(defenderPos);

        if (defender == null)
        {
            yield break;
        }
        double attackerStrength = CalculateStrength(attacker, defender.GetUnitType());
        double defenderStrenth  = CalculateStrength(defender, attacker.GetUnitType());
        double odds             = CalculateVictoryOdds(attackerStrength, defenderStrenth);
        bool   hasAdvantage     = RollAdvantage(odds);

        if (RangeAdvantage(attacker, defender))
        {
            yield return(Attack(attacker, defender));

            if (defender.GetCount() <= 0)
            {
                //TODO death stuff
                UnitDestroyed(defender);
            }
            yield break;            //Exit function without retaliation.
        }

        if (hasAdvantage)
        {
            //Attacker swings first
            yield return(Attack(attacker, defender));

            //If unit destroyed, do death sequence instead
            if (defender.GetCount() <= 0)
            {
                //TODO death stuff
                UnitDestroyed(defender);
                yield break;                //Exit function without retaliation.
            }
            //If alive, defender attacks
            yield return(Attack(defender, attacker));

            if (attacker.GetCount() <= 0)
            {
                //TODO death stuff
                UnitDestroyed(attacker);
                Debug.Log(unitsManager.GetAllPlayerUnits().Count);
                yield break;                //Exit function without retaliation.
            }
        }
        else
        {
            //Defender swings first
            yield return(Attack(defender, attacker));

            if (attacker.GetCount() <= 0)
            {
                //TODO death stuff
                UnitDestroyed(attacker);
                yield break;
            }
            //if alive, attacker attacks
            yield return(Attack(attacker, defender));

            if (defender.GetCount() <= 0)
            {
                //TODO death stuff
                UnitDestroyed(defender);
                yield break;
            }
        }
    }