Spiele-Trainer: Spritekill
»Game Over«. Wieder einmal haben die Gegner gesiegt und Sie erst die zweite von zwanzig Spielstufen erlebt. Die Lösung: Entfernen Sie doch einfach die Gegner aus dem Spiel. Dabei hilft Ihnen das Programm »Spritekill«.
0ft vergeht einem der Spaß an manchen Spielen, wenn man 20 bis 30 mal an derselben Stelle wegen dem gleichen, gemeinen Gegner abgeschossen wurde, oder wenn man wieder mal diese blöde Eisenstange berührt hat und von Tausenden von Volt angeschmort wurde.
Doch das war einmal! Denn mit »Spritekill« können Sie lässig jeden unerwünschten Schuß, jeden noch so gemeinen Gegner auslöschen. Im Spiel herrscht dann ein wenig Ruhe, die dem Spieler zu längerem Bildschirmleben verhilft.
»Spritekill« arbeitet etwas anders als die üblichen Spiele-Trainer. Diese entfernen meistens alle Sprite-Kollisionsabfragen aus dem Spielprogramm mit dem Erfolg, daß man keine Bonuspunkte erhält, weil man auch nicht mit den brauchbaren Gegenständen kollidieren kann. Im schlimmsten Falle wird das Ziel, in den nächsten Level zu kommen, nicht näher gebracht, sondern völlig unmöglich gemacht, weil man gar nicht die notwendigen Punkte oder Gegenstände zusammenbekommt. Ganz im Gegensatz dazu arbeitet »Spritekill«. Hier gehen Sie das gesamte Spielprogramm durch und entfernen ganz einfach die Ihnen unliebsamen Sprites. Denn mit etwas, was Sie auf dem Bildschirm nicht sehen können, können Sie auch nicht kollidieren! Die Bonusgegenstände und die eigene Figur bleiben selbstverständlich im Spiel drin, vielleicht noch ein paar einfache Gegner, damit es nicht zu langweilig wird.
Obwohl Spritekill ein recht kurzes Maschinenprogramm ist, müssen wir einen DATA-Lader (Listing 1) und kein MSE-Listing veröffentlichen. Dafür ermöglicht es der DATA-Lader, »Spritekill« in beliebige Speicherbereiche zu legen. Denn meistens wird man das sehr kurze Programm im Bildschirmspeicher unterbringen wollen, was die Verwendung des MSEs verbietet.
Alle Funktionen von »Spritekill« werden mit insgesamt 15 Tasten gesteuert, die alle Autorepeat haben. Dadurch fällt es leicht, auch längere Spritefolgen zu löschen.
Zur visuellen Kontrolle hat man:
- die aktuelle Sprite-Block-Nummer
- die Startadresse des im Augenblick sichtbaren Sprites
- das zu bearbeitende Sprite
- einen Spritepuffer
zur Verfügung (siehe auch Bild 1).

Sämtliche Befehle sind in der Tabelle aufgelistet.
Taste | Funktion |
---|---|
+ | Nächster Spriteblock |
- | Vorheriger Spriteblock |
↑ | 16 Sprites vor |
← | 16 Sprites zurück |
B | Weiterschalten des 16-KByte-Bereichs |
M | Umschalten HiRes/Multi |
X | Umschalten zwischen normaler/expandierter X-Darstellung |
Y | Umschalten zwischen normaler/expandierter Y-Darstellung |
SPC | Löschen des links dargestellten Spritebereichs |
C | Kopieren des links dargestellten Sprites in den Puffer |
R | Kopieren des rechten Spriteblocks in den linken Spriteblock |
Crsr rechts | Erhöhen der Startadresse des links dargestellten Sprites |
Crsr runter | Erniedrigen der Startadr. des links dargestellten Sprites |
F7 | Zurücksetzen der Einzelbyteverschiebungen |
Run/Stop | Verlassen des Programms |
Um mit »Spritekill« möglichst effektiv und schnell zu arbeiten, hat sich folgende Strategie durchgesetzt:
- Nach dem Starten von »Spritekill« durchsucht man den Speicher erst in größeren Schritten mit den beiden Pfeil-Tasten.
- Sobald man ein Sprite erkennt, geht man mit»+/—« so lange weiter, bis das letzte Sprite kommt.
- Ab da durchsucht man den Speicher in der anderen Richtung und löscht die ungewollten Sprites einfach mit SPACE.
- Zum Schluß drückt man RUN/STOP und startet das modifizierte Spiel.
Manche Spiele haben ihre Sprites vor dem Programmstart an anderen Speicheradressen liegen, wie beim späteren Ablauf. Deswegen kann man mit den Cursor-Tasten den Speicher byteweise durchsuchen. Sollte man also nur ein halbes Sprite oder ein verschobenes Sprite finden, muß man es mit den Cursor-Tasten vor dem Löschen voll sichtbar machen.
Wie gesagt, ist es am praktischsten, wenn »Sprite-Kill« im Bildschirmspeicher steht, weil dieser von den meisten Spielen während des Ladens in Ruhe gelassen wird. Wer eine solche Version auf Diskette erzeugen will, sollte im DATA-Lader als Startadresse »1400« angeben. Will man dann ein Spiel von den Gegner befreien, sollte man folgendermaßen vorgehen: Spiel laden, dann »CTRL-7« zur Umschaltung auf Dunkelblau (Hintergrundfarbe) drücken, danach »SHIFT-CLR/HOME«. Jetzt mit »CTRL-2« den Cursor wieder sichtbar machen, Spritekill laden und den SYS-Befehl zum Start (1400) vorgeben. Nun können Sie vorgehen, wie oben beschrieben.
Sollte ein Programm mehrteilig sein und einen Autostart haben, wird es kritisch. Sie müssen dann mit einem Monitor die einzelnen Programmteile laden, mit Spritekill durchsuchen und wieder speichern. Bei Original-Disketten sollte man das sicherheitshalber unterlassen, da man durch Speichern auf dem Original meistens den Kopierschutz zerstört und somit das Spiel nicht mehr laden kann.
(Garry Glendown/bs)0 rem ***************** 1 rem * sprite - kill * 2 rem ***************** 3 rem * v o n : * 4 rem ***************** 5 rem * g. glendown * 6 rem ***************** 7 rem * tel.: * 8 rem * (06621)/73483 * 9 rem ***************** 10 print"{clr}{wht}spritekill":poke53281,0:poke53280,0:print"von garry glendown" 20 input"startadresse";sa$:sa=val(sa$) 21 ifsa>40429andsa<49152orsa>52716orsa<1024thenprint"ungueltig!":goto20 29 print"endadresse:"sa+532:input"ok? j/n";a$:ifa$<>"j"then20 30 ifsa<6000thenfl=1 35 iffl=1then100 40 input"abspeichern j/n";a$:ifa$="j"thenfl=1 50 fort=satosa+531:reada:poket,a:ch=ch+a:next:ifch<>65921thenprint"fehler!"ch:end 51 ch=0 60 readco:ch=ch+co:ifco=-1then200 70 b=peek(sa+co)+256*peek(sa+co+1):b=b-28672+sa:h=int(b/256):l=b-h*256 80 pokesa+co,l:pokesa+co+1,h:goto60 100 fort=49152to49683:reada:poket,a:ch=ch+a:next:ifch<>65921thenprint"fehler!"ch:end 101 ch=0 110 readco:ch=ch+co:ifco=-1then140 120 b=peek(49152+co)+256*peek(49153+co):b=b-28672+sa:h=int(b/256):l=b-h*256 130 poke49152+co,l:poke49153+co,h:goto110 140 ifch<>22866thenprint"fehler!":end 141 input"filename";f$:open1,8,2,f$+",p,w" 150 h=int(sa/256):l=sa-h*256:print#1,chr$(l)chr$(h); 160 fort=49152to49683:print#1,chr$(peek(t));:next:close1:open1,8,15 170 input#1,a,b$,c,d:printa","b$","c","d:end 200 ifch<>22866thenprint"fehler!"ch:end 201 iffl=1then300 210 print"programm im speicher von"sa" bis"sa+531 220 print"programmstart mit {rvon} sys";sa" {rvof}" 230 end 300 h=int(sa/256):l=sa-h*256 310 input"filename ";f$:open1,8,2,f$+",p,w":print#1,chr$(l)chr$(h); 320 fort=satosa+531:print#1,chr$(peek(t));:next:close1:open1,8,15:input#1,a,b$,c,d:close1 330 printa","b$","c","d:ifa=0then210 340 input"nochmal versuchen j/n";a$:ifa$<>"j"then210 350 open1,8,15,"s:"+f$:close:goto300 32000 data120,169,3,162,0,134,255,134,248,141,21,208,141,23,208,141,29,208,169 32001 data100,141,0,208,141,3,208,162,200,142,2,208,206,40,208,141,1,208,162 32002 data13,142,248,7,232,142,249,7,32,60,113,32,133,112,169,19,32,210,255,165 32003 data255,32,102,112,165,254,32,102,112,169,32,32,210,255,32,133,112,165 32004 data253,32,102,112,165,252,32,102,112,32,164,112,76,169,113,169,19,32,210 32005 data255,169,36,32,210,255,96,72,74,74,74,74,201,10,48,2,105,6,105,48,32 32006 data210,255,104,41,15,201,10,48,2,105,6,105,48,32,210,255,96,165,254,41 32007 data3,170,189,16,114,24,101,248,133,252,165,254,74,74,133,253,165,255,170 32008 data189,16,114,24,101,253,133,253,96,32,133,112,160,63,120,169,53,133,1 32009 data177,252,145,249,136,16,249,169,55,133,1,88,96,76,129,255,165,254,24 32010 data105,16,133,254,176,67,76,49,112,165,254,56,233,16,133,254,144,73,76 32011 data49,112,230,254,240,48,76,49,112,165,254,56,233,1,133,254,144,54,76 32012 data49,112,173,28,208,73,3,141,28,208,76,49,112,173,29,208,73,3,141,29 32013 data208,76,49,112,173,23,208,73,3,141,23,208,76,49,112,230,255,165,255 32014 data201,4,16,3,76,49,112,169,0,133,255,76,49,112,198,255,48,3,76,49,112 32015 data169,3,133,255,76,49,112,32,133,112,32,78,113,160,63,169,0,136,145,252 32016 data208,251,76,214,112,162,64,160,3,134,249,132,250,96,162,128,160,3,134 32017 data249,132,250,96,32,69,113,32,164,112,32,60,113,96,32,133,112,32,69,113 32018 data169,249,162,252,141,175,112,142,177,112,32,164,112,32,133,112,169,252 32019 data162,249,141,175,112,142,177,112,32,60,113,76,49,112,230,248,165,248 32020 data201,63,208,4,169,0,133,248,76,49,112,198,248,165,248,201,255,208,4 32021 data169,62,133,248,76,49,112,169,0,133,248,76,49,112,32,78,113,76,49,112 32022 data160,0,162,208,165,203,200,208,6,232,208,3,76,188,113,197,251,240,241 32023 data133,251,160,15,185,226,113,197,251,240,6,136,16,246,76,169,113,136 32024 data152,10,168,185,242,113,141,222,113,185,243,113,141,223,113,76,221,113 32025 data76,49,112,40,43,54,57,36,23,25,28,60,3,2,7,17,63,20,214,112,221,112 32026 data190,112,202,112,233,112,244,112,255,112,10,113,42,113,156,113,126,113 32027 data141,113,88,113,187,112,163,113,0,64,128,192 60000 data47,50,60,65,73,78,83,86,89,139,156,165,200,212,219,231,242,253,264 60010 data275,282,289,296,299,302,314,335,338,341,345,348,355,358,361,364 60020 data371,374,377,380,395,410,417,420,423,438,449,459,466,469,472,475,478 60030 data498,500,502,504,506,508,510,512,514,516,518,520,522,524,526,-1