Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

392 řádky
5.5KB

  1. .include "skirmish.inc"
  2. .export INIT_GAME
  3. .export UPDATE_GAME
  4. .export REBUILD_OCCUPANCY
  5. .export UNIT_ATTACK
  6. .export ENSURE_SELECTED_UNIT
  7. .import ENEMY_AI_TURN
  8. .importzp input_flags
  9. .importzp game_state
  10. .importzp selected_unit
  11. .importzp turn_counter
  12. .importzp player_units
  13. .importzp enemy_units
  14. .importzp move_dx
  15. .importzp move_dy
  16. .importzp action_result
  17. .importzp temp0
  18. .importzp temp1
  19. .importzp temp2
  20. .importzp temp3
  21. .importzp temp4
  22. .importzp temp5
  23. .import unit_x
  24. .import unit_y
  25. .import unit_hp
  26. .import unit_team
  27. .import grid_occupancy
  28. .segment "CODE"
  29. INIT_GAME:
  30. lda #STATE_PLAYER
  31. sta game_state
  32. lda #0
  33. sta turn_counter
  34. sta action_result
  35. lda #0
  36. sta selected_unit
  37. lda #PLAYER_COUNT
  38. sta player_units
  39. lda #ENEMY_COUNT
  40. sta enemy_units
  41. ldx #0
  42. clear_units:
  43. lda #0
  44. sta unit_x,x
  45. sta unit_y,x
  46. sta unit_hp,x
  47. sta unit_team,x
  48. inx
  49. cpx #UNIT_COUNT
  50. bne clear_units
  51. lda #0
  52. sta unit_x+0
  53. sta unit_x+1
  54. sta unit_x+2
  55. lda #7
  56. sta unit_x+3
  57. sta unit_x+4
  58. sta unit_x+5
  59. lda #1
  60. sta unit_y+0
  61. lda #3
  62. sta unit_y+1
  63. lda #5
  64. sta unit_y+2
  65. lda #1
  66. sta unit_y+3
  67. lda #3
  68. sta unit_y+4
  69. lda #5
  70. sta unit_y+5
  71. lda #3
  72. ldx #0
  73. hp_loop:
  74. sta unit_hp,x
  75. inx
  76. cpx #UNIT_COUNT
  77. bne hp_loop
  78. lda #TEAM_PLAYER
  79. sta unit_team+0
  80. sta unit_team+1
  81. sta unit_team+2
  82. lda #TEAM_ENEMY
  83. sta unit_team+3
  84. sta unit_team+4
  85. sta unit_team+5
  86. jsr REBUILD_OCCUPANCY
  87. rts
  88. UPDATE_GAME:
  89. jsr REBUILD_OCCUPANCY
  90. lda game_state
  91. cmp #STATE_PLAYER
  92. beq update_player
  93. cmp #STATE_ENEMY
  94. beq update_enemy
  95. cmp #STATE_CHECK
  96. beq update_check
  97. jmp update_end
  98. update_player:
  99. jsr ENSURE_SELECTED_UNIT
  100. lda input_flags
  101. and #INPUT_NEXT
  102. beq :+
  103. jsr CYCLE_SELECTED_UNIT
  104. rts
  105. :
  106. lda input_flags
  107. and #INPUT_FIRE
  108. beq :+
  109. jsr CYCLE_SELECTED_UNIT
  110. rts
  111. :
  112. lda input_flags
  113. and #INPUT_WAIT
  114. beq :+
  115. lda #STATE_ENEMY
  116. sta game_state
  117. rts
  118. :
  119. lda #0
  120. sta move_dx
  121. sta move_dy
  122. lda input_flags
  123. and #INPUT_UP
  124. beq :+
  125. lda #$FF
  126. sta move_dy
  127. jmp do_player_action
  128. :
  129. lda input_flags
  130. and #INPUT_DOWN
  131. beq :+
  132. lda #1
  133. sta move_dy
  134. jmp do_player_action
  135. :
  136. lda input_flags
  137. and #INPUT_LEFT
  138. beq :+
  139. lda #$FF
  140. sta move_dx
  141. jmp do_player_action
  142. :
  143. lda input_flags
  144. and #INPUT_RIGHT
  145. beq :+
  146. lda #1
  147. sta move_dx
  148. jmp do_player_action
  149. :
  150. rts
  151. do_player_action:
  152. jsr UNIT_TRY_ACTION
  153. lda action_result
  154. beq :+
  155. lda #STATE_ENEMY
  156. sta game_state
  157. :
  158. rts
  159. update_enemy:
  160. jsr ENEMY_AI_TURN
  161. inc turn_counter
  162. lda #STATE_CHECK
  163. sta game_state
  164. rts
  165. update_check:
  166. jsr CHECK_WIN_LOSE
  167. lda game_state
  168. cmp #STATE_CHECK
  169. bne :+
  170. lda #STATE_PLAYER
  171. sta game_state
  172. :
  173. rts
  174. update_end:
  175. lda input_flags
  176. and #INPUT_RESTART
  177. beq :+
  178. jsr INIT_GAME
  179. :
  180. rts
  181. UNIT_TRY_ACTION:
  182. lda #0
  183. sta action_result
  184. ldx selected_unit
  185. cpx #PLAYER_COUNT
  186. bcs unit_try_done
  187. lda unit_hp,x
  188. beq unit_try_done
  189. lda unit_x,x
  190. clc
  191. adc move_dx
  192. sta temp0
  193. cmp #8
  194. bcs unit_try_done
  195. lda unit_y,x
  196. clc
  197. adc move_dy
  198. sta temp1
  199. cmp #8
  200. bcs unit_try_done
  201. lda temp1
  202. asl
  203. asl
  204. asl
  205. clc
  206. adc temp0
  207. tay
  208. lda grid_occupancy,y
  209. cmp #EMPTY_CELL
  210. beq move_player
  211. tay
  212. lda unit_team,y
  213. cmp #TEAM_ENEMY
  214. bne unit_try_done
  215. ldx selected_unit
  216. jsr UNIT_ATTACK_XY
  217. lda #1
  218. sta action_result
  219. jmp unit_try_done
  220. move_player:
  221. ldx selected_unit
  222. lda temp0
  223. sta unit_x,x
  224. lda temp1
  225. sta unit_y,x
  226. lda #1
  227. sta action_result
  228. unit_try_done:
  229. rts
  230. REBUILD_OCCUPANCY:
  231. ldx #0
  232. clear_grid:
  233. lda #EMPTY_CELL
  234. sta grid_occupancy,x
  235. inx
  236. cpx #64
  237. bne clear_grid
  238. ldx #0
  239. grid_loop:
  240. lda unit_hp,x
  241. beq next_grid_unit
  242. lda unit_y,x
  243. asl
  244. asl
  245. asl
  246. clc
  247. adc unit_x,x
  248. tay
  249. txa
  250. sta grid_occupancy,y
  251. next_grid_unit:
  252. inx
  253. cpx #UNIT_COUNT
  254. bne grid_loop
  255. rts
  256. CHECK_WIN_LOSE:
  257. lda enemy_units
  258. bne :+
  259. lda #STATE_WIN
  260. sta game_state
  261. rts
  262. :
  263. lda player_units
  264. bne :+
  265. lda #STATE_LOSE
  266. sta game_state
  267. rts
  268. :
  269. lda #STATE_CHECK
  270. sta game_state
  271. rts
  272. ENSURE_SELECTED_UNIT:
  273. lda selected_unit
  274. cmp #PLAYER_COUNT
  275. bcs choose_first_player
  276. tax
  277. lda unit_hp,x
  278. bne ensure_done
  279. choose_first_player:
  280. ldx #0
  281. find_alive_player:
  282. lda unit_hp,x
  283. bne found_player
  284. inx
  285. cpx #PLAYER_COUNT
  286. bne find_alive_player
  287. lda #$FF
  288. sta selected_unit
  289. rts
  290. found_player:
  291. stx selected_unit
  292. ensure_done:
  293. rts
  294. CYCLE_SELECTED_UNIT:
  295. lda player_units
  296. beq no_cycle_target
  297. lda selected_unit
  298. cmp #PLAYER_COUNT
  299. bcc :+
  300. lda #$FF
  301. :
  302. clc
  303. adc #1
  304. cmp #PLAYER_COUNT
  305. bcc :+
  306. lda #0
  307. :
  308. sta temp0
  309. ldx #PLAYER_COUNT
  310. cycle_search:
  311. ldy temp0
  312. lda unit_hp,y
  313. bne cycle_found
  314. inc temp0
  315. lda temp0
  316. cmp #PLAYER_COUNT
  317. bcc :+
  318. lda #0
  319. sta temp0
  320. :
  321. dex
  322. bne cycle_search
  323. no_cycle_target:
  324. lda #$FF
  325. sta selected_unit
  326. rts
  327. cycle_found:
  328. sty selected_unit
  329. rts
  330. UNIT_ATTACK:
  331. jsr UNIT_ATTACK_XY
  332. rts
  333. UNIT_ATTACK_XY:
  334. lda unit_hp,y
  335. beq attack_done
  336. sec
  337. sbc #1
  338. sta unit_hp,y
  339. bne attack_done
  340. lda unit_team,y
  341. beq dead_player
  342. dec enemy_units
  343. jmp attack_done
  344. dead_player:
  345. dec player_units
  346. attack_done:
  347. rts

Powered by TurnKey Linux.