' ' GPPO-SOURCECODE - Dokumentierte Version ' Autor: Christian Meyer (1993) ' '--------------------------------------------------------------------- ' 'Compileranweisungen COMPILER "NO LINENUMBERS" COMPILER "CTRL_C OFF" COMPILER "TRACE OFF" 'Voreinstellungen und Überprüfungen IF FRE("")<650000 THEN PRINT "Der Arbeitsspeicher reicht nicht aus! " REPEAT UNTIL INKEY$ <>"" END ENDIF IF W_PIXEL <>640 OR H_PIXEL <>400 THEN PRINT "GPPO läuft nur in 640*400 monochrom! " REPEAT UNTIL INKEY$ <>"" END ENDIF CLEAR 560000,60000: PRINT "f" CLIP 0,0,640,400: DEG POKE $484,14 VOLUME 1,0 VOLUME 2,0 VOLUME 3,0 NOISE 0,0 TUNE 1,0,2,0,3,0 'Beginn der Joystickabfrage BIOS (,3,4,20) 'Ermitteln der aktuellen Ausgabeadresse XBIOS (Psc0%L,2) 'Effekt zum Verdunkeln des Bildschirms FILL STYLE =2,8 LINE COLOR =1 FOR I%L=0 TO 49 FOR J%L=0 TO 7 DRAW 0,J%L*50+I%L TO 639,J%L*50+I%L NEXT NEXT 'Reservieren der Speicherbereiche für die Zwei-Seiten-Darstellung Psc%L=256*(( MEMORY(32256)+256)\256) Ad2%L=256*(( MEMORY(32256)+256)\256) FOR I%L=0 TO 31999 POKE Psc%L+I%L,255 NEXT MEMORY_MOVE Psc%L,32000 TO Ad2%L 'Umstellen auf Zwei-Seiten-Darstellung XBIOS (,5,L Ad2%L,L Psc%L,-1) 'Reservieren von benötigtem Speicher Mem1%L= MEMORY(32006) Mem2%L= MEMORY(32006) Mem3%L= MEMORY(15666) Mem4%L= MEMORY(192000) Mem5%L= MEMORY(56832) Mem6%L= MEMORY(6400) DIM Mem7%L(7) Mem8%L= MEMORY(1920) Mem9%L= MEMORY(1296) Ampel%L= MEMORY(2904) Mem10%L= MEMORY(32006) Puffer%L= MEMORY(42) Mem11%L= MEMORY(5946) Mem12%L= MEMORY(5946) Level%L=2 'Variablen für die Verwaltung der 8 Rennwagen DIM Areal%L(3,14),Direction%L(3,14),Laptime%L(50) DIM Glastx%L(7),Glasty%L(7),Winkel%L(7),Gx%L(7),Gy%L(7),Name$(7),Name2$(7) DIM Gwinkel2%L(7),Gcw%L(7),Speed%L(7),Ganz_Teile%L(7) DIM Gx2%L(7),Gy2%L(7),Igs1%L(7),Igs2%L(7) DIM Sinus!(720),Cosinus!(720) DIM Course$(16),Punkte%L(7),Punkte2%L(7),Winner$(16) FOR I%L=1 TO 16 READ Course$(I%L) NEXT DATA "Monaco","Germany","Brazil","USA","Japan","Britain","France","Italy" DATA "Canada","Hungary","Spain","Belgium","Austria","Portugal","S.Africa","Austral." 'Anlegen einer Sinus-/Cosinustabelle (-> Geschwindigkeit) FOR I%L=0 TO 360 Sinus!(I%L)= SIN(I%L):Sinus!(I%L+360)=Sinus!(I%L) Cosinus!(I%L)= COS(I%L):Cosinus!(I%L+360)=Cosinus!(I%L) NEXT 'Ermitteln des aktuellen Pfades GEMDOS (I%L,$19) Path$= CHR$(0)*128:J%L= LPEEK( SEGPTR +28)+ LPEEK( VARPTR(Path$)) GEMDOS (,$47,L J%L,I%L+1,0) Path$= CHR$(65+I%L)+":"+ MID$(Path$,1, INSTR(Path$, CHR$(0))-1)+"\" 'Retten der Werte für Tastaturwiederholung und -verzögerung XBIOS (I%L,35,-1,-1) Wdh%L=I%L AND 255 Verz%L=(I%L SHR 8) AND 255 'Laden von GPPO.DAT und Entpacken und Zuweisen der Daten Exist "GPPO.DAT",J%L IF J%L=1 THEN OPEN "U",1,Path$+"GPPO.DAT":I%L= LOF(1) IF J%L=0 OR (J%L=1 AND I%L<>115297) THEN XBIOS (,5,L Psc0%L,L Psc0%L,-1) BIOS (,3,4,8) POKE $484,15 CLIP IF J%L=0 THEN PRINT "GPPO.DAT ist nicht auffindbar! " ELSE PRINT "GPPO.DAT hat die falsche Länge! " ENDIF REPEAT UNTIL INKEY$ <>"" CLEAR END ENDIF 'Reihenfolge der Daten siehe auch PACK.BAS 'Wagen für Intro SEEK 1,0 GET 1,Mem1%L,390 Blenden(-1,Mem1%L) 'Cockpit SEEK 1,1920 GET 1,Mem1%L+390,3998 Unpack Mem1%L+390,Mem6%L,6400 'Zeichensatz DIM Zeichen%L(122) SEEK 1,36752 GET 1,Mem1%L+390,2888 Zeichen%L(32)= MEMORY(38) MEMORY_MOVE Mem1%L+390,38 TO Zeichen%L(32) FOR I%L=48 TO 122 Zeichen%L(I%L)= MEMORY(38) MEMORY_MOVE Mem1%L+390+(I%L-47)*38,38 TO Zeichen%L(I%L) NEXT 'Introdaten SEEK 1,390 GET 1,Mem1%L+390,1530 'Ampel SEEK 1,5918 GET 1,Ampel%L,2904 'Bild für Streckenauswahl SEEK 1,86158 GET 1,Mem1%L+1920,10539 Unpack Mem1%L+1920,Mem3%L,15666 'Titelbild SEEK 1,18785 GET 1,Mem1%L+1920,17967 Unpack Mem1%L+1920,Mem2%L+6,32000 '7 Streckenteile SEEK 1,8822 GET 1,Mem4%L,9963 Unpack Mem4%L,Mem4%L+10000,22442 FOR I%L=1 TO 7 Mem7%L(I%L)= MEMORY(3206) MEMORY_MOVE Mem4%L+6794+I%L*3206,3206 TO Mem7%L(I%L) NEXT 'Streckenverlaufsdaten SEEK 1,96697 GET 1,Mem8%L,1920 'Cupbild SEEK 1,73058 GET 1,Mem4%L,13100 Unpack Mem4%L,Mem10%L,32000 'Rennwagen SEEK 1,39640 GET 1,Mem4%L,33418 Unpack Mem4%L,Mem4%L+50000,41484 BITBLT Mem4%L+50000 TO 0,0,576,360 FOR I%L=0 TO 9 FOR J%L=0 TO 15 BITBLT J%L*36,I%L*36,36,36 TO Mem5%L+(16*I%L+J%L)*222 NEXT NEXT BITBLT Mem4%L+75926 TO 0,0,576,216 FOR I%L=0 TO 5 FOR J%L=0 TO 15 BITBLT J%L*36,I%L*36,36,36 TO Mem5%L+35520+(16*I%L+J%L)*222 NEXT NEXT SEEK 1,98617 GET 1,Mem1%L+10000,3244 Unpack Mem1%L+10000,Mem1%L+20000,6538 'Musik laden SEEK 1,101861 GET 1,Mem4%L,1544 'Crash- und Siegbilder SEEK 1,103405 GET 1,Mem11%L,5946 SEEK 1,109351 GET 1,Mem12%L,5946 CLOSE 1 ' FILL STYLE =2,8 PBOX 0,0,640,400 BITBLT Mem1%L+20000 TO 142,90,355,142 MODE =3 TEXT 152,252,"Programmiert von: Christian Meyer, 27.8.93" TEXT 80,268,"Ausschließliches Nutzungsrecht: IDL Software GmbH, Darmstadt" TEXT 172,284,"Entgeltliche Weitergabe nicht erlaubt" TEXT 108,300,"Verbreitung in Mailboxen und DFÜ-Netzen nicht erlaubt" MODE =1 BITBLT 80,90,480,230 TO Mem1%L+10000 PBOX 0,0,640,400 'Laden der Highscoredatei bzw. Neuerstellen Exist "SCORES.DAT",J%L IF J%L=1 THEN BLOAD Path$+"SCORES.DAT",Mem9%L ELSE FOR J%L=0 TO 15 LPOKE Mem9%L+56*J%L,15000 LPOKE Mem9%L+56*J%L+14,16000 LPOKE Mem9%L+56*J%L+28,17000 LPOKE Mem9%L+56*J%L+42,18000 RESTORE FOR I%L=0 TO 3 FOR K%L=0 TO 9 POKE Mem9%L+56*J%L+4+I%L*14+K%L, ASC( MID$("A.Rapid J.Fast O.Heizer T.Tiramisu",I%L*10+K%L+1,1)) NEXT NEXT NEXT ENDIF 'Intro WPOKE Mem2%L,2: WPOKE Mem2%L+2,640: WPOKE Mem2%L+4,400 Blenden(1,Mem1%L) WAIT 1 Blenden(-1,Mem1%L+390) WAIT 2 Blenden(1,Mem1%L+390) WAIT 1 Blenden(-1,Mem1%L+810) WAIT 2 Blenden(1,Mem1%L+810) WAIT 1 Blenden(-1,Mem2%L) VOLUME 1,15 VOLUME 2,15 VOLUME 3,15 I%L=0 REPEAT K%L= WPEEK(Mem4%L+I%L) IF K%L=0 THEN I%L=0:K%L= WPEEK(Mem4%L+I%L) J%L= WPEEK(Mem4%L+I%L+2) TUNE 2, WPEEK(Mem4%L+I%L+4),3, WPEEK(Mem4%L+I%L+6) SELECT K%L CASE 32 Third_Beat(J%L, WPEEK(Mem4%L+I%L+4), WPEEK(Mem4%L+I%L+6)) CASE 16 FOR Jp%L=1 TO 4 NOISE 1,2 TUNE 1,375 WAIT .03 NOISE 0,0 TUNE 1,0 WAIT .17 NOISE 1,20 TUNE 1,187 WAIT .03 NOISE 0,0 TUNE 1,0 WAIT .07 NOISE 1,25 TUNE 1,93 WAIT .03 NOISE 0,0 TUNE 1,0 WAIT .07 NEXT CASE 8 FOR Jp%L=1 TO 4 First_Beat(J%L) Second_Beat(J%L) NEXT CASE 4 First_Beat(J%L) Second_Beat(J%L) CASE 1 First_Beat(J%L) CASE 2 Second_Beat(J%L) CASE 3 FOR Jp%L=1 TO 16 TUNE 1,J%L WAIT .05 TUNE 1,0 WAIT .05 NEXT CASE 100 WAIT 1.6 END_SELECT I%L+=8 UNTIL JOYSTICK(1)>=128 OR INKEY$ <>"" Crash_Sound Blenden(1,Mem2%L) WAIT 1 Blenden(-1,Mem1%L+10000) Wait_Joy Blenden(1,Mem1%L+10000) WAIT .5 'Aufbau des Menues PBOX 0,0,640,400 Btext 208,0,"GPPO MAIN MENU" Btext 240,80,"START RACE" Btext 160,120,"CHOOSE RACING COURSE" Btext 248,160,"LAPS : 05" Btext 208,200,"ENTER CUP MODE" Btext 160,240,"DIFFICULTY LEVEL : 3" Btext 184,280,"JOYSTICK MODE : 1" Btext 232,320,"INFORMATION" Btext 248,360,"QUIT GAME" BITBLT 0,0,640,400 TO Mem2%L Blenden(-1,Mem2%L) Jp%L=1:N$="":Strnr%L=1:Laps%L=5:Joymodus%L=1 BITBLT 120,78,400,18 TO 120,78,400,18,12 MEMORY_MOVE Ad2%L,32000 TO Psc%L 'Hauptmenueschleife REPEAT REPEAT REPEAT Joy%L= JOYSTICK(1) UNTIL Joy%L>0 IF Joy%L<3 THEN BITBLT 120,38+Jp%L*40,400,18 TO 120,38+Jp%L*40,400,18,12 MEMORY_MOVE Ad2%L,32000 TO Psc%L IF Joy%L=1 THEN IF Jp%L=1 THEN Jp%L=8 ELSE Jp%L-=1 IF Joy%L=2 THEN IF Jp%L=8 THEN Jp%L=1 ELSE Jp%L+=1 BITBLT 120,38+Jp%L*40,400,18 TO 120,38+Jp%L*40,400,18,12 MEMORY_MOVE Ad2%L,32000 TO Psc%L ENDIF 'Start des Rennens IF Jp%L=1 THEN IF Joy%L=128 THEN MEMORY_MOVE Psc%L,32000 TO Mem2%L FOR I%L=1 TO 80 MEMORY_MOVE Mem6%L,I%L*80 TO Psc%L+32000-I%L*80 NEXT MEMORY_MOVE Psc%L,32000 TO Ad2%L MODE =1 OUTLINE OFF FILL STYLE =0,1 PBOX 261,373 TO 297,383 MEMORY_MOVE Ad2%L,32000 TO Psc%L MEMORY_MOVE Ad2%L+25600,6400 TO Mem6%L Name_Input Startpos%L=8 Race FOR I%L=2 TO 200 STEP 2 MEMORY_MOVE Mem2%L+16000-I%L*80,I%L*80 TO Psc%L MEMORY_MOVE Mem2%L+16000,I%L*80 TO Psc%L+32000-I%L*80 NEXT MEMORY_MOVE Psc%L,32000 TO Ad2%L ENDIF ENDIF 'Aussuchen einer Strecke IF Jp%L=2 THEN IF Joy%L=128 THEN LINE COLOR =0 MEMORY_MOVE Psc%L,32000 TO Mem2%L BITBLT Mem3%L TO 88,65,464,270 FOR I%L=0 TO 39 FOR J%L=0 TO 9 MEMORY_MOVE Ad2%L+J%L*3200+I%L*80,80 TO Psc%L+J%L*3200+I%L*80 NEXT NEXT IF Strnr%L<9 THEN BOX 43+Strnr%L*55,76,59,120 IF Strnr%L>8 THEN BOX 43+(Strnr%L-8)*55,204,59,120 MEMORY_MOVE Ad2%L,32000 TO Psc%L WAIT .2 REPEAT REPEAT Joy2%L= JOYSTICK(1) UNTIL Joy2%L>0 IF (Joy2%L AND 1)=1 OR (Joy2%L AND 2)=2 THEN IF Strnr%L>8 THEN Strnr%L-=8 ELSE Strnr%L+=8 IF (Joy2%L AND 4)=4 THEN IF Strnr%L=1 THEN Strnr%L=8 ELSE IF Strnr%L=9 THEN Strnr%L=16 ELSE Strnr%L-=1 IF (Joy2%L AND 8)=8 THEN IF Strnr%L=8 THEN Strnr%L=1 ELSE IF Strnr%L=16 THEN Strnr%L=9 ELSE Strnr%L+=1 BITBLT Mem3%L TO 88,65,464,270 IF Strnr%L<9 THEN BOX 43+Strnr%L*55,76,59,120 IF Strnr%L>8 THEN BOX 43+(Strnr%L-8)*55,204,59,120 MEMORY_MOVE Ad2%L,32000 TO Psc%L WAIT .2 UNTIL Joy2%L=128 LINE COLOR =1 REPEAT UNTIL JOYSTICK(1)=0 MEMORY_MOVE Mem2%L,32000 TO Ad2%L FOR I%L=0 TO 39 FOR J%L=0 TO 9 MEMORY_MOVE Ad2%L+J%L*3200+I%L*80,80 TO Psc%L+J%L*3200+I%L*80 NEXT NEXT ENDIF ENDIF 'Verändern der Rundenanzahl IF Jp%L=3 THEN IF Joy%L=8 OR Joy%L=128 THEN IF Laps%L=3 THEN Laps%L=5 ELSE IF Laps%L=50 THEN Laps%L=3 ELSE Laps%L+=5 ENDIF IF Joy%L=4 THEN IF Laps%L=3 THEN Laps%L=50 ELSE IF Laps%L=5 THEN Laps%L=3 ELSE Laps%L-=5 ENDIF Btext 248,160,"LAPS : "+ RIGHT$("0"+ RIGHT$( STR$(Laps%L), LEN( STR$(Laps%L))-1),2) BITBLT 248,160,144,16 TO 248,160,144,16,12 MEMORY_MOVE Ad2%L,32000 TO Psc%L ENDIF 'Cupmodus IF Jp%L=4 THEN IF Joy%L=128 THEN Oldstrnr%L=Strnr%L Strnr%L=1 MEMORY_MOVE Psc%L,32000 TO Mem2%L FOR I%L=2 TO 200 STEP 2 MEMORY_MOVE Mem10%L+16000-I%L*80,I%L*80 TO Psc%L MEMORY_MOVE Mem10%L+16000,I%L*80 TO Psc%L+32000-I%L*80 NEXT MEMORY_MOVE Psc%L,32000 TO Ad2%L Name_Input MEMORY_MOVE Mem10%L,32000 TO Ad2%L Jp2%L=1:Joy2%L=0 BITBLT 240,Jp2%L*24-17,160,18 TO 240,Jp2%L*24-17,160,18,12 TEXT HEIGHT =6 MODE =3 FOR I%L=0 TO 3 Taste$="" FOR J%L=0 TO 9 Taste$=Taste$+ CHR$( PEEK(Mem9%L+I%L*14+4+J%L)) NEXT TEXT 484,73+I%L*11,Taste$+":"+ STR$( LPEEK(Mem9%L+I%L*14)\200)+"."+ RIGHT$( STR$(( LPEEK(Mem9%L+I%L*14) MOD 200)*3\10),2)+" s" IF Taste$=Name$ THEN BITBLT 467,66+I%L*11,170,9 TO 467,66+I%L*11,170,9,12 NEXT TEXT HEIGHT =13 TEXT 534,45,"Monaco" TEXT HEIGHT =6 MODE =1 FOR I%L=0 TO 7 Punkte%L(I%L)=0 NEXT Startpos%L=8 MEMORY_MOVE Ad2%L,32000 TO Psc%L REPEAT REPEAT REPEAT Joy2%L= JOYSTICK(1) UNTIL Joy2%L>0 IF Joy2%L=1 OR Joy2%L=2 THEN BITBLT 240,Jp2%L*24-17,160,18 TO 240,Jp2%L*24-17,160,18,12 MEMORY_MOVE Ad2%L,32000 TO Psc%L IF Joy2%L=1 THEN IF Jp2%L=1 THEN Jp2%L=4 ELSE Jp2%L-=1 IF Joy2%L=2 THEN IF Jp2%L=4 THEN Jp2%L=1 ELSE Jp2%L+=1 BITBLT 240,Jp2%L*24-17,160,18 TO 240,Jp2%L*24-17,160,18,12 MEMORY_MOVE Ad2%L,32000 TO Psc%L ENDIF 'Spielstand speichern IF Jp2%L=2 AND Strnr%L>1 THEN IF Joy2%L=128 THEN Lsbox "save" POKE K%L+896,255 POKE K%L+897,Strnr%L AND $FF FOR I%L=1 TO Strnr%L-1 IF Winner$(I%L)=Name$ THEN J%L=0 IF Winner$(I%L)="A.Rapid " THEN J%L=1 IF Winner$(I%L)="J.Fast " THEN J%L=2 IF Winner$(I%L)="S.Harakiri" THEN J%L=3 IF Winner$(I%L)="M.Schuster" THEN J%L=4 IF Winner$(I%L)="T.Tiramisu" THEN J%L=5 IF Winner$(I%L)="O.Heizer " THEN J%L=6 IF Winner$(I%L)="B.Brutalo " THEN J%L=7 POKE K%L+897+I%L,J%L AND $FF NEXT FOR I%L=0 TO 7 IF Name2$(7-I%L)=Name$ THEN J%L=0 IF Name2$(7-I%L)="A.Rapid " THEN J%L=1 IF Name2$(7-I%L)="J.Fast " THEN J%L=2 IF Name2$(7-I%L)="S.Harakiri" THEN J%L=3 IF Name2$(7-I%L)="M.Schuster" THEN J%L=4 IF Name2$(7-I%L)="T.Tiramisu" THEN J%L=5 IF Name2$(7-I%L)="O.Heizer " THEN J%L=6 IF Name2$(7-I%L)="B.Brutalo " THEN J%L=7 POKE K%L+914+I%L,J%L AND $FF NEXT LPOKE K%L+922,0 LPOKE K%L+926,0 LPOKE K%L+930,0 IF Anz_Runden%L>1 THEN LPOKE K%L+922,Alti%L LPOKE K%L+926,Blap%L LPOKE K%L+930,Bl%L ENDIF FOR I%L=0 TO 7 LPOKE K%L+934+I%L*4,Punkte%L(I%L) NEXT FOR I%L=1 TO 10 POKE K%L+965+I%L, ASC( MID$(Name$,I%L,1)) AND $FF NEXT MEMORY_MOVE Mem4%L,32000 TO Psc%L MEMORY_MOVE Mem4%L,32000 TO Ad2%L ENDIF ENDIF 'Spielstand laden IF Jp2%L=1 THEN IF Joy2%L=128 THEN Lsbox "load" IF PEEK(K%L+896)=255 THEN Strnr%L= PEEK(K%L+897) Name$="" FOR I%L=0 TO 9 Name$=Name$+ CHR$( PEEK(K%L+966+I%L)) NEXT FOR I%L=1 TO Strnr%L-1 J%L= PEEK(K%L+897+I%L) IF J%L=0 THEN Winner$(I%L)=Name$ IF J%L=1 THEN Winner$(I%L)="A.Rapid " IF J%L=2 THEN Winner$(I%L)="J.Fast " IF J%L=3 THEN Winner$(I%L)="S.Harakiri" IF J%L=4 THEN Winner$(I%L)="M.Schuster" IF J%L=5 THEN Winner$(I%L)="T.Tiramisu" IF J%L=6 THEN Winner$(I%L)="O.Heizer " IF J%L=7 THEN Winner$(I%L)="B.Brutalo " NEXT FOR I%L=0 TO 7 J%L= PEEK(K%L+914+I%L) IF J%L=0 THEN Name$(7-I%L)=Name$ IF J%L=1 THEN Name$(7-I%L)="A.Rapid " IF J%L=2 THEN Name$(7-I%L)="J.Fast " IF J%L=3 THEN Name$(7-I%L)="S.Harakiri" IF J%L=4 THEN Name$(7-I%L)="M.Schuster" IF J%L=5 THEN Name$(7-I%L)="T.Tiramisu" IF J%L=6 THEN Name$(7-I%L)="O.Heizer " IF J%L=7 THEN Name$(7-I%L)="B.Brutalo " NEXT IF LPEEK(K%L+922)<>0 THEN Alti%L= LPEEK(K%L+922) Blap%L= LPEEK(K%L+926) Bl%L= LPEEK(K%L+930) Anz_Runden%L=2 ELSE Anz_Runden%L=1 ENDIF FOR I%L=0 TO 7 Punkte%L(I%L)= LPEEK(K%L+934+I%L*4) NEXT Startpos%L=8 ENDIF IF PEEK(K%L+896)=255 THEN Refresh(0) ELSE MEMORY_MOVE Mem4%L,32000 TO Psc%L MEMORY_MOVE Mem4%L,32000 TO Ad2%L ENDIF ENDIF ENDIF 'Rennen starten IF Jp2%L=3 AND Strnr%L<17 THEN IF Joy2%L=128 THEN FOR I%L=1 TO 80 MEMORY_MOVE Mem6%L,I%L*80 TO Psc%L+32000-I%L*80 NEXT MEMORY_MOVE Psc%L,32000 TO Ad2%L MODE =1 OUTLINE OFF FILL STYLE =0,1 PBOX 261,373 TO 297,383 MEMORY_MOVE Ad2%L,32000 TO Psc%L MEMORY_MOVE Ad2%L+25600,6400 TO Mem6%L Race Strnr%L+=1 Refresh(1) ENDIF ENDIF WAIT .2 UNTIL Joy2%L=128 UNTIL Jp2%L=4 FOR I%L=2 TO 200 STEP 2 MEMORY_MOVE Mem2%L+16000-I%L*80,I%L*80 TO Psc%L MEMORY_MOVE Mem2%L+16000,I%L*80 TO Psc%L+32000-I%L*80 NEXT MEMORY_MOVE Psc%L,32000 TO Ad2%L Strnr%L=Oldstrnr%L ENDIF ENDIF 'Schwierigkeitsgrad einstellen IF Jp%L=5 THEN IF Joy%L=128 THEN Level%L+=1: IF Level%L=3 THEN Level%L=0 Btext 160,240,"DIFFICULTY LEVEL : "+ RIGHT$( STR$(Level%L+1),1) BITBLT 160,240,320,16 TO 160,240,320,16,12 MEMORY_MOVE Ad2%L,32000 TO Psc%L ENDIF ENDIF 'Joystickmodus umstellen IF Jp%L=6 THEN IF Joy%L=128 THEN Joymodus%L+=1: IF Joymodus%L=4 THEN Joymodus%L=1 Btext 184,280,"JOYSTICK MODE : "+ RIGHT$( STR$(Joymodus%L),1) BITBLT 184,280,272,16 TO 184,280,272,16,12 MEMORY_MOVE Ad2%L,32000 TO Psc%L ENDIF ENDIF 'Information IF Jp%L=7 THEN IF Joy%L=128 THEN MEMORY_MOVE Psc%L,32000 TO Mem2%L+6 WPOKE Mem2%L,2: WPOKE Mem2%L+2,640: WPOKE Mem2%L+4,400 Blenden(1,Mem2%L) OUTLINE OFF : MODE =1 FOR I%L=0 TO 140 STEP 20 FILL STYLE =2,8-I%L\20 PBOX I%L,I%L\2 TO 640-I%L,400-I%L\2 NEXT FOR I%L=160 TO 195 STEP 5 FILL STYLE =2,(I%L-160)\5+1 PBOX I%L,I%L\2 TO 640-I%L,400-I%L\2 NEXT Btext 288,130,"GPPO" MODE =3 TEXT HEIGHT =13 TEXT 288,190,"1993 by" TEXT 260,215,"Christian Meyer" TEXT HEIGHT =4 TEXT 266,228,"ERBACHER STR. 19 B" TEXT 272,236,"55262 HEIDESHEIM" TEXT 236,261,"WRITTEN IN OMIKRON.BASIC 3.5" TEXT 269,269,"COMPILED WITH THE" TEXT 260,277,"OMIKRON.COMPILER 3.5" TEXT 296,285,"POOLWARE" TEXT 305,160,"V 1.3" MEMORY_MOVE Ad2%L,32000 TO Mem1%L+6 WPOKE Mem1%L,2: WPOKE Mem1%L+2,640: WPOKE Mem1%L+4,400 MODE =1 Blenden(-1,Mem1%L) Wait_Joy Blenden(1,Mem1%L) Blenden(-1,Mem2%L) ENDIF ENDIF WAIT .2 UNTIL Joy%L=128 UNTIL Jp%L=8 'Zurücksetzen der geretteten Daten XBIOS (,5,L Psc0%L,L Psc0%L,-1) XBIOS (I%L,35,Verz%L,Wdh%L) BIOS (,3,4,8) POKE $484,15 CLIP 'Schreiben der Highscoredatei incl. Überprüfung auf Schreibschutz J%L=-1 IF MID$(Path$,1,1)="A" OR MID$(Path$,1,1)="a" THEN J%L=1 IF MID$(Path$,1,1)="B" OR MID$(Path$,1,1)="b" THEN J%L=2 I%L=-1 Taste$="" IF J%L>0 THEN REPEAT I%L=-1 POKE $FF8800,$E K%L= PEEK($FF8802) POKE $FF8802,(K%L AND $F8) OR J%L WPOKE $FF8606,$80 IF ( WPEEK($FF8604) AND $40)=$40 THEN I%L=0 POKE $FF8802,K%L IF I%L=0 THEN PRINT "Fehler! Keine Disk im Laufwerk oder Schreibschutz!" PRINT " = Wiederholen / = Abbrechen" WHILE INKEY$ <>"" WEND Taste$= INPUT$(1) ENDIF UNTIL I%L=-1 OR Taste$="N" OR Taste$="n" ENDIF IF I%L=-1 THEN IF FRE( MID$(Path$,1,2))>3000 THEN BSAVE Path$+"SCORES.DAT",Mem9%L,1296 ENDIF ENDIF CLEAR END ' 'Ende des Hauptprogramms / Beginn der Prozeduren ' 'malt eine Box mit vier "Schrauben" in den Ecken DEF PROC Newbox(X1%L,Y1%L,X2%L,Y2%L) MODE =1 FILL STYLE =2,8 LINE COLOR =0 PBOX X1%L,Y1%L TO X2%L,Y2%L BOX X1%L,Y1%L TO X2%L,Y2%L BOX X1%L+3,Y1%L+3,2,2 BOX X1%L+3,Y2%L-4,2,2 BOX X2%L-4,Y1%L+3,2,2 BOX X2%L-4,Y2%L-4,2,2 END_PROC ' Einblenden/Ausblenden am Bildschirm ' Modus=-1 -> Einblenden / Modus=1 -> Ausblenden DEF PROC Blenden(M%L,Adr%L) LOCAL Xx%L,Yy%L,I%L MODE =1 OUTLINE OFF Xx%L= WPEEK(Adr%L+2) Yy%L= WPEEK(Adr%L+4) FOR I%L=1+-(M%L=-1)*7 TO 1+-(M%L=1)*7 STEP M%L IF Xx%L<640 AND Yy%L<400 THEN FILL STYLE =2,8 PBOX 0,0,640,400 BITBLT Adr%L TO 320-Xx%L\2,200-Yy%L\2,Xx%L,Yy%L ELSE MEMORY_MOVE Adr%L+6,32000 TO Ad2%L ENDIF FILL STYLE =2,I%L MODE =2 PBOX 320-Xx%L\2,200-Yy%L\2,Xx%L,Yy%L MODE =1 MEMORY_MOVE Ad2%L,32000 TO Psc%L NEXT IF M%L=-1 THEN BITBLT Adr%L TO 320-Xx%L\2,200-Yy%L\2,Xx%L,Yy%L MEMORY_MOVE Ad2%L,32000 TO Psc%L ENDIF OUTLINE ON END_PROC 'Textprozedur für den eigenen Zeichensatz DEF PROC Btext(Xx%L,Yy%L,Text$) LOCAL I%L FOR I%L=1 TO LEN(Text$) BITBLT Zeichen%L( ASC( MID$(Text$,I%L,1))) TO Xx%L+(I%L-1)*16,Yy%L,16,16 NEXT END_PROC 'Prozedur zum Auspacken von Daten DEF PROC Unpack(Source%L,Dest%L,Groesse%L) LOCAL I%L=0,S%L=3,D%L=0,H%L=0,N%L=0,N2%L=0,V%L=0,V2%L=0 H%L= PEEK(Source%L) N%L= PEEK(Source%L+1) N2%L= PEEK(Source%L+2) REPEAT V%L= PEEK(Source%L+S%L) S%L+=1 SELECT V%L CASE N2%L S2%L= PEEK(Source%L+S%L) S%L+=1 FOR I%L=1 TO S2%L POKE Dest%L+D%L,H%L D%L+=1 NEXT CASE N%L S2%L= PEEK(Source%L+S%L) S%L+=1 V2%L= PEEK(Source%L+S%L) S%L+=1 FOR I%L=1 TO S2%L POKE Dest%L+D%L,V2%L D%L+=1 NEXT OTHERWISE POKE Dest%L+D%L,V%L D%L+=1 END_SELECT UNTIL D%L=Groesse%L END_PROC 'Überprüfung auf Existenz einer Datei DEF PROC Exist(Name$,R Back%L) OPEN "F",4,Path$+Name$,0 Back%L=1: IF EOF(4) THEN Back%L=0 CLOSE 4 END_PROC ' 'Hauptprozedur: Rennen incl. Scoreverwaltung ' DEF PROC Race 'Erstellen der Rennstrecke FOR I%L=0 TO 14 FOR J%L=0 TO 3 Areal%L(J%L,I%L)= PEEK(Mem8%L+(Strnr%L-1)*120+I%L*4+J%L) Direction%L(J%L,I%L)= PEEK(Mem8%L+(Strnr%L-1)*120+I%L*4+J%L+60) BITBLT Mem7%L(Areal%L(J%L,I%L)) TO J%L*160,0,160,160 NEXT MEMORY_MOVE Ad2%L,12800 TO Mem4%L+I%L*12800 NEXT 'Setzen der Variablen und Voreinstellungen FOR I%L=0 TO 7 Glastx%L(I%L)=0:Glasty%L(I%L)=7 Winkel%L(I%L)=180:Gwinkel2%L(I%L)=0:Gcw%L(I%L)=0:Speed%L(I%L)=0:Ganz_Teile%L(I%L)=0 Gx2%L(I%L)=0:Gy2%L(I%L)=0 NEXT Ix%L=0:Iy%L=0:Id_Sp%L=0:Iwinkel%L=0 Unf%L=0:Damage%L=0:Dam_Ind%L=0:Run_Ind%L=1:Position%L=0:Anz_Runden%L=1 Reset_Names Igs1%L(1)=80:Igs2%L(1)=60 Igs1%L(2)=76:Igs2%L(2)=60 Igs1%L(3)=72:Igs2%L(3)=56 Igs1%L(4)=68:Igs2%L(4)=56 Igs1%L(5)=68:Igs2%L(5)=52 Igs1%L(6)=64:Igs2%L(6)=52 Igs1%L(7)=60:Igs2%L(7)=48 FOR I%L=1 TO 7 Igs1%L(I%L)=Igs1%L(I%L)*(6+Level%L)\8:Igs2%L(I%L)=Igs2%L(I%L)*(6+Level%L)\8 NEXT Gx%L(0)=40 Gy%L(0)=1240 Gx%L(1)=40 Gy%L(1)=1120 Gx%L(2)=84 Gy%L(2)=1120 Gx%L(3)=40 Gy%L(3)=1160 Gx%L(4)=84 Gy%L(4)=1160 Gx%L(5)=40 Gy%L(5)=1200 Gx%L(6)=84 Gy%L(6)=1200 Gx%L(7)=84 Gy%L(7)=1240 IF Startpos%L<8 THEN SWAP Gx%L(Startpos%L),Gx%L(0) SWAP Gy%L(Startpos%L),Gy%L(0) ENDIF 'Leicht (aber nur leicht) zufällige Vertauschung der Computergegner FOR I%L=1 TO 10 J%L= RND(7)+1 K%L= RND(7)+1 IF RND(7)> ABS(J%L-K%L) THEN SWAP Gx%L(J%L),Gx%L(K%L) SWAP Gy%L(J%L),Gy%L(K%L) SWAP Igs1%L(J%L),Igs1%L(K%L) SWAP Igs2%L(J%L),Igs2%L(K%L) ENDIF NEXT 'Bildschirmaufbau mit Hineinscrollen MEMORY_MOVE Mem4%L+ MIN(2080, MAX(0,Gy%L(0)-142))*80,25600 TO Ad2%L BITBLT Mem5%L+1776 TO Gx%L(0),142,36,36,7 BITBLT Mem5%L+5328 TO Gx%L(0),142,36,36,1 FOR I%L=1 TO 7 BITBLT Mem5%L+7104*I%L+1776 TO Gx%L(I%L),142+Gy%L(I%L)-Gy%L(0),36,36,7 BITBLT Mem5%L+7104*I%L+5328 TO Gx%L(I%L),142+Gy%L(I%L)-Gy%L(0),36,36,1 NEXT FOR I%L=2 TO 320 STEP 2 MEMORY_MOVE Ad2%L+25600-I%L*80,I%L*80 TO Psc%L NEXT TUNE 1,0 VOLUME 1,9,8000 'Schalten der Ampel FOR I%L=0 TO 4 IF I%L>0 THEN BITBLT Ampel%L+(I%L-1)*726 TO 300,140,40,120 MEMORY_MOVE Ad2%L,32000 TO Psc%L IF I%L=4 THEN TUNE 1,200 WAIT .5 ELSE IF I%L>1 THEN TUNE 1,500 WAIT 1 ENDIF NEXT VOLUME 1,15: VOLUME 2,13: VOLUME 3,15 WHILE INKEY$ <>"" WEND Ti%L=0:Sti%L= TIMER :Rti%L=Sti%L:Lti%L=0:Writetime%L=0 'Setzen von Tastaturrepeat und -delay XBIOS (Taste%L,35,0,1) Blap%L=0:Bl%L=0:Taste%L=0 'Beginn der Rennschleife REPEAT TUNE 3,0 'Joystickabfrage (Tastaturabfrage am Ende der Schleife) Joy%L= JOYSTICK(1) IF (Joy%L AND 4)=4 OR Taste%L=75 THEN Winkel%L(0)+=10 IF (Joy%L AND 8)=8 OR Taste%L=77 THEN Winkel%L(0)-=10 IF Winkel%L(0)=360 THEN Winkel%L(0)=0 IF Winkel%L(0)=-10 THEN Winkel%L(0)=350 IF Joymodus%L=1 THEN IF (Joy%L AND 1)=1 OR Taste%L=72 THEN IF Speed%L(0)<80 THEN Speed%L(0)+=1 IF (Joy%L AND 128)=128 OR Taste%L=80 THEN Speed%L(0)= MAX(0,Speed%L(0)-2): IF Speed%L(0)>0 THEN TUNE 3,70- RND(5) ELSE IF Joymodus%L=2 THEN IF (Joy%L AND 128)=128 OR Taste%L=72 THEN IF Speed%L(0)<80 THEN Speed%L(0)+=1 IF (Joy%L AND 2)=2 OR Taste%L=80 THEN Speed%L(0)= MAX(0,Speed%L(0)-2): IF Speed%L(0)>0 THEN TUNE 3,70- RND(5) ELSE IF (Joy%L AND 1)=1 OR Taste%L=72 THEN IF Speed%L(0)<80 THEN Speed%L(0)+=1 IF (Joy%L AND 2)=2 OR Taste%L=80 THEN Speed%L(0)= MAX(0,Speed%L(0)-2): IF Speed%L(0)>0 THEN TUNE 3,70- RND(5) ENDIF ENDIF IF Speed%L(0)>0 THEN TUNE 1,4000-Speed%L(0)*25 ELSE TUNE 1,0 'Steuerung der Computergegner mittels Idealwerten für Koordinaten 'und Geschwindigkeit FOR I%L=1 TO 7 SELECT Direction%L(Glastx%L(I%L),Glasty%L(I%L)) CASE 2 IF (Gx%L(I%L)Gx2%L(I%L)*160+104) THEN Ix%L=Gx2%L(I%L)*160+62 ELSE Ix%L=Gx%L(I%L) Iy%L=(Glasty%L(I%L)-1)*160+62 SELECT Areal%L(Glastx%L(I%L),Glasty%L(I%L)-1) CASE 2,7 Id_Sp%L=Igs1%L(I%L) CASE 3,5 Id_Sp%L=Igs2%L(I%L) END_SELECT CASE 1 Ix%L=(Glastx%L(I%L)+1)*160+62 IF (Gy%L(I%L)Gy2%L(I%L)*160+104) THEN Iy%L=Gy2%L(I%L)*160+62 ELSE Iy%L=Gy%L(I%L) SELECT Areal%L(Glastx%L(I%L)+1,Glasty%L(I%L)) CASE 1 Id_Sp%L=Igs1%L(I%L) CASE 5,6 Id_Sp%L=Igs2%L(I%L) END_SELECT CASE 0 IF (Gx%L(I%L)Gx2%L(I%L)*160+104) THEN Ix%L=Gx2%L(I%L)*160+62 ELSE Ix%L=Gx%L(I%L) Iy%L=(Glasty%L(I%L)+1)*160+62 SELECT Areal%L(Glastx%L(I%L),Glasty%L(I%L)+1) CASE 2,7 Id_Sp%L=Igs1%L(I%L) CASE 4,6 Id_Sp%L=Igs2%L(I%L) END_SELECT CASE 3 Ix%L=(Glastx%L(I%L)-1)*160+62 IF (Gy%L(I%L)Gy2%L(I%L)*160+104) THEN Iy%L=Gy2%L(I%L)*160+62 ELSE Iy%L=Gy%L(I%L) SELECT Areal%L(Glastx%L(I%L)-1,Glasty%L(I%L)) CASE 1 Id_Sp%L=Igs1%L(I%L) CASE 3,4 Id_Sp%L=Igs2%L(I%L) END_SELECT END_SELECT IF Ix%LGy%L(I%L) THEN Iwinkel%L= CINTL( ATN((Iy%L-Gy%L(I%L))/(Gx%L(I%L)-Ix%L)))+270 IF Ix%L>Gx%L(I%L) THEN IF Iy%L>Gy%L(I%L) THEN Iwinkel%L= CINTL( ATN((Ix%L-Gx%L(I%L))/(Iy%L-Gy%L(I%L)))) IF Ix%L>Gx%L(I%L) THEN IF Iy%LGx%L(I%L) THEN Iwinkel%L=90 ELSE IF Ix%LGy%L(I%L) THEN Iwinkel%L=0 ELSE IF Iy%L=360 THEN Iwinkel%L-=360 IF Iwinkel%L<0 THEN Iwinkel%L+=360 Iwinkel%L=(Iwinkel%L\10)*10 IF Winkel%L(I%L)<>Iwinkel%L THEN IF Winkel%L(I%L)(Winkel%L(I%L)-Iwinkel%L) THEN Winkel%L(I%L)-=10 ELSE Winkel%L(I%L)+=10 ENDIF ENDIF IF Winkel%L(I%L)=360 THEN Winkel%L(I%L)=0 IF Winkel%L(I%L)=-10 THEN Winkel%L(I%L)=350 IF Speed%L(I%L)Id_Sp%L THEN Speed%L(I%L)= MAX(0,Speed%L(I%L)-2) IF Speed%L(I%L)>0 THEN TUNE 2,70- RND(5) ELSE TUNE 2,0 ELSE TUNE 2,4000-Speed%L(I%L)*25 ENDIF ENDIF NEXT 'Abfragen auf Berührung des Streckenrandes für die verschiedenen 'möglichen Streckenteile FOR I%L=0 TO 7 Gwinkel2%L(I%L)=(Winkel%L(I%L)\22.5)*22.5 Gcw%L(I%L)= CINTL(Gwinkel2%L(I%L)/22.5) IF Gcw%L(I%L)=16 THEN Gcw%L(I%L)=0 Gx%L(I%L)= MIN(606, MAX(0,Gx%L(I%L)+ CINTL(Sinus!(Gwinkel2%L(I%L))*Speed%L(I%L)\4))) Gy%L(I%L)= MIN(2364, MAX(0,Gy%L(I%L)+ CINTL(Cosinus!(Gwinkel2%L(I%L))*Speed%L(I%L)\4))) Gx2%L(I%L)=Gx%L(I%L)\160 Gy2%L(I%L)=Gy%L(I%L)\160 SELECT Areal%L(Glastx%L(I%L),Glasty%L(I%L)) CASE 1 IF Glasty%L(I%L)=0 THEN IF Gy%L(I%L)=0 THEN Reduce_Speed Sound1 Gy%L(I%L)=1 ENDIF ELSE IF Gy%L(I%L)12 THEN Speed%L(I%L)=Speed%L(I%L)*2\3 Sound1 ENDIF IF Gy%L(I%L)2362 THEN Reduce_Speed Sound1 Gy%L(I%L)=2362 ENDIF ELSE IF Gy%L(I%L)-Glasty%L(I%L)*160>124 THEN IF Speed%L(I%L)>12 THEN Speed%L(I%L)=Speed%L(I%L)*2\3 Sound1 ENDIF IF Gy2%L(I%L)>Glasty%L(I%L) OR Gy%L(I%L)-Glasty%L(I%L)*160>144 THEN Reduce_Speed Sound1 Gy%L(I%L)=Glasty%L(I%L)*160+144 Gy2%L(I%L)=Glasty%L(I%L) ENDIF ENDIF IF Gx2%L(I%L)Glastx%L(I%L) THEN IF Direction%L(Glastx%L(I%L),Glasty%L(I%L))=1 THEN Ganz_Teile%L(I%L)+=1 Glastx%L(I%L)=Gx2%L(I%L) ELSE Ganz_Teile%L(I%L)-=1 Glastx%L(I%L)=Gx2%L(I%L) ENDIF ENDIF ENDIF CASE 2,7 IF Glastx%L(I%L)=0 THEN IF Gx%L(I%L)=0 THEN Reduce_Speed Sound1 Gx%L(I%L)=1 ENDIF ELSE IF Gx%L(I%L)12 THEN Speed%L(I%L)=Speed%L(I%L)*2\3 Sound1 ENDIF IF Gx%L(I%L)602 THEN Reduce_Speed Sound1 Gx%L(I%L)=602 ENDIF ELSE IF Gx%L(I%L)-Glastx%L(I%L)*160>124 THEN IF Speed%L(I%L)>12 THEN Speed%L(I%L)=Speed%L(I%L)*2\3 Sound1 ENDIF IF Gx2%L(I%L)>Glastx%L(I%L) OR Gx%L(I%L)-Glastx%L(I%L)*160>144 THEN Reduce_Speed Sound1 Gx%L(I%L)=Glastx%L(I%L)*160+144 Gx2%L(I%L)=Glastx%L(I%L) ENDIF ENDIF IF Gy2%L(I%L)Glasty%L(I%L) THEN IF Direction%L(Glastx%L(I%L),Glasty%L(I%L))=0 THEN Ganz_Teile%L(I%L)+=1 Glasty%L(I%L)=Gy2%L(I%L) ELSE Ganz_Teile%L(I%L)-=1 Glasty%L(I%L)=Gy2%L(I%L) ENDIF ENDIF ENDIF CASE 3 IF Gx2%L(I%L)<=Glastx%L(I%L) THEN IF Gy2%L(I%L)<=Glasty%L(I%L) THEN IF ((Glastx%L(I%L)+1)*160-Gx%L(I%L))^2+((Glasty%L(I%L)+1)*160-Gy%L(I%L))^2>25600 THEN Reduce_Speed Gx2%L(I%L)=Glastx%L(I%L) Gy2%L(I%L)=Glasty%L(I%L) Gx%L(I%L)=Gx%L(I%L)+3 Gy%L(I%L)=Gy%L(I%L)+3 ENDIF ENDIF ENDIF IF Gx%L(I%L)-Gx2%L(I%L)*160>144 THEN IF Gy%L(I%L)-Gy2%L(I%L)*160>144 THEN Reduce_Speed Gx%L(I%L)=Glastx%L(I%L)*160+144 Gy%L(I%L)=Glasty%L(I%L)*160+144 Gx2%L(I%L)=Glastx%L(I%L) Gy2%L(I%L)=Glasty%L(I%L) ENDIF IF Gx2%L(I%L)>Glastx%L(I%L) THEN IF Direction%L(Glastx%L(I%L),Glasty%L(I%L))=1 THEN Ganz_Teile%L(I%L)+=1 Glastx%L(I%L)=Gx2%L(I%L) ELSE Ganz_Teile%L(I%L)-=1 Glastx%L(I%L)=Gx2%L(I%L) ENDIF ELSE IF Gy2%L(I%L)>Glasty%L(I%L) THEN IF Direction%L(Glastx%L(I%L),Glasty%L(I%L))=0 THEN Ganz_Teile%L(I%L)+=1 Glasty%L(I%L)=Gy2%L(I%L) ELSE Ganz_Teile%L(I%L)-=1 Glasty%L(I%L)=Gy2%L(I%L) ENDIF ENDIF ENDIF CASE 5 IF Gx2%L(I%L)>=Glastx%L(I%L) THEN IF Gy2%L(I%L)<=Glasty%L(I%L) THEN IF (Gx%L(I%L)-Glastx%L(I%L)*160+36)^2+((Glasty%L(I%L)+1)*160-Gy%L(I%L))^2>25600 THEN Reduce_Speed Gx2%L(I%L)=Glastx%L(I%L) Gy2%L(I%L)=Glasty%L(I%L) Gx%L(I%L)=Gx%L(I%L)-3 Gy%L(I%L)=Gy%L(I%L)+3 ENDIF ENDIF ENDIF IF Gx%L(I%L)-Gx2%L(I%L)*160<-20 THEN IF Gy%L(I%L)-Gy2%L(I%L)*160>144 THEN Reduce_Speed Gx%L(I%L)=Glastx%L(I%L)*160-20 Gy%L(I%L)=Glasty%L(I%L)*160+144 Gx2%L(I%L)=Glastx%L(I%L) Gy2%L(I%L)=Glasty%L(I%L) ENDIF IF Gx2%L(I%L)Glasty%L(I%L) THEN IF Direction%L(Glastx%L(I%L),Glasty%L(I%L))=0 THEN Ganz_Teile%L(I%L)+=1 Glasty%L(I%L)=Gy2%L(I%L) ELSE Ganz_Teile%L(I%L)-=1 Glasty%L(I%L)=Gy2%L(I%L) ENDIF ENDIF ENDIF CASE 6 IF Gx2%L(I%L)>=Glastx%L(I%L) THEN IF Gy2%L(I%L)>=Glasty%L(I%L) THEN IF (Gx%L(I%L)-Glastx%L(I%L)*160+36)^2+(Gy%L(I%L)-Glasty%L(I%L)*160+36)^2>25600 THEN Reduce_Speed Gx2%L(I%L)=Glastx%L(I%L) Gy2%L(I%L)=Glasty%L(I%L) Gx%L(I%L)=Gx%L(I%L)-3 Gy%L(I%L)=Gy%L(I%L)-3 ENDIF ENDIF ENDIF IF Gx%L(I%L)-Gx2%L(I%L)*160<-20 THEN IF Gy%L(I%L)-Gy2%L(I%L)*160<-20 THEN Reduce_Speed Gx%L(I%L)=Glastx%L(I%L)*160-20 Gy%L(I%L)=Glasty%L(I%L)*160-20 Gx2%L(I%L)=Glastx%L(I%L) Gy2%L(I%L)=Glasty%L(I%L) ENDIF IF Gx2%L(I%L)=Glasty%L(I%L) THEN IF ((Glastx%L(I%L)+1)*160-Gx%L(I%L))^2+(Gy%L(I%L)-Glasty%L(I%L)*160+36)^2>25600 THEN Reduce_Speed Gx2%L(I%L)=Glastx%L(I%L) Gy2%L(I%L)=Glasty%L(I%L) Gx%L(I%L)=Gx%L(I%L)+3 Gy%L(I%L)=Gy%L(I%L)-3 ENDIF ENDIF ENDIF IF Gx%L(I%L)-Gx2%L(I%L)*160>144 THEN IF Gy%L(I%L)-Gy2%L(I%L)*160<-20 THEN Reduce_Speed Gx%L(I%L)=Glastx%L(I%L)*160+144 Gy%L(I%L)=Glasty%L(I%L)*160-20 Gx2%L(I%L)=Glastx%L(I%L) Gy2%L(I%L)=Glasty%L(I%L) ENDIF IF Gx2%L(I%L)>Glastx%L(I%L) THEN IF Direction%L(Glastx%L(I%L),Glasty%L(I%L))=1 THEN Ganz_Teile%L(I%L)+=1 Glastx%L(I%L)=Gx2%L(I%L) ELSE Ganz_Teile%L(I%L)-=1 Glastx%L(I%L)=Gx2%L(I%L) ENDIF ELSE IF Gy2%L(I%L) Computergegner IF Unf%L>0 THEN Unf%L-=1 IF Unf%L=0 THEN FOR I%L=1 TO 7 IF Unf%L=0 THEN IF Gx%L(I%L)>Gx%L(0)-27 THEN IF Gx%L(I%L)Gy%L(0)-27 THEN IF Gy%L(I%L)=270+Winkel%L(0) THEN Pr_1 ELSE Damage%L=36 ELSE IF Winkel%L(0)>=270 THEN IF Winkel%L(I%L)>=Winkel%L(0)-90 OR Winkel%L(I%L)<=Winkel%L(0)-270 THEN Pr_1 ELSE Damage%L=36 ELSE IF Winkel%L(I%L)>=Winkel%L(0)-90 AND Winkel%L(I%L)<=Winkel%L(0)+90 THEN Pr_1 ELSE Damage%L=36 ENDIF ENDIF ENDIF ENDIF ENDIF NEXT ENDIF 'Überprüfung auf gefahrene Runden und Rundenzeiten IF Ganz_Teile%L(0)=60 THEN Anz_Runden%L+=1 Ganz_Teile%L(0)=0 Laptime%L(Anz_Runden%L-1)= TIMER -Rti%L IF Laptime%L(Anz_Runden%L-1)Lti%L THEN Writetime%L=1 Lti%L=Ti%L\200 MEMORY_MOVE Mem6%L,6400 TO Ad2%L+25600 FILL STYLE =0,1 PBOX 390,340,60,7 TEXT 430- LEN( STR$((Ti%L-Rti%L)\200))*8,346, STR$((Ti%L-Rti%L)\200)+" s" PBOX 390,375,60,7 TEXT 430- LEN( STR$((Ti%L-Sti%L)\200))*8,381, STR$((Ti%L-Sti%L)\200)+" s" Position%L=1 FOR I%L=1 TO 7 IF Ganz_Teile%L(I%L)>=(Anz_Runden%L-1)*60+Ganz_Teile%L(0) THEN Position%L+=1 NEXT TEXT 165- LEN( STR$(Position%L))*8,381, STR$(Position%L) MEMORY_MOVE Ad2%L+25600,6400 TO Mem6%L Writetime%L=0 ENDIF 'Erneuern der Schadensanzeige IF Dam_Ind%L=1 THEN MEMORY_MOVE Mem6%L,6400 TO Ad2%L+25600 MODE =1 FILL STYLE =2,8 PBOX 261,373 TO 261+Damage%L,383 MEMORY_MOVE Ad2%L+25600,6400 TO Mem6%L Dam_Ind%L=0 ENDIF 'Erneuern der Rundenanzeige IF Run_Ind%L=1 THEN MEMORY_MOVE Mem6%L,6400 TO Ad2%L+25600 FILL STYLE =0,1 PBOX 141,340,28,7 TEXT 165- LEN( STR$(Anz_Runden%L))*8,346, STR$(Anz_Runden%L) MEMORY_MOVE Ad2%L+25600,6400 TO Mem6%L Run_Ind%L=0 ENDIF 'Bildschirmaufbau 'Hintergrund MEMORY_MOVE Mem4%L+ MIN(2080, MAX(0,Gy%L(0)-142))*80,25600 TO Ad2%L IF Gy%L(0)<1200 THEN Py%L= MIN(Gy%L(0),142) ELSE Py%L= MAX(142,Gy%L(0)-2080) 'Spielerwagen BITBLT Mem5%L+Gcw%L(0)*222 TO Gx%L(0),Py%L,36,36,7 BITBLT Mem5%L+3552+Gcw%L(0)*222 TO Gx%L(0),Py%L,36,36,1 'Computergegner FOR I%L=1 TO 7 IF Gy%L(I%L)>=Gy%L(0)-320 THEN IF Gy%L(I%L)"" THEN WHILE INKEY$ <>"" WEND Taste%L= CVIL(Taste$) SHR 16 AND $FF 'Spielpause IF Taste%L=57 THEN Pti%L= TIMER WHILE INKEY$ <>"" WEND REPEAT UNTIL INKEY$ <>"" Rti%L+= TIMER -Pti%L Sti%L+= TIMER -Pti%L Lti%L=Rti%L Taste%L=0 ENDIF IF Taste%L=1 THEN Damage%L=36 ENDIF UNTIL Damage%L=36 OR (Anz_Runden%L=Laps%L+1 AND Ganz_Teile%L(0)=1) IF Damage%L=36 THEN Startpos%L=8 Crash_Sound Crw_Box BITBLT Mem12%L TO 204,101,232,198 J%L=0 FOR I%L=1 TO 32000 POKE Psc%L+J%L, PEEK(Ad2%L+J%L) J%L+=17: IF J%L>31999 THEN J%L-=32000 NEXT Wait_Joy ELSE Startpos%L=Position%L ENDIF WHILE INKEY$ <>"" WEND 'Ende des Rennens 'Darstellung der Ergebnisse und Statistiken XBIOS (Taste%L,35,20,2) TUNE 1,0,2,0,3,0 FILL STYLE =2,8 FILL COLOR =1 PBOX 170,50 TO 470,350 FILL COLOR =0 PBOX 180,60 TO 460,340 FILL COLOR =1 PBOX 190,70 TO 450,330 Btext 232,80,"END OF RACE" LINE COLOR =0 DRAW 200,106 TO 440,106 DRAW 200,201 TO 440,201 DRAW 200,256 TO 440,256 IF Damage%L=36 THEN FOR I%L=1 TO 7:Ganz_Teile%L(I%L)+=Laps%L*60+1: NEXT ENDIF Ganz_Teile%L(0)+=(Anz_Runden%L-1)*60 SORT Ganz_Teile%L(0) TO Name$(0) TEXT HEIGHT =6 MODE =3 FOR I%L=0 TO 7 TEXT 268,120+I%L*10, RIGHT$( STR$(I%L+1),1)+". "+Name$(7-I%L) IF Name$(7-I%L)=Name$ THEN BITBLT 258,113+I%L*10,124,9 TO 258,113+I%L*10,124,9,12 ENDIF NEXT IF Anz_Runden%L>1 THEN Alti%L=0 FOR I%L=1 TO Anz_Runden%L-1 Alti%L+=Laptime%L(I%L)\(Anz_Runden%L-1) NEXT TEXT 216,220,"Average Lap Time :"+ STR$(Alti%L\200)+"."+ RIGHT$( STR$((Alti%L MOD 200)*3\10),2)+" s" TEXT 216,230,"Best Lap : Nr."+ STR$(Bl%L)+" :"+ STR$(Blap%L\200)+"."+ RIGHT$( STR$((Blap%L MOD 200)*3\10),2)+" s" TEXT 224,240,"Average Speed :"+ STR$(900000\Alti%L)+" km/h" IF Blap%L< LPEEK(Mem9%L+(Strnr%L-1)*56) THEN MEMORY_MOVE Mem9%L+(Strnr%L-1)*56,42 TO Puffer%L MEMORY_MOVE Puffer%L,42 TO Mem9%L+(Strnr%L-1)*56+14 Write_Bestlap 0 ELSE IF Blap%L< LPEEK(Mem9%L+(Strnr%L-1)*56+14) THEN MEMORY_MOVE Mem9%L+(Strnr%L-1)*56+14,28 TO Puffer%L MEMORY_MOVE Puffer%L,28 TO Mem9%L+(Strnr%L-1)*56+28 Write_Bestlap 14 ELSE IF Blap%L< LPEEK(Mem9%L+(Strnr%L-1)*56+28) THEN MEMORY_MOVE Mem9%L+(Strnr%L-1)*56+28,14 TO Mem9%L+(Strnr%L-1)*56+42 Write_Bestlap 28 ELSE IF Blap%L< LPEEK(Mem9%L+(Strnr%L-1)*56+42) THEN Write_Bestlap 42 ENDIF ENDIF ENDIF TEXT 264,275,"Best Lap Times" FOR I%L=0 TO 3 Taste$="" FOR J%L=0 TO 9 Taste$=Taste$+ CHR$( PEEK(Mem9%L+(Strnr%L-1)*56+I%L*14+4+J%L)) NEXT TEXT 224,285+I%L*10, STR$(I%L+1)+". "+Taste$+" :"+ STR$( LPEEK(Mem9%L+(Strnr%L-1)*56+I%L*14)\200)+"."+ RIGHT$( STR$(( LPEEK(Mem9%L+(Strnr%L-1)*56+I%L*14) MOD 200)*3\10),2)+" s" IF Taste$=Name$ THEN BITBLT 214,278+I%L*10,212,9 TO 214,278+I%L*10,212,9,12 NEXT ENDIF MODE =1 FOR I%L=2 TO 200 STEP 2 MEMORY_MOVE Ad2%L,I%L*80 TO Psc%L+16000-I%L*80 MEMORY_MOVE Ad2%L+32000-I%L*80,I%L*80 TO Psc%L+16000 NEXT Wait_Joy IF Damage%L<>36 THEN IF Name$(7)=Name$ OR Name$(6)=Name$ OR Name$(5)=Name$ THEN Crw_Box BITBLT Mem11%L TO 204,101,232,198 TEXT HEIGHT =4 TEXT 290,280,Name$(7) TEXT 221,280,Name$(5) TEXT 359,280,Name$(6) J%L=0 FOR I%L=1 TO 32000 POKE Psc%L+J%L, PEEK(Ad2%L+J%L) J%L+=17: IF J%L>31999 THEN J%L-=32000 NEXT Wait_Joy ENDIF ENDIF END_PROC 'Prozedur, die eine Box zur Namenseingabe verwaltet DEF PROC Name_Input Newbox 200,150,440,250 TEXT HEIGHT =13 MODE =3 TEXT 228,180,"Please enter your name:" Name$(0)="" IF N$<>"" THEN Name$(0)=N$ TEXT 280,225,N$+"_"*(10- LEN(N$)) ELSE TEXT 280,225,"__________" ENDIF MEMORY_MOVE Ad2%L,32000 TO Psc%L Taste$="" REPEAT UNTIL JOYSTICK(1)=0 REPEAT WHILE INKEY$ <>"" WEND REPEAT Taste$= INKEY$ :Joy2%L= JOYSTICK(1) UNTIL Taste$<>"" OR Joy2%L=128 IF Taste$<>"" THEN Taste%L= CVIL(Taste$) AND 255 IF Taste%L>96 AND Taste%L<123 THEN Taste%L=Taste%L-32 IF Taste%L>64 AND Taste%L<91 OR Taste%L=46 THEN IF LEN(Name$(0))<10 THEN Name$(0)=Name$(0)+ CHR$(Taste%L) ENDIF IF Taste%L=32 THEN IF LEN(Name$(0))<10 AND LEN(Name$(0))>0 THEN Name$(0)=Name$(0)+" " ENDIF IF Taste%L=8 THEN IF LEN(Name$(0))>0 THEN Name$(0)= MID$(Name$(0),1, LEN(Name$(0))-1) ENDIF ENDIF MODE =1 PBOX 280,205,80,23 MODE =3 TEXT 280,225,Name$(0)+"_"*(10- LEN(Name$(0))) MEMORY_MOVE Ad2%L,32000 TO Psc%L ENDIF UNTIL Name$(0)<>"" AND (Taste%L=13 OR Joy2%L=128) REPEAT UNTIL JOYSTICK(1)=0 N$=Name$(0) Name$(0)=Name$(0)+" "*(10- LEN(Name$(0))) Name$=Name$(0) TEXT HEIGHT =6 MODE =1 LINE COLOR =1 END_PROC 'Erneuern des Bildschirmaufbaus im Cup DEF PROC Refresh(Modus%L) MEMORY_MOVE Mem10%L,32000 TO Ad2%L BITBLT 240,Jp2%L*24-17,160,18 TO 240,Jp2%L*24-17,160,18,12 MODE =3 FOR I%L=0 TO 7 TEXT 484,168+I%L*11,Name$(7-I%L) IF Name$(7-I%L)=Name$ THEN BITBLT 467,161+I%L*11,170,9 TO 467,161+I%L*11,170,9,12 ENDIF NEXT IF Anz_Runden%L>1 THEN TEXT 550,260, STR$(Alti%L\200)+"."+ RIGHT$( STR$((Alti%L MOD 200)*3\10),2)+" s" TEXT 526,272, STR$(Bl%L) TEXT 550,272, STR$(Blap%L\200)+"."+ RIGHT$( STR$((Blap%L MOD 200)*3\10),2)+" s" TEXT 550,284, STR$(900000\Alti%L)+" km/h" ENDIF FOR I%L=0 TO 3 Taste$="" FOR J%L=0 TO 9 Taste$=Taste$+ CHR$( PEEK(Mem9%L+(Strnr%L-2)*56+I%L*14+4+J%L)) NEXT TEXT 484,313+I%L*11,Taste$+":"+ STR$( LPEEK(Mem9%L+(Strnr%L-2)*56+I%L*14)\200)+"."+ RIGHT$( STR$(( LPEEK(Mem9%L+(Strnr%L-2)*56+I%L*14) MOD 200)*3\10),2)+" s" IF Taste$=Name$ THEN BITBLT 467,306+I%L*11,170,9 TO 467,306+I%L*11,170,9,12 NEXT IF Strnr%L<17 THEN FOR I%L=0 TO 3 Taste$="" FOR J%L=0 TO 9 Taste$=Taste$+ CHR$( PEEK(Mem9%L+(Strnr%L-1)*56+I%L*14+4+J%L)) NEXT TEXT 484,73+I%L*11,Taste$+":"+ STR$( LPEEK(Mem9%L+(Strnr%L-1)*56+I%L*14)\200)+"."+ RIGHT$( STR$(( LPEEK(Mem9%L+(Strnr%L-1)*56+I%L*14) MOD 200)*3\10),2)+" s" IF Taste$=Name$ THEN BITBLT 467,66+I%L*11,170,9 TO 467,66+I%L*11,170,9,12 NEXT TEXT HEIGHT =13 TEXT 534,45,Course$(Strnr%L) ENDIF TEXT HEIGHT =13 TEXT 534,155,Course$(Strnr%L-1) IF Modus%L=1 THEN Winner$(Strnr%L-1)=Name$(7) FOR I%L=1 TO Strnr%L-1 TEXT 127,26+I%L*20,Winner$(I%L) NEXT FOR I%L=2 TO 7 IF Name$(I%L)=Name$ THEN J%L=0 IF Name$(I%L)="A.Rapid " THEN J%L=1 IF Name$(I%L)="J.Fast " THEN J%L=2 IF Name$(I%L)="S.Harakiri" THEN J%L=3 IF Name$(I%L)="M.Schuster" THEN J%L=4 IF Name$(I%L)="T.Tiramisu" THEN J%L=5 IF Name$(I%L)="O.Heizer " THEN J%L=6 IF Name$(I%L)="B.Brutalo " THEN J%L=7 Punkte%L(J%L)+=(I%L-1)*Modus%L IF I%L=6 THEN Punkte%L(J%L)+=Modus%L IF I%L=7 THEN Punkte%L(J%L)+=4*Modus%L NEXT FOR I%L=0 TO 7 Punkte2%L(I%L)=Punkte%L(I%L) Name2$(I%L)=Name$(I%L) NEXT Reset_Names SORT Punkte2%L(0) TO Name$(0) FOR I%L=0 TO 7 TEXT 270,157+I%L*16,Name$(7-I%L)+" "+ STR$(Punkte2%L(7-I%L)) IF Name$(7-I%L)=Name$ THEN BITBLT 228,145+I%L*16,184,14 TO 228,145+I%L*16,184,14,12 NEXT MODE =1 TEXT HEIGHT =6 LINE COLOR =1 FOR I%L=2 TO 200 STEP 2 MEMORY_MOVE Ad2%L+16000-I%L*80,I%L*80 TO Psc%L MEMORY_MOVE Ad2%L+16000,I%L*80 TO Psc%L+32000-I%L*80 NEXT END_PROC 'Zurücksetzen der Namen auf Ausgangswerte DEF PROC Reset_Names Name$(0)=Name$ Name$(1)="A.Rapid " Name$(2)="J.Fast " Name$(3)="S.Harakiri" Name$(4)="M.Schuster" Name$(5)="T.Tiramisu" Name$(6)="O.Heizer " Name$(7)="B.Brutalo " END_PROC 'Erwartet Joystickknopf zur Bestätigung DEF PROC Wait_Joy REPEAT UNTIL JOYSTICK(1)=0 REPEAT UNTIL JOYSTICK(1)=128 REPEAT UNTIL JOYSTICK(1)=0 END_PROC 'Hilfs- und Kürzungsprozeduren DEF PROC Sound1 IF Speed%L(I%L)>0 THEN TUNE 2-(I%L=0),100- RND(5) END_PROC DEF PROC Reduce_Speed IF Speed%L(I%L)<80 THEN Speed%L(I%L)=0 ELSE Speed%L(I%L)=Speed%L(I%L)\2 END_PROC DEF PROC Pr_1 IF Speed%L(0)>Speed%L(I%L) THEN Speed%L(0)=Speed%L(I%L)\2 Gx%L(0)= MIN(606, MAX(0,Gx%L(0)+ CINTL(Sinus!(Gwinkel2%L(0)+180)*5))) Gy%L(0)= MIN(2364, MAX(0,Gy%L(0)+ CINTL(Cosinus!(Gwinkel2%L(0)+180)*5))) ELSE Speed%L(I%L)=Speed%L(0)\2 Gx%L(I%L)= MIN(606, MAX(0,Gx%L(I%L)+ CINTL(Sinus!(Gwinkel2%L(I%L)+180)*5))) Gy%L(I%L)= MIN(2364, MAX(0,Gy%L(I%L)+ CINTL(Cosinus!(Gwinkel2%L(I%L)+180)*5))) ENDIF Damage%L+= RND(2-(Level%L=2)) IF Damage%L>36 THEN Damage%L=36 END_PROC DEF PROC Write_Bestlap(J%L) LPOKE Mem9%L+(Strnr%L-1)*56+J%L,Blap%L FOR I%L=0 TO 9 POKE Mem9%L+(Strnr%L-1)*56+4+I%L+J%L, ASC( MID$(Name$,I%L+1,1)) NEXT END_PROC DEF PROC Lsbox(T$) MEMORY_MOVE Psc%L,32000 TO Mem4%L Newbox 180,150,460,250 TEXT HEIGHT =13 MODE =3 TEXT 200,208,"Please enter "+T$+" number (1-5)" MEMORY_MOVE Ad2%L,32000 TO Psc%L REPEAT WHILE INKEY$ <>"" WEND Taste$= INPUT$(1) UNTIL ASC(Taste$)>48 AND ASC(Taste$)<54 K%L=Mem9%L+( ASC(Taste$)-49)*80 TEXT HEIGHT =6 MODE =1 LINE COLOR =1 END_PROC DEF PROC First_Beat(H%L) NOISE 1,2 TUNE 1,H%L WAIT .03 NOISE 0,0 WAIT .07 TUNE 1,0 WAIT .1 END_PROC DEF PROC Second_Beat(H%L) NOISE 1,20 TUNE 1,H%L\2 WAIT .03 NOISE 0,0 WAIT .02 TUNE 1,0 WAIT .05 NOISE 1,25 TUNE 1,H%L\4 WAIT .03 NOISE 0,0 WAIT .02 TUNE 1,0 WAIT .05 END_PROC DEF PROC Third_Beat(H1%L,H2%L,H3%L) TUNE 1,H1%L,2,H2%L,3,H3%L WAIT .08 TUNE 1,H1%L\2,2,H2%L,3,H3%L WAIT .01 TUNE 1,H1%L\4,2,H2%L\2,3,H3%L WAIT .01 TUNE 1,0 END_PROC DEF PROC Crash_Sound LOCAL I%L,J%L FOR I%L=15 TO 0 STEP -1 FOR J%L=1 TO 250 VOLUME 1,I%L VOLUME 2,I%L VOLUME 3,I%L TUNE 1,J%L*40,2,J%L*20,3,J%L*10 NEXT NEXT TUNE 1,0,2,0,3,0 END_PROC DEF PROC Crw_Box FILL COLOR =1 FILL STYLE =2,8 PBOX 170,50 TO 470,350 LINE COLOR =0 BOX 173,53 TO 467,347 BOX 176,56 TO 464,344 END_PROC