mirror of
https://github.com/deater/dos33fsprogs.git
synced 2024-11-17 14:12:58 +00:00
615 lines
8.5 KiB
ArmAsm
615 lines
8.5 KiB
ArmAsm
;
|
|
; handle battles
|
|
;
|
|
|
|
;================================
|
|
; do battle
|
|
;================================
|
|
|
|
do_battle:
|
|
|
|
;========================
|
|
; rotate intro
|
|
; this happens first as it stomps on zero page
|
|
|
|
jsr rotate_intro
|
|
|
|
; set start position
|
|
lda #34
|
|
sta HERO_X
|
|
lda #20
|
|
sta HERO_Y
|
|
|
|
; reset state
|
|
lda #0
|
|
sta BATTLE_STATE
|
|
sta MENU_STATE
|
|
sta MENU_POSITION
|
|
sta ENEMY_DEAD
|
|
sta ENEMY_ATTACKING
|
|
sta QUEUED_ATTACK
|
|
|
|
; start battle count part-way in
|
|
lda #20
|
|
sta BATTLE_COUNT
|
|
|
|
;======================
|
|
; update hp and mp
|
|
|
|
jsr update_hero_hp_menu
|
|
jsr update_hero_mp_menu
|
|
|
|
;=============
|
|
; start music
|
|
|
|
lda SOUND_STATUS
|
|
and #SOUND_MOCKINGBOARD
|
|
beq no_mockingboard
|
|
|
|
jsr music_load_fighting
|
|
jsr pt3_init_song
|
|
|
|
cli
|
|
no_mockingboard:
|
|
|
|
;========================
|
|
; zoom to battlefield
|
|
|
|
lda #0
|
|
sta ANIMATE_LOOP
|
|
battlefield_zoom_loop:
|
|
|
|
lda ANIMATE_LOOP
|
|
asl
|
|
tay
|
|
lda plains_animation,Y ; lda #<(plains_battle)
|
|
sta getsrc_smc+1
|
|
lda plains_animation+1,Y ; lda #>(plains_battle)
|
|
sta getsrc_smc+2
|
|
|
|
lda #$c
|
|
|
|
jsr decompress_lzsa2_fast
|
|
|
|
jsr gr_copy_to_current
|
|
|
|
|
|
; sorta zoom in the hero
|
|
|
|
; 8 -> 38,28
|
|
; 9 -> 36,24
|
|
; 10 -> 34,20
|
|
lda ANIMATE_LOOP
|
|
cmp #8
|
|
bcc battlefield_zoom_done_hero
|
|
|
|
sec
|
|
sbc #8
|
|
tay
|
|
|
|
lda hero_zoom_x,Y
|
|
sta HERO_X
|
|
lda hero_zoom_y,Y
|
|
sta HERO_Y
|
|
|
|
jsr draw_hero_and_sword
|
|
|
|
|
|
battlefield_zoom_done_hero:
|
|
; zoom in enemy too? trickier
|
|
|
|
|
|
|
|
jsr page_flip
|
|
|
|
lda #240
|
|
jsr WAIT
|
|
|
|
inc ANIMATE_LOOP
|
|
lda ANIMATE_LOOP
|
|
cmp #11
|
|
bne battlefield_zoom_loop
|
|
|
|
|
|
|
|
|
|
;=============================
|
|
; Init Enemy
|
|
|
|
jsr init_enemy
|
|
|
|
;==========================
|
|
; Draw background
|
|
|
|
; jsr draw_battle_background
|
|
|
|
|
|
; update bottom of screen
|
|
jsr draw_battle_bottom
|
|
|
|
|
|
;========================================
|
|
; main battle loop
|
|
;========================================
|
|
|
|
main_battle_loop:
|
|
|
|
;============================
|
|
; copy background into place
|
|
|
|
jsr gr_copy_to_current
|
|
|
|
;========================================
|
|
; draw our hero
|
|
|
|
; check if hero deal
|
|
lda HERO_HP_HI
|
|
bne hero_not_dead ; hitpoint hi not zero
|
|
lda HERO_HP_LO
|
|
beq battle_draw_hero_down ; hitpoint hi && lo zero
|
|
|
|
; not dead, so draw running or standing
|
|
hero_not_dead:
|
|
lda BATTLE_STATE
|
|
and #BATTLE_STATE_RUNNING
|
|
bne battle_draw_hero_running
|
|
jmp battle_draw_normal_hero
|
|
|
|
battle_draw_hero_down:
|
|
|
|
jsr draw_hero_down
|
|
jmp battle_done_draw_hero
|
|
|
|
battle_draw_hero_running:
|
|
|
|
; grsim_put_sprite(tfv_stand_right,ax,20);
|
|
; grsim_put_sprite(tfv_walk_right,ax,20);
|
|
|
|
lda HERO_X
|
|
sta XPOS
|
|
lda #20
|
|
sta YPOS
|
|
|
|
lda BATTLE_COUNT
|
|
and #$8
|
|
beq battle_draw_running_walk
|
|
|
|
battle_draw_running_stand:
|
|
lda #<tfv_stand_right_sprite
|
|
sta INL
|
|
lda #>tfv_stand_right_sprite
|
|
sta INH
|
|
jsr put_sprite_crop
|
|
jmp battle_done_draw_hero
|
|
|
|
battle_draw_running_walk:
|
|
lda #<tfv_walk_right_sprite
|
|
sta INL
|
|
lda #>tfv_walk_right_sprite
|
|
sta INH
|
|
jsr put_sprite_crop
|
|
jmp battle_done_draw_hero
|
|
|
|
battle_draw_normal_hero:
|
|
; grsim_put_sprite(tfv_stand_left,ax,20);
|
|
|
|
lda #20
|
|
sta HERO_Y
|
|
|
|
jsr draw_battle_hero_and_sword
|
|
|
|
battle_done_draw_hero:
|
|
|
|
;===========================
|
|
; draw enemy
|
|
battle_draw_enemy:
|
|
|
|
; grsim_put_sprite(enemies[enemy_type].sprite,enemy_x,20);
|
|
|
|
lda ENEMY_X
|
|
sta XPOS
|
|
lda #20
|
|
sta YPOS
|
|
|
|
jsr draw_enemy
|
|
|
|
battle_done_draw_enemy:
|
|
|
|
;=======================================
|
|
; draw bottom status
|
|
|
|
jsr draw_battle_bottom
|
|
|
|
;=======================================
|
|
; page_flip
|
|
|
|
jsr page_flip
|
|
|
|
;=======================================
|
|
; handle if dead
|
|
|
|
lda HERO_HP_HI
|
|
bne done_battle_handle_dead
|
|
lda HERO_HP_LO
|
|
bne done_battle_handle_dead
|
|
|
|
; pause for 1.5s
|
|
ldx #15
|
|
jsr long_wait
|
|
|
|
jsr battle_game_over
|
|
|
|
done_battle_handle_dead:
|
|
|
|
|
|
;=======================
|
|
; handle keypresses
|
|
|
|
jsr get_keypress
|
|
sta LAST_KEY
|
|
cmp #'Q'
|
|
bne not_quit
|
|
jmp done_battle
|
|
|
|
|
|
not_quit:
|
|
;========================================
|
|
; delay for framerate
|
|
|
|
lda #50
|
|
jsr WAIT
|
|
|
|
|
|
|
|
;========================
|
|
; handle enemy attacks
|
|
|
|
lda ENEMY_DEAD
|
|
bne battle_done_enemy_attack
|
|
|
|
lda ENEMY_COUNT
|
|
bne battle_no_enemy_attack
|
|
battle_start_enemy_attack:
|
|
|
|
; attack and decrement HP
|
|
jsr enemy_attack
|
|
|
|
battle_no_enemy_attack:
|
|
|
|
dec ENEMY_COUNT ; countdown until attack
|
|
|
|
battle_done_enemy_attack:
|
|
|
|
;===============================
|
|
; handle battle counter
|
|
update_battle_counter:
|
|
lda BATTLE_COUNT
|
|
cmp #64
|
|
bcc inc_battle_count ; blt
|
|
|
|
; battle timer expired, take action
|
|
|
|
; If running, escape
|
|
; TODO: randomly fail at running?
|
|
|
|
lda BATTLE_STATE
|
|
and #BATTLE_STATE_RUNNING
|
|
beq battle_open_menu
|
|
|
|
; we bravely ran away
|
|
jmp done_battle
|
|
|
|
|
|
;======================
|
|
; activate menu
|
|
battle_open_menu:
|
|
|
|
lda MENU_STATE
|
|
cmp #MENU_NONE
|
|
bne menu_activated
|
|
|
|
; move to main menu
|
|
lda #MENU_MAIN
|
|
sta MENU_STATE
|
|
jsr menu_ready_noise
|
|
|
|
menu_activated:
|
|
|
|
jsr battle_menu_keypress
|
|
|
|
jmp done_battle_count
|
|
|
|
inc_battle_count:
|
|
inc BATTLE_COUNT
|
|
|
|
done_battle_count:
|
|
|
|
;========================
|
|
; check enemy defeated
|
|
|
|
; if enemy_hp zero and enemy dead < 10
|
|
lda ENEMY_DEAD
|
|
beq battle_enemy_is_not_dead_yet
|
|
|
|
battle_enemy_is_dead:
|
|
inc ENEMY_DEAD
|
|
lda ENEMY_DEAD
|
|
cmp #15
|
|
bne end_check_enemy_dead
|
|
|
|
jsr victory_dance
|
|
jmp done_battle
|
|
|
|
battle_enemy_is_not_dead_yet:
|
|
lda ENEMY_HP_HI
|
|
bne end_check_enemy_dead
|
|
lda ENEMY_HP_LO
|
|
bne end_check_enemy_dead
|
|
|
|
; make enemy dead
|
|
inc ENEMY_DEAD
|
|
|
|
end_check_enemy_dead:
|
|
|
|
;====================
|
|
; run queued attack
|
|
|
|
lda QUEUED_ATTACK
|
|
beq end_queued_attack
|
|
|
|
cmp #QUEUED_DO_ATTACK
|
|
beq queued_attack_action
|
|
cmp #QUEUED_DO_MAGIC
|
|
beq queued_magic_action
|
|
cmp #QUEUED_DO_LIMIT
|
|
beq queued_limit_action
|
|
cmp #QUEUED_DO_SUMMON
|
|
beq queued_summon_action
|
|
|
|
|
|
jmp end_queued_attack
|
|
|
|
queued_attack_action:
|
|
lda #0
|
|
sta MENU_STATE
|
|
|
|
; attack and decrement HP
|
|
jsr attack
|
|
jsr done_attack
|
|
jmp done_queued_attack
|
|
|
|
queued_magic_action:
|
|
lda #0
|
|
sta MENU_STATE
|
|
jsr magic_attack
|
|
jsr done_attack
|
|
jmp done_queued_attack
|
|
|
|
queued_limit_action:
|
|
lda #0
|
|
sta MENU_STATE
|
|
jsr limit_break
|
|
jsr done_attack
|
|
jmp done_queued_attack
|
|
|
|
queued_summon_action:
|
|
lda #0
|
|
sta MENU_STATE
|
|
jsr summon
|
|
jsr done_attack
|
|
jmp done_queued_attack
|
|
|
|
done_queued_attack:
|
|
lda #0
|
|
sta QUEUED_ATTACK
|
|
|
|
|
|
end_queued_attack:
|
|
|
|
end_battle_loop:
|
|
|
|
jmp main_battle_loop
|
|
|
|
done_battle:
|
|
|
|
jsr clear_bottoms
|
|
|
|
|
|
; disable music
|
|
|
|
lda SOUND_STATUS
|
|
and #SOUND_MOCKINGBOARD
|
|
beq no_mockingboard_end
|
|
|
|
sei
|
|
jsr clear_ay_both
|
|
|
|
no_mockingboard_end:
|
|
|
|
rts
|
|
|
|
battle_game_over:
|
|
rts
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;====================================
|
|
; victory dance
|
|
;====================================
|
|
|
|
victory_dance:
|
|
|
|
|
|
; start music
|
|
|
|
lda SOUND_STATUS
|
|
and #SOUND_MOCKINGBOARD
|
|
beq no_mockingboard_victory
|
|
|
|
sei
|
|
jsr clear_ay_both
|
|
|
|
jsr music_load_victory
|
|
jsr pt3_init_song
|
|
|
|
cli
|
|
no_mockingboard_victory:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
lda #34
|
|
sta HERO_X
|
|
lda #20
|
|
sta HERO_Y
|
|
|
|
; update XP and money
|
|
|
|
inc HERO_XP
|
|
inc HERO_XP
|
|
|
|
inc HERO_MONEY
|
|
|
|
|
|
ldx #25
|
|
stx ANIMATE_LOOP
|
|
victory_dance_loop:
|
|
|
|
jsr gr_copy_to_current
|
|
|
|
jsr clear_bottom
|
|
|
|
lda #<victory_string
|
|
sta OUTL
|
|
lda #>victory_string
|
|
sta OUTH
|
|
jsr move_and_print
|
|
jsr move_and_print
|
|
|
|
txa
|
|
and #1
|
|
beq victory_wave
|
|
|
|
victory_stand:
|
|
|
|
jsr draw_hero_and_sword
|
|
jmp victory_draw_done
|
|
|
|
victory_wave:
|
|
|
|
jsr draw_hero_victory
|
|
|
|
victory_draw_done:
|
|
|
|
jsr page_flip
|
|
|
|
|
|
; delay
|
|
lda #255
|
|
jsr WAIT
|
|
|
|
dec ANIMATE_LOOP
|
|
bne victory_dance_loop
|
|
|
|
rts
|
|
|
|
|
|
victory_string:
|
|
.byte 13,21,"EXPERIENCE +2",0
|
|
.byte 16,22,"MONEY +1",0
|
|
|
|
|
|
.if 0
|
|
;==========================
|
|
;==========================
|
|
; Draw battle background
|
|
;==========================
|
|
;==========================
|
|
draw_battle_background:
|
|
|
|
;==========================
|
|
; Draw sky
|
|
|
|
ldx #0 ; blue from 0 .. 10
|
|
battle_sky_loop:
|
|
lda gr_offsets,X
|
|
sta GBASL
|
|
lda gr_offsets+1,X
|
|
clc
|
|
adc #$8 ; store to $C00
|
|
sta GBASH
|
|
|
|
lda #$66 ; COLOR_MEDIUMBLUE
|
|
ldy #0
|
|
battle_sky_inner:
|
|
sta (GBASL),Y
|
|
iny
|
|
cpy #40
|
|
bne battle_sky_inner
|
|
|
|
inx
|
|
inx
|
|
cpx #10
|
|
bne battle_sky_loop
|
|
|
|
|
|
; green from 10 .. 40
|
|
battle_ground_loop:
|
|
lda gr_offsets,X
|
|
sta GBASL
|
|
lda gr_offsets+1,X
|
|
clc
|
|
adc #$8 ; store to $C00
|
|
sta GBASH
|
|
|
|
lda #$CC ; COLOR_LIGHTGREEN
|
|
; FIXME: should be GROUNDCOLOR
|
|
ldy #0
|
|
battle_ground_inner:
|
|
sta (GBASL),Y
|
|
iny
|
|
cpy #40
|
|
bne battle_ground_inner
|
|
|
|
inx
|
|
inx
|
|
cpx #40
|
|
bne battle_ground_loop
|
|
|
|
; Draw some background images for variety?
|
|
|
|
rts
|
|
.endif
|
|
|
|
|
|
plains_animation:
|
|
.word plains_anim01
|
|
.word plains_anim02
|
|
.word plains_anim03
|
|
.word plains_anim04
|
|
.word plains_anim05
|
|
.word plains_anim06
|
|
.word plains_anim07
|
|
.word plains_anim08
|
|
.word plains_anim09
|
|
.word plains_anim10
|
|
.word plains_battle
|
|
|
|
; 8 -> 38,28
|
|
; 9 -> 36,24
|
|
; 10 -> 34,20
|
|
|
|
hero_zoom_x:
|
|
.byte 38,36,34
|
|
|
|
hero_zoom_y:
|
|
.byte 28,24,20
|
|
|