Tremble mortals and despair blah blah maniacal laughter blah blah kill off a main character to prove I’m a threat etcetera etcetera blah blah blah. Nothing you haven’t seen before, let’s move on to the interesting stuff:
I have been trapped in the endless dull hell that is the content management system, hence the lack of blogmaking and/or world conquering. While I was adding some of the new head types back in January, I found the whole system a pain to work with, so I attempted to improve upon it.
The attempt went poorly and I systematically broke all of the things (ALL OF THEM) but the sunk cost fallacy is strong with this one, so I kept plugging away at it.
I eventually reached critical shark quota and realised I was doing things wrong, cut a few losses and managed to bring the game back to ‘workable’. At which point, after careful consideration of the pro’s and con’s of various options, I gave up.
The content management system is functional and a lot better than it was. Asset stats are all written to a single file, I can specify and write them via the Mutation Map editor, and they show up in the editor without me needing to manually type placeholder nodes into the mutationmap.txt file. All good, if somewhat dull, things.
It’s still not quite as streamlined as I was aiming for, but that’s not my problem now, ’cause I’m working on other things for now. Future me can deal with that. May the gods have mercy on his soul.
So I’m back onto fun stuff! Starting with this:
It’s the new User Interface for the nursery. The box on the left shows the current average of all player-owned creatures: the box on the right shows the ‘Target’, that you can set either from exported creatures, or by the gene editor.
Over time, the nurse bots will artifically select for creatures that match the genetic profile of the target, breeding those that do and culling those that don’t.
The bar just underneath the creature images acts as a progress bar of sorts. Each blue dot represents a creature in the nursery, and it’s distance along the bar represents it’s genetic distance to the target. As new creatures are born and selected for, their genetic distance will close and the distribution of dots will drift from left to right.
Things I learned today # 1: wordpress can do slideshows!
As you’d expect, evolution in the nursery is faster than in the wild, but it’s still not fast, nor perfect. Even with a few in-game hours, it’s unlikely that whatever you evolve will be an exact replica of your target. I consider this a feature rather than a bug: designing your own species should be something with a bit of weight and randomness to it.
As a result, I’m planning on adjusting the way exporting and importing works in 0.9.0. There will be two types of exported creature: Specimens (exported by selecting a creature and clicking ‘Export’) and Genomes (exported via the Gene editor). Genomes can only be used as targets: they cannot be imported as living creatures.
Oh, and you can now position the nursery anywhere you like on the map during world generation simply by clicking on the map preview. Which is neato.
So… where does that leave us, re: the 0.9.0 release? Yes, I’m aware it’s well overdue, and I’ve made some changes to the plan to compensate:
* I’ve dumped the original plan of overhauling the UI. It’s still a pain to work with, but I can’t justify the time it would take. I’ll focus more on incremental improvements over the next few version than on one big overhaul.
* As far as mechanics go, I’ve implemented most of them. In addition to splitting exported creatures into specimens and genomes, I still have one moderately-sized one to add: a messaging system to help keep you appraised of events in the world, particularly ones related to your species. Together with some sort of easier way to find your creatures in the world, this should help tie the whole ‘player-interaction’ update together.
* I’d also like to get a decent number of additional new head types in: we’ve got the grazing-mammal branch in (horses, bovines, dromediares), and I’ve started on the carnivorous-mammal branch as well (canine, feline, bear), but thanks to the decision to use internet assets I have a lot more assets waiting in the wings. Just need to spare some time to add transitional forms, fur polygons, texturing and stats.
* After that, it’s really all just polish and bug fixing. The nurse bots need textures and additional code to stop them from driving through walls, there are a few freshly minted bugs with the UI to iron out, the display of player-owned clades in the clade diagram needs to be vastly improved, and I still need to track down that persistent bloody stack-overflow bug in the clade diagram that causes the game to crash during long simulations.
I’m not ready to commit to a release date until all the features are complete, but we’re on the home stretch to kick the shuttlecock into the hoop for massive damage. Touchgoal!
I am not a sports person. The point is, the end is in sight, and I’m already planning out what I want to work on for 0.10.0.
Still messing about with the design for the nannies. I think going for something a bit more “pathfinder” inspired was a good idea…
First look at the new nursebots:
These little robots will do your evil bidding inside the nursery, keeping the captive population alive and stable, as well as applying artificial selection pressures towards whatever you design in the gene editor. Because the captive population is so much smaller and more controlled than the wild, they will be a *lot* better at it than their larger cousins outside the nursary (especially now that the wild is twice the size it was).
Obviously the model is a placeholder: I’ve only blocked them out, and they don’t have a texture yet. I’m still designing them, but I needed something in the engine in order to code their behavior
I’m currently leaning towards taking the camera-stalk off of them and using a design more like the Mars Pathfinder, if only because Pathfinder is adorable:
Also, I need to pin down a name for them. Any ideas? Let me know in the comments!
Hello again minions!
Apologies for my extended leave of absense. I’m going to blame the vitamin D deficiency, although it’s quite possible I’m just lazy.
I’ve been all over the place lately. Here’s a few of the things I’ve been working on, changing, designing, redesigning, staring blankly at or considering scrapping entirely in favor of something objectively more awesome…
The current content system is a lot better than nothing, but it’s still a pain when I’m trying to import assets in bulk. It stores assets like this:
That’s a seperate folder, asset file (in this case, png images) and a data.txt file for every single asset in the game. The game interprets that structure to automatically import the assets and get their stats from the text file, but it’s still a pain to set up the folders and files.
My current task is to rework it into much simpler system, which simply stores all the assets in the same folder and uses a single large ‘Stat Dictionary.txt’ file to provide values for every asset. This reduces adding assets from a 4 step process (create folder, create file, create data.txt, edit data.txt) to a 2 step one (create file, edit Stat Dictionary.txt)
I’m very nearly done with this, and will be returning to the nursary once I’m done here.
Common Species Names
I did some experiments with the idea of generating common names for species (as opposed to the existing faux-latin scientific names). I’m thinking the most immediately recognisable way to do it would be to have an adjective that describes some aspect of them, followed by a name: “rainbow lorikeet”, “eastern rosella”, “bottle-nose dolphin”, “spotted quoll”.
So I threw together a quick, half-hour library of adjectives and sounds (I literally just pulled apart the common names of a bunch of animals), dumped it into the same algorithm that generates the latin names, and this is the result:
Short furred Ralf
One or two bugs where I accidentally cut the syllables at the wrong point (“Snnn” and “Flgon”), but otherwise the rules I’m using for syllables work quite well. If I could just find a way to assign the adjectives logically, this could be quite a viable addition to the game.
In case you’re wondering about the rules:
– Syllable 1 must end with a vowel,
– Syllable 2 must begin and end with a consonant
– and Syllable 3 is often empty.
So the first one, “Dracadpo”, is “Dra-cad-po” (Dragon-cicada-kakapo). See how many other animal names you can spot!
And yes, I’m aware I’m using the word “syllable” wrong.
Progress is being made, but it’s slow. Some images:
Some of the mechanics are in place (you can add creatures to the nursary with the move tool, and the game registers them and their offspring as “player owned”), others are still in progress.
As I already mentioned on the forum, I’ve finally given in and started using downloaded, royalty-free assets rather than modelling my own.
This isn’t quite as lazy as it sounds: it takes quite a bit of effort to turn a wolf modeled by someone else into an evolvable head type. I need to download the model, cut off the head, remove the eyes and eye sockets, seal the gaps in the model, UV it to use the fur textures, UV it a few more times if it’s got geometry for mouth or horn textures, optimise or smooth it if the poly-count is way off the average, scatter fur polygons over it, and export it.
Oh, and then I need to repeat the process for a few intermediate types so wolfy faces don’t just appear out of nowhere…
You get the idea: it’s actually more work to bastardize a downloaded asset than simply to adjust the shape of an existing one and export it. But since I suck and can’t actually model (ability to screw with existing models notwithstanding), the downloaded assets more than make up for the extra effort in quality.
Improvements to discrete/mutation-mapped Head Types
Currently, the game stores Discrete genes (head types, limbs, body covering) as integers. They mutate rarely and when they do they provide big stat changes, in comparison to the floating point genes which mutate commonly in small ways and provide a continuous spectrum between points.
For a discrete mutation to evolve, it’s proponents have to actively outcompete and displace the existing population in order to take over: the entire population can’t simply evolve statistically through hundreds of tiny converging mutations the way floating point genes can.
Those familiar with evolution may actually recognise this: it’s a textbook example of the Hopeful Monster hypothesis vs Darwinian Gradualism.
And here in Species we have something genuinely remarkable: evidence that the hopeful monster method of evolution is highly inefficient.
The discrete genes do evolve and even seem to respond to natural selection a little, but they don’t do so nearly as fast or as efficiently as the continuous ones. Creatures are far more likely to optimise their limb sizes than they are to optimise their limb type despite the significant speed/stamina benefits a more developed limb type would provide.
But enough theory, how can I use this information to improve the game?
If I convert these discrete genes into continuous ones, they would be far more responsive to natural selection. The trick is finding a way to do that. Consider this mutation map:
As a discrete map it makes perfect sense: each node is represented by an integer. Each node might be a head type, or a body covering… any of the existing discrete genes.
As a continuous map, it doesn’t work.
It *nearly* works: it works for 0-1 (0.2 rounds to 0, 0.8 rounds to 1), and can be interpreted to work for 1-2, 1-3 and 1-4 (1.2, 2.2, and 3.2 all round to 1). But the moment you have more links than nodes in the map, it fails.
The solution, therefore, would be to not represent the nodes genetically at all. Decouple the actual node’s from the genes entirely. Instead, represent the *links*.
Mutations will be a bit more complicated under this system: usually they will just add or subtract a small random value, but when they pass a node the mutation map will have to decide which branch they’re moving to and adjust the value accordingly. For example, adding 0.2 to 0.9 could result in 1.1, or it could result in 2.1 or 3.1. In all these cases it will still reference the same node and look the same, but which branch it is on will affect it’s offspring and it’s future evolution.
So that’s the technical implementation, and it would work for natural selection, since the stats of each head type could be easily lerped for in-between states. But what about the visual side of things?
It would be easy enough to just round it to and display the closest head type/body covering. But there’s other possibilities here too, although I’m not completely sure how viable they are. Fading between body coverings is the obvious one (although I’m honestly not sure how much more complexity Shader Model 3.0 can handle on top of the skinned animations and fur shader), but an even more interesting one would be morph targets on the heads: moving the vertices of the head model to an in-between state resembling the model on the other end of the link. It wouldn’t be possible to make it perfect: there would still be noticeable pops when the model changed it’s UV’s and how many vertices it had, and implementing it would be asking for some weird visual glitches, but it would provide a much smoother and more interesting transition between head types.
All long term stuff, of course, but I’m feeling optimistic some of these at least stand a good chance of being implemented.
I doubled the world size.
Specifically, I doubled the default size of the tree’s and terrain in every dimension. That’s 4 times as much area and 8 times as much volume.
The creature’s, rovers and grass are all still the same size as before, but a size 1 world in 0.9.0 will cover four times the area of a size 1 world in 0.8.0, the 6 meter tall tree’s are now 12 meters tall, and the cliffs are twice as high.
This was a good move. The world is still pretty tiny by real-world standards, but it doesn’t look tiny anymore. It is now a lot easier to believe that baby Primum specium actually are their canonical 30 centimeters.
Of course, some things have had to be changed to support this…
Ground textures had to be re-sized to keep them from noticeably pixelating at double size. The tree’s are also noticeably low res, but I haven’t addressed them yet.
Gameplay-wise, I’ve doubled the creature speed modifier, meaning the reduced density of tree’s and creature’s shouldn’t overly impact survival. I’ve also increased the sight and hearing range modifiers, for similar reasons.
But anyone who has played the game with World Size 2 knows it had a few problems. Some of these were easy fixes: increasing the size of the tree’s as well meant I avoided any of the scaling issues the vegetation simulation had. Grass density was trickier, since grass is tied to the LOD grid, but still ultimately a simple matter of multiplying the amount of grass by 4.
But the most noticeable problem was those Out Of Memory exceptions you could generate by creating over-sized worlds.
I had already reduced their frequency for 0.8.0 by addressing the memory problems in the tree simulation, but they are still there. This is at least partly because, in the released versions, I’m offloading grass vertices for the entire map to VRAM at the start of the game.
That’s a lot of grass vertices: enough to cover the entire map in the highest density grass. Simply making them fade out when you’re not looking at them doesn’t remove them from memory. And this is VRAM, not RAM. Your graphics card generally has a lot less memory than your computer.
Of course, I didn’t implement it like this for no reason. Sending a large number of grass vertices from the CPU to the graphics card is a slow operation: continually doing it on the fly so we needed to only store the vertices around the camera would be prohibitively expensive and cost a few frames per second.
But, that wasn’t going to work for 4 times as much grass, so I had to come up with an entirely new way to render grass: one that didn’t require sending grass vertices to the GPU every frame, and didn’t take up more memory than we needed.
The new system looks almost identical, but it acts significantly differently. To start, we only generate enough grass for a small area in the north-western corner of the terrain. Then we send those vertices to the graphics card when the world is created.
Then, when the game is actually playing, the camera continually tells the grass shader where it is on the map and the shader translates the vertices horizontally to follow the camera around. So as you walk the map, you’re not seeing a unique set of grass billboards: you’re seeing the same square set tiled across the map, like a texture.
But translating horizontally would only work on a flat world: the grass still needs to actually appear at the height of the terrain. This is accomplished by handing the shader the terrain’s height-map itself, along with instructions to translate vertices vertically to meet the terrain.
Interestingly, this means the grass doesn’t *exactly* follow the terrain geometry anymore. The texture is interpreted by the shader by interpolating smoothly between pixels, while the geometry is subdivided into sharp triangles. If the terrain wasn’t smoothed, this could potentially be quite noticeable, but unsmoothed terrain would be ugly anyway so I consider that a small price to pay.
So, rather than costing CPU time, the cost of the new grass is more vertex shader work. It still has the potential to impact performance when you’re GPU-bound, but not by too much: I’ve lost 2 or 3 fps when playing the game with no creatures to get in the way. Since I expect most players are more interested in having a decent number of creatures wandering about, which puts the burden of work back on the CPU, I’m willing to accept this cost for now (there’s still plenty to optimise in the future, of course).
For those wondering how this affects the Facility Design: I’m implementing an above-ground nursary for 0.9.0. Indeed, that’s a big part of why I’ve increased the world size. Turns out an octagon of fences (a new style of fence, too) is far easier to implement than a method for rendering an underground base.
This will most likely serve as another placeholder, though: there’s still not enough room for any other facilities, and I want to provide room for the rovers, gene lab, museum and AI core. But for now, we only need a single facility: the nursary. A larger world provides enough room for that without subtracting too much space from the wilds.
The trojan has been removed, and a firewall has been put in place to prevent malware from making it’s way onto the site again.
A word of advice to fellow website owners: if your “website protection” software doesn’t explicitly say it includes a firewall, then it’s entirely a reactive scan and you’re not actually being protected from anything at all.
There’s a trojan malware on the site. Turns out the expensive software I bought thinking it protected it from that sort of thing… didn’t.
If you skip straight to the forums you’re most likely safe, but the homepage is infected. If you’ve visited it in the last few days, run a malware scan. (I recommend malwarebytes)
Rather than shutting it down and trying to deal with it myself (something I am not qualified for), I’ve paid for experts to do the cleanup and signed up for the extra software that *is* supposed to protect from this sort of thing.
All of the apologies!
The site should be safe again within the next day or two.