Papers have basically no offensive power. They copy itself around the core and
may overwrite the opponents code. It's a good strategy unless your opponent is
just a simple stone (dwarf) which only dat-bomb and in/decrement the core.
If such a stone contains additionally imps, the situation will be completely
different. The paper must kill now, beside the stone, also the imps to get the
victory. Otherwise the battle will end in a tie.
But there are also all those modern scanner (
HSA,
Willow,
Claw,
Zooom,
Win
etc.) and oneshots (
CrazyShot,
G2,
Geist etc.) which will give a paper a really
hard time to survive. Therefor the bombing is important to increase the chance
for a lucky hit to kill or even wounding the scanner. But it has also another
good effect, all the bombs the paper leaves in the core slowes down the scanner,
because it spends time to wipe that 'useless' bombs. Also the oneshots will be
entraped to start their core-clear in a 'dead' area of the core where it won't
hit immediately or even early enough the paper. And finally if the paper battles
against a stone/imp it increases its chance to kill not only the stone but also
the imps.
2.1 The in/decrement inside the silk-engine:
A first approach to make the paper deadly against imps is the use of
in/decrement in the spl-instruction of the silk-engine (see Chapter 2.4). The
in/decrement before copying the papers code can kill imps. But the chance for
such a lucky hit depends on how well the paper spread its copies. Usually it
won't kill the imps not more than some few percents of all rounds. That is for
sure not very satifying if the paper wins only about 1-5 times in a 100 rounds
battle.
2.2 Additional Bombing Instructions:
For a further increase of the offensive power the paper must include special
lines which don't deal with the self-replication but with some additional
bombing of the core.
The most simple way of realizing this would be for example (as found for example in
Timescape or
Head or Tail) something like:
mov.i {bStep1, <bStep2
This instruction modifies 3 locations. First it decrements the locations bStep1
and bStep2 relative to the mov and then it moves what is found at bStep1-1 to
the location bStep2-1. But remember that the paper is running with a decent
number of parallel processes. That means, that the mov will executing more then
just once. As long as the mov will be executed the location bStep2 away from it
will be decremented and also will be used as a pointer for the bombs. This
results in a linear (core-clear like) bombing, where the bomb-run is as long as
parrallel processes are used (from bStep2-1 until bStep2-P).
2.3 The Bombs:
The mov could be also used to throw more specialized bomb which hurts the imp
much more, like:
mov.i bomb, >bStep2
.
.
bomb dat.f >2667, >5334
This kind of bomb can be found for example in
Pulp,
Disincentive,
Recycled
Paper or
CC Paper 2.
The bomb in this example is commonly used against 3pt imps and is good against
both, a- and b-driven imps.
Much more deadly against imps are the following bomb used by
nPaper II,
Revenge of the Papers
or
Machines Will Rule:
aBomb mov.i #1, {1
and
bBomb mov.i #1, <1
This bomb can be nicly included into the paper, where they can copy itself
as bombs. This will save one instruction in the paper. Another advantage is, that
it can also good against djn streams and forward clears, as discussed below for cBomb.
The only weak point is, that both are highly specific either against
a-driven imp (mov.i #iStep, *0) as in the case for aBomb or against b-driven imp
(mov.i #value, iStep) as for bBomb. That means, if a paper is using aBomb it
will usually wins about 30% or more of the rounds if the opponent is using
a-driven imps, but wins only about 5% if the opponent is using b-driven imps.
Another bomb less commonly used in modern papers is this simple one:
cBomb dat 1, 1
This bomb is targeted against djn streams and forward clears, two forms of
attack often used by paper enemies. The effect on streams is to make the
process go ot of the loop, wasting time; the effect on forward clears is
deadly, look at a simple forward clear
gate dat 100, 1000 ;the clear is running 1000 cells away
....
clr mov bomb, >gate ;what's bomb don't matter, sure nothing with
jmp clr ;a b-field of 1
If we hit the gate with cBomb the clear will begin running inside itself,
till it reaches clr line and self destructs, very effective.
2.4 Embedded Coreclear:
To increase the linear bombing run of the paper it is possible to introduce a
loop inside the paper as found for example in
Benji's
Revenge or
CC Paper 2:
mov.i bomb, <1
jmp -1, <bStep
.
bomb dat.f >2667, >5334
The result is that every copy of the paper contains a simple core-clear which
continuously wipe the core. This leads in a better core coverage but on the
other hand it gives scanners also a better chance to slow down the paper by
stunning all these numerous generated core-clears. A good idea in this case is
to overwrite the own code which the paper left behind. If a scanner has stunned
these codes the paper will overwrite it with the dat bomb and prevent itself for
getting slowed down. Therefor a good starting point for the core-clear is
essential. Instead of the jmp-instruction a
djn -1, <bStep
can be used, which would give an additional djn-stream.
One can nicely combine this feature with the above discussed anti b-imp mov-bomb as found for example
in
Revenge of the Papers.
Interesting to mention is that better results are observed when the djn points to the mov of the silk-pair.
Also the use of a djn.b -2, #value shows a significantly positive effect, as first observed in one of Vowk's
evolved papers. The above mentioned improvements are also found in
paper(paper(paper(clear))).
nothB spl @nothB, <nstep1
mov.i }nothB, >nothB
bomb mov.i #1, <1
cc djn.b -2, #2335
2.5 Embedded Stone:
One could get a step farer than just embed a simple core-clear. Embedding
a stone. Well, on the first glance it sounds quite easy to do this. Just
put an add-instruction into the core-clear part of the papers code and that's it.
But unfortunately it isn't that easy, because we are running in parallel processes.
We must keep this in mind, because the add-instruction would execute P-times (P: number of paralell processes)
in a raw followed by P executions of the mov-instructions in the above mentioned
way. To let run a mov/add-instruction pair inside the paper in alternate order we
must add an additional spl 2 in front of it, as seen in the example below.
0000 spl 1
0001 spl 1
0002 mov -1, 0
0003 silk1 spl.a @0, {pStep1
0004 mov.i }-1, >-1
0005 spl 2
0006 mov.i bmb, bStart
0007 add.ab #bStep, -1
0008 bPtr jmp -2, <-2
0009 bmb dat >2667, >5334
Using a spl 2 would lead into the following execution pairs (the executions of the
copies and 0000-0004 are not shown for clarity):
7x 0005 (spl 2)
7x 0006 (mov) / 0007 (add) <---\
7x 0007 (add) / 0008 (jmp -2) |
7x 0008 (jmp -2) / 0006 (mov) |
\___________________________________/
The alternating mov/add pattern leads in a stone-like bombing pattern, while the
jmp/mov-pattern makes due to the b-field of the jmp-instruction a linear wipe. The
add/jmp-pattern in this case doesn't make any corecoloring.
See also
Minireturn of the Jedimp which contains a kind of
imp-launcher/stone part inside the paper.
Another more sophisticated way of generating a stone-like bombing pattern is to
take advantage of the alternating execution order between the 'parents' and the
'children'. The bombing process would be spread over the copies of a paper instead
of runing independantly in every copy. One could say that all paper cooperates with
its 'parents' and 'children'. A cooperative paper. Below is the first
published example using this technique,
Paper Dreaming 2.
spl 1
spl 1
spl 1
p1s spl @0, >spacing
mov }p1s, >p1s
p1k mov p1b, >p1s+8-8*incr
add #incr, @-1+spacing
mov p1b, >p1s+80-7-8*incr
sub #incr+1, @-1+spacing
jmn.f @0, {p1s
p1b dat <2667, <5334
However, all of the above described ideas aren't effective enough
against
modern scanner and oneshots. The reason seems to be mainly a
disadvantageous process allocation between self-replication and
bombing.
The bombing run is way too slow to trouble scanners. Therefore the
first
and most important step in developing a successful "silk-stone" is a
good
process allocation.
We can find a possible answer on a look to Minireturn of the Jedimp's
code. It uses a spl #something right behind the spl/mov-silk to speed
up the imp-launcher. One could do the same by using a dwarf instead of an
imp-launcher.
It will act then like a pure stone with a steady deceleration of the
self-replication.
The first published warriors using a 6-line silk-dwarf are Christian
Schmidt's
He Bombs Alone,
unheard-of and
Venomouse Philtre:
spl 2
spl 1
spl 1
silk1 spl @0, <pStep
mov.i }-1, >-1
spl #sStep, >-sStep
mov {sStep, {-sStep+1
add -2, -1
djn.f @0, {-2
This silk-dwarf scores quite good against most carpet scanners but
unlikely to 'normal' dwarfs it ties against other papers and stone/imps. It shows
only weaknesses against oneshots and blur-style scanner.
Also other silk-dwarfs with different dwarf-components are possible.