{ "_readme": [ "Engine data for Total Annihilation. Everything the simulation knows lives here \u2014 adding a unit,", "building, weapon, terrain type, army or map theme is a JSON-only change.", "After editing, run `node tools/verifyTotalAnnihilation.js` \u2014 it cross-checks every id reference,", "frame index and closed key set in this file and will tell you exactly what broke.", "", "Sheet resolution: a unit/building's `sheetSlot` names a field on its ARMY (unitSheet or", "structureSheet), so one unit definition renders correctly for every army. That is what makes a", "third army a two-line change: add an `armies` entry pointing at two new sheets in", "data/totalannihilation-artwork.json.", "", "Units are drawn once and ROTATED at runtime \u2014 there are no per-facing frames. `turretFrame` is", "an optional second sprite that aims independently of the hull.", "", "Domains: a unit's `domain` is \"ground\" (the default) or \"air\". Air units ignore the nav grid,", "never collide with ground units, and while AIRBORNE can only be hit by weapons listing \"air\"", "in `targets` \u2014 so a roster with air units MUST keep some ground weapon anti-air capable or", "there is no answer to them. That protection comes from flying, not from having wings: a landed", "aircraft is an ordinary ground target that anything can shoot, and it cannot fire back.", "`domain` and the unit's `moveClass` have to agree: an air unit takes a move class flagged", "`\"air\": true`. Terrain passability comes from the move class COST TABLE, not from the terrain's", "own `blocksMove` \u2014 that is how `hover` crosses water without a per-terrain exception.", "", "Armor classes are the whole balance surface: every weapon lists a multiplier for EVERY class,", "so a roster change is a table edit rather than a code change. Two of them exist purely so a", "counter can be expressed at all \u2014 `air` (aircraft, separate from light/medium so a weapon can", "be lethal to planes without also being lethal to jeeps and tanks) and `fortification` (Laser", "Tower and Missile Launcher, separate from `structure` so a weapon can specialise in cracking", "defences without flattening generators). Adding a class means adding a key to all 12 weapons;", "compileRules refuses to start if one is missing, which is the point." ], "version": 1, "constants": { "tickHz": 20, "tileSize": 64, "unitCapPerArmy": 100, "projectileCap": 400, "startEnergy": 1000, "startMass": 1000, "baseEnergyCap": 500, "baseMassCap": 500, "pathBudgetPerTick": 8, "retargetPeriodTicks": 10, "engageHoldFraction": 0.45, "siegeHoldFraction": 0.95, "separationStiffness": 0.55, "shoveAfterSec": 0.6, "stuckGiveUpSec": 3.0, "stuckRepathSec": 1.0, "arriveSlackPx": 12, "friendlyFire": false, "buildPowerNominal": 100, "eliminateWhenUnrecoverable": true, "victoryDefault": "commander" }, "victoryModes": [ { "id": "commander", "label": "COMMANDER KILL", "desc": "Destroy the enemy Commander and the war is over." }, { "id": "annihilation", "label": "ANNIHILATION", "desc": "Fight on after a Commander falls — an army dies when it can no longer build." } ], "sizeClasses": { "small": { "radius": 16, "footprint": 1, "mass": 1 }, "medium": { "radius": 26, "footprint": 1, "mass": 4 }, "large": { "radius": 44, "footprint": 2, "mass": 16 } }, "armorClasses": [ "infantry", "light", "medium", "heavy", "structure", "fortification", "air" ], "moveClasses": { "foot": { "cost": { "ground": 1.0, "rough": 1.3, "road": 0.85, "metal": 1.0, "cliff": null, "water": null } }, "tread": { "cost": { "ground": 1.0, "rough": 1.8, "road": 0.7, "metal": 1.0, "cliff": null, "water": null } }, "wheel": { "cost": { "ground": 1.0, "rough": 2.4, "road": 0.6, "metal": 1.0, "cliff": null, "water": null } }, "hover": { "cost": { "ground": 1.0, "rough": 1.1, "road": 0.9, "metal": 1.0, "cliff": null, "water": 1.0 } }, "air": { "air": true, "cost": { "ground": 1.0, "rough": 1.0, "road": 1.0, "metal": 1.0, "cliff": 1.0, "water": 1.0 } } }, "armies": [ { "id": "arm", "name": "ARM", "color": "#4a90e2", "unitSheet": "arm-units", "structureSheet": "arm-structures" }, { "id": "core", "name": "CORE", "color": "#e05a2f", "unitSheet": "core-units", "structureSheet": "core-structures" } ], "commanders": [ { "id": "vance", "armyId": "arm", "opponentId": "ethel", "name": "Commander Ethel", "tagline": "Holds the line, and makes you pay for every metre of it.", "aiProfile": { "aggression": 0.45, "expansion": 0.65 } }, { "id": "klaxon", "armyId": "core", "opponentId": "klaxon", "name": "Unit KLAXON", "tagline": "Efficiency is a weapon. You are an inefficiency.", "aiProfile": { "aggression": 0.7, "expansion": 0.45 } }, { "id": "cybro", "armyId": "core", "opponentId": "cybro", "name": "Cy-Bro", "tagline": "Builds faster than you can knock it down.", "aiProfile": { "aggression": 0.35, "expansion": 0.85 } }, { "id": "nadia", "armyId": "arm", "opponentId": "nadia", "name": "Commander Nadia", "tagline": "Hits the flank while you watch the front.", "aiProfile": { "aggression": 0.8, "expansion": 0.4 } } ], "terrain": [ { "id": "ground", "ch": ".", "frame": 0, "buildable": true, "blocksMove": false, "elevation": 0 }, { "id": "rough", "ch": "r", "frame": 3, "buildable": true, "blocksMove": false, "elevation": 0 }, { "id": "road", "ch": "=", "frame": 8, "buildable": true, "blocksMove": false, "elevation": 0 }, { "id": "metal", "ch": "M", "frame": 7, "buildable": true, "blocksMove": false, "elevation": 0, "massMultiplier": 2.0 }, { "id": "cliff", "ch": "^", "frame": 4, "buildable": false, "blocksMove": true, "blocksFire": true, "elevation": 1 }, { "id": "water", "ch": "~", "frame": 5, "buildable": false, "blocksMove": true, "elevation": -1 } ], "weapons": [ { "id": "rifle", "name": "Assault Rifle", "kind": "hitscan", "damage": 9, "reload": 0.5, "burst": 3, "burstDelay": 0.06, "range": 200, "spread": 0.05, "targets": [ "ground" ], "armorMul": { "infantry": 1.0, "light": 0.5, "medium": 0.25, "heavy": 0.15, "structure": 0.7, "fortification": 0.55, "air": 0.3 }, "fx": { "style": "tracer", "color": "#ffe6a0", "width": 1.5, "lifeMs": 70 }, "sound": "sfx-ta-machinegun" }, { "id": "pintlegun", "name": "Pintle Gun", "kind": "hitscan", "damage": 9, "reload": 0.5, "burst": 3, "burstDelay": 0.06, "range": 200, "spread": 0.05, "targets": [ "ground" ], "armorMul": { "infantry": 2.2, "light": 0.7, "medium": 0.3, "heavy": 0.15, "structure": 0.5, "fortification": 0.4, "air": 0.35 }, "fx": { "style": "tracer", "color": "#ffe6a0", "width": 1.5, "lifeMs": 70 }, "sound": "sfx-ta-50cal" }, { "id": "sniperrifle", "name": "Marksman Rifle", "kind": "hitscan", "damage": 70, "reload": 2.2, "burst": 1, "range": 580, "spread": 0.0, "targets": [ "ground" ], "armorMul": { "infantry": 3.2, "light": 0.35, "medium": 0.12, "heavy": 0.08, "structure": 0.08, "fortification": 0.08, "air": 0.15 }, "fx": { "style": "beam", "color": "#d8f0ff", "width": 2, "lifeMs": 160 }, "sound": "sfx-laser-zap" }, { "id": "tankgun", "name": "120mm Cannon", "kind": "ballistic", "damage": 145, "reload": 2.0, "burst": 1, "range": 350, "speed": 700, "spread": 0.015, "leadTarget": true, "aoe": 40, "aoeFalloff": 0.15, "targets": [ "ground" ], "armorMul": { "infantry": 1.3, "light": 1.15, "medium": 1.0, "heavy": 0.8, "structure": 1.2, "fortification": 1.1, "air": 1.0 }, "fx": { "style": "shell", "color": "#ffd27a", "width": 3, "muzzle": 18 }, "sound": "sfx-battle-tank" }, { "id": "rocketpod", "name": "Rocket Pod", "kind": "guided", "damage": 48, "reload": 4.0, "burst": 2, "burstDelay": 0.25, "range": 440, "minRange": 110, "speed": 340, "turnRate": 2.2, "aoe": 48, "aoeFalloff": 0.15, "targets": [ "ground", "air" ], "armorMul": { "infantry": 0.3, "light": 0.6, "medium": 1.0, "heavy": 1.4, "structure": 1.5, "fortification": 1.6, "air": 2.6 }, "fx": { "style": "rocket", "color": "#ff8844", "width": 2, "trail": true }, "sound": "sfx-ta-rocket-1", "impactSound": "sfx-ta-rocket-2" }, { "id": "shoulderrocket", "name": "Shoulder Rocket", "kind": "guided", "damage": 40, "reload": 2.2, "burst": 1, "range": 380, "minRange": 60, "speed": 260, "turnRate": 2.0, "aoe": 24, "aoeFalloff": 0.15, "targets": [ "ground", "air" ], "armorMul": { "infantry": 0.3, "light": 0.9, "medium": 1.3, "heavy": 1.2, "structure": 1.2, "fortification": 1.9, "air": 2.8 }, "fx": { "style": "rocket", "color": "#ff9a5c", "width": 1.5, "trail": true }, "sound": "sfx-ta-rocket-1", "impactSound": "sfx-ta-rocket-2" }, { "id": "commanderlaser", "name": "Commander Laser", "kind": "hitscan", "damage": 38, "reload": 1.1, "burst": 1, "range": 260, "spread": 0.01, "targets": [ "ground" ], "armorMul": { "infantry": 1.3, "light": 1.0, "medium": 0.8, "heavy": 0.6, "structure": 0.5, "fortification": 0.45, "air": 0.8 }, "fx": { "style": "beam", "color": "#9ff0c8", "width": 3, "lifeMs": 120 }, "sound": "sfx-laser-zap" }, { "id": "dgun", "name": "D-Gun", "kind": "beam", "damage": 2000, "reload": 1.5, "burst": 1, "range": 220, "energyPerShot": 500, "targets": [ "ground" ], "manual": true, "armorMul": { "infantry": 1, "light": 1, "medium": 1, "heavy": 1, "structure": 1, "fortification": 1, "air": 1 }, "fx": { "style": "dgun", "color": "#8ad4ff", "width": 9, "lifeMs": 260 }, "sound": "sfx-scifi-launch" }, { "id": "towerlaser", "name": "Heavy Laser", "kind": "hitscan", "damage": 52, "reload": 0.4, "burst": 1, "range": 340, "spread": 0.01, "targets": [ "ground" ], "armorMul": { "infantry": 1.4, "light": 1.2, "medium": 0.9, "heavy": 0.55, "structure": 0.4, "fortification": 0.35, "air": 1.0 }, "fx": { "style": "beam", "color": "#a8e8ff", "width": 4, "lifeMs": 140 }, "sound": "sfx-laser-zap" }, { "id": "towermissile", "name": "Guided Missile", "kind": "guided", "damage": 135, "reload": 1.5, "burst": 1, "range": 620, "minRange": 180, "speed": 320, "turnRate": 2.0, "aoe": 56, "aoeFalloff": 0.15, "targets": [ "ground", "air" ], "armorMul": { "infantry": 0.35, "light": 0.7, "medium": 1.1, "heavy": 1.5, "structure": 1.3, "fortification": 1.2, "air": 2.8 }, "fx": { "style": "rocket", "color": "#ffb15c", "width": 2.5, "trail": true }, "sound": ["sfx-ta-rocket-1", "sfx-ta-rocket-2"] }, { "id": "aacannon", "name": "Air-to-Air Cannon", "kind": "hitscan", "damage": 44, "reload": 1.6, "burst": 3, "burstDelay": 0.12, "range": 300, "spread": 0.02, "targets": ["air"], "armorMul": { "infantry": 1.0, "light": 1.0, "medium": 0.85, "heavy": 0.6, "structure": 0.2, "fortification": 0.2, "air": 1.0 }, "fx": { "style": "tracer", "color": "#ffe89a", "width": 2, "muzzle": 16, "lifeMs": 70 }, "sound": "sfx-ta-50cal" }, { "id": "bombrack", "name": "Bomb Rack", "kind": "ballistic", "damage": 190, "reload": 6.0, "burst": 2, "burstDelay": 0.35, "range": 160, "speed": 240, "spread": 0.05, "aoe": 96, "aoeFalloff": 0.3, "targets": ["ground"], "armorMul": { "infantry": 1.1, "light": 1.0, "medium": 1.0, "heavy": 0.85, "structure": 1.6, "fortification": 1.5, "air": 1.0 }, "fx": { "style": "shell", "color": "#ffb15c", "width": 3, "muzzle": 8 }, "sound": "sfx-scifi-launch", "impactSound": "sfx-ta-nuclear" } ], "units": [ { "id": "commander", "name": "Commander", "role": "builder", "isCommander": true, "size": "medium", "radius": 20, "hp": 7000, "selfHeal": { "fractionPerMinute": 0.33, "pauseAfterDamageSec": 30 }, "speed": 62, "turnRate": 3.5, "moveClass": "foot", "armorClass": "heavy", "sight": 420, "cost": { "energy": 0, "mass": 0 }, "buildTime": 0, "buildPower": 100, "buildRange": 200, "builds": [ "energygen", "massgen", "barracks", "vehicleplant", "lasertower", "missilelauncher", "airfield", "radar" ], "produce": { "energy": 25, "mass": 3.0 }, "storage": { "energy": 1000, "mass": 1000 }, "weapons": [ "commanderlaser", "dgun" ], "deathExplosion": { "radius": 280, "damage": 1200 }, "sheetSlot": "unitSheet", "frame": 0, "turretFrame": 1, "procShape": "commander", "icon": 0, "spritePx": 56 }, { "id": "infantry", "name": "Infantry", "role": "combat", "size": "small", "radius": 16, "hp": 260, "speed": 55, "turnRate": 6.0, "moveClass": "foot", "armorClass": "infantry", "sight": 260, "cost": { "energy": 120, "mass": 24 }, "buildTime": 2, "builtBy": [ "barracks" ], "weapons": [ "rifle" ], "sheetSlot": "unitSheet", "frame": 2, "procShape": "infantry", "icon": 1, "spritePx": 30, "moveSound": "sfx-march" }, { "id": "sniper", "name": "Sniper", "role": "combat", "size": "small", "radius": 16, "hp": 130, "speed": 46, "turnRate": 5.0, "moveClass": "foot", "armorClass": "infantry", "sight": 500, "cost": { "energy": 260, "mass": 55 }, "buildTime": 6, "builtBy": [ "barracks" ], "weapons": [ "sniperrifle" ], "sheetSlot": "unitSheet", "frame": 3, "procShape": "sniper", "icon": 2, "spritePx": 30, "moveSound": "sfx-march" }, { "id": "rockettrooper", "name": "Rocket Trooper", "role": "combat", "size": "small", "radius": 16, "hp": 150, "speed": 50, "turnRate": 5.5, "moveClass": "foot", "armorClass": "infantry", "sight": 280, "cost": { "energy": 220, "mass": 45 }, "buildTime": 5, "builtBy": [ "barracks" ], "weapons": [ "shoulderrocket" ], "sheetSlot": "unitSheet", "frame": 10, "procShape": "rocketTrooper", "icon": 6, "spritePx": 30, "moveSound": "sfx-march" }, { "id": "jeep", "name": "Jeep", "role": "scout", "size": "small", "radius": 20, "hp": 480, "speed": 175, "turnRate": 3.4, "moveClass": "wheel", "armorClass": "light", "sight": 520, "cost": { "energy": 320, "mass": 70 }, "buildTime": 8, "builtBy": [ "vehicleplant" ], "weapons": [ "pintlegun" ], "sheetSlot": "unitSheet", "frame": 4, "turretFrame": 5, "procShape": "jeep", "icon": 3, "spritePx": 40, "moveSound": "sfx-engine-medium" }, { "id": "tank", "name": "Tank", "role": "combat", "size": "medium", "radius": 26, "hp": 1900, "speed": 90, "turnRate": 2.2, "moveClass": "tread", "armorClass": "medium", "sight": 300, "cost": { "energy": 700, "mass": 180 }, "buildTime": 20, "builtBy": [ "vehicleplant" ], "weapons": [ "tankgun" ], "sheetSlot": "unitSheet", "frame": 6, "turretFrame": 7, "procShape": "tank", "icon": 4, "spritePx": 54, "moveSound": "sfx-engine-heavy" }, { "id": "rockettank", "name": "Rocket Tank", "role": "artillery", "size": "medium", "radius": 28, "hp": 1050, "speed": 75, "turnRate": 1.8, "moveClass": "tread", "armorClass": "medium", "sight": 320, "cost": { "energy": 1100, "mass": 300 }, "buildTime": 28, "builtBy": [ "vehicleplant" ], "weapons": [ "rocketpod" ], "sheetSlot": "unitSheet", "frame": 8, "turretFrame": 9, "procShape": "rockettank", "icon": 5, "spritePx": 56, "moveSound": "sfx-engine-heavy" }, { "id": "constructor", "name": "Construction Vehicle", "role": "builder", "size": "medium", "radius": 24, "hp": 700, "speed": 85, "turnRate": 2.4, "moveClass": "tread", "armorClass": "light", "sight": 340, "cost": { "energy": 500, "mass": 140 }, "buildTime": 14, "builtBy": [ "vehicleplant" ], "buildPower": 90, "buildRange": 180, "builds": [ "energygen", "massgen", "barracks", "vehicleplant", "lasertower", "missilelauncher", "advancedvehicleplant", "airfield", "radar", "advancedradar", "radarjammer" ], "sheetSlot": "unitSheet", "frame": 11, "procShape": "constructor", "icon": 7, "spritePx": 50, "moveSound": "sfx-engine-heavy" }, { "id": "fighter", "name": "Fighter", "role": "combat", "domain": "air", "size": "small", "radius": 22, "hp": 820, "speed": 290, "turnRate": 3.0, "moveClass": "air", "armorClass": "air", "sight": 620, "cost": { "energy": 900, "mass": 160 }, "buildTime": 16, "builtBy": [ "airfield" ], "weapons": [ "aacannon", "pintlegun" ], "flight": { "height": 26, "takeoffSec": 0.45, "landSec": 0.7, "overshoot": 420, "keepout": 700 }, "sheetSlot": "unitSheet", "frame": 12, "procShape": "fighter", "icon": 8, "spritePx": 46, "moveSound": "sfx-engine-fast" }, { "id": "bomber", "name": "Bomber", "role": "artillery", "domain": "air", "size": "medium", "radius": 30, "hp": 1350, "speed": 215, "turnRate": 1.7, "moveClass": "air", "armorClass": "air", "sight": 560, "cost": { "energy": 1700, "mass": 440 }, "buildTime": 30, "builtBy": [ "airfield" ], "weapons": [ "bombrack" ], "flight": { "height": 30, "takeoffSec": 0.7, "landSec": 1.0, "overshoot": 540, "keepout": 700 }, "sheetSlot": "unitSheet", "frame": 13, "procShape": "bomber", "icon": 9, "spritePx": 60, "moveSound": "sfx-engine-heavy" }, { "id": "hoverconstructor", "name": "Hover Constructor", "role": "builder", "size": "medium", "radius": 24, "hp": 760, "speed": 115, "turnRate": 2.8, "moveClass": "hover", "armorClass": "light", "sight": 360, "cost": { "energy": 640, "mass": 175 }, "buildTime": 16, "builtBy": [ "airfield" ], "buildPower": 100, "buildRange": 190, "builds": [ "energygen", "massgen", "barracks", "vehicleplant", "lasertower", "missilelauncher", "advancedvehicleplant", "airfield", "radar", "advancedradar", "radarjammer" ], "flight": { "height": 9, "takeoffSec": 0.35, "landSec": 0.5 }, "sheetSlot": "unitSheet", "frame": 14, "procShape": "hoverConstructor", "icon": 17, "spritePx": 52, "moveSound": "sfx-engine-medium" } ], "buildings": [ { "id": "energygen", "name": "Energy Generator", "footprint": { "w": 2, "h": 2 }, "hp": 2440, "armorClass": "structure", "sight": 160, "cost": { "energy": 200, "mass": 60 }, "buildTime": 12, "produce": { "energy": 20 }, "storage": { "energy": 500 }, "deathExplosion": { "radius": 110, "damage": 160 }, "sheetSlot": "structureSheet", "frame": 0, "buildFrame": 1, "procShape": "energyGen", "icon": 10, "idleAnimation": true }, { "id": "massgen", "name": "Mass Generator", "footprint": { "w": 2, "h": 2 }, "hp": 2260, "armorClass": "structure", "sight": 160, "cost": { "energy": 600, "mass": 50 }, "buildTime": 16, "produce": { "mass": 2.0 }, "upkeep": { "energy": 15 }, "storage": { "mass": 250 }, "terrainMultiplier": "massMultiplier", "sheetSlot": "structureSheet", "frame": 2, "buildFrame": 3, "procShape": "massGen", "icon": 11, "idleAnimation": true }, { "id": "barracks", "name": "Barracks", "footprint": { "w": 3, "h": 3 }, "hp": 3520, "armorClass": "structure", "sight": 220, "cost": { "energy": 600, "mass": 180 }, "buildTime": 26, "buildPower": 100, "builds": [ "infantry", "sniper", "rockettrooper" ], "spawnOffset": { "x": 0, "y": 2.2 }, "sheetSlot": "structureSheet", "frame": 4, "buildFrame": 5, "procShape": "barracks", "icon": 12 }, { "id": "vehicleplant", "name": "Vehicle Plant", "footprint": { "w": 3, "h": 3 }, "hp": 4960, "armorClass": "structure", "sight": 220, "cost": { "energy": 1400, "mass": 520 }, "buildTime": 40, "buildPower": 100, "builds": [ "jeep", "tank", "rockettank", "constructor" ], "spawnOffset": { "x": 0, "y": 2.2 }, "sheetSlot": "structureSheet", "frame": 6, "buildFrame": 7, "procShape": "vehiclePlant", "icon": 13 }, { "id": "lasertower", "name": "Laser Tower", "footprint": { "w": 1, "h": 1 }, "hp": 1700, "armorClass": "fortification", "sight": 300, "cost": { "energy": 420, "mass": 120 }, "buildTime": 16, "upkeep": { "energy": 5 }, "weapons": [ "towerlaser" ], "deathExplosion": { "radius": 90, "damage": 120 }, "sheetSlot": "structureSheet", "frame": 8, "buildFrame": 9, "procShape": "laserTower", "icon": 14 }, { "id": "missilelauncher", "name": "Missile Launcher", "footprint": { "w": 2, "h": 2 }, "hp": 3100, "armorClass": "fortification", "sight": 420, "cost": { "energy": 1100, "mass": 380 }, "buildTime": 34, "upkeep": { "energy": 20 }, "weapons": [ "towermissile" ], "deathExplosion": { "radius": 150, "damage": 280 }, "sheetSlot": "structureSheet", "frame": 10, "buildFrame": 11, "procShape": "missileLauncher", "icon": 15 }, { "id": "advancedvehicleplant", "name": "Advanced Vehicle Plant", "footprint": { "w": 4, "h": 4 }, "hp": 6600, "armorClass": "structure", "sight": 240, "cost": { "energy": 2400, "mass": 900 }, "buildTime": 55, "buildPower": 140, "builds": [ "jeep", "tank", "rockettank" ], "spawnOffset": { "x": 0, "y": 2.6 }, "sheetSlot": "structureSheet", "frame": 12, "buildFrame": 13, "procShape": "advancedVehiclePlant", "icon": 16 }, { "id": "airfield", "name": "Airfield", "footprint": { "w": 3, "h": 3 }, "hp": 4200, "armorClass": "structure", "sight": 260, "cost": { "energy": 1800, "mass": 600 }, "buildTime": 46, "buildPower": 110, "builds": [ "fighter", "bomber", "hoverconstructor" ], "spawnOffset": { "x": 0, "y": 2.2 }, "sheetSlot": "structureSheet", "frame": 14, "buildFrame": 15, "procShape": "airfield", "icon": 18 }, { "id": "radar", "name": "Radar Tower", "footprint": { "w": 2, "h": 2 }, "hp": 1200, "armorClass": "structure", "sight": 260, "radarRange": 1240, "cost": { "energy": 600, "mass": 120 }, "buildTime": 20, "upkeep": { "energy": 10 }, "sheetSlot": "structureSheet", "frame": 16, "buildFrame": 17, "procShape": "radar", "icon": 19 }, { "id": "advancedradar", "name": "Advanced Radar", "footprint": { "w": 2, "h": 2 }, "hp": 1800, "armorClass": "structure", "sight": 1240, "radarRange": 20000, "cost": { "energy": 2200, "mass": 500 }, "buildTime": 45, "upkeep": { "energy": 40 }, "sheetSlot": "structureSheet", "frame": 18, "buildFrame": 19, "procShape": "advancedRadar", "icon": 30 }, { "id": "radarjammer", "name": "Radar Jammer", "footprint": { "w": 2, "h": 2 }, "hp": 1400, "armorClass": "structure", "sight": 200, "jamRange": 1240, "cost": { "energy": 1400, "mass": 300 }, "buildTime": 35, "upkeep": { "energy": 30 }, "sheetSlot": "structureSheet", "frame": 20, "buildFrame": 21, "procShape": "radarJammer", "icon": 31 } ], "commandIcons": { "move": 20, "attack": 21, "attackMove": 22, "stop": 23, "hold": 24, "patrol": 25, "guard": 26, "assist": 27, "repair": 28, "rally": 29 }, "aiSkills": [ { "skill": 1, "decisionPeriodMs": 1500, "apmCap": 1, "squadSize": 3, "expansion": 0.6, "microLevel": 0, "reactionMs": 4000 }, { "skill": 2, "decisionPeriodMs": 1100, "apmCap": 2, "squadSize": 4, "expansion": 1.0, "microLevel": 1, "reactionMs": 3000 }, { "skill": 3, "decisionPeriodMs": 800, "apmCap": 4, "squadSize": 6, "expansion": 1.6, "microLevel": 2, "reactionMs": 2000 }, { "skill": 4, "decisionPeriodMs": 500, "apmCap": 8, "squadSize": 8, "expansion": 2.2, "microLevel": 3, "reactionMs": 1000 }, { "skill": 5, "decisionPeriodMs": 300, "apmCap": 15, "squadSize": 10, "expansion": 3.0, "microLevel": 4, "reactionMs": 300 } ], "skirmish": { "sizes": { "small": 64, "medium": 96, "large": 128 }, "symmetries": [ "mirror-x", "mirror-y", "rotational" ], "themes": [ "grasslands", "snowfields", "tropics" ], "defaults": { "size": "medium", "symmetry": "mirror-x", "theme": "grasslands", "aiSkill": 3, "playerArmy": "arm" }, "startUnits": [ "commander" ], "gen": { "waterFraction": 0.1, "roughFraction": 0.18, "cliffFraction": 0.1, "metalSpotsPerStart": 4, "metalSpotRadiusTiles": 14, "minStartSeparationTiles": 40, "smoothPasses": 3, "startClearRadiusTiles": 8, "noiseScale": 0.09 } } }