Rawrndry - iOS cozy prehistoric laundry game

Reelio - Photography & film studio Framer template
Reelio - Photography & film studio Framer template
Reelio - Photography & film studio Framer template
Reelio - Photography & film studio Framer template
Reelio - Photography & film studio Framer template
Reelio - Photography & film studio Framer template

Category:

iOS Game

Position:

Coder

Duration:

4 weeks

Rawrndry started from a question we asked at the very beginning: what job would you pick if money did not matter? One answer kept coming back, which is running your own small shop. Something with your hands, a customer in front of you, and a day that ends.

So we built that, and put it in the Stone Age. Customers walk up with a sack of dirty clothes. You scrub them clean on a rock in the river, dry them, fold them into a leaf, and hand the bundle back. Then the next customer arrives. I worked on the team as one of three coders.

My Approach

A cozy game only feels calm if the code under it is steady. My job was the part players never see, so the art our designers made had something solid to sit on.

I used a manager pattern to keep the rules out of the screens. Each SpriteKit scene only draws things and reads taps. Everything else lives in its own manager: who the next customer is, what they ordered, how much money you have. That meant a change on one screen could not quietly break another, and my teammates could build their own scenes without waiting on me.

Vision and Innovation

We wanted to take a chore and make it something you actually want to do. Laundry in the Stone Age meant scrubbing on a river rock, pressing soap made from flowers and fruit into the fabric, and drying clothes by blowing into your phone's microphone, which the game really does listen to.

My share was making the actions feel physical. When you scrub, the phone buzzes, and the buzz gets stronger the faster your finger moves. Soap bursts into petals or foam the moment it lands. None of it is complicated alone, but together it is the difference between a game that looks nice and one that feels nice.

The Challenges

A cozy game has to feel busy and calm at the same time, which is a hard thing to ask of code. While a player scrubs one shirt, the game is tracking touches, fading a stain, playing a sound, running haptics, and spawning bubbles all at once. Written carelessly, sounds pile up, the vibration sticks on after you lift your finger, and the frame rate dips, and the cozy feeling is gone. On top of that, three of us were pushing code to the same project, so screens were being rewritten while other people built on them.

How I Solved Them

I wrote one AudioManager for the whole game instead of letting every screen play its own sounds. It swaps the music between scenes, keeps the river ambience running while you wash, and holds a single AVAudioPlayer for scrubbing so the sound never restarts on every tiny finger movement. When a bug turned up where the folding sound kept playing after you left the screen, there was one place to fix it instead of four.

For washing, I measure the distance the finger travels across the clothes, not how long you hold it down. The stain's opacity fades in step with that distance, so effort on screen matches effort in your hand. For the vibration I run one continuous Core Haptics pattern and change its intensity live from the swipe speed. The first version fired a fresh buzz on every touch and felt like static. This one feels like friction.

Player-Centric Design

Small decisions matter a lot in a game this quiet. The customer's order used to be visible only at the front desk, so if you forgot which soap they wanted, you had to walk back and lose your place. I added a paper note pinned in the corner of the washing screen. You just tap it and their order appears, including which clothes you have already finished.

I also made the game remember you. Closing the app used to send you back to day one and replay the intro. Now the day you reached, your gems, and anything you bought persist in UserDefaults. For a game meant to be relaxing, being punished for closing it was the opposite of the point.

What I Built

  • AudioManager: one system for music, ambience, and sound effects, wired to the volume sliders in settings.

  • Haptics: a continuous Core Haptics pattern whose intensity tracks scrubbing speed.

  • Washing mechanic: soap picking and validation, stain opacity tied to swipe distance, bubbles, and the petal and foam bursts.

  • CustomerManager: generating each day's customers, their orders, the fragrance they ask for, and what the job pays.

  • Shop: buying day boosts with gems, and the rules for what each boost changes.

  • Game Center: GameKit sign-in and seven achievements, counted on the device first so players who never sign in still keep progress.

  • Save system: day, gems, and purchases kept between sessions.

Architecture

Swift and SpriteKit, with files split by the job they do: managers hold the rules, models hold the data, scenes only draw. Every image and sound name lives in one enum, so renaming an asset never means hunting through five screens. The game runs in English, Indonesian, and Spanish.

What I Took From It

How much of a cozy game is invisible. Nobody notices an audio system that never doubles a sound, or a save file that is simply there when they come back. They only notice when it is missing. And working with two other coders on one codebase taught me the rest: the code I was proudest of was not the clever code, it was the code my teammates could read and build on without asking me first.