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 --> H1. 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:3050Query Parameters
| Parameter | Type | Description |
|---|---|---|
category | 'models' | 'sounds' | 'units' | 'buildings' | 'spells' | 'items' | Returns only the requested category slice instead of the full catalog. |
race | string | Filters models, units, and buildings by faction (e.g. dwarf, goblin, ratmen, lizardmen, high_elf, wood_elf, dark_elf, human, undead, creep, neutral). |
search | string | Case-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
.glbfiles viamodelUrlandanimationsUrlin 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) | Category | Footprint | Animations | Description |
|---|---|---|---|---|
dwarf_miner | Unit | 1×1 | Yes | Standard worker pickaxe mining & melee |
dwarf_ironguard | Unit | 1×1 | Yes | Heavy shield & axe infantry |
dwarf_crossbowman | Unit | 1×1 | Yes | Ranged crossbow fighter |
dwarf_ram_rider | Unit | 1×1 | Yes | Mounted cavalry beast |
dwarf_steam_cannon | Unit | 1×1 | Static | Wheeled siege cannon |
dwarf_steam_tank | Unit | 1×1 | Static | Heavily armored siege steam engine |
dwarf_battering_ram | Unit | 1×1 | Static | Armored mechanical ram |
dwarf_ironjumper | Unit | 1×1 | Yes | Jetpack assault commando |
dwarf_runesmith | Unit | 1×1 | Yes | Runic spellcaster |
dwarf_cleric | Unit | 1×1 | Yes | Divine battlefield healer |
dwarf_gyrocopter | Unit | 2×2 | Static | Dual-rotor flying machine |
dwarf_bomber | Unit | 2×2 | Static | Heavy bombing airship |
dwarf_thunderhawk | Unit | 2×2 | Yes | Lightning-charged avian flyer |
dwarf_ironclad | Unit | 2×2 | Static | Armored naval gunship |
dwarf_dreadnought | Unit | 2×2 | Static | Massive naval battleship |
dwarf_iron_sub | Unit | 2×2 | Static | Submersible naval raider |
hero_borin | Hero | 1×1 | Yes | High King hero avatar |
hero_sigrid | Hero | 1×1 | Yes | Shieldmaiden paladin hero |
hero_runvar | Hero | 1×1 | Yes | Runemaster battle hero |
dwarf_town_hall | Building | 4×4 | Static | Tier 1 Mountain Hold base |
dwarf_stronghold | Building | 4×4 | Static | Tier 2 Upgraded Fortress |
dwarf_citadel | Building | 4×4 | Static | Tier 3 High Citadel |
dwarf_barracks | Building | 3×3 | Static | Military training hall |
dwarf_archery_range | Building | 3×3 | Static | Marksmanship training range |
dwarf_workshop | Building | 3×3 | Static | Engineering siege workshop |
dwarf_tower | Building | 2×2 | Static | Watchtower defense |
dwarf_cannon_tower | Building | 2×2 | Static | Upgraded artillery cannon tower |
dwarf_rune_forge | Building | 3×3 | Static | Runic upgrade forge |
dwarf_dock | Building | 3×3 | Static | Water coastal shipyard |
Goblin Faction Models
Model ID (modelId) | Category | Footprint | Animations | Description |
|---|---|---|---|---|
goblin_peon | Unit | 1×1 | Yes | Scrap collector & builder |
goblin_brawler | Unit | 1×1 | Yes | Dual-dagger infantry skirmisher |
goblin_bomb_lobber | Unit | 1×1 | Yes | Explosive grenade launcher |
goblin_warg_rider | Unit | 1×1 | Yes | Fast carnivorous wolf cavalry |
goblin_demolisher | Unit | 1×1 | Static | Catapult siege contraption |
goblin_war_wagon | Unit | 1×1 | Static | Mobile armored cannon wagon |
goblin_battering_ram | Unit | 1×1 | Static | Spiked ramming log |
goblin_shaman | Unit | 1×1 | Yes | Hex and lightning caster |
goblin_warlock | Unit | 1×1 | Yes | Dark magic summoner |
goblin_bat_rider | Unit | 2×2 | Yes | Flying bomb-dropping mount |
goblin_wyvern_rider | Unit | 2×2 | Yes | Poisonous draconic air unit |
goblin_sky_shredder | Unit | 2×2 | Static | Ramshackle flying battle-copter |
goblin_sludge_barge | Unit | 2×2 | Static | Crude industrial naval vessel |
goblin_troll_destroyer | Unit | 2×2 | Static | Heavy naval war vessel |
goblin_juggernaut | Unit | 2×2 | Static | Enormous ramming naval flagship |
hero_grizzik | Hero | 1×1 | Yes | Goblin warlord hero |
hero_skara | Hero | 1×1 | Yes | Shadow assassin hero |
hero_mok | Hero | 1×1 | Yes | Goblin brute hero |
goblin_town_hall | Building | 4×4 | Static | Scrap Fortress Tier 1 |
goblin_war_camp | Building | 4×4 | Static | War Camp Tier 2 |
goblin_warlord_keep | Building | 4×4 | Static | Warlord's Keep Tier 3 |
goblin_barracks | Building | 3×3 | Static | Scrap training pens |
goblin_arrow_spitter | Building | 2×2 | Static | Rapid-fire needle tower |
goblin_boom_tower | Building | 2×2 | Static | Explosive mortar defense tower |
goblin_bat_roost | Building | 3×3 | Static | Winged beast roosting spire |
Ratmen Faction Models
Model ID (modelId) | Category | Footprint | Animations | Description |
|---|---|---|---|---|
ratmen_digger | Unit | 1×1 | Yes | Warpstone-powered burrowing worker |
ratmen_clanrat | Unit | 1×1 | Yes | Swarm infantry sword/spear |
ratmen_jezzail | Unit | 1×1 | Yes | Long-range warp-sniper team |
ratmen_stormvermin | Unit | 1×1 | Yes | Armored halberd storm elite |
ratmen_spark_cannon | Unit | 1×1 | Static | Crackling lightning artillery |
ratmen_doom_wheel | Unit | 1×1 | Static | Giant rolling warp-lightning wheel |
ratmen_rat_ogre | Unit | 1×1 | Yes | Mutated hulking brute beast |
ratmen_plague_priest | Unit | 1×1 | Yes | Noxious disease caster |
ratmen_warlock | Unit | 1×1 | Yes | Electrical techno-wizard |
hero_riktooth | Hero | 1×1 | Yes | Master assassin warlord hero |
hero_grindspark | Hero | 1×1 | Yes | Mad warp-inventor hero |
ratmen_town_hall | Building | 4×4 | Static | Council Warren Tier 1 |
ratmen_warlord_warren | Building | 4×4 | Static | Great Under-City Tier 2 |
ratmen_council_hall | Building | 4×4 | Static | Rulers of Decay Tier 3 |
ratmen_arrow_tower | Building | 2×2 | Static | Poison dart outpost |
ratmen_cannon_tower | Building | 2×2 | Static | Warp-spark defensive tower |
Lizardmen Faction Models
Model ID (modelId) | Category | Footprint | Animations | Description |
|---|---|---|---|---|
lizardmen_skink_worker | Unit | 1×1 | Yes | Amphibious builder & gatherer |
lizardmen_saurus | Unit | 1×1 | Yes | Cold-blooded club & shield warrior |
lizardmen_skink_skirmisher | Unit | 1×1 | Yes | Javelin & blowpipe ranged fighter |
lizardmen_temple_guard | Unit | 1×1 | Yes | Elite armored sun-halberdier |
lizardmen_bastiladon | Unit | 2×2 | Yes | Solar crystal armored dinosaur |
lizardmen_carnosaur | Unit | 2×2 | Yes | Apex predatory bipedal leviathan |
lizardmen_kroxigor | Unit | 1×1 | Yes | Heavy amphibious crocodilian shock troop |
lizardmen_skink_priest | Unit | 1×1 | Yes | Celestial divination caster |
hero_kroq_gar | Hero | 2×2 | Yes | Ancient carnosaur mounted warlord |
hero_tehenhauin | Hero | 1×1 | Yes | Prophet of the Serpent God |
hero_huatec | Hero | 1×1 | Yes | Old Blood solar guardian hero |
lizardmen_town_hall | Building | 4×4 | Static | Stepped Ziggurat Tier 1 |
lizardmen_sun_temple | Building | 4×4 | Static | Great Solar Pyramid Tier 2 |
lizardmen_great_pyramid | Building | 4×4 | Static | Floating Celestial Temple Tier 3 |
High Elf, Wood Elf, & Dark Elf Models
| Faction | Prominent Units | Prominent Siege & Heavy | Town Hall & Key Spire |
|---|---|---|---|
| High Elf | high_elf_archer, high_elf_spearman, high_elf_mage | high_elf_crystal_walker, high_elf_phoenix | high_elf_town_hall, high_elf_arcane_spire |
| Wood Elf | wood_elf_archer, wood_elf_wardancer, wood_elf_druid | wood_elf_war_chariot, wood_elf_treant | wood_elf_town_hall, wood_elf_ancient_grove |
| Dark Elf | dark_elf_archer, dark_elf_bladedancer, dark_elf_sorceress | dark_elf_shadow_engine, dark_elf_dragon | dark_elf_town_hall, dark_elf_black_citadel |
Human & Undead Models
| Faction | Core Infantry & Casters | Siege & Cavalry | Base Structures |
|---|---|---|---|
| Human | human_swordsman, human_archer, human_knight, human_cleric | human_catapult, human_pegasus_knight, human_battleship | human_town_hall, human_castle, human_barracks |
| Undead | undead_skeleton_warrior, undead_ghoul, undead_necromancer, undead_lich | undead_corpse_cart, undead_bone_dragon, undead_ghost_ship | undead_town_hall, undead_black_citadel, undead_mass_grave |
Neutral, Creep, & Boss Models
Model ID (modelId) | Footprint | Category | Usage |
|---|---|---|---|
creep_boss_ancient_wyrm | 2×2 | Creep Boss | Epic flying boss with breath weapon |
creep_boss_ogre_warlord | 2×2 | Creep Boss | Colossal ground smash boss encounter |
creep_dire_bear | 1×1 | Creep | Hostile wilderness beast |
creep_kobold_digger | 1×1 | Creep | Camp miner |
creep_kobold_geomancer | 1×1 | Creep | Earth-shaping caster creep |
creep_ogre_bruiser | 1×1 | Creep | Heavy club-wielding barbarian |
creep_ogre_magi | 1×1 | Creep | Two-headed fire/frost mage |
creep_pirate_sloop | 2×2 | Naval Creep | Hostile rogue coastal raider |
creep_pirate_galleon | 2×2 | Naval Creep | Three-masted pirate capital ship |
merc_ogre_mercenary | 1×1 | Mercenary | Hired frontline brawler |
merc_elf_ranger | 1×1 | Mercenary | Hired precision sniper |
merc_feathercrest_talon | 2×2 | Mercenary | Aerial mercenary flyer |
neutral_mercenary_camp | 3×3 | Building | Neutral recruitment camp |
neutral_item_shop | 3×3 | Building | Relic and potion vendor |
gambling_den | 3×3 | Building | Neutral 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_c | Blade parry or melee collision |
axe_hit, axe_hit_b, axe_hit_c | Meaty cleaving axe strike |
arrow_hit, bolt_hit | Projectile armor penetration |
battering_ram_impact | Gate or wall destruction impact |
heavy_impact | Warhammer or giant club hit |
ground_smash | Area-of-effect seismic shockwave |
knockback_impact | Unit thrown backwards across tiles |
explosion, explosion_b, explosion_c | Bomb, mortar, or explosive death |
cannon_fire, cannon_impact | Artillery launch and crater detonation |
broadside_cannon, heavy_naval_cannon | Naval naval bombardment barrage |
Spell Invocations & Magic Schools
| Magic School | Cast Sound ID (soundId) | Impact Sound ID (soundId) |
|---|---|---|
| Fire | spell_fire_cast, spell_fire_cast_b | spell_fire_impact, spell_fire_impact_b |
| Frost | spell_frost_cast, spell_frost_cast_b | spell_frost_impact, spell_frost_impact_b |
| Arcane | spell_arcane_cast, spell_arcane_cast_b | spell_arcane_impact, spell_arcane_impact_b |
| Holy | spell_holy_cast, spell_heal | spell_holy_impact, buff_cast |
| Nature | spell_nature_cast, spell_nature_cast_b | spell_nature_impact, living_roots |
| Necrotic | spell_necrotic_cast, spell_raise_dead_cast | spell_necrotic_impact |
| Plague | spell_plague_cast, plague_cloud | spell_plague_impact |
| Runic | spell_rune_cast, spell_rune_cast_b | spell_rune_impact |
| Shadow | spell_shadow_cast, spell_invisibility | spell_shadow_impact, shadow_bolt |
| Solar | spell_solar_cast, solar_beam | spell_solar_impact |
| Storm | spell_storm_cast, lightning_strike | spell_storm_impact |
| Ultimate | ult_meteor, ult_starfall, ult_earthquake, ult_army_of_the_dead | High-impact cinematic soundscapes |
Alarms, Economy, & UI
Sound ID (soundId) | Purpose & Recommended Usage |
|---|---|
under_attack | Base generic combat alert |
dwarf_under_attack, goblin_under_attack | Faction-voiced combat alarms |
dwarf_garrison_bell, goblin_garrison_bell | Civilian recall / town bell toggle |
need_more_gold, need_more_lumber | Resource shortage notification |
population_cap | Housing capacity reached notification |
hero_level_up | Hero milestone celebration sting |
research_complete | Tech tree upgrade finalized |
building_collapse | Building HP reaching zero |
click, error_buzz | Menu button interactions and invalid orders |
coins | Transaction or bounty reward |
waygate_activate, waygate_travel | Teleporter 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.