Darkwaar 33
Asynchronous Multiplayer
Without a Server
Same seed. Same dark. Different choices.
The question
Players share a simulation history, not a live session.
Procedural generation as shared reference
Player A · V9PNR2 · floor 2
Player B · V9PNR2 · floor 2
Actual generated layout: identical walls, enemies, glints, start and stair.
Player choice is the variable
Deterministic rules make decisions the only source of divergence.
First different action
Deterministic simulation
static func apply(
st_in: Dictionary,
action: int
) -> Dictionary
Combat executes drawn intents.
No RNG calls during play. No Node calls, time, frame delta or engine RNG in rules.gd.
Randomness without drift
static func stream(seed, floor_n, name):
var h = fnv1a32(
"dw33|%d|%d|%s" %
[seed, floor_n, name]
)
return h if h != 0 else 1
static func xorshift32(s):
s ^= (s << 13) & MASK
s ^= s >> 17
s ^= (s << 5) & MASK
return s & MASK
No random stream advances during gameplay.
A small architecture
main.gdInput, screens, rival tracking. Calls Rules.apply().
rules.gdPure state transitions, generation, replay trace and ghost lookup.
board_view.gdReads state and events. Draws animation, intents, ghost and fork.
codec.gdEncodes runs. Imports through Rules.simulate().
Dependency direction ends at rules.gd. The rules never call the view.
Replay as data
Seed K7Q2MX
W resolves as PUSH when an enemy occupies the destination. PUSH is not a separate encoded action.
static func simulate(
seed: int,
actions: PackedByteArray
) -> Dictionary
No video recording. No saved state snapshots.
Portable run codes
SW1-04V9P-NR2B5-…
Abbreviated for display. This fragment is not importable.
Crockford base32
Uppercase, copyable, tolerant of O/0 and I/L/1.
hi = actions[i] & 15
lo = actions[i + 1] & 15
byte = (hi << 4) | lo
Replay validation
Consistency check, not cryptographic anti-cheat.
The rival ghost
The ghost never mutates your world.
Decision comparison
The fork identifies a decision, not merely a score difference.
Rules.first_split(mine, theirs) returns the first unequal action index, or −1 while one run remains a prefix.
Infrastructure avoided by design
Trade-off: no opponent discovery, global leaderboard or authoritative anti-cheat.
Conclusion
Darkwaar33 — Seedwake
darkwoodcom.itch.io/darkwaar33Same seed. Same dark. Different choices.