Map Editor Documentation

Build a spell brawl

Turn the arena on for your own map: a round platform over the sky or the lava, what stands on it, more islands a round each, your own numbers and spells, the rounds and the casters it offers. Brink of Stone is built this way.

Genres · Page 51 of 53

Brink of Stone is a set of maps. Each arena's platform, its edge, its pillars and barrels, its rounds and its bots come from one setting in the map file, rules.brink, and everything below works on any map that sets it. A player who opens your map gets the whole brawl: the pick, the spell shop between rounds, the countdown, the rounds as the platform shrinks, and the results.

To build a brawl without the arena module, from the public script API alone, read Walkthrough: a spell brawl from scratch.

Start from a Brink of Stone arena

Download Skyreach Spire (every arena is at /maps/brink-<arena>.play.json) and open it in the Forge with File → Import Map JSON…. Its arena comes with it: move the pillars, change the edge or the rounds, then save it as your own.

To start from a blank map instead, open the Players module in the Forge. Under Rules there is an Arena panel. Switch it on and it lays a platform at the middle of the map with four pillars on it. Switching the arena on also turns standard victory, the starting base, the AI's armies, fog and building off, because a brawl has none of them; turn any back on in Rules if your map wants it.

Switch an arena on: rules.brink

{
  "rules": {
    "brink": {
      "arena": {
        "id": "my_arena",
        "name": "My Arena",
        "edge": "void",
        "cx": 32,
        "cy": 32,
        "maxRadius": 12,
        "floor": "stone",
        "obstacles": [
          { "x": 35, "y": 35, "r": 0.6, "kind": "pillar" },
          { "x": 29, "y": 29, "r": 0.6, "kind": "breakable" },
          { "x": 32, "y": 39, "r": 0.42, "kind": "barrel" }
        ]
      },
      "rounds": 7,
      "botSkill": "normal"
    },
    "standardVictory": false,
    "noStartingUnits": true,
    "disableAi": true,
    "fog": "off"
  }
}

Every seat on the map is a caster. People's seats are the players; every other seat is a bot.

The arena

FieldWhat it does
edgeWhat lies past the platform: void (the open sky: over the edge and you are out of the round), lava (9 health a second), water (cold water: 6 a second, and slow wading) or bog (4 a second, slower still)
cx, cyThe platform's centre, in tiles
maxRadiusThe largest the platform can be, 3 to 64 tiles. A round starts at 6 + the square root of the number of casters, never more than this
floorThe slabs' look: stone, basalt, ice, gold or wood
biomeOver the open sky, the island's own look whatever the map's biome: its rock (a snowcap for winter, glowing magma veins for wasteland, sandstone for desert, witchlight for gloom, a grass cap for plains), three small rocks floating beside it with that biome's scenery, and its air (snow, embers, blown sand, wisps, petals). Give each of several islands its own
obstaclesWhat stands on the platform: pillar blocks bodies and missiles for good, breakable takes hits (hp, default 26) and shatters into shards that throw whoever they hit, barrel blasts everyone near it when it breaks (hp, default 10). r is each one's radius in tiles. propId names the prop drawn for it, any prop in the Forge's library (a faction's statue, city_statue_high_elf; an obelisk; a barrel), sized to r and facing the centre
iceCircles of ice (x, y, r): less grip, so a shove carries further
websCircles of web: walking through them is slow
ventsPoints that erupt every so often after a warning (lava arenas)
guststrue: a gust crosses the platform every so often and pushes every caster one way (sky arenas)
belowScenery under a sky arena: a floating rock depth tiles below the platform, radius across, a ring when inner is set, its top a lava lake or bare stone ({ "kind": "lava", "radius": 7, "inner": 3, "depth": 10 }). Only the view draws it: a fall is still out of the round
pitsHoles in the platform (x, y, r, kind): a lava pool burns whoever stands in it until they walk out, a void hole drops them through and out of the round. A pit in the middle makes a ring to fight round. Pits stay as the rim shrinks

The game draws the platform itself, over whatever terrain you paint, so that its rings can fall away or sink as the arena shrinks. Paint what matches its edge under and round it: void (a Sky Lands map) for void, lava for lava, water for water and bog. The scenery beyond the edge is yours: islands, cavern walls, a shore, trees.

Put obstacles in rings, evenly spaced round the centre, so no seat starts with better cover. The platform loses one tile of radius every 15 × √(casters still standing) seconds, so anything near the rim falls with it first.

More islands on one map

arenas lists more arenas on the same map, up to eight. Each round is fought on one of them, and the camera crosses to the next while the shop is open. Every one is a whole arena with its own edge, floor, obstacles and hazards, at its own cx and cy; lay each one's hazard under it, and keep them far enough apart that one platform at its largest never reaches another.

FieldWhat it does
arenasThe further arenas, in order after arena
rotationorder (default: arena, then each of arenas, round and round), random (never the same one twice running) or fixed (always arena; the others stand as scenery)

The Shattered Isles is built this way: five islands in the open sky, a round on each. Open /maps/brink-shattered_isles.play.json with File, Import Map JSON to see it.

The match

FieldWhat it does
roundsRounds in the match, an odd number from 1 to 15. Blank: 7 for up to four casters, 9 for six, 11 for eight
modeffa (default) or teams: the lobby's teams, and a caster's spells pass through their allies
botSkilleasy, normal or hard
practicetrue: the practice room. Bot seats are training dummies that stand and get back up; no shrink, free spells, no rounds
castersA caster for a seat ("3": "vaelindra"). A person's seat without one picks in the arena
rosterThe casters the map offers (default: all nine)
pickSecondsSeconds of picks. Blank: twenty when two or more people play; one person whose caster the map leaves to them picks with no clock
firstShopSeconds, shopSecondsThe shop before round 1 (default 40) and before each round after (30)
startGold, roundGoldGold to start (20) and every round (10)

Your own numbers and spells

tuning sets the match's numbers over the game's own. Seconds and tiles; anything you leave out keeps the game's value (in brackets).

FieldWhat it does
healthA caster's health (100)
walkSpeed, regenWalking speed, tiles a second (2.6), and health back each second on the platform (0.45)
knockback, strainScaleKnockback per point of damage (0.9), and how strain grows it: a shove throws 1 + strain / strainScale times as far (100)
knockbackFade, knockbackFadeIceHow fast a shove fades, per second (2.2), and on ice (0.9)
baseRadius, ringWidthA round's platform starts at baseRadius + √casters (6), and each shrink takes ringWidth off the rim (1)
shrinkSeconds, shrinkWarnSecondsA ring goes every shrinkSeconds × √(casters standing) (15), warned this long before (3)
lavaDps, waterDps, bogDpsHealth a second in lava (9), cold water (6) and a bog (4)
waterWade, bogWade, webWadeHow fast a caster wades in water (0.6), a bog (0.4) and a web (0.5), as a share of walking
fallSecondsHow long a fall into the void lasts before the caster is out (0.9)
gustEverySeconds, gustSeconds, gustSpeedGusts: how often (18), how long (2.2) and how hard (1.1)
ventEverySeconds, ventWarnSeconds, ventRadius, ventDamageVents: how often (11), the warning (1.6), how wide (1.4) and how hard (9)
breakableHp, barrelHp, barrelRadius, barrelDamageBreakables (26), barrels (10) and a barrel's blast (2.6 tiles, 11 damage)
countdownSecondsThe countdown before a round (3)
winPoints, killPointsPoints for the last one standing (1) and for a kill (1)
suddenDeathScaleA sudden-death round's platform, as a share of a round's (0.55)
missilesClashfalse: enemy missiles pass through each other instead of both bursting

spells reshapes any spell by its id: its name and shop line (blurb), its levels and prices (maxLevel, cost, upgrade), its timing (cooldown, cooldownPerLevel, castTime), what it does (damage, damagePerLevel, knockback, speed, range, radius, duration) and how it is drawn: look (bolt, nova, beam...), material (fire, frost, lightning...) and borrow, the game spell whose palette, icon and bursts it borrows. A spell's slot and what it does when it lands stay the game's.

shop lists the spells the shop sells (default: all of them). Fireball and Scourge are every caster's whatever it says.

"tuning": { "health": 150, "shrinkSeconds": 20 },
"spells": { "fireball": { "name": "Firebolt", "damage": 9, "material": "frost" } },
"shop": ["lightning", "blink", "shield", "meteor"]

In the Forge these go in the Arena panel's second box, Islands, numbers and spells.

The casters are halden, runvar, mok, vexis, huatec, oakheart, vaelindra, sable and morvanna. Every caster plays the same; the pick is their look and the fire their Fireball is made of.

Your own setup screen

When someone presses Play on your published arena, it opens in Brink of Stone's own setup screen: they pick a caster from your roster, one of your arenas, and the match (free for all, two teams or the practice room, how many casters, the bots, the rounds and the controls). Their choices then apply to the arena's map; everything else (your tuning, spells, shop and the land) stays yours. With no menu the screen offers your map alone, under its own name and description. With one in rules.brink, it can carry your title, a tagline, a logo, and up to 16 arenas:

{
  "menu": {
    "title": "The Shoving Pits",
    "tagline": "Three rings, no railings",
    "arenas": [
      { "map": "community:3f1c2e9a-1b2c-4d5e-8f90-1234567890ab", "name": "The Furnace", "blurb": "Lava on every side" },
      { "map": "/maps/brink-barrowmere.play.json", "name": "Barrowmere", "blurb": "Ice underfoot" }
    ]
  }
}

Each arena is a map with its own rules.brink, named by community:<id> for a published map (the id is in its share link) or /maps/<file>.json for one of the game's own. Publish the arenas first, then the map that lists them. The logo is an image the game ships (/assets/...) or one you uploaded; anything else shows Brink of Stone's. Set "menu": false for a map that should launch exactly as you wrote it, its seats and casters fixed, with no setup screen. In the Forge it is the Arena panel's Setup screen section. Its Test the setup screen button runs Test Map through that screen, as a player meets it. Brink of Stone itself is this screen over its ten bundled arenas.

Anyone can open your screen with a link: /play?brink=setup&map=community:<id>.

How it plays

  • Every spell is a shove. A hit adds its damage to the target's strain, and every shove throws 1 + strain / 100 times as far, so a round starts gentle and ends fast.
  • Free for all: a point for the last caster standing and a point for every kill (the last caster to hit you before you went out). Two sides (a duel or two teams): round wins only, and the first past half the rounds wins. A tie after the last round is settled by a sudden-death round.
  • Everyone gets the same gold every round, and spends it in the shop: one spell for each of six slots, three to choose from in each, each with five levels, and levels of Fireball.

The full reference, every spell and every number, is in the game's own mode document, docs/modes/BRINK_OF_STONE.md.