Inspiration
I like board games because you can see the danger coming, you watch the die land and just deal with it. I like RPGs because your choices actually stick with you. I wanted both at once: a road made of tiles where you can see the skeletons and chests waiting ahead, but a dice roll decides which ones you actually land on. Dying still means something. Your gold's gone, but your gear and levels carry over, so every run still moves you forward.
What it does
You roll a real 3D die and hop that many tiles down a floating road. Each tile is something small: a fight, a chest (sometimes with teeth), a rest-fire you can only use once, or a weird little event with a dice check attached. There are 100 stages split into 5 acts, each with its own boss, and a dragon that flies over the whole game as a shadow before you finally fight it at the very end.
Combat is turn-based, strike, guard, use an item, or flee, and there's a full loot system: weapons, armor, and trinkets with their own special moves, gear sets that light up when you wear all three pieces, and twenty different enemies that each fight differently.
There's also multiplayer: a shared hall where you can walk around with friends wearing whatever gear you've got equipped, and a card game at four tables where you can duel someone 1v1.
How I built it
No game engine, no build tools, just plain JavaScript loaded straight from a CDN, deployed as a static site. Three.js does all the 3D stuff. Sound effects are synthesized live with the Web Audio API. Supabase handles accounts, cloud saves, and the entire multiplayer side, no server code needed for any of it.
The card game syncs between players by having both sides run the exact same simulation from the same starting seed, and only sending which move was made, so there's nothing to keep "in sync" beyond that.
Challenges I ran into
- Three.js recompiles every light in the scene if you add or remove one mid-game, which caused a noticeable stutter. Fixed it by never adding or removing lights, just reusing a fixed set and moving them around.
- 3D character models from different asset packs use totally different animation names, so I had to build a system that guesses "this clip probably means Attack" instead of mapping every single monster by hand.
- Getting the card game to feel instant between two players without a real server took some rethinking. Both sides had to compute the exact same result independently instead of one side being "in charge."
Accomplishments that I'm proud of
A full game, 100 stages, 5 boss fights, a loot and crafting system, and live multiplayer with a working card game, built with nothing but plain web tech and no build step.
What I learned
How much of "3D game performance" is really about not doing things, not adding things, nothan making the fancy stuff faster. Most of the biggest wins came from noticing something was happening every frame that didn't need to be, like recreating lights or trusting a stale bounding box, and just stopping it. I also learned that you can get surprisingly far without a real backend. Supabase's realtime channels handled accounts, saves, and multiplayer, and none of it needed a server I had to write or host myself.
What's next for Tilebound
Right now the game is built mouse and keyboard first, so better touch controls for phonesority. After that, more content: new acts, new gear sets, and more chapters in the story.On the multiplayer side, I'd like to add a ranked ladder for the card game and more things to do together in the Walkers' Rest beyond chatting and dueling.
Built With
- css3
- es-modules
- glsl
- gltf
- html5
- javascript
- postgresql
- supabase
- supabase-realtime
- three-quarks
- three.js
- vercel
- web-audio-api
- webgl
Log in or sign up for Devpost to join the conversation.