Having all organisms based of the same modular genetic templates allows for some interesting functionality. Up to this point you could combine a whole species genetics into a species genetic profile. If the user places a new creature down according to the profile
Now we are introducing functionality to select multiple creatures at once from different species and create a hybrid genetic profile of the selection. A creature placed from this profile would come into existence as a hybrid of both species. It also brings up the important question of what a species really is and how accurately we can hope to portray one.
Up to this point organisms mainly interacted with each other through competition for resources and space. That is to say the closest kind of direct interaction they possessed was bumping and pushing each other.
We have greatly expanded the capacity of the simulation for organism-organism interactions. This was done by creating a special set of phenotypes that may operate on two organisms simultaneously and triggers so that these new phenotypes can be activated by the collision of organisms.
Note that here we use a somewhat expanded scope for the word phenotype. While a phenotype is described as an observable characteristic determined by genetic and other factors, we include the resulting action/behavior as part of that phenotype.
Let’s just say this was not a simple task… Writing a function that can operate on two organisms simultaneously in a multi-threaded environment can be complicated. Especially if one is focused on performance and intends to accomplish the task without the use of any locks or atomic variables in a cache friendly manner. Additionally there were certain incomplete aspects of both the collision system and organism growth code that needed to be updated for this task to be successful.
Two very unique genes were created to demonstrate the flexibility of this approach. One a direct damage genes that adds a spike to an organism that inflicts damage when organisms collide. And the second a virus that is spread upon organism contact. Within the system its modeled as a phenotype that spreads to other organisms when they collide. Writing this into the system has also initiated the code of extragenomic information. There may be other interesting uses of this functionality. One could easily create structures resembling bacterial plasmids that transmit multiple genes!
The next stage will be to further develop the UI to allow for an expanded view of individual creatures, statistics, selection by criteria, tree of life, creature designer, etc… Once this is looking decent we will release a set of videos demonstrating the functionality.
During the past month I have been extremely busy finishing the code to assemble body parts. It is now (mostly) complete and working very well. I should be able to begin the addition of many new genes and creature parts.
Setting this up resulted in the addition of two new features to the genetics simulation that had not previously considered. The first being the multi-pass phenotype generation described in the previous dev post. The second while closely related to the first is far more significant. The simulation may now determine multiple phenotype from a collection of genes. For instance we have a gene for a flagella. By it’s self this genes does nothing only describing what a flagella is. Placement of the flagella is dependent on the existence of other genes. One signifies where it will be placed and the other creates the structure that it is placed on. This can result in the placement of multiple flagella in various locations. The behavior of these is determined by the flagella gene, the gene placing it, and it’s ultimate location and orientation. Currently if your have two flagella they activate simultaneously and the result in movement of the organism in a combined direction, however we are planning to expand the simulation to allow for separate activation of multiple phenotypes. So for instance with a single flagella gene but other genes specifying how a body part is assembled and behavior of parts you could for instance have a organisms that has flagella specialized for different tasks. Some could function for forward movement others for lateral and others yet for rotation.
I’ve been working today on adding a final pass to phenotype development for structural genes. Before I go any further I’ll provide an analogy to explain my motivation.
Okay lets say you have a gene for a nose. Where are you going to place that nose? Is there a gene for a head that it will be placed on? Or can it be placed directly on a body and does a gene need to exist to specify the placement. Well if this is the case obviously you wouldn’t want to generate a phenotype for that nose if it’s gene can not function without the presence of other genes. So before you can fully generate the nose phenotype you need to generate the dependent genes.
That gives you two passes to phenotype generation. The generation of the nose and then inclusion dependent on the existence of other prototypes. However that is not really enough. Would a nose be expected to function different if placed on a foot vs a head? What about the angle of placement? What if the organism has 3 fold symmetry and 3 noses are placed? So obviously further refinement is necessary.
That leaves us currently with three passes for structural gene phenotype generation. Identification of the base phenotype, inclusion or exclusion based on the existence of other phenotype, and finally refinement based on the included phenotype base set. One could argue for an iterative refinement. However, in the hopes of restraining complexity and processor requirements we hopefully will not have to go there.