From 5a3db0f57636162b1e363c33300e9bac5dd84b1b Mon Sep 17 00:00:00 2001 From: Vince Weaver Date: Wed, 13 Jan 2021 12:16:20 -0500 Subject: [PATCH] tfv: can attack during battle --- games/tfv/Makefile | 2 +- games/tfv/TODO | 2 +- games/tfv/number_sprites.inc | 94 +++++++++ games/tfv/tfv_battle.s | 376 ++++++++++++++++++++++++----------- games/tfv/tfv_world.s | 3 +- games/tfv/zp.inc | 1 + 6 files changed, 359 insertions(+), 119 deletions(-) create mode 100644 games/tfv/number_sprites.inc diff --git a/games/tfv/Makefile b/games/tfv/Makefile index a3902e75..0f6d7a60 100644 --- a/games/tfv/Makefile +++ b/games/tfv/Makefile @@ -66,7 +66,7 @@ TFV_WORLD: tfv_world.o tfv_world.o: tfv_world.s zp.inc \ tfv_overworld.s tfv_drawmap.s tfv_battle.s \ help_overworld.s rotate_intro.s \ - graphics_map/tfv_backgrounds.inc tfv_sprites.inc + graphics_map/tfv_backgrounds.inc tfv_sprites.inc number_sprites.inc ca65 -o tfv_world.o tfv_world.s -l tfv_world.lst graphics_map/tfv_backgrounds.inc: diff --git a/games/tfv/TODO b/games/tfv/TODO index 3a2e4208..728a1cf4 100644 --- a/games/tfv/TODO +++ b/games/tfv/TODO @@ -1,4 +1,4 @@ - +proper slowdown/delay in attack simple sound effects when selecting menu maybe gradients on backgrounds diff --git a/games/tfv/number_sprites.inc b/games/tfv/number_sprites.inc new file mode 100644 index 00000000..1369312e --- /dev/null +++ b/games/tfv/number_sprites.inc @@ -0,0 +1,94 @@ +; Numbers + + +; ****** ** **** **** ** ** ****** **** ****** ****** ****** +; ** ** **** ** ** ** ** ** ** ** ** ** ** ** +; ** ** ** **** **** ****** **** ****** ** ****** ****** +; ** ** ** ** ** ** ** ** ** ** ** ** ** +; ****** ****** ****** **** ** **** ****** ** ****** ** + + +number_sprites: + .word number0_sprite + .word number1_sprite + .word number2_sprite + .word number3_sprite + .word number4_sprite + .word number5_sprite + .word number6_sprite + .word number7_sprite + .word number8_sprite + .word number9_sprite + .word numberX_sprite + .word numberX_sprite + .word numberX_sprite + .word numberX_sprite + .word numberX_sprite + .word numberX_sprite + + +number0_sprite: + .byte $3,$3 + .byte $55,$A5,$55 + .byte $55,$AA,$55 + .byte $A5,$A5,$A5 + +number1_sprite: + .byte $3,$3 + .byte $5A,$55,$AA + .byte $AA,$55,$AA + .byte $A5,$A5,$A5 + +number2_sprite: + .byte $3,$3 + .byte $A5,$A5,$5A + .byte $5A,$A5,$A5 + .byte $A5,$A5,$A5 + +number3_sprite: + .byte $3,$3 + .byte $A5,$A5,$5A + .byte $A5,$A5,$5A + .byte $A5,$A5,$AA + +number4_sprite: + .byte $3,$3 + .byte $55,$AA,$55 + .byte $A5,$A5,$55 + .byte $AA,$AA,$A5 + +number5_sprite: + .byte $3,$3 + .byte $55,$A5,$A5 + .byte $A5,$A5,$5A + .byte $A5,$A5,$AA + +number6_sprite: + .byte $3,$3 + .byte $5A,$A5,$A5 + .byte $55,$A5,$55 + .byte $A5,$A5,$A5 + +number7_sprite: + .byte $3,$3 + .byte $A5,$A5,$55 + .byte $AA,$55,$AA + .byte $AA,$A5,$AA + +number8_sprite: + .byte $3,$3 + .byte $55,$A5,$55 + .byte $55,$A5,$55 + .byte $A5,$A5,$A5 + +number9_sprite: + .byte $3,$3 + .byte $55,$A5,$55 + .byte $A5,$A5,$55 + .byte $AA,$AA,$A5 + +numberX_sprite: + .byte $3,$3 + .byte $55,$55,$55 + .byte $55,$55,$55 + .byte $55,$55,$55 diff --git a/games/tfv/tfv_battle.s b/games/tfv/tfv_battle.s index c1ea44df..4968160f 100644 --- a/games/tfv/tfv_battle.s +++ b/games/tfv/tfv_battle.s @@ -190,15 +190,7 @@ battle_draw_enemy: lda #20 sta YPOS -draw_enemy_smc1: - lda #$a5 - sta INL -draw_enemy_smc2: - lda #$a5 - -battle_actual_draw_enemy: - sta INH - jsr put_sprite_crop + jsr draw_enemy battle_done_draw_enemy: @@ -320,17 +312,11 @@ done_battle: rts -.if 0 +; Metrocat (summon?) +; Environment: grass, beach, forest, ice -; Do Battle */ - - -; Metrocat (summon?) */ - -; Environment: grass, beach, forest, ice */ - -; Enemies: HP ATTACK WEAKNESS RESIST */ +; Enemies: HP ATTACK WEAKNESS RESIST ; Killer Crab RND-32 PINCH MALAISE FIRE ; Plain Fish BUBBLE FIRE ICE @@ -374,28 +360,25 @@ done_battle: ;** ** ** ** ** ** ** ** ** ** ** ** ** ;****** ****** ****** **** ** **** ****** ** ****** ** -static int battle_bar=0; -static int susie_out=0; +; Background depend on map location? +; Room for guinea pig in party? -; 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 -; 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; +;}; -struct enemy_type { - char *name; - int hp_base,hp_mask; - char *attack_name; - int weakness,resist; - unsigned char *sprite; -}; -.endif ;============================= ; Init Enemy @@ -415,7 +398,7 @@ init_enemy: sta ENEMY_TYPE sta ENEMY_X - lda #200 + lda #$30 ; BCD sta ENEMY_HP lda #30 @@ -428,7 +411,6 @@ init_enemy: rts -.if 0 ;static struct enemy_type enemies[9]={ ; [0]= { @@ -514,30 +496,66 @@ init_enemy: ; }, ;}; -static int gr_put_num(int xx,int yy,int number) { - int xt=xx,digit,left,hundreds; + ;=========================== + ; gr put num + ;=========================== + ; damage in DAMAGE_VAL (BCD) + ; location in XPOS,YPOS - digit=number/100; - if ((digit) && (digit<10)) { - grsim_put_sprite(numbers[digit],xt,yy); - xt+=4; - } - hundreds=digit; - left=number%100; +gr_put_num: - digit=left/10; - if ((digit) || (hundreds)) { - grsim_put_sprite(numbers[digit],xt,yy); - xt+=4; - } - left=number%10; - digit=left; - grsim_put_sprite(numbers[digit],xt,yy); +; digit=number/100; +; if ((digit) && (digit<10)) { +; grsim_put_sprite(numbers[digit],xt,yy); +; xt+=4; +; } +; hundreds=digit; +; left=number%100; - return 0; -} +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 ; ; ATTACK SKIP @@ -546,10 +564,10 @@ static int gr_put_num(int xx,int yy,int number) { ; ; SUMMONS -> METROCAT VORTEXCN ; MAGIC -> HEAL FIRE - ; ICE MALAISE +; ICE MALAISE ; BOLT ; LIMIT -> SLICE ZAP - ; DROP +; DROP ; ; State Machine ; @@ -563,19 +581,8 @@ static int gr_put_num(int xx,int yy,int number) { ; ; -#define MENU_NONE 0 -#define MENU_MAIN 1 -#define MENU_MAGIC 2 -#define MENU_SUMMON 3 -#define MENU_LIMIT 4 +; static int enemy_attacking=0; -static int enemy_attacking=0; -static int menu_state=MENU_NONE; -static int menu_position=0; -static int battle_count=0; - - -.endif battle_enemy_string: .byte 0,21,"KILLER CRAB",0 @@ -1066,72 +1073,192 @@ done_bar: -.if 0 + ;========================= + ; damage enemy + ;========================= + ; amount to damage in DAMAGE_VAL +damage_enemy: + lda DAMAGE_VAL + cmp ENEMY_HP + bcs damage_enemy_too_much ; bge + ; enemy hp is BCD + sed -static int damage_enemy(int value) { + sec + lda ENEMY_HP + sbc DAMAGE_VAL - if (enemy_hp>value) enemy_hp-=value; - else enemy_hp=0; + cld - return 0; + jmp damage_enemy_update -} +damage_enemy_too_much: + lda #0 -static int heal_self(int value) { +damage_enemy_update: + sta ENEMY_HP - hp+=value; - if (hp>max_hp) hp=max_hp; + rts - return 0; + ;=================== + ; heal self + ;=================== + ; heal amount in DAMAGE_VAL (yes, I know) -} +heal_self: + clc + lda HERO_HP + adc DAMAGE_VAL + ; check if HP went down, if so we wrapped -static int damage_tfv(int value) { + cmp HERO_HP + bcc heal_self_max ; blt + bcs heal_self_update - if (hp>value) hp-=value; - else hp=0; +heal_self_max: + lda HERO_HP_MAX - return 0; +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 -} -.endif ;========================= ; attack ;========================= attack: -; int ax=34; -; int damage=10; + lda #34 + sta HERO_X -; while(ax>10) { + lda #$10 + sta DAMAGE_VAL -; gr_copy_to_current(0xc00); +attack_loop: -; if (ax&1) { -; grsim_put_sprite(tfv_stand_left,ax,20); -; } -; else { -; grsim_put_sprite(tfv_walk_left,ax,20); -; } -; grsim_put_sprite(tfv_led_sword,ax-5,20); -; -; grsim_put_sprite(enemies[enemy_type].sprite,enemy_x,20); -; -; draw_battle_bottom(enemy_type); -; -; page_flip(); -; -; ax-=1; -; -; usleep(20000); -; } -; -; damage_enemy(damage); -; gr_put_num(2,10,damage); -; page_flip(); -; usleep(250000); + ; 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 + jmp attack_actually_draw + +attack_draw_walk: + 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 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 rts @@ -1979,6 +2106,23 @@ keypress_summon_action: rts + ;================================ + ; 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 + diff --git a/games/tfv/tfv_world.s b/games/tfv/tfv_world.s index ee052365..0fadb777 100644 --- a/games/tfv/tfv_world.s +++ b/games/tfv/tfv_world.s @@ -56,8 +56,9 @@ .include "rotate_intro.s" ;=============================================== -; Variables +; Graphics ;=============================================== .include "tfv_sprites.inc" +.include "number_sprites.inc" .include "graphics_map/tfv_backgrounds.inc" diff --git a/games/tfv/zp.inc b/games/tfv/zp.inc index 2658a37a..d23d53b0 100644 --- a/games/tfv/zp.inc +++ b/games/tfv/zp.inc @@ -139,6 +139,7 @@ MENU_POSITION = $B8 MENU_LIMIT_DROP = 2 LAST_KEY = $B9 +DAMAGE_VAL = $BA COLOR1 = $E0 COLOR2 = $E1