protected override AiDecision makeDecision(AiHeuristicInfo info) { int unitScore = getUnitScore(info.srcUnits); int enemyScore = getUnitScore(info.enemyUnits); int unitLevel = 3; if (enemyScore > unitScore) { if (info.target != null && info.target.owner.getUpgradeLevel() > info.src.owner.getUpgradeLevel()) { unitLevel = 3; } unitLevel = 2; } else { unitLevel = 1; } return(new AiDecision(info.target, unitLevel, info.direction)); }
protected override int getScore(AiHeuristicInfo info) { int score = 100; int unitScore = getUnitScore(info.srcUnits); int enemyScore = getUnitScore(info.enemyUnits); // If flag is owned already half score if (info.target.owner == info.src.owner) { score /= 2; // Half Score if flag is already owned } if (info.target == null) { score *= 2; } score += enemyScore - unitScore; score += this.aiController.money - enemyScore; return(score); }
protected AiHeuristicInfo[] getAllSituations() { Queue <AiHeuristicInfo> possibleMovesInfo = new Queue <AiHeuristicInfo>(); foreach (CaptureEntity c in this.aiController.capturedEntities) { // Check Each Direction foreach (Direction d in Enum.GetValues(typeof(Direction))) { // Generate Raycast Vector2 direction = EntityUtils.getDirectionVector(d) * VIEW_RANGE; direction *= BoardManager.TILE_SCALE * VIEW_RANGE; Vector2 end = c.rb2D.position + direction; // Preform Raycast c.boxCollider.enabled = false; RaycastHit2D[] hits = Physics2D.LinecastAll(c.rb2D.position, end, LayerMask.GetMask("Blocking")); //Physics2D.Linecast Debug.DrawLine(c.rb2D.position, end, Color.red, .5f); c.boxCollider.enabled = true; if (hits == null || hits.Length == 0) { continue; } // Continue if nothing was hit AiHeuristicInfo moveInfo = new AiHeuristicInfo(c, d); // Direction Vision Check foreach (RaycastHit2D hit in hits) { CaptureEntity captureEntity = hit.rigidbody.GetComponent <CaptureEntity>(); GameUnitEntity gameUnitEntity = hit.collider.GetComponent <GameUnitEntity>(); // Unit if (gameUnitEntity != null) { if (gameUnitEntity.owner == c.owner) { moveInfo.srcUnits.AddLast(gameUnitEntity); } else { moveInfo.enemyUnits.AddLast(gameUnitEntity); } } else if (captureEntity != null && captureEntity != c) { // Enemy Capture Points moveInfo.target = captureEntity; } } if (moveInfo.target == null) { continue; } // If a target was not found, don't move possibleMovesInfo.Enqueue(moveInfo); } } return(possibleMovesInfo.ToArray()); }
protected abstract AiDecision makeDecision(AiHeuristicInfo info);
protected abstract int getScore(AiHeuristicInfo info);