diff --git a/Assets/Scripts/UnitBrains/Player/SecondUnitBrain.cs b/Assets/Scripts/UnitBrains/Player/SecondUnitBrain.cs index c2c80e989..fe9c280c6 100644 --- a/Assets/Scripts/UnitBrains/Player/SecondUnitBrain.cs +++ b/Assets/Scripts/UnitBrains/Player/SecondUnitBrain.cs @@ -1,18 +1,30 @@ -using System.Collections.Generic; +using Model; using Model.Runtime.Projectiles; +using System.Collections.Generic; +using System.Linq; using UnityEngine; +using Utilities; namespace UnitBrains.Player { public class SecondUnitBrain : DefaultPlayerUnitBrain { + private static int targetCounter { get; set; } = 0; + private int unitNumber { get; set; } = GetAndIncreaseUnitCounter(); + private static int cleverSearchMaxTarget = 3; public override string TargetUnitName => "Cobra Commando"; + private List moveTarget = new List(); private const float OverheatTemperature = 3f; private const float OverheatCooldown = 2f; private float _temperature = 0f; private float _cooldownTime = 0f; private bool _overheated; - + + private static int GetAndIncreaseUnitCounter() + { + return targetCounter++; + } + protected override void GenerateProjectiles(Vector2Int forTarget, List intoList) { float overheatTemperature = OverheatTemperature; @@ -26,29 +38,60 @@ protected override void GenerateProjectiles(Vector2Int forTarget, List SelectEnemyBaseAsTarget() + { + RuntimeModel runtimeModel = new RuntimeModel(); + Vector2Int enemyBase = runtimeModel.RoMap.Bases[IsPlayerUnitBrain ? RuntimeModel.BotPlayerId : RuntimeModel.PlayerId]; + moveTarget.Add(enemyBase); + return new List { enemyBase }; + } + + public Vector2Int FindNearestToBaseTarget(List attackTargets) + { + Vector2Int nearestToBaseTarget = attackTargets.FirstOrDefault(); + + foreach (Vector2Int target in attackTargets) + { + if (DistanceToOwnBase(target) < DistanceToOwnBase(nearestToBaseTarget)) + { + nearestToBaseTarget = target; + } + } + + return nearestToBaseTarget; } protected override List SelectTargets() { - /////////////////////////////////////// - // Homework 1.4 (1st block, 4rd module) - /////////////////////////////////////// - List result = GetReachableTargets(); - while (result.Count > 1) + moveTarget.Clear(); + List allTargets = GetAllTargets().ToList(); + SortByDistanceToOwnBase(allTargets); + if (allTargets.Count() == 0) { - result.RemoveAt(result.Count - 1); + return SelectEnemyBaseAsTarget(); } - return result; - /////////////////////////////////////// + + int targetIndex = cleverSearchMaxTarget > allTargets.Count() ? unitNumber % allTargets.Count() : unitNumber % cleverSearchMaxTarget; + Vector2Int target = allTargets[targetIndex]; + moveTarget.Add(target); + + return IsTargetInRange(target) ? new List() { target } : new List(); } public override void Update(float deltaTime, float time) { if (_overheated) - { + { _cooldownTime += Time.deltaTime; - float t = _cooldownTime / (OverheatCooldown/10); + float t = _cooldownTime / (OverheatCooldown / 10); _temperature = Mathf.Lerp(OverheatTemperature, 0, t); if (t >= 1) { @@ -60,7 +103,7 @@ public override void Update(float deltaTime, float time) private int GetTemperature() { - if(_overheated) return (int) OverheatTemperature; + if (_overheated) return (int)OverheatTemperature; else return (int)_temperature; }