Captain Contraption’s Safari Park · published

Hi everyone!
This next update is coming earlier than I expected, but one of our players noticed a potential game breaking bug which I've now fixed and wanted to get out there. It means two big new changes have also come with this, more information about creatures and multithreading!
Creature Inspector: creatures now explain themselves
The old creature panel showed you four percentages and one state word. Every number on it was about the creature; none of it was a reason a creature was doing something. The two questions we kept seeing players asked were "why is that chicken running away from the food?" and "what is stopping my creatures breeding?" which were both unanswerable. They're also not the same shape of question, so they now get different answers.
A reason line. Under the state word, a plain sentence saying why: "Running from a Wolf", "Walking to a berry bush", "Cannot see any food, and has not found any yet", "Being pulled back to its territory". Fear beats hunger unconditionally in the sim and always has … chickens running away and starving wasn’t a bug it was a feature… and now the chicken tells you this.
A breeding checklist. Breeding is four gates ANDed together plus a mate that meets the same checks, and a sentence can't carry that. The panel now tells you which term failed: too hungry, too tired, too hurt, no mate in range, no Chicken nearby was ready to breed, the nearest ready Chicken was no longer ready.
"Show what it sees". An overlay for the selected creature: its vision ring, its home territory leash, a line to every single thing it's currently reacting to, the heading its steering actually produced, and faded ghosts of the food and prey it remembers… drawn with the real sprites of what was there, fading on the sim's own memory clock. When the ghost is gone, the creature has genuinely forgotten the thing.
A history strip. Most of what you want explained has already finished by the time you click a creature. The panel keeps the last few things the creature did, with live timestamps: "12s ago: Running from a Wolf".
Moods. A one-word feeling: content, hungry, nervous, crowded, lonely, badly hurt, starving.
Corpses are named. They remember which animal they were, and the death cause is recorded: starved, killed while fighting, killed while fleeing, culled by a Hunter Robot.
The Park Report: your park tells you when it's in trouble
A species report beside the population display, opened by mousing over a species. How many are content and how many are starving as proportions, how many tried to breed and what stopped them and how many haven't tried yet.
A marker on species that need looking at, so a species that’s in trouble shows you on the species population view. The marker lights up on evidence, for example: nobody bred despite a real number of attempts, or a large share of the species is losing health to hunger right now.
Alerts on the ticker. Your chickens have stopped breeding, a species is dying out, a group can't find food. These fire on a change of state, never a standing condition… "28 chickens can't breed" is what a growing park looks like, "your chickens have stopped breeding entirely" is news. Everything must hold continuously for 20 seconds, needs a lower bar to clear than to trip, and disarms after firing.
Alerts share the ticker with the visitor chatter but get their own colour, an icon, a longer hold, they jump the queue and are never dropped. If you learned to ignore the ticker you'd ignore a real warning with it.
The whole thing samples the park in the background on a duration budget and never touches the simulation. Costs about 0.02ms a frame.
Performance: roughly 60% more creatures
A long campaign against the population performance ceiling, measured using a new automated benchmark that ramps creatures until the frame budget breaks (I’m thinking about finding a way to include the benchmark in the player build - but need to find the time to do it right). The sustained ceiling at 30FPS went from 632 creatures to over 1000. Roughly, in order of what it bought:
The creature vision/perception pass moved onto worker threads as a Burst-compiled job over a spatial hash, instead of every creature scanning for itself on the main thread.
Creature brains and movers now tick as batched passes from one manager rather than as ~1000 individual Unity callbacks.
The mate search moved into the same vision job instead of being its own scan, and only breed-ready creatures pay for it at all.
Obstacle raycasts cut hard: they ignore other creatures, they're capped in length, and off-screen creatures check less often. Physics2D.Raycast was 3.9ms a frame on its own.
Rigidbody interpolation now only runs for creatures near the camera.
Off-screen creatures switch their Animator completely off rather than merely culling it.
The simulation reads physics poses instead of interpolated transforms throughout, which is both cheaper and the reason runs are now reproducible (by the way, runs are now reproducible)
Also: the maximum allowed timestep is halved, so a bad frame can no longer spiral into a catch-up cascade.
A new look
The UI has been reskinned to a proper pixel-art style: panels, buttons, chips, sliders, checkboxes and dropdowns redrawn on a warm wood/cream/grass palette, with real hover and pressed states (the old hover changed nothing but the outline). Money text is gold throughout. Creature letter grades get their own S-to-F colour ramp. New pixel icons for the clock, music and settings, a recoloured loading screen, restyled main menu, and a new UI font — Fredoka, after a long detour through pixel fonts that turned out to be unreadable at the sizes this game needs.
Autosave
A crash or an alt-F4 used to cost the entire run since the only way to save was Save & Exit. The game now saves itself at moments that are quiet by construction: after a research grant is resolved, after your last creature or tech pick is spent, plus a five-minute backstop underneath if none of those other things have happened for a while. It skips rather than forces, so sitting on a popup never stalls the game, and it's suppressed during liquidation and the end-of-run summary so it can never capture a half-demolished park.
Guide buildings and paths have colours
Each guide building takes a distinct sprite variant when placed and colours its path cells to match, so you can see at a glance which loop belongs to which building. The colour is freed again if you refund it. There's also now a message when a guide building becomes available which doesn’t disappear until you have built all available buildings.
Balance
Research grants come much earlier and pay much more. The first grant moves from 10 minutes to 7 and its time reward doubles from +5 to +10 minutes. The second moves from 20 minutes to 14 …it previously unlocked at 20 minutes of a 20-minute run, so it could only ever be seen by someone who'd already banked bonus time. Visitor rewards doubled on both.
Meta money rewards up roughly 70% across the board (600 → 1050, 1250 → 2100, 3050 → 4950).
Population objectives no longer complete early. The hold timer was scaled by progress with no cap, so three times the required population ran the clock three times as fast and a one-minute objective could finish in twenty seconds. Overshoot now buys nothing and our authored time means what it says.
Star objective targets raised, particularly satisfied-visitor and visitors-see-an-animal-feed counts, on both maps. Map 2's total population objective goes from 150 to 200.
Visitor satisfaction is now a raw per-map number. Instead of "half your species", each map states how many species a visitor must see (3 on Map 1, 6 on Map 2) and the level select screen shows you the number before you start.
Vision ranges cut about 15% across the whole roster, and flocking cohesion ranges with them.
Breeding is faster across the roster, most species' breed times down around 20%.
Territory pull weakened, from half a vision range to under a third, and you can now visualise this using the new overlay.
Creature health and toughness retuned (Sheep, for one, are less armoured than they were).
Fixes
Goop robots stopped destroying buildings
An optimisation set the goop robot's animator to cull completely off-camera. The attack animation carries the animation event that spawns the explosion and a culled animator never evaluates its clip. Any robot liquidating a building off-screen left it standing, silently, and moved on to the next target as if it had worked, because the finish is driven by a timer rather than the animator.
Time and the run clock
Research grant rewards could be lost. The grant popup paused the game, but nothing stopped you un-pausing underneath it, the slider, the pause key and the speed hotkeys all still worked. At x4 an eight-minute clock is gone in two real minutes, liquidation starts, and your click on "+10 minutes" was then silently discarded. Pause is now a set of holders rather than a boolean; the popup holds one you can't lift. Same treatment for the creature picker, the tech picker and the end-of-run summary.
Two grants due at once meant one was thrown away. Every due grant was drained into a popup that can only display one, so all but the last vanished. They now queue properly.
Double-clicking a reward paid twice. The buttons stayed live through the 0.25s slide-out with their amounts intact.
Every run after the first ran at a coarser physics step. The fixed timestep is scaled with game speed, and nothing puts it back. Leave a run at x4 and the next run reads that as its baseline, a 20Hz simulation instead of 50Hz, one-way and sticky, permanent until you restarted the game. Coarser physics, coarser creature AI, coarser objective timers.
The game started at a made-up speed. Startup assigned the speed slider's index as the time scale, so index 3 meant x3 rather than whatever x3 actually is, and everything startup did ran at that speed.
Pressing the speed hotkey you were already on did nothing while paused.
Speed changes were applied twice per input, each one able to fire a feedback.
Objectives completed during liquidation now pay out in full
Save & Load
Picking a level from the level select could resume your old run instead. The mid-run save won, dragging its own level, clock, elapsed time and objectives back with it over the level you just chose. Your old run is still there if you press Continue.
Resuming could rebuild the park at an offset, because the grid resolved its terrain map from the session's most recently launched level rather than the one being resumed. The map decides the grid size, which decides where every single tile lands.
A grant that was on screen when you saved was lost it had already been removed from the list and nothing else recorded it. It's now saved and re-offered.
A guide standing exactly on the world origin was never restored to their position, because zero was being used as "no value".
Path restore now resolves saved positions approximately as well as exactly, so a float bit changed by a save round-trip no longer silently drops cells out of a loop.
Creatures
Flocking read two velocities that disagreed with each other.
Steering answers outlived the question they answered. The obstacle-avoidance cache was carried across from one pursuit to the next, so a creature could spend the first fifth of a new approach steering around an obstacle relevant to its previous target. This is what made creatures stop steering around obstacles on the way to food.
UI & Quality of Life
Music controls sometimes went blank after entering the game from the menu and stayed blank for the rest of the session, this is fixed.
The creature picker now removes each option as you take it, instead of leaving spent cards on screen.
The creature/context window scrolls once it outgrows the screen.
Under the Hood
Unity packages updated (Cinemachine, Localization, 2D Animation, Timeline), plus DOTween and Easy Save.
A full automated benchmark harness: generates a park from a population spec, ramps creatures until the frame budget breaks, captures a profiler trace at the symptom, and archives every run with time series and a browser-based viewer. Development builds only.
Runs are now reproducible step-for-step, which is what made the performance work above safe to do.
The physics layer collision matrix tidied and the ambient sound track removed.
As always, please tell us what you think. The survey feedback has been shaping every change we make!
And finally any support you can give us with increasing our wishlist numbers really helps bring the launch of the game closer and keeps us going. If that is inviting a friend to the playtest or wishlisting it yourself both really make a difference.
Thanks and Enjoy
Sean + Dave