Map Editor Documentation

Asset Catalog & Key Registry

Complete reference of built-in 3D model IDs, sound effect keys, unit base IDs, and sprite keys for custom scenarios and mods.

Page 17 of 17

Shards of Stone provides a machine-readable asset catalog and query endpoint for third-party modders, map authors, and external automation tools. Because custom scenarios, maps, and mod packages run deterministically inside a client-side lockstep engine, custom definitions must reference canonical assets or valid external URLs.

This registry details how to query the catalog, how to reference 3D meshes and sound effects, and includes canonical registries for every faction in the game.

flowchart TD
    A["Asset Catalog\n(/api/assets/catalog & catalog.json)"] --> B["3D Models (620+ GLBs)\n(modelId / modelUrl)"]
    A --> C["Sound Effects (3,600+ SFX)\n(soundId in triggers)"]
    A --> D["Unit & Building Defs\n(baseId for cloning & patches)"]
    A --> E["Spells & Items\n(spellId, iconKey, itemId)"]
 
    B --> F["Three.js 3D Viewport\n(ModelManager)"]
    C --> G["SoundManager / Web Audio\n(Spatial playback)"]
    D --> H["Data Overrides\n(defOverrides)"]
    E --> H

1. Querying the Machine-Readable Catalog

The game serves a pre-indexed asset catalog directly from static disk and via a filtered REST API endpoint.

Static JSON Endpoint

For offline tooling, build pipelines, and CI/CD map validators, load public/assets/catalog.json directly:

# In local development or standalone tools
cat public/assets/catalog.json | jq '.units[] | select(.race=="dwarf")'

REST API (/api/assets/catalog)

When building web map editors, spectator overlays, or external AI agents, query the live Next.js API endpoint:

GET /api/assets/catalog HTTP/1.1
Host: localhost:3050

Query Parameters

ParameterTypeDescription
category'models' | 'sounds' | 'units' | 'buildings' | 'spells' | 'items'Returns only the requested category slice instead of the full catalog.
racestringFilters models, units, and buildings by faction (e.g. dwarf, goblin, ratmen, lizardmen, high_elf, wood_elf, dark_elf, human, undead, creep, neutral).
searchstringCase-insensitive substring query on id, name, and asset path.

All responses return HTTP 200 with Cache-Control: public, max-age=3600.

Client Example

// Fetch only Dwarf 3D model definitions
const response = await fetch('/api/assets/catalog?category=models&race=dwarf');
const { models } = await response.json();
 
console.log(`Found ${models.length} dwarf 3D models`);
// models[0] -> { id: "dwarf_cannon_tower", race: "dwarf", polycountTier: "building", hasAnimations: false, footprint: "2x2" }
// Search for all siege weapons across all factions
const res = await fetch('/api/assets/catalog?category=units&search=ram');
const { units } = await res.json();

2. Referencing Assets in Map & Mod Files

In defOverrides (Data Overrides)

In defOverrides, you can patch existing units or clone new variants that borrow shipped 3D models, portraits, and sprites:

{
  "units": [
    {
      "id": "td_boss_dwarf_juggernaut",
      "baseId": "dwarf_steam_tank",
      "patch": {
        "name": "Siege Juggernaut",
        "hp": 2500,
        "damage": 120,
        "speed": 1.2,
        "modelId": "dwarf_steam_tank",
        "spriteKey": "dwarf_steam_tank",
        "renderScale": 1.4
      }
    }
  ]
}

[!TIP] Custom External Models: You can supply direct URLs to externally hosted .glb files via modelUrl and animationsUrl in the patch:

{
  "id": "custom_dragon",
  "baseId": "dark_elf_dragon",
  "patch": {
    "modelUrl": "https://cdn.example.com/models/elder_dragon.glb",
    "animationsUrl": "https://cdn.example.com/models/elder_dragon_anims.glb"
  }
}

In TriggerScript (Sound Effects)

The trigger action { "k": "playSound", "soundId": string, "players": number[] | null } plays audio across local clients:

{
  "k": "playSound",
  "soundId": "battering_ram_impact",
  "players": null
}

To play unit voice lines or faction alarms:

{
  "k": "playSound",
  "soundId": "voice/dwarf_king_ack_1",
  "players": [0]
}

3. Canonical 3D Models Reference

Shards of Stone includes over 620 production-ready 3D models (.glb) stored in public/assets/models/<faction>/. All units are normalized to UNIT_MODEL_HEIGHT_PIXELS, and building footprints align with the simulation grid.

Dwarf Faction Models

Model ID (modelId)CategoryFootprintAnimationsDescription
dwarf_minerUnit1×1YesStandard worker pickaxe mining & melee
dwarf_ironguardUnit1×1YesHeavy shield & axe infantry
dwarf_crossbowmanUnit1×1YesRanged crossbow fighter
dwarf_ram_riderUnit1×1YesMounted cavalry beast
dwarf_steam_cannonUnit1×1StaticWheeled siege cannon
dwarf_steam_tankUnit1×1StaticHeavily armored siege steam engine
dwarf_battering_ramUnit1×1StaticArmored mechanical ram
dwarf_ironjumperUnit1×1YesJetpack assault commando
dwarf_runesmithUnit1×1YesRunic spellcaster
dwarf_clericUnit1×1YesDivine battlefield healer
dwarf_gyrocopterUnit2×2StaticDual-rotor flying machine
dwarf_bomberUnit2×2StaticHeavy bombing airship
dwarf_thunderhawkUnit2×2YesLightning-charged avian flyer
dwarf_ironcladUnit2×2StaticArmored naval gunship
dwarf_dreadnoughtUnit2×2StaticMassive naval battleship
dwarf_iron_subUnit2×2StaticSubmersible naval raider
hero_borinHero1×1YesHigh King hero avatar
hero_sigridHero1×1YesShieldmaiden paladin hero
hero_runvarHero1×1YesRunemaster battle hero
dwarf_town_hallBuilding4×4StaticTier 1 Mountain Hold base
dwarf_strongholdBuilding4×4StaticTier 2 Upgraded Fortress
dwarf_citadelBuilding4×4StaticTier 3 High Citadel
dwarf_barracksBuilding3×3StaticMilitary training hall
dwarf_archery_rangeBuilding3×3StaticMarksmanship training range
dwarf_workshopBuilding3×3StaticEngineering siege workshop
dwarf_towerBuilding2×2StaticWatchtower defense
dwarf_cannon_towerBuilding2×2StaticUpgraded artillery cannon tower
dwarf_rune_forgeBuilding3×3StaticRunic upgrade forge
dwarf_dockBuilding3×3StaticWater coastal shipyard

Goblin Faction Models

Model ID (modelId)CategoryFootprintAnimationsDescription
goblin_peonUnit1×1YesScrap collector & builder
goblin_brawlerUnit1×1YesDual-dagger infantry skirmisher
goblin_bomb_lobberUnit1×1YesExplosive grenade launcher
goblin_warg_riderUnit1×1YesFast carnivorous wolf cavalry
goblin_demolisherUnit1×1StaticCatapult siege contraption
goblin_war_wagonUnit1×1StaticMobile armored cannon wagon
goblin_battering_ramUnit1×1StaticSpiked ramming log
goblin_shamanUnit1×1YesHex and lightning caster
goblin_warlockUnit1×1YesDark magic summoner
goblin_bat_riderUnit2×2YesFlying bomb-dropping mount
goblin_wyvern_riderUnit2×2YesPoisonous draconic air unit
goblin_sky_shredderUnit2×2StaticRamshackle flying battle-copter
goblin_sludge_bargeUnit2×2StaticCrude industrial naval vessel
goblin_troll_destroyerUnit2×2StaticHeavy naval war vessel
goblin_juggernautUnit2×2StaticEnormous ramming naval flagship
hero_grizzikHero1×1YesGoblin warlord hero
hero_skaraHero1×1YesShadow assassin hero
hero_mokHero1×1YesGoblin brute hero
goblin_town_hallBuilding4×4StaticScrap Fortress Tier 1
goblin_war_campBuilding4×4StaticWar Camp Tier 2
goblin_warlord_keepBuilding4×4StaticWarlord's Keep Tier 3
goblin_barracksBuilding3×3StaticScrap training pens
goblin_arrow_spitterBuilding2×2StaticRapid-fire needle tower
goblin_boom_towerBuilding2×2StaticExplosive mortar defense tower
goblin_bat_roostBuilding3×3StaticWinged beast roosting spire

Ratmen Faction Models

Model ID (modelId)CategoryFootprintAnimationsDescription
ratmen_diggerUnit1×1YesWarpstone-powered burrowing worker
ratmen_clanratUnit1×1YesSwarm infantry sword/spear
ratmen_jezzailUnit1×1YesLong-range warp-sniper team
ratmen_stormverminUnit1×1YesArmored halberd storm elite
ratmen_spark_cannonUnit1×1StaticCrackling lightning artillery
ratmen_doom_wheelUnit1×1StaticGiant rolling warp-lightning wheel
ratmen_rat_ogreUnit1×1YesMutated hulking brute beast
ratmen_plague_priestUnit1×1YesNoxious disease caster
ratmen_warlockUnit1×1YesElectrical techno-wizard
hero_riktoothHero1×1YesMaster assassin warlord hero
hero_grindsparkHero1×1YesMad warp-inventor hero
ratmen_town_hallBuilding4×4StaticCouncil Warren Tier 1
ratmen_warlord_warrenBuilding4×4StaticGreat Under-City Tier 2
ratmen_council_hallBuilding4×4StaticRulers of Decay Tier 3
ratmen_arrow_towerBuilding2×2StaticPoison dart outpost
ratmen_cannon_towerBuilding2×2StaticWarp-spark defensive tower

Lizardmen Faction Models

Model ID (modelId)CategoryFootprintAnimationsDescription
lizardmen_skink_workerUnit1×1YesAmphibious builder & gatherer
lizardmen_saurusUnit1×1YesCold-blooded club & shield warrior
lizardmen_skink_skirmisherUnit1×1YesJavelin & blowpipe ranged fighter
lizardmen_temple_guardUnit1×1YesElite armored sun-halberdier
lizardmen_bastiladonUnit2×2YesSolar crystal armored dinosaur
lizardmen_carnosaurUnit2×2YesApex predatory bipedal leviathan
lizardmen_kroxigorUnit1×1YesHeavy amphibious crocodilian shock troop
lizardmen_skink_priestUnit1×1YesCelestial divination caster
hero_kroq_garHero2×2YesAncient carnosaur mounted warlord
hero_tehenhauinHero1×1YesProphet of the Serpent God
hero_huatecHero1×1YesOld Blood solar guardian hero
lizardmen_town_hallBuilding4×4StaticStepped Ziggurat Tier 1
lizardmen_sun_templeBuilding4×4StaticGreat Solar Pyramid Tier 2
lizardmen_great_pyramidBuilding4×4StaticFloating Celestial Temple Tier 3

High Elf, Wood Elf, & Dark Elf Models

FactionProminent UnitsProminent Siege & HeavyTown Hall & Key Spire
High Elfhigh_elf_archer, high_elf_spearman, high_elf_magehigh_elf_crystal_walker, high_elf_phoenixhigh_elf_town_hall, high_elf_arcane_spire
Wood Elfwood_elf_archer, wood_elf_wardancer, wood_elf_druidwood_elf_war_chariot, wood_elf_treantwood_elf_town_hall, wood_elf_ancient_grove
Dark Elfdark_elf_archer, dark_elf_bladedancer, dark_elf_sorceressdark_elf_shadow_engine, dark_elf_dragondark_elf_town_hall, dark_elf_black_citadel

Human & Undead Models

FactionCore Infantry & CastersSiege & CavalryBase Structures
Humanhuman_swordsman, human_archer, human_knight, human_clerichuman_catapult, human_pegasus_knight, human_battleshiphuman_town_hall, human_castle, human_barracks
Undeadundead_skeleton_warrior, undead_ghoul, undead_necromancer, undead_lichundead_corpse_cart, undead_bone_dragon, undead_ghost_shipundead_town_hall, undead_black_citadel, undead_mass_grave

Neutral, Creep, & Boss Models

Model ID (modelId)FootprintCategoryUsage
creep_boss_ancient_wyrm2×2Creep BossEpic flying boss with breath weapon
creep_boss_ogre_warlord2×2Creep BossColossal ground smash boss encounter
creep_dire_bear1×1CreepHostile wilderness beast
creep_kobold_digger1×1CreepCamp miner
creep_kobold_geomancer1×1CreepEarth-shaping caster creep
creep_ogre_bruiser1×1CreepHeavy club-wielding barbarian
creep_ogre_magi1×1CreepTwo-headed fire/frost mage
creep_pirate_sloop2×2Naval CreepHostile rogue coastal raider
creep_pirate_galleon2×2Naval CreepThree-masted pirate capital ship
merc_ogre_mercenary1×1MercenaryHired frontline brawler
merc_elf_ranger1×1MercenaryHired precision sniper
merc_feathercrest_talon2×2MercenaryAerial mercenary flyer
neutral_mercenary_camp3×3BuildingNeutral recruitment camp
neutral_item_shop3×3BuildingRelic and potion vendor
gambling_den3×3BuildingNeutral trade and gamble structure

4. Audio Keys Reference

The game engine provides more than 3,600 sound effects (public/assets/sfx/). In TriggerScript, reference the sound ID (filename without .mp3 extension, or prefixed with voice/ for unit voice lines).

Combat Impacts & Hits

Sound ID (soundId)Typical Trigger Context
sword_clash, sword_clash_b, sword_clash_cBlade parry or melee collision
axe_hit, axe_hit_b, axe_hit_cMeaty cleaving axe strike
arrow_hit, bolt_hitProjectile armor penetration
battering_ram_impactGate or wall destruction impact
heavy_impactWarhammer or giant club hit
ground_smashArea-of-effect seismic shockwave
knockback_impactUnit thrown backwards across tiles
explosion, explosion_b, explosion_cBomb, mortar, or explosive death
cannon_fire, cannon_impactArtillery launch and crater detonation
broadside_cannon, heavy_naval_cannonNaval naval bombardment barrage

Spell Invocations & Magic Schools

Magic SchoolCast Sound ID (soundId)Impact Sound ID (soundId)
Firespell_fire_cast, spell_fire_cast_bspell_fire_impact, spell_fire_impact_b
Frostspell_frost_cast, spell_frost_cast_bspell_frost_impact, spell_frost_impact_b
Arcanespell_arcane_cast, spell_arcane_cast_bspell_arcane_impact, spell_arcane_impact_b
Holyspell_holy_cast, spell_healspell_holy_impact, buff_cast
Naturespell_nature_cast, spell_nature_cast_bspell_nature_impact, living_roots
Necroticspell_necrotic_cast, spell_raise_dead_castspell_necrotic_impact
Plaguespell_plague_cast, plague_cloudspell_plague_impact
Runicspell_rune_cast, spell_rune_cast_bspell_rune_impact
Shadowspell_shadow_cast, spell_invisibilityspell_shadow_impact, shadow_bolt
Solarspell_solar_cast, solar_beamspell_solar_impact
Stormspell_storm_cast, lightning_strikespell_storm_impact
Ultimateult_meteor, ult_starfall, ult_earthquake, ult_army_of_the_deadHigh-impact cinematic soundscapes

Alarms, Economy, & UI

Sound ID (soundId)Purpose & Recommended Usage
under_attackBase generic combat alert
dwarf_under_attack, goblin_under_attackFaction-voiced combat alarms
dwarf_garrison_bell, goblin_garrison_bellCivilian recall / town bell toggle
need_more_gold, need_more_lumberResource shortage notification
population_capHousing capacity reached notification
hero_level_upHero milestone celebration sting
research_completeTech tree upgrade finalized
building_collapseBuilding HP reaching zero
click, error_buzzMenu button interactions and invalid orders
coinsTransaction or bounty reward
waygate_activate, waygate_travelTeleporter network transitions

5. Overriding vs Cloning Best Practices

When designing custom game modes or rebalancing factions, choosing between patching and cloning preserves compatibility with the AI and HUD:

flowchart TD
    Q{"Is the change purely\na balance tweak or stat buff?"}
    Q -- "Yes (Numbers only)" --> P["Patch Existing ID\n(e.g. id: 'dwarf_crossbowman')"]
    Q -- "No (New role, new identity)" --> C["Clone with baseId\n(e.g. id: 'dwarf_marksman', baseId: 'dwarf_crossbowman')"]
 
    P --> R1["✓ AI build orders keep working\n✓ Tooltips & tech tree intact\n✓ Preloads existing textures"]
    C --> R2["✓ Safe from breaking vanilla balance\n✓ Placeable in editor unit palette\n✓ Unique trigger targeting"]

When to Patch

  • Adjusting cost, training time, speed, or health of existing units.
  • Giving a building extra armor or attack damage in a defense scenario.
  • Replacing the 3D model of a unit faction-wide with an alternate skin.
  • Rule of Thumb: If the unit still behaves like a Crossbowman, patch it.

When to Clone

  • Creating a specialized mini-boss, hero bodyguard, or elite wave creep.
  • Introducing a unit that has a distinct identity, custom ability, or unique weapon.
  • Introducing custom towers with distinct targeting rules.
  • Rule of Thumb: If a player needs to tell the unit apart from standard forces at a glance, clone it with baseId.

Previous: API & Headless Runner Reference. Back to: Map Editor Overview.