Making Crawl of the Forsaken: Fate, the Ancient Cave, and a 3D pipeline that fits in a browser tab
· updated June 23, 2026 · 7 min read
By Phil · building Legitsauce
Crawl of the Forsaken is the most technically ambitious thing on Legitsauce, a real-time 3D dungeon crawler running inside a browser tab, and also the most shamelessly nostalgic. It's a love letter to two games a decade and a genre apart, and it exists because I needed a whole bestiary as a team of one and, after an expensive wrong turn, found a way to build it in code.

The two ancestors
Fate (WildTangent, mid-2000s). If you had a family PC back then you might remember it: a top-down action RPG about descending an endless dungeon below a cozy town. Fate got something most dungeon crawlers skip: the town matters as much as the dungeon. Every vendor was a named character. Your pet trotted along beside you and could be packed off topside to sell your loot. That rhythm of descend, fill your bags, come home, kit up, go deeper gave the endless dungeon a pulse. Crawl of the Forsaken borrows that rhythm directly. The basecamp hub is run by named townsfolk, because Fate proved a shopkeeper with a name beats a shop screen.
Lufia II's Ancient Cave. Tucked inside a 1996 SNES JRPG is a 99-floor randomized dungeon that quietly invented half the roguelite genre. Floors reshuffle every run, a sliver of progress carries between attempts, and the descent has fixed checkpoints where you bank what you've got or push your luck. That push-your-luck checkpoint structure is the backbone of my game. Crawl of the Forsaken is 99 floors across 10 biomes with a dragon at the bottom, and portal floors checkpoint your descent. Skip one to save time and the next death costs you double. Skill points you buy between runs stick around forever, so even a doomed run feeds the next one. That's the Ancient Cave formula, and I saw no reason to improve on it.
The problem: 3D is expensive
A 3D dungeon crawler needs models, and lots of them: monsters, weapons, props, vendors, a dragon at the bottom. That's the line item that kills most solo 3D projects, since modeling, rigging, and animation are each a profession of their own. I went down two very different roads trying to solve it, and the second one is what you play today.
The road I didn't take: Meshy
My first plan was to buy my way past the modeling problem. I sketched each monster by hand, cleaned the drawings up with ChatGPT until I had a reference image I liked, then fed those into Meshy, an AI service that turns an image into a textured 3D model. For a solo dev it sounded ideal. It did not pan out.
The models came back dense and stubborn to rig. Once a rig was on, the animations sprayed artifacts: limbs that tore at the seams, joints that caved in, a shoulder that folded backward on a basic swing. Chasing each glitch down burned hours, and plenty of them never fully cleared up. Working alone, I needed art I could push around freely, not a sealed box I had to fight.
Geometry was the next wall. Even on Meshy's low-poly setting the triangle counts ran far past what I'm aiming at, which is low and mid-range phones with a screen full of enemies at once. One detailed hero is fine. Twenty of them swarming you on floor 40 turns into a slideshow.
Then there was the bill. Generating a full bestiary on Meshy climbs into the tens of dollars quickly, and toward hundreds once you count every model I regenerated again and again hunting for something usable. Legitsauce is free and ad-supported, so each of those dollars came out of my own pocket with no real way to earn it back. Between the cost, the rigging headaches, and the geometry, I called it and ate the loss. The Meshy models sit frozen in the repo now, and the game no longer loads a single one of them.

The road I took: procedural geometry
Procedural geometry works the other way around. Each creature is assembled out of primitive shapes in code (boxes, ellipsoids, capsules, cylinders, faceted shards), glued together by a small GDScript helper into a body and then dressed in color and emissive glow. There are no imported model files for the bestiary at all. A creature is a script that draws itself when it spawns. The fidelity is lower, no argument there, but I get complete control and the shapes cost almost nothing to draw.
The hard part was holding onto the variety I had already paid for. So I had Claude walk the retired Meshy roster and rebuild each enemy out of primitives, tracing the original silhouette as closely as plain shapes allow. The rebuilds are rougher and often loose approximations of the Meshy version, but the whole cast survived the move across.

Getting them to look decent took a tight feedback loop. Claude installed Godot locally, rendered each creature under a virtual display with Xvfb, looked at the result with its own vision, held it against a reference image I sent over, and adjusted the shapes until the two lined up. Textures did the heavy lifting. Painting the geometry with real materials in place of flat color hid most of the blockiness and gave every monster a surface that holds up at gameplay distance. That pushed the roster close enough to ship the alpha you can play now. Claude then wired up the animations and verified them in bulk with screenshots, so the rig artifacts that plagued the Meshy models never got a foothold.

What I gave up in fidelity bought a game that runs faster, downloads at a fraction of the size, and animates without a backlog of rig bugs to babysit. The look is rougher for now, and I'll keep sharpening it. The point of the alpha was a cast that reads clearly and holds a steady frame rate on a cheap phone, and procedural got me there.
Making it fit in a browser
The second hard problem is that everything above has to come down the wire before anyone plays. The whole game, every monster and biome tileset and the dragon, has to fit into a payload a phone on hotel Wi-Fi will actually finish downloading. Procedural creatures help enormously here. A monster that lives in code rather than a textured mesh costs almost nothing to download and ships inside the game logic, so there's no per-model texture budget to fight. The engine itself (Godot 4.6 compiled to WebAssembly) is shared across every game on the site and cached after your first visit, so each game only pays for its own content.
Where it stands

Crawl of the Forsaken is live as a playable demo. The core loop is in (descend, fight, loot, fall back to basecamp, spend, go deeper) and the full campaign down to floor 99 is being tuned. Combat already carries the part of Fate I cared most about: monster swings are telegraphed, so a cool head can back-strafe through a wind-up and punish the recovery. Auto-attack mops up the trash while you handle target priority and footwork.
There are still rough edges and outright bugs, and that's where you come in. What I want is a game that captures what made Fate special and stays completely free, with no video ads and nothing to buy. If you play and something breaks or feels off, I want to hear about it. Join the community on Discord, tell me what you ran into, and help steer where this goes next.
Play the demo here, free, in the browser, like everything else on the site.