Last updated: January 12th, 2023
Evolve 5.0
VOLVE    5.0

Activity 2: Bullet

This example shows how you can add a new capability to the simulator. We are going to create a bullet capability. A bullet will be triggered from TRAP1 and TRAP6. These instructions will cause a bullet to be emitted in a particular direction.

Create a new strain profile called Uneatable. To make a strain uneatable, set the EAT Mode to be 8. Install the uneatable strain profile in slot 5.

Create a new strain profile called e_bullet. Configure it with the shoot3.kf seed file. Configure SPAWN-MODE to be 5 (so that this strain has the power to spawn new organisms of a different strain).

Make sure to protect all of this instruction: SPAWN (in the e_bullet strain).

Make sure to protect all code blocks up to 'evolve'.

A bullet is just another organism, but it is running a bullet program. This file is provided in the application resource folder ev5stuff. Make sure to use the file shoot3.kf.



;
; spawn3 - this version eats in the direction of motion until no more
;
; This creature uses SPAWN to make an uneat-able bullet
; out of itself to kill a creature.
;
; assumes SPAWN changed to not copy stacks
;
; STRAIN 5 should be un-eatble eat_mode -> 8
; (x y energy strain cb -- rc)      SPAWN
;
; SPAWN mode: set these bits    (spawn_mode=46)
;   bit 1   keep protected code blocks  (optional)
;   bit 2   can change strains
;   bit 8   dont mutate
;   bit 5   inherit "010" data stack items (2)
;
main:
{
    evolve call
}

_trap1: { }
_trap2: { }
_trap3: { }
_trap4: { }
_trap5: { }

; (x y -- rc) shoot
_trap6: {
    DSLEN 54 >= ?exit
    2dup 1 5 bullet SPAWN pop 2pop
}

_trap7: {  }
_trap8: {  }
_trap9: {  }

;
; (x y -- )
; go out
;
bullet:
{
    { 2dup OMOVE ?loop } call       ; bullet move

    {
        2dup EAT pop
        2dup OMOVE pop      ; ( x y -- x y rc)
        255 NEAREST EAT
        ?loop
    } call

    HALT
}

; --- protected / unprotected ---

;
; standard seed program
;
evolve:
{
    -1 0 trap6

    reproduce call
    reproduce call

    ;
    ; go SOUTH-EAST until blocked (eat along the way)
    ;
    { 1 1 2dup eat pop omove ?loop } call

    reproduce call

    ;
    ; go WEST until blocked (eat along the way)
    ;
    { -1 0 2dup eat pop omove ?loop } call

    reproduce call

    ;
    ; go SOUTH-WEST until blocked (eat along the way)
    ;
    { -1 1 2dup eat pop omove ?loop } call

    reproduce call

    ;
    ; go EAST until blocked (eat along the way)
    ;
    { 1 0 2dup eat pop omove ?loop } call

    reproduce call

    ;
    ; go NORTH-EAST until blocked (eat along the way)
    ;
    { 1 -1 2dup eat pop omove ?loop } call

    reproduce call

    ;
    ; go SOUTH until blocked (eat along the way)
    ;
    { 0 1 2dup eat pop omove ?loop } call

    reproduce call

    ;
    ; go NORTH until blocked (eat along the way)
    ;
    { 0 -1 2dup eat pop omove ?loop } call

    reproduce call

    ;
    ; go NORTH-WEST until blocked (eat along the way)
    ;
    { -1 -1 2dup eat pop omove ?loop } call

    reproduce call

    ;
    ; do it all over again
    ;
    1 ?loop
}

reproduce:
{
    ;
    ; compute 1/4 of our energy, and store in R0
    ;
    energy 4 / R0!

    ;
    ; Make 1st spore to the square on our left.
    ;
    -1 0 R0 make-spore pop

    ;
    ; Put 2nd spore at the same spot (fertilizing it)
    ;
    -1 0 R0 make-spore pop

    ;
    ; get the hell out of the way so we don't eat our own
    ; babies, or they don't eat us.
    ;
    1 1 omove pop
    0 -1 omove pop
    0 -1 omove pop
    0 -1 omove pop
    0 -1 omove pop
    0 -1 omove pop
}