Home » Archimedes archive » Archimedes World » AW-1994-06-Disc2.adf » Disk2Jun94 » !AWJune94/Goodies/Alien/!Invasion/BasicProgs/WEdit
!AWJune94/Goodies/Alien/!Invasion/BasicProgs/WEdit
This website contains an archive of files for the Acorn Electron, BBC Micro, Acorn Archimedes, Commodore 16 and Commodore 64 computers, which Dominic Ford has rescued from his private collection of floppy disks and cassettes.
Some of these files were originally commercial releases in the 1980s and 1990s, but they are now widely available online. I assume that copyright over them is no longer being asserted. If you own the copyright and would like files to be removed, please contact me.
| Tape/disk: | Home » Archimedes archive » Archimedes World » AW-1994-06-Disc2.adf » Disk2Jun94 |
| Filename: | !AWJune94/Goodies/Alien/!Invasion/BasicProgs/WEdit |
| Read OK: | ✔ |
| File size: | 8299 bytes |
| Load address: | 0000 |
| Exec address: | 0000 |
File contents
10REM > <Invasion$Dir>.BasicProgs.WEdit
20
30REM Program : Invader Wave Editor
40REM Version : 1
50REM Author : A.S.W.Nelson
60REM Date : 19.12.89
70:
80ON ERROR CLS:PRINT "Unexpected Error: ";ERR;:REPORT:PRINT " at line: ";ERL:END
90PROCinit
100PROCnow_what
110CHAIN "<Invasion$Dir>.BASICPROGS.Menu"
120:
130DEFPROCinit
140PROCdefine_variables
150MODE 12
160OSCLI("CHANNELVOICE 1 WaveSynth-Beep")
170OSCLI("SNEW")
180OSCLI("POINTER 1")
190OSCLI("fx 229 1")
200MOUSE ON
210MOUSE RECTANGLE 0,10,1280,1010
220MOUSE TO 640,512
230PROCdefault_palette
240PROCinit_menus
250CLS
260PROCdraw_screen
270PROCsprite_load(oldspritefilename$)
280PROCwave_load(oldfilename$)
290PROCshow_current_wave
300OFF
310PROCmessage("Invader Waves Can Now Be Edited")
320PROCinfo_line
330ENDPROC
340:
350DEFPROCdefine_variables
360LOCAL offset%
370black%=0
380dark_grey%=1
390light_grey%=3
400red%=4
410orange%=5
420yellow%=6
430bright_green%=8
440dark_green%=9
450cyan%=10
460dark_blue%=11
470dark_brown%=12
480light_brown%=13
490white%=15
500magenta%=9
510WY%=32+3*12*4+8
520current_sprite%=0
530current_wave%=1
540max_no_sprites%=122
550max_no_waves%=128
560num_spaces%=3
570floodx%=FALSE
580floody%=FALSE
590current_invader%=1
600sprite_size%=48+max_no_sprites%*384
610sprite_X%=72
620sprite_Y%=68
630swap%=FALSE
640defined_waves%=0
650unhighlight%=TRUE
660free_edit%=0
670seed%=1024*16
680old_invader%=0
690wave_size%=2+max_no_waves%*144
700to_wave%=0
710original%=TRUE
720num%=0
730oldspritefilename$="<Invasion$Dir>.MISC.InvSprite"
740oldfilename$="<Invasion$Dir>.MISC.WaveCopy"
750B$=""
760filename$=""
770password$=""
780wavepassword$=""
790DIM sprite_data% sprite_size%
800DIM wave_data% wave_size%
810DIM current_sprite_c%(16,16)
820DIM current_wave_i%(16,8)
830DIM wave_attributes%(4)
840wave_attributes%()=0
850current_sprite_c%()=0
860current_wave_i%()=0
870FOR I%=1 TO 128
880 PROCwave_offset(I%)
890 wavepassword$="DUMMY WORD"
900 FOR K%=0 TO 9
910 ?(wave_data%+offset%+K%)=255-ASC(MID$(wavepassword$,K%+1,1))
920 NEXT K%
930 ?(wave_data%+offset%+10)=16:REM width
940 ?(wave_data%+offset%+11)=7 :REM bomb attributes
950 ?(wave_data%+offset%+12)=1 :REM wave height
960 ?(wave_data%+offset%+13)=10:REM num bombs
970 ?(wave_data%+offset%+14)=3 :REM num rockets
980 ?(wave_data%+offset%+15)=1 :REM init dir
990 FOR K%=16 TO 143
1000 ?(wave_data%+offset%+K%)=32
1010 NEXT K%
1020NEXT I%
1030ENDPROC
1040:
1050DEFPROCdefault_palette
1060LOCAL A%,B%(),C%
1070DIM B%(3)
1080RESTORE
1090DATA 0,0,0
1100DATA 128,128,128
1110DATA 176,176,176
1120DATA 208,208,208
1130DATA 240,0,0
1140DATA 240,176,0
1150DATA 240,224,0
1160DATA 240,240,208
1170DATA 0,240,0
1180DATA 0,176,96
1190DATA 0,192,240
1200DATA 0,0,160
1210DATA 160,112,96
1220DATA 192,144,80
1230DATA 240,208,176
1240DATA 240,240,240
1250REMDATA 0,0,0
1260REMDATA 255,0,0
1270REMDATA 0,255,0
1280REMDATA 255,255,0
1290REMDATA 0,0,255
1300REMDATA 255,0,255
1310REMDATA 0,255,255
1320REMDATA 255,255,255
1330REMDATA 190,130,0
1340REMDATA 255,120,50
1350REMDATA 128,128,128
1360REMDATA 0,0,128
1370REMDATA 200,200,200
1380REMDATA 0,128,0
1390REMDATA 240,220,0
1400REMDATA 255,180,0
1410FOR A%=0 TO 15
1420 FOR C%=1 TO 3
1430 READ B%(C%)
1440 NEXT C%
1450 COLOUR A%,B%(1),B%(2),B%(3)
1460NEXT A%
1470ENDPROC
1480:
1490DEFPROCinit_menus
1500READ total_menus%
1510DIM menu_length%(total_menus%),menu_origin%(total_menus%)
1520max_menu_length%=0
1530FOR A%=1 TO total_menus%
1540 READ menu_length%(A%)
1550 IF menu_length%(A%)>max_menu_length% THEN max_menu_length%=menu_length%(A%)
1560NEXT A%
1570FOR A%=1 TO total_menus%
1580 READ menu_origin%(A%)
1590NEXT A%
1600DIM menu$(total_menus%,max_menu_length%)
1610FOR A%=1 TO total_menus%
1620 FOR B%=1 TO menu_length%(A%)
1630 READ menu$(A%,B%)
1640 NEXT B%
1650NEXT A%
1660current_menu%=1
1670menu_position=0
1680DATA 9
1690DATA 6, 8, 7, 4, 8, 3, 3, 4, 5
1700DATA 0, 1, 1, 1, 1, 2, 2, 2, 2
1710DATA Wave Editor Menu, Edit Wave, Edit Wave Attributes, File Options, Select Wave, Exit Editor
1720DATA Edit Wave Menu, Clear, Flip Menu, Flood Menu, Reflect Menu, Shift Menu, Swap, Undo All Changes
1730DATA Wave Attributes Menu, Bomb Types, Max Invader Bombs, Max Player Rockets, Initial Direction, Initial Wave Height, Password
1740DATA File Options Menu, Load Sprites, Load Waves, Save Waves
1750DATA Select Wave Menu, Copy To Wave Number,To Wave Number, Set Random Attribute, Random Wave, Random X Reflect, Random Y Reflect, Random X & Y Reflect
1760DATA Flip Wave Menu, Row, Column
1770DATA Flood Menu, Row, Column
1780DATA Reflect Menu, X Axis, Y Axis, X And Y Axis
1790DATA Shift Menu, Left, Right, Up, Down
1800ENDPROC
1810:
1820DEFPROCdraw_screen
1830LOCAL D%
1840PROCshow_menu(current_menu%,0)
1850PROClogo
1860GCOL 0,dark_blue%
1870RECTANGLE FILL 0,0,1280,36
1880RECTANGLE FILL 0,738,4+18*44,36
1890GCOL 0,white%:REM show initial height
1900RECTANGLE 1160,464,118,266
1910GCOL 0,dark_grey%
1920RECTANGLE FILL 1162,692,114,32
1930RECTANGLE FILL 1160,410,118,40
1940RECTANGLE FILL 1162,92,114,40
1950RECTANGLE FILL 998,92+44,152,40
1960GCOL 0,white%
1970VDU 5
1980MOVE 1172,720
1990PRINT "HEIGHT";
2000MOVE 1180,442
2010PRINT "BOMBS";
2020VDU 4
2030OFF
2040LINE 1160,688,1279,688
2050REM show bomb title
2060RECTANGLE 1160,410,118,40
2070REM show num bombs box
2080RECTANGLE 1160,WY%-56+20,118,56
2090D%=WY%-14+20
2100VDU 5
2110MOVE 1166,D%
2120PRINT CHR$(93);
2130MOVE 1166+16,D%
2140PRINT CHR$(95);
2150MOVE 1279-22,D%
2160PRINT CHR$(94);
2170MOVE 1279-22-16,D%
2180PRINT CHR$(95);
2190VDU 4
2200OFF
2210REM show max no. players rockets
2220RECTANGLE 1160,92,118,40
2230RECTANGLE 1160,40,118,52
2240VDU 5
2250MOVE 1164,124
2260PRINT "ROCKETS";
2270MOVE 1166,80
2280PRINT CHR$(93);
2290MOVE 1166+16,80
2300PRINT CHR$(95);
2310MOVE 1279-22,80
2320PRINT CHR$(94);
2330MOVE 1279-22-16,80
2340PRINT CHR$(95);
2350REM show initial dir
2360RECTANGLE 998,92+44,152,40
2370FOR D%=0 TO 2
2380 RECTANGLE 998+D%*50,40,52,96
2390NEXT D%
2400LINE 998,40+48,1150,40+48
2410MOVE 1002,92+76
2420PRINT "DIRECTION";
2430MOVE 1014,40+86
2440PRINT CHR$(93);
2450MOVE 1066,40+86
2460PRINT "?";
2470MOVE 1066+52,40+86
2480PRINT CHR$(94);
2490REM show which wave
2500GCOL 0,dark_grey%
2510RECTANGLE FILL 840,92,150,40
2520GCOL 0,white%
2530RECTANGLE 840,92,118+32,40
2540RECTANGLE 840,40,118+32,52
2550VDU 5
2560MOVE 884,124
2570PRINT "WAVE";
2580MOVE 846,80
2590PRINT CHR$(93);
2600MOVE 846+16,80
2610PRINT CHR$(95);
2620MOVE 958+32-22,80
2630PRINT CHR$(94);
2640MOVE 958+32-22-16,80
2650PRINT CHR$(95);
2660VDU 4
2670OFF
2680ENDPROC
2690:
2700DEFPROCshow_invader(X%,Y%)
2710PROCplot_sprite(current_wave_i%(X%,Y%),(X%-1)*18*4,WY%+(8-Y%)*17*4)
2720ENDPROC
2730:
2740DEFPROCnow_what
2750LOCAL exit%,MX%,MY%,MB%,valid%
2760exit%=FALSE
2770REPEAT
2780VDU 4
2790PRINTTAB(0,0)wavepassword$,password$
2800
2810 valid%=FALSE
2820 PROCmouse
2830 IF MY%>776 AND MX%<16*4+32+16*44 THEN PROCcheck_menu_options
2840 IF FNis_mouse_in_box(MX%,MY%,0,WY%,8+16*18*4,16+8*16*4) THEN PROCinvader_grid
2850 IF FNis_mouse_in_box(MX%,MY%,0,40,sprite_X%*6,sprite_Y%*2) THEN PROCselect_invader
2860 IF FNis_mouse_in_box(MX%,MY%,840,40,150,48) THEN PROCget_new_wave
2870 IF FNis_mouse_in_box(MX%,MY%,8+18*16*4,WY%+20,1278-8-18*16*4,sprite_Y%*3) THEN PROCtoggle_bomb_type
2880 IF FNis_mouse_in_box(MX%,MY%,1162,468,114,36*6) THEN PROCget_wave_height
2890 IF FNis_mouse_in_box(MX%,MY%,1162,WY%-56+20,114,56) THEN PROCget_num_bombs
2900 IF FNis_mouse_in_box(MX%,MY%,1162,40,114,52) THEN PROCget_num_rockets
2910 IF FNis_mouse_in_box(MX%,MY%,1000,40,150,48) THEN PROCget_init_dir
2920 IF NOT valid% THEN PROCwrong_sound
2930UNTIL exit%
2940ENDPROC
2950:
2960DEFPROCmouse
2970*FX21,9
2980REPEAT
2990 MOUSE MX%,MY%,MB%
3000 PROCdelay(.15)
3010UNTIL MB%>0
3020ENDPROC
3030:
3040DEFPROCdelay(seconds)
3050TIME=0
3060REPEAT
3070UNTIL TIME>seconds*100
3080ENDPROC
3090:
3100DEFPROCwrong_sound
3110LOCAL I%
3120FOR I%=11 TO 90 STEP 2
3130 SOUND 1,-14,I%,3
3140 SOUND 1,-14,I%-10,3
3150NEXT I%
3160ENDPROC
3170:
3180DEFPROCinvader_grid
3190LOCAL X%,Y%,offset%,inv%,action$,A%
3200X%=1+INT(MX%/(18*4))
3210Y%=8-INT((MY%-WY%)/sprite_Y%)
3220IF Y%<1 THEN Y%=1
3230IF Y%>8 THEN Y%=8
3240IF X%>16 THEN X%=16
3250IF X%<1 THEN X%=1
3260action$=" "
3270CASE MB% OF
3280 WHEN 4: inv%=current_invader%: action$="Added To"
3290 WHEN 1: inv%=0: action$="Wiped From"
3300 OTHERWISE: REM ignore
3310ENDCASE
3320IF action$<>" " THEN
3330 IF floodx%=FALSE AND floody%=FALSE THEN
3340 PROCmessage("Invader "+action$+" Wave")
3350 current_wave_i%(X%,Y%)=inv%
3360 PROCshow_invader(X%,Y%)
3370 ELSE
3380 IF floodx%=TRUE THEN
3390 PROCmessage("Invader Row "+action$+" Wave")
3400 FOR A%=1 TO 16
3410 current_wave_i%(A%,Y%)=inv%
3420 PROCshow_invader(A%,Y%)
3430 NEXT A%
3440 ELSE
3450 PROCmessage("Invader Column "+action$+" Wave")
3460 FOR A%=1 TO 8
3470 current_wave_i%(X%,A%)=inv%
3480 PROCshow_invader(X%,A%)
3490 NEXT A%
3500 ENDIF
3510 ENDIF
3520 PROCusual
3530ENDIF
3540ENDPROC
3550:
3560DEFPROCshift_right
3570LOCAL I%,J%
3580FOR J%=1 TO 8
3590 current_wave_i%(0,J%)=current_wave_i%(16,J%)
3600NEXT J%
3610FOR I%=15 TO 0 STEP - 1
3620 FOR J%=1 TO 8
3630 current_wave_i%(I%+1,J%)=current_wave_i%(I%,J%)
3640 NEXT J%
3650NEXT I%
3660PROCmessage("Invader Wave Shifted Right")
3670PROCredisplay
3680ENDPROC
3690:
3700DEFPROCshift_left
3710LOCAL I%,J%
3720FOR I%=1 TO 16
3730 FOR J%=1 TO 8
3740 current_wave_i%(I%-1,J%)=current_wave_i%(I%,J%)
3750 NEXT J%
3760NEXT I%
3770FOR J%=1 TO 8
3780 current_wave_i%(16,J%)=current_wave_i%(0,J%)
3790NEXT J%
3800PROCmessage("Invader Wave Shifted Left")
3810PROCredisplay
3820ENDPROC
3830:
3840DEFPROCredisplay
3850PROCdisplay_wave
3860PROCusual
3870ENDPROC
3880:
3890DEFPROCshift_up
3900LOCAL I%,J%
3910FOR I%=1 TO 8
3920 FOR J%=1 TO 16
3930 current_wave_i%(J%,I%-1)=current_wave_i%(J%,I%)
3940 NEXT J%
3950NEXT I%
3960FOR J%=1 TO 16
3970 current_wave_i%(J%,8)=current_wave_i%(J%,0)
3980NEXT J%
3990PROCmessage("Invader Wave Shifted Up")
4000PROCredisplay
4010ENDPROC
4020:
4030DEFPROCshift_down
4040LOCAL I%,J%
4050FOR J%=1 TO 16
4060 current_wave_i%(J%,0)=current_wave_i%(J%,8)
4070NEXT J%
4080FOR I%=7 TO 0 STEP - 1
4090 FOR J%=1 TO 16
4100 current_wave_i%(J%,I%+1)=current_wave_i%(J%,I%)
4110 NEXT J%
4120NEXT I%
4130PROCmessage("Invader Wave Shifted Down")
4140PROCredisplay
4150ENDPROC
4160:
4170DEFPROCflipy
4180LOCAL I%,J%
4190FOR I%=1 TO 4
4200 FOR J%=1 TO 16
4210 SWAP current_wave_i%(J%,I%),current_wave_i%(J%,8-I%+1)
4220 NEXT J%
4230NEXT I%
4240PROCmessage("Invader Wave Y Flipped")
4250PROCredisplay
4260ENDPROC
4270:
4280DEFPROCflipx
4290LOCAL I%,J%
4300FOR I%=1 TO 8
4310 FOR J%=1 TO 8
4320 SWAP current_wave_i%(I%,J%),current_wave_i%(16-I%+1,J%)
4330 NEXT J%
4340NEXT I%
4350PROCmessage("Invader Wave X Flipped")
4360PROCredisplay
4370ENDPROC
4380:
4390DEFPROCclear
4400current_wave_i%()=0
4410PROCredisplay
4420PROCmessage("Invader Wave Now Cleared")
4430ENDPROC
4440:
4450DEFPROCcopy
4460LOCAL offset1%,offset2%,I%,from%,to%
4470from%=current_wave%
4480PROCto_which_wave_no
4490PROCwave_offset(from%)
4500offset1%=offset%
4510PROCwave_offset(to%)
4520offset2%=offset%
4530FOR I%=0 TO 143 STEP 4
4540 !(wave_data%+offset2%+I%)=!(wave_data%+offset1%+I%)
4550NEXT I%
4560valid%=TRUE
4570PROCmessage("Invader Wave Copied")
4580ENDPROC
4590:
4600DEFPROCexit
4610exit%=TRUE
4620ON
4630MOUSE OFF
4640MODE 9
4650CLS
4660unhighlight%=FALSE
4670valid%=TRUE
4680OSCLI("fx 229 0")
4690ENDPROC
4700:
4710DEFPROCsprite_load(filename$)
4720LOCAL file%,offset%,E%,F%,dummy%,T%,byte%,loadaddr,filelen,B%()
4730LOCAL ERROR
4740DIM B%(3)
4750num%=0
4760REMON ERROR LOCAL PROCerror:ENDPROC
4770PROCmessage("Please Wait...Loading Sprite File")
4780REMON ERROR LOCAL PROCerror:ENDPROC
4790SYS "OS_File",5,filename$ TO ,,loadaddr,,filelen
4800IF (loadaddr>>>20)=&FFF THEN
4810 loadaddr=&FFF AND (loadaddr>>>8)
4820ELSE
4830 loadaddr = -1
4840ENDIF
4850IF loadaddr=&333 THEN
4860 offset%=num%*1536
4870 IF num%>0 THEN
4880 FOR A%=0 TO 47 STEP 4
4890 !(palette%+A%)=!(sprite_data%+offset%+A%)
4900 NEXT A%
4910 ENDIF
4920 temp%=sprite_data%+offset%
4930 REMON ERROR LOCAL PROCerror:ENDPROC
4940 OSCLI("LOAD "+filename$+" "+STR$~temp%)
4950 IF num%>0 THEN
4960 FOR A%=0 TO 47 STEP 4
4970 !(sprite_data%+offset%+A%)=!(palette%+A%)
4980 NEXT A%
4990 ELSE
5000 FOR A%=0 TO 15
5010 FOR C%=1 TO 3
5020 B%(C%)=?(sprite_data%+A%*3+C%-1)
5030 NEXT C%
5040 COLOUR A%,B%(1),B%(2),B%(3)
5050 NEXT A%
5060 ENDIF
5070 PROCdraw_invaders
5080 PROCplot_sprite(current_invader%,8+6*sprite_X%,40+sprite_Y%/2)
5090 oldspritefilename$=filename$
5100 PROCinfo_line
5110 PROCmessage("Sprite File Loaded")
5120ELSE
5130 PROCmessage("File Specified Is Not A Sprite File")
5140ENDIF
5150valid%=TRUE
5160ENDPROC
5170:
5180DEFPROCwave_load(filename$)
5190LOCAL file%,offset%,E%,F%,dummy%,T%,byte%,loadaddr,filelen,B%(),temp%
5200LOCAL ERROR
5210DIM B%(3)
5220num%=0
5230REMON ERROR LOCAL PROCerror:ENDPROC
5240PROCmessage("Please Wait...Loading Wave File")
5250REMON ERROR LOCAL PROCerror:ENDPROC
5260SYS "OS_File",5,filename$ TO ,,loadaddr,,filelen
5270IF (loadaddr>>>20)=&FFF THEN
5280 loadaddr=&FFF AND (loadaddr>>>8)
5290ELSE
5300 loadaddr = -1
5310ENDIF
5320IF loadaddr=&334 THEN
5330 offset%=num%*144
5340 IF num%>0 THEN
5350 REM preserve 2 bytes that would get written over
5360 ENDIF
5370 temp%=wave_data%+offset%
5380 REMON ERROR LOCAL PROCerror:ENDPROC
5390 OSCLI("LOAD "+filename$+" "+STR$~temp%)
5400 IF num%>0 THEN
5410 REM reset 2 bytes that were overwritten
5420 ENDIF
5430 oldfilename$=filename$
5440 PROCinfo_line
5450 PROCmessage("Wave File Loaded")
5460ELSE
5470 PROCmessage("File Specified Is Not A Wave File")
5480ENDIF
5490defined_waves%=?(wave_data%+1)
5500free_edit%=?wave_data%
5510PROCshow_current_wave
5520original%=TRUE
5530oldfilename$=filename$
5540PROCinfo_line
5550valid%=TRUE
5560ENDPROC
5570:
5580DEFPROCwave_save(filename$)
5590LOCAL L%,offset%,E%,file%,M%,A%,B%,to%
5600PROCstore_current_wave
5610PROCto_which_wave_no
5620?(wave_data%+1)=to%
5630num%=to%
5640REMON ERROR LOCAL PROCerror:ENDPROC
5650PROCmessage("Please Wait...Saving Wave File")
5660temp%=2+(num%+1)*144
5670REMON ERROR LOCAL PROCerror:ENDPROC
5680OSCLI("SAVE "+filename$+" "+STR$~wave_data%+"+"+STR$~temp%)
5690OSCLI("SETTYPE "+filename$+" 334")
5700valid%=TRUE
5710original%=TRUE
5720defined_waves%=?(wave_data%+1)
5730PROCinfo_line
5740PROCmessage("Wave File Saved")
5750ENDPROC
5760:
5770DEFPROCdisplay_sprite
5780LOCAL I%,J%
5790FOR I%=1 TO 16
5800 FOR J%=1 TO 16
5810 PROCdisplay_point(I%-1,J%-1)
5820 NEXT J%
5830NEXT I%
5840ENDPROC
5850:
5860DEFPROCdisplay_point(X%,Y%)
5870GCOL 0,current_sprite_c%(X%+1,Y%+1)
5880Y%=15-Y%
5890RECTANGLE FILL SX%+2+X%*mag%,SY%+4+Y%*mag%,mag%-2,mag%-4
5900POINT AX%+2+X%*4,AY%+4+Y%*4
5910POINT AX%+4+X%*4,AY%+4+Y%*4
5920ENDPROC
5930:
5940DEFPROCshow_current_sprite
5950PROCget_sprite_info
5960PROCdisplay_sprite
5970ENDPROC
5980:
5990DEFPROCget_sprite_info
6000LOCAL offset%,I%,J%
6010PROCcalc_offset(current_sprite%)
6020FOR J%=1 TO 16
6030 FOR I%=1 TO 16
6040 current_sprite_c%(I%,J%)=FNget_col(I%,J%)
6050 NEXT I%
6060NEXT J%
6070ENDPROC
6080:
6090DEFPROCto_which_wave_no
6100LOCAL thru%
6110thru%=FALSE
6120COLOUR white%
6130REPEAT
6140 IF thru%=TRUE THEN PROCwrong_sound
6150 PROCclearmessage
6160 PRINT TAB(1,8);"To Which Wave ==> ";
6170 INPUT to%
6180 thru%=TRUE
6190UNTIL to%>=1 AND to%<=max_no_waves%
6200ENDPROC
6210:
6220DEFPROCget_filename
6230LOCAL thru%
6240thru%=FALSE
6250COLOUR white%
6260REPEAT
6270 IF thru%=TRUE THEN PROCwrong_sound
6280 PROCclearmessage
6290 PRINT TAB(1,8);"Filename=";
6300 INPUT filename$
6310 thru%=TRUE
6320UNTIL LEN(filename$)>0 AND LEN(filename$)<11
6330ENDPROC
6340:
6350DEFPROCcalc_offset(value%)
6360offset%=48+value%*384
6370ENDPROC
6380:
6390DEFPROCwave_offset(value%)
6400offset%=2+(value%-1)*144
6410ENDPROC
6420:
6430DEFPROCclearmessage
6440LOCAL L%
6450L%=4+18*44
6460GCOL 0,magenta%
6470RECTANGLE FILL 0,738,L%,36
6480COLOUR 128+magenta%
6490ENDPROC
6500:
6510DEFPROCmessage(M$)
6520LOCAL L%
6530L%=4+18*44
6540GCOL 0,dark_blue%
6550RECTANGLE FILL 0,738,L%,36
6560GCOL 0,white%
6570VDU 5
6580MOVE (L%-LEN(M$)*16)/2,766
6590PRINT M$;
6600VDU 4
6610OFF
6620ENDPROC
6630:
6640DEFPROCinfo_line
6650LOCAL S1$,S2$,SUB%
6660S1$=oldfilename$
6670S2$=oldspritefilename$
6680COLOUR 128+dark_blue%:REM background blue
6690COLOUR white%
6700OFF
6710PRINT TAB(1,31);STRING$(78," ");
6720SUB%=INSTR(oldfilename$,".")
6730WHILE SUB%>0
6740 oldfilename$=MID$(oldfilename$,SUB%+1,LEN(oldfilename$)-SUB%)
6750 SUB%=INSTR(oldfilename$,".")
6760ENDWHILE
6770PRINT TAB(1,31);"File: """;oldfilename$;""" (";
6780IF original% THEN
6790 PRINT "Original";
6800ELSE
6810 PRINT "Modified";
6820ENDIF
6830PRINT ")";TAB(33,31);"Current Wave: ";STR$(current_wave%);
6840SUB%=INSTR(oldspritefilename$,".")
6850WHILE SUB%>0
6860 oldspritefilename$=MID$(oldspritefilename$,SUB%+1,LEN(oldspritefilename$)-SUB%)
6870 SUB%=INSTR(oldspritefilename$,".")
6880ENDWHILE
6890PRINT TAB(54,31);"Sprite File: """;oldspritefilename$;"""";
6900oldfilename$=S1$
6910oldspritefilename$=S2$
6920ENDPROC
6930:
6940DEFFNis_mouse_in_box(MX%,MY%,X1%,Y1%,XD%,YD%)
6950=MX%>X1% AND MX%<X1%+XD% AND MY%>Y1% AND MY%<Y1%+YD%
6960:
6970DEFPROCshow_menu(N%,highlight%)
6980LOCAL A%,L%
6990GCOL 0,black%
7000RECTANGLE FILL 0,800,800,216
7010L%=22
7020COLOUR white%
7030GCOL 0,white%
7040COLOUR 128+red%
7050PRINT TAB(0,0);STRING$(22," ");
7060VDU 5
7070MOVE (L%-LEN(menu$(N%,1)))*8,1023
7080PRINT menu$(N%,1);
7090VDU 4
7100OFF
7110FOR A%=2 TO menu_length%(N%)
7120 IF highlight%=A% THEN
7130 COLOUR 128+magenta%
7140 ELSE
7150 COLOUR 128+dark_blue%
7160 ENDIF
7170 PRINT TAB(L%,A%-2);STRING$(28," ");
7180 VDU 5
7190 MOVE 22*16+(27-LEN(menu$(N%,A%)))*8,1023-(A%-2)*32
7200 PRINT menu$(N%,A%);
7210 VDU 4
7220 OFF
7230NEXT A%
7240ENDPROC
7250:
7260DEFPROCselect_invader
7270LOCAL SSX%,SSY%
7280SSX%=INT(MX%/sprite_X%)+1
7290SSY%=INT((MY%-40)/sprite_Y%)
7300old_invader%=current_invader%
7310current_invader%=SSX%+SSY%*6
7320PROCplot_sprite(current_invader%,8+6*sprite_X%,40+sprite_Y%/2)
7330IF swap% THEN PROCdo_swap(old_invader%):PROCdisplay_wave
7340valid%=TRUE
7350PROCinfo_line
7360ENDPROC
7370:
7380DEFPROCusual
7390valid%=TRUE
7400original%=FALSE
7410PROCinfo_line
7420ENDPROC
7430:
7440DEFPROCcheck_menu_options
7450LOCAL expected_option%
7460IF MX%<22*16 THEN
7470 REM check go back to last menu
7480 IF MY%>1023-32 THEN
7490 current_menu%=menu_origin%(current_menu%)
7500 IF current_menu%=0 THEN
7510 PROCmessage("Invader Wave Editor By Adrian S.W.Nelson Version 1")
7520 current_menu%=1
7530 ELSE
7540 PROCshow_menu(current_menu%,0)
7550 ENDIF
7560 floodx%=FALSE
7570 floody%=FALSE
7580 valid%=TRUE
7590 unhighlight%=TRUE
7600 ENDIF
7610ELSE
7620 REM get menu option
7630 expected_option%=1+(1023-MY%)/32
7640 IF expected_option%<=menu_length%(current_menu%)-1 THEN
7650 valid%=TRUE
7660 CASE current_menu% OF
7670 WHEN 1: IF expected_option%=5 THEN
7680 PROCexit
7690 ELSE
7700 current_menu%=expected_option%+1
7710 PROCshow_menu(current_menu%,0)
7720 ENDIF
7730 WHEN 2: CASE expected_option% OF
7740 WHEN 1: PROCshow_menu(current_menu%,expected_option%+1)
7750 PROCclear
7760 WHEN 6: PROCshow_menu(current_menu%,expected_option%+1)
7770 PROCswap
7780 WHEN 7: PROCshow_menu(current_menu%,expected_option%+1)
7790 PROCundo_all
7800 OTHERWISE: current_menu%=expected_option%+4
7810 ENDCASE
7820 WHEN 3: PROCshow_menu(current_menu%,expected_option%+1)
7830 ON expected_option% PROCbomb_types,PROCmax_bombs,PROCmax_rockets,PROCinitial_dir,PROCheight,PROCpassword
7840 WHEN 4: PROCshow_menu(current_menu%,expected_option%+1)
7850 ON expected_option% PROCload_sprite,PROCload_file,PROCsave_file
7860 WHEN 5: PROCshow_menu(current_menu%,expected_option%+1)
7870 ON expected_option% PROCcopy_to_number,PROCto_number,PROCset_rnd_seed,PROCrnd_wave,PROCrnd_x_wave,PROCrnd_y_wave,PROCrnd_x_y_wave
7880 WHEN 6: PROCshow_menu(current_menu%,expected_option%+1)
7890 ON expected_option% PROCflipx,PROCflipy
7900 WHEN 7: PROCshow_menu(current_menu%,expected_option%+1)
7910 ON expected_option% PROCfloodx,PROCfloody
7920 WHEN 8: PROCshow_menu(current_menu%,expected_option%+1)
7930 ON expected_option% PROCref_x,PROCref_y,PROCref_x_y
7940 WHEN 9: PROCshow_menu(current_menu%,expected_option%+1)
7950 ON expected_option% PROCshift_left,PROCshift_right,PROCshift_up,PROCshift_down
7960 ENDCASE
7970 IF unhighlight% THEN PROCshow_menu(current_menu%,0)
7980 ENDIF
7990ENDIF
8000ENDPROC
8010:
8020DEFPROCswap
8030PROCmessage("Change Invader In Wave With Next Chosen One")
8040swap%=TRUE
8050valid%=TRUE
8060ENDPROC
8070:
8080DEFPROCdo_swap(oldinvader%)
8090LOCAL X%,Y%
8100FOR X%=1 TO 16
8110 FOR Y%=1 TO 8
8120 IF current_wave_i%(X%,Y%)=oldinvader% THEN current_wave_i%(X%,Y%)=current_invader%
8130 NEXT Y%
8140NEXT X%
8150PROCredisplay
8160PROCmessage("New Invader Changed With Old Invader In Wave")
8170swap%=FALSE
8180ENDPROC
8190:
8200DEFPROCfloodx
8210floodx%=TRUE
8220floody%=FALSE
8230valid%=TRUE
8240unhighlight%=FALSE
8250ENDPROC
8260:
8270DEFPROCfloody
8280floody%=TRUE
8290floodx%=FALSE
8300valid%=TRUE
8310unhighlight%=FALSE
8320ENDPROC
8330:
8340DEFPROCto_number
8350LOCAL to_wave%
8360PROCto_which_wave_no
8370PROCstore_current_wave
8380PROCshow_height(0)
8390current_wave%=to%
8400PROCupdate_wave_box
8410PROCshow_current_wave
8420valid%=TRUE
8430PROCmessage("Now At The Required Wave Number")
8440PROCinfo_line
8450ENDPROC
8460:
8470DEFPROCload_file
8480PROCget_filename
8490filename$="<Invasion$Dir>.WAVES."+filename$
8500PROCwave_load(filename$)
8510ENDPROC
8520:
8530DEFPROCsave_file
8540PROCget_filename
8550PROCto_lower(filename$)
8560filename$="<Invasion$Dir>.WAVES."+filename$
8570PROCwave_save(filename$)
8580ENDPROC
8590:
8600DEFPROCload_sprite
8610PROCget_filename
8620filename$="<Invasion$Dir>.SPRITES."+filename$
8630PROCsprite_load(filename$)
8640ENDPROC
8650:
8660DEFPROCundo_all
8670PROCshow_current_wave
8680valid%=TRUE
8690PROCinfo_line
8700ENDPROC
8710:
8720DEFPROCdraw_invaders
8730LOCAL A%,I%
8740FOR A%=1 TO 15
8750 CASE A% OF
8760 WHEN 1:I%=25
8770 WHEN 2:I%=17
8780 WHEN 3:I%=21
8790 WHEN 4:I%=85-28
8800 WHEN 5:I%=89-28
8810 WHEN 6:I%=93-28
8820 WHEN 7:I%=73-28
8830 WHEN 8:I%=77-28
8840 WHEN 9:I%=97-28
8850 WHEN 10:I%=81-28
8860 WHEN 11:I%=109-28
8870 WHEN 12:I%=101-28
8880 WHEN 13:I%=14
8890 WHEN 14:I%=15
8900 WHEN 15:I%=0
8910 ENDCASE
8920 PROCshow_full_size(I%,A%-1)
8930NEXT A%
8940ENDPROC
8950:
8960DEFPROCshow_full_size(snumber%,pos%)
8970LOCAL SSX%,SSY%
8980CASE TRUE OF
8990 WHEN pos%<12:SSX%=0+(pos% MOD 6)*sprite_X%
9000 SSY%=40+(pos% DIV 6)*sprite_Y%
9010 WHEN pos%<15:SSX%=8+18*16*4
9020 SSY%=WY%+(pos%-12)*sprite_Y%+20
9030 GCOL 0,white%
9040 RECTANGLE SSX%+18*4,SSY%,1279-SSX%-18*4,sprite_Y%
9050ENDCASE
9060GCOL 0,black%
9070RECTANGLE FILL SSX%+2,SSY%+4,sprite_X%-4,sprite_Y%-8
9080GCOL 0,white%
9090RECTANGLE SSX%,SSY%,sprite_X%,sprite_Y%
9100IF snumber%=25 THEN PROCget_sprite(0,SSX%,SSY%,SSX%+sprite_X%,SSY%+sprite_Y%)
9110PROCcalc_offset(snumber%)
9120FOR J%=1 TO 16
9130 FOR I%=1 TO 16
9140 GCOL 0,FNget_col(I%,J%)
9150 POINT SSX%+I%*4,SSY%+(17-J%)*4
9160 POINT SSX%+I%*4+2,SSY%+(17-J%)*4
9170 NEXT I%
9180NEXT J%
9190IF pos%<12 THEN PROCget_sprite(A%,SSX%,SSY%,SSX%+sprite_X%,SSY%+sprite_Y%)
9200ENDPROC
9210:
9220DEFPROCerror
9230CASE (ERR MOD 256) OF
9240 WHEN 152,153 :PROCmessage("Disc Needs Compacting...Please Wait")
9250 OSCLI("COMPACT")
9260 WHEN 198 :PROCmessage("This Disc Is Already Full")
9270 WHEN 201 :PROCmessage("This Disc Is Write Protected")
9280 WHEN 211 :PROCmessage("Please Insert A Disc Into The Drive")
9290 WHEN 214 :PROCmessage("That File Does Not Exist")
9300 OTHERWISE:PROCmessage("Error: "+STR$(ERR)+" at Line: "+STR$(ERL))
9310ENDCASE
9320ENDPROC
9330:
9340DEFPROCdisplay_wave
9350LOCAL I%,J%
9360FOR I%=1 TO 8
9370 FOR J%=1 TO 16
9380 PROCplot_sprite(current_wave_i%(J%,I%),(J%-1)*18*4,WY%+(8-I%)*17*4)
9390 NEXT J%
9400NEXT I%
9410ENDPROC
9420:
9430DEFPROCref_x
9440LOCAL I%,J%
9450FOR I%=1 TO 8
9460 FOR J%=1 TO 8
9470 current_wave_i%(17-J%,I%)=current_wave_i%(J%,I%)
9480 NEXT J%
9490NEXT I%
9500PROCmessage("Invader Wave X Reflected")
9510PROCredisplay
9520ENDPROC
9530:
9540DEFPROCref_y
9550LOCAL I%,J%
9560FOR I%=1 TO 4
9570 FOR J%=1 TO 16
9580 current_wave_i%(J%,9-I%)=current_wave_i%(J%,I%)
9590 NEXT J%
9600NEXT I%
9610PROCmessage("Invader Wave Y Reflected")
9620PROCredisplay
9630ENDPROC
9640:
9650DEFPROCref_x_y
9660LOCAL I%,J%
9670FOR I%=1 TO 4
9680 FOR J%=1 TO 8
9690 current_wave_i%(17-J%,I%)=current_wave_i%(J%,I%)
9700 NEXT J%
9710 FOR J%=1 TO 16
9720 current_wave_i%(J%,9-I%)=current_wave_i%(J%,I%)
9730 NEXT J%
9740NEXT I%
9750PROCmessage("Invader Wave X and Y Reflected")
9760PROCredisplay
9770ENDPROC
9780:
9790DEFPROCset_rnd_seed
9800LOCAL dummy%, thru%
9810thru%=FALSE
9820COLOUR white%
9830REPEAT
9840 IF thru%=TRUE THEN PROCwrong_sound
9850 PROCclearmessage
9860 PRINT TAB(1,8);"Set Random Seed (";seed%;") = ";
9870 INPUT seed%
9880 thru%=TRUE
9890UNTIL seed%>0
9900dummy%=RND(-seed%)
9910thru%=FALSE
9920REPEAT
9930 IF thru%=TRUE THEN PROCwrong_sound
9940 PROCclearmessage
9950 PRINT TAB(1,8);"Set Random Spaces (";num_spaces%;") = ";
9960 INPUT num_spaces%
9970 thru%=TRUE
9980UNTIL num_spaces%>=0
9990PROCmessage("RND Seed Accepted")
10000ENDPROC
10010:
10020DEFPROCrnd_wave
10030LOCAL I%,J%,V%
10040FOR I%=1 TO 8
10050 FOR J%=1 TO 16
10060 current_wave_i%(J%,I%)=FNconvert(RND(12+num_spaces%))
10070 NEXT J%
10080NEXT I%
10090PROCmessage("Random Invader Wave Created")
10100PROCredisplay
10110ENDPROC
10120:
10130DEFFNconvert(value%)
10140IF value%>12 THEN value%=0
10150=value%
10160:
10170DEFFNunconvert(value%)
10180IF value%>0 THEN value%+=64 ELSE value%=32
10190=value%
10200:
10210DEFPROCrnd_x_wave
10220LOCAL I%,J%,V%
10230FOR I%=1 TO 8
10240 FOR J%=1 TO 8
10250 current_wave_i%(J%,I%)=FNconvert(RND(12+num_spaces%))
10260 current_wave_i%(17-J%,I%)=current_wave_i%(J%,I%)
10270 NEXT J%
10280NEXT I%
10290PROCmessage("Random X Reflected Invader Wave Created")
10300PROCredisplay
10310ENDPROC
10320:
10330DEFPROCrnd_y_wave
10340LOCAL I%,J%,V%
10350FOR I%=1 TO 4
10360 FOR J%=1 TO 16
10370 current_wave_i%(J%,I%)=FNconvert(RND(12+num_spaces%))
10380 current_wave_i%(J%,9-I%)=current_wave_i%(J%,I%)
10390 NEXT J%
10400NEXT I%
10410PROCmessage("Random Y Reflected Invader Wave Created")
10420PROCredisplay
10430ENDPROC
10440:
10450DEFPROCrnd_x_y_wave
10460LOCAL I%,J%,V%
10470FOR I%=1 TO 4
10480 FOR J%=1 TO 8
10490 current_wave_i%(J%,I%)=FNconvert(RND(12+num_spaces%))
10500 current_wave_i%(17-J%,I%)=current_wave_i%(J%,I%)
10510 NEXT J%
10520 FOR J%=1 TO 16
10530 current_wave_i%(J%,9-I%)=current_wave_i%(J%,I%)
10540 NEXT J%
10550NEXT I%
10560PROCmessage("Random X and Y Reflected Invader Wave Created")
10570PROCredisplay
10580ENDPROC
10590:
10600DEFPROCbomb_types
10610LOCAL value%, thru%
10620thru%=FALSE
10630COLOUR white%
10640REPEAT
10650 IF thru%=TRUE THEN PROCwrong_sound
10660 PROCclearmessage
10670 PRINT TAB(1,8);"Set Bomb Types (1=norm 2=diag 4=homing) = ";
10680 INPUT value%
10690 thru%=TRUE
10700UNTIL value%>=0 AND value%<=7
10710wave_attributes%(0)=value%
10720PROCshow_bomb_attributes
10730PROCmessage("New Bomb Types Accepted")
10740ENDPROC
10750:
10760DEFPROCmax_bombs
10770LOCAL value%, true%
10780thru%=FALSE
10790COLOUR white%
10800REPEAT
10810 IF thru%=TRUE THEN PROCwrong_sound
10820 PROCclearmessage
10830 PRINT TAB(1,8);"Max Invader Bombs At Any Time (1-16) = ";
10840 INPUT value%
10850 thru%=TRUE
10860UNTIL value%>=1 AND value%<=16
10870wave_attributes%(2)=value%
10880PROCshow_num_bombs
10890PROCmessage("Max Invader Bombs Accepted")
10900ENDPROC
10910:
10920DEFPROCmax_rockets
10930LOCAL value%, true%
10940thru%=FALSE
10950COLOUR white%
10960REPEAT
10970 IF thru%=TRUE THEN PROCwrong_sound
10980 PROCclearmessage
10990 PRINT TAB(1,8);"Max Player Rockets At Any Time (1-3) = ";
11000 INPUT value%
11010 thru%=TRUE
11020UNTIL value%>=1 AND value%<=3
11030PROCmessage("Max Player Rockets Accepted")
11040wave_attributes%(3)=value%
11050ENDPROC
11060:
11070DEFPROCinitial_dir
11080LOCAL value%, true%
11090thru%=FALSE
11100COLOUR white%
11110REPEAT
11120 IF thru%=TRUE THEN PROCwrong_sound
11130 PROCclearmessage
11140 PRINT TAB(1,8);"Wave Direction (0=RND 1=Left 2=Right) = ";
11150 INPUT value%
11160 thru%=TRUE
11170UNTIL value%>=0 AND value%<=2
11180PROCmessage("Wave Direction Accepted")
11190wave_attributes%(4)=value%
11200ENDPROC
11210:
11220DEFPROCheight
11230LOCAL value%, true%
11240thru%=FALSE
11250COLOUR white%
11260REPEAT
11270 IF thru%=TRUE THEN PROCwrong_sound
11280 PROCclearmessage
11290 PRINT TAB(1,8);"Wave Initial Height (1=Top...6=Bottom) = ";
11300 INPUT value%
11310 thru%=TRUE
11320UNTIL value%>=1 AND value%<=6
11330PROCshow_height(0)
11340wave_attributes%(1)=value%
11350PROCshow_height(1)
11360PROCmessage("Wave Initial Height Accepted")
11370ENDPROC
11380:
11390DEFPROCpassword
11400LOCAL valid%,I%,part$,in$
11410COLOUR white%
11420REPEAT
11430 valid%=FALSE
11440 PROCclearmessage
11450 PRINT TAB(1,8);"Wave Password (""";wavepassword$;""")";
11460 INPUT in$
11470 IF LEN(in$)>0 AND LEN(in$)<=10 THEN
11480 IF LEN(in$)<10 THEN
11490 in$+=STRING$(10-LEN(in$)," ")
11500 ENDIF
11510 valid%=TRUE
11520 FOR I%=1 TO 10
11530 part$=MID$(in$,I%,1)
11540 IF part$>="a" AND part$<="z" THEN
11550 part$=CHR$(ASC(part$)-32)
11560 ENDIF
11570 IF part$<>" " AND (part$<"A" OR part$>"Z") THEN valid%=FALSE
11580 NEXT I%
11590 ENDIF
11600 IF valid%=FALSE THEN PROCwrong_sound
11610UNTIL valid%
11620wavepassword$=""
11630FOR I%=1 TO 10
11640 part$=MID$(in$,I%,1)
11650 IF part$>="a" THEN part$=CHR$(ASC(part$)-32)
11660 wavepassword$+=part$
11670NEXT I%
11680PROCmessage("New Password Accepted")
11690ENDPROC
11700:
11710DEFFNget_col(X%,Y%)
11720LOCAL value%
11730value%=?(sprite_data%+offset%+((X%-1) DIV 2)+(Y%-1)*12)
11740IF X% MOD 2 = 0 THEN
11750 value%=value% DIV 16
11760ELSE
11770 value%=value% MOD 16
11780ENDIF
11790=value%
11800:
11810DEFPROCget_sprite(sprite%,left_X%,bot_Y%,right_X%,top_Y%)
11820MOVE left_X%,bot_Y%
11830MOVE right_X%,top_Y%
11840VDU 23,27,1,sprite%,0,0,0,0,0,0
11850ENDPROC
11860:
11870DEFPROCplot_sprite(sprite%,left_X%,bot_Y%)
11880VDU 23,27,0,sprite%,0,0,0,0,0,0
11890PLOT &ED,left_X%,bot_Y%
11900ENDPROC
11910:
11920DEFPROCshow_current_wave
11930PROCget_wave_info
11940PROCdisplay_wave
11950PROCshow_attributes
11960ENDPROC
11970:
11980DEFPROCget_wave_info
11990LOCAL offset%,I%,J%,K%,M%,width%,wave$,value%,reps%
12000PROCwave_offset(current_wave%)
12010wavepassword$=""
12020wave$=""
12030current_wave_i%()=0
12040FOR I%=0 TO 9
12050 wavepassword$+=CHR$(255-(?(wave_data%+offset%+I%)))
12060NEXT I%
12070width%=?(wave_data%+offset%+10)
12080IF width%>16 THEN width%=16
12090FOR I%=0 TO 4
12100 wave_attributes%(I%)=?(wave_data%+offset%+11+I%)
12110NEXT I%
12120CASE wave_attributes%(0) OF
12130 WHEN 0,1,2,3,4,5,6,7:REM ok
12140 OTHERWISE:wave_attributes%(0)=7
12150ENDCASE
12160CASE wave_attributes%(1) OF
12170 WHEN 1,2,3,4,5,6:REM ok
12180 OTHERWISE:wave_attributes%(1)=1
12190ENDCASE
12200CASE wave_attributes%(2) OF
12210 WHEN 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16:REM ok
12220 OTHERWISE:wave_attributes%(2)=10
12230ENDCASE
12240CASE wave_attributes%(3) OF
12250 WHEN 1,2,3:REM ok
12260 OTHERWISE:wave_attributes%(3)=3
12270ENDCASE
12280CASE wave_attributes%(4) OF
12290 WHEN 0,1,2:REM ok
12300 OTHERWISE:wave_attributes%(4)=1
12310ENDCASE
12320I%=0
12330value%=?(wave_data%+offset%+16+I%)
12340REPEAT
12350 wave$+=CHR$(value%)
12360 I%+=1
12370 value%=?(wave_data%+offset%+16+I%)
12380UNTIL I%>127 OR value%=0
12390K%=1:I%=1:J%=1
12400WHILE K%<=LEN(wave$)
12410 value%=ASC(MID$(wave$,K%,1))
12420 IF value%=ASC(" ") THEN
12430 I%+=1:IF I%>width% THEN I%=1:J%+=1
12440 K%+=1
12450 ELSE
12460 IF value%>=ASC("A") AND value%<=ASC("Z") THEN
12470 current_wave_i%(I%,J%)=value%-64
12480 I%+=1:IF I%>width% THEN I%=1:J%+=1
12490 K%+=1
12500 ELSE
12510 reps%=0
12520 WHILE value%>=ASC("0") AND value%<=ASC("9")
12530 reps%=reps%*10
12540 reps%+=value%-ASC("0")
12550 K%+=1
12560 value%=ASC(MID$(wave$,K%,1))
12570 ENDWHILE
12580 FOR M%=1 TO reps%
12590 IF value%>ASC(" ") THEN current_wave_i%(I%,J%)=value%-64
12600 I%+=1:IF I%>width% THEN I%=1:J%+=1
12610 NEXT M%
12620 K%+=1
12630 ENDIF
12640 ENDIF
12650ENDWHILE
12660ENDPROC
12670:
12680DEFPROCstore_current_wave
12690LOCAL offset%,I%,J%,width%,S%,F%,count%
12700PROCwave_offset(current_wave%)
12710FOR I%=0 TO 9
12720 ?(wave_data%+offset%+I%)=255-ASC(MID$(wavepassword$,I%+1,1))
12730NEXT I%
12740width%=0:S%=17:F%=0
12750FOR I%=1 TO 8
12760 FOR J%=1 TO 16
12770 IF current_wave_i%(J%,I%)<>0 THEN
12780 IF J%<S% THEN S%=J%
12790 IF J%>F% THEN F%=J%
12800 ENDIF
12810 NEXT J%
12820NEXT I%
12830IF S%=17 THEN S%=16
12840IF F%-S%+1>width% THEN width%=F%-S%+1
12850?(wave_data%+offset%+10)=width%
12860FOR I%=0 TO 4
12870 ?(wave_data%+offset%+11+I%)=wave_attributes%(I%)
12880NEXT I%
12890count%=0
12900FOR I%=1 TO 8
12910 FOR J%=S% TO F%
12920 ?(wave_data%+offset%+16+count%)=FNunconvert(current_wave_i%(J%,I%))
12930 count%+=1
12940 NEXT J%
12950NEXT I%
12960IF count%<127 THEN
12970 FOR I%=count% TO 127
12980 ?(wave_data%+offset%+16+count%)=0
12990 NEXT I%
13000ENDIF
13010ENDPROC
13020:
13030DEFPROCshow_attributes
13040PROCshow_bomb_attributes
13050PROCshow_height(1)
13060PROCshow_num_bombs
13070PROCshow_num_rockets
13080PROCshow_init_dir
13090PROCupdate_wave_box
13100ENDPROC
13110:
13120DEFPROCshow_bomb_attributes
13130LOCAL A%,V%,SSX%,SSY%
13140V%=wave_attributes%(0)
13150VDU 5
13160GCOL 0,black%
13170FOR A%=0 TO 2
13180 SSX%=18*4+16+18*16*4
13190 SSY%=WY%+20+A%*sprite_Y%+20
13200 GCOL 0,black%
13210 RECTANGLE FILL SSX%,SSY%,32,32
13220 MOVE SSX%+8,SSY%+28
13230 GCOL 0,red%
13240 IF (V% AND 2^A%)>0 THEN
13250 PRINT CHR$(91);
13260 ELSE
13270 PRINT CHR$(92);
13280 ENDIF
13290NEXT A%
13300VDU 4
13310OFF
13320ENDPROC
13330:
13340DEFPROCtoggle_bomb_type
13350LOCAL Y%,V%,W%
13360valid%=TRUE
13370V%=wave_attributes%(0)
13380Y%=(MY%-WY%-20)/sprite_Y%
13390IF Y%<0 THEN Y%=0
13400IF Y%>2 THEN Y%=2
13410W%=0
13420FOR A%=0 TO 2
13430 IF A%=Y% THEN
13440 IF (V% AND 2^A%)=0 THEN W%+=2^A%
13450 ELSE
13460 IF (V% AND 2^A%)>0 THEN W%+=2^A%
13470 ENDIF
13480NEXT A%
13490wave_attributes%(0)=W%
13500PROCshow_bomb_attributes
13510ENDPROC
13520:
13530DEFPROCshow_height(delete%)
13540LOCAL V%,SSX%,SSY%,A$
13550SSX%=1162
13560V%=wave_attributes%(1)
13570SSY%=468+(6-V%)*36
13580IF delete%=0 THEN
13590 GCOL 0,black%
13600 RECTANGLE FILL SSX%,SSY%,114,36
13610ELSE
13620 GCOL 0,red%
13630 RECTANGLE FILL SSX%,SSY%,114,36
13640 GCOL 0,white%
13650 VDU 5
13660 CASE V% OF
13670 WHEN 1: A$=" TOP"
13680 WHEN 2: A$=" HIGH" :SSX%+=8
13690 WHEN 3: A$="MIDDLE":SSX%+=8
13700 WHEN 4: A$="MIDDLE":SSX%+=8
13710 WHEN 5: A$=" LOW"
13720 WHEN 6: A$="BOTTOM":SSX%+=8
13730 ENDCASE
13740 MOVE SSX%,SSY%+32
13750 PRINT A$;
13760 VDU 4
13770 OFF
13780ENDIF
13790ENDPROC
13800:
13810DEFPROCget_wave_height
13820LOCAL Y%,V%
13830V%=wave_attributes%(1)
13840Y%=(MY%-468)/36
13850IF Y%<0 THEN Y%=0
13860IF Y%>5 THEN Y%=5
13870Y%=6-Y%
13880IF V%<>Y% THEN
13890 PROCshow_height(0)
13900 wave_attributes%(1)=Y%
13910 PROCshow_height(1)
13920ENDIF
13930valid%=TRUE
13940ENDPROC
13950:
13960DEFPROCshow_num_bombs
13970LOCAL V$
13980V$=STR$(wave_attributes%(2))
13990IF LEN(V$)=1 THEN V$="0"+V$
14000GCOL 0,black%
14010RECTANGLE FILL 1166+38,WY%-14+20,32,-32
14020GCOL 0,red%
14030VDU 5
14040MOVE 1166+38,WY%-14+24
14050PRINT V$;
14060VDU 4
14070OFF
14080ENDPROC
14090:
14100DEFPROCget_num_bombs
14110LOCAL X%,V%
14120V%=wave_attributes%(2)
14130X%=(MX%-1162)/57
14140IF X%=0 THEN
14150 IF V%>1 THEN V%-=1
14160ELSE
14170 IF V%<16 THEN V%+=1
14180ENDIF
14190wave_attributes%(2)=V%
14200PROCshow_num_bombs
14210valid%=TRUE
14220ENDPROC
14230:
14240DEFPROCshow_num_rockets
14250GCOL 0,black%
14260RECTANGLE FILL 1166+38+8,44,32,32
14270GCOL 0,red%
14280VDU 5
14290MOVE 1166+38+8,40+36
14300PRINT STR$(wave_attributes%(3));
14310VDU 4
14320OFF
14330ENDPROC
14340:
14350DEFPROCget_num_rockets
14360LOCAL X%,V%
14370V%=wave_attributes%(3)
14380X%=(MX%-1162)/57
14390IF X%=0 THEN
14400 IF V%>1 THEN V%-=1
14410ELSE
14420 IF V%<3 THEN V%+=1
14430ENDIF
14440wave_attributes%(3)=V%
14450PROCshow_num_rockets
14460valid%=TRUE
14470ENDPROC
14480:
14490DEFPROCshow_init_dir
14500LOCAL V%,D%
14510V%=wave_attributes%(4)
14520VDU 5
14530FOR D%=0 TO 2
14540 GCOL 0,black%
14550 RECTANGLE FILL 1000+D%*52,44,44,32
14560 GCOL 0,red%
14570 MOVE 1014+D%*52,40+36
14580 CASE D% OF
14590 WHEN 0: IF V%=1 THEN PRINT CHR$(91); ELSE PRINT CHR$(92);
14600 WHEN 1: IF V%=0 THEN PRINT CHR$(91); ELSE PRINT CHR$(92);
14610 WHEN 2: IF V%=2 THEN PRINT CHR$(91); ELSE PRINT CHR$(92);
14620 ENDCASE
14630NEXT D%
14640VDU 4
14650OFF
14660ENDPROC
14670:
14680DEFPROCget_init_dir
14690LOCAL X%,V%
14700V%=wave_attributes%(4)
14710X%=(MX%-1000)/52
14720CASE X% OF
14730 WHEN 0:V%=1
14740 WHEN 1:V%=0
14750 OTHERWISE:V%=2
14760ENDCASE
14770wave_attributes%(4)=V%
14780PROCshow_init_dir
14790valid%=TRUE
14800ENDPROC
14810:
14820DEFPROCcopy_to_number
14830LOCAL offset1%,offset2%,I%,from%,to%
14840from%=current_wave%
14850PROCto_which_wave_no
14860offset1%=2+(from%-1)*144
14870offset2%=2+(to%-1)*144
14880FOR I%=0 TO 143 STEP 4
14890 !(wave_data%+offset2%+I%)=!(wave_data%+offset1%+I%)
14900NEXT I%
14910valid%=TRUE
14920PROCmessage("Invader Wave Copied")
14930ENDPROC
14940:
14950DEFPROClogo
14960LOCAL Y%,SY%,mag%
14970mag%=44
14980SY%=48
14990Y%=SY%+680+8
15000GCOL 0,dark_grey%
15010COLOUR 128+dark_grey%
15020RECTANGLE FILL 112+16*mag%,Y%,460,1020-Y%
15030GCOL 0,white%
15040RECTANGLE 112+16*mag%,Y%,460,1020-Y%
15050GCOL 0,red%
15060PROCprint(16,16,"ALIEN INVASION",51.5,0.5)
15070PROCprint(32,16,"WAVE",57,2.5)
15080PROCprint(32,16,"EDITOR",53,4.5)
15090GCOL 0,cyan%
15100PROCprint(8,16,"By",52,7)
15110PROCprint(16,16,"Arc-World",55,7)
15120GCOL 0,white%
15130ENDPROC
15140:
15150DEFPROCprint(XS%,YS%,text$,X,Y)
15160VDU 5
15170MOVE X*16,1024-Y*32
15180VDU 23,17,7,6,XS%;YS%;0,0
15190PRINT text$;
15200VDU 23,17,7,6,8;8;0,0
15210VDU 4
15220OFF
15230ENDPROC
15240:
15250DEFPROCupdate_wave_box
15260LOCAL W$
15270VDU 5
15280GCOL 0,black%
15290RECTANGLE FILL 892,48,48,36
15300GCOL 0,red%
15310MOVE 892,48+32
15320W$=STR$(current_wave%)
15330IF LEN(W$)<3 THEN W$=STRING$(3-LEN(W$),"0")+W$
15340PRINT W$;
15350VDU 4
15360OFF
15370ENDPROC
15380:
15390DEFPROCget_new_wave
15400IF MX%<915 THEN
15410 IF current_wave%>1 THEN
15420 PROCstore_current_wave
15430 PROCshow_height(0)
15440 current_wave%-=1
15450 PROCupdate_wave_box
15460 PROCshow_current_wave
15470 PROCmessage("Now At The Required Wave Number")
15480 PROCinfo_line
15490 valid%=TRUE
15500 ENDIF
15510ELSE
15520 IF current_wave%<128 THEN
15530 PROCstore_current_wave
15540 PROCshow_height(0)
15550 current_wave%+=1
15560 PROCupdate_wave_box
15570 PROCshow_current_wave
15580 PROCmessage("Now At The Required Wave Number")
15590 PROCinfo_line
15600 valid%=TRUE
15610 ENDIF
15620ENDIF
15630ENDPROC
15640:
15650DEFPROCto_lower(A$)
15660LOCAL len%, M$
15670B$=""
15680len%=1
15690WHILE len%<=LEN(A$)
15700 M$=MID$(A$,len%,1)
15710 IF M$>="A" AND M$<="Z" THEN M$=CHR$(ASC(M$) + 32)
15720 B$=B$+M$
15730 len%+=1
15740ENDWHILE
15750ENDPROC
'� > <Invasion$Dir>.BasicProgs.WEdit
#� Program : Invader Wave Editor
(� Version : 1
2� Author : A.S.W.Nelson
<� Date : 19.12.89
F:
P8� � �:� "Unexpected Error: ";�;:�:� " at line: ";�:�
Z �init
d
�now_what
n&� "<Invasion$Dir>.BASICPROGS.Menu"
x:
�
��init
��define_variables
�� 12
�&�("CHANNELVOICE 1 WaveSynth-Beep")
�
�("SNEW")
��("POINTER 1")
��("fx 229 1")
�ȗ �
�ȗ ȓ 0,10,1280,1010
�ȗ � 640,512
��default_palette
��init_menus
��
�draw_screen
$�sprite_load(oldspritefilename$)
�wave_load(oldfilename$)
"�show_current_wave
,�
6/�message("Invader Waves Can Now Be Edited")
@�info_line
J�
T:
^��define_variables
h
� offset%
rblack%=0
|dark_grey%=1
�light_grey%=3
�
red%=4
�
orange%=5
�
yellow%=6
�bright_green%=8
�dark_green%=9
�cyan%=10
�dark_blue%=11
�dark_brown%=12
�light_brown%=13
�
white%=15
�magenta%=9
�WY%=32+3*12*4+8
current_sprite%=0
current_wave%=1
max_no_sprites%=122
&max_no_waves%=128
0num_spaces%=3
:
floodx%=�
D
floody%=�
Ncurrent_invader%=1
X'sprite_size%=48+max_no_sprites%*384
bsprite_X%=72
lsprite_Y%=68
vswap%=�
�defined_waves%=0
�unhighlight%=�
�free_edit%=0
�seed%=1024*16
�old_invader%=0
�"wave_size%=2+max_no_waves%*144
�to_wave%=0
�original%=�
�
num%=0
�6oldspritefilename$="<Invasion$Dir>.MISC.InvSprite"
�/oldfilename$="<Invasion$Dir>.MISC.WaveCopy"
� B$=""
�filename$=""
password$=""
wavepassword$=""
� sprite_data% sprite_size%
� wave_data% wave_size%
*� current_sprite_c%(16,16)
4� current_wave_i%(16,8)
>� wave_attributes%(4)
Hwave_attributes%()=0
Rcurrent_sprite_c%()=0
\current_wave_i%()=0
f� I%=1 � 128
p �wave_offset(I%)
z! wavepassword$="DUMMY WORD"
� � K%=0 � 9
�@ ?(wave_data%+offset%+K%)=255-�(�wavepassword$,K%+1,1))
� � K%
�* ?(wave_data%+offset%+10)=16:� width
�4 ?(wave_data%+offset%+11)=7 :� bomb attributes
�0 ?(wave_data%+offset%+12)=1 :� wave height
�. ?(wave_data%+offset%+13)=10:� num bombs
�0 ?(wave_data%+offset%+14)=3 :� num rockets
�- ?(wave_data%+offset%+15)=1 :� init dir
� � K%=16 � 143
�% ?(wave_data%+offset%+K%)=32
� � K%
�� I%
�
:
��default_palette
$� A%,B%(),C%
.� B%(3)
8�
B� 0,0,0
L� 128,128,128
V� 176,176,176
`� 208,208,208
j
� 240,0,0
t� 240,176,0
~� 240,224,0
�� 240,240,208
�
� 0,240,0
�� 0,176,96
�� 0,192,240
�
� 0,0,160
�� 160,112,96
�� 192,144,80
�� 240,208,176
�� 240,240,240
��DATA 0,0,0
��DATA 255,0,0
��DATA 0,255,0
�DATA 255,255,0
�DATA 0,0,255
�DATA 255,0,255
�DATA 0,255,255
(�DATA 255,255,255
2�DATA 190,130,0
<�DATA 255,120,50
F�DATA 128,128,128
P�DATA 0,0,128
Z�DATA 200,200,200
d�DATA 0,128,0
n�DATA 240,220,0
x�DATA 255,180,0
�� A%=0 � 15
� � C%=1 � 3
� � B%(C%)
� � C%
� � A%,B%(1),B%(2),B%(3)
�� A%
��
�:
���init_menus
�� total_menus%
�;� menu_length%(total_menus%),menu_origin%(total_menus%)
�max_menu_length%=0
�� A%=1 � total_menus%
� menu_length%(A%)
N � menu_length%(A%)>max_menu_length% � max_menu_length%=menu_length%(A%)
� A%
"� A%=1 � total_menus%
, � menu_origin%(A%)
6� A%
@*� menu$(total_menus%,max_menu_length%)
J� A%=1 � total_menus%
T � B%=1 � menu_length%(A%)
^ � menu$(A%,B%)
h � B%
r� A%
|current_menu%=1
�menu_position=0
�� 9
�� 6, 8, 7, 4, 8, 3, 3, 4, 5
�� 0, 1, 1, 1, 1, 2, 2, 2, 2
�_� Wave Editor Menu, Edit Wave, Edit Wave Attributes, File Options, Select Wave, Exit Editor
�d� Edit Wave Menu, Clear, Flip Menu, Flood Menu, Reflect Menu, Shift Menu, Swap, Undo All Changes
�� Wave Attributes Menu, Bomb Types, Max Invader Bombs, Max Player Rockets, Initial Direction, Initial Wave Height, Password
�=� File Options Menu, Load Sprites, Load Waves, Save Waves
֗� Select Wave Menu, Copy To Wave Number,To Wave Number, Set Random Attribute, Random Wave, Random X Reflect, Random Y Reflect, Random X & Y Reflect
�!� Flip Wave Menu, Row, Column
�� Flood Menu, Row, Column
�0� Reflect Menu, X Axis, Y Axis, X And Y Axis
�'� Shift Menu, Left, Right, Up, Down
�
:
��draw_screen
&� D%
0�show_menu(current_menu%,0)
: �logo
D� 0,dark_blue%
Nȓ Ȑ 0,0,1280,36
Xȓ Ȑ 0,738,4+18*44,36
b$� 0,white%:� show initial height
lȓ 1160,464,118,266
v� 0,dark_grey%
�ȓ Ȑ 1162,692,114,32
�ȓ Ȑ 1160,410,118,40
�ȓ Ȑ 1162,92,114,40
�ȓ Ȑ 998,92+44,152,40
�� 0,white%
�� 5
�� 1172,720
�� "HEIGHT";
�� 1180,442
�� "BOMBS";
�� 4
��
�� 1160,688,1279,688
� show bomb title
ȓ 1160,410,118,40
� show num bombs box
ȓ 1160,WY%-56+20,118,56
*D%=WY%-14+20
4� 5
>
� 1166,D%
H� �(93);
R� 1166+16,D%
\� �(95);
f� 1279-22,D%
p� �(94);
z� 1279-22-16,D%
�� �(95);
�� 4
��
�"� show max no. players rockets
�ȓ 1160,92,118,40
�ȓ 1160,40,118,52
�� 5
�� 1164,124
�� "ROCKETS";
�
� 1166,80
�� �(93);
�� 1166+16,80
�� �(95);
� 1279-22,80
� �(94);
� 1279-22-16,80
$� �(95);
.� show initial dir
8ȓ 998,92+44,152,40
B� D%=0 � 2
L ȓ 998+D%*50,40,52,96
V� D%
`� 998,40+48,1150,40+48
j� 1002,92+76
t� "DIRECTION";
~� 1014,40+86
�� �(93);
�� 1066,40+86
�
� "?";
�� 1066+52,40+86
�� �(94);
�� show which wave
�� 0,dark_grey%
�ȓ Ȑ 840,92,150,40
�� 0,white%
�ȓ 840,92,118+32,40
�ȓ 840,40,118+32,52
�� 5
� 884,124
� "WAVE";
� 846,80
� �(93);
(� 846+16,80
2� �(95);
<� 958+32-22,80
F� �(94);
P� 958+32-22-16,80
Z� �(95);
d� 4
n�
x�
�:
���show_invader(X%,Y%)
�D�plot_sprite(current_wave_i%(X%,Y%),(X%-1)*18*4,WY%+(8-Y%)*17*4)
��
�:
���now_what
�� exit%,MX%,MY%,MB%,valid%
�exit%=�
��
�� 4
�!�0,0)wavepassword$,password$
�
� valid%=�
�mouse
: � MY%>776 � MX%<16*4+32+16*44 � �check_menu_options
L � �is_mouse_in_box(MX%,MY%,0,WY%,8+16*18*4,16+8*16*4) � �invader_grid
"Q � �is_mouse_in_box(MX%,MY%,0,40,sprite_X%*6,sprite_Y%*2) � �select_invader
,@ � �is_mouse_in_box(MX%,MY%,840,40,150,48) � �get_new_wave
6b � �is_mouse_in_box(MX%,MY%,8+18*16*4,WY%+20,1278-8-18*16*4,sprite_Y%*3) � �toggle_bomb_type
@G � �is_mouse_in_box(MX%,MY%,1162,468,114,36*6) � �get_wave_height
JI � �is_mouse_in_box(MX%,MY%,1162,WY%-56+20,114,56) � �get_num_bombs
TD � �is_mouse_in_box(MX%,MY%,1162,40,114,52) � �get_num_rockets
^A � �is_mouse_in_box(MX%,MY%,1000,40,150,48) � �get_init_dir
h � � valid% � �wrong_sound
r� exit%
|�
�:
���mouse
�*FX21,9
��
� ȗ MX%,MY%,MB%
� �delay(.15)
�� MB%>0
��
�:
���delay(seconds)
��=0
��
�� �>seconds*100
�
:
��wrong_sound
&� I%
0� I%=11 � 90 � 2
: � 1,-14,I%,3
D � 1,-14,I%-10,3
N� I%
X�
b:
l��invader_grid
v#� X%,Y%,offset%,inv%,action$,A%
�X%=1+�(MX%/(18*4))
�Y%=8-�((MY%-WY%)/sprite_Y%)
�� Y%<1 � Y%=1
�� Y%>8 � Y%=8
�� X%>16 � X%=16
�� X%<1 � X%=1
�action$=" "
�Ȏ MB% �
�5 � 4: inv%=current_invader%: action$="Added To"
�( � 1: inv%=0: action$="Wiped From"
� : � ignore
��
�� action$<>" " �
� floodx%=� � floody%=� �
. �message("Invader "+action$+" Wave")
% current_wave_i%(X%,Y%)=inv%
�show_invader(X%,Y%)
* �
4 � floodx%=� �
>5 �message("Invader Row "+action$+" Wave")
H � A%=1 � 16
R+ current_wave_i%(A%,Y%)=inv%
\$ �show_invader(A%,Y%)
f � A%
p �
z8 �message("Invader Column "+action$+" Wave")
� � A%=1 � 8
�+ current_wave_i%(X%,A%)=inv%
�$ �show_invader(X%,A%)
� � A%
� �
� �
�
�usual
��
��
�:
���shift_right
�� I%,J%
�� J%=1 � 8
3 current_wave_i%(0,J%)=current_wave_i%(16,J%)
� J%
� I%=15 � 0 � - 1
$ � J%=1 � 8
.9 current_wave_i%(I%+1,J%)=current_wave_i%(I%,J%)
8 � J%
B� I%
L*�message("Invader Wave Shifted Right")
V�redisplay
`�
j:
t��shift_left
~� I%,J%
�� I%=1 � 16
� � J%=1 � 8
�9 current_wave_i%(I%-1,J%)=current_wave_i%(I%,J%)
� � J%
�� I%
�� J%=1 � 8
�3 current_wave_i%(16,J%)=current_wave_i%(0,J%)
�� J%
�)�message("Invader Wave Shifted Left")
��redisplay
��
�:
��redisplay
�display_wave
�usual
�
(:
2��shift_up
<� I%,J%
F� I%=1 � 8
P � J%=1 � 16
Z: current_wave_i%(J%,I%-1)=current_wave_i%(J%,I%)
d � J%
n� I%
x� J%=1 � 16
�2 current_wave_i%(J%,8)=current_wave_i%(J%,0)
�� J%
�'�message("Invader Wave Shifted Up")
��redisplay
��
�:
���shift_down
�� I%,J%
�� J%=1 � 16
�2 current_wave_i%(J%,0)=current_wave_i%(J%,8)
�� J%
�� I%=7 � 0 � - 1
� � J%=1 � 16
9 current_wave_i%(J%,I%+1)=current_wave_i%(J%,I%)
� J%
� I%
")�message("Invader Wave Shifted Down")
,�redisplay
6�
@:
J��flipy
T� I%,J%
^� I%=1 � 4
h � J%=1 � 16
r> Ȕ current_wave_i%(J%,I%),current_wave_i%(J%,8-I%+1)
| � J%
�� I%
�&�message("Invader Wave Y Flipped")
��redisplay
��
�:
���flipx
�� I%,J%
�� I%=1 � 8
� � J%=1 � 8
�? Ȕ current_wave_i%(I%,J%),current_wave_i%(16-I%+1,J%)
� � J%
�� I%
�&�message("Invader Wave X Flipped")
�redisplay
�
:
&��clear
0current_wave_i%()=0
:�redisplay
D(�message("Invader Wave Now Cleared")
N�
X:
b
��copy
l$� offset1%,offset2%,I%,from%,to%
vfrom%=current_wave%
��to_which_wave_no
��wave_offset(from%)
�offset1%=offset%
��wave_offset(to%)
�offset2%=offset%
�� I%=0 � 143 � 4
�: !(wave_data%+offset2%+I%)=!(wave_data%+offset1%+I%)
�� I%
�valid%=�
�#�message("Invader Wave Copied")
��
�:
�
��exit
exit%=�
�
ȗ �
� 9
*�
4unhighlight%=�
>valid%=�
H�("fx 229 0")
R�
\:
f��sprite_load(filename$)
p?� file%,offset%,E%,F%,dummy%,T%,byte%,loadaddr,filelen,B%()
z� �
�� B%(3)
�
num%=0
�%�ON ERROR LOCAL PROCerror:ENDPROC
�1�message("Please Wait...Loading Sprite File")
�%�ON ERROR LOCAL PROCerror:ENDPROC
�2ș "OS_File",5,filename$ � ,,loadaddr,,filelen
�� (loadaddr>>>20)=&FFF �
�% loadaddr=&FFF � (loadaddr>>>8)
��
� loadaddr = -1
��
�� loadaddr=&333 �
� offset%=num%*1536
� num%>0 �
� A%=0 � 47 � 4
6 !(palette%+A%)=!(sprite_data%+offset%+A%)
$ � A%
. �
8! temp%=sprite_data%+offset%
B( �ON ERROR LOCAL PROCerror:ENDPROC
L' �("LOAD "+filename$+" "+�~temp%)
V � num%>0 �
` � A%=0 � 47 � 4
j6 !(sprite_data%+offset%+A%)=!(palette%+A%)
t � A%
~ �
� � A%=0 � 15
� � C%=1 � 3
�0 B%(C%)=?(sprite_data%+A%*3+C%-1)
� � C%
�# � A%,B%(1),B%(2),B%(3)
� � A%
� �
� �draw_invaders
�B �plot_sprite(current_invader%,8+6*sprite_X%,40+sprite_Y%/2)
�# oldspritefilename$=filename$
� �info_line
�% �message("Sprite File Loaded")
�
6 �message("File Specified Is Not A Sprite File")
�
valid%=�
(�
2:
<��wave_load(filename$)
FE� file%,offset%,E%,F%,dummy%,T%,byte%,loadaddr,filelen,B%(),temp%
P� �
Z� B%(3)
d
num%=0
n%�ON ERROR LOCAL PROCerror:ENDPROC
x/�message("Please Wait...Loading Wave File")
�%�ON ERROR LOCAL PROCerror:ENDPROC
�2ș "OS_File",5,filename$ � ,,loadaddr,,filelen
�� (loadaddr>>>20)=&FFF �
�% loadaddr=&FFF � (loadaddr>>>8)
��
� loadaddr = -1
��
�� loadaddr=&334 �
� offset%=num%*144
� � num%>0 �
�8 � preserve 2 bytes that would get written over
� �
� temp%=wave_data%+offset%
( �ON ERROR LOCAL PROCerror:ENDPROC
' �("LOAD "+filename$+" "+�~temp%)
� num%>0 �
"/ � reset 2 bytes that were overwritten
, �
6 oldfilename$=filename$
@ �info_line
J# �message("Wave File Loaded")
T�
^4 �message("File Specified Is Not A Wave File")
h�
r"defined_waves%=?(wave_data%+1)
|free_edit%=?wave_data%
��show_current_wave
�original%=�
�oldfilename$=filename$
��info_line
�valid%=�
��
�:
���wave_save(filename$)
�&� L%,offset%,E%,file%,M%,A%,B%,to%
��store_current_wave
��to_which_wave_no
�?(wave_data%+1)=to%
�num%=to%
%�ON ERROR LOCAL PROCerror:ENDPROC
.�message("Please Wait...Saving Wave File")
temp%=2+(num%+1)*144
&%�ON ERROR LOCAL PROCerror:ENDPROC
05�("SAVE "+filename$+" "+�~wave_data%+"+"+�~temp%)
:"�("SETTYPE "+filename$+" 334")
Dvalid%=�
Noriginal%=�
X"defined_waves%=?(wave_data%+1)
b�info_line
l�message("Wave File Saved")
v�
�:
���display_sprite
�� I%,J%
�� I%=1 � 16
� � J%=1 � 16
�# �display_point(I%-1,J%-1)
� � J%
�� I%
��
�:
���display_point(X%,Y%)
�$� 0,current_sprite_c%(X%+1,Y%+1)
�Y%=15-Y%
3ȓ Ȑ SX%+2+X%*mag%,SY%+4+Y%*mag%,mag%-2,mag%-4
Ȓ AX%+2+X%*4,AY%+4+Y%*4
Ȓ AX%+4+X%*4,AY%+4+Y%*4
�
*:
4��show_current_sprite
>�get_sprite_info
H�display_sprite
R�
\:
f��get_sprite_info
p� offset%,I%,J%
z!�calc_offset(current_sprite%)
�� J%=1 � 16
� � I%=1 � 16
�3 current_sprite_c%(I%,J%)=�get_col(I%,J%)
� � I%
�� J%
��
�:
���to_which_wave_no
�� thru%
�thru%=�
�� white%
��
� � thru%=� � �wrong_sound
�clearmessage
$ � �1,8);"To Which Wave ==> ";
� to%
$ thru%=�
.!� to%>=1 � to%<=max_no_waves%
8�
B:
L��get_filename
V� thru%
`thru%=�
j� white%
t�
~ � thru%=� � �wrong_sound
� �clearmessage
� � �1,8);"Filename=";
� � filename$
� thru%=�
�&� �(filename$)>0 � �(filename$)<11
��
�:
���calc_offset(value%)
�offset%=48+value%*384
��
�:
���wave_offset(value%)
offset%=2+(value%-1)*144
�
:
��clearmessage
(� L%
2L%=4+18*44
<� 0,magenta%
Fȓ Ȑ 0,738,L%,36
P� 128+magenta%
Z�
d:
n��message(M$)
x� L%
�L%=4+18*44
�� 0,dark_blue%
�ȓ Ȑ 0,738,L%,36
�� 0,white%
�� 5
�� (L%-�(M$)*16)/2,766
� � M$;
�� 4
��
��
�:
���info_line
�� S1$,S2$,SUB%
S1$=oldfilename$
S2$=oldspritefilename$
&� 128+dark_blue%:� background blue
"� white%
,�
6� �1,31);�78," ");
@SUB%=�oldfilename$,".")
J
ȕ SUB%>0
T> oldfilename$=�oldfilename$,SUB%+1,�(oldfilename$)-SUB%)
^ SUB%=�oldfilename$,".")
h�
r,� �1,31);"File: """;oldfilename$;""" (";
|� original% �
� � "Original";
��
� � "Modified";
��
�4� ")";�33,31);"Current Wave: ";�(current_wave%);
�!SUB%=�oldspritefilename$,".")
�
ȕ SUB%>0
�P oldspritefilename$=�oldspritefilename$,SUB%+1,�(oldspritefilename$)-SUB%)
�$ SUB%=�oldspritefilename$,".")
��
�8� �54,31);"Sprite File: """;oldspritefilename$;"""";
�oldfilename$=S1$
�oldspritefilename$=S2$
�
:
.ݤis_mouse_in_box(MX%,MY%,X1%,Y1%,XD%,YD%)
&2=MX%>X1% � MX%<X1%+XD% � MY%>Y1% � MY%<Y1%+YD%
0:
:��show_menu(N%,highlight%)
D� A%,L%
N� 0,black%
Xȓ Ȑ 0,800,800,216
b L%=22
l� white%
v� 0,white%
�� 128+red%
�� �0,0);�22," ");
�� 5
� � (L%-�(menu$(N%,1)))*8,1023
�� menu$(N%,1);
�� 4
��
�� A%=2 � menu_length%(N%)
� � highlight%=A% �
� � 128+magenta%
� �
� � 128+dark_blue%
� �
� �L%,A%-2);�28," ");
� 5
4 � 22*16+(27-�(menu$(N%,A%)))*8,1023-(A%-2)*32
� menu$(N%,A%);
*
� 4
4 �
>� A%
H�
R:
\��select_invader
f� SSX%,SSY%
pSSX%=�(MX%/sprite_X%)+1
zSSY%=�((MY%-40)/sprite_Y%)
�!old_invader%=current_invader%
� current_invader%=SSX%+SSY%*6
�?�plot_sprite(current_invader%,8+6*sprite_X%,40+sprite_Y%/2)
�2� swap% � �do_swap(old_invader%):�display_wave
�valid%=�
��info_line
��
�:
���usual
�valid%=�
�original%=�
��info_line
��
:
��check_menu_options
� expected_option%
$� MX%<22*16 �
.# � check go back to last menu
8 � MY%>1023-32 �
B3 current_menu%=menu_origin%(current_menu%)
L � current_menu%=0 �
VK �message("Invader Wave Editor By Adrian S.W.Nelson Version 1")
` current_menu%=1
j �
t( �show_menu(current_menu%,0)
~ �
� floodx%=�
� floody%=�
� valid%=�
� unhighlight%=�
� �
��
� � get menu option
�' expected_option%=1+(1023-MY%)/32
�: � expected_option%<=menu_length%(current_menu%)-1 �
� valid%=�
� Ȏ current_menu% �
�( � 1: � expected_option%=5 �
�exit
�
8 current_menu%=expected_option%+1
3 �show_menu(current_menu%,0)
( �
2' � 2: Ȏ expected_option% �
<J � 1: �show_menu(current_menu%,expected_option%+1)
F' �clear
PJ � 6: �show_menu(current_menu%,expected_option%+1)
Z& �swap
dJ � 7: �show_menu(current_menu%,expected_option%+1)
n* �undo_all
x< : current_menu%=expected_option%+4
� �
�> � 3: �show_menu(current_menu%,expected_option%+1)
�j � expected_option% �bomb_types,�max_bombs,�max_rockets,�initial_dir,�height,�password
�> � 4: �show_menu(current_menu%,expected_option%+1)
�J � expected_option% �load_sprite,�load_file,�save_file
�> � 5: �show_menu(current_menu%,expected_option%+1)
�� � expected_option% �copy_to_number,�to_number,�set_rnd_seed,�rnd_wave,�rnd_x_wave,�rnd_y_wave,�rnd_x_y_wave
�> � 6: �show_menu(current_menu%,expected_option%+1)
�5 � expected_option% �flipx,�flipy
�> � 7: �show_menu(current_menu%,expected_option%+1)
�7 � expected_option% �floodx,�floody
�> � 8: �show_menu(current_menu%,expected_option%+1)
�> � expected_option% �ref_x,�ref_y,�ref_x_y
> � 9: �show_menu(current_menu%,expected_option%+1)
V � expected_option% �shift_left,�shift_right,�shift_up,�shift_down
�
"6 � unhighlight% � �show_menu(current_menu%,0)
, �
6�
@�
J:
T
��swap
^;�message("Change Invader In Wave With Next Chosen One")
hswap%=�
rvalid%=�
|�
�:
���do_swap(oldinvader%)
�� X%,Y%
�� X%=1 � 16
� � Y%=1 � 8
�X � current_wave_i%(X%,Y%)=oldinvader% � current_wave_i%(X%,Y%)=current_invader%
� � Y%
�� X%
��redisplay
�<�message("New Invader Changed With Old Invader In Wave")
�swap%=�
��
�:
��floodx
floodx%=�
floody%=�
&valid%=�
0unhighlight%=�
:�
D:
N��floody
X
floody%=�
b
floodx%=�
lvalid%=�
vunhighlight%=�
��
�:
���to_number
�� to_wave%
��to_which_wave_no
��store_current_wave
��show_height(0)
�current_wave%=to%
��update_wave_box
��show_current_wave
�valid%=�
�/�message("Now At The Required Wave Number")
��info_line
!�
!:
!��load_file
! �get_filename
!*/filename$="<Invasion$Dir>.WAVES."+filename$
!4�wave_load(filename$)
!>�
!H:
!R��save_file
!\�get_filename
!f�to_lower(filename$)
!p/filename$="<Invasion$Dir>.WAVES."+filename$
!z�wave_save(filename$)
!��
!�:
!���load_sprite
!��get_filename
!�1filename$="<Invasion$Dir>.SPRITES."+filename$
!��sprite_load(filename$)
!��
!�:
!���undo_all
!��show_current_wave
!�valid%=�
!��info_line
!��
":
"��draw_invaders
"� A%,I%
"$� A%=1 � 15
". Ȏ A% �
"8 � 1:I%=25
"B � 2:I%=17
"L � 3:I%=21
"V � 4:I%=85-28
"` � 5:I%=89-28
"j � 6:I%=93-28
"t � 7:I%=73-28
"~ � 8:I%=77-28
"� � 9:I%=97-28
"� � 10:I%=81-28
"� � 11:I%=109-28
"� � 12:I%=101-28
"� � 13:I%=14
"� � 14:I%=15
"� � 15:I%=0
"� �
"� �show_full_size(I%,A%-1)
"�� A%
"��
"�:
# #��show_full_size(snumber%,pos%)
#
� SSX%,SSY%
#
Ȏ � �
#, � pos%<12:SSX%=0+(pos% � 6)*sprite_X%
#(0 SSY%=40+(pos% � 6)*sprite_Y%
#2 � pos%<15:SSX%=8+18*16*4
#<3 SSY%=WY%+(pos%-12)*sprite_Y%+20
#F � 0,white%
#P> ȓ SSX%+18*4,SSY%,1279-SSX%-18*4,sprite_Y%
#Z�
#d� 0,black%
#n/ȓ Ȑ SSX%+2,SSY%+4,sprite_X%-4,sprite_Y%-8
#x� 0,white%
#�$ȓ SSX%,SSY%,sprite_X%,sprite_Y%
#�J� snumber%=25 � �get_sprite(0,SSX%,SSY%,SSX%+sprite_X%,SSY%+sprite_Y%)
#��calc_offset(snumber%)
#�� J%=1 � 16
#� � I%=1 � 16
#� � 0,�get_col(I%,J%)
#�& Ȓ SSX%+I%*4,SSY%+(17-J%)*4
#�( Ȓ SSX%+I%*4+2,SSY%+(17-J%)*4
#� � I%
#�� J%
#�G� pos%<12 � �get_sprite(A%,SSX%,SSY%,SSX%+sprite_X%,SSY%+sprite_Y%)
#��
#�:
$��error
$Ȏ (� � 256) �
$A � 152,153 :�message("Disc Needs Compacting...Please Wait")
$"! �("COMPACT")
$,3 � 198 :�message("This Disc Is Already Full")
$66 � 201 :�message("This Disc Is Write Protected")
$@= � 211 :�message("Please Insert A Disc Into The Drive")
$J2 � 214 :�message("That File Does Not Exist")
$T3 :�message("Error: "+�(�)+" at Line: "+�(�))
$^�
$h�
$r:
$|��display_wave
$�� I%,J%
$�� I%=1 � 8
$� � J%=1 � 16
$�J �plot_sprite(current_wave_i%(J%,I%),(J%-1)*18*4,WY%+(8-I%)*17*4)
$� � J%
$�� I%
$��
$�:
$���ref_x
$�� I%,J%
$�� I%=1 � 8
$� � J%=1 � 8
$�: current_wave_i%(17-J%,I%)=current_wave_i%(J%,I%)
% � J%
%� I%
%(�message("Invader Wave X Reflected")
%&�redisplay
%0�
%::
%D��ref_y
%N� I%,J%
%X� I%=1 � 4
%b � J%=1 � 16
%l9 current_wave_i%(J%,9-I%)=current_wave_i%(J%,I%)
%v � J%
%�� I%
%�(�message("Invader Wave Y Reflected")
%��redisplay
%��
%�:
%�
��ref_x_y
%�� I%,J%
%�� I%=1 � 4
%� � J%=1 � 8
%�: current_wave_i%(17-J%,I%)=current_wave_i%(J%,I%)
%� � J%
%� � J%=1 � 16
%�9 current_wave_i%(J%,9-I%)=current_wave_i%(J%,I%)
& � J%
&� I%
&.�message("Invader Wave X and Y Reflected")
& �redisplay
&*�
&4:
&>��set_rnd_seed
&H� dummy%, thru%
&Rthru%=�
&\� white%
&f�
&p � thru%=� � �wrong_sound
&z �clearmessage
&�0 � �1,8);"Set Random Seed (";seed%;") = ";
&� � seed%
&� thru%=�
&�
� seed%>0
&�dummy%=�(-seed%)
&�thru%=�
&��
&� � thru%=� � �wrong_sound
&� �clearmessage
&�8 � �1,8);"Set Random Spaces (";num_spaces%;") = ";
&� � num_spaces%
&� thru%=�
&�� num_spaces%>=0
'!�message("RND Seed Accepted")
'�
':
'$��rnd_wave
'.� I%,J%,V%
'8� I%=1 � 8
'B � J%=1 � 16
'L< current_wave_i%(J%,I%)=�convert(�(12+num_spaces%))
'V � J%
'`� I%
'j+�message("Random Invader Wave Created")
't�redisplay
'~�
'�:
'�ݤconvert(value%)
'�� value%>12 � value%=0
'�=value%
'�:
'�ݤunconvert(value%)
'�'� value%>0 � value%+=64 � value%=32
'�=value%
'�:
'���rnd_x_wave
'�� I%,J%,V%
'�� I%=1 � 8
( � J%=1 � 8
(
< current_wave_i%(J%,I%)=�convert(�(12+num_spaces%))
(: current_wave_i%(17-J%,I%)=current_wave_i%(J%,I%)
( � J%
((� I%
(27�message("Random X Reflected Invader Wave Created")
(<�redisplay
(F�
(P:
(Z��rnd_y_wave
(d� I%,J%,V%
(n� I%=1 � 4
(x � J%=1 � 16
(�< current_wave_i%(J%,I%)=�convert(�(12+num_spaces%))
(�9 current_wave_i%(J%,9-I%)=current_wave_i%(J%,I%)
(� � J%
(�� I%
(�7�message("Random Y Reflected Invader Wave Created")
(��redisplay
(��
(�:
(���rnd_x_y_wave
(�� I%,J%,V%
(�� I%=1 � 4
(� � J%=1 � 8
(�< current_wave_i%(J%,I%)=�convert(�(12+num_spaces%))
): current_wave_i%(17-J%,I%)=current_wave_i%(J%,I%)
) � J%
) � J%=1 � 16
)"9 current_wave_i%(J%,9-I%)=current_wave_i%(J%,I%)
), � J%
)6� I%
)@=�message("Random X and Y Reflected Invader Wave Created")
)J�redisplay
)T�
)^:
)h��bomb_types
)r� value%, thru%
)|thru%=�
)�� white%
)��
)� � thru%=� � �wrong_sound
)� �clearmessage
)�< � �1,8);"Set Bomb Types (1=norm 2=diag 4=homing) = ";
)� � value%
)� thru%=�
)�� value%>=0 � value%<=7
)�wave_attributes%(0)=value%
)��show_bomb_attributes
)�'�message("New Bomb Types Accepted")
)��
)�:
*��max_bombs
*� value%, true%
*thru%=�
*&� white%
*0�
*: � thru%=� � �wrong_sound
*D �clearmessage
*N9 � �1,8);"Max Invader Bombs At Any Time (1-16) = ";
*X � value%
*b thru%=�
*l� value%>=1 � value%<=16
*vwave_attributes%(2)=value%
*��show_num_bombs
*�*�message("Max Invader Bombs Accepted")
*��
*�:
*���max_rockets
*�� value%, true%
*�thru%=�
*�� white%
*��
*� � thru%=� � �wrong_sound
*� �clearmessage
*�9 � �1,8);"Max Player Rockets At Any Time (1-3) = ";
*� � value%
+ thru%=�
+� value%>=1 � value%<=3
++�message("Max Player Rockets Accepted")
+ wave_attributes%(3)=value%
+*�
+4:
+>��initial_dir
+H� value%, true%
+Rthru%=�
+\� white%
+f�
+p � thru%=� � �wrong_sound
+z �clearmessage
+�: � �1,8);"Wave Direction (0=RND 1=Left 2=Right) = ";
+� � value%
+� thru%=�
+�� value%>=0 � value%<=2
+�'�message("Wave Direction Accepted")
+�wave_attributes%(4)=value%
+��
+�:
+���height
+�� value%, true%
+�thru%=�
+�� white%
+��
, � thru%=� � �wrong_sound
, �clearmessage
,; � �1,8);"Wave Initial Height (1=Top...6=Bottom) = ";
,$ � value%
,. thru%=�
,8� value%>=1 � value%<=6
,B�show_height(0)
,Lwave_attributes%(1)=value%
,V�show_height(1)
,`,�message("Wave Initial Height Accepted")
,j�
,t:
,~��password
,�� valid%,I%,part$,in$
,�� white%
,��
,� valid%=�
,� �clearmessage
,�7 � �1,8);"Wave Password (""";wavepassword$;""")";
,� � in$
,� � �(in$)>0 � �(in$)<=10 �
,� � �(in$)<10 �
,�! in$+=�10-�(in$)," ")
,� �
,� valid%=�
- � I%=1 � 10
-
part$=�in$,I%,1)
-( � part$>="a" � part$<="z" �
-$ part$=�(�(part$)-32)
-( �
-2> � part$<>" " � (part$<"A" � part$>"Z") � valid%=�
-< � I%
-F �
-P � valid%=� � �wrong_sound
-Z� valid%
-dwavepassword$=""
-n� I%=1 � 10
-x part$=�in$,I%,1)
-�* � part$>="a" � part$=�(�(part$)-32)
-� wavepassword$+=part$
-�� I%
-�%�message("New Password Accepted")
-��
-�:
-�ݤget_col(X%,Y%)
-�� value%
-�9value%=?(sprite_data%+offset%+((X%-1) � 2)+(Y%-1)*12)
-�� X% � 2 = 0 �
-� value%=value% � 16
-��
-� value%=value% � 16
.�
.=value%
.:
."8��get_sprite(sprite%,left_X%,bot_Y%,right_X%,top_Y%)
.,� left_X%,bot_Y%
.6� right_X%,top_Y%
.@!� 23,27,1,sprite%,0,0,0,0,0,0
.J�
.T:
.^)��plot_sprite(sprite%,left_X%,bot_Y%)
.h!� 23,27,0,sprite%,0,0,0,0,0,0
.r� &ED,left_X%,bot_Y%
.|�
.�:
.���show_current_wave
.��get_wave_info
.��display_wave
.��show_attributes
.��
.�:
.���get_wave_info
.�3� offset%,I%,J%,K%,M%,width%,wave$,value%,reps%
.��wave_offset(current_wave%)
.�wavepassword$=""
.�wave$=""
.�current_wave_i%()=0
/� I%=0 � 9
/7 wavepassword$+=�(255-(?(wave_data%+offset%+I%)))
/� I%
/&#width%=?(wave_data%+offset%+10)
/0� width%>16 � width%=16
/:� I%=0 � 4
/D7 wave_attributes%(I%)=?(wave_data%+offset%+11+I%)
/N� I%
/XȎ wave_attributes%(0) �
/b � 0,1,2,3,4,5,6,7:� ok
/l :wave_attributes%(0)=7
/v�
/�Ȏ wave_attributes%(1) �
/� � 1,2,3,4,5,6:� ok
/� :wave_attributes%(1)=1
/��
/�Ȏ wave_attributes%(2) �
/�4 � 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16:� ok
/� :wave_attributes%(2)=10
/��
/�Ȏ wave_attributes%(3) �
/� � 1,2,3:� ok
/� :wave_attributes%(3)=3
/��
/�Ȏ wave_attributes%(4) �
0 � 0,1,2:� ok
0 :wave_attributes%(4)=1
0�
0 I%=0
0*&value%=?(wave_data%+offset%+16+I%)
04�
0> wave$+=�(value%)
0H I%+=1
0R) value%=?(wave_data%+offset%+16+I%)
0\� I%>127 � value%=0
0fK%=1:I%=1:J%=1
0pȕ K%<=�(wave$)
0z value%=�(�wave$,K%,1))
0� � value%=�(" ") �
0�( I%+=1:� I%>width% � I%=1:J%+=1
0� K%+=1
0� �
0�- � value%>=�("A") � value%<=�("Z") �
0�- current_wave_i%(I%,J%)=value%-64
0�+ I%+=1:� I%>width% � I%=1:J%+=1
0� K%+=1
0� �
0� reps%=0
0�/ ȕ value%>=�("0") � value%<=�("9")
0� reps%=reps%*10
0�$ reps%+=value%-�("0")
1 K%+=1
1& value%=�(�wave$,K%,1))
1 �
1$ � M%=1 � reps%
1.B � value%>�(" ") � current_wave_i%(I%,J%)=value%-64
18. I%+=1:� I%>width% � I%=1:J%+=1
1B � M%
1L K%+=1
1V �
1` �
1j�
1t�
1~:
1���store_current_wave
1�'� offset%,I%,J%,width%,S%,F%,count%
1��wave_offset(current_wave%)
1�� I%=0 � 9
1�= ?(wave_data%+offset%+I%)=255-�(�wavepassword$,I%+1,1))
1�� I%
1�width%=0:S%=17:F%=0
1�� I%=1 � 8
1� � J%=1 � 16
1�' � current_wave_i%(J%,I%)<>0 �
1� � J%<S% � S%=J%
1� � J%>F% � F%=J%
2 �
2
� J%
2� I%
2� S%=17 � S%=16
2(%� F%-S%+1>width% � width%=F%-S%+1
22#?(wave_data%+offset%+10)=width%
2<� I%=0 � 4
2F7 ?(wave_data%+offset%+11+I%)=wave_attributes%(I%)
2P� I%
2Zcount%=0
2d� I%=1 � 8
2n � J%=S% � F%
2xL ?(wave_data%+offset%+16+count%)=�unconvert(current_wave_i%(J%,I%))
2� count%+=1
2� � J%
2�� I%
2�� count%<127 �
2� � I%=count% � 127
2�+ ?(wave_data%+offset%+16+count%)=0
2� � I%
2��
2��
2�:
2���show_attributes
2��show_bomb_attributes
2��show_height(1)
3�show_num_bombs
3�show_num_rockets
3�show_init_dir
3"�update_wave_box
3,�
36:
3@��show_bomb_attributes
3J� A%,V%,SSX%,SSY%
3TV%=wave_attributes%(0)
3^� 5
3h� 0,black%
3r� A%=0 � 2
3| SSX%=18*4+16+18*16*4
3�" SSY%=WY%+20+A%*sprite_Y%+20
3� � 0,black%
3� ȓ Ȑ SSX%,SSY%,32,32
3� � SSX%+8,SSY%+28
3� � 0,red%
3� � (V% � 2^A%)>0 �
3� � �(91);
3� �
3� � �(92);
3� �
3�� A%
3�� 4
3��
4�
4:
4��toggle_bomb_type
4&� Y%,V%,W%
40valid%=�
4:V%=wave_attributes%(0)
4DY%=(MY%-WY%-20)/sprite_Y%
4N� Y%<0 � Y%=0
4X� Y%>2 � Y%=2
4bW%=0
4l� A%=0 � 2
4v � A%=Y% �
4�$ � (V% � 2^A%)=0 � W%+=2^A%
4� �
4�$ � (V% � 2^A%)>0 � W%+=2^A%
4� �
4�� A%
4�wave_attributes%(0)=W%
4��show_bomb_attributes
4��
4�:
4���show_height(delete%)
4�� V%,SSX%,SSY%,A$
4�
SSX%=1162
4�V%=wave_attributes%(1)
5SSY%=468+(6-V%)*36
5� delete%=0 �
5 � 0,black%
5 ȓ Ȑ SSX%,SSY%,114,36
5*�
54 � 0,red%
5> ȓ Ȑ SSX%,SSY%,114,36
5H � 0,white%
5R
� 5
5\ Ȏ V% �
5f � 1: A$=" TOP"
5p" � 2: A$=" HIGH" :SSX%+=8
5z" � 3: A$="MIDDLE":SSX%+=8
5�" � 4: A$="MIDDLE":SSX%+=8
5� � 5: A$=" LOW"
5�" � 6: A$="BOTTOM":SSX%+=8
5� �
5� � SSX%,SSY%+32
5� � A$;
5�
� 4
5� �
5��
5��
5�:
5���get_wave_height
5�� Y%,V%
6V%=wave_attributes%(1)
6Y%=(MY%-468)/36
6� Y%<0 � Y%=0
6$� Y%>5 � Y%=5
6.Y%=6-Y%
68� V%<>Y% �
6B �show_height(0)
6L wave_attributes%(1)=Y%
6V �show_height(1)
6`�
6jvalid%=�
6t�
6~:
6���show_num_bombs
6�� V$
6�V$=�(wave_attributes%(2))
6�� �(V$)=1 � V$="0"+V$
6�� 0,black%
6�"ȓ Ȑ 1166+38,WY%-14+20,32,-32
6�� 0,red%
6�� 5
6�� 1166+38,WY%-14+24
6� � V$;
6�� 4
6��
7 �
7
:
7��get_num_bombs
7� X%,V%
7(V%=wave_attributes%(2)
72X%=(MX%-1162)/57
7<� X%=0 �
7F � V%>1 � V%-=1
7P�
7Z � V%<16 � V%+=1
7d�
7nwave_attributes%(2)=V%
7x�show_num_bombs
7�valid%=�
7��
7�:
7���show_num_rockets
7�� 0,black%
7�ȓ Ȑ 1166+38+8,44,32,32
7�� 0,red%
7�� 5
7�� 1166+38+8,40+36
7�� �(wave_attributes%(3));
7�� 4
7��
7��
8:
8��get_num_rockets
8� X%,V%
8"V%=wave_attributes%(3)
8,X%=(MX%-1162)/57
86� X%=0 �
8@ � V%>1 � V%-=1
8J�
8T � V%<3 � V%+=1
8^�
8hwave_attributes%(3)=V%
8r�show_num_rockets
8|valid%=�
8��
8�:
8���show_init_dir
8�� V%,D%
8�V%=wave_attributes%(4)
8�� 5
8�� D%=0 � 2
8� � 0,black%
8� ȓ Ȑ 1000+D%*52,44,44,32
8� � 0,red%
8� � 1014+D%*52,40+36
8� Ȏ D% �
8�+ � 0: � V%=1 � � �(91); � � �(92);
9+ � 1: � V%=0 � � �(91); � � �(92);
9+ � 2: � V%=2 � � �(91); � � �(92);
9 �
9&� D%
90� 4
9:�
9D�
9N:
9X��get_init_dir
9b� X%,V%
9lV%=wave_attributes%(4)
9vX%=(MX%-1000)/52
9�Ȏ X% �
9� � 0:V%=1
9� � 1:V%=0
9�
:V%=2
9��
9�wave_attributes%(4)=V%
9��show_init_dir
9�valid%=�
9��
9�:
9���copy_to_number
9�$� offset1%,offset2%,I%,from%,to%
9�from%=current_wave%
:�to_which_wave_no
:offset1%=2+(from%-1)*144
:offset2%=2+(to%-1)*144
: � I%=0 � 143 � 4
:*: !(wave_data%+offset2%+I%)=!(wave_data%+offset1%+I%)
:4� I%
:>valid%=�
:H#�message("Invader Wave Copied")
:R�
:\:
:f
��logo
:p� Y%,SY%,mag%
:zmag%=44
:�
SY%=48
:�Y%=SY%+680+8
:�� 0,dark_grey%
:�� 128+dark_grey%
:�$ȓ Ȑ 112+16*mag%,Y%,460,1020-Y%
:�� 0,white%
:�!ȓ 112+16*mag%,Y%,460,1020-Y%
:�� 0,red%
:�+�print(16,16,"ALIEN INVASION",51.5,0.5)
:��print(32,16,"WAVE",57,2.5)
:�!�print(32,16,"EDITOR",53,4.5)
:�
� 0,cyan%
:��print(8,16,"By",52,7)
;"�print(16,16,"Arc-World",55,7)
;� 0,white%
;�
;$:
;.��print(XS%,YS%,text$,X,Y)
;8� 5
;B� X*16,1024-Y*32
;L� 23,17,7,6,XS%;YS%;0,0
;V� text$;
;`� 23,17,7,6,8;8;0,0
;j� 4
;t�
;~�
;�:
;���update_wave_box
;�� W$
;�� 5
;�� 0,black%
;�ȓ Ȑ 892,48,48,36
;�� 0,red%
;�� 892,48+32
;�W$=�(current_wave%)
;�#� �(W$)<3 � W$=�3-�(W$),"0")+W$
;� � W$;
;�� 4
<