Skip to content
Open

Dz11 #1472

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Assets/Resources/PlayerUnits/PlayerUnit3.prefab
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ MonoBehaviour:
_maxHealth: 400
_brainUpdateDelay: 0.25
_moveDelay: 0.25
_attackDelay: 0.75
_attackDelay: 0.15
_attackRange: 3.5
_shotsPerTarget: 1
_targetsInVolley: 1
Expand Down
6 changes: 6 additions & 0 deletions Assets/Scripts/Controller/LevelController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ public class LevelController : IPlayerUnitChoosingListener
private readonly Gameplay3dView _gameplayView;
private readonly Settings _settings;
private readonly TimeUtil _timeUtil;
private UnitBrains.ArmyBrain _playerArmyBrain;
private UnitBrains.ArmyBrain _botArmyBrain;

public LevelController(RuntimeModel runtimeModel, RootController rootController)
{
Expand All @@ -43,6 +45,8 @@ public void StartLevel(int level)
var density = Random.Range(_settings.MapMinDensity, _settings.MapMaxDensity);
var map = MapGenerator.Generate(_settings.MapWidth, _settings.MapHeight, density, level);
_runtimeModel.Clear();
_playerArmyBrain = new UnitBrains.ArmyBrain();
_botArmyBrain = new UnitBrains.ArmyBrain();
_runtimeModel.Map = new Map(map, Settings.PlayersCount);
_runtimeModel.Stage = RuntimeModel.GameStage.ChooseUnit;
_runtimeModel.Bases[RuntimeModel.PlayerId] = new MainBase(_settings.MainBaseMaxHp);
Expand Down Expand Up @@ -73,6 +77,8 @@ private void SpawnUnit(int forPlayer, UnitConfig config)
_runtimeModel.RoUnits.Select(x => x.Pos).ToHashSet());

var unit = new Unit(config, pos);
var armyBrain = forPlayer == RuntimeModel.PlayerId ? _playerArmyBrain : _botArmyBrain;
unit.SetArmyBrain(armyBrain);
_runtimeModel.Money[forPlayer] -= config.Cost;
_runtimeModel.PlayersUnits[forPlayer].Add(unit);
}
Expand Down
2 changes: 1 addition & 1 deletion Assets/Scripts/EnterPoint.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ public class EnterPoint : MonoBehaviour
{
[SerializeField] private Settings _settings;
[SerializeField] private Canvas _targetCanvas;
private float _timeScale = 1;
private float _timeScale = 5;

void Start()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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) + 1);

///////////////////////////////////////
// End of the code to insert
///////////////////////////////////////

Height = localHeight;
if (time > StartTime + _timeToTarget)
Hit(_target);
Expand Down
2 changes: 2 additions & 0 deletions Assets/Scripts/Model/Runtime/Unit.cs
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,8 @@ private void Move()
Pos = targetPos;
}

public void SetArmyBrain(UnitBrains.ArmyBrain armyBrain) => _brain?.SetArmyBrain(armyBrain);

public void ClearPendingProjectiles()
{
_pendingProjectiles.Clear();
Expand Down
92 changes: 92 additions & 0 deletions Assets/Scripts/UnitBrains/ArmyBrain.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
using System.Collections.Generic;
using System.Linq;
using Model;
using Model.Runtime.ReadOnly;
using UnityEngine;
using Utilities;

namespace UnitBrains
{
public class ArmyBrain
{
private readonly TimeUtil _timeUtil;
private readonly IReadOnlyRuntimeModel _runtimeModel;

public ArmyBrain()
{
_timeUtil = ServiceLocator.Get<TimeUtil>();
_runtimeModel = ServiceLocator.Get<IReadOnlyRuntimeModel>();
}

// Ближайший к нашей базе враг, если враги на нашей половине;
// иначе — враг с наименьшим HP.
public IReadOnlyUnit GetRecommendedTarget()
{
var enemies = _runtimeModel.RoBotUnits.ToList();
if (!enemies.Any()) return null;

var onOurHalf = EnemiesOnOurHalf(enemies);
if (onOurHalf.Any())
return onOurHalf.OrderBy(e => DistanceToPlayerBase(e.Pos)).First();

return enemies.OrderBy(e => e.Health).First();
}

// Перед нашей базой, если враги на нашей половине;
// иначе — на расстоянии выстрела от ближайшего к базе врага.
public Vector2Int GetRecommendedPoint()
{
var enemies = _runtimeModel.RoBotUnits.ToList();
var playerBase = _runtimeModel.RoMap.Bases[RuntimeModel.PlayerId];

if (!enemies.Any())
return playerBase;

var onOurHalf = EnemiesOnOurHalf(enemies);
if (onOurHalf.Any())
{
var enemyBase = _runtimeModel.RoMap.Bases[RuntimeModel.BotPlayerId];
var step = DirectionStep(playerBase, enemyBase);
return playerBase + step * 3;
}

var nearest = enemies.OrderBy(e => DistanceToPlayerBase(e.Pos)).First();
return PointAtRangeFrom(nearest.Pos, playerBase, attackRange: 3);
}

private List<IReadOnlyUnit> EnemiesOnOurHalf(List<IReadOnlyUnit> enemies)
{
var playerBase = _runtimeModel.RoMap.Bases[RuntimeModel.PlayerId];
int half = _runtimeModel.RoMap.Width / 2;
bool baseOnLeft = playerBase.x <= half;
return baseOnLeft
? enemies.Where(e => e.Pos.x <= half).ToList()
: enemies.Where(e => e.Pos.x > half).ToList();
}

private float DistanceToPlayerBase(Vector2Int pos)
{
return Vector2Int.Distance(pos, _runtimeModel.RoMap.Bases[RuntimeModel.PlayerId]);
}

private static Vector2Int DirectionStep(Vector2Int from, Vector2Int to)
{
var d = to - from;
return new Vector2Int(
d.x == 0 ? 0 : (d.x > 0 ? 1 : -1),
d.y == 0 ? 0 : (d.y > 0 ? 1 : -1)
);
}

private static Vector2Int PointAtRangeFrom(Vector2Int origin, Vector2Int toward, int attackRange)
{
var delta = toward - origin;
float dist = delta.magnitude;
if (dist < 1f) return origin;
return origin + new Vector2Int(
Mathf.RoundToInt(delta.x / dist * attackRange),
Mathf.RoundToInt(delta.y / dist * attackRange)
);
}
}
}
3 changes: 3 additions & 0 deletions Assets/Scripts/UnitBrains/ArmyBrain.cs.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 3 additions & 1 deletion Assets/Scripts/UnitBrains/BaseUnitBrain.cs
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ public virtual Vector2Int GetNextStep()
var target = runtimeModel.RoMap.Bases[
IsPlayerUnitBrain ? RuntimeModel.BotPlayerId : RuntimeModel.PlayerId];

_activePath = new DummyUnitPath(runtimeModel, unit.Pos, target);
_activePath = new AStarUnitPath(runtimeModel, unit.Pos, target);
return _activePath.GetNextStepFrom(unit.Pos);
}

Expand All @@ -65,6 +65,8 @@ public void SetUnit(Unit unit)
this.unit = unit;
}

public virtual void SetArmyBrain(ArmyBrain armyBrain) { }

public virtual void Update(float deltaTime, float time)
{
}
Expand Down
Loading