HOLEHIT.S 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. ; HOLEHIT.S
  2. ; THIS ROUTINE TESTS TO SEE IF ANY OF THE CHARACTERS HAVE RUN INTO
  3. ; A HOLE.
  4. ; IT'S SLIGHTLY DIFFERENT FROM THE "FOODHIT" ROUTINE, BECAUSE IT
  5. ; MUST TEST THE CHARACTERS' FEET, RATHER THAN THE ENTIRE CHARACTER.
  6. ; THE TABLE "CHARHITE" CONTAINS A VALUE TO BE SUBTRACTED FROM EACH
  7. ; CHARACTERS' Y COORDINATE TO TEST AGAINST THE HOLE'S DELTA BOX.
  8. ; THE OUTER LOOP INDEX, X, IS FOR THE CHARACTER TABLE (5 CHARS X 2 ENTRIES EA)
  9. ; THE INNER LOOP (INDEX Y) GOES THROUGH ALL THE HOLES.
  10. GLBL HOLEHIT
  11. GLBL MKAREJOY,MKREJOY
  12. GLBL MKDIE
  13. GLBL TUNIN
  14. GLBL CREATOR,FALLING,LEAVING,RLEAVING,NUMHOLES
  15. GLBL FYPOS,DYHOLE,FXPOS,DXHOLE,CARRYING
  16. GLBL HELDFOOD,FEETFALL,STATDIEH,CSECOND
  17. GLBL FSPEED,CACOUNT,CFRAME,ADDSCORE,RISEPALW,CPALW,HATHITE
  18. GLBL HEADHITE,RUNNING,CSPEED,REJOYING,CHHEADS,CSTAMP,CHEFSTRT
  19. GLBL FEETRISE
  20. GLBL CCRUNL
  21. GLBL TRUE,FINFO,HOLEUSED
  22. GLBL FSTATE
  23. GLBL CHARHITE,FALLSND
  24. GLBL ERASEIT
  25. GLBL GOD
  26. HOLESTRT EQU $11
  27. RAMDEF ; ZERO PAGE
  28. RSEG CODE3
  29. HOLEHIT LDX #12 ; INDEX OF LAST CHEF
  30. HHLOOP1 LDA CREATOR,X
  31. BEQ HHSKIP1 ; DON'T LET HIM DIE IF IT'S NOT ZERO
  32. HHNXTJMP JMP HHNXTCH
  33. HHSKIP1 LDA CYPOS,X ; IF ZERO, HE'S NOT VISIBLE
  34. ; BNE HHSKIP2 ; GO ON TO NEXT CHARACTER
  35. BEQ HHNXTJMP
  36. HHSKIP2 LDA CSTATE,X ; SEE IF HE'S ALREADY FALLING
  37. CMP #FALLING ; THE THREE FALLING STATES ARE
  38. ; BMI HHSKIP3 ; ALL GREATER THAN "FALLING"
  39. BPL HHNXTJMP ; AS ARE THE RISING STATES
  40. HHSKIP3 CMP #LEAVING
  41. ; BNE HHSKIP4
  42. BEQ HHNXTJMP
  43. HHSKIP4 LDA CYPOS,X
  44. SEC ; ELSE FIND FEET
  45. SBC CHARHITE,X
  46. STA TEMP1 ; THIS LOCATION IS TO BE TESTED
  47. LDA CXPOS,X
  48. SEC
  49. SBC #2
  50. STA TEMP0 ; TESTED X LOCATION
  51. LDY #NUMHOLES+HOLESTRT ; START AT LAST HOLE AND DECREMENT
  52. DEY ; THE LAST INDEX IS ONE LESS
  53. HHLOOP2 LDA FSTATE,Y ; IF "CLOSED" (ZERO), SKIP IT
  54. BEQ HHNXTHL ; IF NOT VISIBLE, STATE==CLOSED
  55. LDA FYPOS,Y ; HOLE Y
  56. SEC
  57. SBC TEMP1 ; FEET Y
  58. BPL HHYPOS ; Y DIFF POSITIVE
  59. EOR #$FF ; ELSE, DO TWO'S COMPLEMENT
  60. CLC
  61. ADC #1
  62. HHYPOS CMP #DYHOLE
  63. ; BMI HHXTST ; GO ON TO CHECK X
  64. BPL HHNXTHL ; ELSE, DO NEXT HOLE
  65. HHXTST LDA FXPOS,Y
  66. SEC
  67. SBC TEMP0 ; CHARACTER X
  68. BPL HHXPOS ; X DIFF POSITIVE
  69. EOR #$FF ; ELSE, TWO'S COMPLEMENT
  70. CLC
  71. ADC #1
  72. HHXPOS CMP #DXHOLE
  73. BPL HHNXTHL
  74. ; We end up here if he's falling in the hole. Find out whether its the hero
  75. ; or a chef, and branch accordingly.
  76. HLKILL
  77. TXA ; CHARACTER INDEX
  78. ; BNE HCHFALL if not 0, it's a chef
  79. BEQ MKHFALL else, it's charley
  80. HCHFALL JMP MKFALL ; MAKE THIS CHEF FALL
  81. HHNXTHL DEY ; TEST FOR END OF HOLE LOOOP
  82. TYA
  83. CMP #HOLESTRT
  84. BPL HHLOOP2 ; IF POSITIVE, MORE HOLES
  85. ; ELSE GO ON TO NEXT CHARACTER
  86. HHNXTCH DEX
  87. DEX
  88. DEX
  89. BMI HHBYE
  90. JMP HHLOOP1
  91. HHBYE RTS
  92. MKHFALL LDA #8
  93. JSR TUNIN
  94. JSR MKDIE ; DO GENERIC DEATH STUFF ("CHEFHIT.S")
  95. LDA #FEETFALL
  96. STA CSTATE
  97. LDA #STATDIEH ; SO THE CHEFS WILL REJOICE
  98. STA STATUS
  99. LDA FYPOS,Y ; HOLE Y POSITION
  100. CLC
  101. ADC #4
  102. STA CYPOS ; ADJUST HERO'S Y COORD.
  103. SEC
  104. SBC #$10
  105. STA CYPOS+1 ; FEET COORDINATE
  106. LDA FXPOS,Y ; HOLE X POS.
  107. CLC
  108. ADC #2
  109. STA CXPOS
  110. STA CXPOS+1
  111. LDA #$FF ; RANDOM NON-ZERO VALUE
  112. STA CSECOND+1 ; ONLY FIRST ZONE OF FEET
  113. LDA #FSPEED ; ANIMATE TIMER
  114. STA CACOUNT
  115. LDA FYPOS,Y
  116. SEC
  117. SBC #14 ; SCAN LINE WHERE STAMPS DISSAPPEAR
  118. STA CFRAME
  119. PLA
  120. PLA ; pop the return address off stack
  121. ENDCYCLE go back to GOD so that CONEHIT
  122. ; doesn't run
  123. ; THIS ROUTINE IS ISOMORPHIC TO THE ABOVE ROUTINE; IT'S USED TO MAKE
  124. ; A CHEF BEGIN HIS FALL INTO AN OPEN MANHOLE.
  125. MKFALL STX TEMPX
  126. LDX #2 ; 200 POINTS
  127. JSR ADDSCORE
  128. LDX TEMPX
  129. LDA FALLSND,X
  130. JSR TUNIN
  131. LDA #TRUE ; HOLE IS IN USE DURING FALL
  132. STA FINFO,Y
  133. TYA
  134. STA HOLEUSED,X
  135. LDA RISEPALW-3,X ; CHANGE CHEF COLOR WHILE FALLING
  136. STA CPALW,X ; AND RISING
  137. LDA RISEPALW-2,X
  138. STA CPALW+1,X
  139. LDA RISEPALW-1,X
  140. STA CPALW+2,X
  141. LDA CSTATE,X
  142. CMP #CARRYING
  143. BEQ MKF001
  144. JMP MKF002
  145. MKF001 LDA HELDFOOD,X ; GET CARRIED FOOD
  146. STX TEMPX ; SAVE INDEX
  147. TAX ; FOOD INDEX
  148. LDA #0
  149. STA CYPOS,X
  150. LDX TEMPX ; RESTORE INDEX
  151. MKF002 LDA #FEETFALL ; START OUT WITH FEET FALLING
  152. STA CSTATE,X
  153. LDA FYPOS,Y ; HOLE POSITION
  154. CLC
  155. ADC #4 ; TOP OF HAT
  156. STA CYPOS,X ; HAT POSITION
  157. SEC
  158. SBC #HATHITE
  159. STA CYPOS+1,X ; HEAD POSITION
  160. SEC
  161. SBC #HEADHITE
  162. STA CYPOS+2,X ; FEET POSITION
  163. LDA FXPOS,Y ; HOLE X POSITION
  164. CLC
  165. ADC #2
  166. STA CXPOS,X
  167. STA CXPOS+2,X ; FEET
  168. CLC
  169. ADC #1
  170. STA CXPOS+1,X ; HEAD
  171. LDA #$FF ; MAKE THE FEET SECOND HALF INVISO
  172. STA CSECOND+2,X
  173. LDA #FSPEED
  174. STA CACOUNT,X
  175. LDA FYPOS,Y ; HOLE Y
  176. SEC
  177. SBC #14
  178. STA CFRAME,X ; BOTTOM OF THE ZONE
  179. JMP HHNXTCH test the next chef
  180. ; THIS ROUTINE IS ALSO CALLED FROM "CHEFHIT"-- "HEROKILL"
  181. MKAREJOY
  182. LDX #12
  183. ZMKR001 JSR MKREJOY
  184. NXTMRCH DEX
  185. DEX
  186. DEX
  187. CPX #CHEFSTRT
  188. BPL ZMKR001
  189. MRBYE RTS
  190. ; MAKES THE CHEF IN "X" REJOICE.
  191. MKREJOY LDA CSTATE,X
  192. CMP #RUNNING ; ONLY DO IT IF HE'S VISIBLE
  193. BEQ ZMKR0010
  194. CMP #CARRYING
  195. BEQ ZMKR0020
  196. CMP #FEETRISE
  197. BEQ ZMKR0010
  198. CMP #LEAVING if he's leaving, make him be rleaving
  199. ; BEQ ZMKR0011
  200. BNE MRBYE ; RTS
  201. ; RTS no rejoice for this chef
  202. ZMKR0011 LDA #RLEAVING
  203. STA CSTATE,X
  204. BNE ZMKR0012 a jump
  205. ZMKR0020 JSR ERASEIT erases carried food
  206. ; in FOODHIT.S
  207. ZMKR0010 LDA #REJOYING
  208. STA CSTATE,X
  209. ZMKR0012 LDA #3
  210. STA CSPEED,X
  211. ASL A
  212. STA CFRAME+1,X
  213. LDA CHHEADS+4 ; FACE FORWARD (DOWN)
  214. STA CSTAMP+1,X
  215. LDA #1
  216. STA CACOUNT,X
  217. DEC CXPOS+2,X ; SHIFT ARMS LEFT 1 PIXEL
  218. RTS
  219. END