void ScheduleTacticsWhenLowHp() { GameEvent.Register(GameEventType.UnitReceivedFire, args => { // If attacking, run away if (args.MyUnit.ActionQueue.CurrentAction is Attack || args.MyUnit.ActionQueue.CurrentAction is AttackMove) { UnitActionQueue oldActions = args.MyUnit.ActionQueue; if (args.MyUnit.Health < args.MyUnit.MaxHealth / 2) { // Any unit of course exposes its position in form of coordinates; MyBotData contains data args.MyUnit.MoveTo(MyBotData.HealMeetPointUnit.Position); BotRunner.Log("Unit " + args.MyUnit + " is waiting to be healed"); MyBotData.MeetPointEvent = GameEvent.Register(GameEventType.UnitGainedHealth, argsB => { argsB.MyUnit.ActionQueue = oldActions; }); } } // If hiding, defend else if (args.EnemyUnits.Length > 0) { EnqueueFirst(new Attack(args.EnemyUnits[0]), args.MyUnit); } }); }
/// <summary> /// Send the Worker to gather a resource. /// <see cref="XposeCraft.Game.Helpers.ResourceHelper"/> provides various methods to find some. /// </summary> /// <param name="resource">Resource to be gathered.</param> public UnitActionQueue SendGather(IResource resource) { if (resource != null) { Tutorial.Instance.SendGather(); } return(ActionQueue = new UnitActionQueue(new GatherResource(resource))); }
void ScheduleTacticsWhenLowHp() { Event.Register(EventType.UnitReceivedFire, args => { UnitActionQueue oldActions = args.MyUnit.ActionQueue; if (args.MyUnit.Health < args.MyUnit.MaxHealth / 2) { // Any unit of course exposes its position in form of coordinates; MyBot is custom player’s class args.MyUnit.MoveTo(MyBot.HealMeetPointUnit.Position); MyBot.MeetPointEvent = Event.Register(EventType.UnitGainedHealth, argsB => { argsB.MyUnit.ReplaceActionQueue(oldActions); }); } }); }
public void BattleStage(Action startNextStage) { // Plan individual unit attacks or a return when meeting too many units GameEvent.Register(GameEventType.EnemyUnitsOnSight, args => { if (args.EnemyUnits.Length > UnitHelper.GetMyUnits <IUnit>().Length) { // Too many enemies, return back foreach (IUnit unit in UnitHelper.GetMyUnits <IUnit>()) { unit.MoveTo(PlaceType.MyBase.Center); } } else { UnitActionQueue queue = new UnitActionQueue(); foreach (IUnit enemy in args.EnemyUnits) { queue.After(new Attack(enemy)); } foreach (IUnit unit in UnitHelper.GetMyUnits <IUnit>()) { unit.ActionQueue = queue; } } }); // Initiate the attack GoAttack(); // When the units get to low health, they will return back to heal ScheduleTacticsWhenLowHp(); // Stores enemies for later possible calculations RememberEnemies(); // Destroys buildings when possible, should be preferable contitioned DestroyBuildings(); }
// TODO: deprecate in favor of equals operator? public UnitActionQueue ReplaceActionQueue(UnitActionQueue queue) { return(ActionQueue = queue); }
public UnitActionQueue Attack(IUnit unit) { return(ActionQueue = new UnitActionQueue(new Attack(unit))); }
public UnitActionQueue AttackMoveTo(Position position) { return(ActionQueue = new UnitActionQueue(new AttackMove(position))); }
public UnitActionQueue Attack(IBuilding building) { return(ActionQueue = new UnitActionQueue(new Attack(building))); }
private void StopGathering() { // This is deprecated and all using functions should be converted to GameActions ActionQueue = new UnitActionQueue(); Gathering = null; }