After all that I decided to change the Elite demo to make it more playable. This one keeps cursor state info so if you move to the left it keeps moving until you move to the right. It also has filled out the display a bit more and shows which direction you are moving and has stubbed out the other areas though they are not yet functional. Still slow on the ZXSimulator (and an actual ZX81) but the actual Elite game wasn't about fast paced action anyways (at least the C64 versoin).
Including the ZXSimulator zip file since it contains it plus .p and code dump so you can see what I did.
Code: Select all
10 REM ELITE
20 GOSUB 1000
40 GOSUB 2000
50 GOSUB 6000
400 REM PLAY
410 LET DY=0
420 LET DX=0
430 LET KEY=CODE INKEY$
440 IF KEY<>0 AND KEY<> FIRE THEN GOSUB 1300
450 IF KEY=FIRE THEN GOSUB 3000
460 IF KEY=LEFT THEN LET DX=DX+1
470 IF KEY=RIGHT THEN LET DX=DX-1
480 IF KEY=UP THEN LET DY=DY-1
490 IF KEY=DOWN THEN LET DY=DY+1
500 GOSUB 2000
510 GOSUB 4000
520 GOSUB 5000
530 GOTO 430
999 STOP
1000 REM DRAW DISPLAY
1010 FOR I=0 TO 31
1030 PRINT AT 15,I;"\.."
1040 NEXT I
1050 FOR I=16 TO 21
1060 PRINT AT I,7;"\ :"
1070 PRINT AT I,24;"\: "
1080 NEXT I
1090 PRINT AT 17,12;"\ .\..\.'\''\''\'.\..\. "
1100 PRINT AT 18,10;"\..\''\' "," \ '\''\.."
1110 PRINT AT 19,9;"\.'"," \'."
1120 PRINT AT 20,8;"\ .\' "," \ '\. "
1130 PRINT AT 21,8;"\ : E L I T E \: "
1140 PRINT AT 19,15;"\ :\: "
1150 PRINT AT 17,0;"FUEL:"
1160 PRINT AT 18,0;"\##\##\##\##\##\##\##"
1170 PRINT AT 20,0;"ENERGY"
1180 PRINT AT 21,0;"\##\##\##\##\##\##\##"
1190 PRINT AT 17,25;"AMMO:"
1200 PRINT AT 18,25;"\##\##\##\##\##\##\##"
1210 PRINT AT 20,25;"SHIELD:"
1220 PRINT AT 21,25;"\##\##\##\##\##\##\##"
1230 RETURN
1300 REM CONTROLS
1310 PRINT AT 18,15;" "
1320 PRINT AT 19,14;" \ :\: "
1330 PRINT AT 20,15;" "
1340 IF DX<>0 OR DY<>0 THEN LET KEY=0
1350 LET DY=0
1360 LET DX=0
1370 IF KEY=LEFT THEN PRINT AT 19,14;"\ :"
1380 IF KEY=RIGHT THEN PRINT AT 19,17;"\: "
1390 IF KEY=up THEN PRINT AT 18,15;"\ '\' "
1400 IF KEY=DOWN THEN PRINT AT 20,15;"\ .\. "
1410 RETURN
2000 REM LASER SIGHT
2010 PRINT AT 6,14;"\.' \'."
2020 PRINT AT 7,14;"\'. \.'"
2030 RETURN
3000 REM FIRE LASER
3010 FOR I=14 TO 7 STEP -1
3020 PRINT AT I,22-I;"\.'"
3030 PRINT AT I,9+I;"\'."
3040 NEXT I
3050 PAUSE 4
3060 FOR I=14 TO 7 STEP -1
3070 PRINT AT I,22-I;" "
3080 PRINT AT I,9+I;" "
3090 NEXT I
3100 IF EY<29 OR EY>30 THEN RETURN
3110 IF EX<30 OR EX>33 THEN RETURN
3120 LET EL=EL-1
3130 RETURN
4000 REM ENEMY SHIP
4010 IF SHIP=0 AND INT (RND*6)<>1 THEN RETURN
4020 IF SHIP=0 THEN GOTO 4240
4030 IF EY<13 OR EY>43 THEN GOTO 4060
4040 IF EX>=1 AND EX<65 THEN UNPLOT EX-1,EY
4050 IF EX>-2 AND EX<63 THEN UNPLOT EX+1,EY
4060 IF EX<0 OR EX>64 THEN GOTO 4090
4070 IF EY>13 AND EY<45 THEN UNPLOT EX,EY-1
4080 IF EY>11 AND EY<43 THEN UNPLOT EX,EY+1
4090 IF EL=0 THEN GOTO 4300
4100 LET DIR=INT (RND*8)+1
4110 IF DIR=1 AND EY<42 THEN LET EY=EY+1
4120 IF DIR=2 AND EX<62 THEN LET EX=EX+1
4130 IF DIR=3 AND EY>28 THEN LET EY=EY-1
4140 IF DIR=4 AND EX>1 THEN LET EX=EX-1
4150 LET EX=EX+DX
4160 LET EY=EY+DY
4170 IF EY<13 OR EY>43 THEN GOTO 4200
4180 IF EX>=1 AND EX<65 THEN PLOT EX-1,EY
4190 IF EX>-2 AND EX<63 THEN PLOT EX+1,EY
4200 IF EX<0 OR EX>63 THEN GOTO 4230
4210 IF EY>13 AND EY<45 THEN PLOT EX,EY-1
4220 IF EY>11 AND EY<43 THEN PLOT EX,EY+1
4230 RETURN
4240 LET SHIP=1
4250 LET EL=INT (RND*3)+2
4260 LET EX=INT (RND*62)+1
4270 LET EY=INT (RND*10)+33
4280 GOTO 4170
4300 REM SHIP EXPLODES
4310 LET SHIP=0
4320 FOR I=1 TO 2
4330 PLOT EX,EY
4340 PLOT EX-1,EY
4350 PLOT EX+1,EY
4360 PLOT EX,EY-1
4370 PLOT EX,EY+1
4380 UNPLOT EX,EY
4390 PLOT EX-2,EY-2
4400 PLOT EX+2,EY-2
4410 PLOT EX-2,EY+2
4420 PLOT EX+2,EY+2
4430 UNPLOT EX-1,EY
4440 UNPLOT EX+1,EY
4450 UNPLOT EX,EY-1
4460 UNPLOT EX,EY+1
4470 UNPLOT EX-2,EY-2
4480 UNPLOT EX+2,EY-2
4490 UNPLOT EX-2,EY+2
4500 UNPLOT EX+2,EY+2
4510 NEXT I
4520 RETURN
5000 REM STAR FIELD
5010 IF STARS=0 THEN GOTO 5120
5020 LET S$=" "
5030 GOSUB 5200
5040 IF INT (RND*10)=1 THEN LET SM=SM+1
5050 LET SX=SX+DX
5060 LET SY=SY-DY
5070 LET SM=SM-DY
5080 IF SY+SM>13 THEN GOTO 5130
5090 LET S$="."
5100 GOSUB 5200
5110 RETURN
5120 LET STARS=1
5130 LET SM=0
5140 LET SX=INT (RND*3)+5
5150 LET SY=INT(RND*2)+4
5160 GOTO 5090
5200 REM STAR
5210 IF SY+SM>=0 AND SY+SM<14 AND SX-SM>=0 AND SX-SM<32 THEN PRINT AT SY+SM,SX-SM;S$
5220 IF SY+SM*2-4>=0 AND SY+SM*2-4<14 AND SX+10>=0 AND SX+10<32 THEN PRINT AT SY+SM*2-4,SX+10;S$
5230 IF SY+SM-1>=0 AND SY+SM-1<14 AND SX+SM+20>=0 AND SX+SM+20<32 THEN PRINT AT SY+SM-1,SX+SM+20;S$
5240 RETURN
6000 REM SETTINGS
6010 LET SHIP=0
6020 LET STARS=0
6030 LET FIRE=CODE "F"
6040 LET LEFT=CODE "A"
6050 LET RIGHT=CODE "D"
6060 LET DOWN=CODE "W"
6070 LET UP=CODE "S"
6080 PRINT AT 0,0;"S:TART C:ONFIGURE?",,," DEFAULT: F,A,D,W,S"
6090 GOSUB 6500
6100 PRINT AT 0,0;" ",,," "
6110 IF KEY=CODE "S" THEN RETURN
6120 PRINT AT 0,0;"PRESS KEY FOR ACTION:"
6130 PRINT AT 2,2;"FIRE?"
6140 GOSUB 6500
6150 LET FIRE=KEY
6160 PRINT AT 2,2;"LEFT?"
6170 GOSUB 6500
6180 LET LEFT=KEY
6190 PRINT AT 2,2;"RIGHT?"
6200 GOSUB 6500
6210 LET RIGHT=KEY
6220 PRINT AT 2,2;"UP? "
6230 GOSUB 6500
6240 LET UP=KEY
6250 PRINT AT 2,2;"DOWN? "
6260 GOSUB 6500
6270 LET DOWN=KEY
6280 PRINT AT 0,0;" "
6290 PRINT AT 2,2;" "
6300 RETURN
6500 REM GET KEY
6510 LET KEY=CODE INKEY$
6520 IF KEY<>0 THEN RETURN
6530 GOTO 6510