Beispiel #1
0
    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));
    }
Beispiel #2
0
    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);