RWAVE.S82 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954
  1. ******************************************************
  2. ******************************************************
  3. *
  4. *
  5. * ROBOTRON 29-JULY-83
  6. * 2-AUGUST-83 12:00
  7. * 22-AUGUST-83 8:10
  8. *
  9. *
  10. * RWAVE.S - ROBOTRON WAVE-RELATED ROUTINES
  11. *
  12. ******************************************************
  13. ******************************************
  14. ******************************************
  15. *
  16. * WAVESTRT-- SUBROUTINE TO INITIALIZE THINGS BEFORE EACH WAVE
  17. *
  18. * NOTE: THERE WILL HAVE TO BE AN ENTRY POINT INTO THIS*********
  19. * ROUTINE THAT WILL RESTART A WAVE WHEN THE MC DIES AND THEN RETURNS.
  20. * THIS POINT SHOULD BE AFTER THE INC OF WAVENUM AND AFTER THE LOAD
  21. * OF THE WAVE-START NUMBERS FROM ROM.
  22. *
  23. ******************************************
  24. *
  25. WAVESTRT INC WAVENUM ;A NEW WAVE
  26. * INITIALIZE NUMBERS OF EACH OBJECT:
  27. * GET THE BLOCK OF STARTNUM NUMBERS FROM WAVETBL AND MOVE IT INTO
  28. * THE RAM LOCATIONS STARTING WITH GNUM.
  29. * HERE A Z80 WOULD BE NICE
  30. LDA #$00
  31. STA TEMP2 ;TEMP2 WILL BE USED FOR HI-BYTE OF WAVENUM*16
  32. LDA WAVENUM ;THE CURRENT WAVE, 1 TO 255
  33. * TURN WAVE NUMBERS OVER 40 INTO THE RANGE 20 - 40
  34. WS1 CMP #40 ;LESS THAN 40?
  35. BCC WS2 ;IF SO, CONTINUE
  36. SEC
  37. SBC #20 ;CHOP OFF 20
  38. JMP WS1 ; AND TRY AGAIN
  39. * NOW A IS A WAVE # 1 - 40. MULTIPLY IT BY 16 TO GET WAVETBL OFFSET
  40. WS2 ASL A
  41. ROL TEMP2
  42. ASL A
  43. ROL TEMP2
  44. ASL A
  45. ROL TEMP2
  46. ASL A ;NOW A HAS LOW BYTE OF PRODUCT
  47. ROL TEMP2 ;TEMP2 HAS HIGH BYTE OF PRODUCT
  48. * ADD OFFSET (JUST COMPUTED) TO #WAVETBL TO FIND BLOCK BASE ADDRESS
  49. CLC
  50. ADC #L(WAVETBL-$10) ;WAVETBL ACTUALLY STARTS WITH WAVE 1, NOT 0
  51. STA TEMP0 ;LOW BYTE OF BLOCK BASE ADDRESS
  52. LDA TEMP2
  53. ADC #H(WAVETBL-$10)
  54. STA TEMP1 ;HIGH BYTE OF BLOCK BASE ADDRESS
  55. * NOW (TEMP0) IS BLOCK BASE ADDRESS. LOOP THRU NUMBERS TO MOVE WITH Y
  56. LDY #STARTNUM ;NUMBER OF NUMBERS TO MOVE
  57. WLOOP1 LDA (TEMP0),Y ;GET A NUMBER FROM WAVETBL IN ROM
  58. STA GNUM,Y ;STORE IT IN RAM
  59. DEY
  60. BPL WLOOP1 ;Y NON-NEGATIVE - MORE TO MOVE
  61. **********NOW THE RAM VARIABLES ARE LOADED WITH START-OF-WAVE NUMBERS
  62. * ZERO OUT THE OBJECT DATA TABLES
  63. * LOOP FROM XTBL TO XTBL+MAXOBJS*NUMTBLS
  64. * THIS WILL WIPE OUT THE ENTIRE TOP PAGE OF THE TABLES, EVEN
  65. * ABOVE XTBL+MAXOBJS*NUMTBLS
  66. LDA #L(XTBL)
  67. STA TEMP0 ;TEMP0 IS LOW BYTE OF ADDRESS
  68. LDA #H(XTBL)
  69. STA TEMP1
  70. LDY #$00 ;USE PURE INDIRECT STORE
  71. WSZLOOP LDA #$00 ;ZERO OUT OBJECT DATA TABLES LOOP
  72. STA (TEMP0),Y ;ZERO A LOCATION
  73. INC TEMP0
  74. BNE WSZLOOP
  75. INC TEMP1
  76. LDA TEMP1
  77. CMP #H(XTBL+MAXOBJS*NUMTBLS)
  78. BCC WSZLOOP ;KEEP GOING IF TEMP1 LESS THAN TOP LOC
  79. BEQ WSZLOOP ;ALSO GO IF EQUAL
  80. * NOW TEMP1 (HI BYTE OF INDEX) IS ABOVE UPPER LIMIT, SO WE ARE DONE
  81. * SET UP EACH TYPE OF OBJECT INDIVIDUALLY:
  82. * SET OBJECT DATA TABLE SEGMENT POINTER (FPTR, HPTR, ETC.)
  83. * CREATE SPECIFIED NUMBER OF OBJECTS IN OBJECT DATA TABLES
  84. * ( IF START-OF-WAVE NUMBER IS 0, CREATE 1 OBJECT
  85. * SO OTHER LOOPS WON'T GET SCREWED UP )
  86. * SET ALL OBJECT DATA TABLE VARIABLES
  87. * SET ALL VARIABLES GLOBAL TO A CERTAIN OBJECT TYPE (I.E. GSPEED)
  88. *
  89. * X IS A RUNNING POINTER INTO THE OBJECT DATA TABLES
  90. LDX #$01
  91. * INITIALIZE NUMBER OF CREATURES LEFT
  92. LDA #$00
  93. STA CRELEFT
  94. *
  95. **********GRUNTS
  96. * NO NEED TO SET POINTER - OBJECT 1 IS ALWAYS THE FIRST GRUNT
  97. LDY GNUM ;LOOP THRU ALL GRUNTS
  98. BNE WSGGO ;AT LEAST 1 GRUNT - DISTRIBUTE GRUNTS
  99. * NO GRUNTS
  100. LDA #NULLCODE
  101. STA CRTBL,X ;STORE A NULL OBJECT
  102. INX
  103. JMP WSGCONT ;GO TO GLOBAL GRUNT VARIABLE SETUP
  104. WSGGO DEY ;Y INDEXES UNTIL NEGATIVE - FIX FENCEPOST ERROR
  105. WSGLOOP JSR RANDXYBX ;GET A VALID GRUNT POSITION
  106. LDA RANDOMX
  107. STA XTBL,X ;GRUNT XPOS
  108. CLC
  109. ADC #GWID ;COMPUTE EXTENT
  110. STA XEXTBL,X ;GRUNT X EXTENT
  111. LDA RANDOMY
  112. STA YTBL,X ;GRUNT YPOS
  113. CLC
  114. ADC #GHEIGHT ;COMPUTE EXTENT
  115. STA YEXTBL,X ;GRUNT Y EXTENT
  116. TYA ;USE GRUNT # AS SEED TO GET GOOD DISTRIBUTION OF MOVE TIMERS
  117. AND #MASK3 ;GET A NUMBER 0 - 7
  118. CLC
  119. ADC #WSWAIT
  120. STA MTTBL,X ;NUMBER OF FRAMES UNTIL MOVE
  121. JSR RAND2 ;GET A NUMBER, 0 - 2
  122. CLC
  123. ADC #$01 ;NUMBER, 1 - 3
  124. STA SATBL,X ;GRUNT ANIMATION STEP
  125. LDA #$00
  126. STA DXTBL,X ;GRUNT DX (DIR) MUST ALWAYS BE 0
  127. LDA #GCODE
  128. STA CRTBL,X ;GRUNT OBJECT CODE
  129. JSR SETSTAT ;FOR DEBUGGING @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  130. * DLPHTBL,DLPLTBL AND DL2PTBL WILL BE SET UP BY THE LOAD AT THE END OF
  131. * THE WAVESTRT ROUTINE
  132. * DONE WITH THIS GRUNT, ON TO NEXT...
  133. INC CRELEFT ;ANOTHER LIVING CREATURE IS CREATED
  134. INX ;INCREMENT RUNNING POINTER
  135. DEY
  136. BPL WSGLOOP ;MORE GRUNTS TO SET UP
  137. * SET$GSPEED - NUMBER OF FRAMES BETWEEN GRUNT MOVES AT START
  138. * OF WAVE - THIS VARIABLE WILL BE CHANGED DURING THE WAVE
  139. WSGCONT LDA WAVENUM ;CURRENT WAVE NUMBER
  140. CMP #$07 ;ONLY HAVE 7 WAVES IN TABLE
  141. BCC LOOKGSP ;LOOK UP GSPEED FROM TABLE
  142. * WE ARE ABOVE WAVE 7, SET GSPEED TO #GSPMAX
  143. LDA #GSPMAX
  144. STA GSPEED
  145. JMP WSG1
  146. LOOKGSP TAY ;PUT WAVE NUMBER IN Y
  147. LDA GSPTBL-1,Y ;LOAD STARTING GSPEED - USE -1 BECAUSE NO WAVE 0
  148. STA GSPEED
  149. WSG1 ;DONE WITH GRUNT SETUP
  150. **********FAMILY
  151. STX FPTR ;SET POINTER TO START OF FAMILY
  152. LDA MONUM ;CHECK IF NO FAMILY EXIST
  153. BNE WSFLOOP ;IF AT LEAST 1 MOMMY, OK TO SET UP
  154. LDA DNUM
  155. BNE WSFLOOP ;IF AT LEAST 1 DADDY, OK TO SET UP
  156. LDA MINUM
  157. BNE WSFLOOP ;IF AT LEAST 1 MIKEY, OK TO SET UP
  158. * IF WE ARE HERE, NO FAMILY TO SET UP
  159. LDA #NULLCODE
  160. STA CRTBL,X ;STORE A NULL OBJECT
  161. INX
  162. JMP WSFCONT
  163. WSFLOOP LDA #$02 ;TEMP2 IS FAMILY FINISHED FLAG - MO,
  164. STA TEMP2 ; D AND MI ROUTINES DEC THIS IF NO
  165. ; MO, D OR MI TO SET UP. IF IT GOES NEGATIVE, WE ARE DONE
  166. * CHECK MOMMIES
  167. DEC MONUM
  168. BPL ADDMOMMY ;THERE ARE MOMMIES LEFT TO SET UP
  169. DEC TEMP2 ;NO MOMMIES - DEC FAMILY FINISHED FLAG
  170. JMP WSFCHKD ;MOVE ON TO DADDIES
  171. ADDMOMMY LDA #MOCODE
  172. STA CRTBL,X ;STORE MOMMY CODE IN CRTBL
  173. JSR ADDFAM
  174. * CHECK DADDIES
  175. WSFCHKD DEC DNUM
  176. BPL ADDDADDY ;THERE ARE DADDIES LEFT TO SET UP
  177. DEC TEMP2 ;NO DADDIES - DEC FAMILY FINISHED FLAG
  178. JMP WSFCHKMI ;MOVE ON TO MIKEYS
  179. ADDDADDY LDA #DCODE
  180. STA CRTBL,X ;STORE DADDY CODE IN CRTBL
  181. JSR ADDFAM
  182. * CHECK MIKEYS
  183. WSFCHKMI DEC MINUM
  184. BPL ADDMIKEY ;THERE ARE MIKEYS LEFT TO SET UP
  185. DEC TEMP2 ;NO MIKEYS - DEC FAMILY FINISHED FLAG
  186. JMP WSF1
  187. ADDMIKEY LDA #MICODE
  188. STA CRTBL,X ;STORE MIKEY CODE IN CRTBL
  189. JSR ADDFAM
  190. * CHECK IF THERE ARE NO FAMILY MEMBERS LEFT
  191. WSF1 LDA TEMP2
  192. BPL WSFLOOP ;THERE ARE STILL MORE THINGS TO SET UP
  193. * NO MORE FAMILY TO ADD
  194. JMP WSFCONT
  195. * SUBROUTINE TO PUT A FAMILY MEMBER INTO OBJECT DATA TABLES WITH STATE
  196. * VARIABLES SET UP. ASSUME CRTBL,X ALREADY LOADED WITH CORRECT CODE
  197. ADDFAM
  198. JSR RANDXY ;GET A RANDOM POSITION
  199. LDA RANDOMX
  200. STA XTBL,X ;FAMILY XPOS
  201. CLC
  202. ADC #FWID ;COMPUTE EXTENT
  203. STA XEXTBL,X ;FAMILY X EXTENT
  204. LDA RANDOMY
  205. STA YTBL,X ;FAMILY YPOS
  206. CLC
  207. ADC #FHEIGHT ;COMPUTE EXTENT
  208. STA YEXTBL,X ;FAMILY Y EXTENT
  209. JSR RANDOM
  210. AND #MASK3 ;GET A NUMBER 0 - 7
  211. STA DTTBL,X ;DIRECTION TIMER
  212. STA MTTBL,X ;NUMBER OF FRAMES UNTIL MOVE
  213. JSR RAND2 ;GET A NUMBER 0 - 2
  214. STA SATBL,X ;FAMILY ANIMATION STEP
  215. JSR RANDOM
  216. AND #MASK3
  217. STA DXTBL,X ;RANDOM DIRECTION 0 - 7
  218. JSR SETSTAT ; FOR DEBUGGING @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  219. * DLPHTBL,DLPLTBL AND DL2PTBL WILL BE SET UP BY THE LOAD AT THE END OF
  220. * THE WAVESTRT ROUTINE
  221. * DONE WITH THIS GRUNT, ON TO NEXT...
  222. INX ;INCREMENT RUNNING POINTER
  223. RTS
  224. WSFCONT
  225. * SET UP GLOBAL FAMILY VARIABLES
  226. LDA #$05 ;MAY WANT TO USE A TABLE LOOKUP
  227. STA FSPEED ;FAMILY SPEED
  228. LDA #$00
  229. STA FAMLEVEL ;RESET SCORE LEVEL FOR PICKING UP FAMILY
  230. **********HULKS
  231. STX HPTR ;POINTER TO START OF HULKS
  232. LDY HNUM ;LOOP THRU ALL HULKS
  233. BNE WSHGO ;AT LEAST 1 HULK - DISTRIBUTE HULKS
  234. * NO HULKS
  235. LDA #NULLCODE
  236. STA CRTBL,X ;STORE A NULL OBJECT
  237. INX
  238. JMP WSHCONT ;GO TO GLOBAL HULK VARIABLE SETUP
  239. WSHGO DEY ; Y MUST DEC UNTIL NEGATIVE
  240. WSHLOOP JSR RANDXYBX ;GET A VALID HULK POSITION
  241. LDA RANDOMX
  242. STA XTBL,X ;HULK XPOS
  243. CLC
  244. ADC #HWID ;COMPUTE EXTENT
  245. STA XEXTBL,X ;HULK X EXTENT
  246. LDA RANDOMY
  247. STA YTBL,X ;HULK YPOS
  248. CLC
  249. ADC #HHEIGHT ;COMPUTE EXTENT
  250. STA YEXTBL,X ;HULK Y EXTENT
  251. TYA ;USE HULK # AS SEED TO GET GOOD DISTRIBUTION OF MOVE TIMERS
  252. AND #MASK3 ;GET A NUMBER 0 - 7
  253. CLC
  254. ADC #WSWAIT ;WAIT A LITTLE AFTER RES-IN
  255. STA MTTBL,X ;NUMBER OF FRAMES UNTIL MOVE
  256. JSR RAND2 ;GET A NUMBER 0 - 2
  257. CLC
  258. ADC #$01 ;GET A NUMBER 1, 2 OR 3
  259. STA SATBL,X ;HULK ANIMATION STEP
  260. JSR RANDOM
  261. AND #MASK3
  262. STA DTTBL,X ;# MOVES UNTIL DIR CHANGE
  263. AND #MASK2
  264. STA DXTBL,X ;DIRECTION MOVING
  265. LDA #HCODE
  266. STA CRTBL,X ;HULK OBJECT CODE
  267. JSR SETSTAT ; FOR DEBUGGING @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  268. * DLPHTBL,DLPLTBL AND DL2PTBL WILL BE SET UP BY THE LOAD AT THE END OF
  269. * THE WAVESTRT ROUTINE
  270. * DONE WITH THIS HULK, ON TO NEXT...
  271. INX ;INCREMENT RUNNING POINTER
  272. DEY
  273. BPL WSHLOOP ;MORE HULKS TO SET UP
  274. WSHCONT ;SET UP VARIABLES GLOBAL TO HULKS
  275. * SET HSPEED - NUMBER OF FRAMES BETWEEN HULK MOVES
  276. LDA WAVENUM ;CURRENT WAVE NUMBER
  277. CMP #13 ;ONLY HAVE 13 WAVES IN TABLE
  278. BCC LOOKHSP ;LOOK UP HSPEED FROM TABLE
  279. * WE ARE ABOVE WAVE 13, SET HSPEED TO #HSPMAX
  280. LDA #HSPMAX
  281. STA HSPEED
  282. JMP WSH1
  283. LOOKHSP TAY ;PUT WAVE NUMBER IN Y
  284. LDA HSPTBL-1,Y ;LOAD STARTING HSPEED - USE -1 BECAUSE NO WAVE 0
  285. STA HSPEED
  286. WSH1 ;DONE WITH HULK SETUP
  287. **********SPHERIODS AND QUARKS
  288. STX SPTR ;POINTER TO START OF SPHERIODS
  289. * SET UP GLOBAL SPHERIOD AND QUARK VARIABLES - NEEDED FOR INDIV. SETUP
  290. * SET SQBTIME -- BASE TIME UNTIL FIRST BIRTH IN A WAVE
  291. LDA WAVENUM
  292. CMP #17
  293. BCC LOOKSQBT ;LOOK UP WAVE 1 THRU 17 IN THE TABLE
  294. * ABOVE WAVE 17, SET SQBTIME TO #SQBTMAX
  295. LDA #SQBTMAX
  296. STA SQBTIME
  297. JMP WSSQ1
  298. LOOKSQBT TAY ;LOOK UP IN SQBTTBL
  299. LDA SQBTTBL-1,Y
  300. STA SQBTIME
  301. WSSQ1 ;SET UP INDIVIDUAL SPHEROIDS AND QUARKS NOW
  302. * SPHEROID LOOP
  303. LDY SNUM ;LOOP THRU ALL SPHEROIDS
  304. BNE WSSGO ;AT LEAST 1 SPHEROID - DISTRIBUTE THEM
  305. * NO SPHEROIDS
  306. LDA #NULLCODE
  307. STA CRTBL,X ;STORE A NULL OBJECT
  308. INX
  309. JMP WSSCONT ;GO ON TO QUARKS
  310. WSSGO DEY ;Y RUNS UNTIL NEGATIVE
  311. WSSLOOP JSR ADDSQ ;SET UP MOST STATE VARIABLES
  312. LDA #SCODE
  313. STA CRTBL,X
  314. LDA #MAXSSPD
  315. STA TEMP4
  316. JSR RANDPM ;GET RANDOM NUM ON + OR - TEMP4
  317. STA DXTBL,X ;START X SPEED
  318. JSR RANDPM
  319. STA DYTBL,X ;START Y SPEED
  320. * DONE WITH THIS SPHEROID, ON TO NEXT...
  321. INC CRELEFT ;ANOTHER LIVING CREATURE IS CREATED
  322. INX ;INCREMENT RUNNING POINTER
  323. DEY
  324. BPL WSSLOOP ;MORE SPHEROIDS TO SET UP
  325. WSSCONT STX QPTR ;START OF QUARKS
  326. * QUARK LOOP
  327. LDY QNUM ;LOOP THRU ALL QUARKS
  328. BNE WSQGO ;AT LEAST 1 QUARK - DISTRIBUTE THEM
  329. * NO QUARKS
  330. LDA #NULLCODE
  331. STA CRTBL,X ;STORE A NULL OBJECT
  332. INX
  333. JMP WSQCONT ;SET UP GLOBAL QUARK VARIABLES
  334. WSQGO DEY ;Y RUNS UNTIL NEGATIVE
  335. WSQLOOP JSR ADDSQ ;SET UP MOST STATE VARIABLES
  336. LDA #QCODE
  337. STA CRTBL,X
  338. JSR RANDOM
  339. AND #MASK3
  340. STA DXTBL,X ;DIR MOVING
  341. STA DYTBL,X ;DIR CHANGE TIMER
  342. * DONE WITH THIS QUARK, ON TO NEXT...
  343. INC CRELEFT ;ANOTHER LIVING CREATURE IS CREATED
  344. INX ;INCREMENT RUNNING POINTER
  345. DEY
  346. BPL WSQLOOP ;MORE QUARKS TO SET UP
  347. JMP WSQCONT
  348. * SUBROUTINE TO SET UP STATE VARIABLES COMMON TO SPHEROIDS AND QUARKS
  349. ADDSQ ;OBJECT NUMBER IS IN X
  350. JSR RANDXYBX ;GET A VALID POSITION
  351. LDA RANDOMX
  352. STA XTBL,X ;XPOS
  353. CLC
  354. ADC #SQWID ;COMPUTE EXTENT
  355. STA XEXTBL,X ;X EXTENT
  356. LDA RANDOMY
  357. STA YTBL,X ;YPOS
  358. CLC
  359. ADC #SQHEIGHT ;COMPUTE EXTENT
  360. STA YEXTBL,X ;Y EXTENT
  361. JSR RANDOM
  362. AND #MASK3
  363. STA MTTBL,X ;# FRAMES UNTIL MOVE
  364. LDA #SQBIRTHS
  365. STA DTTBL,X ;# OF BIRTHS LEFT
  366. LDA #SQSTEP1
  367. STA SATBL,X ;STARTING ANIMATION STEP
  368. JSR RANDOM
  369. AND #MASK3
  370. ADC SQBTIME
  371. STA MISCTBL,X ;# MOVES UNTIL FIRST BIRTH
  372. * CALLING ROUTINE SHOULD SET UP SPECIFIC S + Q STATE VARIABLES:
  373. * SPHEROID: DELTA X AND DELTA Y
  374. * QUARK: DIR AND DIR CHANGE TIMER
  375. * BOTH: CREATURE TYPE
  376. *
  377. * DLPHTBL,DLPLTBL AND DL2PTBL WILL BE SET UP BY THE LOAD AT THE END OF
  378. * THE WAVESTRT ROUTINE
  379. RTS
  380. WSQCONT ;SET UP VARIABLES GLOBAL TO QUARKS
  381. * SET QSPEED - NUMBER OF FRAMES BETWEEN QUARK MOVES
  382. LDA WAVENUM ;CURRENT WAVE NUMBER
  383. CMP #17 ;ONLY HAVE 17 WAVES IN TABLE
  384. BCC LOOKQSP ;LOOK UP QSPEED FROM TABLE
  385. * WE ARE ABOVE WAVE 17, SET QSPEED TO #QSPMAX
  386. LDA #QSPMAX
  387. STA QSPEED
  388. JMP WSSQ2
  389. LOOKQSP TAY ;PUT WAVE NUMBER IN Y
  390. LDA QSPTBL-1,Y ;LOAD STARTING QSPEED - USE -1 BECAUSE NO WAVE 0
  391. STA QSPEED
  392. WSSQ2 ;DONE WITH QUARKS
  393. **********ENFORCERS AND TANKS
  394. * ENFORCERS: ALLOCATE ENUM NULL ENFORCERS
  395. * (NORMALLY ENUM SHOULD BE SNUM * #SQBIRTHS)
  396. STX EPTR ;POINTER TO START OF ENFORCERS
  397. * ENFORCER LOOP
  398. LDY ENUM ;LOOP THRU ALL ENFORCERS
  399. BNE WSEGO ;AT LEAST 1 ENFORCER - DISTRIBUTE THEM
  400. * NO ENFORCERS
  401. LDA #NULLCODE
  402. STA CRTBL,X ;STORE A NULL OBJECT
  403. INX
  404. JMP WSECONT ;SET UP GLOBAL ENFORCER VARIABLES
  405. WSEGO DEY ;Y RUNS UNTIL NEGATIVE
  406. WSELOOP LDA #NULLCODE
  407. STA CRTBL,X ;STORE NULL OBJECT
  408. INX
  409. DEY
  410. BPL WSELOOP ;MORE ENFORCERS TO ALLOCATE
  411. WSECONT ;SET UP VARIABLES GLOBAL TO ENFORCERS
  412. ;THERE ARE NONE SO FAR
  413. * TANKS -- THEY ACTUALLY EXIST AT START OF WAVE
  414. STX TPTR ;POINTER TO START OF TANKS
  415. LDY TNUM ;LOOP THRU ALL TANKS
  416. BNE WSTGO ;AT LEAST 1 TANK - DISTRIBUTE TANKS
  417. * NO TANKS
  418. LDA #NULLCODE
  419. STA CRTBL,X ;STORE A NULL OBJECT
  420. INX
  421. JMP WSTCONT ;GO TO GLOBAL TANK VARIABLE SETUP
  422. WSTGO DEY ;Y RUNS UNTIL NEGATIVE
  423. WSTLOOP JSR RANDXYBX ;GET A VALID TANK POSITION
  424. LDA RANDOMX
  425. STA XTBL,X ;TANK XPOS
  426. CLC
  427. ADC #TWID ;COMPUTE EXTENT
  428. STA XEXTBL,X ;TANK X EXTENT
  429. LDA RANDOMY
  430. STA YTBL,X ;TANK YPOS
  431. CLC
  432. ADC #THEIGHT ;COMPUTE EXTENT
  433. STA YEXTBL,X ;TANK Y EXTENT
  434. TYA ;USE BRAIN # AS SEED TO GET GOOD DISTRIBUTION OF MOVE TIMERS
  435. AND #MASK3 ;GET A NUMBER 0 - 7
  436. STA MTTBL,X ;NUMBER OF FRAMES UNTIL MOVE
  437. STA DXTBL,X
  438. AND #MASK2
  439. STA SATBL,X
  440. STA DYTBL,X
  441. JSR RANDOM
  442. AND #MASK3
  443. ADC #TSTIME ;BASE TIME BETWEEN TANK SHOTS
  444. STA MISCTBL,X
  445. LDA #TCODE
  446. STA CRTBL,X
  447. * DLPHTBL,DLPLTBL AND DL2PTBL WILL BE SET UP BY THE LOAD AT THE END OF
  448. * THE WAVESTRT ROUTINE
  449. * DONE WITH THIS TANK, ON TO NEXT...
  450. INC CRELEFT ;ANOTHER LIVING CREATURE IS CREATED
  451. INX ;INCREMENT RUNNING POINTER
  452. DEY
  453. BPL WSTLOOP ;MORE TANKS TO SET UP
  454. WSTCONT ;SET UP VARIABLES GLOBAL TO TANKS
  455. * SET TSPEED - NUMBER OF FRAMES BETWEEN TANK MOVES
  456. LDA WAVENUM ;CURRENT WAVE NUMBER
  457. CMP #17 ;ONLY HAVE 17 WAVES IN TABLE
  458. BCC LOOKTSP ;LOOK UP TSPEED FROM TABLE
  459. * WE ARE ABOVE WAVE 17, SET TSPEED TO #TSPMAX
  460. LDA #TSPMAX
  461. STA TSPEED
  462. JMP WST1
  463. LOOKTSP TAY ;PUT WAVE NUMBER IN Y
  464. LDA TSPTBL-1,Y ;LOAD STARTING TSPEED - USE -1 BECAUSE NO WAVE 0
  465. STA TSPEED
  466. WST1 ;DONE WITH TANK SETUP
  467. **********BRAINS
  468. STX BPTR ;POINTER TO START OF BRAINS
  469. LDA FPTR
  470. STA TEMP0 ;POINTER USED TO SET UP TARGETS
  471. LDY BNUM ;LOOP THRU ALL BRAINS
  472. BNE WSBGO ;AT LEAST 1 BRAIN - DISTRIBUTE BRAINS
  473. * NO BRAINS
  474. LDA #NULLCODE
  475. STA CRTBL,X ;STORE A NULL OBJECT
  476. INX
  477. JMP WSBCONT ;GO TO GLOBAL BRAIN VARIABLE SETUP
  478. WSBGO DEY ;Y RUNS UNTIL NEGATIVE
  479. WSBLOOP JSR RANDXYBX ;GET A VALID BRAIN POSITION
  480. LDA RANDOMX
  481. STA XTBL,X ;BRAIN XPOS
  482. CLC
  483. ADC #BWID ;COMPUTE EXTENT
  484. STA XEXTBL,X ;BRAIN X EXTENT
  485. LDA RANDOMY
  486. STA YTBL,X ;BRAIN YPOS
  487. CLC
  488. ADC #BHEIGHT ;COMPUTE EXTENT
  489. STA YEXTBL,X ;BRAIN Y EXTENT
  490. TYA ;USE BRAIN # AS SEED TO GET GOOD DISTRIBUTION OF MOVE TIMERS
  491. AND #MASK3 ;GET A NUMBER 0 - 7
  492. STA MTTBL,X ;NUMBER OF FRAMES UNTIL MOVE
  493. JSR RAND2 ;GET A NUMBER 0 - 2
  494. STA SATBL,X ;BRAIN ANIMATION STEP
  495. JSR RANDOM
  496. AND #MASK3
  497. STA DTTBL,X ;FAMILY SEEK TIMER
  498. STA DXTBL,X ;DIRECTION MOVING
  499. * SELECT TARGET FROM FAMILY OBJECTS AND PUT IT IN DYTBL (0 IF NO FAMILY)
  500. WSBTARG LDA TEMP0
  501. CMP HPTR
  502. BCC WSB02 ;BRANCH IF TEMP0 IS STILL VALID
  503. * RESET TEMP0 TO FPTR
  504. LDA FPTR
  505. STA TEMP0
  506. WSB02 ;NOW PUT TEMP0 INTO DYTBL - BRAIN TARGET
  507. STA DYTBL,X
  508. INC TEMP0
  509. JSR RANDOM
  510. AND #MASK3
  511. ADC BSTIME ;BASE TIME BEFORE BRAINS SHOOT
  512. STA MISCTBL,X ;FRAMES UNTIL SHOOT
  513. LDA #BCODE
  514. STA CRTBL,X ;BRAIN OBJECT CODE
  515. JSR SETSTAT ;FOR DEBUGGING @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  516. * DLPHTBL,DLPLTBL AND DL2PTBL WILL BE SET UP BY THE LOAD AT THE END OF
  517. * THE WAVESTRT ROUTINE
  518. * DONE WITH THIS BRAIN, ON TO NEXT...
  519. INC CRELEFT ;ANOTHER LIVING CREATURE IS CREATED
  520. INX ;INCREMENT RUNNING POINTER
  521. DEY
  522. BPL WSBLOOP ;MORE BRAINS TO SET UP
  523. WSBCONT ;SET UP VARIABLES GLOBAL TO BRAINS
  524. * SET BSTIME AND BSPEED - BRAIN SHOOTING BASE TIME AND
  525. * NUMBER OF FRAMES BETWEEN BRAIN MOVES
  526. LDA WAVENUM ;CURRENT WAVE NUMBER
  527. CMP #15 ;ONLY HAVE 15 WAVES IN TABLE
  528. BCC LOOKBS ;LOOK UP BSTIME AND BSPEED
  529. * WE ARE ABOVE WAVE 15, SET BSTIME=#BSTMAX, BSPEED=#BSPMAX
  530. LDA #BSPMAX
  531. STA BSPEED
  532. LDA #BSTMAX
  533. STA BSTIME
  534. JMP WSB1
  535. LOOKBS TAY ;PUT WAVE NUMBER IN Y
  536. LDA BSPTBL-1,Y ;LOAD STARTING BSTIME - USE -1 BECAUSE NO WAVE 0
  537. STA BSPEED
  538. LDA BSTTBL-1,Y
  539. STA BSTIME
  540. WSB1 ;DONE WITH BRAIN SETUP
  541. ***********PROGS
  542. * PROGS: ALLOCATE PNUM NULL PROGS
  543. STX PPTR ;POINTER TO START OF PROGS
  544. * PROG LOOP
  545. LDY PNUM ;LOOP THRU ALL PROGS
  546. BNE WSPGO ;AT LEAST 1 PROG - DISTRIBUTE THEM
  547. * NO PROGS
  548. LDA #NULLCODE
  549. STA CRTBL,X ;STORE A NULL OBJECT
  550. INX
  551. JMP WSPCONT ;SET UP GLOBAL PROG VARIABLES
  552. WSPGO DEY ;Y RUNS UNTIL NEGATIVE
  553. WSPLOOP LDA #NULLCODE
  554. STA CRTBL,X ;STORE NULL OBJECT
  555. INX
  556. DEY
  557. BPL WSPLOOP ;MORE PROGS TO ALLOCATE
  558. WSPCONT ;SET UP VARIABLES GLOBAL TO PROGS
  559. ;THERE ARE NONE SO FAR
  560. **********MISSILES
  561. STX MPTR ;POINTER TO START OF MISSILES
  562. * COMPUTE NUMBER OF MISSILES TO ALLOCATE: TOTAL OF THE 3 MISSILE TYPES
  563. CLC
  564. LDA EMNUM
  565. ADC CMNUM
  566. ADC TMNUM
  567. TAY ;Y IS INDEX FOR LOOP THRU ALL MISSILES
  568. BNE WSMGO ;AT LEAST 1 MISSILE - DISTRIBUTE THEM
  569. * NO MISSILES
  570. LDA #NULLCODE
  571. STA CRTBL,X ;STORE A NULL OBJECT
  572. INX
  573. JMP WSMCONT ;GO TO GLOBAL MISSILE VARIABLE SETUP
  574. WSMGO DEY ;Y RUNS UNTIL NEGATIVE
  575. WSMLOOP LDA #NULLCODE
  576. STA CRTBL,X ;STORE NULL OBJECT
  577. INX
  578. DEY
  579. BPL WSMLOOP ;MORE PROGS TO ALLOCATE
  580. WSMCONT ;SET UP VARIABLES GLOBAL TO MISSILES
  581. * CURRENTLY WE HAVE NONE TO SET UP
  582. WSM1 ;DONE WITH MISSILE SETUP
  583. *@@@@@@@@@@@@@@@
  584. *@@ THIS IS A HACK TO ELIMINATE LOADER PROBLEMS
  585. *@@@@@
  586. *@@ SET UP NULL THINGS IN EACH ZONE AT THE END OF DISPLAY LIST
  587. JMP SHOOM ;SKIP OVER THIS ;;;;;;;;;;;;;;;;;;
  588. LDA #$01
  589. STA STTBL,X
  590. LDA #$05
  591. STA CRTBL,X
  592. LDA #$B0
  593. STA XTBL,X
  594. LDA #$B5
  595. STA XEXTBL,X
  596. LDA #$01
  597. STA YTBL,X
  598. LDA #$05
  599. STA YEXTBL,X
  600. INX
  601. LDA #$01
  602. STA STTBL,X
  603. LDA #$05
  604. STA CRTBL,X
  605. LDA #$B0
  606. STA XTBL,X
  607. LDA #$B5
  608. STA XEXTBL,X
  609. LDA #$11
  610. STA YTBL,X
  611. LDA #$15
  612. STA YEXTBL,X
  613. INX
  614. LDA #$01
  615. STA STTBL,X
  616. LDA #$05
  617. STA CRTBL,X
  618. LDA #$B0
  619. STA XTBL,X
  620. LDA #$B5
  621. STA XEXTBL,X
  622. LDA #$21
  623. STA YTBL,X
  624. LDA #$25
  625. STA YEXTBL,X
  626. INX
  627. LDA #$01
  628. STA STTBL,X
  629. LDA #$05
  630. STA CRTBL,X
  631. LDA #$B0
  632. STA XTBL,X
  633. LDA #$B5
  634. STA XEXTBL,X
  635. LDA #$31
  636. STA YTBL,X
  637. LDA #$35
  638. STA YEXTBL,X
  639. INX
  640. LDA #$01
  641. STA STTBL,X
  642. LDA #$05
  643. STA CRTBL,X
  644. LDA #$B0
  645. STA XTBL,X
  646. LDA #$B5
  647. STA XEXTBL,X
  648. LDA #$41
  649. STA YTBL,X
  650. LDA #$45
  651. STA YEXTBL,X
  652. INX
  653. LDA #$01
  654. STA STTBL,X
  655. LDA #$05
  656. STA CRTBL,X
  657. LDA #$B0
  658. STA XTBL,X
  659. LDA #$B5
  660. STA XEXTBL,X
  661. LDA #$51
  662. STA YTBL,X
  663. LDA #$55
  664. STA YEXTBL,X
  665. INX
  666. LDA #$01
  667. STA STTBL,X
  668. LDA #$05
  669. STA CRTBL,X
  670. LDA #$B0
  671. STA XTBL,X
  672. LDA #$B5
  673. STA XEXTBL,X
  674. LDA #$61
  675. STA YTBL,X
  676. LDA #$65
  677. STA YEXTBL,X
  678. INX
  679. LDA #$01
  680. STA STTBL,X
  681. LDA #$05
  682. STA CRTBL,X
  683. LDA #$71
  684. LDA #$B0
  685. STA XTBL,X
  686. LDA #$B5
  687. STA XEXTBL,X
  688. STA YTBL,X
  689. LDA #$75
  690. STA YEXTBL,X
  691. INX
  692. LDA #$01
  693. STA STTBL,X
  694. LDA #$05
  695. STA CRTBL,X
  696. LDA #$81
  697. LDA #$B0
  698. STA XTBL,X
  699. LDA #$B5
  700. STA XEXTBL,X
  701. STA YTBL,X
  702. LDA #$85
  703. STA YEXTBL,X
  704. INX
  705. LDA #$01
  706. STA STTBL,X
  707. LDA #$05
  708. STA CRTBL,X
  709. LDA #$91
  710. LDA #$B0
  711. STA XTBL,X
  712. LDA #$B5
  713. STA XEXTBL,X
  714. STA YTBL,X
  715. LDA #$95
  716. STA YEXTBL,X
  717. INX
  718. LDA #$01
  719. STA STTBL,X
  720. LDA #$05
  721. STA CRTBL,X
  722. LDA #$A1
  723. LDA #$B0
  724. STA XTBL,X
  725. LDA #$B5
  726. STA XEXTBL,X
  727. STA YTBL,X
  728. LDA #$A5
  729. STA YEXTBL,X
  730. INX
  731. *@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  732. SHOOM ;;;;;;;;;;;;
  733. *******************
  734. * WE HAVE FINISHED SETTING UP ALL THE OBJECTS IN THE OBJECT DATA TABLES.
  735. *******************
  736. * SET LAST ENTRY IN CRTBL TO $FF
  737. LDA #$FF
  738. STA CRTBL,X
  739. *
  740. **************************
  741. * NOW DO A LOAD WHICH SETS UP THE DISPLAY LIST AND ZONE LIST************
  742. * FOR ALL THE OBJECTS *********
  743. *************************
  744. * FINALLY, READY TO START PLAYING:
  745. RTS ;END OF WAVESTART SUBROUTINE
  746. *
  747. ********************************************************************************
  748. ******************************************
  749. *
  750. * WAVESTMC - SET UP MC-RELATED STUFF AT WAVESTART
  751. *
  752. ******************************************
  753. *
  754. WAVESTMC
  755. * INITIALIZE MC SHOT TABLES AND SHOT TIMER TO ZERO
  756. LDA #$00
  757. STA SDIRTBL ;SET DIRECTION CODE TO ZERO - NULL SHOT
  758. STA SDIRTBL+1
  759. STA SDIRTBL+2
  760. STA SDIRTBL+3
  761. STA SSATBL ;SET SHOT ANIMATION STEPS TO 0
  762. STA SSATBL+1
  763. STA SSATBL+2
  764. STA SSATBL+3
  765. STA MCSTMR ;LET MC SHOOT IMMEDIATELY
  766. STA MCMTMR ;LET MC MOVE IMMEDIATELY
  767. LDA #MCSCODE ;CREATURE TYPE OF MC SHOTS
  768. STA SCRTBL ;SET SHOT CREATURE TYPES
  769. STA SCRTBL+1
  770. STA SCRTBL+2
  771. STA SCRTBL+3
  772. * INITIALIZE MC POSITION AND MAKE HIM APPEAR
  773. LDA #MCXINIT
  774. STA MCXPOS ;MC X POSITION
  775. LDA #MCXINIT+MCWID
  776. STA MCXEX ;MC X EXTENT
  777. LDA #MCYINIT
  778. STA MCYPOS ;MC Y POSITION
  779. LDA #MCYINIT+MCHEIGHT
  780. STA MCYEX ;MC Y EXTENT
  781. LDA #$00
  782. STA SATBL ;MC START ANIMATION STEP
  783. LDA #$0D ;DOWN DIRECTION - D
  784. STA MCDIR ;MC START DIRECTION - SOUTH
  785. LDA #$01
  786. STA MCCTMR ;INITIALIZE MC COLLISION TIMER
  787. *
  788. LDA #$01 ;INITIALIZE STTBL FOR MC @@@@@@@@@@@@@@@@@@@@@@@@@
  789. STA STTBL ; THROWAWAY @@@@@@@@@@@@@@@@@@@@@@@@@@@
  790. *
  791. RTS
  792. *
  793. ********************************************************************************
  794. ********************************************************************************
  795. *% THIS IS FOR DEVELOPMENT OF WAVESTART ROUTINES ONLY
  796. *%
  797. *% USE GLOBAL FIND/REPLACE IN THE EDITOR TO CUSTOMIZE THIS
  798. *% ALSO REMOVE THE *% AT THE BEGINNING OF EACH LINE
  799. *% WITH A F/*%//A
  800. *%
  801. *% CREATURE NAME: CREE
  802. *% CREATURE LETTER: @
  803. *% NUMBER OF WAVES STORED IN TABLE FOR GLOBAL DATA: %%
  804. **********CREES
  805. *% STX @PTR ;POINTER TO START OF CREES
  806. *%
  807. *% LDY @NUM ;LOOP THRU ALL CREES
  808. *% BNE WS@LOOP ;AT LEAST 1 CREE - DISTRIBUTE CREES
  809. * NO CREES
  810. *% LDA #NULLCODE
  811. *% STA CRTBL,X ;STORE A NULL OBJECT
  812. *% INX
  813. *% JMP WS@CONT ;GO TO GLOBAL CREE VARIABLE SETUP
  814. *%
  815. *%WS@LOOP JSR RANDXYBX ;GET A VALID CREE POSITION
  816. *% LDA RANDOMX
  817. *% STA XTBL,X ;CREE XPOS
  818. *% CLC
  819. *% ADC #@WID ;COMPUTE EXTENT
  820. *% STA XEXTBL,X ;CREE X EXTENT
  821. *% LDA RANDOMY
  822. *% STA YTBL,X ;CREE YPOS
  823. *% CLC
  824. *% ADC #@HEIGHT ;COMPUTE EXTENT
  825. *% STA YEXTBL,X ;CREE Y EXTENT
  826. *% TYA ;USE CREE # AS SEED TO GET GOOD DISTRIBUTION OF MOVE TIMERS
  827. *% AND #MASK3 ;GET A NUMBER 0 - 7
  828. *% STA MTTBL,X ;NUMBER OF FRAMES UNTIL MOVE
  829. *% JSR RAND2 ;GET A NUMBER 0 - 2
  830. *% STA SATBL,X ;CREE ANIMATION STEP
  831. *% JSR RANDOM
  832. *% AND #MASK3
  833. *% STA DTTBL,X ;# MOVES UNTIL DIR CHANGE
  834. *% AND #MASK2
  835. *% STA DXTBL,X ;DIRECTION MOVING
  836. *% LDA #@CODE
  837. *% STA CRTBL,X ;CREE OBJECT CODE
  838. * DLPHTBL,DLPLTBL AND DL2PTBL WILL BE SET UP BY THE LOAD AT THE END OF
  839. * THE WAVESTRT ROUTINE
  840. * DONE WITH THIS CREE, ON TO NEXT...
  841. *% INX ;INCREMENT RUNNING POINTER
  842. *% DEY
  843. *% BPL WS@LOOP ;MORE CREES TO SET UP
  844. *%
  845. *%WS@CONT ;SET UP VARIABLES GLOBAL TO CREES
  846. * SET @SPEED - NUMBER OF FRAMES BETWEEN CREE MOVES
  847. *% LDA WAVENUM ;CURRENT WAVE NUMBER
  848. *% CMP #%% ;ONLY HAVE %% WAVES IN TABLE
  849. *% BCC LOOK@SP ;LOOK UP @SPEED FROM TABLE
  850. * WE ARE ABOVE WAVE %%, SET @SPEED TO #@SPMAX
  851. *% LDA #@SPMAX
  852. *% STA @SPEED
  853. *% JMP WS@1
  854. *%LOOK@SP TAY ;PUT WAVE NUMBER IN Y
  855. *% LDA @SPTBL-1,Y ;LOAD STARTING @SPEED - USE -1 BECAUSE NO WAVE
  856. *% STA @SPEED
  857. *%WS@1 ;DONE WITH CREE SETUP
  858. *% THIS IS FOR DEVELOPMENT OF WAVESTART ROUTINES ONLY
  859. *%
  860. *% USE GLOBAL FIND/REPLACE IN THE EDITOR TO CUSTOMIZE THIS
  861. *% ALSO REMOVE THE *% AT THE BEGINNING OF EACH LINE
  862. *% WITH A F/*%//A
  863. *%
  864. *% CREATURE NAME: CREE
  865. *% CREATURE LETTER: @
  866. *% NUMBER OF WAVES STORED IN TABLE FOR GLOBAL DATA: %%
  867. *****************************************
  868. ********** END OF RWAVE.S **************
  869. EJE