📄 fight.s
字号:
include h/mori.h
include ../bios/h/graph.h
public fight
public disp_fight
extrn get_object
extrn get_friend_addr
extrn get_goods1
extrn clear_attr
extrn data_string
extrn gblcd12x
extrn update_lcd_0
extrn block_draw
extrn update_lcd
extrn write_ascii
extrn scroll_to_lcd
extrn write_16x16
extrn mul2
extrn random_it
extrn mul41
extrn divid42
extrn get_16x16
extrn write_16x16x
extrn write_32x32x
extrn write_64x64x
extrn disp_num
extrn delay
extrn wait_key
extrn close_screen
extrn open_screen
extrn mul_ax
extrn bin_10
extrn show_talk0
extrn start0
extrn fight_goods
extrn fight_magic
extrn proc_sys_event
fight:
tsx
stx fight_stack
jsr close_screen
lm enemy_gold,#0
sta enemy_gold+1
sta enemy_level
lm a1,#3
fight1:
ldy a1
ldx enemyid,y
jmi fight2
lda #ENEMY_CLASS
jsr get_object
jsr ram_get256
lda a1
tax
asl a
tay
lda data_read_buf
sta enemy_sex,x
bpl fight21
lda fight_set
ora #NOESCAPE ;对boss战不允许逃跑
sta fight_set
fight21:
lda data_read_buf+1
sta enemy_lv,x
cmp enemy_level
bcc fight20
sta enemy_level
fight20:
lda #0
sta enemy_stat,x
lda data_read_buf+2
sta enemy_graph,y
lda data_read_buf+3
sta enemy_graph+1,y
lda data_read_buf+4
sta enemy_size,x
add enemy_gold,data_read_buf+5
lda data_read_buf+7
sta enemy_goods,x
lda data_read_buf+8
sta enemy_at,y
lda data_read_buf+9
sta enemy_at+1,y
lda data_read_buf+10
sta enemy_df,y
lda data_read_buf+11
sta enemy_df+1,y
lda data_read_buf+12
sta enemy_int,y
lda data_read_buf+13
sta enemy_int+1,y
lda data_read_buf+14
clc
adc #100
sta enemy_agi,y
lda data_read_buf+15
adc #0
sta enemy_agi+1,y
lda data_read_buf+16
sta enemy_hp,y
sta enemy_maxhp,y
lda data_read_buf+17
sta enemy_hp+1,y
sta enemy_maxhp+1,y
lda data_read_buf+18
sta enemy_mp,y
sta enemy_maxmp,y
lda data_read_buf+19
sta enemy_mp+1,y
sta enemy_maxmp+1,y
fight2:
dec a1
jpl fight1 ;以上获得敌方数据
lm my_level,#0
lm a3,#3
fight30:
ldy a3
lda friends,y
jmi fight4 ;没有此人
lda a3
jsr get_friend_addr
ldx a3
ldy #LEVEL_OFF
lda (a1),y
cmp my_level
bcc fight31
sta my_level
fight31:
ldy #STAT_OFF
lda (a1),y
sta my_stat,x
ldy #SEX_OFF
lda (a1),y
sta my_sex,x
ldy #MOVE_OFF
lda (a1),y
sta my_photo,x
lda a3
asl a
tax
ldy #HP_OFF
lda (a1),y
sta my_hp,x
iny
lda (a1),y
sta my_hp+1,x
iny
lda (a1),y
sta my_maxhp,x
iny
lda (a1),y
sta my_maxhp+1,x
iny
lda (a1),y
sta my_mp,x
iny
lda (a1),y
sta my_mp+1,x
iny
lda (a1),y
sta my_maxmp,x
iny
lda (a1),y
sta my_maxmp+1,x
iny
lda (a1),y
sta my_at,x
iny
lda (a1),y
sta my_at+1,x
iny
lda (a1),y
sta my_df,x
iny
lda (a1),y
sta my_df+1,x
iny
lda (a1),y
sta my_int,x
iny
lda (a1),y
sta my_int+1,x
iny
lda (a1),y
clc
adc #100
sta my_agi,x
iny
lda (a1),y
adc #0
sta my_agi+1,x
fight3:
iny
sty a3h
lda (a1),y
jsr get_goods1
lda data_read_buf+10
adda2 my_at
lda data_read_buf+11
adda2 my_df
lda data_read_buf+12
adda2 my_int
lda data_read_buf+13
adda2 my_agi
ldy a3h
cpy #FOOT_OFF
bne fight3
fight4:
dec a3
jpl fight30 ;以上获得我方数据
ldy #7
fight5:
lda hp_data,y
sta my_hpdisp,y
lda mp_data,y
sta my_mpdisp,y
dey
bpl fight5
ldy #0
fight6:
lda friends,y
bmi fight7
iny
cpy #4
bcc fight6
fight7:
sty total_my
tya
asl a
tay
lda #0ffh
sta my_hpdisp,y
sta my_mpdisp,y
ldy #0
fight8:
lda enemyid,y
bmi fight9
iny
cpy #4
bcc fight8
fight9:
sty total_enemy
lm my_cur_act,#0ffh
lm enemy_dh,#0
sta enemy_dh+1
sta enemy_dh+2
sta enemy_dh+3
sta my_dh
sta my_dh+1
sta my_dh+2
sta my_dh+3
lm my_cur_man,#80h
jsr disp_fight0
jsr open_screen
lm cur_fighter,#7
fight10:
lda #0
jsr random_it
sta a1
lm a1h,#0
asl2 a1
asl2 a1
asl2 a1
lda cur_fighter
asl a
tax
lm2x0 fighters,a1
dec cur_fighter
bpl fight10
inc cur_fighter
fight12:
lda cur_fighter
cmp #4
bcs fight14
cmp total_enemy
jcs fight17
asl a
tax
clc
lda fighters,x
adc enemy_agi,x
sta fighters,x
lda fighters+1,x
adc enemy_agi+1,x
sta fighters+1,x
lda fighters+1,x
sec
sbc #8 ;与2048比较
bcc fight17
sta fighters+1,x
lda cur_fighter
ora #80h
jsr enemy_attack
jmp fight16
fight14:
and #3
cmp total_my
bcs fight17
asl a
tax
clc
lda fighters+8,x
adc my_agi,x
sta fighters+8,x
lda fighters+9,x
adc my_agi+1,x
sta fighters+9,x
lda fighters+9,x
sec
sbc #8 ;与2048比较
bcc fight17
sta fighters+9,x
lda cur_fighter
and #3
jsr man_attack
fight16:
jsr if_win
fight17:
inc cur_fighter
lda cur_fighter
and #7
sta cur_fighter
jmp fight12
enemy_attack:
sta my_cur_man
and #7fh
tax
lda enemy_stat,x
cmp #3
bne enemy_attack0 ;活的敌人
rts
enemy_attack0:
lm my_cur_act,#0ffh
lda enemy_sex,x
and #ALL_AT
bne enemy_attack1 ;全体攻击
lda total_my
jsr random_it
sta defence_man
jsr get_alive_man ;取活人
jsr cal_attack
lda #0
jmp disp_attack
enemy_attack1:
lm a9,#0
enemy_attack2:
lm defence_man,a9
jsr cal_attack
inc a9
lda a9
cmp total_my
bcc enemy_attack2
lda #1
jmp disp_attack
cal_attack:
lda #100
jsr random_it
cmp #10
bcs cal_attack0
lm a1,#0
sta a1h
jmp cal_attack6
cal_attack0:
jsr get_at
lm2 a2,a1
jsr mul2
lda #20
jsr random_it
clc
adc #90
sta a3
jsr mul41
jsr get_df
jsr divid42
lm2 a3,#300
jsr divid42
jsr adj_10000
lda #90
jsr random_it
cmp #85
bcc cal_attack3
asl a1
rol a1h
cal_attack3:
lda defence_man
bmi cal_attack5
cmp2 a1,#1000
bcc cal_attack4
lm2 a1,#999
cal_attack4:
jmp cal_attack6
cal_attack5:
cmp2 a1,#10000
bcc cal_attack6
lm2 a1,#9999
cal_attack6:
jsr get_hp_addr
ldy #0
lda (a2),y
sec
sbc a1
sta (a2),y
iny
lda (a2),y
sbc a1h
sta (a2),y
bcs cal_attack7
lda #0
sta (a2),y
dey
sta (a2),y
cal_attack7:
ldy #0
lda (a2),y
iny
ora (a2),y
bne cal_attack8
lda defence_man
bmi cal_attack71
tay
lda #3
sta my_stat,y ;设置濒死状态
bne cal_attack72
cal_attack71:
and #3
tay
lda #3
sta enemy_stat,y
cal_attack72:
lda #0ffh ;打死
bne cal_attack9
cal_attack8:
lda a1
ora a1h
beq cal_attack9 ;落空
lda #1
cal_attack9:
tay
lda defence_man
asl a
tax
lm2x0 at_value,a1
txa
lsr a
tax
tya
sta at_result,x
rts
adj_10000:
lda a2
bne cal_attack1
lda a1
ora a1h
bne cal_attack01
lda my_cur_man
bpl adj_10001
and #3
tax
lda enemy_lv,x
sta a1
jsr random_it
sec
adc a1
lsr a
sta a1
jmp cal_attack2
adj_10001:
inc a1
bne cal_attack2
cal_attack01:
cmp2 a1,#10000
bcc cal_attack2
cal_attack1:
lm2 a1,#10000
cal_attack2:
rts
cal_magic:
jsr get_inta
jsr mul2
lda #20
jsr random_it
clc
adc #90
sta a3
jsr mul41
jsr get_intb
jsr divid42
lm2 a3,#100
jsr divid42
jsr adj_10000
jmp cal_attack3
man_attack:
sta my_cur_man
sta my_cur_obj
tax
lda my_stat,x
cmp #3
beq man_attack2 ;濒死
lm defence_man,#80h
jsr get_alive_enemy
lm my_cur_act,#0
jsr disp_fight
man_attack1:
jsr wait_key
SWITCH fight_cmd_len,fight_cmd
bcc man_attack1
man_attack2:
rts
fight_cmd:
db LEFT_KEY
db RIGHT_KEY
db DOWN_KEY
db UPREC_KEY
db DOWNREC_KEY
db CR_KEY
fight_cmd_len equ $-fight_cmd
dw fight_left
dw fight_right
dw fight_next
dw fight_uu
dw fight_dd
dw fight_cr
fight_uu:
dec my_cur_obj
bpl fight_left1
ldx total_my
dex
stx my_cur_obj
jmp fight_left1
fight_dd:
inc my_cur_obj
lda my_cur_obj
cmp total_my
bcc fight_left1
lm my_cur_obj,#0
jmp fight_left1
fight_left:
dec my_cur_act
bpl fight_left1
lda #4
fight_left0:
sta my_cur_act
fight_left1:
jsr disp_fight
pla
pla
clc
rts
fight_right:
inc my_cur_act
lda my_cur_act
cmp #5
bcc fight_left1
lda #0
beq fight_left0
fight_next:
inc defence_man
jsr get_alive_enemy
jmp fight_left1
fight_cr:
lda my_cur_act
bne fight_cr1 ;非攻击
jsr cal_attack
lda #0
jmp disp_attack
fight_cr1:
cmp #4
bne fight_cr2 ;非逃跑
lda fight_set
and #NOESCAPE
bne escape_fail
lda #100
jsr random_it
cmp #65
bcs escape_suc
cmp #35
bcc escape_fail
lda my_level
sec
sbc enemy_level
bcc escape_fail
cmp #5
bcs escape_suc
escape_fail:
rts
escape_suc:
ldx fight_stack
txs
lm _a4,#0
sta _a4+1
jmp upgradex
fight_cr2:
cmp #2
bne fight_cr4 ;非道具
jsr fight_goods
bne fight_cr_rts
fight_cr3:
pla
pla
clc
fight_cr_rts:
rts
fight_cr4:
cmp #3
bne fight_cr5 ;非魔法
jsr fight_magic
beq fight_cr3
lda magic_attr
cmp #HPADD
beq fight_cr_rts
lm2 a2,magic_power
jsr cal_magic
lda #0
jmp disp_magic
fight_cr5:
rts
disp_magic:
bne disp_magic3 ;全体攻击
lda my_cur_man
bpl disp_magic3 ;我方攻击
jsr disp_fight
lm dh_fps,#4
disp_magic1:
lm2 bank_data_ptr,magic_graph
lm x0,#72
lda defence_man
and #2
beq disp_magic2
lda #32
disp_magic2:
sta y0
jsr write_32x32x
jsr scroll_to_lcd
ldx #60
jsr delay
lda #4
adda2 magic_graph
dec dh_fps
bne disp_magic1
ldx #100
jsr delay
rts
disp_magic3:
jsr disp_fight
lm dh_fps,#4
disp_magic4:
lm2 bank_data_ptr,magic_graph
lm x0,#16
lda defence_man
and #3
sta defence_man
bne disp_magic5
lda enemy_size
lsr a
jmp disp_magic8
disp_magic5:
cmp #2
bcc disp_magic6
lda #2
jmp disp_magic8
disp_magic6:
cmp1 enemy_size,#1
bne disp_magic7
lda #2
jmp disp_magic8
disp_magic7:
lda enemy_size+1
disp_magic8:
masl a,4
sta y0
jsr write_32x32x
jsr scroll_to_lcd
ldx #60
jsr delay
lda #4
adda2 magic_graph
dec dh_fps
bne disp_magic4
ldx #100
jsr delay
jmp disp_attack41
if_win:
jsr get_my_alive
beq my_lose
jsr get_enemy_alive
beq my_win
rts
my_lose:
pla
pla
lda fight_set
and #CANLOSE
beq game_over
clc
rts
my_win:
pla
pla
jsr upgrade
sec
rts
game_over:
CLS
ldy #9
game_over1:
lda over_msg,y
sta ScreenBuffer+45,y
dey
bpl game_over1
lm2 lcd_mode,#0ffffh
jsr update_lcd
lm x0,#1
lm x1,#159
lm y0,#0
lm y1,#79
lm lcmd,#2
jsr block_draw
jsr scroll_to_lcd
jsr wait_key
ldx #StackTop
txs
jmp start0
over_msg:
db 'GAME OVER'
upgrade:
add money,enemy_gold
bcc upgrade1
lm2 money,#0ffffh
upgrade1:
lda enemy_level
tax
jsr mul_ax
lm2 _a4,a1
ldy #51
upgrade2:
lda win_msg,y
sta ScreenBuffer,y
dey
bpl upgrade2
ldx #36
clc
jsr bin_10
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -