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 <