Repository navigation
Releases: kabartay/aava
Release list
v0.6.0
Riding, archery and the interface, put right — plus a name, a colour, Elbrus, and a run of smaller fixes. Twenty-five commits since v0.5.0.
A name, a colour, and the mountain behind it
A child can now type their own name and pick a shirt colour from a palette (burgundy included, far enough from red to tell apart across a field), and the choice travels to every machine in the session. The everyday switches — language, view, voice, play-together — moved into a top bar as single-symbol buttons, with the Circassian flag now among the languages and a gear icon for settings. The northern skyline now shows a recognisable twin-peaked mountain in the style of Elbrus, set against a real mountain range rather than arbitrary hills, with the whole-valley map updated to match and to tell trees from houses at a glance.
Riding, actually fixed this time
A rider going downhill used to float above the saddle — half a metre on average, up to six metres on a motorcycle — because the height they were held to was eased toward the ground rather than following its slope. It is predicted now: a rider stays within a few centimetres of the saddle down a real bank at full gallop. Getting there took several passes — first giving the saddle its own measured height instead of a guessed one, then leaning the rider with the animal rather than the world's vertical, then this final fix to the held-height calculation itself. A horse crossing the bridge no longer falls through it into the river, and a machine on a slope too steep for it to climb now slides back down rather than getting stuck on it forever.
The bow can finally be drawn
A guard meant for the football cancelled every bow wind-up on the very frame it began, so every arrow flew at minimum strength no matter how long the child held the button. It draws properly now, and the arrow flies where its aiming arc actually shows.
Two valleys stay two valleys
Playing together kept the two children's valleys properly separate: a piece taken down on one phone could delete an unrelated piece that merely stood in the same spot on the other. Removals now only ever touch pieces built while playing together, and nothing arriving over the network is trusted without being checked first.
Saves and names
A save that fails to write, or can't be read back, is now kept aside under its own name instead of being silently overwritten by an empty one. A child who renames themselves keeps all their progress and can have their old name back — previously it was refused as "taken", permanently, by the copy of themselves left behind.
The screen, on the screen
The coin purse, the daily task, and the backpack contents now show correctly as soon as the game reopens, instead of resetting to blank until the next change. The build palette, the minimap, and the shop panel could all drift off-screen or overlap the move stick and talk button on some phone sizes; they're laid out properly now, and the checks test the actual screen shapes this is played on.
Sound that reaches a phone's speaker
A dog's bark, the beaver's grunt, the birds, and the river's bubbling sound right now — several were sweeping to twice the pitch change they were written for, which pushed them below what a phone speaker can reproduce. The sound for "no" is also raised out of that silent range. Walking into a herd of animals now gets one greeting instead of one per animal. A sound mixer now sits behind every speaker output, preventing stacked sounds from clipping, and ambient sound muffles properly underwater with a splash when crossing the surface.
Smaller things put right
The shop's two front lamps were built four hundred and seventy metres away in the hills, lighting nothing; a sold vehicle came back after reloading, still sold; the ground used to vanish for a moment when a beavers' dam finished; the goal's net had an invisible gap a ball could fly straight through; and a focused inspection of the whole codebase turned up and fixed fourteen further bugs across physics, rendering, and the interface.
All 2,047 automated checks pass.
Citing
Every release is archived on Zenodo. The concept DOI 10.5281/zenodo.22965441 always resolves to the newest one; this release has a version DOI of its own.
v0.5.0
Played together across three real phones for the first time — not two processes on one machine — and fixed the three things that only a real Wi-Fi network could show. Five commits since v0.4.5.
Hosting actually works
Hosting failed with "could not open the valley" on a real device while joining worked fine, because the Android export never asked for INTERNET: the legacy export takes its whole permission set from one hand-maintained list in export_presets.cfg, and that permission had simply never been added to it. Granted, along with ACCESS_NETWORK_STATE and ACCESS_WIFI_STATE, and a CI step now greps the preset for it so this can't silently ship again.
A number worth reading out
The three-digit code a child reads aloud to invite another phone is the last part of this device's own address — but a phone with USB debugging on can carry virtual network interfaces the game had no reason to prefer over Wi-Fi, and one of them reported an address ending in .0, a subnet address nothing is ever reachable at. The code is never drawn from an address ending in .0 or .255 now.
One sky for both children
Each device seeded and advanced its own time of day independently, so joining a valley already in progress could land at noon on one phone and midnight on the other, depending only on how long each had been running. The host is authoritative now: it sends its current time of day the moment a guest arrives, and the guest simply follows it instead of keeping a competing clock.
The other child, drawn correctly
A visitor's body is a second, hand-drawn copy of the player's own — and it had drifted: the torso stood the player's full collision height instead of the shorter capsule the player actually draws, which swallowed the head sphere whole and left only the shirt colour showing. Reported live as "red, no head, wrong size" — one bug wearing three symptoms. The torso now matches the player's own proportions exactly, and a check bounds the mesh so the two can't quietly drift apart again.
The mic switch says what it does
The on/off control next to the talk button only ever gated this device's own microphone, but its label just said "talking: on/off" — easy to read as a switch for hearing the other child, and flipping it off in that belief silences exactly the wrong side. Relabelled to "my mic" in all three languages. Separately, the voice playback buffer held only two packets of slack, so a single stutter on the sending phone could burst several packets at once and have the overflow dropped — audible as choppy speech rather than silence. Given twice the room.
Citing
Every release is archived on Zenodo. The concept DOI 10.5281/zenodo.22965441 always resolves to the newest one; this release has a version DOI of its own.
v0.4.5 — A fifth copy of the version
A fifth copy of the version number, found and closed. One commit since v0.4.4.
The BibTeX block in README.md — typed out for anyone who copies it without clicking GitHub's "Cite this repository" button — carries its own version field, separate from the tag, the export preset, CITATION.cff and .zenodo.json. It was still 0.4.2, two releases behind, and nothing had checked it: v0.4.4 fixed the fourth copy of this same class of bug, in .zenodo.json, and this one turned up in the README on the very next read.
It's 0.4.5 now, and the release workflow compares it against the tag the same way it already compares the other four, so a release can no longer go out with any of the five disagreeing.
v0.4.4 — What the name means
What the name means, and a fix to how it gets archived. Four commits since v0.4.3.
Aava
The README and CITATION.cff now say what the name is: Finnish for vast, open expanse, said most often of the open sea or a wide, unobstructed landscape. Where the word itself comes from isn't settled — it may be a variant of aapa, the term for the open, treeless mires of Finland's north, shifted by association with avata, "to open"; or a separate borrowing from Sámi — but either root points the same way, which is what the name was chosen for.
A stale archive
The DOI badge looked broken, and the actual fault was one file back: the Zenodo archive made for v0.4.3 came out labelled version 0.4.2 on its own record page. .zenodo.json carries its own copy of the version, because Zenodo's GitHub integration reads that file rather than CITATION.cff, and nothing had bumped it since 0.4.2 — it isn't the tag, the export preset or CITATION.cff, so the check that already compares those three said nothing was wrong, twice, while a fourth copy quietly lagged two releases behind. It's current now, and the release workflow checks it against the tag the same way it already checks the other three, so this can't happen silently again.
v0.4.3 — Loops, buttons and a bigger wheel
A fairground you can actually ride: a button that books a train or a gondola, doors and safety bars that close and hold rather than pass through you, loops in the coaster sized by real physics, and a rebuilt fifty-metre wheel. Twenty-six commits since v0.4.2, nearly all of them from riding the rides on a phone and reporting what looked wrong.
Two loops in the coaster
The lift climbs to fifty metres now instead of twenty, the first drop runs out on the straight rather than inside the following bend, and the train goes into two vertical loops — twenty-eight metres and twenty-three across — arriving at 29.3 and 27.5 metres a second against the 26.2 and 23.8 a loop that size needs. A loop is not a hill: it is spliced into the circuit as a stretch of track during which the base line does not advance at all, so a car leaves the rail, travels its own circumference, and comes down on the point it left. Each hangs inside a painted yellow hoop standing on its own feet, the way every looping coaster a child has seen does.
Bends are banked by the angle their speed actually asks for, tan(bank) = v²/rg, rather than at a fixed angle — the hardest bend used to pull thirteen and a half g sideways, because the layout put a six-and-a-half-metre bend right where the first drop was still paying out; it pulls 3.2 g now. Gravity along the track is read as the sine of the real slope rather than the tangent of a horizontal one, which is what let the loops get this big at all: the old arithmetic silently clamped anything steeper than forty-five degrees and thirteen extra metres of lift bought less than a metre a second.
The rider goes over the top with the car, upside down, rather than held resolutely vertical while the seat turns around them. The camera comes round to face the way the train is going and stands back far enough to see the track ahead, instead of pressing into the seat back it used to collide with. And a whole ride is one lap: a train nobody has booked runs the platform straight through, and a train with somebody in a car pulls up at the end of their lap and waits — it no longer sets off again with a rider who hasn't got out yet, and it no longer refuses to leave at all with one who has only just sat down.
The wheel, rebuilt and doubled
Fifty metres across now, the tallest thing in the valley, visible from the camp. It used to stand on legs whose lean was applied backwards — every leg ran from one point on the sand up to a top splayed five metres clear of the axle, so the whole ride balanced on one line of contact and its foot plates sat nowhere near a foot. It stands on a proper A now, and a boarding platform reaches almost to the doorway, with a safety bar across each gondola that lifts like a level crossing while it waits at the boards and locks down the moment it turns. The gondolas are half again their old size.
Boarding, at last
Both big rides used to run — or stop — with no way to ask for a ride and no way to get off one. Each now has a button on its own platform: press it, pay with a ticket or with coins, and the button turns green while the next gondola or train comes round and stands for ten seconds. A ride is one turn or one lap, and it ends where it started with the door open — stay in and it goes round again, which is a choice rather than a trap, and needs no control inside the car for a six-year-old to find.
The restraints that were meant to stop all this were themselves scenery. The coaster's shoulder bars were hinged to close a hand's breadth in front of the seat back, which is behind the shoulders of whoever is sitting there — closing through a rider rather than onto one — and neither the coaster's door nor the wheel's bar nor a locked harness had a collision shape that actually belonged to the car, so all three could be walked straight through. All four are fixed and checked with a ray fired across the opening.
A sheep that looks like a sheep
The fleece was twenty-two scattered spheres meant to read as curls; at arm's length on a phone a curl is smaller than a pixel, so they read as lumps stuck onto an animal. It's one smooth mass now, level along the back and squared at both ends, with a narrow dark face and thin dark legs coming out of it. Measuring it turned up an older fault: every animal's solid width was computed from its proportions a second time rather than read off what was actually drawn, and the two had drifted apart — a sheep, a cow and a dog were all solid across roughly two-thirds of what a child could see, which is how a quad bike drove through the outside of a sheep and touched nothing.
Riding on a hill
A machine or an animal on a slope was held dead level on purpose, because everything used to read a mount's heading back off its own rotation and a basis with pitch and roll in it doesn't decompose into the heading that was put into it. A quad coming down a bank came out perfectly horizontal. The heading is remembered now instead of being read back, so the body is free to lie on the ground it's actually crossing.
A related sign error had every animal lifting its nose going downhill and driving its hindquarters into the slope — on a cow, nearly half a metre of animal underground, reported exactly that way. Fixed, along with the identical fault in how a rider leans on a mount, and an animal now stands as high as it needs to keep both ends clear of a steep hill rather than burying whichever end faces downhill.
Things that were wrong
- A machine or a horse left standing on a cliff, or in the water, on dismount had no way back — it stayed there for good. One found on ground it can't stand on now walks to the nearest footing when the valley loads.
- The world arrived in visible frames on a fast phone screen. Physics interpolation — needed for the camera — was also quietly re-sampling everything the game animates by hand at sixty hertz and drawing it a tick late; the camera, the animals, the mounts and everything else driven every frame now opt out of it.
- The bridge's deck could throw a rider sideways into the handrail: the height a rider is held to used to be averaged over the machine's length, and on the bridge that average dipped below the deck and the physics pushed back out through the nearest wall of it.
- The engine had a quiet gear-whine tone sitting above the exhaust that swept up and down with the throttle like a kettle; a pure tone doesn't blend with noise the way induction breath does, so it read as a whistle rather than as part of the engine.
- The trampoline's rim and the wheel's boarding rail were drawn and nothing else — a motorcycle rode straight through both.
- A tree planted on the fairground before the rule against it existed stayed there forever; anything standing on ground that now belongs to a place, the pitch, the fairground, the crossing or the signs is moved off it when the valley loads, not merely refused when new.
- A belt's yellow direction arrows stood up out of the moving walkway like fins instead of lying flat on it.
Citing
Every release is archived on Zenodo. The concept DOI 10.5281/zenodo.22965441 always resolves to the newest one; this release has a version DOI of its own.
v0.4.2
A quad bike in the shop, wheels that actually turn, machines that roll through a corner instead of pivoting on the spot, a view from behind your own eyes, and animals that walk at their own pace. Eighteen commits since v0.4.1, nearly all of them from riding about on a phone and reporting what looked wrong.
A quad bike
Purple, because nothing else in the valley is and a machine is recognised at two hundred metres by its colour long before its shape. It costs 199 coins — between the bicycle and the motorcycle, as it is in speed — and goes at twelve metres a second: steadier than the motorcycle because four wheels turn at any speed, and nearly as good a climber, because the grip is in the tyres rather than in the speed.
Balloon tyres with lugs round them, suspension arms out to the hubs, curved mudguards, footwells, a seat with a back, braced bars, twin headlights, a rack and an exhaust down the right side. One stands on the shop floor at the end of the bicycles.
Machines roll
Every steered machine turned at a rate per second scaled by how fast it was going, which at low speed spins it on the spot like a shopping trolley — a quad sitting still could be rotated on its own axis with the stick. What a machine on wheels does is roll: how fast it comes round is its speed divided by its wheelbase, times the tangent of the angle the bars are at. Standing still it does not turn at all; creeping it turns sharply; at speed the same lock sweeps a far bigger circle. Backing up it steers the other way round, as a car does.
The bars take time to go over and centre themselves when the thumb lifts, and they move less at speed. Machines have weight: they gather speed rather than reaching it, and roll on when the throttle is let go. And wheels do not slide sideways — a quad cornering used to drift like a car on ice, because its heading turned while its velocity kept pointing where it had been going.
The wheels themselves were baked into each machine's body, so all three crossed a meadow on tyres that never moved. All three have wheels as nodes of their own now, turning at the pace divided by the radius, which is what rolling without slipping means.
Looking out of your own eyes
A third button beside the menu and the map swaps the camera between over the shoulder and first person. The same rig rather than a second camera, so the yaw and pitch a thumb has already set are where the head is pointed and swapping does not move what you were looking at; the body is simply not drawn from inside it. The choice is remembered between days.
The engine
An engine is two sounds, and this had only the top one: a bright wail which, pitched down to idle, is a mosquito and, pitched up, a hairdryer. There is an exhaust now — fifty-four thumps a second, each the pipe ringing after the bang rather than the bang itself, every other beat weaker and darker because a twin does not fire evenly. The two trade places as the revs come up: thump at rest, wail at speed. The quad gets the same pair pitched down, with more coming out of the pipe.
Things bought, kept, sold and left
Owning a thing was a flag: you had a bicycle or you did not. A bicycle left at the far side of the valley still counted, so the shop refused to sell another and a child standing at the counter could not ride home. The purse counts things now, a second one may be bought and is charged for, and each machine is its own object in the world. What stops it running away is a limit on what can be owned at once: three bicycles, two motorcycles, one quad, three of anything else — and a machine left somewhere is still yours, so it counts.
The shop also buys things back, for half what it charged, rounded. The machine that goes is the one furthest away, that being the one you have decided you are not walking back for. And the shelf shows the price at all times with how many you have beside it, rather than replacing the price with a tick the moment you own one.
Trees, and what an axe costs
An axe fells the tree you grew yourself now — it used to reach past it into the forest behind — and the price is the point: growing it paid a reward, and felling it gives that reward back. Without it a child plants a sapling, waits, fells it for the coins and the timber, and plants it again, which a ten-year-old finds in an afternoon.
Nothing may be planted where something else already stands: the pitch, the fairground and a stride outside its fence, the crossing and the ground at either end of it, and the signs. A tree had come up through the fairground beside the big wheel. And a stump goes when a tree grows where it stood, as many as are within a stride — felled and cleared being two different things, because the tree has to stay felled or the forest stands the old one back up.
Animals
They were scaled spheres with ears on, and a field of sheep and cows read as bubbles. Flat panels gave them corners and turned a cow into a crate; an animal is neither, but a few round masses pushed together, where what reads as a shoulder is the join between two of them. So the bodies are ellipsoids — a deep chest, a rounded rump, a long flat topline — and the heads have a brow rather than a box skull.
Markings, so two of them are never the same animal: a ginger cat is a tabby with a white bib, white socks and a banded tail; the dog has a pale chest and a patch over one eye; the squirrel has ear tufts and paws against its chest; the sheep's fleece reaches its head; the cow has patches where a cow has them, in unequal sizes.
They also walk properly. Every animal moved at one speed, which for a cow is a brisk human walk — she crossed a meadow sliding along with her legs barely moving. Each kind has its own pace now, the stride rate goes with the size, and the big ones take longer steps. And they lean with the ground they walk on, rather than staying dead level down a hill.
Two of them could be walked through: a cow, because the bodies standing in for animals were upright capsules — a post through her middle, with open air at her head and her rump — and now they are boxes laid along the animal; and a sheep walked through a parked quad, because the animals only knew to avoid the furniture of the places.
Things that were wrong
- The coaster's track was a tilted box per piece, so a child standing on it sank in, caught and shook. It is one swept surface, as the bridge's deck already was.
- Wood was never an item: the bag showed it as "?item_wood", which is what the text lookup says out loud when a key does not exist.
- A machine went through trees at speed, because the player reported having moved only every four metres and the solid trunks are streamed against that.
- The button for getting off showed a horseshoe whatever was underneath.
- "Not here" was said over a sapling that had plainly just been planted.
- Nothing is ridden indoors any more; a quad had parked between the shelves of the shop.
Citing
Every release is archived on Zenodo. The concept DOI 10.5281/zenodo.22965441 always resolves to the newest one; this release has a version DOI of its own.
v0.4.1
A small release with one fix in it that matters more than its size.
A valley survives a new phone
The Android export told the system not to include the game in the device backup. Everything a child makes — their profile, their valley, what they built, what they are carrying — lives in the app's own private storage, so a family that played for a month and changed a phone would have opened an empty valley. There is no way to notice that in testing: the only symptom is a loss that happens once, to somebody else, long afterwards.
Backup is allowed now. Android copies that storage into the owner's own Google account and restores it when they set up a new device; the game neither sends it nor sees it, which is why docs/PRIVACY.md describes it as a service between the device owner and Google rather than as something this game does.
A check reads the export preset and fails if it is ever switched off again, and confirms that the profiles and the save live in the storage the backup actually covers.
v0.4.0
A fairground on the east bank with five rides on it, a bridge over the river with a name on it, street signs where the four roads meet, and a lantern that is carried in a hand. Twenty-nine commits since v0.3.0, nearly all of them from playing it on a phone and reporting what looked wrong.
A fairground
Forty by a hundred and seventy metres of fenced sand across the river, levelled by the height field the way the football pitch is — so the terrain, the collision, the grass, the trees, the boulders and the animals all agree there is a fairground here without any of them being told one exists. Nothing grows or lies about on it: inside the fence it is trodden sand.
Five rides. A carousel whose horses stand along the circle, nose to tail, and are solid enough to lean on. Two moving walkways, thirty metres each, running opposite ways, with treads that visibly move and arrows that point the way they actually go. A trampoline twice the size of the playground's. A big wheel thirty metres to the top, turning in the plane along the river, its gondolas open on one side with a bench inside. And a wooden coaster running the length of the ground, twenty metres up at its lift hill.
Everything a child can stand on that moves carries them, and every frame is solid — the legs, the piles, the column and the sides of the belts, all of which a child walked straight through at first.
A coaster that runs on its own weight
The speed is not read off the height any more; it is integrated. Gravity along the track's own slope, a little drag, the chain holding a steady pace up the lift, and brakes on the run home. Real gravity, too: scaled to a third it ambled down a twenty-metre drop, which is the one moment the ride exists for. Eighteen metres a second at the bottom of the first drop, three over the crests, a lap in under a minute.
That is also what made the profile a proper ride. A first drop nearly to the sand, a big camelback, then hills that get smaller — because a coaster cannot climb higher than it has fallen from, and a profile that pretends otherwise stalls halfway up and stands there for ever. The bends are banked, worked out from which way the track is swinging rather than written down beside it.
Five single cars, each closed at the ends and down the far side with a doorway on the platform side, a seat facing the way it is going, and a yellow shoulder harness hinged behind the head that drops as the train leaves. It stops at the platform for five seconds every lap, because a child cannot step into a moving box.
Rides are paid for, and nothing is ever taken
A kiosk at the gate sells rides at ten coins each, the same for all of them; the trampoline and the walkways are free, because they are the two a child uses while working out what the place is.
Nothing spends a child's coins without asking. A question comes up with a red cross and a green tick under it, which need no reading: the kiosk asks before it sells, and every ride asks before it takes a ticket. Walking away from the question is an answer. Tickets are remembered between days.
A bridge, and a way across on wheels
A bicycle ridden into the river puts its rider down on the bank, which is right — you do not swim a motorcycle across — and that left everything east of the water closed to anything bought in the shop. There is one crossing now, at the camp's own latitude: the river is twenty-five metres from the door, so you walk out and onto it.
The deck a foot meets is one swept surface rather than a row of planks, because twenty-eight tilted colliders cannot be made flush and what they build is a staircase. It meets the bank exactly at both ends, arches three metres over the water, carries solid handrails and an enamel plate with its name.
Street signs, and a square
The four roads out of the camp were anonymous worn earth. They have names now, on a post in the Paris manner — Boulevard Berzeg to the playground, Avenue Kabard to the café, Impasse de Kassag to the pool, Rue des Parents east over the bridge — under a green enamel plaque naming the square itself. Each plate is turned by asking where its road actually goes, so a sign cannot point at a place its road no longer leads to.
A lantern in a hand
It was a glowing ball parented to the character rather than to the body, so it never turned with the child and never went down with them: swimming, the body sank to the chin and the light stayed at standing height beside the ear. It is carried in a hand now, and it is built like a storm lantern — a half-clear glass barrel between a lid and a base, three uprights, a bail with a ring, and a flame inside that wavers with the light.
Sound
The river had a bright hiss and burbles on it, which is what a tap sounds like. It has a body now: a low rush, a middle where most of the water is, a bright sheet on top, and bubbles with a rising note, which is the single most recognisable thing about running water. The wood got its grain back — a few hundred separate leaf ticks rather than the average of a wood, which sounds like surf. Both loops run longer and are joined end to beginning, so the click that came round every four seconds is gone.
Things that were wrong
- A child could fall out of the world: the ground was asked whether it existed rather than whether it could hold anybody.
- The forest was asked where its trees were nine times per frame; caching that took the phone from four frames a second to fifty.
- A machine ridden into a wood could not be backed out of it: steering had no bite below walking pace, and reverse spent the stick push twice.
- The open bag pushed the purse, the gauges and half the buttons off the bottom of the screen.
- Animals walked through the signpost, and rocks sat in the middle of the roads.
- Nothing lives on the fairground, the playground, the pitch or in the pool now except a cat or a dog.
Talking, and what the game does with data
Talking can be switched off in the menu, and the switch is obeyed by the microphone rather than by the interface: with it off the capture stream cannot start at all. docs/PRIVACY.md says what the game collects, which is nothing — no account, no advertising, no analytics, no server — where a child's valley is stored, and why playing together reaches only devices on the same home Wi-Fi.
The repository
Badges, a CITATION.cff, SECURITY.md, Dependabot for the actions CI is pinned to, and a release workflow that runs the whole check suite on the tag and refuses a tag whose version does not match the version inside the build.
v0.3.0
The valley got a shop you walk into, a flock and a herd in the meadows, a lake that sits up a hillside holding its own water, mountains with snow on their shoulders, and a population that is written down rather than whatever fell out of the spawning. Forty-one commits since v0.2.0, nearly all of them from playing it on a phone and reporting what looked wrong.
A shop, and things to save for
The shop could not be opened at all. The panel was written the day the animals were, the prices were checked, the close button worked — and nothing in the whole game ever opened it, so a child could earn coins for a week and never spend one. It is a place now: a green-boarded gabled barn 455 m north-east, with a porch on posts, display windows, a shingled roof, a weather vane, five lamps on the ceiling and somebody in an apron behind the counter. Five bicycles and two motorcycles stand on its floor as the same meshes a child rides, and the small goods are out on stands and on four shelves behind the counter.
Its shelf is pictures and prices and no words at all: tap a picture and it says what the thing is and what it is for, press buy to buy it. It scrolls, which the old list did not — five things fitted and the rest ran off the bottom of the screen with no way to reach them.
Nine things for sale, in price order: chocolate 1, bottle 19, axe 29, shears 39, lantern 49, whistle 59, saddle 79, bicycle 99, motorcycle 299. Chocolate is the first thing here that is used up rather than owned; wool is the first thing the shop buys rather than sells.
A motorcycle, a saddle, and machines that look like machines
The motorcycle is the fastest thing in the valley and the best climber — steeper ground than a horse with a saddle on — and everything within thirty metres leaves while its engine is running. That is the whole trade: you get there first and there is nothing there when you arrive. The engine is synthesised like every other sound here: fifty-four firings a second, three gears that the note climbs, drops and climbs again through, rising in pitch and loudness as the machine pulls away.
The saddle is the opposite kind of purchase — it makes the map bigger rather than the journey shorter, because a horse under one takes banks it would otherwise slide off.
Both machines were rebuilt from silhouettes into things: one spoked wheel shared between them, a diamond frame with chainstays, cranks and pedals and a bell on the bicycle; mudguards, a finned barrel, a tank with a stripe, mirrors, an exhaust and a kickstand on the motorcycle. Their wheels were also turned a quarter turn, standing across the frame like roundabouts, which nobody had noticed.
Sheep, cows, and a counted valley
A hundred sheep and fifty cows graze the meadows. A sheep offers itself only to somebody carrying shears and gives a fleece worth four coins at the shop; a cow gives milk, drunk where you stand, worth a third of a child's legs. Neither pays coins, and both take a minute or two to be ready again.
The populations are written down now rather than fallen into. They were a ladder of chances typed into the spawning and what came out was five hundred squirrels and two hundred dogs — so many that a child tripped over coins and the shop stopped being something to save for. Today: squirrels 300, sheep 100, cows 50, cats 50, dogs 50, beavers 30, horses 20, ducks 10, and a check counts the whole map and fails if it drifts.
There was one beaver in the entire valley. Their rule asked for ground within fourteen metres of a river thirty-two metres across, so every point it accepted was riverbed, and riverbed is under water and thrown away a line earlier. A rule that contradicts itself does not fail; it quietly produces nothing.
The lake up the hill
Both ponds were dug straight down to the world's waterline wherever they lay, because the water in this valley is one flat plane at zero. The eastern one lies on a shoulder of hill thirteen metres up, and what was there was a crater forty metres across with water in the bottom and banks too steep to climb.
A pond has a water level of its own now, its bed two metres below that level, and twenty-five metres of level beach half a metre above the water right round it, so whichever way a child swims they come out onto something flat. Swimming starts three strides from the shore.
The consequence was that nothing may assume where the water is any more. Swimming, wading, a horse's draught, a boat's float, where a mount may go, how deep a child is submerged, where trees and stones and horses may be, whether a ladder may be built, what the map paints blue, what colour the ground is and whether a football is wet — all of them measured against the sea, and all of them now ask the water where it is.
Mountains, and the ground underfoot
Snow covered 28% of the ground above the snowline: it was cut off at a steepness of 0.42, and the high ground here averages 0.85, so five sixths of every mountain was bare. Snow holds to about forty degrees and slides off past fifty, and those are the numbers now — 69% of the high ground white, 29% carrying glacier ice, and not one cliff white, which is the contrast a mountain is made of. The rule lived in two files with different numbers in them; it is one function now.
The terrain mesh is built by a different code path from the one that answers "how high is the ground here", and that path still had the old arithmetic in it: the lake's water sat metres above its own bank because the bank was still the wall of the old crater. The check that compares the two had sampled three corners of empty valley, where nothing is carved and the two agree perfectly. It samples over every pond and every levelled place now.
Riding
A wood is solid to a horse. What the world could touch was the child's own capsule, a third of a metre across, whatever they were sitting on — so a rider passed neatly to one side of a trunk while the horse under them went straight through it. A rider also no longer hangs above the saddle going downhill, is not shaken to pieces at speed (anything with a wheelbase rides the average of the ground under its ends), and is never set down inside the hillside that just refused it.
Twenty horses are turned out across the valley on the golden angle, grazing with their heads down — and grazing, on its first attempt, threw every horse's head back over its own withers to stare at the sky. The angle was the right size and the wrong way round; the check read back the same number the code had written and passed.
The playground, the café and the path
The swing is pumped rather than wound up. Each push adds to the arc up to a limit short of the bar, and a swing pumped to the top runs for a minute — it used to set a three-second timer and give the same arc however many times you pushed. Pushing the stick gets you off.
The café's terrace stood two and a half metres from its own front door with the umbrellas over the way in; it is a café's length out now. Moving it broke the reach that decides whether a child may order, which had been a number written beside the tables.
The path from the lake to the shop winds: a hundred and eighty-five metres to cover sixty-nine, because the shop stands on a plateau above a cliff and every straight line to it climbs ground at a gradient of one. A painted path up a wall is worse than no path.
The icon
The launcher icon was a flat ridge on a blue gradient. It is this valley now, in the colours the game actually paints with: pale peaks with snow, a darker ridge, a wood drawn with teeth along its top, a bright meadow, the river running towards you and a horse on the near slope. Composing it turned up that the sun and the horse both sat outside the circle an adaptive icon is masked to — on a round launcher the sun would have been clipped and the horse cut away entirely.
Licence
The code is AGPL-3.0 rather than GPL-3.0, and the name, the application id, the icon and the visual identity are reserved and not licensed — see NOTICE.md. Fork it under your own name and your own icon and you are welcome.
Also
Ducks on the ponds that give nothing and want nothing. Chocolate you can eat anywhere. A switch on the lantern. The ride button shows what you are getting on rather than a horseshoe for everything. A cat that walked into the lake walks out again. Grass and stones and boulders no longer grow through the floors of buildings. Roofs come off while you are under them, in the café as well as the shop. Sheep and cows have voices — a bleat is the wobble, a moo is the length — and a check now holds every animal to having all of the half-dozen things an animal here needs.
The APK below is a debug build, signed with a debug key: Android will warn about installing it, which is expected.
v0.2.0
The valley gets its places
Following v0.1.2. Twenty commits, almost all of them things a child asked for while playing on the phone: the playground rebuilt, a café you can walk into, boats on the pond, a pool with a turnstile, a horse that gallops, animals that walk, and a map that says which way to go.
The playground
The pad is a fifth larger and laid out in bands, so it reads as a place rather than a heap. Two swing frames with two seats each, a three-metre slide with a leaning ladder that gathers speed on the way down, a trampoline twice the first size that actually bounces — the first one never did: its test compared the child's height from the wrong origin, and the check mirrored the same mistake — a basketball hoop with three balls that are thrown at the ring rather than kicked, benches with bins, a running fountain that fills the bottle, four flower beds, three lamps that come on one by one as the sun sets, and a clipped hedge round the lot that is solid block by block. Nothing can be built on the pad any more, and anything already planted there when a save is loaded is moved just outside; a sapling had grown into a tree standing in the trampoline.
The café
A building, not a shed with a plank: a door, windows all round, a bar along the back with what is on offer laid along it — cake, a bun, a teapot and cups, coffee, a jug of water — shelves and a menu board with a picture beside each line, three stools, three tables with chairs, a sofa with cushions and a low table, pendant lights; outside, an awning and a sign, two tables under umbrellas, pots, a menu board, two lamps and a bin. A meal sits the child down at the nearest seat and puts a tray with a steaming cup on their table. The camera stays inside: the walls are on a layer of their own that the camera respects and the furniture is not. The café moved eighty metres to flatter ground.
On the water
Five rowing boats, each its own colour, wait round the shore of the big pond in wading depth. A boat is a mount that rides only on water: it carries a child across at twice swimming speed and sets them down where the bed comes up, leaving the boat floating at the far shore.
The pool moved beside the football pitch — ten metres past the western goal, parallel to it — and grew to 28 by 18 metres, with steps at the shallow end and a block to jump from at the deep. It is fenced, and the way in is a turnstile that costs five coins, with a ticket booth whose sign shows the price as a coin and five pips. Going out is free.
The horse and the animals
The horse is a fifth bigger, with a saddle and stirrups, a bridle and reins, a blaze, socks and hooves. Its legs, head and tail are parts of their own: it trots up to half pace and gallops above it, the head nods and the tail swings, and the stick chooses the gait. It is solid where it stands and the rider sits on the saddle rather than inside it.
Every animal walks on its legs now — diagonal pairs at a trot, hops for the squirrel — turns at its own rate, breathes when it stands, and steers round the playground and the café instead of walking through the slide. The dog looks like a dog: deep chest, long muzzle, big hanging ears; it asks for a stick you are holding with a soft bark every few seconds and stops once given one. The cat's meow is a cat's, with a cat's resonances, and its purr is a train of pulses a phone speaker can actually play; the first purr was a 42 Hz tone, which it cannot.
Seeing where things are and where they go
The map is baked on a worker thread, so opening it no longer freezes the game — it used to sample the height field three hundred thousand times on the main thread. Every destination is a picture on every size of the map, and a place off the edge sits on the rim pointing at itself, with the worn paths drawn between them. While the kick button is held, a faint dotted arc shows the ball's whole path, computed with the kick's own arithmetic so it cannot lie; a basketball near the hoop shows its arc to the ring the same way. The goals have a real net of strings on a sloping frame, and four floodlights light the pitch after dark.
Underneath
Terrain and forest are baked off the main thread, which is where the hitch every sixty-four metres came from. Every button on the play screen is an icon rather than a word. Russian declines: a dog wants a палку, not a палка. The perf line in a debug build now names the slowest main-thread step of each window, so the next hitch on the phone comes with its cause attached.