About the Project
Inspiration
Most "lesson games" treat the lesson as a lecture between rounds — a didactic dialog box, a moralizing cutscene, or a quiz. I wanted to do the opposite: bake the message directly into the win condition so a player feels the lesson without ever being told it's there.
That's the whole pitch. Three minigames, three digital-civility issues, and mechanics that are the metaphor. I picked Roblox because that's where the audience actually is — kids, teens, and even judges with phones. It runs on any device with no install and zero friction.
What It Does
The game features a central hub plaza with three portal arches and a Gandhi quote stone. Walk under any arch and press [E] to begin:
- DOOMSCROLL TOWER – Climb past floors of distractions (FYP, SHORTS, REELS, comments). Each floor escalates, and the music becomes intentionally overwhelming. Reach the top floor and hold the green TOUCH GRASS pad for 10 seconds. The music flips to peaceful — demonstrating the relief of disconnecting.
- BLOCK PARTY – A co-op experience. A character named FRIEND is being piled on. Every prompt has four reactions: three "trolly" and one kind. The team must vote. Press [E] near FRIEND to reassure them or [F] to wave a bystander in. To win, you must actively choose kindness repeatedly, even when the cruel option seems "funnier." Solidarity isn't passive; it's a vote.
- THE FEED – A two-team territory battle. TRUTH paints a single tile permanently, labeled
FACT-CHECKED ✓orTRUTH RECLAIMED. HYPE splashes five tiles at once with absurd misinformation (e.g.,BIRDS AREN'T REAL), but every claim fades in 25 seconds.- The Logic: Lies spread fast and broad but decay; facts are slower and harder work, but they stick.
Finish all three games, and a Civility Certificate is generated automatically — branded, screenshot-ready, and featuring your avatar and per-map stats.
How I Built It
I developed this solo in Roblox Luau using the $\texttt{--!strict}$ type-checking mode. I used Rojo to enable a professional workflow, allowing me to use VS Code instead of the built-in Studio editor. The toolchain included Stylua for formatting and Rokit for version pinning.
Architecture
The project follows a Service-Locator pattern:
- Server-side: $\text{MatchService}$, $\text{CombatService}$, $\text{SessionStatsService}$, $\text{SprintService}$, and $\text{PartyService}$.
- Client-side: $\text{MatchController}$, $\text{HUDController}$, $\text{PaintController}$, and $\text{WelcomeController}$.
Maps are built procedurally from code ($\texttt{MapBuilders/Hub.lua}$, $\texttt{Tower.lua}$, etc.), ensuring geometry is reviewable in diffs and perfectly reproducible.
Input & Replication
Cross-platform input is handled via $\text{ContextActionService}$ with $\texttt{CreateTouchButton = true}$, providing mobile users with dedicated buttons for THROW / SLIDE / SPRINT. Sprinting detects input type per-press via the $\text{InputObject}$'s $\text{UserInputType}$:
- Keyboard: Hold-to-Shift.
- Touch: Tap-to-toggle.
Animations replicate via the local player’s $\text{Humanoid.Animator}$, ensuring other players see every action seamlessly.
Challenges I Ran Into
- Mechanics-as-Metaphor Design: The hardest part wasn't the code; it was mapping gameplay shapes to civility lessons. Misinformation took the longest. I rejected "shooters" and "Battleship" styles before landing on asymmetric paint. The mechanical advantage of HYPE (5-tile splash) is balanced by its disadvantage ($25\text{s}$ decay), mirroring how misinformation actually behaves.
- Animation Replication: The R6 slide animation kept freezing because the asset was uploaded with a loop flag. While Roblox replicates animation states, I had to force $\text{track.Looped} = \text{false}$ and explicitly call $\text{track:Stop(0.1)}$ to prevent remote players from seeing a frozen pose.
- Demo Timing: To ensure the game is "tasteable" in under 3 minutes, I built a chat-driven admin command set: $\text{/tower}$, $\text{/feed}$, $\text{/win}$, $\text{/grass}$, and $\text{/cert}$. This allows for skipping queues and forcing certificate generation during recorded demos.
- Solo Dev Scope: I cut a fourth game—a 3D social-deduction "Bot Hunt"—because it was too fragile to ship solo. I replaced its slot with a "Quote of the Month" stone featuring Gandhi’s "Be the change" quote, which ultimately better set the tone for the hub.
What I Learned
The mechanics-as-metaphor approach is much harder to design than "message-as-cutscene," but it is significantly more impactful. Players don't remember dialogue; they remember what their hands did. Watching a tile rewrite itself from GORILLAS LAY EGGS to TRUTH RECLAIMED teaches the lesson better than any blurb could.
I also reinforced the lesson that ruthless scoping is the only way a solo developer ships. A polished hub is always better than a broken fourth minigame.
What's Next
- Enhanced Certificates: Adding per-map takeaway lines ("I touched grass," "I chose kindness") so screenshots carry the lesson.
- UI Feedback: Implementing a visible FRIEND mood meter in Block Party to make the stakes feel concrete.
- Analytics: Adding a "Lies Posted vs. Corrected" stat on The Feed's end screen.
- Future Content: Potentially reviving the "Bot Hunt" minigame with a tighter, more stable scope.
Built With
- lua
- luau
- roblox
- rojo
Log in or sign up for Devpost to join the conversation.