home *** CD-ROM | disk | FTP | other *** search
/ ISV Strong Games / ISV_STRONG_GAMES.iso / arcade / bomber / !Bomber / Source < prev   
Text File  |  1992-05-23  |  9KB  |  444 lines

  1. BASIC
  2. MODE 0
  3. AUTO 0,10
  4.  
  5. REM ><Bomber$Dir>.!RunImage
  6. REM   Bomber
  7. REM     By
  8. REM Scott Moore
  9. REM 
  10. REM (C) 1992 SJM Software
  11. :       
  12. ON ERROR PROCinternalerror
  13. PROCinitialise
  14. REPEAT
  15. PROCtitlepage
  16. PROCwantinstructions
  17. PROCdogame
  18. PROCdohighscores
  19. PROCcheckplayagain
  20. UNTIL quit
  21. PROCexit
  22. END
  23. :
  24. DEF PROCinitialise
  25. MODE 13
  26. SYS "OS_RemoveCursors"
  27. quit=FALSE
  28. sp_op=&2E
  29. os_byte=&06
  30. space%=FALSE
  31. DIM highname$(10),highscore%(10)
  32. DIM buildtype%(20),buildtop%(20),buildheight%(20)
  33. PROCloadhighscoretable(highname$(),highscore%())
  34. *<Bomber$Dir>.Font
  35. PROCloadsprites
  36. ENDPROC
  37. :
  38. DEF PROCsavehighscores(name$(),score%())
  39. file%=OPENOUT("<Bomber$Dir>.HighScore")
  40. FOR loop%=1 TO 10
  41. BPUT#file%,STR$(score%(loop%))+","+name$(loop%)
  42. NEXT
  43. CLOSE #file%
  44. ENDPROC
  45. :
  46. DEF PROCloadhighscoretable(RETURN name$(),RETURN score%())
  47. file%=OPENIN("<Bomber$Dir>.HighScore")
  48. FOR loop%=1 TO 10
  49. line$=FNgetline(file%)
  50. split%=INSTR(line$,",")
  51. score%(loop%)=VAL(LEFT$(line$,split%-1))
  52. name$(loop%)=MID$(line$,split%+1)
  53. NEXT
  54. CLOSE #file%
  55. ENDPROC
  56. :
  57. DEF FNgetline(file%)
  58. line$=""
  59. byte%=BGET#file%
  60. WHILE byte%<>&0A
  61. line$+=CHR$(byte%)
  62. byte%=BGET#file%
  63. ENDWHILE
  64. =line$
  65. :
  66. DEF PROCloadsprites
  67. PROCloadspritefile("<Bomber$Dir>.Sprites.Sprites",sprites%)
  68. ENDPROC
  69. :
  70. DEF PROCloadspritefile(filename$,RETURN addr%)
  71. SYS "XOS_File",&05,filename$ TO ,,,,filelen%
  72. filelen%+=16
  73. DIM addr% filelen%
  74. addr%!0=filelen%
  75. addr%!4=16
  76. SYS "XOS_SpriteOp",&10A,addr%,filename$
  77. ENDPROC
  78. :
  79. DEF PROCtitlepage
  80. GCOL 62 TINT 192
  81. RECTANGLE FILL 0,0,1276,1020
  82. PROCsetupbuildings(6)
  83. PROCshowbuildings 
  84. PROCcentrestring2("Bomber",2,63,192)
  85. PROCcentrestring1("By",5,%110101,192)
  86. PROCcentrestring1("Scott Moore",7,%010111,192)
  87. PROCcentrestring1("(C) 1992 SJM Software",31,63,192)
  88. ENDPROC
  89. :                
  90. DEF PROCsetupbuildings(maxheight%)
  91. FOR loop%=1 TO 20
  92. buildtype%(loop%)=RND(4)-1
  93. buildheight%(loop%)=(maxheight%*.4)+RND(maxheight%*.6) 
  94. buildtop%(loop%)=buildheight%(loop%)
  95. NEXT
  96. ENDPROC
  97. :
  98. DEF PROCshowbuildings
  99. FOR loop%=1 TO 20
  100. SYS sp_op,&122,sprites%,"9",(loop%-1)*64,0
  101. FOR height%=1 TO buildheight%(loop%)
  102. IF height%<buildtop%(loop%) THEN 
  103. SYS sp_op,&122,sprites%,STR$((buildtype%(loop%)*2)+1),(loop%-1)*64,32+(height%-1)*64
  104. ELSE
  105. SYS sp_op,&122,sprites%,STR$((buildtype%(loop%)*2)+2),(loop%-1)*64,32+(height%-1)*64
  106. ENDIF
  107. NEXT ,
  108. ENDPROC
  109. :
  110. DEF PROCwantinstructions
  111. PROCcentrestring1("Do you want instructions (Y/N)?",15,%001011,192)
  112. SYS os_byte,15,1
  113. REPEAT
  114. key$=GET$
  115. UNTIL INSTR("YyNn",key$)
  116. IF key$="Y" OR key$="y" THEN PROCinstructions
  117. ENDPROC
  118. :
  119. DEF PROCinstructions
  120. GCOL 62 TINT 192
  121. RECTANGLE FILL 0,0,1276,1020
  122. PROCcentrestring2("Instructions",1,63,192)
  123. PROCcentrestring1("You are the pilot of a World War One",4,%000011,192)
  124. PROCcentrestring1("Plane.It is running out of fuel and you",6,%000011,192)
  125. PROCcentrestring1("will not be able to reach your runnway.",8,%000011,192)
  126. PROCcentrestring1("So you must bomb the buildings below",10,%000011,192)
  127. PROCcentrestring1("to clear a stretch of grass to",12,%000011,192)
  128. PROCcentrestring1("land your plane on.",14,%000011,192)
  129. PROCcentrestring1("KEYS",17,63,192)
  130. PROCcentrestring1("----",18,63,0)
  131. PROCcentrestring1("SPACE - Drop Bomb",20,%001100,192)
  132. PROCcentrestring1("  ESC - Quit Game",22,%001100,192)
  133. PROCcentrestring1("Press SPACE to start the game",28,%110101,192)
  134. SYS os_byte,15,1
  135. REPEAT
  136. UNTIL GET=32
  137. ENDPROC
  138. :
  139. DEF PROCdogame
  140. score%=0
  141. lives%=3
  142. level%=1
  143. GCOL 0 TINT 0
  144. RECTANGLE FILL 0,920,1276,103
  145. GCOL 63 TINT 192
  146. RECTANGLE 0,924,1276,99
  147. GCOL 63 TINT 128
  148. RECTANGLE 4,928,1268,91
  149. REPEAT             
  150. planex%=0
  151. planey%=848
  152. bomb%=FALSE
  153. bombx%=0
  154. bomby%=0
  155. bombd%=0
  156. hit%=FALSE
  157. finished%=FALSE
  158. maxheight%=5+level%
  159. IF maxheight%>11 THEN maxheight%=11
  160. GCOL 62 TINT 192
  161. RECTANGLE FILL 0,32,1276,887
  162. PROCsetupbuildings(maxheight%)
  163. buildhit%=0
  164. FOR loop%=1 TO 20
  165. buildhit%+=buildheight%(loop%)
  166. NEXT
  167. PROCshowbuildings
  168. PROCshowstatus
  169. REPEAT
  170.  PROCmovesprites
  171.  PROCcheckkeys
  172.  PROCcheckcollisions
  173.  IF buildhit%=0 THEN finished%=TRUE
  174.  IF hit% THEN PROChitbuilding
  175. UNTIL finished% OR lives%=0
  176. IF lives%>0 THEN
  177.  PROCfinishedlevel
  178. ENDIF
  179. UNTIL lives%=0
  180. PROCgameover
  181. ENDPROC
  182. :
  183. DEF PROCfinishedlevel
  184. REPEAT
  185. opx%=planex%
  186. opy%=planey%    
  187. planex%+=8
  188. IF planey%>32 THEN planey%-=2
  189. IF planey%<32 THEN planey%=32
  190. IF planex%>=1280 THEN
  191. planex%=-80
  192. ENDIF
  193. WAIT
  194. SYS sp_op,&122,sprites%,"12",opx%,opy%
  195. SYS sp_op,&122,sprites%,"0",planex%,planey%,8
  196. UNTIL planex%>=1180 AND planey%=32
  197. PROCcentrestring1("Well done!",15,%010111,192)
  198. PROCcentrestring1("You've finished level "+STR$(level%),17,%011101,192)
  199. bonus%=100+(level%*200)
  200. PROCcentrestring1(STR$(bonus%)+" bonus points",19,%110101,192)
  201. score%+=bonus%
  202. PROCshowstatus
  203. level%+=1
  204. PROCcentrestring1("Press SPACE to try the next level",22,%111111,192)
  205. SYS os_byte,15,1
  206. REPEAT
  207. UNTIL GET=32
  208. ENDPROC
  209. :
  210. DEF PROCgameover
  211. PROCcentrestring1("* * * GAME OVER * * *",27,%111011,192)
  212. TIME=0
  213. REPEAT UNTIL TIME>250
  214. ENDPROC
  215. :
  216. DEF PROChitbuilding
  217. SYS sp_op,&122,sprites%,"11",planex%+8,planey%-8,8
  218. lives%-=1
  219. hit%=FALSE
  220. PROCshowstatus
  221. PROCcentrestring1("Oh no! You've crashed!",25,%010111,192)
  222. IF lives%=0 THEN ENDPROC
  223. PROCcentrestring1("Press SPACE to start again",27,%110101,192)
  224. SYS os_byte,15,1
  225. REPEAT
  226. UNTIL GET=32
  227. planex%=0
  228. planey%=848
  229. buildheight%()=buildtop%()
  230. GCOL 62 TINT 192
  231. RECTANGLE FILL 0,32,1276,887
  232. buildhit%=0
  233. FOR loop%=1 TO 20
  234. buildhit%+=buildheight%(loop%)
  235. NEXT
  236. PROCshowbuildings
  237. ENDPROC
  238. :
  239. DEF PROCcheckcollisions
  240. IF bomb% AND (bomby%-bombd%)<=32 THEN
  241.  bomb%=FALSE
  242.  SYS sp_op,&122,sprites%,"13",bombx%,bomby%
  243.  IF score%>50 THEN 
  244.   score%-=50
  245.  ELSE
  246.   score%=0
  247.  ENDIF
  248.  PROCshowstatus
  249. ENDIF
  250. bombbx%=INT(bombx%/64)+1
  251. IF bomb% AND (bomby%-bombd%)<=(32+(64*(buildheight%(bombbx%)))) THEN
  252.  bomb%=FALSE
  253.  SYS sp_op,&122,sprites%,"13",bombx%,bomby%
  254.  SYS sp_op,&122,sprites%,"14",(bombbx%-1)*64,32+(buildheight%(bombbx%)-1)*64
  255.  buildheight%(bombbx%)-=1     
  256.  score%+=10
  257.  buildhit%-=1
  258.  PROCshowstatus
  259. ENDIF
  260. planebx%=INT((planex%+80)/64)+1
  261. IF planebx%<=20 THEN
  262.  IF 32+(64*buildheight%(planebx%))>planey% THEN hit%=TRUE
  263. ENDIF
  264. ENDPROC
  265. :
  266. DEF PROCcheckkeys
  267. IF NOT INKEY -99 THEN
  268.  space%=FALSE
  269. ENDIF
  270. IF NOT bomb% AND INKEY -99 AND planex%>=0 AND planex%<1276 AND space%=FALSE THEN
  271.  bombx%=INT(planex%/32)*32
  272.  bomby%=planey%-32
  273.  bomb%=TRUE
  274.  bombd%=4
  275.  space%=TRUE
  276. ENDIF
  277. ENDPROC
  278. :
  279. DEF PROCmovesprites
  280. opx%=planex%
  281. opy%=planey%
  282. oby%=bomby%
  283. planex%+=4
  284. IF level%>4 THEN planex%+=4
  285. IF level%>8 THEN planex%+=4
  286. IF bomb% THEN
  287. bomby%-=bombd%
  288. IF bombd%<32 THEN bombd%+=1
  289. ENDIF
  290. IF planex%>=1280 THEN
  291. planex%=-80
  292. planey%-=32+(level%*2)
  293. ENDIF
  294. WAIT
  295. IF bomb% THEN
  296. SYS sp_op,&122,sprites%,"13",bombx%,oby%
  297. SYS sp_op,&122,sprites%,"10",bombx%,bomby%
  298. ENDIF
  299. SYS sp_op,&122,sprites%,"12",opx%,opy%
  300. SYS sp_op,&122,sprites%,"0",planex%,planey%,8
  301. ENDPROC
  302. :
  303. DEF PROCshowstatus
  304. COLOUR 128 TINT 0
  305. COLOUR 63 TINT 192
  306. PRINT TAB(1,1);"Score :";FNnumber(5,score%)
  307. PRINT TAB(16,1);"Lives :";FNnumber(2,lives%)
  308. PRINT TAB(28,1);"Level :";FNnumber(2,level%)
  309. ENDPROC
  310. :
  311. DEF PROCdohighscores
  312. GCOL 62 TINT 192
  313. RECTANGLE FILL 0,0,1276,1020
  314. PROCcentrestring2("BOMBER HIGH SCORES",1,%111111,192)
  315. IF score%>highscore%(10) THEN
  316.  PROCcentrestring1("Well done!",11,%011011,192)
  317.  PROCcentrestring1("You've scored in the top ten!",13,%011110,192)
  318.  PROCcentrestring1("Please type in your name",15,%111001,192)
  319.  SYS os_byte,15,1
  320.  name$=""
  321.  REPEAT
  322.   lastname$=name$
  323.   key$=GET$
  324.   CASE key$ OF
  325.   WHEN CHR$&0D
  326.    REM 
  327.   WHEN CHR$&7F
  328.    IF LEN(name$)>0 THEN name$=LEFT$(name$,LEN(name$)-1)
  329.   OTHERWISE
  330.    IF LEN(name$)<20 THEN name$+=key$
  331.   ENDCASE
  332.   IF name$<>lastname$ THEN
  333.    WAIT
  334.    GCOL 62 TINT 192
  335.    RECTANGLE FILL 316,418,647,31
  336.    PROCcentrestring1(name$,18,%111111,192)
  337.   ENDIF
  338.  UNTIL key$=CHR$&0D
  339.  loop%=0
  340.  REPEAT
  341.   loop%+=1
  342.  UNTIL score%>highscore%(loop%)
  343.  highscore%(loop%)=score%
  344.  highname$(loop%)=name$
  345. GCOL 62 TINT 192
  346. RECTANGLE FILL 0,0,1276,704
  347. PROCsavehighscores(highname$(),highscore%())
  348. ENDIF
  349. FOR loop%=1 TO 10
  350.  PROCcentrestring1(FNnumber(5,highscore%(loop%))+"  "+FNstring(20,highname$(loop%)),3+(loop%*2),%011111,192)
  351. NEXT
  352. ENDPROC
  353. :
  354. DEF PROCcheckplayagain
  355. PROCcentrestring1("Do you wish to play again (Y/N)?",27,%010111,192)
  356. SYS os_byte,15,1
  357. REPEAT
  358. key$=GET$
  359. UNTIL INSTR("YyNn",key$)
  360. IF key$="N" OR key$="n" THEN quit=TRUE
  361. ENDPROC
  362. :
  363. DEF PROCexit
  364. MODE 12
  365. OFF
  366. SYS os_byte,20
  367. *TYPE <Bomber$Dir>.Message
  368. PRINT '
  369. ENDPROC
  370. :
  371. DEF PROCcentrestring1(string$,y%,col%,tint%)
  372. y%=1023-(y%*32)
  373. x%=640-LEN(string$)*16
  374. VDU 5
  375. GCOL 0 TINT 0
  376. MOVE x%-4,y%
  377. PRINT string$
  378. MOVE x%-4,y%-4
  379. PRINT string$
  380. MOVE x%,y%-4
  381. PRINT string$
  382. MOVE x%+4,y%-4
  383. PRINT string$
  384. MOVE x%+4,y%
  385. PRINT string$
  386. MOVE x%+4,y%+4
  387. PRINT string$
  388. MOVE x%,y%+4
  389. PRINT string$
  390. MOVE x%-4,y%+4
  391. PRINT string$
  392. GCOL col% TINT tint%
  393. MOVE x%,y%
  394. PRINT string$
  395. VDU 4
  396. ENDPROC
  397. :      
  398. DEF PROCcentrestring2(string$,y%,col%,tint%)
  399. y%=1023-(y%*32)
  400. x%=640-LEN(string$)*32
  401. VDU 23,17,7,%110,16;16;0,0,5
  402. GCOL 0 TINT 0
  403. MOVE x%-4,y%
  404. PRINT string$
  405. MOVE x%-4,y%-4
  406. PRINT string$
  407. MOVE x%,y%-4
  408. PRINT string$
  409. MOVE x%+4,y%-4
  410. PRINT string$
  411. MOVE x%+4,y%
  412. PRINT string$
  413. MOVE x%+4,y%+4
  414. PRINT string$
  415. MOVE x%,y%+4
  416. PRINT string$
  417. MOVE x%-4,y%+4
  418. PRINT string$
  419. GCOL col% TINT tint%
  420. MOVE x%,y%
  421. PRINT string$
  422. VDU 23,17,7,%110,8;8;0,0,4
  423. ENDPROC
  424. :      
  425. DEF FNnumber(places%,number%)
  426. =RIGHT$(STRING$(places%,"0")+STR$(number%),places%)
  427. :                                                  
  428. DEF FNstring(places%,string$)
  429. =RIGHT$(STRING$(places%," ")+string$,places%)
  430. :
  431. DEF PROCinternalerror
  432. MODE 12
  433. OFF
  434. SYS &06,20
  435. SYS &06,15,1
  436. IF ERR<>17 THEN
  437.  VDU 7
  438.  PRINT "Bomber has suffered an internal error, ";REPORT$;" at line ";ERL
  439. ELSE
  440.  PROCexit
  441. ENDIF
  442. END
  443.