Skip to content

About

A cozy 3D fishing-market tycoon game in a single HTML file (three.js)

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

Floe Market

A cozy 3D idle/tycoon game for the browser, in three stages. Stage 1 is a fish market: catch fish from the ice, sell it at a walk-up counter and upgrade the market. Stage 2 rebuilds it as Floe Sushi, a conveyor-belt sushi restaurant with rice terraces on the hillside, which you grow until the whole chain runs itself. Stage 3 (still being made, and not open to players yet: see Feature flags) goes underground: Mr. Fugu, a shady pufferfish in a trench coat, cuts you into his illegal sumo ring in the cellar under the dock. It's fight night: you cook chanko for the fans, and each boss who walks in with his crowd is beaten by turning his whole crowd with bowls before the bell, until you can buy back all of Mr. Fugu's chips.

Play

Play it at https://chefcontrol.github.io/floe-market/, or run it locally:

npm install
npm run dev
  • Loading: a loading screen shows the game's scripts coming in, megabytes so far out of the total (about 1.3 MB, or 380 kB over the wire compressed: there are no image files to fetch, and the only sound files, recordings of the ring's crowd and the casino yacht's room tone, come later, when they're first needed), then stays up while the world is built, until the first frame is drawn

  • Move: drag anywhere (touch or mouse) for a virtual joystick, or use WASD / arrow keys. The first time on a device, a small card below the player shows how, how to buy, and how to throw things away at a bin (a finger on the joystick on phones and tablets, the keys on a computer, going by the browser's user agent); once you've walked a little it shrinks away into the ⚙️ settings gear, where Controls brings it back

  • Bins: beside the places things are picked up, to throw away what you're carrying: steel kitchen bins by the fish pile on the dock, by the farmer's rice stack and the rice patch on the farm path (stage 2), and, down in the cellar (stage 3), open oil drums in the hearth room and by the fish circle in the prep hall. Stand at one and press E (on a touch screen, tap Toss)

  • Tutorial (stage 1): a new player is shown the market one idea at a time, each when it first matters. A gold arrow bobs over where to go, with a gold ring on the ground under it and a bubble saying what to do there; while that spot is off-screen, the bubble waits at the edge of the screen with a gold tail pointing the way. First the loop, in order: stand on the 🎣 pad to fish, pick up the slices from the pile, drop them on the counter's 🐟 pad, and collect the cash. Then buying, cheapest first: Bigger arms ($30), a level at the 📈 Upgrade square ($40), and the auto harpoon ($90). Each is a goal: a message says what's next ("Next goal: Bigger arms, $30"), and a chip under the HUD shows it with the cash so far and a bar filling up, turning gold once there's enough. Then the arrow leads to it: on a tile, "stand on it and hold E" (or Buy on a touch screen, going by whether the Buy button is in use); on the Upgrade square, which is learnt by buying a level there, "tap" or "click one in the list". Anything bought ahead of its turn counts. When a tile that needs a better rating comes on offer, a tip says what it needs, with the ★ in the HUD pulsing, until it's been in view for 9 seconds. Each idea is learnt by doing it, and the arrow steps aside while you stand where it points (except where you buy, where what to do needs saying). The last of the basics (usually the harpoon) brings up a banner with confetti for 4 seconds: Well done, Tutorial complete, and under it "The rest is up to you. Go make it big!" The rating tip is for later and doesn't bring it back. A player never sees an idea twice: what they've learnt is kept on the device, so Restart doesn't bring it back, and in the save, so it follows a signed-in player to their other devices. Saves from before the tutorial count what they've already done: anything bought means the loop, buying and the harpoon are known (a save since keeps its own lessons, so reloading mid-tutorial skips nothing)

  • Settings (⚙️, top right), in four groups. You: sign in for cloud saves, and Your look (below). Graphics & sound: Graphics (below), which opens into Auto, Low or High and shows the choice on its row, and Sound, which opens into the effects, the ambience and the music, each with a mute button and a volume from 1 to 10 (7 is the game's mix; each step is about 2 dB), remembered on the device. Game: Controls, which opens into How to play (the controls card) and a switch for the Buy button on screen (on unless turned off, kept on the device), and Restart. About: Report a bug or idea (see Reports); Buy me a coffee, which opens the game's Ko-fi page in a pop-up window of its own (a new tab where pop-ups are blocked), so the game stays put; and last, Credits & Copyrights, which opens into the notices for the music and sound. Like Sound, Controls, Graphics and the credits each open and close with a click. While the menu is closed, a dot on the gear shows the cloud's state. After 10 minutes of play on a device, a toast says once where Buy me a coffee is and the gear pulses, unless the player has already found it

  • Your look (👕 in the settings): dress the player from the crowd's wardrobe, free: a man's or a woman's build, six skin tones, eight hair colours and cuts (short, a quiff, curls, bald on top, long, a ponytail, a bun or a bob), a cartoon face the way PEAK does them (eyes: dots, round, sparkly, happy ^^, sleepy, lashes, angry brows or a wink; a mouth: none, a smile, a grin, the tongue out, an "o", flat, a smirk or a frown), a moustache, beard, goatee or earrings, glasses, rosy or freckled cheeks, and the colours of your top, trousers, skirt (worn in spring and summer) and shoes (snow boots in winter). Anyone can wear anything; 🎲 mixes up a whole look the way the crowd's are. While the panel is open the camera comes down in close for a head-to-toe look (rising higher if a wall or a counter is in the way), the player turns to face it and tries the look on in spring clothes with nothing on their head, so the hood or a hat doesn't hide it; walking off or Done puts the season's clothes back on over it. The look goes with the save (and to the cloud, for players who sign in), and stays on the device through a Restart

  • Fish: stand on the 🎣 pad to hook fish; they get chopped into fish slices automatically

  • Sell fish (stage 1): pick slices up from the pile, drop them on the counter's 🐟 pad, and walk over the cash to collect it. Walk-in customers pay $4 a slice; once the drive-up window is built, drivers on the road buy 4–8 at a time at $6

  • Upgrade: stand on a price tile (the squares) and hold E, or the Buy button that comes up at the side, to pay into it. On a computer the button can be turned off under Controls in the settings; on a touch screen, with no E, it's always there. Stand on one for 2 seconds without buying and a reminder says how. Squares are for buying (the tiles, and the Upgrade squares' menus) and circles for doing something (fishing, dropping things off, the casino's games). The tiles lie square with the world, with their icon and price turned to face the camera. Some tiles also need a star rating (see below). The chip under the rating shows the stage and how many of its upgrades are built

  • Graphics (✨ in the settings): Auto, Low or High. High draws the whole world the way the people are drawn: low poly but rounded, with the small details (the rounded, dressed-up people under Seasons, below; real deck boards, lashed log fences and pilings, fish stalls with crushed ice, a tiled restaurant with a torii and stone lanterns, dry-stone terraces, her house with siding and shutters, and every machine, sled and campaign in the same style). The sea rolls in low-poly facets that glint, foam laps the shore and rings the floes and posts, the paddies and the hot spring ripple, cloud shadows drift over the ground, shadows have soft edges, and roofs, posts and fences get snow in winter, the deck petals in spring and leaves in autumn. Little effects mark the moments that matter: a splash when a fish is pulled out, chips off the board as the cleaver comes down, coins hopping up when cash lands in your pocket and a glint where a customer pays, gold sparkles round a tile when an upgrade is bought, smoke from her chimney and steam from the rice cookers. Low draws everything as it was before all this: block-limbed people, a flat sea, plain boxes and logs, no effects, and the renderer is lighter (a shadow map half the size with hard edges, and no more than one and a half pixels a point). Either way, whatever stands still is drawn merged with its neighbours, so the scenery takes a few draw calls instead of one for every post and plank, and the icons on the floor tiles, pads, signs and menu tags are drawn in the game's own style rather than taken from the phone's emoji, so they look the same everywhere. Auto, the default, lets the game pick, and shows under the choices which one it's using: it starts each visit on High and watches the frame rate, and if that stays under 45 a second for six seconds (not counting the first few seconds, or a pause while the tab is hidden), it drops to Low for the rest of the visit. Choosing Low or High stops that; choosing Auto again starts over on High. The choice is kept on the device. On Low, the look panel leaves out cheeks and shoes, which Low doesn't draw

  • Upgrade square: each stage has a 📈 Upgrade square (by the counter in stage 1, by the kitchen line in stage 2, and in stage 3 a 🔨 Craft square at the crafting bench in the cellar's workshop, which sells every room's upgrades too). Stand on it to open the stage's repeatable upgrades and tap one to buy its next level: a better product (prices), marketing (customers) or the crew (speed). The list in the top left shows every modifier in play as a percentage, with your rating counted into Customers (it brings them in ×0.6 at ★1 to ×1.4 at ★5); tap the stage chip to fold it away or back (on phones it starts folded, so the HUD leaves the game in view). Every level shows in the world too (see Economy)

  • Fertilizer shed (stage 2): once the takeout kiosk opens, a little thatched storehouse like the farmhouse goes up on a plank deck off the south end of the farm path, by the water wheel, with a green noren over its door and a lantern that glows at dusk. Stand on its 🌿 square to buy rice fertilizer: compost, then fish meal, then spring minerals, each making the terraces ripen half as fast again ($20,000, $40,000 and $80,000; all three make rice grow 3.4 times as fast). A labelled sack of each one bought lies on a pallet beside the shed, and the HUD's list shows it as Rice growth

  • Stage up: with all nine market upgrades built, a gold 🏯 tile appears in the middle of the dock: Open Floe Sushi, $12,000. Paying it off plays the stage-up: the counters and the south fence come down, the restaurant, its garden and the terraces go up, and day turns to dusk. Cash, rating and upgrades carry over; the counters' leftover fish and cash move to the restaurant, and Korki's statue moves to the garden (the casino boat stays where it is)

  • Rice (stage 2): it grows on the terraces west of the restaurant, out through the farm door. The restaurant opens with a small patch of six clumps by the door, which ripens (green to gold) in 15 seconds: just enough for the first customers at a five-star rating, and no faster with upgrades, so more customers need the rest of the terrace. Each planted terrace grows a set amount, ripening in 30 seconds, a little less than the next step of the restaurant (more seats, another chef) eats; upgrades don't speed it up, so planting more terraces is how the restaurant grows, until all three are planted and the fertilizer shed opens. Wade through ripe rice to harvest it, or take bags off the farmer's stack on the path. Fish the kitchen has no room for go back to the pile as you harvest, to make room in your arms

  • Make sushi: drop fish slices on the 🐟 pad and rice on the 🍚 pad at the kitchen line facing the dock. Your arms carry both at once. The cooks there toss them to a chef inside the bar, who makes a plate (a bag of rice makes two) and puts it on the belt circling them. Once the takeout kiosk is open, the chefs also pack boxes for it, keeping a few ready When the chefs stand idle for want of fish or rice, the cook at that pad holds up a bubble asking for it (🐟? or 🍚?)

  • Sell sushi: diners in their evening best come up the garden path and through the red gate, sit at the bar, take plates as they pass, and pay $30 a plate at the register by the gate when they leave. Once there are garden tables, some sit out under the red parasols instead: the chefs put their plates on a serving counter by the gate, and a waiter carries them over on a tray, up to four at a time. Waiters never take plates off the belt, and they're only for show: a garden diner stops waiting once their plate is made. Drivers buy 3–6 boxes at a time at the kiosk on the road ($35 a box); their cash lands just inside the east wall

  • Mr. Fugu (end of stage 2): there's always been a shut hatch in the dock, out by the water; once Floe Sushi is fully built and the till passes $1,000,000, someone starts knocking under it, with a ❗ over it and an arrow pointing the way. Walk up to it and the lid lifts a crack: two eyes in the dark under it, and a whisper ("Psst. Chef. Want real money? Come back tonight."). Wait for nightfall and night falls over the dock, with a moon over the sea, stars and the lighthouse turning; then the hatch is shoved twice from below, bursts open in a flash and a wall of smoke, and he rises out of the light on his lift, a black shape till the light from above finds him, and the camera comes round over the chef's shoulder as he looks them in the eye, the moon over his. While he's on, the world holds still: nobody hauls, fishes, drives or eats till he's gone. (Not now leaves the hatch knocking: walk off and come back to it.) Then he makes his offer, and makes it clear it isn't legal. Answer with a tap: Deal me in puts a gold 🐡 tile by the hatch (Buy into the ring, $1,000,000), and Not today leaves the hatch on the dock (walk off, then stand on it to hear him out again, that night again: he comes out once a visit), and day comes back. While he's on, the rest of the game goes quiet: only his voice, his bass and his effects play

  • Fight night (stage 3): paying the buy-in takes you down the hatch to the cellar under the dock: rooms side by side, with thin walls between them, dug into the earth. Every wall round a room or between two is the same waist-high wall under a timber rail, so you see into every room over the ones in front, and the earth outside comes up level with the rails. As in the dungeons of a game seen from above, the rooms are the only lit places down there, and none of their light reaches the rock outside: each room is rimmed by a kerb of rough-cut stone just past its walls' rails, so where it stops reads at a glance, and past that there's only rough broken rock with boulders lying on it, just made out by the wall and gone into the dark a few metres out (the grow room's place too, while it's a secret). In front of the rooms, toward the camera, the rock rises in a broken slope with dark crags on it, framing the bottom of the screen, though never high enough to hide anything in a room, so there's no edge to the world, only the lit rooms in it. Only along the very back do the walls go up high, all to one height under a timber cap: the dock's piles behind the arena (north and west), Mr. Fugu's own wall behind his office and, once it's found, the grow room's back, with the earth banked up behind them to their tops. Every doorway's frame is as high as the next, the fans' tunnels' too. You land at the foot of the ladder, on the landing. The arena is to the west (the ring, a back-alley pit: rice bales stacked two high and roped into a square, packed dirt on top with the ring marked by an old ship's hawser, 河豚 spray-painted in a corner beside a chalk puffer and tallies, pallets for steps east and west, a green dish lamp hung over the middle, a chain cordon on steel posts round its foot and a NO REFUNDS sign; the stands, the soup bar by the hearth room's door, a wall of straw-wrapped sake barrels beside it, the gong and the cashier's window), Mr. Fugu's office is to the north, the hearth room (the big pot, its ledge, and the bowl counter in the corner south of the prep hall's door, out of everyone's way, its circle a small one right against it, so only walking up to the counter picks bowls up) to the south, and through a doorway at the west end of its south wall the workshop (a daiku's heavy low crafting bench, where everything down here is bought, its 🔨 Craft square straight ahead through the doorway, with a plane, a pull saw, chisels in a tray, a mallet, an ink pot and a whetstone on it, and over it a rack lashed with rope, hung with a long saw, a square, a hammer, a coil of rope and a straw hat, and a 火の用心 notice; a tansu chest with black iron fittings, fish crates branded 魚 under the sign, straw-wrapped sake barrels, timber with a net hung to dry over it, a beam being cut on two trestles in its shavings, coils of rope, a heap of net with its glass floats, a bucket for the whetstones, and a short noren and a red lantern at the door) and the prep hall (two dumbwaiters down from the restaurant's kitchen, one for rice and one for fish slices, in a small lift room of their own behind the east wall where nobody walks, each tipping its trays at a hatch onto a wooden chute, planks between bamboo rails lashed with straw rope, down which they slide into the store by the wall (a banded cedar tub for the rice, a slatted crate on crushed ice and salt for the fish, each with a board brushed with 米 or 魚), which keeps a hinoki tray at its foot full; you take from it standing at its circle on the hall's side, peeking out under the wall, so only walking right up to the wall picks anything up; the drying racks along the back and the salt barrels along the front; and across the back, a stone wall with a padlocked iron gate). Every place you work has a marking on the floor, and the walls stop you at their face, a body's width out. Down there, nothing up in the world is heard (only the ring's crowd comes up through the floor) or drawn (it's all still running, just not drawn while you can't see it), and the seasons turn without news. Stand on the open hatch, or at the foot of the ladder, to climb up or down. The restaurant upstairs carries on by itself (see the front, below). Money down here is Fugu Chips (🐡, $1,000 a chip, the same wallet), and the HUD's 💪 is how many fans you fed in this fight's preparation, a local's or a boss's (it starts again from 0 with the next fight)

    • The kitchen: take rice and fish from the trays over the east wall, standing at their circles against it (only as much as the racks or barrels have room for), put them in a drying rack or a salt barrel (six in each, ten once upgraded; ready after 8 seconds; the racks and the barrels each have one spot to stand on, in front of the first while there's one and moving along to the middle of the row as more are built, and from it every one of them is filled and emptied, the nearest first; with full arms, ready ones swap out one for one for raw ones going in), and carry the ready ones to the pot: four of each (and four mushrooms, once there are mushrooms) make 20 bowls, cooked while you stand there. The pot, the counter and the soup bar each hold their own bowls: a batch goes into the pot (it holds two batches), which ladles them out one at a time, flying onto the bowl counter (which holds 40), its stew going down with each; you carry them from the counter to the soup bar. A flap at the south end of its west counter, by the wall, lifts when you walk right up to it (its top on a hinge, the half-door under it swinging back), so you can step straight through between the arena and the inside of the bar; it shuts behind you, and nobody else uses it. A tag on the pot's front says how many bowls are in it. The fish come down as the market's own blocks of bluefin tuna fillet, lie in the salt, and come out cured brown. Carry the bowls from the counter to the soup bar in the arena: a round counter of old barrel staves in iron hoops with a battered zinc top, a straw rope and a cigarette-burnt indigo cloth under its lip, upturned buckets and a crate for stools, its own pot of chanko steaming in the middle (while there's soup out), and over it a cartwheel of red and paper lanterns hung from a crooked post with the price board nailed to it. You stand at the hatch on its side by the hearth room's door (its flap lifted, a crate of beer inside) and set the bowls out round its top (it holds 30). The pot shows a bubble for what it's waiting on, and the soup bar one when fans are waiting and it's dry
    • Every fight goes the same way, about every 47 seconds. The fans buy soup (20 seconds): as many as the seats and word on the street bring come in through the tunnels behind the arena's back walls (the last of them by 12 seconds in) and crowd the floor round the soup bar, and nobody's served before they've walked up to it (about 6 seconds from the tunnel; anyone slower hurries). Each one who gets a bowl steps up to a free spot at the bar for it, a spot of their own all round it (never on the hatch's side: that's yours), pays for it (Mr. Fugu keeps 30%), turns your orange and goes to sit on the champion's side: on the stands' cushioned benches first, then on the floor round the ring. They take their seats (5 seconds): the ones who didn't eat give up and go home, while the wrestlers crouch. The fight (15 seconds), which your champion always wins against a local: it's the free show between boss nights. Then the result, and the fans go home. Boss nights are fought differently (the gong, below). The fans are the low life who come down for a fight, yakuza in sharp suits and hooligans in tracksuits, made like the game's people; they walk round the ring, the stands and the soup bar, each at their own pace, look about while they queue, sit down properly, stand up for the charge and cheer in bursts, and shout things in speech bubbles ("Where's the chanko??" at an empty bar). The seasons don't reach the cellar: nobody down there changes clothes
    • The gong: stand on its 🔔 pad and its panel puts your champion against the next boss, as a TV sumo broadcast would (their faces, rendered from their own models, in orange and purple either side of VS), with what he brings in chips (👥 his crowd, 🔔 his bell, 🐡 his prize) and your chances in a word on a red seal: Win, Likely win, Maybe, Likely lose or Lose. That's worked out by playing his preparation ahead with you and your crew in it, from where you stand and with what's in your arms, and goes by how many of his fans it turns against the more than half it takes (120% or more a win, from 100% likely, from 85% maybe, from 60% likely lost). No numbers: you find out for yourself whether you ever had a chance. Ring it whenever you like (E, or the button): no fee, no luck. A banner walks him in (入場, his name and crowd, and how many to turn to win). His crowd comes in through the tunnels in his purple, and once they're all round the soup bar (about 6 seconds, while your kitchen keeps cooking) his bell starts, and every bowl on the bar turns one of them to yours (each steps up to a spot at the bar for it, and turns your orange there); then they sit on either side, and the fight is a tug of war between them. A strip along the top of the screen follows it all: the two faces, the fans each way, his bell counting down, a rope in their colours with his goal marked on it, then FIGHT! and the knot pulled one way or the other. Turn more than half of them and he goes over the rope. After, a card stamps the result: 勝, YOU WIN, the prize and one line of what's new; or 負, how many you were short by and the one thing that cost it (the pot waiting on an ingredient, the soup bar standing empty, or a kitchen too slow for his crowd). The five bosses are Hakkaku 🐙 (160 fans), Yokobashiri 🦀 (300), Dobu 🐟 (448), Samehada 🦈 (730, with a 45 s bell) and Fukure 🐡 (1,080, with a minute's bell), and each one beaten opens more of the cellar. Each is a sea creature taken from his name, built on the same jointed body as your champion so he wrestles the whole fight: Hakkaku (八角, "eight corners") an octopus with tentacles for arms and four more under his belt, who squirts ink at the straw and when he lands; Yokobashiri (横走り, "running sideways") a crab with a spiked shell, eyes on stalks and one huge claw, who walks in and off sideways; Dobu (どぶ, "the gutter") a namazu, the mud catfish whose thrashing shakes the earth, with swaying whiskers and a slimy hide, whose stamps shake the ring; Samehada (鮫肌, "shark skin") a scarred shark with a grin of teeth and a tall back fin; and Fukure (膨れ, "swollen"), Mr. Fugu's own champion, a scowling porcupine puffer who blows up into a ball of spines for the glare, the charge and whenever he's winning, and goes down like a balloon when he's beaten
    • The grow room: beating the first boss opens the iron gate in the prep hall's low stone back wall, and the wall comes down: behind it, where there was only earth, a grow room with its first mushroom bed, its crop ready to pick (and mushrooms on the ledge for one batch); more beds and a picker to tend them are sold on its square. From then on each batch needs a mushroom too, and mushroom bowls pay double
    • The Undertow: from the first night in the cellar, a heavy iron-banded door stands in the arena's south wall, between the ring and the soup bar, in a frame of iron posts and timber back into the earth, a red lantern hung from an iron bracket by it. Walk up to it and you knock: nobody answers. Beating the second boss (Yokobashiri, whose card says there's a way south) changes that. Once his card's away and the next fight's begun, Mr. Fugu wants a word: a "!" over him at his desk, and an arrow at the edge of the screen. Knock at the door before you've seen him, and a slot slides open on a pair of eyes: "Password?" … "Beat it." Step up to his desk and the camera comes in on him while the cellar winds down and holds still (whoever's walking gets where they're going, then nothing moves): "Nice work on the crab, Chef." "Some friends want to meet you." He slides his matchbook across the desk: "Door by the ring. Show 'em this." (a tap for each line, his voice a low blip a letter as in his first meeting, the doorman's lower still). Then the matchbook comes up close to look at, the room dimmed behind it: red with a gold border, THE UNDERTOW and a 🐡 on its front, a striker and "Knock twice. Show this. — F." on its back, pink match heads along its top. Drag it (mouse or touch) or use the arrow keys to turn it about, it drifts on a flick and sways a little when left alone, and Pocket it puts it away. Now the "!" is over the door, and close to it the club's band can just be heard through it. Knock, and the doorman looks you over: the camera on the door, the crowd quiet and out of the shot, the slot, the eyes, "Password?", Mr. Fugu's matchbook out of your pocket, its front to you, turned round and held up to the slot, "...Fugu's book. Go on in." The slot shuts, the bolts go, and the door swings in on the tunnel in a burst of the club's light, the camera rising to look down it; an arrow points the way. After that the door opens as you come up to it, from either side, and shuts behind you, and coming from the arena there's a good evening through the slot first. It's saved, so a reload never asks twice; a game saved before there was a door has the way open already. Behind the door is a long, dark tunnel shored up with timber, pipes along its wall, running south past a band of rock to a pair of heavy iron-banded doors in its side, with a pink glow under them. Walking down it is a journey of its own: the view closes in and the dark creeps in from the edges, the caged bulbs flicker, water drips from the beams, a pipe leaks steam, and the club's band comes through the doors, muffled, louder as you go. Until they first open, the club behind them is hidden under a bank of dark, drifting smoke: you hear the band through the doors, but see nothing of the room. The first time you come up to them they swing open on a burst of light and smoke, the music comes up clear, and the smoke over the club rolls back from the doors across the room. After that the doors open as you come up to them, from either side, and shut behind you. Inside is the Family's club, dug into the rock in front of the arena, where there was only earth: a big dark room after a gangster's bar in an undercity, near-black boards, iron and neon. It's laid out as a jazz club and a speakeasy are. Its back wall stands tall behind the long bar at the west end (lit down its front by amber and pink tubes, bottles lit from under their shelves in front of a gilt-framed mirror, lamps hung low along it, the club's name over it) and runs on in three pointed iron arches hung with red velvet, with iron columns between them topped by teal lamps, the bandstand across all three, ringed in pink neon with footlights along its lip and a half-round out from its front where Velvet sings in a spotlight. In front of it is a half-round parquet dance floor, and round that the audience's little lamp-lit tables, fanned round the stage in two rows. The house band, The Low Tide (on the bass drum), plays the club's music along with it as you hear it: a seahorse on muted trumpet, a grouper who raises his tenor sax for the last A, a sea turtle in round spectacles at the grand piano, a crab in a beret on the upright bass, and an octopus on the drums with brushes, who reaches two more arms over to the vibes for the bridge. Red leather booths line the west and south walls (the first is the regulars'), and at the back a brass rail with lamps on its posts marks off a green-carpeted lounge with a round table and barrels in the corner. The low walls are panelled in warm wood with little lamps along their tops, a high table stands by the bar, and a bill on an easel inside the doors says who's on tonight. The place is full of locals, none of whom have a word for you: an audience who watch the show, nod along, sip their drinks, turn to each other now and then and applaud at the end of each time through the tune; pairs talking in the booths; three at the bar; two at the high table; two couples slow-dancing in front of the band; and a shrimp of a waiter doing the rounds with a tray. The Family's three are spread round the room, each with a place and things of his own: Slick Eddie (a moray eel in a purple suit and a pork-pie hat) has a private room of his own through a doorway in the club's south wall, VIP in pink neon over it and a velvet rope either side, where he sits on a curved red velvet banquette at a round mahogany table, with his telephone, his fight card, a stack of chips and a carnation, a chalkboard of the odds on the wall behind him and champagne on ice beside him, his two bodyguards standing either side of him (sharks in black suits and wraparound shades, hands clasped; the one with the earpiece has a word for you as you walk in); Hammerhead Harry (a hammerhead in pinstripes and a fedora, Samehada's uncle) has an office of his own through a doorway in the club's west wall, with his name in gold on frosted glass over it: a bookkeeper's back room on a green carpet, his desk with brass fittings, a banker's lamp, his cash box, a ledger, an adding machine and a drift of IOUs under a green-shaded lamp hung low, a board of IOUs and a clock on the wall behind him, filing cabinets along the back wall under two shelves of ledgers, a safe in the corner, a hat stand and a water cooler by the door and a potted kelp; and in the corner his bookkeeper Inky, an octopus in shirtsleeves and a green eyeshade, keeping the books with every arm he's got; and Three-Card Tommy (a catfish in tweed and a flat cap with the queen in its band) works the open floor at an upturned crate, with a couple of smaller crates for his marks and a "FIND THE LADY" sign propped by it. Each has a pad in front of him (🤝, 💰, 🃏): step on it and he has a word for you, who he is first and then his business; they watch you while you're in the room. The first time you step up to each, he introduces himself instead, staged as Mr. Fugu is at his desk: the cellar holds still while the club carries on, the camera comes in on him across his table and creeps closer, and he says five short lines in a bubble with his name on it, a tap (or Space) for each, in a blip voice of his own (Eddie's smooth and quick, Harry's low and gravelly, Tommy's bright and fast); then his table opens as ever. Once a game, saved; a save from before the introductions counts a vendor met when it shows he's been used (a fix waiting or a scandal running, a loan owed, a game of monte played). Behind its doors the ring's crowd can't be heard at all, only the club's band. Once you've met them, Mr. Fugu wants you to know who he pays. Tommy deals three-card monte in a card room of his own, through a doorway in the club's west wall south of Harry's office (THREE-CARD TOMMY in gold on frosted glass over it), sat behind a green-baize half-moon card table with a folding screen behind him: standing on his pad brings the camera in over the table and opens his controls; put down a stake in Fugu Chips (🐡 1, 5, 25 and 100, held to keep adding, Undo, or Max), up to his table's limit of one fight's takings at a full house (the same yardstick as Harry's, held from when you walk into the Undertow; never under 🐡 20, and the chips over it aren't on his table), and deal. He gathers the cards, shows you the queen, turns her down and swaps them about, 4 slow swaps for a little and a blur of 12 at his limit, then you pick left, middle or right: find her and he pays half again, and the cards turn over either way. His game's straight; the trick's all in his hands. He plays 3 rounds a fight with you, counted in the save; the stake goes as he deals and a win's paid the moment you pick, so a reload never gets a stake back, and walking off before picking leaves it on his table. The club has its regulars too, each with a word for you (Doc Murk and Gus only when you speak to them: E, or the Talk button): Angler Al, an anglerfish behind the bar in a burgundy waistcoat and bow tie, a knowing smile under a handlebar of barbels, his lure hanging like a little lamp over the counter, polishing a glass; Gus, a blobfish slumped on the stool in the bar's far corner; three sardines in one trench coat, lurking in the lounge's dark corner by the barrels; Doc Murk, a squid in a lab coat and brass goggles, in the regulars' booth with a flask of something green bubbling; Velvet, a jellyfish glowing pink over the bandstand's half-round, who sings a line of her song now and then; and Inky in Harry's office. Step up to the bar (🍸) and Al pours you a drink for a few chips: a kelp tonic clears your head, the house special leaves you tipsy for a while. Speak to Gus and you can buy him a drink, and he tells you what he's heard about the next boss. Slick Eddie fixes boss fights: step up to his table (🤝) and pick how many of the next boss's fans his boys keep home, 10% to 50%, for 🐡 8 a fan, paid up front, win or lose. The bigger the fix, the likelier the papers get wind of it (5%, 15%, 30%, 50%, 70%). That's rolled as you pay and saved, but only comes out at the gong: if the fix holds, the boss walks in with that many fewer fans; if it's caught, he brings them all, Eddie keeps the fee, and the same share of your own fans stay away for the next 1 to 3 local fights. With a fix on, the gong gives your chances for each face of his coin, fix holding or caught, and ringing it tosses his coin: it spins up, comes down spinning on its edge, his grinning and grimacing faces flicking past slower and slower, drops flat on one, and a second later says what it means (THE FIX HOLDS, or 🗞️ CAUGHT!). Everything waits on it, his crowd at the door and his bell, until you tap it away (or press E). One fix a boss, each time he's called in. Harry lends Fugu Chips across his desk: standing on his pad brings the camera in over it and opens his controls, a slider for how much (in chips) and a button to borrow it. He lends up to four fights' takings at a full house (the fans a local fight brings in, a plain bowl each, at what a bowl sells for: it only moves with an upgrade), worked out as you walk into the Undertow and held while you're in. You pay back a quarter again on top, and he takes it out of your stall's sales as they come in, 30% of them, till it's paid; or pay off what's left at his desk. No deadline, one loan at a time. What's owed shows in the HUD beside the stage chip (🦈), filling up as it's paid off. The loan's saved, so a reload never gets you out of it.
    • Mr. Fugu's office: step onto the 💬 pad in front of his desk and he has a word for you in a bubble, by how the ring's doing (his cut, the next boss, the mushrooms once they're found, the stands); step off and back on for the next. A straw boater hangs on his coat rack, and little fish swim up and down his tank
    • Between boss nights the champion, Chunkos, takes on a local. Stand on the 👁️ watch spot by the ring and the camera closes in, with the fight's strip along the top
    • The front: upstairs, the restaurant's diners still eat and its crew still works, but its takings (the register's and the kiosk's) are Mr. Fugu's rent until you buy him out. For the playtest, adding ?front=trickle to the page's address lets a fifth of them through instead
    • The buyout: with all five bosses beaten, a gold 🐡 tile in his office, Buy back all his chips (🐡 12,000), ends the stage: he takes his money and goes, his 30% ends, and the restaurant's till is yours again. He leaves something behind on his desk that points to stage 4
  • Rating: customers only wait so long. Each one leaves a 1–5★ review when they go, based on how long they waited; someone who gives up leaves 1★ and pays only for what they got. The rating in the HUD is the average of the last 20 reviews (a new game starts at ★3.0). A better rating also brings customers in faster: ×0.6 at ★1, ×1.4 at ★5

  • Seasons: winter, spring, summer and autumn come round every five minutes of play, and the season chip by your cash shows which it is and how long is left. A new season changes the scenery over a few seconds and everyone's clothes at once:

    Scenery What falls Clothes
    ❄️ Winter Snow on the ground, the pines and the roofs; ice floes in the bay Snow Parkas with fur-trimmed hoods, or the hood down under a bobble hat, earmuffs or a trapper hat and a scarf; diners and farmers add a scarf
    🌸 Spring Fresh grass, blossom on the pines, green bushes, earth paths; the floes start to melt Petals Light jackets, baseball caps or hairbands, and skirts
    ☀️ Summer Deep green grass and a bright sky; no ice left Nothing Short sleeves, shorts or skirts, and sunglasses or straw hats
    🍂 Autumn Dry grass, pines turned red and orange with gold tips; the floes come back Leaves Woolly hats with a bobble, berets or flat caps, and scarves

    The sky changes with them, by day in stage 1 and at dusk in stage 2. The drivers come by snowmobile in winter and by car the rest of the year (the same vehicle, on wheels instead of skis). Chefs keep their whites all year, and waiters their indigo jackets and white headbands.

    Everyone is low poly, but rounded (on High graphics; Low keeps the plainer people from before): tapering arms and legs with hands and shoes, round shoulders, ears, a nose and a glint in their eyes. Clothes have their details: the parka has a zip, a darker hem and pockets, and the spring and autumn jacket a zip and a hem; summer brings short sleeves over bare arms, and shorts; winter, knitted mittens and snow boots with a fur cuff. Suits have lapels, two buttons and a pocket square, evening dresses a satin sash, chefs' whites two rows of buttons, and farmers denim overalls and green wellies. People walk with a bounce, dipping as their legs spread so both feet stay on the ground, leaning into the stride and rocking from foot to foot, and breathe while they stand, each in their own time. Dressing people never touches the game's luck, however many there are. Each person's clothes are baked into a few small meshes (a byte for each colour and normal), the whole crowd changes for a new season in a few milliseconds, and the clothes of people who've gone home are let go every few seconds, so a long game doesn't fill a phone's memory.

    No two customers look quite alike. Each walk-up customer, driver and diner is a man or a woman, mixed from a wardrobe of their own: skin tone, hair colour and cut (short, a quiff, curls or bald on top for men; long, a ponytail, a bun, a bob or curls for women), cartoon eyes and a mouth (lashes for women only, and nobody frowns), rosy or freckled cheeks, a moustache, beard or goatee or earrings, glasses, trousers or a skirt, shoes, height, and which of the season's hats they wear. At the sushi bar the men wear suits with a bow tie or a tie under a top hat or a bowler, and the women evening dresses and pearls under a wide-brimmed hat or a pillbox, or no hat at all. The mix doesn't touch the game's luck: it comes from its own sequence, not the one that decides orders and fish. Nothing falls inside buildings, and the rain at her house clears whatever is falling. A new game starts in winter, the way the market always looked

  • Gamble: once the casino boat is in, walk through the gap in the dock's west fence onto the harbor quay, up the gangway onto the casino yacht's foredeck and up the stairs into the salon on its upper deck, where the games are. Inside, the roof lifts away and the walls on the camera's side fade, as in the restaurant, and the salon is laid out like a casino floor: the roulette table, the blackjack table and the slot machines along the back wall, open floor between them and the door, and round them a long bar across the stern (two bartenders, one polishing glasses and one shaking cocktails, and guests on the stools), a short row of slot machines by the door with guests playing them (now and then one wins), and a guest at the roulette table who cheers your wins. A waiter carries a tray of champagne along the windows; he doesn't block your way, and walking up to him stops him and opens a slim bar to buy a glass (the second chip's price: $25, or $250 in stage 2; press E or tap the button). The camera comes in close while he hands you a glass and takes one himself: you raise them and clink ("To Lady Luck!" "Cheers!"), then both drink, the flute tipped at the lips and tipping further as it empties, you twice, and the empties go back on his tray (a moment later: Hic!). Three glasses in quick succession is one too many: for about 5 seconds you zigzag as you walk and the camera sways (the sway is skipped for players who prefer reduced motion). Walk off mid-drink and the glasses stay with him. None of them stand in your way, and none of them touch your luck. Each game has a pad in front of it; stand on it to play, and the camera comes in close over the table (fitting it into the screen above the controls, or beside them on a phone held sideways) while a slim burgundy-and-gold bar of round chips and big buttons opens along the bottom. Make up a stake from the chips, and walk off to stop (a spin or hand in progress settles at once, turning down insurance and standing on what you have). Everything plays out on the table itself, and takes its time. The chips are $5, $25, $100 and $500 in stage 1 and ten times that in stage 2 ($50 to $5k): each tap puts one more down (three $1k chips and a $250 make $3,250), a gold tag on each chip counts them, Clear takes them all back and All in puts down everything. The stake stays down from one round to the next and moves up with the stage, and its chips go down on the felt the way a dealer would stack them, biggest at the bottom. The games play by the rules casinos commonly use, house edge and all:

    • 🎡 Roulette: a European wheel with one zero. Bet on red or black (pays ×2; the zero loses them) or green, the zero (pays ×36). Your chips go down on the box printed on the felt; the wheel spins one way and the ball runs round the rim the other, slows, drops in with a few hops and settles in its pocket as the wheel stops. Winnings come out beside your chips and both slide back to you; a loss goes to the croupier. A lit board on a short post beside the wheel shows the last numbers, low enough to stay in view at the table
    • 🃏 Blackjack: a six-deck shoe. Hit, stand or double on your first two cards, and split a pair once (any two tens count as a pair) into two hands played in turn, with doubling after the split; split aces get one card each, and 21 after a split isn't blackjack. The dealer stands on every 17 and checks for blackjack first. Blackjack pays 3 to 2. When the dealer shows an ace they offer insurance, half your stake, paying 2 to 1 if they have blackjack, or even money if you have blackjack yourself. The cards are dealt as in a casino: each slides out of the shoe face down and turns over, the dealer's second stays face down, and the totals float over each hand. When the dealer plays they turn that card over slowly, then draw. A double goes down sideways; on a hard 10 or 11 its card stays face down (the total reads "11 + ?") until the dealer is done, then turns over. A split moves the pair apart and matches the chips, and at the next deal the last hand is swept into the tray. A fresh shoe is shuffled in front of you: the dealer gathers the tray and the shoe into one stack, riffles it three times and puts it down for you to cut, sliding a yellow cut card into the stack (at least a deck in from either end). On Cut the cards above it go to the bottom, the dealer sets the cut card a deck from the back, loads the stack into the shoe and burns its top card into the tray, the only card burned. When the cut card comes out it's laid by the shoe, the round finishes, and the dealer shuffles again. Walk off mid-shuffle and the dealer cuts for you; a shuffle that hasn't started waits for you to come back
    • 🎰 Slot machine: three reels, one line. Three of a kind pays 7 ×100, 💎 ×50, 🐟 ×25, 🔔 ×15, 🍋 ×10, 🍒 ×8, and two cherries pay ×2: about 97% back. The camera comes in face on: the lever goes down and the reels on the machine's own screen spin and stop left to right, with what pays printed on the glass under them

    The croupier and the dealer welcome you the first time you step up to them each visit, and call out the big moments in a speech bubble (a green, a blackjack, a bust, insurance); the slot machine's sign lights up a bubble for three of a kind and the jackpot

  • Mind the road: drivers stop for you on the road ahead of them, at the zebra crossing to her house or anywhere else, and the ones behind wait in line. Keep them waiting and they beep, then lean on the horn with an angry face until you're out of the way

Sound

Almost everything you hear is made in the browser as it plays (Web Audio); the one exception is the casino yacht's room tone, three real recordings (2.4 MB) fetched the first time you walk out towards it. Sound starts with your first tap or key press, as browsers require, and sleeps while the page is hidden.

  • Effects: soft, rounded, toy-like sounds for the low-poly world. Your footsteps on boards, snow, grass or leaves; the line whipping out, the splash and the cleaver's three cuts; blips that climb the scale as you pick things up and step down as you put them down; coins; money draining into a tile and a run up the marimba when it's bought; a bell for news; reviews from a happy little tune (five stars) to a sad bonk (one); roulette clicks, cards dealt and slot reels clacking to a stop; car horns. Sounds out in the world come from their side of the screen and fade with distance. Every pitched effect is on the major pentatonic of the music's key, so they ring along with the music

  • Ambience: the sea and its gulls (loudest on the dock), wind (strongest in winter), birdsong in spring and summer, cicadas in summer, crickets at stage 2's dusk, the rain at her house, and the murmur of diners in the restaurant. On the casino yacht, real recordings: anywhere aboard, a dining room's murmur very faint and muffled, as if from the deck below; a bar's chatter and laughter as you walk over to the bar; and slot machines' jingles and bells as you near the machines (the games' bank or the guests' row). Down in the cellar everything up in the world is shut out (its effects too), and the ring's crowd is a bed of voices as loud as they're worked up; from the dock above, it comes through the floor, faint

  • The crowd (stage 3) follows each fight from start to end as one continuous crowd, so you can follow the fight by ear: its murmur, chant and roar loop all the time and glide up and down with the fight (up quickly, down slowly). The chant builds as the wrestlers step up and lifts with each stamp, everything falls away for the hush at the crouch, the roar surges at the charge, rumbles on through the push and swells at the edge, a cheer grows out of it when the winner's known (bigger, with cushions thrown, for an upset), and it all drains back into the murmur through the applause for the bow. A boss's crowd is all of it. It's the one sound in the game that's recorded: a real stadium crowd of adults (Gregor Quendel's stadium recordings, CC BY 4.0, and applause from BigSoundBank, CC0; cut to about 620 KB in public/sounds, credited in its CREDITS.md and under Credits & Copyrights in the game's settings). How much of it you hear depends on where you are: all of it at the ringside and among the stands, about half by the arena's far walls, less on the landing, low in the hearth room, lower in the workshop and the prep hall, very low in the grow room and Mr. Fugu's office, and a murmur through the floor from the dock, easing as you go through a doorway. Synthesised people sounded like wind; until the recordings have loaded, a synthesised crowd of voices stands in. Hear it on the Dohyo Crowd page

  • Music, made up as it plays, and different for each stage. Hearing the step up between them is part of the reward:

    • Stage 1, the market: a kalimba (thumb piano) and a hand drum, small and handmade, in D minor at 92 BPM. To start, the kalimba picks out half a pattern. The rest of the pattern, a frame drum, a shaker, a tune and a bass line join as the market grows.
    • Stage 2, the restaurant: a jazz café band, with electric piano in sevenths and ninths, a bass, drums and a lead. Each season has its own key, feel and lead:
    Key Feel Lead Drums
    ❄️ Winter D major 84 BPM ballad swing Celesta Brushes, sleigh bells
    🌸 Spring F major 92 BPM bossa nova Flute Cross-stick clave, shaker, soft kick
    ☀️ Summer G major 96 BPM swing Vibraphone Ride cymbal
    🍂 Autumn C minor 82 BPM slow swing Reed Brushes, soft kick

    Parts come in as the restaurant is built: chords, bass and the tune to start, then drums and a walking bass, then busier piano and the tune answering itself, then a second voice.

    • Stage 3, the ring: the gloop ring, down in the cellar (docs/music-ideas.md): C minor at 96 BPM in half time, a soft, gloopy bass that sags and slides round C2 (a soft sawtooth through a resonant low-pass), taiko, a wet slap, grit, the ring's wooden clappers calling each round, a low shamisen, and mud bubbles on the chords' notes, in a damp room (a reverb and a dotted-eighth echo). It plays as it was made and liked on the listening page, with one tune of its own and no rests: the bass and bubbles to start, the drums after two bosses, the shamisen's tune after four, and a low drone with the last. Up on the dock, the café band plays on.
    • The casino yacht: a lounge band, "Five o'clock": a piano trio in 5/4 at 132 BPM, felt 3 + 2, in D Dorian, a key of its own whatever the season (the game's sounds go to F major pentatonic, the same notes, while you're aboard). The piano plays the tune in octaves over its own vamp (Dm9 to Em7), with an upright bass and brushes, and a bridge of B♭maj7, Gm9 and A7♭9; once the stage is built, a cool, dry alto sax joins the last four bars (an octave under the piano, in the alto's warm middle) and vibes harmonise the bridge. It's our own tune, in the spirit of the classic 5/4 cool-jazz record. It comes in as you walk up the quay, the stage's music going out under it, and has the music to itself aboard
    • The Undertow (stage 3): the club's band, "Back booth": Five o'clock gone noir, the same tune and 3 + 2 groove in D minor (every B a B♭) at 104 BPM. A trumpet in a harmon mute plays the tune over brushes, an upright bass and a sparse piano, a smoky tenor sax joins it for the last four bars, vibes harmonise the bridge, and each round ends on the minor-major chord of every film noir. Down the tunnel it comes through the club's doors, muffled and louder as you go, under the stage's music; the doors opening let it through clear, in the club it has the music to itself, and in Harry's office it comes through the doorway a little duller (the game's sounds go to F major pentatonic, its notes). It's one running tune: once you've heard it, it plays on behind the doors, so walking in or out never starts it over
    • The cooking game at the pot (stage 3): "Gloop rush", the gloop ring with the brakes off: its muddy bass bouncing in eighths with the cellar's slides into each chord, a taiko on the one and the three and the wet slap on every backbeat, grit, the ring's clappers every fourth bar, and a quicker, higher shamisen tune of its own, in C minor at 132, with mud bubbles shadowing the tune in the second half. It comes in from the top as the show starts and fades out when it's over; the cellar's music fades out under it, and the crowd and the rest of the world's sound step back to about a third
    • Every stage: each tune plays twice, and every fifth verse rests the tune. The music fades away under the songs at her house and Korki's statue, in the rain, under Mr. Fugu's pitch, and through the stage-up's fanfare. A chiptune set is saved for a future stage (docs/music-ideas.md)
  • Easy on the ear, following what's known about which sounds people find pleasant:

    • Consonant notes: effects on the major pentatonic, and two-note effects a fifth or a fourth apart (simple frequency ratios).
    • No half steps in the piano's chords, where they'd sound rough and muddy that low.
    • No held clashing notes in the tune (the jazz "avoid note"); they're only allowed as quick passing notes.
    • Harmonic overtones for anything heard a lot. Bells, with their out-of-tune overtones, are kept for one-off news.
    • Every sound turned down by up to half around 3 kHz, where the ear is most sensitive. Coin and pick-up runs go round within their octave instead of climbing into the shrill.
    • Sounds that repeat a lot (footsteps in snow, roulette clicks) kept out of the sharpest band.
    • Only slow wobbles (gentle detune and tremolo), never fast buzzy ones.
    • Unhurried tempos of 82 to 96 BPM.

Sound credits (also under Credits & Copyrights in the settings): the slot machines are "Amsterdam casino" by Dirk-Jan Hanegraaff, CC BY 3.0; the dining room is "Restaurant #3" and the bar "Atmosphere Bar #2", both by Joseph Sardin of BigSoundBank, CC0. All three are cut to loop seamlessly, levelled and made mono.

Economy

The money curve follows idle games (the math of idle games): prices grow exponentially, and so does income, a little more slowly, so each purchase takes a bit longer than the last.

  • Repeatable upgrades, three a stage, at the stage's upgrade square, and rice fertilizer at the fertilizer shed in stage 2:

    Stage 1 Stage 2 Stage 3 Each level Price
    Better product 🐟 Fine fillets 🍣 Chef's specials 🏷️ Pricier bowls Prices +25% (in stage 3, of a bowl's base price) ×1.6 a level, no limit
    Marketing 📣 Posters, flyers, radio, social media, ... TV ad 📣 Menu boards, lantern signs, ... world famous 📣 Word on the street Customers (fans) +20% (+10.5% in stage 3), longer queues ×1.75 a level, 8 levels
    Crew 💪 Crew training, once the first runner is hired: fishing, chopping and the runners (up to twice as fast) 🧑‍🍳 Kitchen crew: chefs, the runners, farm workers, waiters (not how fast rice grows) 🧑‍🍳 Cellar crew: the hires walk and work faster Speed +15% (+12% in stage 3) ×1.75 a level (×1.45 in stage 3), 8 levels
    Fertilizer 🌿 Rice fertilizer: compost, fish meal, spring minerals (from the takeout kiosk on) Rice growth +50% ×2 a level, 3 levels

    They start at $40, $60 and $80 in stage 1, $500, $800 and $1,000 in stage 2 (fertilizer at $20,000), and 🐡 30, 20 and 150 in stage 3. In stage 3 the fans only fill the seats there are: word on the street's eighth level brings in a full house. Each level in stages 1 and 2 shows in the world:

    Stage 1 Stage 2
    Better product The price board over the walk-up counter shows the new price, and a star a level A wooden menu tag over the kitchen line, a new dish on each
    Marketing Each campaign for real, spread round the market: posters on the fence, a promoter handing out flyers down the customers' path, a radio playing the jingle and a giant phone with the market's post collecting likes (at either end of the dock), a billboard and a newspaper box across the road, a food blogger taking photos and a TV playing the market's commercial out in the snow Spread round the restaurant: a chalk menu board in the front garden, big paper lanterns on the front eaves, a phone on a ring light filming the bar, a food critic at a table holding up five stars, a magazine rack by the entrance, a TV camera filming the chefs, the gourmet guide's stars over a pedestal by the register, and flags from all over the world across the room
    Crew The player's headband, coloured like a judo belt: white, yellow, orange, green, blue, purple, brown, black (it comes off when the restaurant opens) The chefs' and cooks' toques grow taller
    Fertilizer A labelled sack of each kind on a pallet beside the fertilizer shed

    Fishing speed (crew training) still counts in stage 2, but it isn't in the list there: the dock catches more fish than the kitchen gets through, so carrying fish in (the runners) is what can hold the kitchen back, and the kitchen crew speeds that up.

  • One-off upgrades roughly double in price each time and add capacity: machines, workers, chefs, seats, terraces.

  • Tiers. Each stage ends on an expensive capstone. The gold tile costs about five minutes of a well-run market's income, so you start stage 2 almost broke, and stage 2's prices and sale values are about ten times stage 1's. Stage 2's capstone is Mr. Fugu's buy-in ($1,000,000), and stage 3's prices are about ten to twenty times stage 2's. While the restaurant pays him rent, its income can't make stage 3's prices meaningless; the buyout gives it back.

  • No dead ends. Fishing and rice are always free, and fish the kitchen can't take go back to the pile as you harvest rice, so arms full of fish never stop you making sushi and money again. The runners (bought in stage 1) keep the fish tray stocked, the farmer's stack can be carried in by hand before there's a rice porter, and the chefs only pack a few takeout boxes ahead, so plates keep coming for diners. Fish and rice keep up with a fast kitchen: a bag of rice makes two plates, the kitchen crew speeds up the runners, the farmer and the rice porter too, and once the terraces are full, fertilizer makes them grow faster (the farmer sweeps the ripe clumps either side of the one they came for, so they keep up).

On a simulated run by a bot that plays like a reasonable player (see Development), stage 1 takes about 13 minutes, with income growing from about $200 to $10,000 a minute; stage 2's upgrades, fertilizer included, are all bought about 41 minutes later, with income growing from about $1,000 to over $250,000 a minute, and to about $700,000 an hour into the game. From the buy-in, the bosses fall at about 6, 7, 15, 23 and 30 minutes, and the buyout comes at about 32, with income growing from about 🐡 15 a minute by hand to over 🐡 1,000 a minute with the whole crew and the Grand Hall full. Better products then carry on for as long as you like.

Unlocks

Two upgrades of the current stage are on offer at a time, in this order, plus the chefs, which are out all through stage 2. A tile with a star requirement shows the rating it needs (🔒 ★3.5) instead of its price until your rating reaches it. Once reached, it stays open even if the rating drops later. A tile only takes money once you stop on it, not while you walk across.

Whenever a new upgrade comes on offer, a message says what it is, and while its tile is off-screen an arrow at the edge of the screen points the way to it, until you've had it in view for a moment.

Stage 1: Fish Market

Upgrade Cost Needs Effect
🎒 Bigger arms $30 Carry 14 things at once
🎯 Auto harpoon $90 Catches fish while you're away
🛳️ Casino boat $150 A harbor quay off the dock's west end (stone-walled and plank-topped like the dock, with bollards, lamp posts, a ticket booth and crates), and a casino yacht, Lady Luck, moored along it: a navy hull with a raked bow and gold name, bulwarks sweeping up to the bow, a lower deck banded in dark glass with a CASINO sign on each side (its bulbs chasing round it), and a glass-walled salon on top under a white hardtop, which carries a sky lounge with a radar mast, a jacuzzi with two guests soaking in it, sun loungers and strings of lights down to the bow. The roulette table is in the salon. The tile is by the west fence: the quay builds out from it, and the camera looks over at the boat as it comes in. Its slot machine and blackjack table are for sale on the upper deck (below)
🏃 Hire a runner $300 ★3.5 Carries fish from the pile to whichever counter is lowest (in stage 2, to the kitchen line)
🥾 Snow boots $500 Walk faster
🚗 Drive-up window $900 ★3.8 Opens a window in the east fence where drivers buy fish in bulk, for half as much again
🏃 Second runner $1,200 ★3.9, a runner Another runner, at the first one's tile
🥅 Ice net $1,600 ★4.0 Hauls in fish nonstop
🏃 Third runner $3,500 ★4.2, a second runner A third runner. All three work side by side at the market; the restaurant needs only two to keep its kitchen line in fish, so at the stage-up the third hands its fish back to the pile and goes
🏯 Open Floe Sushi $12,000 all of the above Stage 2: the restaurant with ten seats, a chef and two cooks, and a small patch of rice on the bottom terrace

Stage 2: Floe Sushi

Upgrade Cost Needs Effect
🌾 Rice terrace $800 Plants the rest of the bottom terrace round the starting patch (18 clumps of rice in all)
🪑 More seats $2,500 ★3.6 Eight more seats at the bar (18 in all)
🔪 Second chef $3,000 ★3.6 Another chef at the bar. Out from the start of stage 2, by the bar's east end
🧑‍🌾 Hire a farmer $6,000 ★3.9, 🌾 Harvests the terraces onto a stack on the path, sweeping the ripe clumps either side in the same cut
🧺 Rice porter $12,000 ★4.1, 🧑‍🌾 Carries rice from that stack, 18 bags at a time, in through the farm door to the kitchen line
🌱 Second terrace $15,000 ★4.1, 🌾 Plants the middle terrace: rice for more diners
⛱️ Garden tables $20,000 ★4.2 Four tables under red parasols east of the garden path (8 seats), a serving counter by the gate for their plates, and a waiter who carries them over
🔪 Third chef $25,000 ★4.3, a second chef A third chef at the bar. Out once there's a second chef
⛱️ More garden tables $32,000 ★4.3, garden tables Four more tables west of the path, and a second waiter at the serving counter
🌱 Third terrace $40,000 ★4.4, second terrace Plants the top terrace, by the hot spring: rice for a full garden
🥡 Takeout kiosk $50,000 ★4.4 Drivers on the road buy boxes of sushi with the rice to spare; the chefs pack them. The fertilizer shed opens with it
🏮 Premium menu $60,000 ★4.5 Everything sells for 60% more

Her house

Far out past the road, a path leaves the market (through the east fence in stage 1, and through a door in the restaurant's east wall in stage 2), crosses the road at a zebra crossing and ends at a little rose-coloured house with its windows lit. Stand in the 💔 circle in front of it and it starts to rain: the sky goes grey, you turn into the singer, Ofer Levy (navy cap, short grey beard, olive field jacket over a white T-shirt, gold chain and watch), face her window and cry, and his "מאוהב בגשם" (live at Caesarea, via YouTube) plays from the line "מול ביתך עומד בגשם נרטב". Walk away and the rain clears and the song fades out; come back and it starts again from the same line. The 🔊 button on the song's banner mutes it (it starts muted on iPhone and iPad, where web pages can't fade sound). It's there from the start, free.

🛴 Korki's golden statue ($10) is on offer from the start, outside the queue: a gold NAMI Klima One on a pedestal, in memory of Korki. Stand on its pad to read his story; stay a few seconds and his song ("Car Alarm (extended reprise)" by pat's soundhouse, via YouTube) fades in quietly, and fades out when you leave. The story's ✕ closes it while you stay on the pad, song and all; it's back the next time you step on. On phones the story is smaller, to leave the game in view.

🎰 Slot machine ($250) and 🃏 Blackjack table ($400) are in the casino yacht's salon once it's in, outside the queue, in either stage.

Stage 3: The Dohyo Below (bought at Mr. Fugu's hatch: 🐡 Buy into the ring, $1,000,000). Prices are in Fugu Chips; each opens once the boss in the Needs column is beaten. Everything is bought at the crafting bench in the workshop: standing on its 🔨 Craft square opens one menu, and the camera stays where it is. With a mouse and keys it's one list down the right of the screen (out of the player's way), with your chips at its top, under a heading for each place (the ring, the prep hall, the grow room, the hearth room), which says how many things in it you have the chips for and folds it away (as do the keys 1 to 4); until the grow room's found, its heading has just a line saying who opens it. Each thing is one line: its icon, its name (a line's machines as dots, filled for the ones you have), what it does on one line (all of it under the mouse), and a green button with its price that buys it in one click (grey when you're short, a lock and the boss for what's not open yet, and ✓ or Max for what's done). What's locked comes last in its room, thinner. Pressing E buys the line under the mouse. On a touch screen it's the same size whatever tab is open, and opens folded instead, as a round 🔨 Craft button where the Buy button goes (out of the way of a thumb walking off) with a badge of how many things you have the chips for, which a tap opens and a red ✕ folds back, a tab for the ring's three upgrades and one for each room's, beside its title (an icon each, the open one named, and a dot on any with something you have the chips for); each tab is a grid of cards (an icon, a name, and its price or its lock), and tapping a card shows what it does under them with its Buy button, so it takes two taps to buy (pressing E buys the picked card). The rooms' tabs: the prep hall's racks, barrels, washer, salter, steam baskets and smokehouse; the grow room's beds, picker and shelves (once it's found); the hearth room's cook and attendant. Each card keeps its place, the rice line's along the top and the fish line's under it, what's locked saying which boss opens it and what's done ticked. The venue's tiers and the buyout stay tiles

Upgrade Cost Needs Effect
🌾 Another drying rack 🐡 10, then 45% more each One more on the rice line, up to six
🛢️ Another salt barrel 🐡 12, then 45% more each One more on the fish line, up to six
🧺 Rice washer 🐡 15 the practice fight Runs the rice line: fills the racks and carries rice to the ledge
🧂 Fish salter 🐡 20 the practice fight Runs the fish line
🍄 Another mushroom bed 🐡 15, then 45% more each Hakkaku One more in the grow room (it comes with one)
🧑‍🌾 Mushroom picker 🐡 100 Hakkaku Runs the mushroom line: picks the beds and carries mushrooms to the ledge
🍲 Attendant 🐡 150 Hakkaku Carries bowls from the counter to the soup bar
🏮 The Back-Alley Ring 🐡 120 Hakkaku Bleachers: 48 seats (24 to start)
♨️ Steam baskets 🐡 350 Yokobashiri Every rack becomes a steam basket: 10 rice every 5 s
👨‍🍳 Cook 🐡 500 Dobu Keeps the pot cooking while you're away (70% batches)
🏚️ Smokehouse 🐡 800 Dobu Every barrel becomes a smokehouse: 10 fish every 5 s
🥁 The Underground Arena 🐡 900 Dobu An upper tier and the taiko drummers: 90 seats
✨ Glowing grow shelves 🐡 4,000 Samehada Every bed becomes a shelf: 9 mushrooms, one every 4 s
⛩️ The Grand Hall Below 🐡 2,500 Samehada The VIP boxes (box seats with cushions, right by the ring): 150 seats
🐡 Buy back all his chips 🐡 12,000 all five bosses Stage 3 complete: his 30% ends, the restaurant's till comes back, and a lead to stage 4

Market customers and diners order 1–3 and give up after 40 seconds of waiting (for diners, 40 seconds in total between plates). Drivers wait 55 seconds.

Saving

Progress saves automatically on the device, including your reviews, the season, what the tutorial has shown you and everything along the supply chain (the pile, the counters, the kitchen line, plates on the belt, workers' loads, the terraces' stack, and in stage 3 the whole cellar: its machines and what's in them, the ledge, the counter and the soup bar, the crew, the bosses beaten, what you're carrying down there, and whether you were down in the cellar; a boss's rush cut short by closing the page is called off, neither won nor lost): every few seconds, whenever the page is hidden or closed, and after each upgrade. Cash, fish and rice that are mid-air are counted, as are diners' unpaid bills, so closing the tab at any moment loses nothing.

  • One tab at a time. If the game is opened in a second tab, the older tab stops saving and says so, so it can't overwrite newer progress.
  • Updates don't reset progress. Saves carry a format version and older saves are migrated on load, keeping cash, rating and upgrades. Saves from before the two stages stay in stage 1, except those that had both the old restaurant west of the dock and every market upgrade: they go straight to stage 2, keeping the restaurant's upgrades, with the old kitchen's fish and the counters' leftovers on the kitchen line and the cash at the register. Everyone else gets back what they spent on the old restaurant, its cash and its unsold plates. A save that can't be read is kept under floe-market-backup instead of being overwritten.
  • Storage that sticks. The game asks the browser to keep its storage (navigator.storage.persist()). On iPhone, Safari clears website data after 7 days without a visit; adding the game to the Home Screen avoids that (note that the Home Screen app keeps its own separate save).
  • Restart (in the ⚙️ settings) erases progress after a second, deliberate tap; a quick double-tap is ignored. Signed in, it starts the cloud save over too.

Cloud saves

Sign in with Google (in the ⚙️ settings) and your game follows you to any device or browser, including the iPhone Home Screen app. Playing without signing in works exactly as before.

  • Syncing: signed in, the game syncs with your account every 30 seconds and whenever the page is hidden. Open it on another device and you carry on where you left off. The page reloads once to load the newer game, and says "Loaded your game from the cloud".
  • Each sync compares this device and the account with how they were at the last sync. If only one has moved on, it wins.
    • Both have progress the other hasn't seen? This happens the first time you sign in on a device that already has its own game, or after playing on two devices offline. The game asks which one to keep, showing each one's stage, cash, upgrades and when it was last played.
  • Offline: the button says so, and the game keeps saving on the device until it can reach the cloud again.
  • Signing out keeps the game on the device.
  • Saves are private: each one is one Firestore document, saves/{your account id}, which only you can read or write (firestore.rules).
  • Download: Firebase is a separate script (about 160 kB compressed). The loading screen fetches it with the game's own; it starts a few seconds after the game does, or straight away on a device that's signed in, so the sign-in window opens the moment you tap.

Setting it up (free Spark plan, no billing needed; the sign-in button stays hidden until this is done). Menu names are as of October 2026:

  1. In the Firebase console, create a project. Google Analytics isn't needed.
  2. Security, Authentication, Sign-in method: enable Google. It asks for a support email.
  3. Security, Authentication, Settings, Authorized domains: add chefcontrol.github.io (GitHub Pages), and localhost to test with npm run dev. Projects created since April 2025 don't include localhost by default.
  4. Databases & Storage, Firestore: create a database in the Standard edition (the one with the free quota), in production mode, in a location near your players. Then paste firestore.rules into its Rules tab and publish.
  5. Project Overview: add a Web app (the </> icon), and copy its apiKey, authDomain, projectId and appId into src/cloud.config.ts. Firebase's docs say these can go in public code. Keep the API key limited to Firebase's APIs, which is how Firebase creates it; the security rules are what protect the saves.

The free quota (50,000 reads and 20,000 writes a day) covers about 150 hours of play a day. Each player online reads once and writes at most once every 30 seconds.

Scoreboard

The 🏆 button (top right) lists the 20 players who have held the most cash at once, and the furthest stage each has reached. It shows once cloud saves are set up.

  • Getting on it: sign in. Your best goes up as your game syncs, and only ever goes up: spending doesn't lower it, and neither does a Restart.
  • Names: players show by the full name on their Google account, never an email. Your row is picked out; if you're not in the top 20 your own best shows under the list. Not signed in, it shows this game's best and a button to sign in.
  • Data: one Firestore document per player, scores/{your account id}, with that name, the best and the stage. Anyone can read the scoreboard; only you can write your own entry (firestore.rules). A project set up before the scoreboard needs firestore.rules pasted and published again, or the scoreboard says it can't load; so does one set up before stage 3, whose rules only accept stages 1 and 2 (a stage 3 player's entry would be refused).
  • Quota: opening the scoreboard reads up to 20 documents. A signed-in player writes their entry at most once per sync, and only when their best or stage changed.

Reports

Report a bug or idea (🐞 in the settings, under About) sends a note to the developer. It shows once cloud saves are set up. Signed out, the row says "Sign in to send a report" and signs in. Signed in, it closes the settings and opens a window of its own over the dimmed game. ✕, Cancel, a tap on the game around it or Escape close it, and a note not yet sent is still there next time.

  • The form:
    • Bug or Idea, and a note of up to 1,000 characters.
    • A picture of the game, taken the moment the window opens.
    • Draw-a-Bug, the red crayon button on the picture's corner (Doodle It, yellow, for an idea), or a tap on the picture: opens it big over the game to circle what's wrong with a finger or the mouse, in red (yellow for an idea). Undo takes back the last line, Clear all of them, and Done keeps them, ready to change again; Escape puts it away without the new lines. The picture goes with the lines on it.
    • Two tickboxes, both on each time it opens: Include this picture and Include my game state. The game state is the save (progress, look and settings) plus where the player is standing and facing, what's open on screen, the season, the sound's mutes, the cloud's state and how many minutes they've played this visit.
  • What the player is told: above Send, What's sent says in a line what goes ("your note, this picture and your game state") and changes as the boxes are ticked. Opened, it lists what each of those is, what always goes and what never does (their name and email), and that the picture and game state are deleted after 7 days. Unticking a box adds a warning under it: "Without the picture, it may be hard to see what went wrong", or "Without your game state, the developer may not be able to make it happen again to fix it".
  • Always sent: the commit the game was built from, the graphics setting and frame rate, screen size, whether it's a touch screen, the browser, and the last 10 errors the game hit this visit.
  • Sending:
    • A moment over the game: for an idea, a light bulb flickers on bright with a chime, "Bright idea!"; for a bug, a fly swatter comes down on a scurrying bug with a swish and a smack, "Bug squashed!". That's all a player sees when it goes; words come up only when it doesn't (refused, or waiting to go online).
    • A player can send 20 reports an hour, at least a second apart; the hour starts with the first. One sent within a second of the last waits out the second and then goes. A 21st says how many minutes until they can send more, and the window stays open with the note in it.
    • When the cloud can't be reached, the report waits on the device (the newest two at most) and goes when the player is next signed in and synced. The thanks says so.
  • Telling players: a player who played before reports came gets a toast once, 3 seconds into their game (when nothing else is open): "🐞 You can now report bugs and ideas from the ⚙️ menu". New players aren't told, and nor is anyone who has opened it already.
  • When something breaks: the red error box has a Report this button, which opens the form with the error written in.
  • Data: each report is a Firestore document in reports/, with a name of 20 letters and digits.
    • Only players signed in with Google can add one, and nobody can read, change or delete one from the game.
    • limits/{your account id} counts reports: at most 20 in an hour from the first, at least a second apart, and then the count starts again.
    • config/reports ({open: true}, made by hand in the console) switches reports on and off.
    • All of this is in firestore.rules; the rules are tested against the Firestore emulator in test/rules/.
  • Becoming issues: a workflow in the private repo ChefControl/floe-market-reports turns each report into an issue every 30 minutes, with the picture inline. It deletes pictures and saves after 7 days. Its code and setup are in intake/.

Development

TypeScript + three.js r186, bundled with Vite. All textures are drawn at runtime on canvas; the Baloo 2 font comes from Google Fonts.

Command What it does
npm run dev Dev server with hot reload
npm run typecheck Type-check only
npm run build Type-check and build to dist/
npm run preview Serve the production build
npm test Unit tests with coverage (fails below the thresholds in vite.config.ts)
npm run test:watch Unit tests in watch mode
npm run test:rules firestore.rules' tests, in the Firestore emulator (needs Java 21; CI runs them on every pull request)

SIM=1 SIM_MINUTES=60 SIM_OUT=sim.txt npx vitest run test/balance.sim.test.ts has a bot (test/bot.ts) play a fresh game for an hour of game time, in a few seconds, and writes when it bought each upgrade and how its money and earnings grew minute by minute. Use it to check the balance after changing prices; test/softlock.test.ts also uses the bot to check a whole game never stalls. Add SIM_STAGE=3 to play the ring from just after the buy-in instead: down in the cellar the bot runs whichever lines have no hire yet, cooks, carries bowls to the soup bar, buys the cellar's tiles, rings the gong once it says the boss's whole crowd will turn, and finds its way round the cellar's furniture.

Feature flags

src/flags.ts keeps stage 3 from players until it's ready: in the live game there's no hatch in the dock and Mr. Fugu never knocks. It's on in the dev server, the tests and the playtest build (VITE_FUGU_DEMO=1). On the live game, open it once with ?stage3=on in the address to switch it on for that device (?stage3=off switches it back off). A save that has met Mr. Fugu switches it on wherever it's loaded, so a cloud save carries on on another device.

docs/balance.md sets out the principles the game is balanced by, stage by stage, the numbers that show when something is off, and where each upgrade stands.

docs/graphics.md is the guide to drawing anything new: the Graphics setting and its menu row, building High and Low versions, keeping the game's luck intact, staying fast on phones, and checking the result. Agents get it through the graphics skill (.claude/skills/graphics).

.github/workflows/deploy.yml runs the tests on every pull request and push. On main, it builds and deploys to GitHub Pages only if they pass.

Each deploy removes the last one's files, and GitHub Pages lets browsers keep the page for 10 minutes. A page kept from before a deploy, or a tab left open across one, would ask for files that are gone: the game wouldn't start, or Firebase wouldn't load. So the page reloads once to fetch the new version (an inline script in index.html for the game's script, which the loading screen adds even when its own fetch fails, so it's still seen to fail; src/errors.ts for Firebase), at most once a minute in case the site is actually down.

overrides in package.json lifts Firestore's @grpc/grpc-js (pinned to 1.9.x, which has known vulnerabilities) to a patched release. Only Firestore's Node.js build uses it, so the game in the browser is the same either way. Drop the override once @firebase/firestore depends on 1.13.6 or later.

Tests

Vitest in jsdom. test/setup.ts stubs the two things jsdom lacks (the WebGL renderer and 2D canvas drawing) and seeds Math.random; everything else, three.js included, runs for real. loadGame() in test/helpers.ts loads a fresh copy of the whole game, optionally from a save, and steps it with tick(), so most tests read as "set up a situation, run a few seconds, check the outcome".

Source layout

File Contents
src/main.ts Entry point: boot, restart button, camera and render loop; takes the loading screen away on the first frame
src/levelCull.ts Leaves the world up top out of each frame's render while the player's down in the cellar (it keeps running)
src/game.ts tick(): one simulation step for the whole world
src/kit.ts Drawing things the way the people are drawn: rounded boxes and posts, baking many shapes into one small mesh (with a plainer copy for its shadow), High and Low versions side by side, layers that come and go with the seasons, building off the game's luck
src/batch.ts Fewer draw calls on either setting: whatever has stood still for a moment is drawn merged with its neighbours, one mesh per material (all the plain colours as one) in each patch of the map, and drops back out the moment it moves, hides or goes
src/palette.ts The game's colours that come back again and again, by name
src/props.ts, src/props*.ts The High models: the dock's (props), the machines and sleds', the campaigns', her house and the trees', the restaurant shell's, the kitchen's and the items', the farm's
src/sea.ts On High: the rolling, glinting sea, foam on the shore and round the floes and posts, cloud shadows
src/fx.ts On High: splashes, chips, coins, glints, sparkles, chimney smoke and steam, each kind one pooled mesh
src/icons.ts The drawn icons for floor tiles, pads, signs, menu tags and faces, in place of emoji
src/demo.ts The demo build's tool panel (vite build --mode demo): frame rate, Low/High, a stage 1, 2 or 3 game (stage 3 with N bosses beaten, as won or all bought), and money to add
src/fuguDemo.ts The Mr. Fugu demo (VITE_FUGU_DEMO=1): Floe Sushi built and the till one bill short of a million, so he knocks a moment in; nothing is kept
src/render.ts Renderer, scene, camera, lights, shared materials/geometry, canvas helpers
src/world.ts Static scenery: water, the dock (both stages'), fences, roads, trees
src/layout.ts The current stage and level (the world, or the cellar), where people can walk in each (the cellar's rooms and doorways too), and the ground height (terraces, bridge, garden)
src/stage.ts The stage-up shows (banner, camera pull-back, pieces in and out; down the hatch; the buyout), the ladder between the levels, and the light: each season's sky, by day, at stage 2's dusk and at night (Mr. Fugu's), and the cellar's
src/hall.ts The Floe Sushi building: floor, roof ring (fading when it would hide the player), walls, lanterns, gate, garden, kiosk booth
src/farm.ts The terraces, hillside and hot spring, farmhouse and water wheel, drying racks, channel, path and bridge
src/stations.ts Fishing pad, chopping block and cleaver, fish pile
src/fishing.ts Fish swimming, hooking, chopping into slices (three cuts, the fish clipped at each)
src/fishModel.ts The whole fish's model, shared by the water and the kitchen
src/machines.ts The auto harpoon's and the ice net's models
src/counters.ts The walk-up fish counter, drive-up window and takeout kiosk, and their customers (patience, reviews)
src/economy.ts Sale prices, and the repeatable upgrades (price, marketing, crew) and what they multiply
src/shop.ts The upgrade squares (and the fertilizer shed's, and the cellar's crafting bench, which sells every room's upgrades too) and their panel, and the modifier list in the HUD
src/looks.ts What each upgrade level looks like: price board, menu tags, headband, toques, fertilizer sacks, and putting up the campaigns
src/ads.ts The marketing campaigns, built for real (TV commercial, radio, lanterns, food critic, ...) and animated
src/rating.ts Reviews and the market rating
src/bubble.ts Order bubbles with patience rings, and mood faces
src/restaurant.ts The sushi bar: kitchen line and cooks, chefs, the plate belt, diners, register
src/garden.ts The garden tables, the serving counter by the gate, and the waiters who carry plates from it
src/rice.ts The starting rice patch, planting the terraces, the farmer and the rice porter
src/shed.ts The fertilizer shed by the water wheel: its deck, the storehouse, its props and its sacks
src/player.ts / src/playerUpdate.ts Player entity / per-frame player logic
src/runner.ts Runner AI, for all three runners
src/pointers.ts Arrows at the edge of the screen pointing the way to new upgrade tiles, and where on screen something is (the tutorial uses it too)
src/tutorial.ts Stage 1's tutorial: one idea at a time, a gold arrow and ring where to go and a bubble saying what to do, goals to save up for in the HUD, each shown once a player
src/unlocks.ts Upgrade tiles for every stage and the machines they build
src/offer.ts / src/fugu.ts Mr. Fugu's offer at the hatch (the peek, nightfall, the encounter, his lines, the answers, his sound) / his model and the hatch, with the real shaft under it (cut through the deck with the stencil)
src/hatchFx.ts The smoke and light of his entrance: dust from the shoves, the blast's smoke, the shaft of light out of the hole
src/horizon.ts The world past the bay, for the low views out to sea: the open sea out into the haze, islands and a lighthouse, and at night a moon and stars
src/fight.ts Fight night's cellar as plain data (stage 3): the lines and their machines, the ledge, the pot, the counter and the soup bar, the fans, the crew, the bosses' rushes and the gong's forecast, the fights, buying, and saving
src/cellarPlan.ts Where everything in the cellar is: the rooms' furniture, pads and machine slots, and the way from room to room
src/cellar.ts The cellar under the dock (stage 3), room by room: the arena (the ring, the stands, the soup bar, the gong, the cashier's window), the landing and its ladder, the hearth room, the prep hall, its stone wall and gate, and the hidden grow room, the office, the hidden Undertow (its tunnel, the club's bar, arches, stage and tables, and the Family's places: Eddie's room through its south wall, and Harry's office and Tommy's card room through its west wall), their walls and doorways, the earth they're dug into, the lights, walking round the furniture, and the still furniture baked into a few meshes
src/ring.ts Fight night in the game: runs fight.ts every frame, draws it, and answers it (chips, the gong's crash, the card, the grow room found, Mr. Fugu's word about the way south once the second boss's card is away), and holds the cellar still while a scene on the way south plays
src/southDoor.ts The way south: the doorman's door in the arena's south wall (knocking with nobody answering, "Password?" … "Beat it.", and once you're in, opening as you come up to it), Mr. Fugu handing over his matchbook at his desk and the matchbook up close to turn about, and the doorman letting you in, with their camera, "!", speech bubble and voices
src/cellarHands.ts The player's work in the cellar (the bins, the machines, the pot, the counter, the soup bar) and what each place says
src/ringKitchen.ts The kitchen drawn: the machines and what's in them, the ledge, the bowls flying to the counter and set out round the soup bar (its pot steaming while there are any), the pot's stew (as high as the bowls waiting), its tag and steam, the dumbwaiters tipping their trays onto the chutes, down which what they bring slides into the stores, the floor markings, the crew, and the bubbles
src/office.ts Mr. Fugu at his desk: the 💬 pad, his lines by how the ring's doing, his bubble, and his tank's fish swimming
src/undertow.ts / src/family.ts The Undertow: the Family's pads, their lines and their bubbles, watching whoever's in the room / the Family's three, Slick Eddie, Hammerhead Harry and Three-Card Tommy, built like Mr. Fugu
src/meet.ts The Family introducing themselves, once each, the first time you step up to them: the scene, its camera, their lines and their blip voices
src/guards.ts Slick Eddie's two bodyguards: sharks in black suits, narrow ties and wraparound sunglasses, one with an earpiece and one with a scar, standing either side of him in his room
src/eddie.ts Slick Eddie's fixed fights: his panel (how big a fix, its fee and the chance he's caught), paying him and rolling it; fight.ts keeps the fix and the scandal, and the gong forecasts both ways
src/loan.ts / src/loanDesk.ts Hammerhead Harry's loans: the rules (up to four fights' takings at a full house, held from when you walk in; a quarter again back, 30% of the stall's sales till it's paid; one at a time) / his desk: his controls and the IOU chip in the HUD
src/monte.ts / src/monteTable.ts Three-Card Tommy's monte: the rules (his swaps, where the queen ends up, double for finding her, his limit and his 3 rounds a fight) / his table: the three cards on his crate, gathered, shown, swapped and turned over, his controls and the stake in Fugu Chips
src/fullHouse.ts The Undertow hosts' yardstick: a local fight's takings at a full house, held from when you walk in (Harry lends two, Tommy plays up to one)
src/doorway.ts / src/clubFog.ts The way into the Undertow: the tunnel's flickering bulbs, drips and steam, the dark and the view closing in, the club's doors (shut, then opening as you come up to them, on a burst of light and smoke the first time), and the doorman's slot, eyes and bubble, hung on his door (southDoor.ts) / the smoke over the club till the doors first open, rolling back off it when they do
src/regulars.ts / src/club.ts The Undertow's barman and regulars: Angler Al, Gus, the trench coat, Doc Murk, Velvet and Inky (Harry's bookkeeper), built like the Family, breathing, looking and swaying / the club: their lines as you come near, Velvet's song, Al's drinks at the bar and Gus's rumours
src/band.ts The Undertow's house band on the bandstand: a seahorse (muted trumpet), a grouper (tenor sax), a sea turtle (piano), a crab (upright bass) and an octopus (drums with brushes, and the vibes for the bridge), playing along with the club's music eighth by eighth (noir.ts's noirScore, music.ts's noirHeard)
src/crowd.ts The Undertow's locals, who don't talk to you: the audience round the dance floor, pairs in the booths, three at the bar, two at the high table, two couples dancing and the shrimp waiter on his rounds; built from a few fish heads in their own colours, each merged into a few meshes (family.ts's settle)
src/chatter.ts Talking in the Undertow, silently: going through a line a syllable at a time, for each talker's head bob
src/angler.ts Angler Al, the barman: a sleek slate-blue anglerfish as an old-school speakeasy barman, his lure a little pendant lamp; regulars.ts stands him behind the bar
src/speech.ts A speech bubble over someone in the world (Mr. Fugu at his desk, the Family): wrapped, timed by its length, fading in and out
src/gong.ts Fight night's broadcast: the gong's panel (VS, his chips, your chances in a word), Slick Eddie's coin at the gong, the 入場 banner, the strip along the top (the bell, and the tug of war), the card after a boss, 💪, and the watch spot
src/portraits.ts The wrestlers' faces for the fight's UI, rendered once from their own models, off the screen and out of the luck
src/swarm.ts The fans in the arena: in from their tunnels, crowding round the soup bar and stepping up to it for their bowls, walking round the furniture to their seats on the benches and the floor, each side in its colour, acting each on their own and shouting in speech bubbles (a dozen yakuza and hooligan looks made like the game's people, each body part instanced, with a shadow fallback)
src/rikishi.ts The wrestlers' model
src/dohyo.ts The fights, the champion and his opponent, the referee, and the drummers
src/front.ts The restaurant as the ring's front: its takings as Mr. Fugu's rent (or a trickle, for the playtest), and its reviews
src/ringSound.ts The ring's crowd reacting to each moment of a fight (recorded, with a synthesised stand-in)
src/casino.ts / src/casinoSalon.ts / src/casinoKit.ts The harbor quay and the yacht's hull / its salon, roof and guests / what its games share (and Tommy's monte, down in the Undertow): the pads that open their controls, the camera at the table, the stake chips (buttons and stacks on the felt; a table can have its own chips and a limit), moves for cards, chips and the ball, total badges and speech bubbles
src/roulette.ts / src/rouletteTable.ts Roulette rules / the table, its wheel and ball, the board of last numbers, and the controls
src/blackjack.ts / src/blackjackTable.ts Blackjack rules / the table, its dealer, shoe and tray, and the hand as it's dealt and played on the felt
src/slots.ts / src/slotMachine.ts Slot machine rules / the bank of machines, the reels on the middle one's screen and the paytable on its glass
src/korki.ts Korki's golden statue (a NAMI Klima One) and its memoir panel
src/rain.ts Her house, the path to it, and the rain, tears and song in the circle out front
src/singer.ts The singer's look, swapped onto the player in the rain
src/youtube.ts Songs played through YouTube's embedded player: one API load, fades, mute buttons
src/holder.ts Item stacks and arcing item flights
src/pop.ts The pop-in animation for new things
src/characters.ts People and sleds: their bodies, faces and clothes for each season (the cellar's yakuza and hooligans, and its staff, the same all year), baked into a few meshes each; how they walk and breathe
src/wardrobe.ts The men's and women's wardrobes the crowd is mixed from (hair, faces, clothes, colours), with dice of their own
src/customize.ts Your look: the 👕 panel, the close-up camera, and keeping the player's look in the save and on the device
src/season.ts The seasons: their clock, the scenery's colours for each, what falls from the sky, and the season chip
src/decals.ts Deck markings (pads, drop zones, price tiles)
src/items.ts Fish slice, rice, plate, box, bowl and bill meshes
src/input.ts Virtual joystick and keyboard
src/bin.ts The bins, beside the places things are picked up: E (or Toss, on a touch screen) throws away what you're carrying
src/hint.ts How to walk: shown once a device, by its user agent, then off into the settings gear
src/settings.ts The settings menu behind the gear: sign-in, sound and music switches, graphics, how to walk, Restart, credits
src/graphics.ts Graphics, Auto, Low or High: the player's choice kept on the device, and Auto's pick by the frame rate
src/audio.ts The sound engine: Web Audio voices (tones, filtered noise, vowels, and the crowd's recordings), buses, placing sounds in the world, the scale
src/sfx.ts Every sound effect, one function each
src/ambience.ts The sea, wind, birds, insects, rain and diners, following the player and the season
src/music.ts The music: the market's kalimba, a jazz café band a season, and the gloop ring, making tunes up as they play, with parts that grow with the stage; the crossfade to the lounge band up the quay
src/lounge.ts The casino yacht's lounge band, "Five o'clock": a piano trio in 5/4, with a small room's reverb
src/noir.ts The Undertow's band, "Back booth": Five o'clock gone noir, in D minor with a harmon-muted trumpet, through a room's reverb and the club's doors (a low-pass that opens with them)
src/potMusic.ts The cooking game's music at the pot, "Gloop rush": the gloop ring at 132 in eighths, with a mix of its own, coming in as the show starts (chanko.ts) and the cellar's music and the world's sound making room for it
src/roomTone.ts The casino yacht's room tone: real recordings of a dining room, a bar and slot machines, following the player round the yacht
src/sounds/ The casino yacht's recordings, looped and levelled (credits below; the ring's crowd is in public/sounds)
src/ui.ts HUD and stage chip (which folds the modifier list), toasts, tips, floating text, the stage-up banner and confetti, and sliding the view so an open panel never covers the player
src/uiKit.ts / src/uiKit.css The UI kit every panel the player presses things in is made of (the standard: .claude/skills/game-ui/SKILL.md): cards, dialogs and full screens, four skins, main/plain/danger/choice buttons and their states (greyed when you can't afford it), and the keys (Esc closes, E the main button, 1–9 along a row, Shift shows them)
src/uiShowcase.ts ?ui=kit in dev and demo builds: every piece of the UI kit in each skin
src/save.ts Per-device save/load, migration, autosave, one-tab-at-a-time guard
src/cloud.ts Cloud saves: the sign-in button, syncing with the account, asking which game to keep
src/report.ts Report a bug or idea: its window, opened from the settings, the picture of the game, the notice of what's sent, and reports waiting for the cloud
src/sketch.ts Draw-a-Bug: the report's picture big over the game, to circle what's wrong in red (yellow for an idea)
src/sendFx.ts The moment a report is sent: a bulb lighting up for an idea, a swatter squashing a bug
src/firebase.ts / src/cloud.config.ts Cloud saves on Firebase (Google sign-in, Firestore), downloaded on the loading screen and started a few seconds in / the Firebase project's config
src/wallet.ts Money
src/errors.ts On-screen error reporting (with a Report this button), the last few errors for bug reports, and reloading once when a deploy removed a file the page needs
src/util.ts Math/random helpers

About

A cozy 3D fishing-market tycoon game in a single HTML file (three.js)

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages