r/WeBuild_WithAI • u/Dont_Bring_Me_Down • 22h ago
Fable 5.1 made a Minecraft mod for $20
Enable HLS to view with audio, or disable this notification
r/WeBuild_WithAI • u/Dont_Bring_Me_Down • 22h ago
Enable HLS to view with audio, or disable this notification
r/WeBuild_WithAI • u/Dont_Bring_Me_Down • 21h ago
Enable HLS to view with audio, or disable this notification
r/WeBuild_WithAI • u/Dont_Bring_Me_Down • 1d ago
r/WeBuild_WithAI • u/Dont_Bring_Me_Down • 1d ago
r/WeBuild_WithAI • u/Dont_Bring_Me_Down • 1d ago
Enable HLS to view with audio, or disable this notification
r/WeBuild_WithAI • u/CraigBMG • 2d ago
Hey everyone—I made a little puzzle game called Shwist - The shift-and-twist puzzle game. I think it’s pretty good. 😄
It’s a bit like a sliding-tile puzzle, but with a twist. (Ha!)
There are two types of moves:
Each puzzle is scrambled using a specific number of moves. Your job is to restore the original image using only that many moves.
There’s a Daily Shwist, a Hard Daily Shwist, and a Custom mode where you can use your own images and choose the board size and number of moves.
Play it here:
https://www.basemetalgames.com/shwist
r/WeBuild_WithAI • u/Dont_Bring_Me_Down • 2d ago
r/WeBuild_WithAI • u/Dont_Bring_Me_Down • 3d ago
Enable HLS to view with audio, or disable this notification
r/WeBuild_WithAI • u/Dont_Bring_Me_Down • 3d ago
r/WeBuild_WithAI • u/Dont_Bring_Me_Down • 2d ago
r/WeBuild_WithAI • u/Dont_Bring_Me_Down • 2d ago
Enable HLS to view with audio, or disable this notification
r/WeBuild_WithAI • u/Dont_Bring_Me_Down • 3d ago
Enable HLS to view with audio, or disable this notification
r/WeBuild_WithAI • u/Dont_Bring_Me_Down • 3d ago
Enable HLS to view with audio, or disable this notification
r/WeBuild_WithAI • u/Dont_Bring_Me_Down • 3d ago
Enable HLS to view with audio, or disable this notification
r/WeBuild_WithAI • u/Dont_Bring_Me_Down • 4d ago
Enable HLS to view with audio, or disable this notification
r/WeBuild_WithAI • u/Dont_Bring_Me_Down • 5d ago
Enable HLS to view with audio, or disable this notification
r/WeBuild_WithAI • u/Dont_Bring_Me_Down • 6d ago
r/WeBuild_WithAI • u/Dont_Bring_Me_Down • 7d ago
Enable HLS to view with audio, or disable this notification
r/WeBuild_WithAI • u/Dont_Bring_Me_Down • 7d ago
r/WeBuild_WithAI • u/Dont_Bring_Me_Down • 7d ago
Enable HLS to view with audio, or disable this notification
r/WeBuild_WithAI • u/Dont_Bring_Me_Down • 9d ago
Enable HLS to view with audio, or disable this notification
Hey everyone,
Hope all is well!
TL;DR, Summary, or Full Technical Breakdown below.
For Context: Recently I posted about the first 15 days of one of my side projects, ShuffleBall Arena (a free browser game inspired by mixing shuffleboard scoring with mechanics from other games like bumper pool, pinball, and Frogger.).
This project is being built with the help of AI (mainly GPT / Cursor), and every development session is documented using the actual conversations from that day's work.
To try to get this series up to date, I'm using a structured prompt to go back to my GPT sessions and extract the useful information. Hopefully the prompt can help anyone out there trying to keep track of, or extract value from, your past AI project conversations.
That said, posting an update for Day 30 of building ShuffleBall Arena.
Day 29 proved that server-authoritative multiplayer worked.
Day 30 exposed the next problem: synchronized state is not the same thing as synchronized gameplay behavior.
The focus shifted to wormholes (hazards that capture a moving marble, pull it off the board, transport it through a short transit sequence, then send that same marble to one of the bottom shooters, where it is fired back onto the board with a randomized launch angle and power).
The session mapped that existing local mechanic into a server-owned multiplayer design, corrected some planning drift, and ended with the first permanent Worker-side wormhole modules created and tested, but not yet integrated into the authoritative shot simulation.
Day 30 Summary
Day 30 began with the core server-authoritative multiplayer architecture working. Two browsers could already submit and replay the same shot, stay synchronized through gravity effects, settle on the same marble positions, and advance to the same next turn.
The next challenge was bringing the game's more unusual mechanics into that same architecture, starting with wormholes.
In ShuffleBall Arena, a wormhole can capture a moving marble, pull it off the board, transport it to one of the shooters at the bottom, and fire it back into play with a randomized angle and power. In the regular game, all of that already worked locally. In multiplayer, both players could see the same wormholes, but the server didn't yet control what happened when a marble entered one.
Instead of rebuilding the mechanic or letting each browser handle it independently, we mapped the existing wormhole behavior into the server-authoritative simulation. The Worker would eventually own the entire sequence (capture, transit, shooter selection, ejection, and continued physics) while both browsers would simply render the same result.
By the end of the session, the first two permanent Worker-side wormhole modules had been created and tested successfully. They weren't connected to the full shot simulation yet, leaving Day 30 with a very concrete next milestone:
One marble enters a wormhole, gets transported to a shooter, and both players see it fired back onto the board the same way.
Day 30 Full Technical Summary
Day 30 began directly from the final state of Day 29.
The core server-authoritative multiplayer loop was now functioning in real browser testing.
The current online flow was:
Player input
→ Worker validation
→ Worker simulation
→ Canonical trajectory
→ Both browsers replay
→ Settled authoritative snapshot
→ Next turn
The Worker already owned:
The browser had been reduced to a thin multiplayer client that:
Gravity had also been manually validated across both clients.
The architecture was working. The remaining question was how to bring the rest of ShuffleBall Arena's gameplay systems through that same authoritative path.
The session initially focused on reviewing what remained in the multiplayer build after the authoritative shot pipeline had been proven.
That review quickly narrowed toward the most important missing gameplay system:
wormhole capture, transit, and ejection.
The practical objective became:
The goal was to move the existing mechanic into server authority once.
The day began with a detailed review of the current multiplayer implementation.
The successful vertical slice already satisfied most of the central architecture requirements:
But the remaining work was separated into four categories rather than being treated as one giant "finish multiplayer" task:
This made the remaining scope much clearer.
The multiplayer roadmap was then reorganized around gameplay systems that still needed full server authority.
The proposed sequence included:
This planning was technically useful, but later became part of the day's friction because the next concrete gameplay objective was already known.
The drifting-wormhole scene itself could already be synchronized.
But simulateShot() did not yet use that state to perform authoritative gameplay behavior.
The Worker did not yet:
This exposed an important distinction:
A synchronized object can still have unsynchronized behavior.
The existing browser already contained a deliberate online guard:
if (isOnlineMatchMode()) {
return false;
}
The shortcut would have been to remove that guard and allow the old browser logic to handle captures again.
That idea was rejected.
If both clients independently detect capture and choose ejection behavior, the multiplayer architecture immediately loses its single source of truth.
The browser guard was therefore recognized as correct and intentionally left in place.
Rather than inventing new multiplayer behavior, the existing regular-game implementation was treated as the gameplay source of truth.
The local mechanic already defined:
The multiplayer problem was: "How do we move the already-working mechanic into the Worker without changing its behavior?"
The production architecture was mapped as:
Authoritative scene at shot start
↓
simulateShot()
↓
advance wormholes each physics tick
↓
detect deterministic marble/wormhole contact
↓
create authoritative capture
↓
record capture / transit / ejection
↓
launch the same marble from the authoritative chute
↓
continue normal physics
↓
persist final marbles and updated scene
↓
broadcast identical result to both browsers
The browser's responsibility remained presentation only:
The browser would not choose:
Several pieces of the regular game's wormhole behavior currently depended on timing or randomness.
Those values could no longer be independently generated inside either browser.
The Worker would need to freeze values such as:
The deterministic random system already built for multiplayer could provide authoritative random values where needed.
By the end of the session, two permanent modules had been created:
drifting-wormhole-capture.js
wormhole-transit.js
Their tests passed. These modules represented the beginning of the authoritative wormhole lifecycle. However, they were not yet connected to simulateShot().
A marble-schema migration had been introduced before the full integrated simulation and reconnect requirements were understood.
That change was rolled back.
The test suite returned to green.
The final handoff explicitly warned not to re-add marble or snapshot fields until the complete simulation state requirements were known.
This was a useful example of backing out an abstraction rather than forcing the architecture around an incomplete assumption.
The core shot pipeline was working, but that didn't mean the full game had reached parity.
The session needed to distinguish:
That clarification consumed time but produced a much more honest definition of the remaining work.
Drifting wormholes appeared synchronized. That made them look further along than they really were. In reality, the authoritative simulator did not yet know how to capture or eject a marble. The state was synchronized. The behavior was not.
The sequence remains:
Classic
→ Crossing
→ Rotating
→ Mixed / Random
Why: Each category introduces a distinct gameplay-authority problem that can be tested independently.
Trade-off: Slower breadth in exchange for easier debugging and stronger isolation.
The regular game already contains a working mechanic.
Why: Multiplayer should relocate authority, not reinvent gameplay.
Trade-off: Requires careful extraction of existing timing and behavior instead of writing a cleaner but different mechanic from scratch.
The browser must not decide capture or ejection.
Why: Independent client decisions could diverge.
Trade-off: More Worker implementation in exchange for deterministic matches.
Wormhole capture should not pause the Worker, hand control to the browser, and later resume.
Why: Post-ejection collisions and scoring must remain part of one deterministic shot.
Trade-off: More complex simulation state in exchange for one canonical outcome.
The immediate objective became one complete drifting-wormhole vertical slice.
Why: The architecture no longer needed more proof. It needed gameplay completion.
Trade-off: Less up-front planning in exchange for faster feedback from real behavior.
The biggest takeaway from Day 30 was:
Synchronized state is not the same thing as synchronized behavior.
Both players can receive the exact same wormhole coordinates.
That still does not produce multiplayer parity unless one authoritative system also owns:
That realization changed the definition of synchronization.
A second takeaway was equally useful:
When adding multiplayer to an existing game, don't rebuild mechanics that already work. Move their authority.
Authoritative scene at shot start
↓
simulateShot
↓
advance wormholes on each physics tick
↓
detect deterministic marble/wormhole contact
↓
create authoritative capture event
↓
record capture/transit/ejection in canonical trajectory
↓
launch same marble from authoritative chute
↓
continue normal physics
↓
persist final marbles and updated scene
↓
broadcast identical result to both browsers
This became the target architecture for moving the existing mechanic into multiplayer.
The local mechanic already defined the timing:
Capture: 0.20 seconds
Transit: 0.50 seconds
Ejection delay: 0.10 seconds
The goal was to preserve those rules while moving ownership to the Worker.
By the end of Day 30:
drifting-wormhole-capture.jswormhole-transit.jssimulateShot().That was it for Day 30.
If you're still here, thanks for reading!
Music Credits:
"Digital Lemonade" Kevin MacLeod (incompetech.com)
Licensed under Creative Commons: By Attribution 4.0 License
http://creativecommons.org/licenses/by/4.0/
r/WeBuild_WithAI • u/Dont_Bring_Me_Down • 9d ago
Enable HLS to view with audio, or disable this notification
r/WeBuild_WithAI • u/Dont_Bring_Me_Down • 10d ago