public override List <EncounterAction> _DecideNextAction(EncounterState state, Entity parent) { var actions = new List <EncounterAction>(); var parentPos = parent.GetComponent <PositionComponent>().EncounterPosition; var playerPos = state.Player.GetComponent <PositionComponent>().EncounterPosition; // Always attempt to close distance var path = Pathfinder.AStarWithNewGrid(parentPos, playerPos, state); if (path != null) { actions.Add(new MoveAction(parent.EntityId, path[0])); } // Fire reverser + cannon every 3rd turn, and shotgun + secondary batteries otherwise if (this.CurrentReverserCooldown == 0) { actions.Add(FireProjectileAction.CreateReverserAction(parent.EntityId, playerPos)); actions.Add(FireProjectileAction.CreateSmallCannonAction(parent.EntityId, playerPos)); this.CurrentReverserCooldown += ReverserCooldown; } else { actions.Add(FireProjectileAction.CreateSmallCannonAction(parent.EntityId, playerPos)); actions.Add(FireProjectileAction.CreateSmallCannonAction(parent.EntityId, playerPos)); actions.AddRange(FireProjectileAction.CreateSmallShotgunAction(parent.EntityId, playerPos, numPellets: 2, spread: 3, state.EncounterRand)); if (this.CurrentReverserCooldown > 0) { this.CurrentReverserCooldown -= 1; } } return(actions); }
public override List <EncounterAction> _DecideNextAction(EncounterState state, Entity parent) { var actions = new List <EncounterAction>(); var parentPos = parent.GetComponent <PositionComponent>().EncounterPosition; var playerPos = state.Player.GetComponent <PositionComponent>().EncounterPosition; // Close distance if further than 5 if (parentPos.DistanceTo(playerPos) >= 5f) { // PERF: We may want to make pathfinding stateful/cache it or something, to save on turn times var path = Pathfinder.AStarWithNewGrid(parentPos, playerPos, state); if (path != null) { actions.Add(new MoveAction(parent.EntityId, path[0])); } } // Fire shotgun pellets=5, spread=5 every 4th turn, else fire single cannon (this is honestly a comical amount of spread though) if (this.CurrentShotgunCooldown == 0) { actions.AddRange(FireProjectileAction.CreateSmallShotgunAction(parent.EntityId, playerPos, numPellets: 5, spread: 5, state.EncounterRand)); this.CurrentShotgunCooldown += this.ShotgunCooldown; } else { actions.Add(FireProjectileAction.CreateSmallCannonAction(parent.EntityId, playerPos)); if (this.CurrentShotgunCooldown > 0) { this.CurrentShotgunCooldown -= 1; } } return(actions); }
public override List <EncounterAction> _DecideNextAction(EncounterState state, Entity parent) { var actions = new List <EncounterAction>(); var parentPos = parent.GetComponent <PositionComponent>().EncounterPosition; var playerPos = state.Player.GetComponent <PositionComponent>().EncounterPosition; // Always attempt to close distance var path = Pathfinder.AStarWithNewGrid(parentPos, playerPos, state); if (path != null) { actions.Add(new MoveAction(parent.EntityId, path[0])); } // Fire comically dense & inaccurate shotgun volley every 4 turns, and shotgun otherwise if (this.CurrentVolleyCooldown == 0) { actions.AddRange(FireProjectileAction.CreateSmallShotgunAction(parent.EntityId, playerPos, numPellets: 30, spread: 7, state.EncounterRand)); actions.Add(FireProjectileAction.CreateSmallCannonAction(parent.EntityId, playerPos)); this.CurrentVolleyCooldown += VolleyCooldown; } else { actions.AddRange(FireProjectileAction.CreateSmallShotgunAction(parent.EntityId, playerPos, numPellets: 2, spread: 1, state.EncounterRand)); if (this.CurrentVolleyCooldown > 0) { this.CurrentVolleyCooldown -= 1; } } return(actions); }
private static bool ResolveFireProjectile(FireProjectileAction action, EncounterState state) { var actorPosition = state.GetEntityById(action.ActorId).GetComponent <PositionComponent>().EncounterPosition; Entity projectile = EntityBuilder.CreateProjectileEntity( state.GetEntityById(action.ActorId), action.ProjectileType, action.Power, action.PathFunction(actorPosition), action.Speed, state.CurrentTick ); state.PlaceEntity(projectile, actorPosition, true); return(true); }
public override List <EncounterAction> _DecideNextAction(EncounterState state, Entity parent) { var actions = new List <EncounterAction>(); var parentPos = parent.GetComponent <PositionComponent>().EncounterPosition; var playerPos = state.Player.GetComponent <PositionComponent>().EncounterPosition; var distanceToPlayer = parentPos.DistanceTo(playerPos); // Only attempt to close distance if >=7 squares away if (distanceToPlayer >= 7f) { var path = Pathfinder.AStarWithNewGrid(parentPos, playerPos, state); if (path != null) { actions.Add(new MoveAction(parent.EntityId, path[0])); } } // Always fire cannon actions.Add(FireProjectileAction.CreateSmallCannonAction(parent.EntityId, playerPos)); // Fire railgun on cooldown (every 3rd turn) if (this.CurrentRailgunCooldown == 0) { actions.Add(FireProjectileAction.CreateRailgunAction(parent.EntityId, playerPos)); this.CurrentRailgunCooldown += this.RailgunCooldown; } else if (this.CurrentRailgunCooldown > 0) { this.CurrentRailgunCooldown -= 1; } // If player is close and flak is off cooldown, fire if (distanceToPlayer <= 4 && this.CurrentFlakCooldown == 0) { actions.AddRange(FireProjectileAction.CreateSmallShotgunAction(parent.EntityId, playerPos, numPellets: 30, spread: 5, state.EncounterRand)); this.CurrentFlakCooldown = this.FlakCooldown; } else if (this.CurrentFlakCooldown > 0) { this.CurrentFlakCooldown -= 1; } return(actions); }
public override List <EncounterAction> _DecideNextAction(EncounterState state, Entity parent) { var actions = new List <EncounterAction>(); var parentPos = parent.GetComponent <PositionComponent>().EncounterPosition; var playerPos = state.Player.GetComponent <PositionComponent>().EncounterPosition; // Always close distance var path = Pathfinder.AStarWithNewGrid(parentPos, playerPos, state); if (path != null) { actions.Add(new MoveAction(parent.EntityId, path[0])); } // Always fire actions.Add(FireProjectileAction.CreateSmallGatlingAction(parent.EntityId, playerPos)); actions.Add(FireProjectileAction.CreateSmallGatlingAction(parent.EntityId, playerPos)); actions.Add(FireProjectileAction.CreateSmallGatlingAction(parent.EntityId, playerPos)); return(actions); }
public override List <EncounterAction> _DecideNextAction(EncounterState state, Entity parent) { var actions = new List <EncounterAction>(); var parentPos = parent.GetComponent <PositionComponent>().EncounterPosition; var playerPos = state.Player.GetComponent <PositionComponent>().EncounterPosition; // Carrier never moves // Always launch randomly chosen strike craft - immediately paths one square to get it out of the carrier's square var chosenEntityDef = this.LaunchTable[state.EncounterRand.Next(3)]; var strikeCraft = EntityBuilder.CreateEnemyByEntityDefId(chosenEntityDef, this.ActivationGroupId, state.CurrentTick); actions.Add(new SpawnEntityAction(parent.EntityId, strikeCraft, parentPos, true)); var path = Pathfinder.AStarWithNewGrid(parentPos, playerPos, state); // TODO: If you park adjacent the carrier, spawns will try to path literally into you and be stuck on the carrier square. // Won't crash anything it'll just put some error logs out and be deeply comical. if (path != null) { actions.Add(new MoveAction(strikeCraft.EntityId, path[0])); } // If player is close and flak is off cooldown, fire (comically this can, and will, friendly-fire its fighter wing) // TODO: friendly fire, maybe? It is a bit silly. if (parentPos.DistanceTo(playerPos) <= 4 && this.CurrentFlakCooldown == 0) { actions.AddRange(FireProjectileAction.CreateSmallShotgunAction(parent.EntityId, playerPos, numPellets: 30, spread: 5, state.EncounterRand)); this.CurrentFlakCooldown = this.FlakCooldown; } else if (this.CurrentFlakCooldown > 0) { this.CurrentFlakCooldown -= 1; } return(actions); }
public override List <EncounterAction> _DecideNextAction(EncounterState state, Entity parent) { var actions = new List <EncounterAction>(); var parentPos = parent.GetComponent <PositionComponent>().EncounterPosition; var playerPos = state.Player.GetComponent <PositionComponent>().EncounterPosition; // Close distance if further than 5 if (parentPos.DistanceTo(playerPos) >= 5f) { // TODO: We may want to make pathfinding stateful/cache it or something, to save on turn times var path = Pathfinder.AStarWithNewGrid(parentPos, playerPos, state); if (path != null) { actions.Add(new MoveAction(parent.EntityId, path[0])); } } // Always fire shotgun (spread=2, pellets=3) var fire = FireProjectileAction.CreateSmallShotgunAction(parent.EntityId, playerPos, numPellets: 3, spread: 2, state.EncounterRand); actions.AddRange(fire); return(actions); }