Skip to content

Commit

Permalink
AI update
Browse files Browse the repository at this point in the history
  • Loading branch information
Ormanus committed Jan 17, 2019
1 parent f32e984 commit 1a86cd5
Show file tree
Hide file tree
Showing 8 changed files with 142 additions and 94 deletions.
12 changes: 6 additions & 6 deletions Assets/Scripts/Functional Definitions/TargetingSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,22 +42,22 @@ public Transform GetTarget(bool findNew = false) {
Transform closest = null;
float closestD = float.MaxValue;

for (int i = 0; i < AirCraftAI.entities.Count; i++)
for (int i = 0; i < AIData.entities.Count; i++)
{
if (AirCraftAI.entities[i].transform == parent)
if (AIData.entities[i].transform == parent)
continue;
if (parent.GetComponent<Entity>().faction == AirCraftAI.entities[i].faction)
if (parent.GetComponent<Entity>().faction == AIData.entities[i].faction)
continue;
if (AirCraftAI.entities[i].GetIsDead())
if (AIData.entities[i].GetIsDead())
{
continue;
}

float sqrD = Vector3.SqrMagnitude(parent.position - AirCraftAI.entities[i].transform.position);
float sqrD = Vector3.SqrMagnitude(parent.position - AIData.entities[i].transform.position);
if (closest == null || sqrD < closestD)
{
closestD = sqrD;
closest = AirCraftAI.entities[i].transform;
closest = AIData.entities[i].transform;
}
}
target = closest;
Expand Down
12 changes: 6 additions & 6 deletions Assets/Scripts/Functional Definitions/WeaponTargetingSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,30 +34,30 @@ public Transform GetTarget(bool findNew = false)
Transform closest = null;
float closestD = float.MaxValue;

for (int i = 0; i < AirCraftAI.entities.Count; i++) // go through all entities and check them for several factors
for (int i = 0; i < AIData.entities.Count; i++) // go through all entities and check them for several factors
{
// checks for: if it is the same faction as the ability entity,
// if it's dead, if it is weapon-compatible

if (ability.Core.faction == AirCraftAI.entities[i].faction)
if (ability.Core.faction == AIData.entities[i].faction)
{
// if(ability as Beam) Debug.Log(entities[i]);
continue;
}
if (AirCraftAI.entities[i].GetIsDead())
if (AIData.entities[i].GetIsDead())
{
continue;
}
if (!ability.CheckCategoryCompatibility(AirCraftAI.entities[i]))
if (!ability.CheckCategoryCompatibility(AIData.entities[i]))
continue;

// check if it is the closest entity that passed the checks so far

float sqrD = Vector3.SqrMagnitude(ability.Core.transform.position - AirCraftAI.entities[i].transform.position);
float sqrD = Vector3.SqrMagnitude(ability.Core.transform.position - AIData.entities[i].transform.position);
if (closest == null || sqrD < closestD)
{
closestD = sqrD;
closest = AirCraftAI.entities[i].transform;
closest = AIData.entities[i].transform;
}
}
// set to the closest compatible target
Expand Down
10 changes: 10 additions & 0 deletions Assets/Scripts/Game Object Definitions/AI/AIData.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AIData
{
public static List<Entity> entities = new List<Entity>();
public static List<EnergyRock> energyRocks = new List<EnergyRock>();
public static List<Entity> vendors = new List<Entity>();
}
11 changes: 11 additions & 0 deletions Assets/Scripts/Game Object Definitions/AI/AIData.cs.meta

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

22 changes: 11 additions & 11 deletions Assets/Scripts/Game Object Definitions/AI/AirCraftAI.cs
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ public enum AIAggression
bool retreatTargetFound = false;
Vector2 retreatTarget;

public static List<Entity> entities = new List<Entity>(); //TODO: move somewhere more appropriate
//public static List<Entity> entities = new List<Entity>();

public void setMode(AIMode mode)
{
Expand Down Expand Up @@ -239,22 +239,22 @@ public static T getNearestEntity<T>(Vector3 position, int faction = -1, bool ene
{
float minD = float.MaxValue;
T nearest = null;
for (int i = 0; i < entities.Count; i++)
for (int i = 0; i < AIData.entities.Count; i++)
{
if (entities[i].GetIsDead())
if (AIData.entities[i].GetIsDead())
continue;
if (terrainType != Entity.TerrainType.All && entities[i].Terrain != terrainType)
if (terrainType != Entity.TerrainType.All && AIData.entities[i].Terrain != terrainType)
continue;
if (entities[i] is T)
if (AIData.entities[i] is T)
{
if (((entities[i].faction == faction) ^ !enemy) && faction != -1)
if (((AIData.entities[i].faction == faction) ^ !enemy) && faction != -1)
continue;

float d = (position - entities[i].transform.position).sqrMagnitude;
float d = (position - AIData.entities[i].transform.position).sqrMagnitude;
if (d < minD)
{
minD = d;
nearest = entities[i] as T;
nearest = AIData.entities[i] as T;
}
}
}
Expand All @@ -265,11 +265,11 @@ public static int getEnemyCountInRange(Vector3 position, float range, int factio
{
int count = 0;
float sqrRange = range * range;
for (int i = 0; i < entities.Count; i++)
for (int i = 0; i < AIData.entities.Count; i++)
{
if (entities[i].GetIsDead())
if (AIData.entities[i].GetIsDead())
continue;
if ((position - entities[i].transform.position).sqrMagnitude < sqrRange)
if ((position - AIData.entities[i].transform.position).sqrMagnitude < sqrRange)
count++;
}
return count;
Expand Down
151 changes: 82 additions & 69 deletions Assets/Scripts/Game Object Definitions/AI/BattleAI.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,7 @@ enum BattleState

Entity primaryTarget;

List<Outpost> outposts;
Outpost collectTarget = null;
EnergyRock collectTarget = null;
bool findNewTarget = false;

public override void Init()
Expand Down Expand Up @@ -93,7 +92,7 @@ public override void StateTick()
}

// if population is nearly capped, attack
if (shellcore.GetTotalCommandLimit() > shellcore.GetUnitsCommanding().Count) // TODO: OR if enemy base is weak
if (shellcore.GetTotalCommandLimit() > shellcore.GetUnitsCommanding().Count || shellcore.GetPower() > 100) // TODO: OR if enemy base is weak
{
state = BattleState.Attack;
}
Expand Down Expand Up @@ -135,10 +134,9 @@ public override void ActionTick()
craft.MoveCraft((primaryTarget.transform.position - craft.transform.position).normalized);
}
//TODO: AI Attack:
// create tanks, if bunkers or enemy ground base exists
// create torpedo turrets if no bunker is under control
// ground attack location = own bunker location (or tank drop location?)
// what if there are multiple land masses? how to attack?
// ground attack location = own bunker location
// drag tanks from one platform to another "LandPlatformGenerator.getEnemiesOnPlatform(Vector2 platformLocation, int faction)"?
// how to react to different pressures on land and air?
// keep an offensive turret in tracktor beam, if possible
break;
Expand All @@ -150,91 +148,106 @@ public override void ActionTick()
break;
case BattleState.Collect:
// go from outpost to outpost, (also less fortified enemy outposts [count enemy units nearby {TODO}]) and collect energy
if(outposts == null)
{
outposts = new List<Outpost>();
foreach (var entity in AirCraftAI.entities)
{
if (entity is Outpost)
outposts.Add(entity as Outpost);
}
}

if(findNewTarget || collectTarget == null)
{
// Find new target
if (collectTarget != null)
collectTarget = AirCraftAI.getNearestEntity<Outpost>(/*carrier != null ? carrier.transform.position : */craft.transform.position, craft.faction, false);
else
float minD = float.MaxValue;
EnergyRock nearest = null;
for (int i = 0; i < AIData.energyRocks.Count; i++)
{
float minD = float.MaxValue;
Outpost nearest = null;
for (int i = 0; i < outposts.Count; i++)
if (AirCraftAI.getEnemyCountInRange(AIData.energyRocks[i].transform.position, 15f, craft.faction) > 3)
continue;

float d = (craft.transform.position - AIData.energyRocks[i].transform.position).sqrMagnitude;
if (d < minD && AIData.energyRocks[i] != collectTarget)
{
if (outposts[i].faction != craft.faction && AirCraftAI.getEnemyCountInRange(outposts[i].transform.position, 15f, craft.faction) < 3)
continue;

float d = (craft.transform.position - outposts[i].transform.position).sqrMagnitude;
if (d < minD && outposts[i] != collectTarget)
{
minD = d;
nearest = outposts[i];
}
minD = d;
nearest = AIData.energyRocks[i];
}
collectTarget = nearest;
}
collectTarget = nearest;

if(collectTarget != null)
if (collectTarget != null)
findNewTarget = false;
}

if(collectTarget != null)
{
Vector2 delta = collectTarget.transform.position - craft.transform.position;
if (delta.sqrMagnitude > 400f)
if (delta.sqrMagnitude > 25f)
{
craft.MoveCraft(delta.normalized);
}
else
}
break;
default:
break;
}

for (int i = 0; i < AIData.vendors.Count; i++)
{
if ((AIData.vendors[i].transform.position - craft.transform.position).sqrMagnitude < 400f)
{
IVendor vendor = AIData.vendors[i] as IVendor;

if (vendor.GetVendingBlueprint() == null)
continue;

int itemIndex = -1;
for (int j = 0; j < vendor.GetVendingBlueprint().items.Count; j++)
{
if (vendor.GetVendingBlueprint().items[j].cost <= shellcore.GetPower() && shellcore.unitsCommanding.Count < shellcore.GetTotalCommandLimit())
{
if(collectTarget.faction == craft.faction)
if (itemIndex != -1 && vendor.GetVendingBlueprint().items[j].cost <= vendor.GetVendingBlueprint().items[itemIndex].cost) // more expensive => better (TODO: choose based on the situation)
{
for (int i = 0; i < collectTarget.vendingBlueprint.items.Count; i++)
{
if (collectTarget.vendingBlueprint.items[i].cost <= shellcore.GetPower() && shellcore.unitsCommanding.Count < shellcore.GetTotalCommandLimit())
{
GameObject creation = new GameObject();
switch (collectTarget.vendingBlueprint.items[i].entityBlueprint.intendedType)
{
case EntityBlueprint.IntendedType.Turret:
Turret tur = creation.AddComponent<Turret>();
tur.blueprint = collectTarget.vendingBlueprint.items[i].entityBlueprint;
tur.SetOwner(shellcore);
break;
case EntityBlueprint.IntendedType.Tank:
Tank tank = creation.AddComponent<Tank>();
tank.blueprint = collectTarget.vendingBlueprint.items[i].entityBlueprint;
tank.enginePower = 250;
tank.SetOwner(shellcore);
break;
default:
break;
}

creation.transform.position = collectTarget.transform.position;
creation.GetComponent<Entity>().spawnPoint = collectTarget.transform.position;
shellcore.SetTractorTarget(creation.GetComponent<Draggable>());
shellcore.AddPower(-collectTarget.vendingBlueprint.items[i].cost);
}
}
continue;
}

findNewTarget = true;
if (vendor.GetVendingBlueprint().items[j].entityBlueprint.intendedType == EntityBlueprint.IntendedType.Tank && !enemyGroundTargets(true)) //TODO: get turret / tank attack category from somewhere else
continue;

itemIndex = j;
}
}
break;
default:
break;

if(itemIndex != -1)
{
GameObject creation = new GameObject();
switch (vendor.GetVendingBlueprint().items[itemIndex].entityBlueprint.intendedType)
{
case EntityBlueprint.IntendedType.Turret:
Turret tur = creation.AddComponent<Turret>();
tur.blueprint = vendor.GetVendingBlueprint().items[itemIndex].entityBlueprint;
tur.SetOwner(shellcore);
shellcore.SetTractorTarget(creation.GetComponent<Draggable>());
break;
case EntityBlueprint.IntendedType.Tank:
Tank tank = creation.AddComponent<Tank>();
tank.blueprint = vendor.GetVendingBlueprint().items[itemIndex].entityBlueprint;
tank.enginePower = 250;
tank.SetOwner(shellcore);
break;
default:
break;
}

creation.transform.position = AIData.vendors[i].transform.position;
creation.GetComponent<Entity>().spawnPoint = AIData.vendors[i].transform.position;
shellcore.AddPower(-vendor.GetVendingBlueprint().items[itemIndex].cost);
}
}
}
}

bool enemyGroundTargets(bool allEntities)
{
Entity[] targets = allEntities ? AIData.entities.ToArray() : BattleZoneManager.getTargets();
for (int i = 0; i < targets.Length; i++)
{
if(targets[i].faction != craft.faction && targets[i].Terrain == Entity.TerrainType.Ground)
{
return true;
}
}
return false;
}
}
10 changes: 10 additions & 0 deletions Assets/Scripts/Game Object Definitions/EnergyRock.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,16 @@ private void Start()
targetTime = Time.time + maxTime;
}

private void Awake()
{
AIData.energyRocks.Add(this);
}

private void OnDestroy()
{
AIData.energyRocks.Remove(this);
}

void Update () {
if (Time.time > targetTime) {
targetTime = Time.time + maxTime;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -407,12 +407,16 @@ virtual protected void Awake() {
"it should be added automatically by setting isDraggable to true!");
}

AirCraftAI.entities.Add(this);
AIData.entities.Add(this);
if(this is IVendor)
AIData.vendors.Add(this);
}

protected virtual void OnDestroy()
{
AirCraftAI.entities.Remove(this);
AIData.entities.Remove(this);
if (this is IVendor)
AIData.vendors.Remove(this);
}

virtual protected void Start()
Expand Down

0 comments on commit 1a86cd5

Please sign in to comment.