📄 menu.s
字号:
include h/mori.h
include ../bios/h/graph.h
public pop_menu
public pop_trade
public goods_inc
public goods_decn
public get_goods1
public clear_attr
public continue_game
public fight_goods
public fight_magic
public all_blood
public all_magic
extrn squre_draw
extrn line_draw
extrn wait_key
extrn refreshmap
extrn write_16x16
extrn write_16x16x
extrn write_32x32x
extrn get_friend_addr
extrn data_string
extrn get_object
extrn bin_10
extrn scroll_to_lcd
extrn start0
extrn check_save
extrn save_file
extrn load_file
extrn next_game
extrn disp_fight
extrn get_head_object
extrn run_juqing0
extrn gblcd12x
extrn gblcd12x_0
extrn mul2
extrn block_draw
extrn exit_door
extrn cheat
extrn bell
__base equ ScreenBuffer+160
define 1,cur_item
define 1,cur_man
define 2,manb_id ;人物的头像id
define 2,money_disp
define 19,level_disp
__base equ money_disp
define 1,start_goods
define 1,cur_goods
define 1,total_goods
define 1,select_goods
define 1,fight_use
define 1,tradelogo
define 9,trade_goods
define 1,total_trade
define 1,sell_flag
__base equ money_disp
define 1,cur_part ;当前部位(头身手角)
define 1,cur_man_sex
define 1,cur_head
define 1,cur_hand
define 1,cur_body
define 1,cur_foot
define 1,head_no
define 1,hand_no
define 1,body_no
define 1,foot_no
define 8,equip_value
__base equ money_disp
define 1,cur_sel ;当前选项
define 1,save_1
define 1,save_2
define 1,cur_save
define 1,save_level
define 1,save_hour
define 1,save_min
__base equ money_disp
define 1,total_magic
define 1,select_magic
define 1,total_man
define 1,select_man
pop_menu:
tsx
stx menu_stack
lm cur_item,#0
sta cur_man
jsr write_menu
pop_menu2:
jsr wait_key
cmp #ESC_KEY
beq menu_rts
SWITCH menu_cmd_len,menu_cmd
jmp pop_menu2
menu_rts:
jmp refreshmap
menu_cmd:
db LEFT_KEY
db RIGHT_KEY
db UP_KEY
db DOWN_KEY
db CR_KEY
menu_cmd_len equ $-menu_cmd
dw proc_left
dw proc_right
dw proc_up
dw proc_down
dw proc_cr
proc_left:
dec cur_item
lda cur_item
bpl proc_left1
lm cur_item,#4
proc_left1:
jsr write_menu
rts
proc_right:
inc cur_item
lda cur_item
cmp #5
bcc proc_right1
lm cur_item,#0
proc_right1:
jsr write_menu
rts
proc_up:
lda cur_man
beq proc_up_rts
dec cur_man
jsr write_menu
proc_up_rts:
rts
proc_down:
ldx cur_man
cpx #3
bcs proc_down_rts
inx
lda friends,x
bmi proc_down_rts
stx cur_man
jsr write_menu
proc_down_rts:
rts
write_menu:
ldy #0
write_menu1:
lda main_menu,y
sta ScreenBuffer,y
iny
cpy #26*6
bcc write_menu1
jsr clear_attr
lda cur_item
asl a
asl a
sec
adc cur_item
sta 8eh
clc
adc #4
sta 90h
CONVP
lda cur_man
jsr get_friend_addr
ldy #PHOTO_OFF
lda (a1),y
sta manb_id
iny
lda (a1),y
sta manb_id+1
ldx #0
ldy #LEVEL_OFF
write_menu3:
lda (a1),y
sta level_disp,x
inx
iny
cpy #HEAD_OFF
bcc write_menu3
ldy #SEX_OFF
lda (a1),y
and #EVIL|SPRITES
bne write_menu4
lda #'T'
sta ScreenBuffer+84
write_menu4:
ldy #STAT_OFF
lda (a1),y
asl a
asl a
tax
lda stat_msg,x
sta ScreenBuffer+131
lda stat_msg+1,x
sta ScreenBuffer+132
lda stat_msg+2,x
sta ScreenBuffer+133
lda stat_msg+3,x
sta ScreenBuffer+134
ldy #NAME_OFF
lda (a1),y
sta ScreenBuffer+105
iny
lda (a1),y
sta ScreenBuffer+106
iny
lda (a1),y
sta ScreenBuffer+107
iny
lda (a1),y
sta ScreenBuffer+108
lm2 money_disp,money
lm2 a6,#main_data
lm2 a7,#money_disp
jsr data_string
jsr gblcd12x
lm2 bank_data_ptr,manb_id
lm x0,#4
lm y0,#18
jsr write_32x32x
jsr draw_bigblock
lm x0,#1
lm x1,#159
lm y0,#13
sta y1
lm lcmd,#1
jsr line_draw
jmp scroll_to_lcd
proc_cr:
lda cur_item
asl a
tax
lm20x a1,func_table
jmp (a1)
use_goods:
lm sell_flag,#0
lda goods_num
beq use_goods_rts
lm start_goods,#0
sta select_goods
jsr disp_one_page
use_goods1:
jsr wait_key
cmp #ESC_KEY
beq use_goods_rts0
SWITCH goods_cmd_len,goods_cmd
lda goods_num
beq use_goods_rts0
jmp use_goods1
use_goods_rts0:
jsr write_menu
use_goods_rts:
rts
fight_goods:
lm fight_use,#0
sta sell_flag
lda goods_num
beq fight_goods_rts
lm start_goods,#0
sta select_goods
jsr disp_one_page
fight_goods1:
jsr wait_key
cmp #ESC_KEY
beq fight_goods_rts0
SWITCH fgoods_cmd_len,fgoods_cmd
lda goods_num
beq fight_goods_rts0
lda fight_use
beq fight_goods1
fight_goods_rts0:
push fight_use
jsr disp_fight
pull fight_use
fight_goods_rts:
lda fight_use
rts
fgoods_cmd:
db LEFT_KEY
db RIGHT_KEY
db UP_KEY
db DOWN_KEY
db UPREC_KEY
db DOWNREC_KEY
db CR_KEY
fgoods_cmd_len equ $-fgoods_cmd
dw goods_left
dw goods_right
dw goods_up
dw goods_down
dw goods_uprec
dw goods_downrec
dw fgoods_use
goods_left:
lda select_goods
sec
sbc #5
bcc goods_left1
sta select_goods
jsr disp_one_page2
goods_left1:
rts
goods_right:
lda select_goods
clc
adc #5
cmp total_goods
bcs goods_right1
sta select_goods
jsr disp_one_page2
goods_right1:
rts
goods_up:
lda select_goods
beq goods_up1
dec select_goods
jsr disp_one_page2
goods_up1:
rts
goods_down:
ldx select_goods
inx
cpx total_goods
bcs goods_down1
inc select_goods
jsr disp_one_page2
goods_down1:
rts
goods_uprec:
lda start_goods
sec
sbc #10
bcc goods_downrec1
goods_uprec0:
sta start_goods
lm select_goods,#0
jmp disp_one_page
goods_downrec:
lda start_goods
clc
adc #10
cmp goods_num
bcc goods_uprec0
goods_downrec1:
rts
goods_dec:
lda select_goods
clc
adc start_goods
asl a
tax
inx
lda my_goods,x
cmp #1
beq goods_del
dec my_goods,x
jmp disp_one_page
goods_del:
lda select_goods
clc
adc start_goods
jsr get_goods
lda data_read_buf+7
ora data_read_buf+8
beq goods_downrec1
lda select_goods
sec
adc start_goods
cmp goods_num
beq goods_del3
goods_del1:
asl a
tax
tay
dey
dey
goods_del2:
lda my_goods,x
sta my_goods,y
inx
iny
cpx #MAX_GOODS*2
bcc goods_del2
goods_del3:
dec goods_num
bne goods_del4
rts
goods_del4:
dec total_goods
bne goods_del5
lm select_goods,#9
lda start_goods
sec
sbc #10
sta start_goods
jmp disp_one_page
goods_del5:
lda select_goods
cmp total_goods
bne goods_del6
dec select_goods
goods_del6:
jmp disp_one_page
if_dead:
lda cur_man
jsr get_friend_addr
ldy #STAT_OFF
lda (a1),y
cmp #3
rts
goods_use:
lda select_goods
clc
adc start_goods
jsr get_goods
lda data_read_buf
cmp #HPADD
bne goods_use10
jsr if_dead
jeq goods_use_rts ;濒死不加血
jsr cmp_hp
jcs goods_use_rts
jsr add_hp
jmp goods_dec
goods_use10:
cmp #MPADD
bne goods_use1
jsr if_dead
jeq goods_use_rts ;濒死不加MP
jsr cmp_mp
jcs goods_use_rts
jsr add_mp
jmp goods_dec
goods_use1:
cmp #REVIVE
bne goods_use11
jsr if_dead
bne goods_use_rts ;非濒死状态
lda #0
sta (a1),y
ldy #MAXHP_OFF+1
lda (a1),y
lsr a
ldy #HP_OFF+1
sta (a1),y
ldy #MAXHP_OFF
lda (a1),y
ror a
ldy #HP_OFF
sta (a1),y
jmp goods_dec
goods_use11:
cmp #SPECIAL
bne goods_use3
ldy #0
goods_use2:
lda data_read_buf,y
sta juqing_buf,y
iny
bne goods_use2
jsr get_head_object
bcc goods_use_rts
cpx juqing_buf+9
bne goods_use_rts
cpy juqing_buf+10
bne goods_use_rts
jsr refreshmap
ldx juqing_buf+11
jsr run_juqing0
ldx menu_stack
txs
rts
goods_use3:
cmp #LIMITADD
bne goods_use4
lda cur_man
jsr get_friend_addr
jsr add_limit
jmp goods_dec
goods_use4:
cmp #TUOLI
bne goods_use_rts
lda door_top
beq goods_use_rts
jsr goods_dec
jsr exit_door
ldx menu_stack
txs
jmp refreshmap
goods_use_rts:
rts
fgoods_use:
lda select_goods
clc
adc start_goods
jsr get_goods
lda data_read_buf
cmp #HPADD
bne fgoods_use1
ldx my_cur_obj
lda my_stat,x
cmp #3
beq fgoods_use_fail ;濒死不加血
jsr fcmp_hp
bcs fgoods_use_fail
jsr fadd_hp
jmp fgoods_ues_end
fgoods_use1:
cmp #MPADD
bne fgoods_use2
ldx my_cur_obj
lda my_stat,x
cmp #3
beq fgoods_use_fail ;濒死不加MP
jsr fcmp_mp
bcs fgoods_use_fail
jsr fadd_mp
jmp fgoods_ues_end
fgoods_use2:
cmp #REVIVE
bne fgoods_use_fail
ldx my_cur_obj
lda my_stat,x
cmp #3
bne fgoods_use_fail ;非濒死状态
lda #0
sta my_stat,x
lda my_cur_obj
asl a
tax
lda my_maxhp+1,x
lsr a
sta my_hp+1,x
lda my_maxhp,x
ror a
sta my_hp,x
fgoods_ues_end:
jsr goods_dec
lm fight_use,#1
fgoods_use_fail:
rts
disp_one_page:
jsr my_cls
lm total_goods,#0
lda start_goods
sta cur_goods
disp_one_page0:
lda cur_goods
cmp goods_num
beq disp_one_page2
jsr get_goods
ldx total_goods
lda goods_addr,x
tax
ldy #1
disp_one_page1:
lda data_read_buf,y
sta ScreenBuffer,x
iny
inx
cpy #7
bcc disp_one_page1
lda #0a1h ;显示×
sta ScreenBuffer,x
inx
lda #0c1h
sta ScreenBuffer,x
inx
lda cur_goods
asl a
tay
iny
lda my_goods,y
sta binbuf
lm binbuf+1,#0
clc
jsr bin_10
inc total_goods
inc cur_goods
lda total_goods
cmp #10
bcc disp_one_page0
disp_one_page2:
lda sell_flag
beq disp_one_page4
ldy #25
disp_one_page3:
lda sell_menu,y
sta ScreenBuffer+26*5,y
dey
bpl disp_one_page3
jsr sell_price
lm2 binbuf,money
ldx #150
clc
jsr bin_10
disp_one_page4:
jsr clear_attr
jsr convert_goods
jsr gblcd12x
jsr draw_bigblock
lm x0,#1
lm x1,#159
lm y0,#65
sta y1
lm lcmd,#1
jsr line_draw
jmp scroll_to_lcd
sell_price:
lda select_goods
clc
adc start_goods
jsr get_goods
lsr2 data_read_buf+7
lm2 binbuf,data_read_buf+7
ldx #136
clc
jmp bin_10
goods_cmd:
db LEFT_KEY
db RIGHT_KEY
db UP_KEY
db DOWN_KEY
db UPREC_KEY
db DOWNREC_KEY
db F2_KEY
db CR_KEY
goods_cmd_len equ $-goods_cmd
dw goods_left
dw goods_right
dw goods_up
dw goods_down
dw goods_uprec
dw goods_downrec
dw goods_del
dw goods_use
my_cls:
ldy #0
lda #20h
my_cls1:
sta ScreenBuffer,y
iny
cpy #26*6
bcc my_cls1
rts
draw_bigblock:
lm x0,#1
lm x1,#159
lm y0,#0
lm y1,#79
lm lcmd,#1
jmp squre_draw
clear_attr:
ldy #24
lda #0
clear_attr1:
sta CharAttr,y
dey
bpl clear_attr1
rts
convert_goods:
ldx select_goods
lda goods_addr,x
sta 8eh
clc
adc #6
sta 90h
CONVP
rts
get_goods:
asl a
tay
lda my_goods,y
get_goods1:
tax
lda #GOODS_CLASS
jsr get_object
jmp ram_get256
cmp_hp:
ldy #HP_OFF+1
lda (a1),y
iny
iny
cmp (a1),y
bne cmp_hp1
ldy #HP_OFF
lda (a1),y
iny
iny
cmp (a1),y
cmp_hp1:
rts
cmp_mp:
ldy #MP_OFF+1
lda (a1),y
iny
iny
cmp (a1),y
bne cmp_mp1
ldy #MP_OFF
lda (a1),y
iny
iny
cmp (a1),y
cmp_mp1:
rts
fcmp_hp:
lda my_cur_obj
asl a
tax
lda my_hp+1,x
cmp my_maxhp+1,x
bne fcmp_hp1
lda my_hp,x
cmp my_maxhp,x
fcmp_hp1:
rts
fcmp_mp:
lda my_cur_obj
asl a
tax
lda my_mp+1,x
cmp my_maxmp+1,x
bne fcmp_mp1
lda my_mp,x
cmp my_maxmp,x
fcmp_mp1:
rts
add_hp:
ldy #HP_OFF
lda (a1),y
clc
adc data_read_buf+9
sta (a1),y
iny
lda (a1),y
adc data_read_buf+10
sta (a1),y
jsr cmp_hp
bcc add_hp1
all_blood:
ldy #MAXHP_OFF
lda (a1),y
ldy #HP_OFF
sta (a1),y
ldy #MAXHP_OFF+1
lda (a1),y
ldy #HP_OFF+1
sta (a1),y
add_hp1:
rts
add_mp:
ldy #MP_OFF
lda (a1),y
clc
adc data_read_buf+9
sta (a1),y
iny
lda (a1),y
adc data_read_buf+10
sta (a1),y
jsr cmp_mp
bcc add_mp1
all_magic:
ldy #MAXMP_OFF
lda (a1),y
ldy #MP_OFF
sta (a1),y
ldy #MAXMP_OFF+1
lda (a1),y
ldy #MP_OFF+1
sta (a1),y
add_mp1:
rts
fadd_hp:
lda my_cur_obj
asl a
tax
lda my_hp,x
clc
adc data_read_buf+9
sta my_hp,x
lda my_hp+1,x
adc data_read_buf+10
sta my_hp+1,x
jsr fcmp_hp
bcc fadd_hp1
lda my_cur_obj
asl a
tax
lda my_maxhp,x
sta my_hp,x
lda my_maxhp+1,x
sta my_hp+1,x
fadd_hp1:
rts
fadd_mp:
lda my_cur_obj
asl a
tax
lda my_mp,x
clc
adc data_read_buf+9
sta my_mp,x
lda my_mp+1,x
adc data_read_buf+10
sta my_mp+1,x
jsr fcmp_mp
bcc fadd_mp1
lda my_cur_obj
asl a
tax
lda my_maxmp,x
sta my_mp,x
lda my_maxmp+1,x
sta my_mp+1,x
fadd_mp1:
rts
add_limit:
ldx data_read_buf+9
ldy limit_table,x
lda (a1),y
clc
adc data_read_buf+10
sta (a1),y
iny
lda (a1),y
adc #0
sta (a1),y
rts
limit_table:
db STR_OFF,DEX_OFF,AGI_OFF
fight_magic:
lm fight_use,#0
lm cur_man,my_cur_man
lm select_magic,#0
sta select_man
jsr disp_magic
beq fight_magic_rts
fight_magic1:
jsr wait_key
cmp #ESC_KEY
beq fight_magic_rts0
SWITCH fmagic_cmd_len,fmagic_cmd
lda fight_use
beq fight_magic1
fight_magic_rts0:
push fight_use
jsr disp_fight
pull fight_use
fight_magic_rts:
lda fight_use
rts
fmagic_cmd:
db LEFT_KEY
db RIGHT_KEY
db UP_KEY
db DOWN_KEY
db UPREC_KEY
db DOWNREC_KEY
db CR_KEY
fmagic_cmd_len equ $-fmagic_cmd
dw magic_left
dw magic_right
dw magic_up
dw magic_down
dw magic_uprec
dw magic_downrec
dw fmagic_use
use_magic:
jsr if_dead
beq use_magic_rts ;死人不能使用魔法
lm select_magic,#0
sta select_man
jsr disp_magic
beq use_magic_rts
use_magic1:
jsr wait_key
cmp #ESC_KEY
beq use_magic_rts0
SWITCH magic_cmd_len,magic_cmd
jmp use_magic1
use_magic_rts0:
jsr write_menu
use_magic_rts:
rts
magic_cmd:
db LEFT_KEY
db RIGHT_KEY
db UP_KEY
db DOWN_KEY
db UPREC_KEY
db DOWNREC_KEY
db CR_KEY
magic_cmd_len equ $-magic_cmd
dw magic_left
dw magic_right
dw magic_up
dw magic_down
dw magic_uprec
dw magic_downrec
dw magic_use
magic_left:
lda select_magic
sec
sbc #6
bcc magic_left1
sta select_magic
jsr disp_magic
magic_left1:
rts
magic_right:
lda select_magic
clc
adc #6
cmp total_magic
bcs magic_right1
sta select_magic
jsr disp_magic
magic_right1:
rts
magic_up:
lda select_magic
beq magic_up1
dec select_magic
jsr disp_magic
magic_up1:
rts
magic_down:
ldx select_magic
inx
cpx total_magic
bcs magic_down1
inc select_magic
jsr disp_magic
magic_down1:
rts
magic_uprec:
lda select_man
beq magic_uprec1
dec select_man
jsr disp_magic
magic_uprec1:
rts
magic_downrec:
ldx select_man
inx
cpx total_man
bcs magic_downrec1
inc select_man
jsr disp_magic
magic_downrec1:
rts
magic_use:
lda cur_man
jsr get_friend_addr
lda #MAGIC_OFF
clc
adc select_magic
tay
lda (a1),y
beq magic_use_rts
tax
lda #MAGIC_CLASS
jsr get_object
jsr ram_get256
ldy #MP_OFF+1
lda (a1),y
bne magic_use1
dey
lda (a1),y
cmp data_read_buf+11
bcc magic_use_rts
magic_use1:
lda data_read_buf+8
cmp #HPADD
bne magic_use_rts
lda select_man
jsr get_friend_addr
ldy #STAT_OFF
lda (a1),y
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -