Re: ZXSimulator
Posted: Sat Apr 18, 2020 9:41 am
I slightly improved the main loop so it would run a bit faster on a non-accelerated computer. Kind of playable on a ZX81 or simulated on an unexpanded QL. You can see how if INKEY$ is 0 I go straight back to refreshing screen with stars, cross-hairs and enemy. Next will give opponent opportunity to shoot back and destroy me and impact ammo, shields, fuel and energy.
Haven't found any new bugs in ZXSimulator so this was a good exercise. Still lots to do. I'm being sneaky with INKEY$ as it and CODE/CHR$ currently are tied to ASCII. So you'll see me doing lots of IF INKEY$=CODE "K" so that I don't have to worry about actual numeric codes which would make things incompatible with the ZX81 since I haven't tried to create a map to the ZX81 character set.
Also, I may write a separate utility program that'll renumber the BASIC code for me. Pain to constantly have to change line numbers to keep things uniform. ZX81 doesn't support renumber feature.
Code: Select all
10 REM ELITE
20 GOSUB 3000
30 GOSUB 3500
400 REM PLAY
410 LET DY=0
420 LET DX=1
430 GOSUB 1500
440 GOTO 460
450 GOSUB 2500
460 GOSUB 1000
470 GOSUB 1100
480 GOSUB 2000
490 LET KEY=CODE INKEY$
500 IF KEY=0 THEN GOTO 460
510 IF KEY=FIRE THEN GOTO 450
520 GOTO 430
999 STOP
1000 REM LASER SIGHT
1010 PRINT AT 6,14;"\.'"
1020 PRINT AT 6,17;"\'."
1030 PRINT AT 7,14;"\'."
1040 PRINT AT 7,17;"\.'"
1050 RETURN
1100 REM STAR FIELD
1110 IF STARS=0 THEN GOTO 1220
1120 LET S$=" "
1130 GOSUB 1300
1140 IF INT (RND*10)=1 THEN LET SM=SM+1
1150 LET SX=SX+DX
1160 LET SY=SY-DY
1170 LET SM=SM-DY
1180 IF SY+SM>13 THEN GOTO 1230
1190 LET S$="."
1200 GOSUB 1300
1210 RETURN
1220 LET STARS=1
1230 LET SM=0
1240 LET SX=INT (RND*3)+5
1250 LET SY=INT(RND*2)+4
1260 GOTO 1190
1300 REM STAR
1310 IF SY+SM>=0 AND SY+SM<14 AND SX-SM>=0 AND SX-SM<32 THEN PRINT AT SY+SM,SX-SM;S$
1320 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$
1330 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$
1340 RETURN
1500 REM CONTROLS
1510 PRINT AT 18,15;" "
1520 PRINT AT 19,14;" \ :\: "
1530 PRINT AT 20,15;" "
1540 IF DX<>DY THEN LET KEY=0
1550 LET DY=0
1560 LET DX=0
1570 IF KEY=LEFT THEN GOTO 1620
1580 IF KEY=RIGHT THEN GOTO 1650
1590 IF KEY=up THEN GOTO 1680
1600 IF KEY=DOWN THEN GOTO 1710
1610 RETURN
1620 LET DX=DX+1
1630 PRINT AT 19,14;"\ :"
1640 RETURN
1650 LET DX=DX-1
1660 PRINT AT 19,17;"\: "
1670 RETURN
1680 LET DY=DY-1
1690 PRINT AT 18,15;"\ '\' "
1700 RETURN
1710 LET DY=DY+1
1720 PRINT AT 20,15;"\ .\. "
1730 RETURN
2000 REM ENEMY SHIP
2010 IF SHIP=0 AND INT (RND*6)<>1 THEN RETURN
2020 IF SHIP=0 THEN GOTO 2240
2030 IF EY<13 OR EY>43 THEN GOTO 2060
2040 IF EX>=1 AND EX<65 THEN UNPLOT EX-1,EY
2050 IF EX>-2 AND EX<63 THEN UNPLOT EX+1,EY
2060 IF EX<0 OR EX>64 THEN GOTO 2090
2070 IF EY>13 AND EY<45 THEN UNPLOT EX,EY-1
2080 IF EY>11 AND EY<43 THEN UNPLOT EX,EY+1
2090 IF EL=0 THEN GOTO 2700
2100 LET DIR=INT (RND*8)+1
2110 IF DIR=1 AND EY<42 THEN LET EY=EY+1
2120 IF DIR=2 AND EX<62 THEN LET EX=EX+1
2130 IF DIR=3 AND EY>28 THEN LET EY=EY-1
2140 IF DIR=4 AND EX>1 THEN LET EX=EX-1
2150 LET EX=EX+DX
2160 LET EY=EY+DY
2170 IF EY<13 OR EY>43 THEN GOTO 2200
2180 IF EX>=1 AND EX<65 THEN PLOT EX-1,EY
2190 IF EX>-2 AND EX<63 THEN PLOT EX+1,EY
2200 IF EX<0 OR EX>63 THEN GOTO 2230
2210 IF EY>13 AND EY<45 THEN PLOT EX,EY-1
2220 IF EY>11 AND EY<43 THEN PLOT EX,EY+1
2230 RETURN
2240 LET SHIP=1
2250 LET EL=INT (RND*3)+2
2260 LET EX=INT (RND*62)+1
2270 LET EY=INT (RND*10)+33
2280 GOTO 2170
2500 REM FIRE LASER
2510 FOR I=14 TO 7 STEP -1
2520 PRINT AT I,22-I;"\.'"
2530 PRINT AT I,9+I;"\'."
2540 NEXT I
2550 PAUSE 4
2560 FOR I=14 TO 7 STEP -1
2570 PRINT AT I,22-I;" "
2580 PRINT AT I,9+I;" "
2590 NEXT I
2600 IF EY<29 OR EY>30 THEN RETURN
2610 IF EX<30 OR EX>33 THEN RETURN
2620 LET EL=EL-1
2630 RETURN
2700 REM SHIP EXPLODES
2710 LET SHIP=0
2720 FOR I=1 TO 2
2730 PLOT EX,EY
2740 PLOT EX-1,EY
2750 PLOT EX+1,EY
2760 PLOT EX,EY-1
2770 PLOT EX,EY+1
2780 UNPLOT EX,EY
2790 PLOT EX-2,EY-2
2800 PLOT EX+2,EY-2
2810 PLOT EX-2,EY+2
2820 PLOT EX+2,EY+2
2830 UNPLOT EX-1,EY
2840 UNPLOT EX+1,EY
2850 UNPLOT EX,EY-1
2860 UNPLOT EX,EY+1
2870 UNPLOT EX-2,EY-2
2880 UNPLOT EX+2,EY-2
2890 UNPLOT EX-2,EY+2
2900 UNPLOT EX+2,EY+2
2910 NEXT I
2920 RETURN
3000 REM DRAW DISPLAY
3010 FOR I=0 TO 31
3030 PRINT AT 15,I;"\.."
3040 NEXT I
3050 FOR I=16 TO 21
3060 PRINT AT I,7;"\ :"
3070 PRINT AT I,24;"\: "
3080 NEXT I
3090 PRINT AT 17,12;"\ .\..\.'\''\''\'.\..\. "
3100 PRINT AT 18,10;"\..\''\' "," \ '\''\.."
3110 PRINT AT 19,9;"\.'"," \'."
3120 PRINT AT 20,8;"\ .\' "," \ '\. "
3130 PRINT AT 21,8;"\ : E L I T E \: "
3140 PRINT AT 19,15;"\ :\: "
3150 PRINT AT 17,0;"FUEL:"
3160 PRINT AT 18,0;"\##\##\##\##\##\##\##"
3170 PRINT AT 20,0;"ENERGY"
3180 PRINT AT 21,0;"\##\##\##\##\##\##\##"
3190 PRINT AT 17,25;"AMMO:"
3200 PRINT AT 18,25;"\##\##\##\##\##\##\##"
3210 PRINT AT 20,25;"SHIELD:"
3220 PRINT AT 21,25;"\##\##\##\##\##\##\##"
3230 RETURN
3500 REM SETTINGS
3510 LET SHIP=0
3520 LET STARS=0
3530 LET FIRE=CODE "F"
3540 LET LEFT=CODE "A"
3550 LET RIGHT=CODE "D"
3560 LET DOWN=CODE "W"
3570 LET UP=CODE "S"
3580 PRINT AT 0,0;"S:TART C:ONFIGURE?",,," DEFAULT: F,A,D,W,S"
3590 GOSUB 3810
3600 PRINT AT 0,0;" ",,," "
3610 IF KEY=CODE "S" THEN RETURN
3620 PRINT AT 0,0;"PRESS KEY FOR ACTION:"
3630 PRINT AT 2,2;"FIRE?"
3640 GOSUB 3810
3650 LET FIRE=KEY
3660 PRINT AT 2,2;"LEFT?"
3670 GOSUB 3810
3680 LET LEFT=KEY
3690 PRINT AT 2,2;"RIGHT?"
3700 GOSUB 3810
3710 LET RIGHT=KEY
3720 PRINT AT 2,2;"UP? "
3730 GOSUB 3810
3740 LET UP=KEY
3750 PRINT AT 2,2;"DOWN? "
3760 GOSUB 3810
3770 LET DOWN=KEY
3780 PRINT AT 0,0;" "
3790 PRINT AT 2,2;" "
3800 RETURN
3810 REM GET KEY
3820 LET KEY=CODE INKEY$
3830 IF KEY<>0 THEN RETURN
3840 GOTO 3820
Also, I may write a separate utility program that'll renumber the BASIC code for me. Pain to constantly have to change line numbers to keep things uniform. ZX81 doesn't support renumber feature.