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
| Field | What it does |
|---|---|
edge | What 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, cy | The platform's centre, in tiles |
maxRadius | The 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 |
floor | The slabs' look: stone, basalt, ice, gold or wood |
biome | Over 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 |
obstacles | What 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 |
ice | Circles of ice (x, y, r): less grip, so a shove carries further |
webs | Circles of web: walking through them is slow |
vents | Points that erupt every so often after a warning (lava arenas) |
gusts | true: a gust crosses the platform every so often and pushes every caster one way (sky arenas) |
below | Scenery 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 |
pits | Holes 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.
| Field | What it does |
|---|---|
arenas | The further arenas, in order after arena |
rotation | order (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
| Field | What it does |
|---|---|
rounds | Rounds in the match, an odd number from 1 to 15. Blank: 7 for up to four casters, 9 for six, 11 for eight |
mode | ffa (default) or teams: the lobby's teams, and a caster's spells pass through their allies |
botSkill | easy, normal or hard |
practice | true: the practice room. Bot seats are training dummies that stand and get back up; no shrink, free spells, no rounds |
casters | A caster for a seat ("3": "vaelindra"). A person's seat without one picks in the arena |
roster | The casters the map offers (default: all nine) |
pickSeconds | Seconds of picks. Blank: twenty when two or more people play; one person whose caster the map leaves to them picks with no clock |
firstShopSeconds, shopSeconds | The shop before round 1 (default 40) and before each round after (30) |
startGold, roundGold | Gold 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).
| Field | What it does |
|---|---|
health | A caster's health (100) |
walkSpeed, regen | Walking speed, tiles a second (2.6), and health back each second on the platform (0.45) |
knockback, strainScale | Knockback per point of damage (0.9), and how strain grows it: a shove throws 1 + strain / strainScale times as far (100) |
knockbackFade, knockbackFadeIce | How fast a shove fades, per second (2.2), and on ice (0.9) |
baseRadius, ringWidth | A round's platform starts at baseRadius + √casters (6), and each shrink takes ringWidth off the rim (1) |
shrinkSeconds, shrinkWarnSeconds | A ring goes every shrinkSeconds × √(casters standing) (15), warned this long before (3) |
lavaDps, waterDps, bogDps | Health a second in lava (9), cold water (6) and a bog (4) |
waterWade, bogWade, webWade | How fast a caster wades in water (0.6), a bog (0.4) and a web (0.5), as a share of walking |
fallSeconds | How long a fall into the void lasts before the caster is out (0.9) |
gustEverySeconds, gustSeconds, gustSpeed | Gusts: how often (18), how long (2.2) and how hard (1.1) |
ventEverySeconds, ventWarnSeconds, ventRadius, ventDamage | Vents: how often (11), the warning (1.6), how wide (1.4) and how hard (9) |
breakableHp, barrelHp, barrelRadius, barrelDamage | Breakables (26), barrels (10) and a barrel's blast (2.6 tiles, 11 damage) |
countdownSeconds | The countdown before a round (3) |
winPoints, killPoints | Points for the last one standing (1) and for a kill (1) |
suddenDeathScale | A sudden-death round's platform, as a share of a round's (0.55) |
missilesClash | false: 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 / 100times 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.