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; } } } }
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; } } } }
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); } }