diff --git a/Assets/Scripts/Model/Runtime/Projectiles/ArchToTileProjectile.cs b/Assets/Scripts/Model/Runtime/Projectiles/ArchToTileProjectile.cs index c37ed0218..bdfc9c2a5 100644 --- a/Assets/Scripts/Model/Runtime/Projectiles/ArchToTileProjectile.cs +++ b/Assets/Scripts/Model/Runtime/Projectiles/ArchToTileProjectile.cs @@ -8,7 +8,7 @@ public class ArchToTileProjectile : BaseProjectile private readonly Vector2Int _target; private readonly float _timeToTarget; private readonly float _totalDistance; - + public ArchToTileProjectile(Unit unit, Vector2Int target, int damage, Vector2Int startPoint) : base(damage, startPoint) { _target = target; @@ -20,9 +20,9 @@ protected override void UpdateImpl(float deltaTime, float time) { float timeSinceStart = time - StartTime; float t = timeSinceStart / _timeToTarget; - + Pos = Vector2.Lerp(StartPoint, _target, t); - + float localHeight = 0f; float totalDistance = _totalDistance; @@ -30,11 +30,13 @@ protected override void UpdateImpl(float deltaTime, float time) // Insert you code here /////////////////////////////////////// + float maxHeight = totalDistance * 0.6f; + localHeight = maxHeight * (-(t * 2 - 1) * (t * 2 - 1) + 1); /////////////////////////////////////// // End of the code to insert /////////////////////////////////////// - + Height = localHeight; if (time > StartTime + _timeToTarget) Hit(_target); diff --git a/Assets/Scripts/UnitBrains/Player/SecondUnitBrain.cs b/Assets/Scripts/UnitBrains/Player/SecondUnitBrain.cs index c2c80e989..f6acff655 100644 --- a/Assets/Scripts/UnitBrains/Player/SecondUnitBrain.cs +++ b/Assets/Scripts/UnitBrains/Player/SecondUnitBrain.cs @@ -1,6 +1,9 @@ -using System.Collections.Generic; +using Model; using Model.Runtime.Projectiles; +using System.Collections.Generic; +using System.Linq; using UnityEngine; +using Utilities; namespace UnitBrains.Player { @@ -12,21 +15,44 @@ public class SecondUnitBrain : DefaultPlayerUnitBrain private float _temperature = 0f; private float _cooldownTime = 0f; private bool _overheated; - + protected override void GenerateProjectiles(Vector2Int forTarget, List intoList) { float overheatTemperature = OverheatTemperature; /////////////////////////////////////// // Homework 1.3 (1st block, 3rd module) - /////////////////////////////////////// - var projectile = CreateProjectile(forTarget); - AddProjectileToList(projectile, intoList); + /////////////////////////////////////// + + int temperature = GetTemperature(); + if (temperature >= overheatTemperature) + { + return; + } + + int projectileAmount = temperature + 1; + for (int i = 0; i < projectileAmount; i++) + { + var projectile = CreateProjectile(forTarget); + AddProjectileToList(projectile, intoList); + } + + IncreaseTemperature(); /////////////////////////////////////// } public override Vector2Int GetNextStep() { - return base.GetNextStep(); + List targets = SelectTargets(); + if (targets.Count > 0) + { + Vector2Int firstTarget = targets[0]; + if (IsTargetInRange(firstTarget)) + { + return unit.Pos; + } + return unit.Pos.CalcNextStepTowards(firstTarget); + } + return unit.Pos; } protected override List SelectTargets() @@ -34,11 +60,31 @@ protected override List SelectTargets() /////////////////////////////////////// // Homework 1.4 (1st block, 4rd module) /////////////////////////////////////// - List result = GetReachableTargets(); - while (result.Count > 1) + List allTargets = GetAllTargets().ToList(); + List result = new List(); + + if (allTargets.Count <= 0) { - result.RemoveAt(result.Count - 1); + Vector2Int enemyBase = runtimeModel.RoMap.Bases[RuntimeModel.BotPlayerId]; + result.Add(enemyBase); + return result; } + + float minDistance = float.MaxValue; + Vector2Int finalTarget = allTargets[0]; + + foreach (var target in allTargets) + { + float targetDist = DistanceToOwnBase(target); + if (targetDist < minDistance) + { + minDistance = targetDist; + finalTarget = target; + } + } + + result.Add(finalTarget); + return result; /////////////////////////////////////// } @@ -46,9 +92,9 @@ protected override List SelectTargets() 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 +106,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; }