peasant: auto-generate the verb lookup table

This commit is contained in:
Vince Weaver 2021-10-19 23:56:02 -04:00
parent c122842bf3
commit 0bccb44c8a
5 changed files with 439 additions and 430 deletions

View File

@ -63,7 +63,7 @@ $08-$0B Text/GR page 2. $08=boot, $09-$0A = qboot stage2
$0B-$1F QLOAD disk routines and HGR drawing routines
$20-$3F HGR Page 1
$40-$5f HGR Page 2
$60-$?? Programs (roughly 22k available?)
$60-$AF Programs (roughly 22k available?) (we max at 20k on disk)
$B8-$BB Hi-res lookup tables
$BC temp area for load/save files
$BD-$BE temp area when saving game
@ -73,6 +73,10 @@ $D0-$DF (Language Card BANK1) ?????
$D0-$DF (Language Card BANK2) Mockingboard music/PT3-routines
$E0-$FF (Language Card) ?????
$D0-$DF (bank2) inventory
$D0-$DF (bank1) common parser code
$E0-$FF per-level parser strings
Disk1 Map (disk has 35 tracks, each 4k in size)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
T 0 = Qboot

View File

@ -9,12 +9,25 @@ new_map_location:
; fall through
update_map_location:
;==================
; setup verb table
jsr setup_verb_table
;==================
; update map
; on main map, it's (MAP_Y*5)+MAP_X
update_map_location:
; put in map
map_wrap_x:
; wrap X (0..4)
lda MAP_X

View File

@ -34,13 +34,8 @@ done_upcase_loop:
jsr get_noun
;=============================
; handle room-specific actions
; jsr local_parser
;================================
; fall through to default actions
; jump into verb table
lda CURRENT_VERB
@ -54,212 +49,29 @@ done_upcase_loop:
rts ; jump to routine
;==============================
;==============================
;==============================
;==============================
; common routines
;==============================
;==============================
;==============================
;==============================
;================
; ask
;================
parse_ask:
lda CURRENT_NOUN
cmp #NOUN_FIRE
beq ask_about_fire
cmp #NOUN_JHONKA
beq ask_about_jhonka
cmp #NOUN_KERREK
beq ask_about_kerrek
cmp #NOUN_NED
beq ask_about_ned
cmp #NOUN_ROBE
beq ask_about_robe
cmp #NOUN_SMELL
beq ask_about_smell
cmp #NOUN_TROGDOR
beq ask_about_trogdor
; else ask about unknown
ask_about_unknown:
ldx #<knight_ask_unknown_message
ldy #>knight_ask_unknown_message
parse_common_ask:
ldx #<unknown_ask_message
ldy #>unknown_ask_message
jmp finish_parse_message
ask_about_fire:
ldx #<knight_ask_fire_message
ldy #>knight_ask_fire_message
jmp finish_parse_message
ask_about_jhonka:
ldx #<knight_ask_jhonka_message
ldy #>knight_ask_jhonka_message
jmp finish_parse_message
ask_about_kerrek:
ldx #<knight_ask_kerrek_message
ldy #>knight_ask_kerrek_message
jmp finish_parse_message
ask_about_ned:
ldx #<knight_ask_ned_message
ldy #>knight_ask_ned_message
jmp finish_parse_message
ask_about_robe:
ldx #<knight_ask_robe_message
ldy #>knight_ask_robe_message
jmp finish_parse_message
ask_about_smell:
ldx #<knight_ask_smell_message
ldy #>knight_ask_smell_message
jmp finish_parse_message
ask_about_trogdor:
ldx #<knight_ask_trogdor_message
ldy #>knight_ask_trogdor_message
jmp finish_parse_message
;================
; attack
;================
parse_break:
parse_attack:
lda CURRENT_NOUN
cmp #NOUN_SIGN
beq attack_sign
jmp parse_unknown
attack_sign:
ldx #<attack_sign_message
ldy #>attack_sign_message
jmp finish_parse_message
;================
; quit
;================
parse_quit:
ldx #<quit_message
ldy #>quit_message
jmp finish_parse_message
;================
; smell / sniff
;================
parse_smell:
parse_sniff:
ldx #<smell_message
ldy #>smell_message
jmp finish_parse_message
;================
; dan
;================
parse_dan:
ldx #<dan_message
ldy #>dan_message
jmp finish_parse_message
;================
; go
;================
parse_go:
ldx #<go_message
ldy #>go_message
jmp finish_parse_message
;================
; drop/throw
;================
parse_drop:
parse_throw:
ldx #<no_baby_message
ldy #>no_baby_message
jmp finish_parse_message
;================
; climb
;================
parse_climb:
ldx #<climb_cliff_message
ldy #>climb_cliff_message
jmp finish_parse_message
;================
; get/take/steal
;================
parse_get:
parse_take:
parse_steal:
ldx #<get_message
ldy #>get_message
jmp finish_parse_message
;================
; give
;================
parse_give:
ldx #<give_message
ldy #>give_message
jmp finish_parse_message
;================
; haldo
;================
parse_haldo:
ldx #<haldo_message
ldy #>haldo_message
jmp finish_parse_message
;================
; why
;================
parse_why:
ldx #<why_message
ldy #>why_message
jmp finish_parse_message
;================
; this / what the
;================
parse_this:
parse_what:
ldx #<what_message
ldy #>what_message
jmp finish_parse_message
;================
; party
;================
parse_party:
ldx #<party_message
ldy #>party_message
jmp finish_parse_message
;================
; map
;================
parse_map:
ldx #<map_message
ldy #>map_message
jmp finish_parse_message
;================
; help
;================
parse_help:
ldx #<help_message
ldy #>help_message
jmp finish_parse_message
;================
; boo
;================
parse_boo:
parse_common_boo:
ldx #<boo_message
ldy #>boo_message
jmp finish_parse_message
@ -267,17 +79,43 @@ parse_boo:
;================
; cheat
;================
parse_cheat:
parse_common_cheat:
ldx #<cheat_message
ldy #>cheat_message
jmp finish_parse_message
;================
; climb
;================
parse_common_climb:
lda CURRENT_NOUN
cmp #NOUN_CLIFF
beq climb_cliff
cmp #NOUN_TREE
beq climb_tree
jmp parse_common_unknown
climb_tree:
; FIXME: this changes after INN
ldx #<climb_tree_message
ldy #>climb_tree_message
jmp finish_parse_message
climb_cliff:
; FIXME: only on certain locations
ldx #<climb_cliff_message
ldy #>climb_cliff_message
jmp finish_parse_message
;=================
; copy
;=================
parse_copy:
parse_common_copy:
; want copy
lda #NEW_FROM_DISK
@ -292,17 +130,26 @@ parse_copy:
; dance
;===================
parse_dance:
parse_common_dance:
ldx #<dance_message
ldy #>dance_message
jmp finish_parse_message
;================
; dan
;================
parse_common_dan:
ldx #<dan_message
ldy #>dan_message
jmp finish_parse_message
;===================
; die
;===================
parse_die:
parse_common_die:
lda #LOAD_GAME_OVER
sta WHICH_LOAD
@ -314,11 +161,36 @@ parse_die:
jmp finish_parse_message
;================
; ditch/drop
;================
parse_common_ditch:
parse_common_drop:
lda CURRENT_NOUN
cmp #NOUN_BABY
beq ditch_baby
jmp parse_common_unknown
ditch_baby:
lda INVENTORY_1
and INV1_BABY
beq no_baby
ldx #<ditch_baby_message
ldy #>ditch_baby_message
jmp finish_parse_message
no_baby:
ldx #<no_baby_message
ldy #>no_baby_message
jmp finish_parse_message
;=====================
; drink
;=====================
parse_drink:
parse_common_drink:
ldx #<drink_message
ldy #>drink_message
@ -329,12 +201,67 @@ parse_drink:
jmp finish_parse_message
;================
; drop/throw
;================
parse_common_throw:
ldx #<no_baby_message
ldy #>no_baby_message
jmp finish_parse_message
;================
; get/take/steal
;================
parse_common_get:
parse_common_take:
parse_common_steal:
ldx #<get_message
ldy #>get_message
jmp finish_parse_message
;================
; give
;================
parse_common_give:
ldx #<give_message
ldy #>give_message
jmp finish_parse_message
;================
; go
;================
parse_common_go:
ldx #<go_message
ldy #>go_message
jmp finish_parse_message
;================
; haldo
;================
parse_common_haldo:
ldx #<haldo_message
ldy #>haldo_message
jmp finish_parse_message
;================
; help
;================
parse_common_help:
ldx #<help_message
ldy #>help_message
jmp finish_parse_message
;====================
; inventory
;====================
parse_inventory:
parse_common_inventory:
; switch in LC bank2
@ -354,7 +281,7 @@ parse_inventory:
; load
;=====================
parse_load:
parse_common_load:
jsr load_menu
@ -364,132 +291,85 @@ parse_load:
; look
;=================
parse_look:
parse_common_look:
lda CURRENT_NOUN
cmp #NOUN_KNIGHT
beq knight_look
cmp #NOUN_MAN
beq knight_look
cmp #NOUN_DUDE
beq knight_look
cmp #NOUN_GUY
beq knight_look
cmp #NOUN_SIGN
beq sign_look
cmp #NOUN_TROGDOR
beq trogdor_look
cmp #NOUN_NONE
beq pass_look
bne irrelevant_look
knight_look:
ldx #<knight_look_message
ldy #>knight_look_message
jmp finish_parse_message
pass_look:
ldx #<pass_look_message
ldy #>pass_look_message
jmp finish_parse_message
sign_look:
ldx #<sign_look_message
ldy #>sign_look_message
jmp finish_parse_message
trogdor_look:
ldx #<trogdor_look_message
ldy #>trogdor_look_message
jmp finish_parse_message
cmp #NOUN_TREE
beq trees_look
irrelevant_look:
ldx #<look_irrelevant_message
ldy #>look_irrelevant_message
jmp finish_parse_message
;===================
; talk
;===================
parse_talk:
lda CURRENT_NOUN
cmp #NOUN_KNIGHT
beq talk_to_knight
cmp #NOUN_GUY
beq talk_to_knight
cmp #NOUN_MAN
beq talk_to_knight
cmp #NOUN_DUDE
beq talk_to_knight
; else, no one
talk_noone:
ldx #<talk_noone_message
ldy #>talk_noone_message
trees_look:
ldx #<look_trees_message
ldy #>look_trees_message
jmp finish_parse_message
talk_to_knight:
lda GAME_STATE_2
and #TALKED_TO_KNIGHT
bne knight_skip_text
;================
; map
;================
parse_common_map:
ldx #<map_message
ldy #>map_message
jmp finish_parse_message
; first time only
ldx #<talk_knight_first_message
ldy #>talk_knight_first_message
jsr partial_message_step
; first time only
ldx #<talk_knight_second_message
ldy #>talk_knight_second_message
jsr partial_message_step
;================
; party
;================
parse_common_party:
ldx #<party_message
ldy #>party_message
jmp finish_parse_message
knight_skip_text:
ldx #<talk_knight_third_message
ldy #>talk_knight_third_message
jsr partial_message_step
;=====================
; pwd
;=====================
parse_common_pwd:
ldx #<talk_knight_stink_message
ldy #>talk_knight_stink_message
jsr partial_message_step
ldx MAP_LOCATION
lda location_names_l,X
sta INL
lda location_names_h,X
sta INH
ldx #<talk_knight_dress_message
ldy #>talk_knight_dress_message
jsr partial_message_step
lda #<(pwd_message+17)
sta OUTL
lda #>(pwd_message+17)
sta OUTH
ldx #<talk_knight_fire_message
ldy #>talk_knight_fire_message
jsr partial_message_step
ldy #0
pwd_loop:
lda (INL),Y
sta (OUTL),Y
beq pwd_done
iny
bne pwd_loop ; bra
ldx #<talk_knight_fourth_message
ldy #>talk_knight_fourth_message
pwd_done:
lda GAME_STATE_2
and #TALKED_TO_KNIGHT
bne knight_skip_text2
ldx #<pwd_message
ldy #>pwd_message
jmp finish_parse_message
jsr partial_message_step
; first time only
ldx #<talk_knight_fifth_message
ldy #>talk_knight_fifth_message
lda GAME_STATE_2
ora #TALKED_TO_KNIGHT
sta GAME_STATE_2
knight_skip_text2:
;================
; quit
;================
parse_common_quit:
ldx #<quit_message
ldy #>quit_message
jmp finish_parse_message
;===================
; save
;===================
parse_save:
parse_common_save:
jsr save_menu
@ -499,7 +379,7 @@ parse_save:
; show
;===================
parse_show:
parse_common_show:
bit LORES
bit PAGE1
@ -511,20 +391,83 @@ parse_show:
jmp done_parse_message
;================
; smell / sniff
;================
parse_common_smell:
parse_common_sniff:
ldx #<smell_message
ldy #>smell_message
jmp finish_parse_message
;===================
; talk
;===================
parse_common_talk:
; else, no one
talk_noone:
ldx #<talk_noone_message
ldy #>talk_noone_message
jmp finish_parse_message
;==================
; unknown
;=================
parse_common_unknown:
ldx #<unknown_message
ldy #>unknown_message
jmp finish_parse_message
;=====================
; version
;=====================
parse_version:
parse_common_version:
ldx #<version_message
ldy #>version_message
jmp finish_parse_message
;================
; wear
;================
parse_common_wear:
lda CURRENT_NOUN
cmp #NOUN_ROBE
bne wear_unknown
ldx #<wear_robe_none_message
ldy #>wear_robe_none_message
jsr partial_message_step
ldx #<wear_robe_none_message2
ldy #>wear_robe_none_message2
jmp finish_parse_message
wear_unknown:
jmp parse_common_unknown
;================
; this / what the
;================
parse_common_this:
parse_common_what:
ldx #<what_message
ldy #>what_message
jmp finish_parse_message
;=====================
; where
;=====================
parse_where:
parse_common_where:
ldx MAP_LOCATION
lda location_names_l,X
@ -551,51 +494,45 @@ where_done:
ldy #>where_message
jmp finish_parse_message
;==================
; unknown
;=================
parse_buy:
parse_close:
parse_deploy:
parse_ditch:
parse_enter:
parse_feed:
parse_jump:
parse_kick:
parse_kill:
parse_knock:
parse_light:
parse_make:
parse_no:
parse_open:
parse_pet:
parse_play:
parse_pull:
parse_punch:
parse_push:
parse_put:
parse_pwd:
parse_read:
parse_ride:
parse_ring:
parse_scare:
parse_shoot:
parse_sit:
parse_skip:
parse_sleep:
parse_swim:
parse_try:
parse_turn:
parse_use:
parse_wake:
parse_wear:
parse_yet:
parse_unknown:
ldx #<unknown_message
ldy #>unknown_message
;================
; why
;================
parse_common_why:
ldx #<why_message
ldy #>why_message
jmp finish_parse_message
finish_parse_message:
stx OUTL
sty OUTH
@ -1062,79 +999,124 @@ partial_message_step:
jsr hgr_partial_restore
rts
verb_table = $BF00
verb_table:
.word parse_unknown-1 ; VERB_UNKNOWN = 0
.word parse_ask-1 ; VERB_ASK = 1
.word parse_boo-1 ; VERB_BOO = 2
.word parse_break-1 ; VERB_BREAK = 3
.word parse_buy-1 ; VERB_BUY = 4
.word parse_cheat-1 ; VERB_CHEAT = 5
.word parse_climb-1 ; VERB_CLIMB = 6
.word parse_close-1 ; VERB_CLOSE = 7
.word parse_copy-1 ; VERB_COPY = 8
.word parse_dance-1 ; VERB_DANCE = 9
.word parse_deploy-1 ; VERB_DEPLOY = 10
.word parse_die-1 ; VERB_DIE = 11
.word parse_ditch-1 ; VERB_DITCH = 12
.word parse_drink-1 ; VERB_DRINK = 13
.word parse_drop-1 ; VERB_DROP = 14
.word parse_enter-1 ; VERB_ENTER = 15
.word parse_feed-1 ; VERB_FEED = 16
.word parse_get-1 ; VERB_GET = 17
.word parse_give-1 ; VERB_GIVE = 18
.word parse_go-1 ; VERB_GO = 19
.word parse_haldo-1 ; VERB_HALDO = 20
.word parse_inventory-1 ; VERB_INVENTORY= 21
.word parse_jump-1 ; VERB_JUMP = 22
.word parse_kick-1 ; VERB_KICK = 23
.word parse_kill-1 ; VERB_KILL = 24
.word parse_knock-1 ; VERB_KNOCK = 25
.word parse_light-1 ; VERB_LIGHT = 26
.word parse_load-1 ; VERB_LOAD = 27
.word parse_look-1 ; VERB_LOOK = 28
.word parse_make-1 ; VERB_MAKE = 29
.word parse_map-1 ; VERB_MAP = 30
.word parse_no-1 ; VERB_NO = 31
.word parse_open-1 ; VERB_OPEN = 32
.word parse_party-1 ; VERB_PARTY = 33
.word parse_pet-1 ; VERB_PET = 34
.word parse_play-1 ; VERB_PLAY = 35
.word parse_pull-1 ; VERB_PULL = 36
.word parse_punch-1 ; VERB_PUNCH = 37
.word parse_push-1 ; VERB_PUSH = 38
.word parse_put-1 ; VERB_PUT = 39
.word parse_pwd-1 ; VERB_PWD = 40
.word parse_quit-1 ; VERB_QUIT = 41
.word parse_read-1 ; VERB_READ = 42
.word parse_ride-1 ; VERB_RIDE = 43
.word parse_ring-1 ; VERB_RING = 44
.word parse_save-1 ; VERB_SAVE = 45
.word parse_scare-1 ; VERB_SCARE = 46
.word parse_shoot-1 ; VERB_SHOOT = 47
.word parse_show-1 ; VERB_SHOW = 48
.word parse_sit-1 ; VERB_SIT = 49
.word parse_skip-1 ; VERB_SKIP = 50
.word parse_sleep-1 ; VERB_SLEEP = 51
.word parse_smell-1 ; VERB_SMELL = 52
.word parse_sniff-1 ; VERB_SNIFF = 53
.word parse_steal-1 ; VERB_STEAL = 54
.word parse_swim-1 ; VERB_SWIM = 55
.word parse_take-1 ; VERB_TAKE = 56
.word parse_talk-1 ; VERB_TALK = 57
.word parse_this-1 ; VERB_THIS = 58
.word parse_throw-1 ; VERB_THROW = 59
.word parse_try-1 ; VERB_TRY = 60
.word parse_turn-1 ; VERB_TURN = 61
.word parse_use-1 ; VERB_USE = 62
.word parse_version-1 ; VERB_VERSION = 63
.word parse_wake-1 ; VERB_WAKE = 64
.word parse_wear-1 ; VERB_WEAR = 65
.word parse_what-1 ; VERB_WHAT = 66
.word parse_where-1 ; VERB_WHERE = 67
.word parse_why-1 ; VERB_WHY = 68
.word parse_yet-1 ; VERB_YES = 69
.word parse_help-1 ; VERB_HELP = 70
.word parse_attack-1 ; VERB_ATTACK = 71
;=========================
;=========================
; setup verb table
;=========================
;=========================
setup_verb_table:
;===========================
; first make it all unknown
ldx #0
unknown_loop:
lda #<(parse_common_unknown-1)
sta verb_table,X
lda #>(parse_common_unknown-1)
sta verb_table+1,X
inx
inx
cpx VERB_ALL_DONE
bne unknown_loop
;=========================
; now add in common calls
ldx #0
common_verb_loop:
lda common_verb_table,X
beq done_verb_loop ; 0 means done
asl ; mul by 2
tay
lda common_verb_table+1,X
sta verb_table,Y
lda common_verb_table+2,X
sta verb_table+1,Y
inx
inx
inx
jmp common_verb_loop ; make this a bne (bra)?
done_verb_loop:
rts
common_verb_table:
.byte VERB_ASK
.word parse_common_ask-1
.byte VERB_BOO
.word parse_common_boo-1
.byte VERB_CHEAT
.word parse_common_cheat-1
.byte VERB_CLIMB
.word parse_common_climb-1
.byte VERB_COPY
.word parse_common_copy-1
.byte VERB_DANCE
.word parse_common_dance-1
.byte VERB_DIE
.word parse_common_die-1
.byte VERB_DITCH
.word parse_common_ditch-1
.byte VERB_DRINK
.word parse_common_drink-1
.byte VERB_DROP
.word parse_common_drop-1
.byte VERB_GET
.word parse_common_get-1
.byte VERB_GIVE
.word parse_common_give-1
.byte VERB_GO
.word parse_common_go-1
.byte VERB_HALDO
.word parse_common_haldo-1
.byte VERB_HELP
.word parse_common_help-1
.byte VERB_INVENTORY
.word parse_common_inventory-1
.byte VERB_LOAD
.word parse_common_load-1
.byte VERB_LOOK
.word parse_common_look-1
.byte VERB_MAP
.word parse_common_map-1
.byte VERB_PARTY
.word parse_common_party-1
.byte VERB_PWD
.word parse_common_pwd-1
.byte VERB_QUIT
.word parse_common_quit-1
.byte VERB_SAVE
.word parse_common_save-1
.byte VERB_SHOW
.word parse_common_show-1
.byte VERB_SMELL
.word parse_common_smell-1
.byte VERB_SNIFF
.word parse_common_sniff-1
.byte VERB_TAKE
.word parse_common_take-1
.byte VERB_TALK
.word parse_common_talk-1
.byte VERB_THIS
.word parse_common_this-1
.byte VERB_THROW
.word parse_common_throw-1
.byte VERB_VERSION
.word parse_common_version-1
.byte VERB_WEAR
.word parse_common_wear-1
.byte VERB_WHAT
.word parse_common_what-1
.byte VERB_WHERE
.word parse_common_where-1
.byte VERB_WHY
.word parse_common_why-1
.byte 0
.include "dialog_peasant2.inc"

View File

@ -12,9 +12,12 @@
.byte "You slip into the vintage robe. It smells like grampa's lap. Now you're lookin like a serious peasant.",0
; + wear robe (not in inventory)
wear_robe_none_message:
.byte "You don't have anything but",13
.byte "your 'Scalding Lake'",13
.byte "t-shirt.",0
wear_robe_none_message2:
.byte "And pants. Forgot to",13
.byte "mention the pants.",0
@ -25,10 +28,12 @@
.byte "Right now, you see a bunch of hay.",0
; + look trees
look_trees_message:
.byte "You are an incredibly",13
.byte "boring person.",0
; + ask about (unknown)
unknown_ask_message:
.byte "Ask about what?",0
; + boo
@ -113,8 +118,10 @@ smell_message:
.byte "Smells like a computer",13
.byte "game.",0
; + pwd
.byte "~peasantsquest/{location}",0
; + pwd (offset 17)
pwd_message:
.byte "~peasantsquest/",13
.byte " ",0
; + go _____
go_message:
@ -123,6 +130,7 @@ go_message:
.byte "more like your day job.",0
; + ditch/drop baby (if you have it)
ditch_baby_message:
.byte "Quit tryin to ditch the baby!",0
; + ???? ditch/drop/deploy/use baby (after baby left)
@ -139,6 +147,7 @@ climb_cliff_message:
.byte "you.",0
; + climb tree
climb_tree_message:
.byte "But then your hands would",13
.byte "get all sappy.",0

View File

@ -70,6 +70,7 @@ VERB_WHY = 68
VERB_YES = 69
VERB_HELP = 70
VERB_ATTACK = 71
VERB_ALL_DONE = 72 ; not a verb, but indicating end, must be last
NOUN_NONE = 0
;