Skip to content

Graphics & Asset Guide

The game uses Phaser 3 for rendering with the following base configuration:

SettingValue
Hex OrientationPointy-top
Hex Bounding Box64×64 pixels (perfect square)
Sprite Height (with overlay)80 pixels
RenderingWebGL with antialiasing

All hex grid math is based on a 64×64 pixel square bounding box — power-of-2, all integer math, no fractional overlap needed.

MeasurementValueNotes
HEX_SIZE64pxBounding box side length
TILE_WIDTH64pxSame as HEX_SIZE
TILE_HEIGHT64pxSame as HEX_SIZE
OVERLAY_HEIGHT16pxExtra height above hex for perspective art
SPRITE_HEIGHT80pxHEX_SIZE + OVERLAY_HEIGHT
HEX_HALF_W32pxHalf-width (TILE_WIDTH / 2)
HEX_HALF_H32pxHalf-height (TILE_HEIGHT / 2)
Vertical Spacing48pxTILE_HEIGHT × 0.75
Horizontal Spacing64pxSame as TILE_WIDTH

The hex is a pointy-top hexagon inscribed in the 64×64 square, filling it edge-to-edge. The vertices (clockwise from top) are:

VertexOffset (from center)Absolute (in 64×64 canvas)
Top(0, −32)(32, 0)
Upper-right(+32, −16)(64, 16)
Lower-right(+32, +16)(64, 48)
Bottom(0, +32)(32, 64)
Lower-left(−32, +16)(0, 48)
Upper-left(−32, −16)(0, 16)
64px
┌─────────────────────────┐
│ ▲ (32, 0) │
│ ╱ ╲ │
│ ╱ ╲ │
│(0, 16) ╱ ╲ (64,16)│
│ │ │ │
│ 64px │ HEX │ 64px │
│ │ TILE │ │
│(0, 48) │ │(64,48) │
│ ╲ ╱ │
│ ╲ ╱ │
│ ╲ ╱ │
│ ▼ (32, 64) │
└─────────────────────────┘

The hex fills the entire bounding box — top and bottom vertices touch the top and bottom edges, left and right edges meet the hex at 1/4 and 3/4 height.

For terrain tile assets, use 64×64 pixels for the base hex art:

  • The hex shape fills the full 64×64 canvas end-to-end
  • Power-of-2 dimensions are optimal for GPU texture memory
  • Only the small triangular corners outside the hex vertices are transparent
  • Works efficiently with Phaser’s sprite batching

For tiles with perspective/height detail (e.g., mountains, tall buildings), use 64×80 pixels — the extra 16px overlay sits above the hex and is drawn on top of the row above.

For high-resolution displays, create @2x versions:

Asset TypeStandard@2x (Retina)
Hex Tiles64×64px128×128px
Hex Tiles + Overlay64×80px128×160px
Unit Sprites48×48px96×96px

Units are displayed within hex tiles and should be sized appropriately:

MeasurementValueNotes
Container Size48×48pxInteractive hit area
Circle Radius14pxUsed for programmatic rendering
Symbol Font Size16pxUnit letter symbol
HP Font Size12pxHealth badge text
┌──────────────────────────────────┐
│ 48×48px │
│ ┌────────────────────────────┐ │
│ │ │ │
│ │ ╭──────────────╮ │ │
│ │ │ │ │ │
│ │ │ UNIT │ │ │
│ │ │ SPRITE │ │ │
│ │ │ │ │ │
│ │ ╰──────────────╯ │ │
│ │ [HP] ← Badge │ │
│ └────────────────────────────┘ │
└──────────────────────────────────┘
ElementSizeUse
Unit badges/icons16×16pxSmall indicators
Status icons24×24pxSleep, buff indicators

For this game’s aesthetic (inspired by WeeWar and classic hex strategy games):

  • Format: PNG with transparency
  • Style: Pixel art at native resolution
  • Color Depth: 32-bit RGBA (for transparency)
  • Compression: Maximum (lossless)

Why Pixel Art?

  • Matches the retro tactical game aesthetic
  • Clean scaling at integer multiples
  • Smaller file sizes than vector alternatives
  • Efficient sprite batching in Phaser

Better suited for:

  • UI elements (buttons, icons, menus)
  • Resolution-independent assets
  • Assets that need extreme scaling

For efficient loading, combine related assets into spritesheets:

Organize terrain tiles in a grid layout:

Terrain Spritesheet: 512×128px (8 columns × 2 rows)
┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐
│ GRASS │ FOREST │MOUNTAIN│SHALLOW │ DEEP │ BASE │ ROAD │ EMPTY │
│ 64×64 │ 64×64 │ 64×64 │ WATER │ WATER │ 64×64 │ 64×64 │ 64×64 │
│ │ │ │ 64×64 │ 64×64 │ │ │ │
├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤
│ BASE │ BASE │ BASE │ BASE │ BASE │ BASE │ BASE │ BASE │
│ (P1) │ (P2) │ (P3) │ (P4) │ (P5) │ (P6) │ (P7) │ (P8) │
│ 64×64 │ 64×64 │ 64×64 │ 64×64 │ 64×64 │ 64×64 │ 64×64 │ 64×64 │
└────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘

Per-faction spritesheets, one row per unit type:

Alliance Spritesheet: 144×48px (3 columns × 1 row)
┌────────┬────────┬────────┐
│MILITIA │BATTLE │HOWITZER│
│ (M) │ TANK │ (H) │
│ 48×48 │ (B) │ 48×48 │
│ │ 48×48 │ │
└────────┴────────┴────────┘
Federation Spritesheet: 192×48px (4 columns × 1 row)
┌────────┬────────┬────────┬────────┐
│TROOPER │ SHOCK │ASSAULT │ROCKET │
│ (T) │TROOPER │ TANK │BATTERY │
│ 48×48 │ (S) │ (A) │ (RT) │
│ │ 48×48 │ 48×48 │ 48×48 │
└────────┴────────┴────────┴────────┘

Create sprites for each terrain type:

TerrainColor (Current)Description
Grass#4a7c59Open grassland, basic terrain
Forest#2d5016Dense trees, slows movement
Mountain#8b7355Rocky peaks, infantry only
Shallow Water#5dade2Fordable water, infantry only
Deep Water#2874a6Impassable for land units
Base#808080Capturable structure (+ player colors)
Road#7f8c8dFast travel path (overlay)
Empty#0a0a0aVoid / off-map

For player-owned bases and units (supports up to 8 players):

PlayerColorHex Code
Player 1Blue#3498db
Player 2Red#e74c3c
Player 3Green#2ecc71
Player 4Orange#f39c12
Player 5Purple#9b59b6
Player 6Teal#1abc9c
Player 7Brown#e67e22
Player 8Silver#95a5a6

The game uses a faction system. Each faction has distinct unit variants:

UnitSymbolRoleCost
MilitiaMInfantry150
Battle TankBArmor300
HowitzerHRanged (2-4 range)300
UnitSymbolRoleCost
TrooperTInfantry140
Shock TrooperSInfantry (elite, move-after-attack)175
Assault TankAArmor240
Rocket BatteryRTRanged (2-3 range)280
UnitSymbolRoleCost
InfantryIInfantry150
VehicleVArmor400

Terrain Tiles (64×64px each):

  • Grass
  • Forest
  • Mountain
  • Shallow Water
  • Deep Water
  • Base (neutral)
  • Base (per player color — up to 8)
  • Road
  • Empty

Unit Sprites (48×48px each):

  • Alliance: Militia, Battle Tank, Howitzer
  • Federation: Trooper, Shock Trooper, Assault Tank, Rocket Battery
  • Shared: Infantry, Vehicle (for non-faction games)

Optional/Future:

  • Additional terrain types (Desert, Snow, etc.)
  • Additional unit types per faction
  • Building sprites (HQ, City, Factory, Airfield, Seaport, Outpost, Depot)
  • Effect animations (explosions, movement trails)
  • Perspective overlay tiles (64×80px for mountains, tall buildings)

Place graphics in the project’s assets/ directory:

assets/
├── sprites/
│ ├── terrain-tiles.png # Terrain spritesheet
│ ├── units-alliance.png # Alliance unit spritesheet
│ ├── units-federation.png # Federation unit spritesheet
│ ├── units-shared.png # Shared unit spritesheet
│ └── effects.png # Visual effects
├── ui/
│ ├── buttons.png # UI button spritesheet
│ └── icons.png # Status icons
└── themes/
└── default/
└── theme.json # Theme configuration (hex_size: 64)
  1. Fill the bounding box — the hex shape touches all four edges of the 64×64 canvas
  2. Only corners are transparent — small triangular areas at the four corners outside the hex vertices
  3. Consistent lighting — pick a light source direction and stick with it
  4. Readable at zoom — ensure terrain is identifiable at 0.5× zoom (the minimum level)
  5. Overlay height — for tiles needing perspective (mountains, buildings), extend 16px above into a 64×80 canvas
  1. Clear silhouettes — units should be instantly recognizable
  2. Distinct by type — each unit role (Infantry, Armor, Ranged) should be obvious at a glance
  3. Color-friendly — design works with different player color tints (8 colors)
  4. Facing direction — consider creating multiple angles for movement
  • Use the existing colors as a base palette
  • Ensure sufficient contrast between terrain types
  • Test visibility with fog of war overlay (50-90% black)
  • Consider colorblind-friendly alternatives

This guide will be updated as the game graphics system evolves.