Skip to content

Stage 10: a fake crowd

The Pack works. Stage 9 left it with default redeems, an overlay, and a README. What it doesn’t have yet is a way to feel it. You’ve been test-firing events one at a time from the Dashboard, and one bot every thirty seconds is not what launch night looks like.

The Crowd Simulator fixes that: fake viewers redeeming your events at a steady rate, against your real bridge, your real adapter, and a real Zandronum server. This stage ships a scenario file with the Pack so the rehearsal sounds like a Doom crowd instead of a uniform random one.

One new file at the Pack root, crowd.toml:

[weights]
say = 4.0
add_bot = 2.0
gravity = 1.0
fast_monsters = 1.0
[cadence]
rate_per_min = 12
[corpus]
"say.message" = [
"get behind the barrel lol",
"MOON GRAVITY MOON GRAVITY",
"he's one shot trust me",
"rip counter +1 incoming",
"imagine dodging",
"chat is helping :)",
"who bought ANOTHER bot",
"left left LEFT",
]

Two choices worth explaining:

  • Chat dominates. Real crowds talk far more than they spend. say at weight 4 with the effects trailing behind gets the proportions right, and it hammers the handler with the trickiest input surface: viewer text going through your sanitizer into the game console.
  • The corpus is in character. say.message is the event’s viewer-input field, so every canned line arrives exactly like a redemption’s typed text. Generic filler words would pass the schema; these read like chat.

The file is data for the mobrule CLI, not for the Pack. The bridge never reads it, the manifest doesn’t mention it, and shipping it changes nothing at runtime. It rides along in the Pack folder the way a good README does.

Start the game and adapter as usual (the Launcher from stage 2 works), then:

Terminal window
mobrule dev crowd --scenario crowd.toml

Watch what happens at redemption pace: toasts credit ricewaffle and orbofmeat, bots pour in on the effects queue while gravity holds the timed queue, the chaos counter climbs. Press Ctrl-C and the sim prints what it fired. In the Dashboard audit every one of these carries the sim source, so nothing from the rehearsal is mistaken for a real fire later.

Two variations worth trying:

Terminal window
mobrule dev crowd --scenario crowd.toml --chaos 0.3
mobrule dev crowd --scenario crowd.toml --seed 7 --duration 60 --record run.jsonl

The first mixes hostile viewer text into say: exactly the injection attempts your stage-3 sanitizer exists for, now arriving unannounced in a stream of normal traffic. The second records a deterministic minute of chaos you can --replay after any adapter change, which is the cheapest regression test this Pack will ever get.

A Pack is finished when someone else can enjoy it, and “enjoy” includes the streamer’s first look. A shipped scenario means “see what this Pack is like” is one command for anyone who downloads it, and it means you, the author, rehearse with the same crowd every time. When you build your own Pack, write the scenario early. It pays for itself the first time a corpus line breaks your handler before a viewer does.