{ "_readme": [ "Drop-in painted art for Total Annihilation (spec: src/games/totalannihilation/sprites.md).", "Paint a sheet, drop the PNG under assets/images/totalannihilation/, set its `path` below and", "reload — no code changes needed. Any sheet left path:null is rendered procedurally.", "", "`kind` selects which procedural painter stands in for an unpainted sheet, and it is the reason", "adding a sheet here is a JSON-only change: painters are keyed by kind, never by sheet name.", " unit — frameWidth == frameHeight, art drawn FACING RIGHT (+x) and CENTRED in the cell,", " in neutral grey so the runtime army tint multiplies correctly. The engine rotates", " the sprite, so keep the silhouette inside a circle of diameter frameWidth*0.7 or", " the corners will clip as it turns.", " structure — frameWidth == frameHeight, buildings are NOT rotated and NOT drawn facing right.", " Two frames per building: the finished one and a translucent wireframe used while", " it is still being nanolathed.", " terrain — one sheet per theme. Frame order is fixed (see `terrainFrames` below) so any new", " theme sheet drops straight in.", " icon — build-menu glyphs, full colour, never tinted.", "", "`cols` only sizes the procedural stand-in canvas; a painted sheet is measured from the PNG.", "Adding a THIRD ARMY = add two sheets here (kind unit + kind structure) and one `armies` entry", "in data/totalannihilation-rules.json. Adding a THEME = one sheet here, one `themes` entry, and", "the theme id in rules.skirmish.themes." ], "terrainFrames": { "_comment": "Fixed frame order every kind:terrain sheet must follow.", "ground": 0, "groundAlt1": 1, "groundAlt2": 2, "rough": 3, "cliff": 4, "water": 5, "waterDeep": 6, "metal": 7, "road": 8 }, "sheets": { "arm-units": { "key": "ta-arm-units", "path": "assets/images/ta/arm-units.png", "kind": "unit", "frameWidth": 128, "frameHeight": 128, "cols": 8, "rows": 8 }, "arm-structures": { "key": "ta-arm-structures", "path": "assets/images/ta/arm-structures.png", "kind": "structure", "frameWidth": 192, "frameHeight": 192, "cols": 6, "rows": 4 }, "core-units": { "key": "ta-core-units", "path": "assets/images/ta/core-units.png", "kind": "unit", "frameWidth": 128, "frameHeight": 128, "cols": 8, "rows": 8 }, "core-structures": { "key": "ta-core-structures", "path": "assets/images/ta/core-structures.png", "kind": "structure", "frameWidth": 192, "frameHeight": 192, "cols": 6, "rows": 4 }, "terrain-grasslands": { "key": "ta-terrain-grasslands", "path": "assets/images/ta/terrain-grasslands.png", "kind": "terrain", "frameWidth": 128, "frameHeight": 128, "cols": 9, "rows": 1 }, "terrain-snowfields": { "key": "ta-terrain-snowfields", "path": "assets/images/ta/terrain-snowfields.png", "kind": "terrain", "frameWidth": 128, "frameHeight": 128, "cols": 9, "rows": 1 }, "terrain-tropics": { "key": "ta-terrain-tropics", "path": "assets/images/ta/terrain-tropics.png", "kind": "terrain", "frameWidth": 128, "frameHeight": 128, "cols": 9, "rows": 1 }, "icons": { "key": "ta-icons", "path": null, "kind": "icon", "frameWidth": 64, "frameHeight": 64, "cols": 10, "rows": 4 } }, "themes": { "grasslands": { "name": "Grasslands", "sheet": "terrain-grasslands", "palette": { "ground": "#5f7f3d", "groundAlt1": "#6b8c45", "groundAlt2": "#55743a", "rough": "#7d7048", "cliff": "#4c4838", "cliffTop": "#6b6552", "water": "#2f5f9e", "waterDeep": "#1d3f70", "metal": "#9aa3ab", "road": "#8b8578", "speck": "#3f5a28" } }, "snowfields": { "name": "Snowfields", "sheet": "terrain-snowfields", "palette": { "ground": "#d6dee6", "groundAlt1": "#e4ebf1", "groundAlt2": "#c4cfda", "rough": "#a9b4bf", "cliff": "#6a737e", "cliffTop": "#8e99a4", "water": "#3d6d95", "waterDeep": "#27506f", "metal": "#9aa3ab", "road": "#9fa6ad", "speck": "#aebccb" } }, "tropics": { "name": "Tropics", "sheet": "terrain-tropics", "palette": { "ground": "#2f6b3c", "groundAlt1": "#3a7f46", "groundAlt2": "#265c33", "rough": "#7a6b3a", "cliff": "#4a3f2e", "cliffTop": "#6d5f45", "water": "#1f8fa8", "waterDeep": "#12667a", "metal": "#9aa3ab", "road": "#9c8f6e", "speck": "#1d4a26" } } } }