home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ISV Strong Games
/
ISV_STRONG_GAMES.iso
/
arcade
/
bomber
/
!Bomber
/
Source
< prev
Wrap
Text File
|
1992-05-23
|
9KB
|
444 lines
BASIC
MODE 0
AUTO 0,10
REM ><Bomber$Dir>.!RunImage
:
REM Bomber
REM By
REM Scott Moore
REM
REM (C) 1992 SJM Software
:
ON ERROR PROCinternalerror
PROCinitialise
REPEAT
PROCtitlepage
PROCwantinstructions
PROCdogame
PROCdohighscores
PROCcheckplayagain
UNTIL quit
PROCexit
END
:
DEF PROCinitialise
MODE 13
SYS "OS_RemoveCursors"
quit=FALSE
sp_op=&2E
os_byte=&06
space%=FALSE
DIM highname$(10),highscore%(10)
DIM buildtype%(20),buildtop%(20),buildheight%(20)
PROCloadhighscoretable(highname$(),highscore%())
*<Bomber$Dir>.Font
PROCloadsprites
ENDPROC
:
DEF PROCsavehighscores(name$(),score%())
file%=OPENOUT("<Bomber$Dir>.HighScore")
FOR loop%=1 TO 10
BPUT#file%,STR$(score%(loop%))+","+name$(loop%)
NEXT
CLOSE #file%
ENDPROC
:
DEF PROCloadhighscoretable(RETURN name$(),RETURN score%())
file%=OPENIN("<Bomber$Dir>.HighScore")
FOR loop%=1 TO 10
line$=FNgetline(file%)
split%=INSTR(line$,",")
score%(loop%)=VAL(LEFT$(line$,split%-1))
name$(loop%)=MID$(line$,split%+1)
NEXT
CLOSE #file%
ENDPROC
:
DEF FNgetline(file%)
line$=""
byte%=BGET#file%
WHILE byte%<>&0A
line$+=CHR$(byte%)
byte%=BGET#file%
ENDWHILE
=line$
:
DEF PROCloadsprites
PROCloadspritefile("<Bomber$Dir>.Sprites.Sprites",sprites%)
ENDPROC
:
DEF PROCloadspritefile(filename$,RETURN addr%)
SYS "XOS_File",&05,filename$ TO ,,,,filelen%
filelen%+=16
DIM addr% filelen%
addr%!0=filelen%
addr%!4=16
SYS "XOS_SpriteOp",&10A,addr%,filename$
ENDPROC
:
DEF PROCtitlepage
GCOL 62 TINT 192
RECTANGLE FILL 0,0,1276,1020
PROCsetupbuildings(6)
PROCshowbuildings
PROCcentrestring2("Bomber",2,63,192)
PROCcentrestring1("By",5,%110101,192)
PROCcentrestring1("Scott Moore",7,%010111,192)
PROCcentrestring1("(C) 1992 SJM Software",31,63,192)
ENDPROC
:
DEF PROCsetupbuildings(maxheight%)
FOR loop%=1 TO 20
buildtype%(loop%)=RND(4)-1
buildheight%(loop%)=(maxheight%*.4)+RND(maxheight%*.6)
buildtop%(loop%)=buildheight%(loop%)
NEXT
ENDPROC
:
DEF PROCshowbuildings
FOR loop%=1 TO 20
SYS sp_op,&122,sprites%,"9",(loop%-1)*64,0
FOR height%=1 TO buildheight%(loop%)
IF height%<buildtop%(loop%) THEN
SYS sp_op,&122,sprites%,STR$((buildtype%(loop%)*2)+1),(loop%-1)*64,32+(height%-1)*64
ELSE
SYS sp_op,&122,sprites%,STR$((buildtype%(loop%)*2)+2),(loop%-1)*64,32+(height%-1)*64
ENDIF
NEXT ,
ENDPROC
:
DEF PROCwantinstructions
PROCcentrestring1("Do you want instructions (Y/N)?",15,%001011,192)
SYS os_byte,15,1
REPEAT
key$=GET$
UNTIL INSTR("YyNn",key$)
IF key$="Y" OR key$="y" THEN PROCinstructions
ENDPROC
:
DEF PROCinstructions
GCOL 62 TINT 192
RECTANGLE FILL 0,0,1276,1020
PROCcentrestring2("Instructions",1,63,192)
PROCcentrestring1("You are the pilot of a World War One",4,%000011,192)
PROCcentrestring1("Plane.It is running out of fuel and you",6,%000011,192)
PROCcentrestring1("will not be able to reach your runnway.",8,%000011,192)
PROCcentrestring1("So you must bomb the buildings below",10,%000011,192)
PROCcentrestring1("to clear a stretch of grass to",12,%000011,192)
PROCcentrestring1("land your plane on.",14,%000011,192)
PROCcentrestring1("KEYS",17,63,192)
PROCcentrestring1("----",18,63,0)
PROCcentrestring1("SPACE - Drop Bomb",20,%001100,192)
PROCcentrestring1(" ESC - Quit Game",22,%001100,192)
PROCcentrestring1("Press SPACE to start the game",28,%110101,192)
SYS os_byte,15,1
REPEAT
UNTIL GET=32
ENDPROC
:
DEF PROCdogame
score%=0
lives%=3
level%=1
GCOL 0 TINT 0
RECTANGLE FILL 0,920,1276,103
GCOL 63 TINT 192
RECTANGLE 0,924,1276,99
GCOL 63 TINT 128
RECTANGLE 4,928,1268,91
REPEAT
planex%=0
planey%=848
bomb%=FALSE
bombx%=0
bomby%=0
bombd%=0
hit%=FALSE
finished%=FALSE
maxheight%=5+level%
IF maxheight%>11 THEN maxheight%=11
GCOL 62 TINT 192
RECTANGLE FILL 0,32,1276,887
PROCsetupbuildings(maxheight%)
buildhit%=0
FOR loop%=1 TO 20
buildhit%+=buildheight%(loop%)
NEXT
PROCshowbuildings
PROCshowstatus
REPEAT
PROCmovesprites
PROCcheckkeys
PROCcheckcollisions
IF buildhit%=0 THEN finished%=TRUE
IF hit% THEN PROChitbuilding
UNTIL finished% OR lives%=0
IF lives%>0 THEN
PROCfinishedlevel
ENDIF
UNTIL lives%=0
PROCgameover
ENDPROC
:
DEF PROCfinishedlevel
REPEAT
opx%=planex%
opy%=planey%
planex%+=8
IF planey%>32 THEN planey%-=2
IF planey%<32 THEN planey%=32
IF planex%>=1280 THEN
planex%=-80
ENDIF
WAIT
SYS sp_op,&122,sprites%,"12",opx%,opy%
SYS sp_op,&122,sprites%,"0",planex%,planey%,8
UNTIL planex%>=1180 AND planey%=32
PROCcentrestring1("Well done!",15,%010111,192)
PROCcentrestring1("You've finished level "+STR$(level%),17,%011101,192)
bonus%=100+(level%*200)
PROCcentrestring1(STR$(bonus%)+" bonus points",19,%110101,192)
score%+=bonus%
PROCshowstatus
level%+=1
PROCcentrestring1("Press SPACE to try the next level",22,%111111,192)
SYS os_byte,15,1
REPEAT
UNTIL GET=32
ENDPROC
:
DEF PROCgameover
PROCcentrestring1("* * * GAME OVER * * *",27,%111011,192)
TIME=0
REPEAT UNTIL TIME>250
ENDPROC
:
DEF PROChitbuilding
SYS sp_op,&122,sprites%,"11",planex%+8,planey%-8,8
lives%-=1
hit%=FALSE
PROCshowstatus
PROCcentrestring1("Oh no! You've crashed!",25,%010111,192)
IF lives%=0 THEN ENDPROC
PROCcentrestring1("Press SPACE to start again",27,%110101,192)
SYS os_byte,15,1
REPEAT
UNTIL GET=32
planex%=0
planey%=848
buildheight%()=buildtop%()
GCOL 62 TINT 192
RECTANGLE FILL 0,32,1276,887
buildhit%=0
FOR loop%=1 TO 20
buildhit%+=buildheight%(loop%)
NEXT
PROCshowbuildings
ENDPROC
:
DEF PROCcheckcollisions
IF bomb% AND (bomby%-bombd%)<=32 THEN
bomb%=FALSE
SYS sp_op,&122,sprites%,"13",bombx%,bomby%
IF score%>50 THEN
score%-=50
ELSE
score%=0
ENDIF
PROCshowstatus
ENDIF
bombbx%=INT(bombx%/64)+1
IF bomb% AND (bomby%-bombd%)<=(32+(64*(buildheight%(bombbx%)))) THEN
bomb%=FALSE
SYS sp_op,&122,sprites%,"13",bombx%,bomby%
SYS sp_op,&122,sprites%,"14",(bombbx%-1)*64,32+(buildheight%(bombbx%)-1)*64
buildheight%(bombbx%)-=1
score%+=10
buildhit%-=1
PROCshowstatus
ENDIF
planebx%=INT((planex%+80)/64)+1
IF planebx%<=20 THEN
IF 32+(64*buildheight%(planebx%))>planey% THEN hit%=TRUE
ENDIF
ENDPROC
:
DEF PROCcheckkeys
IF NOT INKEY -99 THEN
space%=FALSE
ENDIF
IF NOT bomb% AND INKEY -99 AND planex%>=0 AND planex%<1276 AND space%=FALSE THEN
bombx%=INT(planex%/32)*32
bomby%=planey%-32
bomb%=TRUE
bombd%=4
space%=TRUE
ENDIF
ENDPROC
:
DEF PROCmovesprites
opx%=planex%
opy%=planey%
oby%=bomby%
planex%+=4
IF level%>4 THEN planex%+=4
IF level%>8 THEN planex%+=4
IF bomb% THEN
bomby%-=bombd%
IF bombd%<32 THEN bombd%+=1
ENDIF
IF planex%>=1280 THEN
planex%=-80
planey%-=32+(level%*2)
ENDIF
WAIT
IF bomb% THEN
SYS sp_op,&122,sprites%,"13",bombx%,oby%
SYS sp_op,&122,sprites%,"10",bombx%,bomby%
ENDIF
SYS sp_op,&122,sprites%,"12",opx%,opy%
SYS sp_op,&122,sprites%,"0",planex%,planey%,8
ENDPROC
:
DEF PROCshowstatus
COLOUR 128 TINT 0
COLOUR 63 TINT 192
PRINT TAB(1,1);"Score :";FNnumber(5,score%)
PRINT TAB(16,1);"Lives :";FNnumber(2,lives%)
PRINT TAB(28,1);"Level :";FNnumber(2,level%)
ENDPROC
:
DEF PROCdohighscores
GCOL 62 TINT 192
RECTANGLE FILL 0,0,1276,1020
PROCcentrestring2("BOMBER HIGH SCORES",1,%111111,192)
IF score%>highscore%(10) THEN
PROCcentrestring1("Well done!",11,%011011,192)
PROCcentrestring1("You've scored in the top ten!",13,%011110,192)
PROCcentrestring1("Please type in your name",15,%111001,192)
SYS os_byte,15,1
name$=""
REPEAT
lastname$=name$
key$=GET$
CASE key$ OF
WHEN CHR$&0D
REM
WHEN CHR$&7F
IF LEN(name$)>0 THEN name$=LEFT$(name$,LEN(name$)-1)
OTHERWISE
IF LEN(name$)<20 THEN name$+=key$
ENDCASE
IF name$<>lastname$ THEN
WAIT
GCOL 62 TINT 192
RECTANGLE FILL 316,418,647,31
PROCcentrestring1(name$,18,%111111,192)
ENDIF
UNTIL key$=CHR$&0D
loop%=0
REPEAT
loop%+=1
UNTIL score%>highscore%(loop%)
highscore%(loop%)=score%
highname$(loop%)=name$
GCOL 62 TINT 192
RECTANGLE FILL 0,0,1276,704
PROCsavehighscores(highname$(),highscore%())
ENDIF
FOR loop%=1 TO 10
PROCcentrestring1(FNnumber(5,highscore%(loop%))+" "+FNstring(20,highname$(loop%)),3+(loop%*2),%011111,192)
NEXT
ENDPROC
:
DEF PROCcheckplayagain
PROCcentrestring1("Do you wish to play again (Y/N)?",27,%010111,192)
SYS os_byte,15,1
REPEAT
key$=GET$
UNTIL INSTR("YyNn",key$)
IF key$="N" OR key$="n" THEN quit=TRUE
ENDPROC
:
DEF PROCexit
MODE 12
OFF
SYS os_byte,20
*TYPE <Bomber$Dir>.Message
PRINT '
ENDPROC
:
DEF PROCcentrestring1(string$,y%,col%,tint%)
y%=1023-(y%*32)
x%=640-LEN(string$)*16
VDU 5
GCOL 0 TINT 0
MOVE x%-4,y%
PRINT string$
MOVE x%-4,y%-4
PRINT string$
MOVE x%,y%-4
PRINT string$
MOVE x%+4,y%-4
PRINT string$
MOVE x%+4,y%
PRINT string$
MOVE x%+4,y%+4
PRINT string$
MOVE x%,y%+4
PRINT string$
MOVE x%-4,y%+4
PRINT string$
GCOL col% TINT tint%
MOVE x%,y%
PRINT string$
VDU 4
ENDPROC
:
DEF PROCcentrestring2(string$,y%,col%,tint%)
y%=1023-(y%*32)
x%=640-LEN(string$)*32
VDU 23,17,7,%110,16;16;0,0,5
GCOL 0 TINT 0
MOVE x%-4,y%
PRINT string$
MOVE x%-4,y%-4
PRINT string$
MOVE x%,y%-4
PRINT string$
MOVE x%+4,y%-4
PRINT string$
MOVE x%+4,y%
PRINT string$
MOVE x%+4,y%+4
PRINT string$
MOVE x%,y%+4
PRINT string$
MOVE x%-4,y%+4
PRINT string$
GCOL col% TINT tint%
MOVE x%,y%
PRINT string$
VDU 23,17,7,%110,8;8;0,0,4
ENDPROC
:
DEF FNnumber(places%,number%)
=RIGHT$(STRING$(places%,"0")+STR$(number%),places%)
:
DEF FNstring(places%,string$)
=RIGHT$(STRING$(places%," ")+string$,places%)
:
DEF PROCinternalerror
MODE 12
OFF
SYS &06,20
SYS &06,15,1
IF ERR<>17 THEN
VDU 7
PRINT "Bomber has suffered an internal error, ";REPORT$;" at line ";ERL
ELSE
PROCexit
ENDIF
END