/// <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); }
/// <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); } } }
/// <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; } } }