31 | 31 |
|
32 | 32 |
typedef routine
|
33 | 33 |
inputs joy2, button_down, press_fire_msg, dispatch_game_state, save_x,
|
34 | |
actor_pos, pos, new_pos, actor_delta, delta,
|
|
34 |
actor_pos, pos, new_pos, actor_delta, delta, actor_logic,
|
35 | 35 |
screen, screen1, screen2, screen3, screen4, colormap1, colormap2, colormap3, colormap4
|
36 | 36 |
outputs button_down, dispatch_game_state,
|
37 | |
actor_pos, pos, new_pos, actor_delta, delta,
|
|
37 |
actor_pos, pos, new_pos, actor_delta, delta, actor_logic,
|
38 | 38 |
screen, screen1, screen2, screen3, screen4, colormap1, colormap2, colormap3, colormap4
|
39 | |
trashes a, x, y, c, z, n, v, ptr, save_x, compare_target
|
|
39 |
trashes a, x, y, c, z, n, v, ptr, save_x, compare_target, dispatch_logic
|
40 | 40 |
game_state_routine
|
41 | 41 |
|
42 | 42 |
//
|
|
85 | 85 |
|
86 | 86 |
word table[256] actor_delta
|
87 | 87 |
word delta
|
|
88 |
|
|
89 |
vector (logic_routine) table[256] actor_logic
|
|
90 |
vector logic_routine dispatch_logic
|
88 | 91 |
|
89 | 92 |
byte button_down : 0 // effectively static-local to check_button
|
90 | 93 |
byte table[32] press_fire_msg: "PRESS`FIRE`TO`PLAY"
|
|
238 | 241 |
}
|
239 | 242 |
|
240 | 243 |
routine init_game
|
241 | |
inputs actor_pos, actor_delta
|
242 | |
outputs actor_pos, actor_delta, pos
|
|
244 |
inputs actor_pos, actor_delta, actor_logic
|
|
245 |
outputs actor_pos, actor_delta, pos, actor_logic
|
243 | 246 |
trashes a, y, z, n, c, v
|
244 | 247 |
{
|
245 | 248 |
ld y, 0
|
|
247 | 250 |
repeat {
|
248 | 251 |
copy pos, actor_pos + y
|
249 | 252 |
copy word 40, actor_delta + y
|
|
253 |
copy forward enemy_logic, actor_logic + y
|
250 | 254 |
|
251 | 255 |
st off, c
|
252 | 256 |
add pos, word 7
|
|
258 | 262 |
ld y, 0
|
259 | 263 |
copy word 0, actor_pos + y
|
260 | 264 |
copy word 0, actor_delta + y
|
|
265 |
copy forward player_logic, actor_logic + y
|
261 | 266 |
}
|
262 | 267 |
|
263 | 268 |
// ----------------------------------------------------------------
|
|
432 | 437 |
|
433 | 438 |
st x, save_x
|
434 | 439 |
|
435 | |
// FIXME need VECTOR TABLEs to make this happen:
|
436 | |
// copy actor_logic, x dispatch_logic
|
437 | |
// call indirect_jsr_logic
|
438 | |
// For now, just check the actor ID to see what type it is, and go from there.
|
439 | |
|
440 | |
cmp x, 0
|
441 | |
if z {
|
442 | |
call player_logic
|
443 | |
} else {
|
444 | |
call enemy_logic
|
445 | |
}
|
|
440 |
copy actor_logic + x, dispatch_logic
|
|
441 |
call dispatch_logic
|
446 | 442 |
|
447 | 443 |
if c {
|
448 | 444 |
// Player died! Want no dead! Break out of the loop (this is a bit awkward.)
|
449 | 445 |
call clear_screen
|
450 | 446 |
copy forward game_state_game_over, dispatch_game_state
|
451 | 447 |
ld x, 15
|
452 | |
st x, save_x
|
453 | |
trash n
|
454 | |
trash z
|
455 | |
trash x
|
456 | |
} else {
|
|
448 |
} else {
|
|
449 |
ld x, save_x
|
457 | 450 |
trash c
|
458 | 451 |
}
|
459 | |
|
460 | |
ld x, save_x
|
461 | 452 |
|
462 | 453 |
copy pos, actor_pos + x
|
463 | 454 |
copy delta, actor_delta + x
|