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
|
|
|
|