BrainDance
In production

BrainDance MOBA

Third-person skillshot MOBA for Steam. First mode: Cash Brawl, five teams of two, last team standing.

Milestone 1: four people finish a Cash Brawl match over the internet through a listen server, and skillshots land at real-world ping.

Status

Nate

2026-11-01

  • Done: added Alan's bot rows (#11, #24) and session rows (#16) to data/match.csv at his proposed values, BotStuckTime 1. Fixed the MinPlayersToStart note (PR #29). No MaxHumans row: TeamSize x MaxTeams is what we want
  • Done: picked the Final 16 (docs/champions/final-16.md, brainstorm only) and locked the art direction (docs/art-direction.md): anime ink in game, inked gothic for 2D. Started the BrainDance hub (hub/), a Cloudflare Pages dashboard of status, decisions and concept art, with images on the hub-assets branch
  • Next: tune bot difficulty after the first real playtest; #14 and #21; map concepts for the Cash Brawl arena
  • Blocked: nothing
  • Needs: Alan, switch the bots and menu to read these rows and delete BDBotTuning.h and BDSessionTuning.h; whoever is in Unreal next, reimport DT_Match (lock it first)
  • Changed: match.csv 22 new rows, one note
Full history

Collin

2026-10-29 (items through GAS, packaged builds: session 3)

  • Done: on combat, merged into main as PR #20 (617c572) on 2026-10-29.

    • faa89cb, items through GAS:
      • SpawnFighter applies its item rows. Each row's stat columns become one infinite UBDEffect_Item, so different items add up.
      • Damage bonus and lifesteal apply to every ability hit (through ApplyDamage's causer). Cooldown reduction applies to every slot.
      • A max health change keeps the health percentage.
      • The Mod column maps to UBDItemMod handlers (Combat/BDItemMods.h), with hooks the four kinds call: projectiles, areas, dash end, any cast. Splitshot and StaticDash are handlers; a new mod is a handler plus a CSV row.
      • Tests: BrainDance.Combat.Items.* (9) and BrainDance.Combat.ItemsArena, a 2-player PIE on L_Arena_Whitebox. In a buy phase the client buys Whetstone, Splitshot and Swift Boots. In the next fight: walk speed 600 to 672, damage bonus 0.15, and its basic fires 3 shots at 60% that the client sees.
    • 2a0761e, packaged builds:
      • Scripts/Package-Win64.ps1 builds a Win64 Development package into Saved\Packaged\Windows: 699 MB, ignored by git, includes the VC++ prereqs, no .pdb.
      • Maps To Cook: L_MainMenu (startup) and L_Arena_Whitebox. README "Packaged builds".

    Gate checked:

    • All 41 BrainDance.* tests pass headless, run alone, with 0 ensures. The one Error: line is the dropped connection MenuHostJoin expects.
    • Packaged: two copies on this PC start at the main menu. A host on L_Arena_Whitebox?listen and a client at 127.0.0.1 connected, and Cash Brawl rounds ran: lobby, buy (bots bought items), fight, round end, with every gold check OK.
    • Not checked by hand: clicking Alan's Host button and Join box. Desktop control couldn't reach the packaged game's window, so the check used the same travel those buttons do (?listen, then the address). Input and looks in the package are unchecked; a 2-minute click-through is still worth doing.
    • Items on screen: merged on the PIE measurements. Collin checks them by eye in his playtest.
    • Breaks in the package that work in PIE, all fixed:
      1. The MCP and toolset plugins would have shipped (Runtime modules).
      2. The template's GameFeatureData asset scan failed an ensure at startup.
      3. The mannequin and the zone materials are only reached by path, so they had to be added to the cook list.
  • Next:

    1. A two-human playtest with the package once bots fight (#22).
    2. Steam sessions for #8.
    3. Items in the HUD, if Alan wants them through the interface.
  • Blocked: nothing

  • Needs: Alan, bots casting so rounds are a fight, plus a navmesh warning in the package (#22). Nate, the values for the new item mod columns (#21), and #14 still.

  • Changed:

    • docs/interface.md: new Items section. SpawnFighter applies items, and a row listed twice applies twice (MaxCopiesPerItem stays game mode's). ApplyDamage uses the causer's damage bonus and lifesteal.
    • CSV columns: items.csv adds ModSlot, ModShots, ModSpread, ModDamagePct, ModDamage and ModRadius. DT_Items reimported, and FBDItemRow has the same fields.
    • New attributes on UBDAttributeSet: DamageBonus, CooldownReduction and Lifesteal.
    • Project settings:
      • .uproject: ModelContextProtocol and AllToolsets are limited to the Editor target.
      • DefaultGame.ini: Maps To Cook and three more always-cook folders (/Game/BrainDance/GameMode, the mannequin's meshes and its Unarmed anims). The GameFeatureData scan rule is now editor-only.
    • BrainDance.Combat.ItemsArena drives game mode through BD.SkipPhase, BDPick and BDBuy, and reads Phase, Gold and Items by reflection. Renaming those breaks it.
    • Build.cs unchanged.
Full history

Alan

2026-11-01 (housekeeping)

  • Done:
    • PR #32 merged. Fast-forwarded gamemode to main (0bbbc55).
    • Nudged Nate on #24, #11 and #16.
    • No code, asset or data changes. No build or test run needed.
  • Next:
    • The 0/10 join list count: the cause and fix are posted for Collin on #8 (RegisterPlayer in Shared/BDOnlineSessions.cpp). Then MenuFindJoin should expect 1/10, and 2/10 after a join.
    • Bot rows from DT_Match once #24 and #11 land.
    • Bot difficulty: bots feel fine for now. Revisit after a real playtest.
  • Blocked: nothing
  • Needs:
    • Collin: the two-PC Steam test, the 0/10 fix and the ## Event heading back in docs/interface.md (all on #8).
    • Nate: #24, #11, #16, and the MinPlayersToStart note in match.csv (PR #29).
  • Changed: nothing
Full history

Decisions and requests

For Nate

For Collin

For Alan

The Final 16

The strongest 16 of the 32 brainstorm kits: the best looks and the coolest ability sets, two per role, all in the locked anime ink style (see docs/art-direction.md). Every kit has a story, a signature moment (the clip people share) and its counterplay. Brainstorm only, nothing here is a build task yet.

Nadir, the Void Queen
Mage

Nadir the Void Queen

Queen of a star that collapsed into itself. She kept its weight.

  • Passive, Orbit: enemy projectiles that pass close to her curve away.
  • Well (area): a gravity well that tugs enemies in and bends every projectile near it. Allies can curve shots through it.
  • Collapse (area): detonates her wells, pulling everyone inside to the center for damage.
  • Weightless (area): an area goes zero-g and enemies float helplessly for a moment.
  • Ultimate, Event Horizon (area): a singularity drags everyone toward its center for 4s and swallows projectiles. Enemies who reach the middle are stunned.
  • Signature moment: a teammate's missed shot bends through a Well and lands.
  • Counterplay: slow and squishy, and her wells bend her own team's misses too.
Vela, the Starwright
Mage

Vela the Starwright

She charted every star of a sky that no longer exists, and she's drawing it back one fight at a time.

  • Passive, Asterism: every ability leaves a star for 8s. Nearby stars link with lines of light that hurt enemies who cross them.
  • Starfall (area): a star drops at range after a short delay.
  • Polaris (projectile): a slow orb that leaves three stars behind it.
  • Navigate (dash): blinks to any of her stars.
  • Ultimate, Constellation (area): if her stars close a shape, everything inside is dragged to the center and stunned as a star beast rises. Bigger shape, bigger beast.
  • Signature moment: a five-point star closes around two teams and the beast rises.
  • Counterplay: stand on a star to snuff it and break the shape.
Briar, the Blackthorn Queen
Mage

Briar the Blackthorn Queen

Her garden ate her kingdom, and she let it.

  • Passive, Blight: her damage applies blight, which stacks and spreads to any enemy next to a blighted one, from any team.
  • Thornlash (projectile): a whip of thorns that blights.
  • Bloom (area): a black rose grows, then bursts for damage per blight stack.
  • Root Walk (dash): sinks into the ground and comes up out of any of her roses.
  • Ultimate, Overgrowth (area): a thicket bursts over a big area, rooting everyone briefly and spreading blight to everyone it touches.
  • Signature moment: blight jumps through three teams fighting over one pile of gold.
  • Counterplay: spread out.
Ostium, the Gate Monk
Controller

Ostium the Gate Monk

Last keeper of a monastery built around a door to nowhere. One day the door opened. (Collin's idea.)

  • Passive, Doorkeeper: steps into any of his open rifts to blink to it. Enemies a rift moves are Unmoored for 3s: slowed and taking more damage from him.
  • Shunt (area): after 0.6s a ground rift pulls enemies through and spits them out toward him.
  • Grasp (area): after 0.8s arms reach out of a rift and root everyone inside. The one closest to the center is stunned.
  • Hammerfall (area): a rift opens in the sky and after 1s a giant fist slams down with a knock-up.
  • Ultimate, The Drop (area): the ground swallows every enemy in a big circle. Recast to place the exit high in the sky. They fall, take fall damage and land stunned.
  • Signature moment: The Drop lands a whole team under a Hammerfall.
  • Counterplay: every rift telegraphs, and he has no dash except his own rifts.
Sybil, the Unblinking
Controller

Sybil the Unblinking

An oracle who saw how everyone dies and stopped closing her eyes.

  • Passive, Second Sight: her team sees a faint afterimage of where every visible enemy will be 0.75s from now.
  • Omen (area): marks a spot. After 1.5s it strikes and stuns.
  • Fated (projectile): marks an enemy. In 3s they snap back to where they stood when marked, and are slowed.
  • Foresee (buff): the next stun or root on her is dodged automatically.
  • Ultimate, Prophecy (area): every enemy inside is Fated at once. For 5s they go anywhere, then all snap back.
  • Signature moment: an enemy dashes to safety, then snaps back into the middle of her team.
  • Counterplay: Fated punishes running, so turn and fight.
Sovereign, the Contested Crown
Bruiser

Sovereign the Contested Crown

Every king of his line was killed by the next. The cursed crown floats above his empty helm.

  • Passive, Regalia: builds Majesty while he fights and lives: more size, health and damage. If an enemy champion kills him, they steal the Crown, a big buff that also shows them to every team. Kill the holder to take it back.
  • Proclaim (area): slams his scepter and knocks enemies back.
  • Kneel (projectile): a shockwave that forces the first champion hit to bow, rooted for 1s.
  • Procession (dash): a charge that leaves a royal road behind him, speeding up his ally.
  • Ultimate, Coronation (buff): max Majesty for 8s and unstoppable.
  • Signature moment: the crown changes hands three times in one fight.
  • Counterplay: kite him before his Majesty builds.
Equinox, the Eclipse Knight
Bruiser

Equinox the Eclipse Knight

A knight split down the middle at an eclipse: half sun, half moon. He only cares that it's even.

  • Passive, Balance: hits deal more damage the healthier the target is than him, and heal him more the lower he is.
  • Daybreak (dash): a sun-side lunge that burns.
  • Nightfall (area): a moon-side cleave that slows.
  • Scales (buff): for 3s, damage he takes is split evenly with the last enemy he hit.
  • Ultimate, Equinox (projectile): a beam that swaps health percentages with one enemy champion.
  • Signature moment: nearly dead, he swaps with a full-health carry and wins the fight.
  • Counterplay: at even health he's ordinary. Don't trade with him when he's low.
Penance, the Chained Saint
Tank

Penance the Chained Saint

A giant who swore never to break his chains. So he uses them. A cathedral bell rides on his back.

  • Passive, Shackled: every enemy chained to him takes part of the damage he takes.
  • Bind (projectile): a thrown chain. The enemy is chained to him for 3s and can't move past the chain's length.
  • Anchor (area): slams his chains into the ground and pulls everyone chained to him to that spot.
  • Toll (area): rings the bell. Stuns everyone chained to him and slows everyone else nearby.
  • Ultimate, Last Rites (area): chains burst from the ground and bind every enemy in a big circle to him. He drags them as he walks.
  • Signature moment: he walks a whole chained team into the zone.
  • Counterplay: chains are visible and have a max length. Stay out of Bind range.
Sanctum, the Walking Chapel
Tank

Sanctum the Walking Chapel

When his city burned, the cathedral stood up and walked out, carrying everyone inside.

  • Passive, Sanctuary: his ally can step into his doors and ride inside: untargetable and healing, unable to act. He's slower while carrying.
  • Aisle (dash): charges with his doors open, scooping up his ally or knocking back the first enemy.
  • Stained Glass (area): a window of colored light that shields allies passing through and blocks enemy projectiles.
  • Benediction (area): launches his passenger to a target point, healed, knocking enemies back where they land.
  • Ultimate, Consecrate (area): roots himself as a cathedral for 5s. Allies on holy ground take less damage; enemies are slowed and burn.
  • Signature moment: he carries his low assassin through a fight, then fires them onto the enemy carry.
  • Counterplay: carrying makes him slow. Burst him and the passenger is thrown out stunned.
Nyx, the Moth Queen
Assassin

Nyx the Moth Queen

Queen of a court in the dark between stars. She hunts anything that shines.

  • Passive, Drawn: enemies who cast an ability glow for 3s. She moves faster toward glowing enemies, and her first hit on them crits.
  • Flutter (dash): a short flight that clears low walls.
  • Dust (area): moth dust that shrinks enemies' vision and makes them glow.
  • Wingcut (projectile): a wing-scale blade that flies out and returns.
  • Ultimate, Swarm (buff): bursts into moths for 3s, untargetable, then reforms on any glowing enemy in range for heavy damage.
  • Signature moment: a mage casts their ultimate, glows, and the swarm arrives.
  • Counterplay: play quiet. If you don't cast, you don't glow.
Mab, the Mushroom Queen
Assassin

Mab the Mushroom Queen

Queen of the fair folk. She rules a kingdom the size of a teacup and visits giants in their sleep.

  • Passive, Little Court: each ability changes her size. Small is fast and hard to hit; big hits hard.
  • Shrink (buff): thimble size for 3s, fast and hard to see.
  • Pinprick (projectile): a thrown needle. Crits while she's tiny.
  • Grow (area): bursts to giant size and knocks up everyone around her.
  • Ultimate, Fairy Ring (area): enemies inside shrink for 3s, slowed and weakened, while she grows huge.
  • Signature moment: a tiny mushroom walks into a fight unseen and erupts into a giant.
  • Counterplay: area damage catches her tiny, and she's easy to hit when big.
Cassiel, the Hundred Blades
Marksman

Cassiel the Hundred Blades

The last sword-bearer of a heavenly host. She carries all their swords.

  • Passive, Return: basic attacks are thrown blades that stick where they land.
  • Volley (projectile): a fan of five blades.
  • Recall (projectile): pulls every blade on the ground back to her, cutting through everything in the way.
  • Ascend (dash): leaps backward and drops a ring of blades.
  • Ultimate, Hundredfold (area): a hundred blades rain over an area, then all fly back to her at once.
  • Signature moment: a hundred swords recalled through a whole team.
  • Counterplay: watch where the blades lie; don't stand between them and her.
Prism, the Glass Cardinal
Marksman

Prism the Glass Cardinal

Cardinal of a cathedral made of light. When its windows shattered, she kept the pieces.

  • Passive, Refraction: her beams split into three when they pass through one of her prisms.
  • Lance (projectile): a straight beam of light.
  • Prism (area): places a floating crystal prism, up to three.
  • Glint (dash): flashes from one prism to another.
  • Ultimate, Rose Window (area): a giant stained-glass window opens in the sky. For 5s every beam fired into it rains light across the area.
  • Signature moment: one beam through two prisms becomes nine.
  • Counterplay: prisms can be destroyed.
Aurelia, the Amber Saint
Support

Aurelia the Amber Saint

She sealed her dying city in amber to save it. She still walks out to save people one at a time.

  • Passive, Preserved: allies she heals get a thin amber shell that blocks the next hit.
  • Amber (projectile): an ally becomes invulnerable but can't act for 1.5s; an enemy is stunned for 1s.
  • Stillwater (area): a dome where projectiles slow to a crawl. Allied ones resume at full speed when it ends.
  • Thaw (buff): heals and cleanses an ally and frees them from amber with a burst of speed.
  • Ultimate, Reliquary (area): freezes a big area in amber for 2.5s, champions and shots alike. Her allies inside heal.
  • Signature moment: a Stillwater full of her partner's frozen shots lets go all at once.
  • Counterplay: amber protects but locks the ally in place. Set up around it.
Pharos, the Last Light
Support

Pharos the Last Light

Keeper of the last lighthouse at the edge of the world. Lost ships still find their way home by her.

  • Passive, Beacon: a slow beam sweeps around her, healing allies and revealing enemies.
  • Signal Fire (area): a brazier that heals allies near it.
  • Sweep (area): aims her beam as a cone that heals allies and blinds enemies.
  • Homeward (dash): she or her ally flies along the beam to the other.
  • Ultimate, Lighthouse (area): becomes a lighthouse for 6s, steering a huge beam that heals allies and blinds and slows enemies.
  • Signature moment: the lighthouse sweeps a dark zone and every enemy is lit up.
  • Counterplay: the beam is slow. Flank it and dive her.
Cantor, the Requiem
Summoner

Cantor the Requiem

A choirmaster whose choir sang so beautifully at a funeral that the dead stood up.

  • Passive, Encore of the Dead: when any champion dies near him, from any team, their shade fights for him for 6s using that champion's basic attack.
  • Dirge (projectile): a wave of sound that slows and damages.
  • Lament (area): consecrated ground. Enemies who die on it return as shades for twice as long.
  • Chorus (buff): his shades rush a target point and burst.
  • Ultimate, Requiem (area): raises every champion who died in the last 20s as his shades for 8s.
  • Signature moment: a five-team brawl ends and every fallen champion stands up for Cantor.
  • Counterplay: fight away from the bodies; shades can be killed.

Duo combos

Art direction

Locked: anime ink for in-game models, inked gothic for 2D marketing art.

Locked by Nate on 2026-11-01 after style tests (realistic gritty, painted 3D, gothic ink, carved facets and two hybrids). Concept art is on the BrainDance hub.

Two looks, two jobs

Rules for every champion

For the UE build (later, not a task now)

Style exploration

Anime ink
ChosenAnime ink Chosen for in-game models. Cel shading hides AI mesh noise; outlines read from the MOBA camera.
Inked gothic
ChosenInked gothic Chosen for splash art, loading screen, store page and portraits.
Anime cel
Anime cel Clean and readable, but lighter and less menacing.
Gothic ink
Gothic ink Boldest identity; would need a custom ink shader in game.
Painted 3D
Painted 3D Living oil painting. Moody, forgiving to build.
Carved facets
Carved facets Easiest to build, least detailed.
Gritty realistic
Gritty realistic Great concept art, but noisy as an AI-generated mesh.
Stylized clean
Stylized clean Read as too cartoony.

Concept archive

All 32 brainstorm kits with three design options each. The ones that made the Final 16 are marked.

Brainstorm 1 kits

ostium design options A, B, C
Final 16Ostium three design options
corbel design options A, B, C
Corbel three design options
carom design options A, B, C
Carom three design options
hitch design options A, B, C
Hitch three design options
weft design options A, B, C
Weft three design options
brakk design options A, B, C
Brakk three design options
nadir design options A, B, C
Final 16Nadir three design options
guise design options A, B, C
Guise three design options

Brainstorm 2 kits

gulp design options A, B, C
Gulp three design options
fuse design options A, B, C
Fuse three design options
reprise design options A, B, C
Reprise three design options
cadence design options A, B, C
Cadence three design options
squall design options A, B, C
Squall three design options
tithe design options A, B, C
Tithe three design options
harrow design options A, B, C
Harrow three design options
kiln design options A, B, C
Kiln three design options

The mythic court kits

vela design options A, B, C
Final 16Vela three design options
verdict design options A, B, C
Verdict three design options
sovereign design options A, B, C
Final 16Sovereign three design options
aurelia design options A, B, C
Final 16Aurelia three design options
cantor design options A, B, C
Final 16Cantor three design options
nyx design options A, B, C
Final 16Nyx three design options
cassiel design options A, B, C
Final 16Cassiel three design options
penance design options A, B, C
Final 16Penance three design options

The mythic court, part two kits

sanctum design options A, B, C
Final 16Sanctum three design options
equinox design options A, B, C
Final 16Equinox three design options
mab design options A, B, C
Final 16Mab three design options
prism design options A, B, C
Final 16Prism three design options
briar design options A, B, C
Final 16Briar three design options
pharos design options A, B, C
Final 16Pharos three design options
sybil design options A, B, C
Final 16Sybil three design options
oriel design options A, B, C
Oriel three design options

Maps

No map concepts yet. Cash Brawl needs one arena: a round map about 72 m across with a center platform, cover, spawn pads for five teams and a shrinking zone (numbers in data/match.csv).

Match data

Live from data/match.csv. Nate owns the numbers.

NameValueNotes
TeamSize2Players per team
MaxTeams5
MinTeams3Bots fill until at least this many teams
RoundsToWin3
LobbyCountdown10Seconds
BuyTime15Seconds
RoundMaxTime120Seconds
RoundEndTime5Seconds
MatchEndTime8Seconds
StartGold600
RoundGold250Everyone every round
KillGold150
WinGold300Each member of the round winner
MaxItems6
ArenaRadius3600cm
SpawnRadius2760cm
ZoneDelay12Seconds after the fight starts
ZoneDuration70Seconds to close fully
ZoneStartRadius3750cm
ZoneEndRadius180cm
ZoneDamagePerSecond10
ZoneDamageRamp2Zone damage = DamagePerSecond x (1 + Ramp x close progress) so x3 when fully closed
BaseWalkSpeed600cm per second
MinPlayersToStart1Humans needed before the host can press START (1 so a solo host can start with bots)
ZoneDamageTickInterval0.5Seconds between zone damage ticks
FillBots11 = bots fill empty slots and teams
PadSlotSpacing200cm between teammates on a spawn pad
MaxCopiesPerItem1No stacking the same item: the shop should be a decision
SessionJoinTimeout20Seconds a join may take before the menu says no answer
HostLeaveGrace0.5Seconds the host waits after announcing it is leaving
BotTeammateSpacing450cm a bot keeps from its teammate
BotZoneSafetyMargin350cm a bot stays inside the zone edge
BotZoneLookAhead4Seconds ahead a bot judges the zone radius
BotRethinkInterval1Seconds between a bot rethinking where to stand
BotCoverHoldTime5Seconds a bot holds a cover spot
BotSightRange5000cm a bot looks for a target
BotStuckTime1Seconds with no progress before a bot gives up on a spot
BotFinalRingFraction0.6Ring bots stand on at the close as a fraction of the zone radius
BotAvoidanceRadius300cm ahead a bot looks for other bots to steer around
BotAvoidanceWeight0.50 never gives way to 1 always (keep above 0.3)
BotSidestepDistance200cm a stuck bot steps sideways off a fighter
BotReactionTime0.45Seconds from first seeing an enemy to the first shot (higher is easier)
BotAimErrorDegrees3Random aim error per cast in degrees (higher is easier)
BotLeadAccuracy0.60 aims where the target is to 1 leads perfectly (lower is easier)
BotCastGap0.35Seconds between two casts of one bot
BotHealBelow0.7Heals a teammate or itself below this fraction of max health
BotBuffBelow0.75Uses its defensive buff below this fraction of max health
BotRetreatBelow0.35Below this fraction of max health a bot keeps to cover
BotSelfAreaReach0.75Self area casts only with an enemy inside this fraction of its radius
BotChaseBeyond0.9Chases an enemy farther than this fraction of its basic attack range