Bombardment

Purpose
This article attempts to articulate an evolutionary path for improved bombardment in Freeciv.

Bombardment in Freeciv
Currently, Bombarding has these limits:
 * range: same distance for all units in the game
 * bombarder loses all moves
 * bombard strength same as standard attack strength
 * fortified status always lost when bombarding
 * every unit on bombarded tile is exposed to the bombardment

Ruleset control variables for Bombardment
Currently, the ruleset control only 2 variables over bombardment:
 * bombard_rate                    # of combat_rounds of bombardment
 * bombard_max_range      bombard range for all units in the game

Problems with the Status Quo
The Bombard action's forced behaviour of attacking every unit on a tile is the first and largest problem. A ruleset designer has two choices. The first choice is to limit bombardment to very few combat_rounds and only in special exceptional cases. This makes "bombarding" more of a poke-and-peck attack that is both extraordinarily weak, yet in some ways still potentially OP for its ability to damage a near infinite number of units. The second choice is to give units more combat_rounds so that bombardments are actually effective. This results in an absolutely OP mechanic that can do serious damage to huge stacks, risk-free. This results in bombardment being completely OP. Bombardment then overshadows and out-muscles all other combat mechanics.

A lesser problem is the non-optional requirement that bombarding forces the loss of all moves. This disallows a number of the exceptional cases where bombardments with low number of combat_rounds could be useful. For example, Fighter strafing, and other hit-and-run types of ranged tactics. There is no "run" after the hit. A unit with 6 moves can fight to the death over infinite combat_rounds and still have 5 moves left. Yet for some reason, when doing a brief non-engaging ranged attack of only a few combat rounds, it becomes paralysed and glued to its tile for the rest of the turn.

Presumably, bombarding is a different kind of action than a standard "to-the-death" combat. Forcing bombardment to have the same attack strength as standard combat can limit a ruleset designer's ability to specially tune many kinds of situational ranged attacks, and forbids the designer to tune these to achieve realistic or balanced results.

There are two other weaknesses in status quo bombardment. First, it must always have a range of 1. Second, units which historically and realistically did ranged attacks from secure fortified positions, are forced to lose their fortified status if they bombard. Now they are not only unfortified, but have lost all moves and are therefore completely vulnerable for up to two turns of game time. This is the penalty for firing a mortar from inside their trench !! This makes their tactical position so compromised as to make bombardment a useless mechanic for ground forces.

Possible new variables to evolve Bombardment:
Below is a list of 13 more variables proposed. These variables would go in the unit_type definitions in the units.ruleset file. Together, they would allow nearly complete control for rulesets to specify exact bombard mechanics. Using lots of these variables together would not be recommended. It would probably introduce too much complexity. However, ruleset designers could carefully trim and tune mechanics with thoughtful use of one or two of these variables, only for certain unit types. This would help the ruleset to improve realism, playability, and balance, while still keeping bombard behaviour easy to understand.

NOTE: As Freeciv-Web evolves, vars which have been already added/implemented will be put in red.

 Legend for this chart: 
 * variable_name
 * functional description of variable
 * examples

 Chart of possible new bombard variables: 
 * bombard_extra_range
 * the EXTRA distance that the unit can bombard
 * 0: adjacent; 1: range=2; 2:r=3; etc.
 * bombard_range_rate_mod
 * adjustment to bombard_rate with each tile distance
 * -1: one less combat_round @ r=2; two less @ r=3; etc.
 * bombard_atk_mod
 * adjustment to attack strength when bombarding
 * -50: A4 units bombard @ A2
 * 50: A4 units bombard @ A6
 *  bombard_retaliation_rate 
 * ability to symmetrically retaliate against a bombard attack with x rounds of "defensive bombardment"
 * bombard_atk_range_mod
 * adjustment to attack strength</tt> with each extra tile of distance
 * -25 = A4 units bombard @ A4 if r=1, A3 if r=2; A2 if r=3; etc.
 * bombard_move_cost
 * move fragments expended by a bombard action
 * 0: uses all moves
 * 1: uses 1 move
 * 2: uses 2 moves; etc
 * bombard_stay_fortified
 * bombarding units can stay fortified while bombarding?
 * 0: lose fortified state
 * 1: unit remains fortified while bombarding
 * bombard_fortifed_def_mod
 * defense bonus for fortified targets exposed to this type of bombardment
 * 0: none
 * 50: fortified units gain an extra 50% bonus when bombarded by this unit
 * 1000: fortified units have 10x bonus and are nearly immune to this type of bombard
 * example: fortified foot soldiers immune to archer attacks (covered trenches, etc.)
 * bombard_primary_targets
 * maximum number of primary bombard targets exposed to the attack
 * 0: all units in stack are bombard targets (old default behavior)
 * 1: only one unit in the stack is a primary bombard target
 * 3: up to 3 units in the stack will be primary bombard targets
 * bombard_primary_kills
 * max number of primary targets who can die from bombardment
 * 0: none (old default behavior)
 * 1: maximum of only one death can occur from bombardment
 * 2: maximum of two deaths can occur from bombardment
 * bombard_collateral_targets
 * the number of "collateral targets" or secondary bombard targets exposed to "scatter damage"
 * 0: only primary targets are bombarded
 * 3: up to 3 more units exposed to collateral damage
 * bombard_collateral_kills
 * max number of collateral targets who can die from bombardment
 * 0: none
 * 1: only one collateral target can die from "scatter damage"
 * 2: only two collateral targets can die from "scatter damage", etc.
 * bombard_collateral_rate_reduce
 * the reduction in combat_rounds</tt> that "collateral units" are exposed to
 * 0: collateral targets exposed to same combat_rounds</tt> as primary targets
 * 1: collateral targets exposed to (bombard_rate</tt>-1) combat_rounds</tt>
 * 2: collateral targets exposed to (bombard_rate</tt>-2) combat_rounds</tt>, etc.
 * bombard_collateral_atk_mod
 * adjustment to attack strength (percent chance to hit collateral targets)
 * -50 = if primary strength is A4, attack strength on collateral targets is A2
 * 50 = if primary strength is A6, attack strength on collateral targets is A9

Examples:

 * Fanatics doing skirmish assaults get 3 rounds of combat on up to 4 units on the target tile:
 * bombard_rate = 3
 * bombard_primary_targets = 4
 * bombard_collateral targets = 0
 * Archers can't do ranged attacks on fortified units. Against one unit in the stack, they get 3 combat_rounds</tt> of free damage, and against all others in the stack, 1 combat_round.
 * bombard_fortified_def_mod = 10000
 * bombard_rate = 3
 * bombard_primary_targets = 1
 * bombard_collateral_targets = 999
 * bombard_collateral_rate_reduce = - 2
 * in Mountain Hideouts, Alpine Troops can perform Sniper Attacks. A Sniper attack targets a single unit in the stack and can seriously wound or kill. Sniping units have a special ability to remain fortified while attacking. However, sniping is generally ineffective against fortified positions, and thus suffers a 75% penalty against fortified units:
 * bombard_stay_fortified = 1
 * bombard_rate = 30
 * bombard_primary_targets = 1
 * bombard_primary_kills = 1
 * bombard_fortified_def_mod = 75
 * Howitzers can barrage a tile up to 2 tiles distant. But tiles at distance=2 suffer a 50% penalty to accuracy. 30 combat_rounds</tt> are performed on a single unit, devastating or possibly killing one unit on the targeted tile. There will also be wide yet much weaker collateral damage on up to five other units:
 * bombard_extra_range = 1
 * bombard_atk_range_mod = -50
 * bombard_primary_targets = 1
 * bombard_primary_kills = 1
 * bombard_rate = 30
 * bombard_collateral_rate_reduce = 29
 * bombard_collateral_targets = 5
 * bombard_collateral_atk_mod = -50
 * Anti-Aircraft Artillery can target a distant Fighter stack but are much less accurate at long range. AAA bombardments can damage but not kill one unit in the stack. AAA can remain fortified while doing so.
 * bombard_extra_range = 1
 * bombard_rate = 20
 * bombard_range_rate_mod = -10
 * bombard_atk_range_mod = -50
 * bombard_primary_targets = 1
 * bombard_primary_kills = 0
 * bombard_stay_fortified = 1
 * Battleships can bombard and seriously weaken one unit at a time in a city, with a low chance of minor collateral damage to one other unit; and can make two of these bombard attacks per turn (or make one attack, lose 5 moves, and withdraw with their remaining moves):
 * bombard_primary_targets = 1
 * bombard_collateral_targets = 1
 * bombard_rate = 20
 * bombard_collateral_rate_reduce = 19
 * bombard_move_cost = 5