In the latest version of the game this simulation comes built in! Just go to load and navigate to the Saved Games/Presets folder to find it.
urocyongames
Creator of
Recent community posts
Certainly a reduction in framerate isn't intentional, but assuming your population picks up steam over the course of that time it's inevitable. Nothing eats up frames like more critters! However if you are restarting the program and loading a save from just before you restarted, and seeing a difference in framerate with the same population, then that's unexpected.
Any time you want to make a change slowly, use the settings transition manager! Details in this devlog: https://urocyongames.itch.io/neuraquarium/devlog/563241/seasons-and-settings-maj...
There are a couple different answers to this, none of which are exactly what you want but I'll explain them for completeness's sake.
- Truly "dead end" species that never produce any subspecies and fall under a moving population threshold are automatically pruned from the tree
- There is a "purge tree" button to delete all historical data and start the tree over, but that would lose you the ancestry line of the currently extant species.
A "prune" option could probably be worked up.
This is an interesting idea -- most of these wouldn't be difficult to track, just tedious. The real pain in the neck would be adding them to the (already huge) list of graphable/trackable stats in the UI. I wonder if we'd almost want a separate list that you could swap the dropdown between -- "Traits" for genetic stats that don't change (all their physical traits, species/tags, etc) and "Stats" for fecundity and other things that change in real time. Food for thought.
Haha, the numbering scheme is kind of whatever. As the numbers get higher they are tending to increment more slowly (I never want to run into being at 1.99999999..
The only thing that really matters is that the numbers be distinguishable to the Version Migrations system.
Speaking of which: Another change in this version is a Migration that will automatically assign Agility, Armor and Slime to your existing critters from previous versions, based on their Speed and Strength stats.
Rendering the graphics is pretty inconsequential in terms of performance -- especially as fast forward speed gets higher, running the actual code for all the entities in the game takes more and more of the resources while rendering stays pretty flat. It *does* technically take more resources to render the whole map zoomed out than it does to render a smaller window so if you want to get basically as close as you can to what you're suggesting, just zoom all the way in so you can see just a tiny portion of the map -- it might get you stable framerates on, for example, 5x instead of 4x, but won't be a total game-changing difference.
Click the "load saved preset" button just to the left of the "Add Critter" button and you'll be able to select any .critter file you want as the critter to be used by the Add tool.
There are a lot of other ways to add existing critters to your sim. In addition to adding one at a time, you can:
- Use the "load preset" button in the simulation settings panel to change the default spawn to a saved critter
- Use the "merge pops" button in the main menu to bring the critters in another save into your current sim
- Use the "spawn source" option in sim settings to select a save, or save directory, to use as the source for critter spawns instead of a random or specific critter
- Use "micro-merge" to periodically merge a small number of critters from a directory of Autosaves
To give you a little additional detail:
Most Inputs are only ever positive. The exceptions are the Sensory Angle Inputs for Vision and Scent, which give the angle from the Critter to the strongest Scent or "most significant" (as a function of size, proximity, and taking camouflage into account) nearby visual object. The Angle inputs are positive or negative according to which side of the Critter the sensation comes from.
Similarly, some outputs only really do something if they're Active with a positive value, but there are also exceptions. Left and Right rotation do nothing if negative, but the Forward/Back output neuron causes the Critter to swim forward if positive, backward if negative. The "Breed" output acts the same as long as it's active, regardless of positive or negative -- if the Critter has the energy, it will reproduce with a nearby compatible partner. If there's no nearby partner, it will check its energy levels again and reproduce asexually if it has the energy (Partnered breeding is half as expensive.) Finally the "Adrenaline" output works like this -- if the Critter is not "exhausted" (on cooldown) it will either puff its body up and go into a "Rage", temporarily boosting Strength, or stretch out its tail and "Sprint," boosting its Speed.
Well, there's nothing simple about Critter brains, but I'll try and at least give you some pointers to help you out!
Here's a brand new random Critter and its brain. Brains are read from top to bottom. You can hover your mouse over each neuron to get a readout on it. Here my mouse is on the upper left neuron, the Hunger Input. When reading a Critter brain, here's a color code:
Yellow: ACTIVE (Positive)
Purple: ACTIVE (Negative)
White: Neutral
Synapses come in three Types: Standard (White), Absolute (Blue) and Inverted (Red.) Synapses have their Type color at the start and their Activation color at their end. So you can see that first Hunger Input Neuron in the upper left is Active, and has a Standard Synapse going straight down that's also Active, and two Inverted Synapses that are Inactive. (I'll explain what these Synapses are about later.)
All Critters have the same Inputs and Outputs (though the Decay Rates and Activation Thresholds for these may differ.) You can mouse across them to get the breakdown but briefly, Critters have inputs for Hunger, Pain, Maturity, Temperature, and then various inputs for Scent and Vision. They have Outputs for Forward/Backward movement, Turning Left and Right, Releasing Musk, Biting, trying to Reproduce, and Adrenaline (Rage if Negative, Sprint if Positive.)
The Neurons themselves have a unique build. Each one has a Threshold and a Decay Rate. Every tick, in typical neural network fashion, all of a Neuron's inputs are added together and fed in as the new value for the Neuron, but the Neuron's previous state plus or minus its Decay Rate (whatever gets it closer to 0) is added to those inputs as well. In this way, hidden neurons can possibly serve as a rudimentary "memory" -- high decay rate Input gets you what's happening now, a low decay neuron lower down taking a synapse from that input may tell you "This was happening recently."
If a neuron's State exceeds its Threshold (positive OR negative) then it feeds that value into its Synapses. If it's a Standard Synapse, the Neuron State gets passed down to the connected Neuron (multiplied by the Synapse strength, of course.) Absolute Synapses pass the absolute value of the activating Neuron's state: 0.5 and -0.5 both become 0.5. Inverted Synapses are funky -- they activate if the Neuron is INACTIVE and are neutral if the Neuron is Active. (So you can have a neural connection that's equivalent to "I don't smell blood" or whatever.)
Hope that helps; feel free to ask if you have any questions!
That's awesome! Love to hear about the project inspiring knowledge.
For what it's worth: I did actually spend a day today converting the Vision system to use the Jobs system. The ultimate result was... about the same! The jobs run super quick on those multiple worker threads. But it doesn't actually shave off any frames per second or enable faster speeds.
I'm going to see if I can do something with the heat/gas diffusion system, which is a big cycle hog. If I could cut those times in half it would go a long way.
A little more detail, as I've been doing some optimization work lately.
The draw loop and physics loops are already pretty well decoupled from other stuff in Unity. Physics actually runs multithreaded natively. Just as you suggest, I run all gameplay code including AI on a fixed timer, adjusted by game speed, while the draw loop runs as fast as the machine can handle. Unfortunately you can't just split some of your Unity objects off into different cores -- all the scripts run on the main thread.
Unity does have a Jobs system for performing multithreaded tasks. The trouble with applying it to NeuraQuarium is that (a) multithreaded Jobs cannot access objects on the main thread -- all relevant data must be copied and sent as raw values (b) the costliest calculations in the simulation involve large areas of the world -- all the objects in a Critter's visual field, with all of the properties used to process those objects into visual stimulus; or the set of all regions that contain a given scent; etc. Essentially, even if I were to convert some of these processes to multithreaded jobs it's not clear that the speed from using more cores would offset the cost of copying very large amounts of information back and forth hundreds of times.
I'm not done experimenting, though. Time will tell!
The high nutrition value for fruit basically frees herbivores to start sliding down the omnivore track without really "losing" any of the nutrition.
The way the Diet stat works is that herbivores get 100% of the nutrition from fruit, carnivores get 0%, omnivores 50%, and so on with all the in-betweens.
So, if you're an herbivore who is really good at finding fruit (i.e. you evolved where fruit was very rare and not very nutritious, and could only survive by evolving to actively seek out fruits) and suddenly every fruit you find is more calories than your body can even contain, you lose nothing by letting your diet ratio slip down toward omnivory, but you DO suddenly gain energy from eating other critters (say, when you bump into each other and you either bite them or let them bite you; or when you encounter a dead body just sitting there for free.)
This is something I've observed many times -- you want to see the Diet graph shift away from all yellow herbivores? Make fruit MORE nutritious, so critters don't need to invest in plant digestion to use it. Instead they can invest in meat digestion and still supplement their diet with fruit, and get a decent return.
Okay, it looks like it's become more complicated since the last time I posted instructions. (Thanks a lot, Apple.) I'll update the main page but also give the low-down here:
First, navigate to the directory where NeuraQuarium.app lives
Then run "chmod +x NeuraQuarium.app/Contents/MacOS/NeuraQuarium"
You should be able to try and run the app now but get a message saying it cannot be confirmed.
Now, open your System Preferences and select Security and Privacy.
There should be a section saying that NeuraQuarium couldn't be validated and give you an option to say "Open Anyway."
Once you've registered this exception, you should be able to run the .app normally.
A thread for interesting saves! Here's one to get you started. (Note that most patches are backwards compatible, but I'll include the version number this save was created in for reference.)
Base with Gators - a peaceful population of critters evolved from the base preset, with a small predatory group of "gators" -- big, slow, motion-activated hunters. (v.1.1.0)
Hah! Beat me by just a few hours. :)
This is fixed in https://urocyongames.itch.io/neuraquarium/devlog/295011/bug-fix-update
My critters have finally reached a milestone: I present to you, "Super Seeker." This little guy is something of a "holy grail" I've been chasing since day one.
This clever little critter is the first I've seen with the ability to not only avoid obstacles, but detect and navigate toward food in both directions. It can serve as a solid baseline for kick-starting a new germline of very successful critters -- although if you add it to an existing simulation, don't be surprised if it drives everyone else into extinction!
Haha! Yeah, while of course one doesn't deliberately introduce any memory leaks in a program... I have zero doubt that there are some. (Probably even some just built into the Unity engine.)
I definitely don't recommend running NeuraQuarium for more than a few days at a time without saving, quitting, and loading. Personally, I usually don't leave a single instance of the game open for more than 24 hours.
Making fruit rarer and more rewarding does, in general, tend to promote larger bodies. If there's more energy in the fruit than you can store in your body, not only does the extra nutrition go to waste, but you also have less reserve to see you through to the next meal you find.
"Oldest" is perhaps a misleading choice of words to describe what's being selected for that highlight. All it's looking at is the critter's generation number -- not how long it's been alive.