Vampire warriors, rather than throw the DAT bombs, they throw JMP pointers
into the core. These pointers point to a placed trap. Once an enemy process
step on one of those pointers, it is immediately transfered to the trap and
forced to do the slave works for vampire warriors.
Earlier incarnation of vampires worked like below:
;name Vampire 1
const EQU 2365
loc MOV ptr, ptr ; throw JMP pointer to core
ADD #const, ptr ; update pointer
SUB #const, loc ; update location
JMP loc ; loop back
ptr JMP @0, trap ; the pointer weapon
trap SPL 1, -100 ; this is where the pointer points to
MOV bomb, <-1 ; core-clear
JMP trap
bomb DAT #0
This warrior throws pointers one for every 5 instructions (modulo 5).
The constant has been chosen to work well with
modulo 5. Note that the next pointer and the
next location are updated by the same constant but reversed in sign.
The trap here simply forces all processes in it to accumulate more processes
and to execute core-clear. The standard
self-splitting is not used here to allow
the slavers executing self-destruct once they finish core-clear.
Modern vampires use more effective procedure:
;name Vampire 2
const EQU 2365
SPL 0 ; self splitting
vamp MOV ptr, @ptr ; throw pointer
ADD data, ptr ; update pointer
DJN vamp, <2339 ; loop back + non-lethal attack
ptr JMP trap, ptr ; pointer to...
trap SPL 1, -100 ; ...here
MOV data, <-1
JMP -2
data DAT #const, #-const
The only changes here are the main component (vampire) and the pointer
structure. Pointer is now updated at once. With this change, it permits
self-splitting mechanism for harder
shell (protection). Another improvement is that the vampire throws pointers
faster than before. The gained speed is approximately 30%.
Samples of vampire warriors are:
Sucker,
PitTrap,
Twilight Pits, and many others.