dos33fsprogs/games/tfv/tfv_battle.s

998 lines
15 KiB
ArmAsm
Raw Normal View History

2021-01-05 20:32:11 +00:00
;================================
; do battle
;================================
2021-01-04 16:53:13 +00:00
2021-01-05 20:32:11 +00:00
do_battle:
2021-01-04 16:53:13 +00:00
2021-01-11 20:20:43 +00:00
lda #34
sta HERO_X
2021-01-12 05:44:03 +00:00
2021-01-11 20:20:43 +00:00
lda #0
sta HERO_STATE
2021-01-12 05:44:03 +00:00
sta MENU_STATE
sta MENU_POSITION
2021-01-11 20:20:43 +00:00
2021-01-12 05:44:03 +00:00
lda #3
sta HERO_LIMIT
2021-01-04 16:53:13 +00:00
2021-01-05 20:32:11 +00:00
jsr rotate_intro
2021-01-04 16:53:13 +00:00
2021-01-12 05:44:03 +00:00
lda #20
sta BATTLE_COUNT
2021-01-04 16:53:13 +00:00
2021-01-05 20:32:11 +00:00
2021-01-12 05:44:03 +00:00
;=============================
; Init Enemy
;=============================
2021-01-05 20:32:11 +00:00
2021-01-12 05:44:03 +00:00
jsr init_enemy
2021-01-05 20:32:11 +00:00
2021-01-11 20:20:43 +00:00
;==========================
; Draw background
2021-01-05 20:32:11 +00:00
2021-01-11 20:20:43 +00:00
;==========================
; Draw sky
2021-01-05 20:32:11 +00:00
2021-01-11 20:20:43 +00:00
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
2021-01-05 20:32:11 +00:00
2021-01-11 20:20:43 +00:00
; Draw some background images for variety?
2021-01-05 20:32:11 +00:00
2021-01-12 05:44:03 +00:00
; update bottom of screen
2021-01-11 20:20:43 +00:00
jsr draw_battle_bottom
2021-01-05 20:32:11 +00:00
2021-01-11 20:20:43 +00:00
main_battle_loop:
2021-01-05 20:32:11 +00:00
2021-01-11 20:20:43 +00:00
jsr gr_copy_to_current
2021-01-05 20:32:11 +00:00
2021-01-11 20:20:43 +00:00
;========================================
; draw our hero
;========================================
2021-01-05 20:32:11 +00:00
2021-01-11 20:20:43 +00:00
lda HERO_HP
beq battle_draw_hero_down
2021-01-05 20:32:11 +00:00
2021-01-11 20:20:43 +00:00
lda HERO_STATE
and #HERO_STATE_RUNNING
bne battle_draw_hero_running
2021-01-05 20:32:11 +00:00
2021-01-11 20:20:43 +00:00
jmp battle_draw_normal_hero
2021-01-05 20:32:11 +00:00
2021-01-11 20:20:43 +00:00
battle_draw_hero_down:
; grsim_put_sprite(tfv_defeat,ax-2,24);
2021-01-05 20:32:11 +00:00
2021-01-11 20:20:43 +00:00
lda HERO_X
sec
sbc #2
sta XPOS
lda #24
sta YPOS
lda #<tfv_defeat_sprite
sta INL
lda #>tfv_defeat_sprite
2021-01-13 20:17:15 +00:00
sta INH
jsr put_sprite_crop
jmp battle_done_draw_hero
2021-01-11 20:20:43 +00:00
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
2021-01-13 05:43:21 +00:00
lda BATTLE_COUNT
2021-01-11 20:20:43 +00:00
and #$8
beq battle_draw_running_walk
battle_draw_running_stand:
lda #<tfv_stand_right_sprite
sta INL
lda #>tfv_stand_right_sprite
2021-01-13 20:17:15 +00:00
sta INH
jsr put_sprite_crop
jmp battle_done_draw_hero
2021-01-11 20:20:43 +00:00
battle_draw_running_walk:
lda #<tfv_walk_right_sprite
sta INL
lda #>tfv_walk_right_sprite
2021-01-12 05:44:03 +00:00
sta INH
jsr put_sprite_crop
2021-01-13 20:17:15 +00:00
jmp battle_done_draw_hero
2021-01-11 20:20:43 +00:00
2021-01-13 20:17:15 +00:00
battle_draw_normal_hero:
; grsim_put_sprite(tfv_stand_left,ax,20);
2021-01-11 20:20:43 +00:00
2021-01-15 04:26:24 +00:00
lda #20
sta HERO_Y
2021-01-13 20:17:15 +00:00
jsr draw_hero_and_sword
2021-01-11 20:20:43 +00:00
battle_done_draw_hero:
2021-01-05 20:32:11 +00:00
2021-01-12 05:44:03 +00:00
;===========================
; draw enemy
;===========================
battle_draw_enemy:
2021-01-05 20:32:11 +00:00
2021-01-12 05:44:03 +00:00
; grsim_put_sprite(enemies[enemy_type].sprite,enemy_x,20);
2021-01-11 20:20:43 +00:00
2021-01-12 05:44:03 +00:00
lda ENEMY_X
sta XPOS
lda #20
sta YPOS
2021-01-13 17:16:20 +00:00
jsr draw_enemy
2021-01-05 20:32:11 +00:00
2021-01-12 05:44:03 +00:00
battle_done_draw_enemy:
2021-01-05 20:32:11 +00:00
2021-01-12 05:44:03 +00:00
;=======================================
; draw bottom status
jsr draw_battle_bottom
;=======================================
; page_flip
jsr page_flip
2021-01-04 16:53:13 +00:00
2021-01-11 20:20:43 +00:00
; pause if dead
2021-01-04 16:53:13 +00:00
2021-01-11 20:20:43 +00:00
; if (hp==0) {
; for(i=0;i<15;i++) usleep(100000);
; break;
; }
; delay for framerate
; usleep(100000);
2021-01-12 05:44:03 +00:00
;=======================
; handle keypresses
2021-01-11 20:20:43 +00:00
jsr get_keypress
2021-01-12 05:44:03 +00:00
sta LAST_KEY
2021-01-11 20:20:43 +00:00
cmp #'Q'
beq done_battle
2021-01-12 05:44:03 +00:00
;========================
; handle enemy attacks
2021-01-04 16:53:13 +00:00
2021-01-12 05:44:03 +00:00
lda ENEMY_COUNT
bne battle_no_enemy_attack
battle_start_enemy_attack:
2021-01-04 16:53:13 +00:00
2021-01-12 05:44:03 +00:00
; attack and decrement HP
jsr enemy_attack
2021-01-04 16:53:13 +00:00
2021-01-12 05:44:03 +00:00
; update limit count
; max out at 4
lda HERO_LIMIT
cmp #4
beq battle_no_inc_limit
2021-01-04 16:53:13 +00:00
2021-01-12 05:44:03 +00:00
inc HERO_LIMIT
battle_no_inc_limit:
2021-01-04 16:53:13 +00:00
2021-01-12 05:44:03 +00:00
; reset enemy time. FIXME: variable?
lda #50
sta ENEMY_COUNT
2021-01-04 16:53:13 +00:00
2021-01-12 05:44:03 +00:00
battle_no_enemy_attack:
dec ENEMY_COUNT
2021-01-04 16:53:13 +00:00
2021-01-12 05:44:03 +00:00
;===============================
; handle battle counter
update_battle_counter:
lda BATTLE_COUNT
cmp #64
bcc inc_battle_count ; blt
2021-01-04 16:53:13 +00:00
2021-01-12 05:44:03 +00:00
; battle timer expired, take action
; If running, escape
; TODO: randomly fail at running? */
lda HERO_STATE
and #HERO_STATE_RUNNING
beq battle_no_escape
2021-01-04 16:53:13 +00:00
2021-01-12 05:44:03 +00:00
; we bravely ran away
jmp done_battle
2021-01-04 16:53:13 +00:00
2021-01-12 05:44:03 +00:00
battle_no_escape:
; activate menu
lda MENU_STATE
cmp #MENU_NONE
bne menu_activated
; move to main menu
lda #MENU_MAIN
sta MENU_STATE
menu_activated:
jsr battle_menu_keypress
jmp done_battle_count
inc_battle_count:
inc BATTLE_COUNT
done_battle_count:
;========================
; check enemy defeated
lda ENEMY_HP
bne end_battle_loop
jsr victory_dance
jmp done_battle
end_battle_loop:
2021-01-04 16:53:13 +00:00
2021-01-11 20:20:43 +00:00
jmp main_battle_loop
2021-01-05 20:32:11 +00:00
2021-01-11 20:20:43 +00:00
done_battle:
jsr clear_bottoms
; running=0; ?
2021-01-05 20:32:11 +00:00
rts
2021-01-13 17:16:20 +00:00
; Metrocat (summon?)
2021-01-05 20:32:11 +00:00
2021-01-13 17:16:20 +00:00
; Environment: grass, beach, forest, ice
2021-01-05 20:32:11 +00:00
2021-01-13 17:16:20 +00:00
; Enemies: HP ATTACK WEAKNESS RESIST
2021-01-05 20:32:11 +00:00
; Killer Crab RND-32 PINCH MALAISE FIRE
; Plain Fish BUBBLE FIRE ICE
; Evil Tree RND-16 LEAVE FIRE ICE
; Wood Elf SING MALAISE BOLT
; Giant Bee RND-64 BUZZSAW ICE NONE
; Procrastinon RND-32 PUTOFF NONE MALAISE
; Ice Fish RND-32 AUGER FIRE ICE
; EvilPenguin WADDLE FIRE ICE
; Battle.
; Forest? Grassland? Artic? Ocean?
; ATTACK REST
; MAGIC LIMIT
; SUMMON RUN
;
; SUMMONS -> METROCAT VORTEXCN
; MAGIC -> HEAL FIRE
; ICE MALAISE
; BOLT
; LIMIT -> SLICE ZAP
; DROP
;
; 1 2 3
;0123456789012345678901234567890123456789|
;----------------------------------------|
; | HP LIMIT | -> FIGHT/LIMIT 21
;KILLER CRAB | DEATER 128/255 128 | ZAP 22
; | | REST 23
; | | RUN AWAY 24
;
;Sound effects?
;
;List hits
;
;****** ** **** **** ** ** ****** **** ****** ****** ******
;** ** **** ** ** ** ** ** ** ** ** ** ** **
;** ** ** **** **** ****** **** ****** ** ****** ******
;** ** ** ** ** ** ** ** ** ** ** ** **
;****** ****** ****** **** ** **** ****** ** ****** **
2021-01-04 16:53:13 +00:00
2021-01-13 17:16:20 +00:00
; Background depend on map location?
; Room for guinea pig in party?
; Attacks -> HIT, ZAP, HEAL, RUNAWAY
;#define MAGIC_NONE 0
;#define MAGIC_FIRE 1
;#define MAGIC_ICE 2
;#define MAGIC_MALAISE 4
;#define MAGIC_BOLT 8
;#define MAGIC_HEAL 16
; struct enemy_type {
; char *name;
; int hp_base,hp_mask;
; char *attack_name;
; int weakness,resist;
; unsigned char *sprite;
;};
2021-01-12 05:44:03 +00:00
;=============================
; Init Enemy
;=============================
init_enemy:
; select type
; random, with weight toward proper terrain
; 50% completely random, 50% terrain based?
; enemy_type=random_8()%0x7;
; enemy_hp=enemies[enemy_type].hp_base+
; (rand()&enemies[enemy_type].hp_mask);
lda #0 ; hardcode crab for now
sta ENEMY_TYPE
sta ENEMY_X
2021-01-13 17:16:20 +00:00
lda #$30 ; BCD
2021-01-12 05:44:03 +00:00
sta ENEMY_HP
lda #30
sta ENEMY_COUNT
lda #<killer_crab_sprite
sta draw_enemy_smc1+1
lda #>killer_crab_sprite
sta draw_enemy_smc2+1
rts
2021-01-04 16:53:13 +00:00
2021-01-05 20:32:11 +00:00
;static struct enemy_type enemies[9]={
; [0]= {
; .name="Killer Crab",
; .hp_base=50,
; .hp_mask=0x1f,
; .attack_name="Pinch",
; .weakness=MAGIC_MALAISE,
; .resist=MAGIC_FIRE,
; .sprite=killer_crab,
; },
; [1]= {
; .name="Plain Fish",
; .hp_base=10,
; .hp_mask=0x1f,
; .attack_name="Bubble",
; .weakness=MAGIC_FIRE,
; .resist=MAGIC_ICE,
; .sprite=plain_fish,
; },
; [2]= {
; .name="Evil Tree",
; .hp_base=10,
; .hp_mask=0x1f,
; .attack_name="Leaves",
; .weakness=MAGIC_FIRE,
; .resist=MAGIC_ICE,
; .sprite=evil_tree,
; },
; [3]= {
; .name="Wood Elf",
; .hp_base=10,
; .hp_mask=0x1f,
; .attack_name="Song",
; .weakness=MAGIC_MALAISE,
; .resist=MAGIC_BOLT|MAGIC_HEAL,
; .sprite=wood_elf,
; },
; [4]= {
; .name="Giant Bee",
; .hp_base=10,
; .hp_mask=0x1f,
; .attack_name="Buzzsaw",
; .weakness=MAGIC_ICE,
; .resist=MAGIC_NONE,
; .sprite=giant_bee,
; },
; [5]= {
; .name="Procrastinon",
; .hp_base=10,
; .hp_mask=0x1f,
; .attack_name="Putoff",
; .weakness=MAGIC_NONE,
; .resist=MAGIC_MALAISE,
; .sprite=procrastinon,
; },
; [6]= {
; .name="Ice Fish",
; .hp_base=10,
; .hp_mask=0x1f,
; .attack_name="Auger",
; .weakness=MAGIC_FIRE,
; .resist=MAGIC_ICE,
; .sprite=ice_fish,
; },
; [7]= {
; .name="Evil Penguin",
; .hp_base=10,
; .hp_mask=0x1f,
; .attack_name="Waddle",
; .weakness=MAGIC_FIRE,
; .resist=MAGIC_ICE,
; .sprite=evil_penguin,
; },
; [8]= {
; .name="Act.Principl",
; .hp_base=10,
; .hp_mask=0x1f,
; .attack_name="BIRDIE",
; .weakness=MAGIC_NONE,
; .resist=MAGIC_ICE|MAGIC_FIRE,
; .sprite=roboknee1,
; },
;};
2021-01-04 16:53:13 +00:00
2021-01-13 17:16:20 +00:00
;===========================
; gr put num
;===========================
; damage in DAMAGE_VAL (BCD)
; location in XPOS,YPOS
2021-01-04 16:53:13 +00:00
2021-01-13 17:16:20 +00:00
gr_put_num:
2021-01-04 16:53:13 +00:00
2021-01-13 17:16:20 +00:00
; digit=number/100;
; if ((digit) && (digit<10)) {
; grsim_put_sprite(numbers[digit],xt,yy);
; xt+=4;
; }
; hundreds=digit;
; left=number%100;
2021-01-04 16:53:13 +00:00
2021-01-13 17:16:20 +00:00
gr_put_num_tens:
; print tens digit
lda DAMAGE_VAL
lsr
lsr
lsr
lsr
; leading zero suppression
beq gr_put_num_ones
asl
tay
lda number_sprites,Y
sta INL
lda number_sprites+1,Y
sta INH
jsr put_sprite_crop
; point to next
lda XPOS
clc
adc #4
sta XPOS
gr_put_num_ones:
; print tens digit
lda DAMAGE_VAL
and #$f
asl
tay
lda number_sprites,Y
sta INL
lda number_sprites+1,Y
sta INH
jsr put_sprite_crop
rts
2021-01-04 16:53:13 +00:00
2021-01-05 20:32:11 +00:00
;
; ATTACK SKIP
; MAGIC LIMIT
; SUMMON ESCAPE
;
; SUMMONS -> METROCAT VORTEXCN
; MAGIC -> HEAL FIRE
2021-01-13 17:16:20 +00:00
; ICE MALAISE
2021-01-05 20:32:11 +00:00
; BOLT
; LIMIT -> SLICE ZAP
2021-01-13 17:16:20 +00:00
; DROP
2021-01-05 20:32:11 +00:00
;
; State Machine
;
; time
; BOTTOM -------> MAIN_MENU ----->ATTACK
; ------->SKIP
; ------->MAGIC_MENU
; ------->LIMIT_MENU
; ------->SUMMON_MENU
; ------->ESCAPE
;
;
2021-01-04 16:53:13 +00:00
2021-01-13 17:16:20 +00:00
; static int enemy_attacking=0;
2021-01-04 16:53:13 +00:00
2021-01-12 05:44:03 +00:00
2021-01-13 17:16:20 +00:00
;=========================
; damage enemy
;=========================
; amount to damage in DAMAGE_VAL
damage_enemy:
lda DAMAGE_VAL
cmp ENEMY_HP
bcs damage_enemy_too_much ; bge
2021-01-12 05:44:03 +00:00
2021-01-13 17:16:20 +00:00
; enemy hp is BCD
sed
2021-01-04 16:53:13 +00:00
2021-01-13 17:16:20 +00:00
sec
lda ENEMY_HP
sbc DAMAGE_VAL
2021-01-04 16:53:13 +00:00
2021-01-13 17:16:20 +00:00
cld
2021-01-04 16:53:13 +00:00
2021-01-13 17:16:20 +00:00
jmp damage_enemy_update
2021-01-04 16:53:13 +00:00
2021-01-13 17:16:20 +00:00
damage_enemy_too_much:
lda #0
2021-01-04 16:53:13 +00:00
2021-01-13 17:16:20 +00:00
damage_enemy_update:
sta ENEMY_HP
2021-01-04 16:53:13 +00:00
2021-01-13 17:16:20 +00:00
rts
2021-01-04 16:53:13 +00:00
2021-01-13 17:16:20 +00:00
;===================
; heal self
;===================
; heal amount in DAMAGE_VAL (yes, I know)
2021-01-04 16:53:13 +00:00
2021-01-13 17:16:20 +00:00
heal_self:
clc
lda HERO_HP
adc DAMAGE_VAL
2021-01-04 16:53:13 +00:00
2021-01-13 17:16:20 +00:00
; check if HP went down, if so we wrapped
2021-01-04 16:53:13 +00:00
2021-01-13 17:16:20 +00:00
cmp HERO_HP
bcc heal_self_max ; blt
bcs heal_self_update
2021-01-04 16:53:13 +00:00
2021-01-13 17:16:20 +00:00
heal_self_max:
lda HERO_HP_MAX
2021-01-04 16:53:13 +00:00
2021-01-13 17:16:20 +00:00
heal_self_update:
sta HERO_HP
rts
;========================
; damage TFV
;========================
; value in DAMAGE_VAL
damage_tfv:
lda DAMAGE_VAL
cmp HERO_HP
bcs damage_hero_too_much ; bge
sec
lda HERO_HP
sbc DAMAGE_VAL
jmp damage_hero_update
damage_hero_too_much:
lda #0
damage_hero_update:
sta HERO_HP
rts
2021-01-04 16:53:13 +00:00
2021-01-13 05:43:21 +00:00
;=========================
; attack
;=========================
attack:
2021-01-13 17:16:20 +00:00
lda #34
sta HERO_X
2021-01-04 16:53:13 +00:00
2021-01-13 17:16:20 +00:00
lda #$10
sta DAMAGE_VAL
2021-01-04 16:53:13 +00:00
2021-01-13 17:16:20 +00:00
attack_loop:
2021-01-04 16:53:13 +00:00
2021-01-13 17:16:20 +00:00
; copy over background
jsr gr_copy_to_current
; draw hero
lda #20
sta YPOS
lda HERO_X
sta XPOS
lsr
bcc attack_draw_walk
attack_draw_stand:
lda #<tfv_stand_left_sprite
sta INL
lda #>tfv_stand_left_sprite
jmp attack_actually_draw
attack_draw_walk:
lda #<tfv_walk_left_sprite
sta INL
lda #>tfv_walk_left_sprite
attack_actually_draw:
sta INH
jsr put_sprite_crop
;=========================
; draw sword
lda HERO_X
sec
sbc #5
sta XPOS
; ypos already 20?
lda #<tfv_led_sword_sprite
sta INL
lda #>tfv_led_sword_sprite
sta INH
jsr put_sprite_crop
;=========================
; draw enemy
lda ENEMY_X
sta XPOS
; ypos already 20?
jsr draw_enemy
;===========================
; draw battle bottom
jsr draw_battle_bottom
;===========================
; page flip
jsr page_flip
dec HERO_X
lda HERO_X
cmp #10 ; repeat until 10
bne attack_loop
;======================
; attack done
;===================
; damage the enemy
jsr damage_enemy
; display damage
lda #2
sta XPOS
lda #10
sta YPOS
jsr gr_put_num
;===================
; page flip
jsr page_flip
; delay
lda #255
jsr WAIT
; restore X value
lda #34
sta HERO_X
2021-01-04 16:53:13 +00:00
2021-01-13 05:43:21 +00:00
rts
2021-01-04 16:53:13 +00:00
2021-01-12 05:44:03 +00:00
;===============================
; enemy attack
;===============================
enemy_attack:
2021-01-04 16:53:13 +00:00
2021-01-12 05:44:03 +00:00
; int ax=enemy_x;
; int damage=10;
2021-01-04 16:53:13 +00:00
2021-01-12 05:44:03 +00:00
; enemy_attacking=1;
2021-01-04 16:53:13 +00:00
2021-01-12 05:44:03 +00:00
; while(ax<30) {
2021-01-04 16:53:13 +00:00
2021-01-05 20:32:11 +00:00
; put attack name on
; occasionally attack with that enemy's power?
; occasionally heal self?
2021-01-04 16:53:13 +00:00
2021-01-12 05:44:03 +00:00
; gr_copy_to_current(0xc00);
2021-01-04 16:53:13 +00:00
2021-01-05 20:32:11 +00:00
; draw first so behind enemy
2021-01-12 05:44:03 +00:00
; grsim_put_sprite(tfv_stand_left,tfv_x,20);
; grsim_put_sprite(tfv_led_sword,tfv_x-5,20);
2021-01-04 16:53:13 +00:00
2021-01-12 05:44:03 +00:00
; if (ax&1) {
2021-01-05 20:32:11 +00:00
; grsim_put_sprite(enemies[enemy_type].sprite,ax,20);
2021-01-12 05:44:03 +00:00
; }
; else {
2021-01-05 20:32:11 +00:00
; grsim_put_sprite(enemies[enemy_type].sprite,ax,20);
2021-01-12 05:44:03 +00:00
; }
2021-01-04 16:53:13 +00:00
2021-01-12 05:44:03 +00:00
; draw_battle_bottom(enemy_type);
2021-01-04 16:53:13 +00:00
2021-01-12 05:44:03 +00:00
; page_flip();
2021-01-04 16:53:13 +00:00
2021-01-12 05:44:03 +00:00
; ax+=1;
2021-01-04 16:53:13 +00:00
2021-01-12 05:44:03 +00:00
; usleep(20000);
; }
; enemy_attacking=0;
2021-01-04 16:53:13 +00:00
2021-01-12 05:44:03 +00:00
; damage_tfv(damage);
; gr_put_num(25,10,damage);
; draw_battle_bottom(enemy_type);
2021-01-04 16:53:13 +00:00
2021-01-12 05:44:03 +00:00
; page_flip();
; usleep(250000);
2021-01-04 16:53:13 +00:00
2021-01-12 05:44:03 +00:00
; return damage;
;}
rts
2021-01-04 16:53:13 +00:00
2021-01-13 17:45:24 +00:00
victory_string:
.byte 13,21,"EXPERIENCE +2",0
.byte 16,22,"MONEY +1",0
2021-01-12 05:44:03 +00:00
;====================================
; victory dance
;====================================
2021-01-04 16:53:13 +00:00
2021-01-12 05:44:03 +00:00
victory_dance:
2021-01-13 17:45:24 +00:00
lda #34
sta HERO_X
2021-01-16 17:58:30 +00:00
lda #20
sta HERO_Y
2021-01-04 16:53:13 +00:00
2021-01-13 17:45:24 +00:00
; update XP and money
inc HERO_XP
inc HERO_XP
inc HERO_MONEY
2021-01-04 16:53:13 +00:00
2021-01-13 17:45:24 +00:00
ldx #25
stx ANIMATE_LOOP
victory_dance_loop:
2021-01-04 16:53:13 +00:00
2021-01-13 17:45:24 +00:00
jsr gr_copy_to_current
2021-01-04 16:53:13 +00:00
2021-01-13 17:45:24 +00:00
jsr clear_bottom
2021-01-04 16:53:13 +00:00
2021-01-13 17:45:24 +00:00
lda #<victory_string
sta OUTL
lda #>victory_string
sta OUTH
jsr move_and_print
jsr move_and_print
2021-01-04 16:53:13 +00:00
2021-01-13 17:45:24 +00:00
txa
and #1
beq victory_wave
2021-01-04 16:53:13 +00:00
2021-01-13 17:45:24 +00:00
victory_stand:
2021-01-04 16:53:13 +00:00
2021-01-16 17:58:30 +00:00
jsr draw_hero_and_sword
2021-01-13 17:45:24 +00:00
jmp victory_draw_done
victory_wave:
2021-01-16 17:58:30 +00:00
jsr draw_hero_victory
2021-01-13 17:45:24 +00:00
victory_draw_done:
jsr page_flip
; delay
lda #255
jsr WAIT
2021-01-04 16:53:13 +00:00
2021-01-13 17:45:24 +00:00
dec ANIMATE_LOOP
bne victory_dance_loop
2021-01-04 16:53:13 +00:00
2021-01-12 05:44:03 +00:00
rts
2021-01-04 16:53:13 +00:00
2021-01-13 05:43:21 +00:00
;=============================
; done attack
;=============================
2021-01-04 16:53:13 +00:00
2021-01-12 05:44:03 +00:00
done_attack:
lda #0
sta BATTLE_COUNT
2021-01-04 16:53:13 +00:00
2021-01-12 05:44:03 +00:00
lda #MENU_NONE
sta MENU_STATE
2021-01-04 16:53:13 +00:00
2021-01-13 05:43:21 +00:00
rts
2021-01-04 16:53:13 +00:00
2021-01-12 05:44:03 +00:00
2021-01-13 17:16:20 +00:00
;================================
; draw enemy
; relies on self-modifying code
; position in XPOS,YPOS
draw_enemy:
draw_enemy_smc1:
lda #$a5
sta INL
draw_enemy_smc2:
lda #$a5
battle_actual_draw_enemy:
sta INH
jmp put_sprite_crop ; tail call
2021-01-12 05:44:03 +00:00
2021-01-16 17:58:30 +00:00
;============================
; draw hero victory
;============================
; draws at HERO_X,HERO_Y
draw_hero_victory:
lda HERO_X
sta XPOS
lda HERO_Y
sta YPOS
lda #<tfv_victory_sprite
sta INL
lda #>tfv_victory_sprite
sta INH
jsr put_sprite_crop
lda HERO_X
sec
sbc #2
sta XPOS
lda #14
sta YPOS
lda #<tfv_led_sword_sprite
sta INL
lda #>tfv_led_sword_sprite
sta INH
jsr put_sprite_crop
rts
2021-01-13 20:17:15 +00:00
;============================
; draw hero and sword
;============================
2021-01-15 04:26:24 +00:00
; draws at HERO_X,HERO_Y
2021-01-13 20:17:15 +00:00
draw_hero_and_sword:
lda HERO_X
sta XPOS
2021-01-15 04:26:24 +00:00
lda HERO_Y
2021-01-13 20:17:15 +00:00
sta YPOS
lda #<tfv_stand_left_sprite
sta INL
lda #>tfv_stand_left_sprite
sta INH
jsr put_sprite_crop
; grsim_put_sprite(tfv_led_sword,ax-5,20);
lda HERO_X
sec
sbc #5
sta XPOS
2021-01-15 04:26:24 +00:00
lda HERO_Y
2021-01-13 20:17:15 +00:00
sta YPOS
lda #<tfv_led_sword_sprite
sta INL
lda #>tfv_led_sword_sprite
sta INH
jsr put_sprite_crop
rts
2021-01-15 02:42:26 +00:00
;=====================
2021-01-13 20:17:15 +00:00
;=====================
; long(er) wait
; waits approximately 10ms * X
2021-01-15 02:42:26 +00:00
;=====================
;=====================
2021-01-13 20:17:15 +00:00
long_wait:
lda #64
jsr WAIT ; delay 1/2(26+27A+5A^2) us, 11,117
dex
bne long_wait
rts
2021-01-12 05:44:03 +00:00
2021-01-05 20:32:11 +00:00