mirror of
https://github.com/deater/dos33fsprogs.git
synced 2024-12-27 02:31:00 +00:00
tfv: can attack during battle
This commit is contained in:
parent
94edd9ca01
commit
5a3db0f576
@ -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:
|
||||
|
@ -1,4 +1,4 @@
|
||||
|
||||
proper slowdown/delay in attack
|
||||
simple sound effects when selecting menu
|
||||
maybe gradients on backgrounds
|
||||
|
||||
|
94
games/tfv/number_sprites.inc
Normal file
94
games/tfv/number_sprites.inc
Normal file
@ -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
|
@ -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
|
||||
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
|
||||
|
||||
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
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -56,8 +56,9 @@
|
||||
.include "rotate_intro.s"
|
||||
|
||||
;===============================================
|
||||
; Variables
|
||||
; Graphics
|
||||
;===============================================
|
||||
|
||||
.include "tfv_sprites.inc"
|
||||
.include "number_sprites.inc"
|
||||
.include "graphics_map/tfv_backgrounds.inc"
|
||||
|
@ -139,6 +139,7 @@ MENU_POSITION = $B8
|
||||
MENU_LIMIT_DROP = 2
|
||||
|
||||
LAST_KEY = $B9
|
||||
DAMAGE_VAL = $BA
|
||||
|
||||
COLOR1 = $E0
|
||||
COLOR2 = $E1
|
||||
|
Loading…
Reference in New Issue
Block a user