Here is the latest Elite game for the ZX81 as written on the ZXSimulator (as a test program to see how compatible it is). It works great on any accelerated machine but is also playable on a ZX81 and the ZXSimulator running on an unexpanded QL (the original goal for the ZXSimulator project). They both play about the same with the ZX81 ever so slightly faster.
On the slower machines it gets interesting when in cross-hairs as the pirate bounces in and out. It has been sped up a bit to have the pirate move left/right a bit quicker (after all, it's 64 pixels of space in that dimension and only 30 pixels from top to edge of display).
Game play is as follows. Note that it is pretty hard to win but there is an end goal when you fill your energy destroying all pirates.
- You lose ammo whenever you fire
- You may lose shields when firing at enemy: shields may hold or drain
- Fuel gets used up when you maneuver so be cautious of movement
- You gain energy when you destroy pirate...also grab ammo, fuel and regenerate shields (though minimally for shields - that's a weak point)
- If you run out of fuel, ammo, or shields the game ends and you lose
- If you destroy all the pirates you end the game (or at least part 1 of it)
- Pirates may hyperspace away -- horrible if you invested a lot of ammo/fuel/shields hoping to gain their supplies when they are destroyed
This version of Elite only deals with pirates as there is no planet hopping or bartering at this point...should change eventually.
The .p file -- with zxtool.exe it reverts to BASIC with very little change: adding an extra space after REM (don't know why it needs 2 spaces after the REM) and converting "% " to "\::" (ZXSimulator allows for both ways to show a solid black block) but that's about it.
Basic code -- about 6.5K though likely smaller on actual ZX81 when tokenized. With zxtext2p.exe it converts to above .p file. About as pretty as you can write BASIC in ZX81 considering no functions (only GOSUB's). I tried to avoid jumping (via GOTO) outside of code blocks unless I had a GOSUB followed by a RETURN (might as well just do a GOTO and use the subroutine's return as your own since a RETURN isn't tied to any specific code block).
Code: Select all
10 REM ELITE
20 GOSUB 3200
30 GOSUB 1200
400 REM PLAY
410 GOSUB 1500
420 GOTO 440
430 GOSUB 2400
440 GOSUB 1000
450 GOSUB 1100
460 GOSUB 2000
470 LET KEY=CODE INKEY$
480 IF KEY=0 THEN GOTO 440
490 IF KEY=FIRE THEN GOTO 430
500 GOTO 410
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 LET SD=INT (RND*6)=1
1120 IF SD=0 AND DX=DY THEN RETURN
1130 LET S$=" "
1140 GOSUB 1260
1150 IF STARS=0 OR SY+SM>13 THEN GOTO 1200
1160 LET SM=SM+SD
1170 LET SX=SX+DX
1180 LET SY=SY-DY
1190 GOTO 1250
1200 REM SHOW STARS
1210 LET STARS=1
1220 LET SM=0
1230 LET SX=INT (RND*3)+5
1240 LET SY=INT (RND*2)+4
1250 LET S$="."
1260 LET SXC=SX-SM
1270 LET SYC=SY+SM
1280 IF SYC>=0 AND SYC<14 AND SXC>=0 AND SXC<32 THEN PRINT AT SYC,SXC;S$
1290 LET SXC=SX+10
1300 LET SYC=SY+SM*2-4
1310 IF SYC>=0 AND SYC<14 AND SXC>=0 AND SXC<32 THEN PRINT AT SYC,SXC;S$
1320 LET SXC=SX+SM+20
1330 LET SYC=SY-SM
1340 IF SYC>=0 AND SYC<14 AND SXC>=0 AND SXC<32 THEN PRINT AT SYC,SXC;S$
1350 RETURN
1500 REM CONTROLS
1510 PRINT AT 18,15;" "
1520 PRINT AT 19,14;" \ :\: "
1530 PRINT AT 20,15;" "
1540 IF KEY=LEFT THEN GOTO 1590
1550 IF KEY=RIGHT THEN GOTO 1640
1560 IF KEY=UP THEN GOTO 1690
1570 IF KEY=DOWN THEN GOTO 1740
1580 RETURN
1590 LET DX=DX<>1
1600 LET DY=0
1610 IF DX=0 THEN RETURN
1620 PRINT AT 19,14;"\ :"
1630 GOTO 1780
1640 LET DX=-(DX<>-1)
1650 LET DY=0
1660 IF DX=0 THEN RETURN
1670 PRINT AT 19,17;"\: "
1680 GOTO 1780
1690 LET DX=0
1700 LET DY=-(DY<>-1)
1710 IF DY=0 THEN RETURN
1720 PRINT AT 18,15;"\ '\' "
1730 GOTO 1780
1740 LET DX=0
1750 LET DY=DY<>1
1760 IF DY=0 THEN RETURN
1770 PRINT AT 20,15;"\ .\. "
1780 LET FUEL=FUEL-1
1790 GOSUB 2600
1800 IF FUEL=0 THEN GOTO 4010
1810 RETURN
2000 REM ENEMY SHIP
2010 LET TIME=TIME+1
2020 IF TIME<WAIT THEN RETURN
2030 IF TIME=WAIT THEN GOTO 2240
2040 IF EX<1 OR EX>62 OR EY<14 OR EY>42 THEN GOTO 2090
2050 UNPLOT EX-1,EY
2060 UNPLOT EX+1,EY
2070 UNPLOT EX,EY-1
2080 UNPLOT EX,EY+1
2090 IF EL=0 THEN GOTO 2850
2100 IF TIME=LEAVE THEN GOTO 2800
2110 LET DIR=INT (RND*8)+1
2120 IF DIR=1 AND EY<42 THEN LET EY=EY+1
2130 IF DIR=2 AND EX<62 THEN LET EX=EX+1
2140 IF DIR=3 AND EY>28 THEN LET EY=EY-1
2150 IF DIR=4 AND EX>1 THEN LET EX=EX-1
2160 LET EX=EX+DX*2
2170 LET EY=EY+DY
2180 IF EX<1 OR EX>62 OR EY<14 OR EY>42 THEN RETURN
2190 PLOT EX-1,EY
2200 PLOT EX+1,EY
2210 PLOT EX,EY-1
2220 PLOT EX,EY+1
2230 RETURN
2240 LET LEAVE=WAIT+INT (RND*25)+75
2250 LET EL=INT (RND*3)+2
2260 LET EX=INT (RND*62)+1
2270 LET EY=INT (RND*10)+33
2280 GOTO 2180
2400 REM FIRE LASER
2410 FOR I=14 TO 7 STEP -1
2420 PRINT AT I,22-I;"\.'"
2430 PRINT AT I,9+I;"\'."
2440 NEXT I
2450 PAUSE 4
2460 FOR I=14 TO 7 STEP -1
2470 PRINT AT I,22-I;" "
2480 PRINT AT I,9+I;" "
2490 NEXT I
2500 IF EY<29 OR EY>30 THEN GOTO 2560
2510 IF EX<30 OR EX>33 THEN GOTO 2560
2520 LET EL=EL-1
2530 LET SHIELD=SHIELD-INT (RND*3)
2540 IF SHIELD<14 THEN GOSUB 2700
2550 IF SHIELD<=0 THEN GOTO 4070
2560 LET AMMO=AMMO-1
2570 GOSUB 2650
2580 IF AMMO=0 THEN GOTO 4050
2590 RETURN
2600 REM FUEL
2610 LET BAR=INT (FUEL/3)
2620 PRINT AT 18,BAR;" "
2630 RETURN
2650 REM AMMO
2660 LET BAR=INT (AMMO/2)
2670 PRINT AT 18,25+BAR;" "
2680 RETURN
2700 REM SHIELD
2710 LET BAR=INT (SHIELD/2)
2720 PRINT AT 21,25+BAR;" "
2730 RETURN
2750 REM ENERGY
2760 LET BAR=INT ((ENERGY-1)/2)
2770 PRINT AT 21,BAR;"\##"
2780 IF ENERGY=14 THEN GOTO 4030
2800 REM INIT SHIP
2810 LET STARS=0
2820 LET TIME=0
2830 LET WAIT=INT (RND*5)+8
2840 RETURN
2850 REM SHIP EXPLODES
2860 FOR I=1 TO 2
2870 PLOT EX,EY
2880 PLOT EX-1,EY-1
2890 PLOT EX+1,EY-1
2900 PLOT EX-1,EY+1
2910 PLOT EX+1,EY+1
2920 UNPLOT EX,EY
2930 PLOT EX-2,EY-2
2940 PLOT EX+2,EY-2
2950 PLOT EX-2,EY+2
2960 PLOT EX+2,EY+2
2970 UNPLOT EX-1,EY-1
2980 UNPLOT EX+1,EY-1
2990 UNPLOT EX-1,EY+1
3000 UNPLOT EX+1,EY+1
3010 UNPLOT EX-2,EY-2
3020 UNPLOT EX+2,EY-2
3030 UNPLOT EX-2,EY+2
3040 UNPLOT EX+2,EY+2
3050 NEXT I
3060 LET I=INT (RND*2)+1
3070 LET BAR=FUEL+I*3
3080 LET FUEL=(BAR<22)*BAR+(BAR>21)*21
3090 PRINT AT 18,0;F$(1 TO INT (FUEL/3))
3100 LET BAR=AMMO+I*3
3110 LET AMMO=(BAR<15)*BAR+(BAR>14)*14
3120 PRINT AT 18,25;F$(1 TO INT (AMMO/2))
3130 LET BAR=SHIELD+I
3140 LET SHIELD=(BAR<15)*BAR+(BAR>14)*14
3150 PRINT AT 21,25;F$(1 TO INT (SHIELD/2))
3160 LET ENERGY=ENERGY+1
3170 GOTO 2750
3200 REM SETTINGS
3210 GOSUB 2800
3220 LET DX=0
3230 LET DY=0
3240 LET FUEL=21
3250 LET ENERGY=0
3260 LET AMMO=14
3270 LET SHIELD=14
3280 LET FIRE=CODE "F"
3290 LET LEFT=CODE "A"
3300 LET RIGHT=CODE "D"
3310 LET DOWN=CODE "W"
3320 LET UP=CODE "S"
3330 LET F$="\##\##\##\##\##\##\##"
3400 REM DRAW DISPLAY
3410 FOR I=0 TO 31
3420 PRINT AT 15,I;"\.."
3430 NEXT I
3440 FOR I=16 TO 21
3450 PRINT AT I,7;"\ :"
3460 PRINT AT I,24;"\: "
3470 NEXT I
3480 PRINT AT 17,12;"\ .\..\.'\''\''\'.\..\. "
3490 PRINT AT 18,10;"\..\''\' "," \ '\''\.."
3500 PRINT AT 19,9;"\.'"," \'."
3510 PRINT AT 20,8;"\ .\' "," \ '\. "
3520 PRINT AT 21,8;"\ : E L I T E \: "
3530 PRINT AT 19,15;"\ :\: "
3540 PRINT AT 17,0;"FUEL:"
3550 PRINT AT 18,0;F$
3560 PRINT AT 20,0;"ENERGY:"
3570 PRINT AT 17,25;"AMMO:"
3580 PRINT AT 18,25;F$
3590 PRINT AT 20,25;"SHIELD:"
3600 PRINT AT 21,25;F$
3650 REM CONFIGURE
3660 PRINT AT 0,0;"S:TART C:ONFIGURE?",,," DEFAULT: F,A,D,W,S"
3670 GOSUB 3900
3680 PRINT AT 0,0;" ",,," "
3690 IF KEY=CODE "S" THEN RETURN
3700 PRINT AT 0,0;"PRESS KEY FOR ACTION:"
3710 PRINT AT 2,2;"FIRE?"
3720 GOSUB 3900
3730 LET FIRE=KEY
3740 PRINT AT 2,2;"LEFT?"
3750 GOSUB 3900
3760 LET LEFT=KEY
3770 PRINT AT 2,2;"RIGHT?"
3780 GOSUB 3900
3790 LET RIGHT=KEY
3800 PRINT AT 2,2;"UP? "
3810 GOSUB 3900
3820 LET UP=KEY
3830 PRINT AT 2,2;"DOWN? "
3840 GOSUB 3900
3850 LET DOWN=KEY
3860 PRINT AT 0,0;" "
3870 PRINT AT 2,2;" "
3880 LET KEY=0
3890 RETURN
3900 REM GET KEY
3910 LET KEY=CODE INKEY$
3920 IF KEY<>0 THEN RETURN
3930 GOTO 3910
4000 REM GAME END
4010 LET S$="YOU RAN OUT OF FUEL"
4020 GOTO 4100
4030 LET S$="YOU GOT ALL OF THEM"
4040 GOTO 4100
4050 LET S$="YOU RAN OUT OF AMMO"
4060 GOTO 4100
4070 LET S$="YOUR SHIELDS FAILED"
4110 REM MESSAGE
4120 PRINT AT 6,14;" "
4130 PRINT AT 7,14;" "
4140 FOR I=1 TO 3
4150 PRINT AT 6,11;"%G%A%M%E% %O%V%E%R"
4160 PAUSE 20
4170 PRINT AT 6,11;"GAME OVER"
4180 PAUSE 20
4190 NEXT I
4200 PRINT AT 7,6;S$
4210 STOP
Obviously with zxtext2p.exe you can develop ZX81 programs in your favorite text editor and then convert it. ZXSimulator doesn't have all the perks of a graphical editor with mouse control but it handles entering code much better than a ZX81 emulator running the ROM; even the unaccelerated version (i.e. running on unexpanded QL). You type things in with line numbers (you type the entire commands and no hunting for the right key) and it adds the EDIT command to allow for editing line numbers (to delete you simply type the line number). No renumber function presently but I may write a separate program to do that (unless one already exists???).