The ProblemClassic was hard to balance for several reasons.
One, there was a metric ton of stuff, mostly interrelated, and balancing something often meant making it OP/UP compared to other stuff that was also out of whack.
Two, players (including myself) were attached to (or repulsed by) certain units/mechanics/tactics and this tended to skew their ideas of how powerful or weak those things "should" be.
Three, there was no coherent concept in the game itself of keeping things in balance. I attempted something like it in the later years with the "Strength" measurement, more formal concepts of Cap-hp, Cap-dps, standardized attack bonuses, etc, but overall it was a set of bandaids that only moderately helped the problem.
The GoalAll that said, AIW isn't PvP. Our goals for "balance" aren't the same as a competitive game. The point isn't to constrain the power of one side or the other. The main point is to make sure there aren't things in the game that just never get used (aside from players who don't know better, or who have a personal affinity) because other things are always better. A secondary point is to make sure that your AI opponent isn't
massively easier or harder for the sole reason of it randomly rolling a particular unit type.
In other words: the point is to not short-circuit the fun.
The SolutionOne, we're starting with a smaller set of stuff than Classic, and in alpha/EA the set will be even smaller, so that we can work together to look at the balance as a whole and fix problems with the foundation before we build the ground floor, and fix the problems with the ground floor before we build the second floor, and so on. I'm sure there will still be lasting problems, but we can catch a lot of it.
Two, while we each still have our allegiances to particular things in Classic, it will be much easier for us to look at this as a new thing and filter our input accordingly. We'll all have to work at that.
Three, I'm working on a framework where the balance decisions are made at the scale of mechanics rather than individual ships. Other games have run into problems relying too woodenly on such frameworks, but I think it's worth a try if we don't try to make it do too much. More on this in the next section
Fourth, the modding support will let each of you try different balance decisions, and base your feedback on a more concrete basis. We're also quite happy to incorporate mods (or parts thereof) into the vanilla game if there's a consensus to do so.
Fifth, official release is slated for October. I expect to be done with the implementation phase of the design in June. Possibly earlier, if we don't hit as many speedbumps as I'm budgeting for. I won't be working as many hours at that point, but that test-and-refine phase will be critical in making this a real 1.0 instead of a beta-that-escaped (not that we've ever seen
that before).
The Crazy IdeaSo I mentioned a balance framework. Rather than just setting hp, dps, speed, etc values on everything and using various tools (including unit tests, balance spreadsheets, and wishful thinking) to keep those values reasonable across the game, let's start from the other end: what
goals do we want to achieve with those values?
So start with some global constants (defined in XML for easy modding) :
1.1) base_hp_scale . In other words, how long do we want HP numbers to be? As in, how many digits. This may seem silly, but one of the most popular changes I ever made to classic was dividing the hp numbers by 100. People don't like unnecessarily large numbers in a game like this. At the same time, hp is fixed-point integer, so we don't want it to be too coarse lest rounding have a significant balance impact.
1.2) seconds_per_fight . Basically, how long do we want fights to last? This is used most directly to set attack power; i.e. dps = hp / seconds_per_fight . This assumes all the same ships, all in range, equal numbers on both sides... so it never really happens exactly this way, but nonetheless the the length of battles will be directly proportional to this value.
1.3) seconds_per_shot . Base rate of fire.
1.3) attack_range_to_gravwell_radius_ratio . In other words: how much of a normal-size planet can a "short range" (the default range) cover without moving?
1.4) seconds_to_cross_gravwell . Basically, how long should it take a "normal speed" ship to cross a normal-size planet?
1.5) strength_per_cap . In other words: assuming an individual ship of strength 1, what's the standard cap for that ship type?
1.6) base_science_scale. How many science points should an "average" planet yield? Like with base_hp_scale, this is mainly to control the number of digits.
1.7) base_fuel_scale. How much fuel capacity should an "average" planet provide? Ditto about digit count. (we'd also have similar numbers for power, but I'm focusing on mobile military rather than purely-defensive military in this post)
1.
base_metal_scale. How much metal should an "average" planet produce per second? Ditto about digit count.
2) Next, define the mark levels and their relative strengths and costs, for example (I'm guessing at a lot of these costs) :
<mark name="MarkI" strength_multiplier="1" planets_worth_of_science="0.65" planets_worth_of_fuel="0.15" planet_seconds_of_metal="30" />
<mark name="MarkII" strength_multiplier="2" planets_worth_of_science="1.20" planets_worth_of_fuel="0.3" planet_seconds_of_metal="70" />
<mark name="MarkIII" strength_multiplier="3" planets_worth_of_science="1.65" planets_worth_of_fuel="0.3" planet_seconds_of_metal="120" />
<mark name="MarkIV" strength_multiplier="4" planets_worth_of_science="2.00" planets_worth_of_fuel="0.3" planet_seconds_of_metal="180" />
<mark name="MarkV" strength_multiplier="5" planets_worth_of_science="2.20" planets_worth_of_fuel="0.3" planet_seconds_of_metal="250" />
(Note: "planet_seconds_of_metal" is a weird way to put it, but for example "60" means that building the cap from scratch would fully consume one average planet's metal output for a full minute; or 4 such planets for 15 seconds, etc)
3) Next, define the items in a series of categories:
3.1) Granularity: spectrum from "swarmers" to "low-cap ships". Examples:
<granularity name="Swarmer" cap_multiplier="4" hp_and_dps_multiplier="1.2" />
<granularity name="MildSwarmer" cap_multiplier="2" hp_and_dps_multiplier="1.1" />
<granularity name="Normal" cap_multiplier="1" hp_and_dps_multiplier="1.0" />
<granularity name="MildLowCap" cap_multiplier="0.5" hp_and_dps_multiplier="0.9" />
<granularity name="LowCap" cap_multiplier="0.25" hp_and_dps_multiplier="0.8" />
(note: with the removal of the old armor mechanic, and with partially-destroyed squads being repairable back to full count, it's not a given that swarmers are worse than low-cap anymore; but we'll see: this framework will let us adjust for changes like that quickly)
3.2) Durability: spectrum from high-hp to high-dps. Examples:
<durability name="GlassCannon" hp_multiplier="0.25" dps_multiplier="2" />
<durability name="MildGlassCannon" hp_multiplier="0.5" dps_multiplier="1.5" />
<durability name="Normal" hp_multiplier="1" dps_multiplier="1" />
<durability name="MildTank" hp_multiplier="1.2" dps_multiplier="0.9" />
<durability name="Tank" hp_multiplier="1.4" dps_multiplier="0.8" />
3.3) Speed: spectrum from slow to fast. Examples:
<speed name="Blitzer" speed_multiplier="4" hp_and_dps_multiplier="0.5" />
<speed name="Fast" speed_multiplier="2" hp_and_dps_multiplier="0.75" />
<speed name="Normal" speed_multiplier="1" hp_and_dps_multiplier="1" />
<speed name="Slow" speed_multiplier="0.75" hp_and_dps_multiplier="1.25" />
(note: movement speed is probably the one stat that was most buffed for "quality of life" reasons; slow ships annoy the player. I'm not sure anything lower than "Normal" would get used for standard mobile-military ships; probably reserved for things like Fortresses and AI-only stuff)
3.4) Range: spectrum from short to long to infinite. Examples:
<range name="Sniper" range_multiplier="999" dps_multiplier="0.2" />
<range name="Long" range_multiplier="4" dps_multiplier="0.3" />
<range name="Medium" range_multiplier="2" dps_multiplier="0.6" />
<range name="Short" range_multiplier="1" dps_multiplier="1" />
3.5) Rate of fire: spectrum from geologic-time-scale bombs to frequent rocket salvos. Examples:
<rof name="ExtremelyLow" rof_multiplier="0.125" dps_multiplier="1.5" />
<rof name="VeryLow" rof_multiplier="0.25" dps_multiplier="1.25" />
<rof name="Low" rof_multiplier="0.5" dps_multiplier="1.15" />
<rof name="Normal" rof_multiplier="1" dps_multiplier="1" />
<rof name="High" rof_multiplier="2" dps_multiplier="0.85" />
<rof name="Misery" rof_multiplier="4" dps_multiplier="0.75" />
(note: with the removal of the old armor mechanic, high-rof is presumably now just better all around, hence the dps tradeoff. If I'm wrong, it's easy to change)
3.6) Damage mitigation type: none (i.e. structure/hp), armor, evasion, shields
<defense name="Armor" durability_multiplier_vs_noncounter="5" durability_multiplier_vs_counter="0.3" dps_multiplier="0.8" />
<defense name="Evasion" durability_multiplier_vs_noncounter="4" durability_multiplier_vs_counter="0.35" dps_multiplier="0.9" />
<defense name="Shields" durability_multiplier_vs_noncounter="3" durability_multiplier_vs_counter="0.45" dps_multiplier="0.75" />
The multipliers are "goals", not actual stats in the game; those will probably be achieved by a combination of three things:
- incoming-damage % reduction (against non-countering shots) on the ship with this defense
- hp % reduction on the ship with this defense
- dps % reduction on the ships countering this defense
(note: there are other distinctions between the three defenses, like evasion also reducing engine/reclamation/etc damage and having a further innate resistance to AOE, and shields protecting a wide area; not sure yet how/whether those will be represented in the xml)
3.7) Fuel cost: spectrum from fuel-hog to fuel-efficient. Examples:
<fuel_cost name="High" fuel_multiplier="1.5" hp_and_dps_multiplier="1.15" />
<fuel_cost name="Normal" fuel_multiplier="1" hp_and_dps_multiplier="1.0" />
<fuel_cost name="Low" fuel_multiplier="0.5" hp_and_dps_multiplier="0.85" />
3.
Metal cost: spectrum from expensive to cheap. Examples:
<metal_cost name="High" metal_multiplier="1.5" hp_and_dps_multiplier="1.1" />
<metal_cost name="Normal" metal_multiplier="1" hp_and_dps_multiplier="1.0" />
<metal_cost name="Low" metal_multiplier="0.5" hp_and_dps_multiplier="0.9" />
Next, we need to make a series of decisions for each ship type:
4.1) strength_multiplier . Normally this will be 1, but for example we might want a cap of mkI starships to only be half as strong as (and cost half the science of) a standard cap, but have mkIIs be normal, and mkIIIs be twice as strong as (and cost twice the science of) a normal mkIII cap, and have mkIVs be 4x as strong and expensive as a normal mkIV.
4.2) Pick one of each of the above categories, with the exception that it can pick zero or more defenses and zero or more counters-defenses, though only very rarely would a ship type have more than one defense or more than one counter (both sets of multipliers would apply, leaving the base hp and/or dps very low for that strength).
4.3) shots_per_salvo . Often this will be 1, but some ships achieve their rate of fire through multiple shots at once. This field won't change the rate of fire; the number of seconds per salvo will be adjusted to maintain that.
4.4) ships_per_squad . How big the units are, in terms of ships. This is largely an interface thing, but if you have a standard cap size of 200, and a ship type with that standard size and a ships_per_squad of 20 then a full cap will be 10 controllable units (each containing 20 of that ship).
4.5) What special abilities the ship has and what the costs should be for that in terms of hp and/or dps. Anything that shows up a lot should probably be moved into one of the tradeoff categories above.
To take an example: the Fighter
strength_multiplier = 1
shots_per_salvo = 1
ships_per_squad = 10
granularity = normal
durability = MildTank
speed = normal
range = short
rate of fire = normal
damage mitigation = evasion
countered damage mitigation types = armor
fuel cost = normal
metal cost = low
special abilities = none
And I would work out the final multipliers from that but I've gotta run
There would still be the ability to override pretty much any stat at a per-ship-type basis, to let modders do what they want, but the idea would be for vanilla to pretty much stick with the above except for unique units.
Thoughts?