public List <Action> GenerateActions() { List <Action> actions = new List <Action>(); if (elf.IsBuilding) { return(actions); } //can we place a portal here? if (elf.CanBuildPortal()) { actions.Add(new BuildPortalAction(elf)); } if (elf.CanBuildManaFountain()) { actions.Add(new BuildManaFountainAction(elf)); } if (elf.CanCastInvisibility()) { actions.Add(new CastInvisibility(elf)); } if (Constants.Game.ElfMaxSpeed != 0) { if (elf.CanCastSpeedUp() && !elf.IsBuilding) { actions.Add(new CastSpeedUp(elf)); } //check movement in every direction in 5 degrees steps for (int i = 0; i < 360; i += 5) { Location newLocation = elf.GetNewLocation(i, elf.MaxSpeed /*(elf.MaxSpeed + Constants.Game.ElfMaxSpeed) / 2*/); if (newLocation.InMap()) { actions.Add(new MoveAction(elf, newLocation)); } } /*foreach (Location permMoveLocation in ElfMoveTargets.PermanentMoveLocations) * { * Location newLocation = elf.GetLocation().Towards(permMoveLocation, (elf.MaxSpeed + Constants.Game.ElfMaxSpeed) / 2); * * actions.Add(new MoveAction(elf, newLocation)); * } * * foreach (Location moveLocation in moveTargets.moveLocations) * { * Location newLocation = elf.GetLocation().Towards(moveLocation, (elf.MaxSpeed + Constants.Game.ElfMaxSpeed) / 2); * * actions.Add(new MoveAction(elf, newLocation)); * }*/ } //We used to use InRange here (and also in other places in the bot) but we actually found InRange to be too unreliable and sometimes didn't return the expected results. So we check manually. if (Constants.Game.GetVolcano().IsActive() && Constants.Game.GetVolcano().DamageByEnemy <= Constants.Game.VolcanoMaxHealth / 2 && elf.Distance(Constants.Game.GetVolcano()) <= (Constants.Game.ElfAttackRange + Constants.Game.VolcanoSize)) { actions.Add(new AttackAction(elf, Constants.Game.GetVolcano())); } if (elf.Distance(Constants.Game.GetEnemyCastle()) <= (Constants.Game.ElfAttackRange + Constants.Game.CastleSize)) { actions.Add(new AttackAction(elf, Constants.Game.GetEnemyCastle())); } foreach (Portal enemyPortal in Constants.GameCaching.GetEnemyPortals()) { if (elf.Distance(enemyPortal) <= (Constants.Game.ElfAttackRange + enemyPortal.Size)) { actions.Add(new AttackAction(elf, enemyPortal)); } } foreach (ManaFountain enemyGameObject in Constants.GameCaching.GetEnemyManaFountains()) { if (elf.Distance(enemyGameObject) <= (Constants.Game.ElfAttackRange + enemyGameObject.Size)) { actions.Add(new AttackAction(elf, enemyGameObject)); } } foreach (Elf enemyGameObject in Constants.GameCaching.GetEnemyLivingElves()) { if (elf.Distance(enemyGameObject) <= Constants.Game.ElfAttackRange) { actions.Add(new AttackAction(elf, enemyGameObject)); } } foreach (GameObject enemyGameObject in Constants.GameCaching.GetEnemyCreatures()) { if (elf.Distance(enemyGameObject) <= Constants.Game.ElfAttackRange) { actions.Add(new AttackAction(elf, enemyGameObject)); } } return(actions); }
public void DoTurn(Game game) { turnsWithoutTrolls++; int startingMana = game.GetMyMana(); Elf[] enemyElves; Elf[] myElves = game.GetMyLivingElves(); Portal[] portals = game.GetMyPortals(); totalPortals += portals.Length; if (game.Turn % 100 == 0) { buildRange = 2800; if (game.Turn < 400) { buildRange = 2300; } if (game.Turn < 200) { buildRange = 1800; } } if (game.GetMyCastle().CurrentHealth < 125 && buildRange > 2300) { buildRange = 2300; } if (game.GetMyCastle().CurrentHealth < 100 && buildRange > 1800) { buildRange = 1800; } if (game.GetMyCastle().CurrentHealth < 50 && buildRange > 1300) { buildRange = 1300; } if (portals.Length >= 1) { if (turnsWithoutTrolls >= 8) { bool flag = false; Creature[] enemyGiants = game.GetEnemyLavaGiants(); if (enemyGiants != null && !flag) { foreach (Creature giant in enemyGiants) { if (giant.Distance(game.GetMyCastle()) <= 2000) { Portal currentBest = FindNearest(giant, game); if (currentBest.CanSummonIceTroll() && !flag) { currentBest.SummonIceTroll(); flag = true; } break; } } } enemyElves = game.GetAllEnemyElves(); if (enemyElves != null) { foreach (Elf elf in enemyElves) { if (elf.Location == null) { continue; } foreach (Portal current in portals) { if (elf.Distance(current) <= 700) { if (current.CanSummonIceTroll() && !flag) { current.SummonIceTroll(); flag = true; } } } } } if (enemyElves != null) { foreach (Elf elf in enemyElves) { if (elf.Location == null) { continue; } if (elf.Distance(game.GetMyCastle()) <= 2000) { Portal currentBest = FindNearest(game.GetMyCastle(), game); if (currentBest.CanSummonIceTroll() && !flag) { currentBest.SummonIceTroll(); flag = true; } break; } } } if (flag) { turnsWithoutTrolls = 0; } } if (game.Turn % 40 == 1 && game.Turn > 1) { Portal currentBest = FindNearest(game.GetEnemyCastle(), game); if (currentBest.CanSummonLavaGiant()) { currentBest.SummonLavaGiant(); } else if (portals[0].CanSummonLavaGiant()) { portals[0].SummonLavaGiant(); } } game.Debug("Average portals: " + (float)totalPortals / game.Turn); if ((game.Turn >= 600 && (totalPortals / game.Turn <= portals.Length)) || (game.GetMyCastle().CurrentHealth < 40 && game.GetMyMana() > 50)) { Portal currentBest = FindNearest(game.GetEnemyCastle(), game); if (currentBest.CanSummonLavaGiant()) { currentBest.SummonLavaGiant(); } foreach (Portal portal in game.GetMyPortals()) { if (portal.CanSummonLavaGiant()) { portal.SummonLavaGiant(); } } } } if (myElves.Length < 1) { return; } if (PortalsInRadius(1300, game) >= 4) { DefendAgainst(game.GetAllEnemyElves(), game, myElves, 0, 300); DefendAgainst(game.GetEnemyPortals(), game, myElves, enemyAggressivePortalRangeFromCastle, 700); } else { if (game.GetMyMana() > 100) { if (myElves[0].CanBuildPortal() && !myElves[0].AlreadyActed) { myElves[0].BuildPortal(); } else { BuildInRadius(1300, myElves[0], game); } } } if (myElves.Length >= 1 && !myElves[0].AlreadyActed) { if (game.GetMyMana() > 100 && PortalsInRadius(buildRange, game) < 5) { if (myElves[0].CanBuildPortal() && !myElves[0].AlreadyActed) { myElves[0].BuildPortal(); } else { BuildInRadius(buildRange, myElves[0], game); } } } DefendAgainst(game.GetAllEnemyElves(), game, myElves, 0, 300); DefendAgainst(game.GetEnemyPortals(), game, myElves, enemyAggressivePortalRangeFromCastle, 700); DefendAgainst(game.GetAllEnemyElves(), game, myElves, 1500, 500); DefendAgainst(game.GetEnemyLavaGiants(), game, myElves); //Defult 1 - defend portals DefendOn(game.GetMyPortals(), game.GetEnemyLivingElves(), myElves, 750); //Defult 2 - look at enemies if (game.GetEnemyLivingElves().Length > 0) { for (int i = 1; i < myElves.Length; i++) { if (myElves[i].AlreadyActed) { continue; } Elf nearestElf = game.GetEnemyLivingElves()[0]; foreach (var item in game.GetEnemyLivingElves()) { if (item.Distance(myElves[i]) < nearestElf.Distance(myElves[i])) { nearestElf = item; } } double degree = DegreeBetween(nearestElf.Location, game.GetMyCastle().Location); myElves[i].MoveTo(Cis(defendRadius, degree, game.GetMyCastle().Location)); } } //Defult 3 - pretend you're working foreach (var elf in myElves) { if (elf.AlreadyActed) { continue; } if (game.GetMyMana() > 100 && PortalsInRadius(1300, game) < 5 && elf.CanBuildPortal()) { elf.BuildPortal(); continue; } BuildInRadius(buildRange, elf, game); } manaWasted += startingMana - game.GetMyMana(); game.Debug(manaWasted); }