Exemple #1
0
    public override void OnEnter()
    {
        base.OnEnter();

        var vision       = TowerManager.Instance.GetHexagonsInVision(CurrentPlayer);
        var allAttackers = TowerManager.Instance.GetTowersOfType(CurrentPlayer, TowerType.AttackTower);

        var allTowers = TowerManager.Instance.GetAllTowers();

        foreach (var a in allAttackers)
        {
            if (a.state != TowerInfo.BuildingState.Working)
            {
                continue;
            }

            int targetNumbers = 0;

            var range = RangeUtils.GetRangeOfTower(a, vision);

            int m = RangeUtils.maxTargetCount(a.range);

            float addedDamage = 0.5f / (m * m - m);

            foreach (var t in allTowers)
            {
                if (t.playerSlotId == CurrentPlayer.SlotId)
                {
                    continue;
                }

                if (range.Contains(t.coord)) //Auto attack towers
                {
                    targetNumbers++;
                }
            }

            float currentDamage = 1.0f / targetNumbers + addedDamage;

            foreach (var t in allTowers)
            {
                if (t.playerSlotId == CurrentPlayer.SlotId)
                {
                    continue;
                }

                //Play attack animation

                if (range.Contains(t.coord)) //Auto attack towers
                {
                    t.healthGP -= currentDamage;
                }
            }
        }
    }
Exemple #2
0
    private void UpdateAfterBuildingChanged(int playerSlotId)
    {
        var player = GamePlay.Instance.FindPlayerAgentBySlotId(playerSlotId);
        //var hexes = GetHexagonsInRange(playerSlotId, TowerType.ResourceTower);

        var towers = GetTowersOfPlayer(player);
        var vision = RangeUtils.GetPlayerVisionServer(player);
        int prod   = 0;

        for (int i = 0; i < towers.Count; ++i)
        {
            if (towers[i].type != TowerType.ResourceTower)
            {
                continue;
            }

            var hexes = RangeUtils.GetRangeOfTower(towers[i], vision);
            RemoveHexagonsOccupied(hexes);
            prod += hexes.Count;
        }

        player.SetProduction(prod);

        int res =
            SumAttribute(player, TowerType.ResourceTower, x => { return(x.cost); }) +
            SumAttribute(player, TowerType.VisionTower, x => { return(x.cost); }) +
            SumAttribute(player, TowerType.AttackTower, x => { return(x.cost); });

        player.SetCost(res);

        for (int i = 0; i < towers.Count; ++i)
        {
            if (towers[i].state == TowerInfo.BuildingState.Working)
            {
                if (!vision.Contains(towers[i].coord))
                {
                    towers[i].state = TowerInfo.BuildingState.OutOfVision;
                }
            }
            else if (towers[i].state == TowerInfo.BuildingState.OutOfVision)
            {
                if (vision.Contains(towers[i].coord))
                {
                    towers[i].state = TowerInfo.BuildingState.Working;
                }
            }
        }
    }
Exemple #3
0
    void CmdTryAttackTower(int playerSlot, HexCoord attackerCoord, HexCoord attackeeCoord)
    {
        var attacker = TowerManager.Instance.FindTowerByCoord(attackerCoord);

        if (attacker == null || attacker.type != TowerType.AttackTower || attacker.playerSlotId != playerSlot || attacker.state != TowerInfo.BuildingState.Working || attacker.attacked)
        {
            return;
        }

        var attackee = TowerManager.Instance.FindTowerByCoord(attackeeCoord);

        if (attackee == null || attackee.playerSlotId == playerSlot)
        {
            return;
        }

        var attackerPlayer = GamePlay.Instance.FindPlayerAgentBySlotId(attacker.playerSlotId);
        int attackCost     = GamePlay.Instance.GetConstant <int>(GamePlay.ConstantName.AttackCost, 0);

        if (attackerPlayer.Resource < attackCost)
        {
            return;
        }

        var vision = TowerManager.Instance.GetHexagonsInVision(playerSlot);
        var range  = RangeUtils.GetRangeOfTower(attacker, vision);

        if (range.Contains(attackee.coord))
        {
            attackee.health--;
            if (attackee.health <= 0)
            {
                TowerManager.Instance.DestroyTower(attackee);
            }
            attackerPlayer.AddResource(-attackCost);

            attacker.attacked = true;

            attackerPlayer.RpcAddLog("You attacked an enemy's building, resource is decreased by " + attackCost);
            RpcAttackSuccess(attackerCoord);
        }
    }