public void OnMissileEnd(AIPlannerMissile.AIPlannerMissileResult result) { if (result.hitPlayerShip) { AddShipHit(result); } currentSampleAmount--; }
public void AddShipHit(AIPlannerMissile.AIPlannerMissileResult result) { Ship hitShip = result.shipHit; if (!successTestDictionary.ContainsKey(hitShip)) { successTestDictionary.Add(hitShip, new List <AIPlannerMissile.AIPlannerMissileResult>()); } successTestDictionary[hitShip].Add(result); }
public override bool TakeAction() { if (timeSinceLastFire > 0) { return(false); } List <Ship> ships = Enumerable.ToList(successTestDictionary.Keys); // Haven't hit a ship if (ships.Count <= 0) { return(false); } Ship target = ships[Random.Range(0, ships.Count)]; List <AIPlannerMissile.AIPlannerMissileResult> resultList = successTestDictionary[target]; bool acceptableResult = false; for (int i = 0; i < resultList.Count; i++) { AIPlannerMissile.AIPlannerMissileResult result = resultList[i]; // Convert positions to vector2s Vector2 targetPos = target.transform.position; Vector2 shipPos = ship.transform.position; if (result.shipPositionOnHit.Equals(targetPos) && result.shipPositionOnFire.Equals(shipPos)) { acceptableResult = true; } else { // Debug.Log("Not acceptable anymore target then: " + result.shipPositionOnHit + ", target now: " + targetPos); // Not acceptable anymore resultList.Remove(result); i--; } } if (acceptableResult) { AIPlannerMissile.AIPlannerMissileResult chosen = resultList[Random.Range(0, resultList.Count)]; float fireAngle = chosen.fireAngle; if (Random.Range(0, 100) / 100.0 > hitRate) { Debug.Log("Ai misses on purpose"); fireAngle += Random.Range(-missOffset, missOffset); } ship.Shoot(fireAngle, ((WeaponAbility)ability).weaponPrefab); ability.UseAbility(); return(true); } else { return(false); } }