static ProjectedGameState GetNextStateFromAction_Attack(ScenarioState newState, EntityData entity, Action action) { GameBoard testBoard = BoardController.CurrentBoard; AttackCardData card = action.card as AttackCardData; TargetType attackTargetType = card.targetType; Tile attackOriginTile = BoardController.CurrentBoard.GetTileAtPosition(entity.Position); List <Tile> targetTiles = new List <Tile>(); switch (attackTargetType) { case TargetType.Single: targetTiles.Add(newState.FindFirstOccupiedTileInDirection(attackOriginTile, action.direction, action.distance)); break; case TargetType.AreaOfEffect: Tile impactTile = newState.FindFirstOccupiedTileInDirection(attackOriginTile, action.direction, action.distance); targetTiles.Add(impactTile); targetTiles.AddRange(impactTile.Neighbors); break; case TargetType.Line: targetTiles.AddRange(attackOriginTile.GetAllTilesInDirection(action.direction, action.card.range)); break; default: break; } ProjectedGameState newProjectedState = new ProjectedGameState(entity, newState, action); newProjectedState.AddAttackedPositions(targetTiles.Select(t => t.Position)); List <EntityData> affectedEntities = targetTiles .Select(t => newState.GetTileOccupant(t)) .Where(o => o != null) .ToList(); if (affectedEntities.Count == 0) { List <ModifierData> modifiersToResolve = action.card.modifiers .Where(m => m.modifierCategory == ModifierCategory.Blowback || m.modifierCategory == ModifierCategory.FollowUp) .ToList(); for (int i = 0; i < modifiersToResolve.Count; i++) { ModifierData modifier = modifiersToResolve[i]; ApplyModifierToAttack_BlowbackFollowUp(modifier, entity, newState, action.direction, modifier.modifierCategory); } return(newProjectedState); } for (int i = 0; i < affectedEntities.Count; i++) { EntityData affectedEntity = affectedEntities[i]; int cardDamage = card.damage + entity.GetAttackModifierValue(); affectedEntity.DealDamage(cardDamage, newState); List <ModifierData> attackModifiers = action.card.modifiers; if (attackModifiers != null && attackModifiers.Count > 0) { for (int j = 0; i < attackModifiers.Count; i++) { ApplyModifierToAttack(affectedEntity, attackModifiers[j], entity, newState, action.direction); } } } return(newProjectedState); }