From e389f21d8258e82fb316d76b3d3dbf8981ab0a83 Mon Sep 17 00:00:00 2001 From: Vince Weaver Date: Tue, 22 Oct 2024 22:27:05 -0400 Subject: [PATCH] peasant: split outer off from cliff_heights was running out of room --- games/peasant/cliff_heights/cliff_heights.s | 666 +---------- .../cliff_heights/graphics_heights/Makefile | 33 +- games/peasant/cliff_heights/heights_actions.s | 230 ---- .../cliff_heights/sprites_heights/Makefile | 36 +- games/peasant/common_defines.inc | 2 + games/peasant/docs/disk_map.txt | 15 +- games/peasant/outer/Makefile | 51 + games/peasant/outer/graphics_outer/Makefile | 50 + .../graphics_outer}/outer.png | Bin .../graphics_outer}/outer_collision.png | Bin .../graphics_outer}/outer_priority.png | Bin games/peasant/outer/outer.s | 1024 +++++++++++++++++ games/peasant/outer/outer_actions.s | 233 ++++ games/peasant/outer/sprites_outer/Makefile | 59 + .../sprites_outer}/guitar_sprites.png | Bin .../sprites_outer}/keeper1_sprites.png | Bin .../sprites_outer}/keeper2_sprites.png | Bin games/peasant/text/Makefile | 21 + games/peasant/text/cliff_heights.inc | 396 ------- games/peasant/text/dialog_outer.s | 2 + games/peasant/text/outer.inc | 395 +++++++ 21 files changed, 1875 insertions(+), 1338 deletions(-) create mode 100644 games/peasant/common_defines.inc create mode 100644 games/peasant/outer/Makefile create mode 100644 games/peasant/outer/graphics_outer/Makefile rename games/peasant/{cliff_heights/graphics_heights => outer/graphics_outer}/outer.png (100%) rename games/peasant/{cliff_heights/graphics_heights => outer/graphics_outer}/outer_collision.png (100%) rename games/peasant/{cliff_heights/graphics_heights => outer/graphics_outer}/outer_priority.png (100%) create mode 100644 games/peasant/outer/outer.s create mode 100644 games/peasant/outer/outer_actions.s create mode 100644 games/peasant/outer/sprites_outer/Makefile rename games/peasant/{cliff_heights/sprites_heights => outer/sprites_outer}/guitar_sprites.png (100%) rename games/peasant/{cliff_heights/sprites_heights => outer/sprites_outer}/keeper1_sprites.png (100%) rename games/peasant/{cliff_heights/sprites_heights => outer/sprites_outer}/keeper2_sprites.png (100%) create mode 100644 games/peasant/text/dialog_outer.s create mode 100644 games/peasant/text/outer.inc diff --git a/games/peasant/cliff_heights/cliff_heights.s b/games/peasant/cliff_heights/cliff_heights.s index 0fddc549..e889bf78 100644 --- a/games/peasant/cliff_heights/cliff_heights.s +++ b/games/peasant/cliff_heights/cliff_heights.s @@ -13,8 +13,7 @@ .include "../inventory/inventory.inc" .include "../parse_input.inc" .include "../redbook_sound.inc" - -collision_location = $bc00 +.include "../common_locations.inc" LOCATION_BASE = LOCATION_CLIFF_HEIGHTS ; (21 = $15) @@ -228,50 +227,6 @@ level_good: jsr draw_lightning no_lightning: - ;===================== - ; see if keeper triggered - - lda MAP_LOCATION - cmp #LOCATION_TROGDOR_OUTER - bne done_check_keeper - - lda IN_QUIZ - bne done_check_keeper - -check_keeper1: - lda INVENTORY_2 - and #INV2_TROGSHIELD ; only if not have shield - bne check_keeper2 - - lda PEASANT_X ; only if ourx > 9 - cmp #10 - bcc check_keeper2 - - jsr handle_keeper1 - -check_keeper2: - - - - -done_check_keeper: - - - ;================================= - ; draw keeper if we need refresh - - lda REFRESH_SCREEN - beq no_draw_keeper - - lda #0 - sta REFRESH_SCREEN - - lda IN_QUIZ ; need to draw keeper if quizzing - beq no_draw_keeper - - jsr draw_standing_keeper - -no_draw_keeper: ;===================== ; always draw peasant @@ -294,49 +249,19 @@ no_draw_keeper: ; original code also waited approximately 100ms? ; this led to keypressed being lost - lda PEASANT_DIR - sta OLD_DIR lda #13 sta WAIT_LOOP wait_loop: - - lda IN_QUIZ - cmp #2 ; means waiting for answer - bne normal_keyboard_check - - jsr check_keyboard_answer - jmp done_keyboard_check - -normal_keyboard_check: - jsr check_keyboard -done_keyboard_check: - lda #50 ; approx 7ms jsr wait dec WAIT_LOOP bne wait_loop - ;=================================== - ; keep from moving if being quizzed - ;=================================== - - lda IN_QUIZ - beq not_in_quiz - - lda #0 ; keep from moving - sta PEASANT_XADD - sta PEASANT_YADD - - lda OLD_DIR ; keep from changing dir - sta PEASANT_DIR - -not_in_quiz: - jsr wait_vblank jmp game_loop @@ -432,27 +357,21 @@ exiting_cliff: map_backgrounds_low: .byte cliff_heights_zx02 - .byte >outer_zx02 map_priority_low: .byte cliff_heights_priority_zx02 - .byte >outer_priority_zx02 verb_tables_low: .byte cliff_heights_verb_table - .byte >cave_outer_verb_table @@ -463,522 +382,16 @@ cliff_text_zx02: robe_sprite_data: .incbin "../sprites_peasant/robe_sprites.zx02" +; .incbin "../sprites_peasant/robe_shield_sprites.zx02" -.include "sprites_heights/ron_sprites.inc" +;.include "sprites_heights/keeper1_sprites.inc" +;.include "sprites_heights/ron_sprites.inc" +;.include "sprites_heights/keeper2_sprites.inc" .include "draw_lightning.s" -;========================================== -; first keeper ron - -; flips peasant forward -; 3 (4) (u shaped) -; 5 (4) (up) -; 6 (6) (up, up) -; 7 (4) (up, down) -; 6 (4) -; 7 (4) -; 6 (4) -; 7 (4) -; 6 (4) -; 7 (4) -; 6 (4) -; 7 (4) 9? repeats, ending on down -; ron transition happens -; (8) switches to 5 part way through first frame? -; 3 / ron next , to 1 part way through second (cloud frame) -; 5 ron (gap) -; 10 ron (tiny smoke) -; 10 full ron - -ron_which_keeper_sprite: -.byte 3, 5, 6, 7 -.byte 6, 7, 6, 7 -.byte 6, 7, 6, 7 - -.byte 7, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1 - -ron_which_ron_sprite: -.byte 0, 0, 0, 0 -.byte 0, 0, 0, 0 -.byte 0, 0, 0, 0 - -.byte 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 4 - - - ;=============================== - ; ron transform - ;=============================== -ron_transform: - - lda #0 - sta KEEPER_COUNT - - ; look down for this - - lda #PEASANT_DIR_DOWN - sta PEASANT_DIR - -ron1_loop: - - ; play sound if needed, 2.. 12 - - lda KEEPER_COUNT - cmp #2 - bcc skip_ron_sound - cmp #12 - bcs skip_ron_sound - - and #1 - beq ron_other_note - - lda #NOTE_F6 - beq ron_common_note ; bra -ron_other_note: - lda #NOTE_E6 - -ron_common_note: - sta speaker_frequency - lda #8 - sta speaker_duration - jsr speaker_tone - -skip_ron_sound: - - ; erase prev keeper - - ldy #3 ; erase slot 3? - jsr hgr_partial_restore_by_num - - inc KEEPER_COUNT - ldx KEEPER_COUNT - - lda #10 - sta SPRITE_X - lda #60 - sta SPRITE_Y - - ; get offset for graphics - - ldx KEEPER_COUNT - lda ron_which_keeper_sprite,X - clc - adc #5 ; skip ron - tax - - ldy #3 ; ? slot - - jsr hgr_draw_sprite_save - - ;======================= - ; see if done animation - - lda KEEPER_COUNT - cmp #21 ; - beq ron_done - - cmp #12 - bcc ron_peasant ; normal peasant first 12 frames - - ; erase prev peasant - - ldy #4 ; erase slot 4? - jsr hgr_partial_restore_by_num - - ldx KEEPER_COUNT - - lda PEASANT_X - sta SPRITE_X - lda PEASANT_Y - sta SPRITE_Y - - ; get offset for graphics - -; ldx KEEPER_COUNT - lda ron_which_ron_sprite,X - tax - - ldy #4 ; ? slot - - jsr hgr_draw_sprite_save - - jmp done_ron_peasant - -ron_peasant: - ;======================== - ; draw peasant - - jsr draw_peasant - - - ;======================== - ; increment flame - - jsr increment_flame -done_ron_peasant: - - ;========================= - ; delay - - lda #200 - jsr wait - - jsr wait_vblank - - jmp ron1_loop - -ron_done: - - ;=========================== - ; weep sound - - lda #32 - sta speaker_duration - lda #NOTE_E5 - sta speaker_frequency - jsr speaker_tone - lda #64 - sta speaker_duration - lda #NOTE_F5 - sta speaker_frequency - jsr speaker_tone - - jsr wait_until_keypress - - rts - -;========================================== -; first keeper info -; -; seems to trigger at approx peasant_x = 70 (10) -; - -; 0 (4), move down/r -; 0 (4), move down/r -; 1 (4), no move -; 1 (5), move down/r - -; 1 (5), move down/r -; 1 (5), move down/r -; 1 (5), move down/r -; 1 (5), move down/r - -; 2 (5) -; 3 (4) -; 4 (10) -; 3 (10) - -; 4 (15) -; 3 (5) -; 2 (5) -; 1 (11) ; starts talking - - - -keeper_x: -.byte 9, 9,10,10 -.byte 10,10,10,10 -.byte 10,10,10,10, 10,10 -.byte 10,10,10,10,10,10,10 - -keeper_y: -.byte 51,52,53,54 -.byte 56,58,59,60 -.byte 60,60,60,60, 60,60 -.byte 60,60,60,60, 60,60,60 - -which_keeper_sprite: -.byte 0, 0, 1, 1 -.byte 1, 1, 1, 1 -.byte 2, 3, 4, 4, 3, 3 - -.byte 4, 4, 4, 3, 2, 1, 1 - - - ;=============================== - ; handle keeper1 - ;=============================== - ; handle keeper1 - ; stop walking - ; have keeper come out to talk - ; special limited handling - ; can't walk unless win -handle_keeper1: - - lda #0 ; stop walking - sta PEASANT_XADD - sta PEASANT_YADD - - ;=========================== - ; animate keeper coming out - - -keeper1_loop: - - ; erase prev keeper - - ldy #3 ; erase slot 3? - jsr hgr_partial_restore_by_num - - inc KEEPER_COUNT - ldx KEEPER_COUNT - - lda keeper_x,X - sta SPRITE_X - lda keeper_y,X - sta SPRITE_Y - - ; get offset for graphics - - ldx KEEPER_COUNT - lda which_keeper_sprite,X - clc - adc #5 ; skip ron - tax - - ldy #3 ; ? slot - - jsr hgr_draw_sprite_save - - ;======================= - ; see if done animation - - lda KEEPER_COUNT - cmp #20 ; - beq keeper_talk1 - - - - ;======================== - ; increment flame - - jsr draw_peasant - - ;======================== - ; increment flame - - jsr increment_flame - - ;========================= - ; delay - - lda #200 - jsr wait - - jsr wait_vblank - - jmp keeper1_loop - - rts - - - ;==================== - ; increment flame - ;==================== -increment_flame: - inc FLAME_COUNT - lda FLAME_COUNT - cmp #3 - bne flame_good - - lda #0 - sta FLAME_COUNT - -flame_good: - rts - -keeper_talk1: - ; print the message - - ldx #cave_outer_keeper1_message1 - jsr finish_parse_message - - jsr draw_standing_keeper - - ldx #cave_outer_keeper1_message2 - jsr finish_parse_message - - jsr draw_standing_keeper - - ldx #cave_outer_keeper1_message3 - jsr finish_parse_message - - jsr draw_standing_keeper - - ldx #cave_outer_keeper1_message4 - jsr finish_parse_message - - jsr draw_standing_keeper - - ;=============================================== - ; if have sub print5, otherwise skip ahead - - lda INVENTORY_2 - and #INV2_MEATBALL_SUB - beq dont_have_sub - - ldx #cave_outer_keeper1_message5 - jsr finish_parse_message - - jsr draw_standing_keeper - -dont_have_sub: - - ; now we need to re-draw keeper - ; also we're in quiz mode - ; so we can't move and can only take quiz or give sub - - lda #1 - sta IN_QUIZ - - ; custom common verb table the essentially does nothing - jsr setup_quiz_verb_table - - ; respond only to take quiz and give sub - lda #keeper1_verb_table - sta INH - jsr load_custom_verb_table - - jmp game_loop - - - ;============================== - ; check_keyboard_answer - ;============================== - ; for when in quiz - ; looking for just A, B, or C - -check_keyboard_answer: - - lda KEYPRESS - bpl no_answer - - bit KEYRESET - - pha - jsr restore_parse_message - - lda #0 - sta REFRESH_SCREEN ; don't refresh or we draw keeper on top - - pla - - and #$7f ; strip high bit - and #$df ; convert to lowercase $61 -> $41 0110 -> 0100 - - cmp #'A' - bcc invalid_answer ; blt - cmp #'D' - bcs invalid_answer ; bge - - ldx WHICH_QUIZ - - cmp quiz1_answers,X - beq right_answer - bne wrong_answer - -no_answer: - rts - - ;====================== - ; quiz1 invalid answer - ;====================== - -invalid_answer: - bit KEYRESET ; clear the keyboard buffer - - lda WHICH_QUIZ - cmp #2 ; off by 1 - beq resay_quiz3 - cmp #1 - beq resay_quiz2 - -resay_quiz1: - ldx #cave_outer_quiz1_1again - jmp finish_parse_message_nowait -resay_quiz2: - ldx #cave_outer_quiz1_2again - jmp finish_parse_message_nowait -resay_quiz3: - ldx #cave_outer_quiz1_3again - jmp finish_parse_message_nowait - - - ;====================== - ; quiz1 wrong answer - ;====================== - -wrong_answer: - bit KEYRESET ; clear the keyboard buffer - - ldx #cave_outer_quiz1_wrong - jsr finish_parse_message - - jsr draw_standing_keeper - - ldx #cave_outer_quiz1_wrong_part2 - jsr finish_parse_message - - jsr draw_standing_keeper - - ldx #cave_outer_quiz1_wrong_part3 - jsr finish_parse_message - - ; transform to ron - - jsr ron_transform - - ldx #cave_outer_quiz1_wrong_part4 - jsr finish_parse_message - - lda #0 - sta IN_QUIZ - - ; game over - - lda #LOAD_GAME_OVER - sta WHICH_LOAD - - lda #NEW_FROM_DISK - sta LEVEL_OVER - - rts - - ;====================== - ; quiz1 correct answer - ;====================== - -right_answer: - bit KEYRESET ; clear the keyboard buffer - ldx #cave_outer_quiz1_correct - jsr finish_parse_message - - jsr cave_outer_get_shield - - ; FIXME: animate keeper backing off - - rts - -quiz1_answers: - .byte 'B','A','C' - ;============================ ; setup heights verb table ;============================ @@ -1005,65 +418,18 @@ setup_heights_verb_table: rts - ;========================== - ; draw standing keeper - ;========================== -draw_standing_keeper: + ;==================== + ; increment flame + ;==================== +increment_flame: + inc FLAME_COUNT + lda FLAME_COUNT + cmp #3 + bne flame_good - ; erase prev keeper - - ldy #3 ; erase slot 3? - jsr hgr_partial_restore_by_num - - ldx #19 - - lda keeper_x,X - sta SPRITE_X - lda keeper_y,X - sta SPRITE_Y - - ; get offset for graphics - - ldx #19 - lda which_keeper_sprite,X - clc - adc #5 ; skip ron - tax - - ldy #3 ; ? slot - - jsr hgr_draw_sprite_save + lda #0 + sta FLAME_COUNT +flame_good: rts -sprites_xsize: - .byte 2, 2, 2, 2, 2 ; ron 0..4 - .byte 2, 2, 3, 3, 3, 3, 3, 3 ; keeper 0..7 - -sprites_ysize: - .byte 29,30,30,30,30 ; ron 0..4 - .byte 28,28,28,28,28,28,28,28 ; keeper 0..7 - -sprites_data_l: - .byte ron0,>ron1,>ron2,>ron3,>ron4 - .byte >keeper0,>keeper1,>keeper2,>keeper3 - .byte >keeper4,>keeper5,>keeper6,>keeper7 - - -sprites_mask_l: - .byte ron0_mask,>ron1_mask,>ron2_mask,>ron3_mask,>ron4_mask - .byte >keeper0_mask,>keeper1_mask,>keeper2_mask,>keeper3_mask - .byte >keeper4_mask,>keeper5_mask,>keeper6_mask,>keeper7_mask - -.include "../hgr_sprite_save.s" diff --git a/games/peasant/cliff_heights/graphics_heights/Makefile b/games/peasant/cliff_heights/graphics_heights/Makefile index 1a6d7fd1..2e987656 100644 --- a/games/peasant/cliff_heights/graphics_heights/Makefile +++ b/games/peasant/cliff_heights/graphics_heights/Makefile @@ -9,17 +9,15 @@ all: cliff_heights_graphics.inc \ ### cliff_heights_graphics.inc: \ - cliff_heights.zx02 outer.zx02 + cliff_heights.zx02 echo "cliff_heights_zx02: .incbin \"cliff_heights.zx02\"" >> cliff_heights_graphics.inc - echo "outer_zx02: .incbin \"outer.zx02\"" >> cliff_heights_graphics.inc + ### priority_cliff_heights.inc: \ - cliff_heights_priority.zx02 \ - outer_priority.zx02 + cliff_heights_priority.zx02 echo "cliff_heights_priority_zx02: .incbin \"cliff_heights_priority.zx02\"" >> priority_cliff_heights.inc - echo "outer_priority_zx02: .incbin \"outer_priority.zx02\"" >> priority_cliff_heights.inc ### @@ -29,13 +27,6 @@ cliff_heights.zx02: cliff_heights.hgr cliff_heights.hgr: cliff_heights.png $(PNG2HGR) cliff_heights.png > cliff_heights.hgr -### - -outer.zx02: outer.hgr - $(ZX02) -f outer.hgr outer.zx02 - -outer.hgr: outer.png - $(PNG2HGR) outer.png > outer.hgr #### @@ -54,22 +45,8 @@ cliff_heights_collision.bin: cliff_heights_collision.png #### -outer_priority.zx02: outer_priority.combined - $(ZX02) -f outer_priority.combined outer_priority.zx02 - -outer_priority.combined: outer_priority.gr outer_collision.bin - cat outer_priority.gr > outer_priority.combined - cat outer_collision.bin >> outer_priority.combined - -outer_priority.gr: outer_priority.png - $(PNG2GR) outer_priority.png outer_priority.gr - -outer_collision.bin: outer_collision.png - $(PNG2COLLISION) outer_collision.png outer_collision.bin - -#### - clean: - rm -f *~ cliff_heights_graphics.inc priority_cliff_heights.inc *.zx02 *.gr *.hgr + rm -f *~ cliff_heights_graphics.inc priority_cliff_heights.inc \ + *.zx02 *.gr *.hgr *.bin *.combined diff --git a/games/peasant/cliff_heights/heights_actions.s b/games/peasant/cliff_heights/heights_actions.s index c05d3e8b..6072665c 100644 --- a/games/peasant/cliff_heights/heights_actions.s +++ b/games/peasant/cliff_heights/heights_actions.s @@ -109,234 +109,4 @@ cliff_heights_look_at_lightning: jmp finish_parse_message - ;======================= - ;======================= - ;======================= - ; Trogdor Cave Outer - ;======================= - ;======================= - ;======================= - -cave_outer_verb_table: - .byte VERB_CLIMB - .word cave_outer_climb-1 - .byte VERB_LOOK - .word cave_outer_look-1 - .byte 0 - - ;================= - ; look - ;================= - -cave_outer_look: - - lda CURRENT_NOUN - - cmp #NOUN_BEADS - beq cave_outer_look_at_curtain - cmp #NOUN_CURTAIN - beq cave_outer_look_at_curtain - cmp #NOUN_DOOR - beq cave_outer_look_at_door - cmp #NOUN_SKELETON - beq cave_outer_look_at_skeleton - cmp #NOUN_OPENINGS - beq cave_outer_look_at_openings - cmp #NOUN_NONE - beq cave_outer_look_at - - jmp parse_common_look - -cave_outer_look_at: - ldx #cave_outer_look_message - jmp finish_parse_message - -cave_outer_look_at_curtain: - ldx #cave_outer_look_curtain_message - jmp finish_parse_message - -cave_outer_look_at_door: - ldx #cave_outer_look_door_message - jmp finish_parse_message - -cave_outer_look_at_openings: - ldx #cave_outer_look_openings_message - jmp finish_parse_message - -cave_outer_look_at_skeleton: - ldx #cave_outer_look_skeleton_message - jmp finish_parse_message - - - ;================ - ; climb - ;================ -cave_outer_climb: - - lda CURRENT_NOUN - - cmp #NOUN_CLIFF - beq cave_outer_do_climb - cmp #NOUN_NONE - beq cave_outer_do_climb - - jmp parse_common_unknown - -cave_outer_do_climb: - ldx #cave_outer_climb_message - jmp finish_parse_message - - - ;======================= - ;======================= - ;======================= - ; Trogdor Cave Outer -- Keeper 1 - ;======================= - ;======================= - ;======================= - -keeper1_verb_table: - .byte VERB_TAKE - .word keeper1_take-1 - .byte VERB_GIVE - .word keeper1_give-1 - .byte 0 - - ;============================= - ; take - ;============================= - ; can only take quiz - ; - -keeper1_take: -; lda IN_QUIZ -; bne actual_quiz -; ; it not being quizzed, can't try to take it?? -; jmp parse_common_get ; is this the right path - -actual_quiz: - - lda CURRENT_NOUN - - cmp #NOUN_QUIZ - beq cave_outer_take_quiz - - ; if not say quiz, give hint - -cave_outer_hint: - ldx #cave_outer_keeper_wants_message - jmp finish_parse_message - -cave_outer_take_quiz: - inc IN_QUIZ ; make it 2 which means wait for answer - - jsr random8 - cmp #85 - bcc keeper1_quiz3 - cmp #170 - bcc keeper1_quiz2 -keeper1_quiz1: - lda #0 - ldx #cave_outer_quiz1_1 - jmp keeper1_quiz_common - -keeper1_quiz2: - lda #1 - ldx #cave_outer_quiz1_2 - jmp keeper1_quiz_common - -keeper1_quiz3: - lda #2 - ldx #cave_outer_quiz1_3 -keeper1_quiz_common: - sta WHICH_QUIZ - jmp finish_parse_message_nowait - - - ;============================= - ; give - ;============================= - ; can only give sub/sandwich - -keeper1_give: - - lda CURRENT_NOUN - - cmp #NOUN_SUB - beq cave_outer_give_sub - cmp #NOUN_SANDWICH - beq cave_outer_give_sandwich - -cave_outer_give_sub: -cave_outer_give_sandwich: - - ldx #cave_outer_give_sub_message - jsr finish_parse_message - - jsr cave_outer_get_shield - - ; FIXME: back out the keeper - - rts - -parse_quiz_unknown: - ldx #cave_outer_keeper_wants_message - jmp finish_parse_message - -verb_table = $BF00 - - -setup_quiz_verb_table: - ldx #0 -unknown_loop: - lda #<(parse_quiz_unknown-1) - sta verb_table,X - lda #>(parse_quiz_unknown-1) - sta verb_table+1,X - inx - inx - cpx #(VERB_ALL_DONE*2) - bne unknown_loop - - rts - - ;============================= - ; you got the shield somehow - ;============================= -cave_outer_get_shield: - - lda #0 - sta IN_QUIZ - - ; re-set up the verb table - - jsr setup_heights_verb_table - - ; actually get the shield - - lda INVENTORY_2 - ora #INV2_TROGSHIELD ; get the shield - sta INVENTORY_2 - - ; score points - lda #5 - jsr score_points - - ; FIXME: load new peasant sprite with shield - - rts - - .include "../text/dialog_cliff_heights.inc" diff --git a/games/peasant/cliff_heights/sprites_heights/Makefile b/games/peasant/cliff_heights/sprites_heights/Makefile index d29fdb4c..ae74caf5 100644 --- a/games/peasant/cliff_heights/sprites_heights/Makefile +++ b/games/peasant/cliff_heights/sprites_heights/Makefile @@ -1,6 +1,7 @@ + HGR_SPRITE = ../../../../utils/hgr-utils/hgr_make_sprite -all: lightning_sprites.inc ron_sprites.inc +all: lightning_sprites.inc lightning_sprites.inc: lightning.png $(HGR_SPRITE) -s -l small_lightning1 lightning.png 14 3 27 14 > lightning_sprites.inc @@ -12,34 +13,7 @@ lightning_sprites.inc: lightning.png $(HGR_SPRITE) -s -l big_lightning3 lightning.png 112 51 167 118 >> lightning_sprites.inc $(HGR_SPRITE) -s -l big_lightning0 lightning.png 182 51 237 118 >> lightning_sprites.inc -ron_sprites.inc: keeper1_sprites.png - $(HGR_SPRITE) -l ron0 keeper1_sprites.png 14 32 27 61 > ron_sprites.inc - $(HGR_SPRITE) -l ron1 keeper1_sprites.png 42 32 55 62 >> ron_sprites.inc - $(HGR_SPRITE) -l ron2 keeper1_sprites.png 70 32 83 62 >> ron_sprites.inc - $(HGR_SPRITE) -l ron3 keeper1_sprites.png 98 32 111 62 >> ron_sprites.inc - $(HGR_SPRITE) -l ron4 keeper1_sprites.png 126 32 139 62 >> ron_sprites.inc - $(HGR_SPRITE) -l ron0_mask keeper1_sprites.png 14 63 27 93 >> ron_sprites.inc - $(HGR_SPRITE) -l ron1_mask keeper1_sprites.png 42 63 55 93 >> ron_sprites.inc - $(HGR_SPRITE) -l ron2_mask keeper1_sprites.png 70 63 83 93 >> ron_sprites.inc - $(HGR_SPRITE) -l ron3_mask keeper1_sprites.png 98 63 111 93 >> ron_sprites.inc - $(HGR_SPRITE) -l ron4_mask keeper1_sprites.png 126 63 139 93 >> ron_sprites.inc - $(HGR_SPRITE) -l keeper0 keeper1_sprites.png 14 128 27 156 >> ron_sprites.inc - $(HGR_SPRITE) -l keeper1 keeper1_sprites.png 42 128 55 156 >> ron_sprites.inc - $(HGR_SPRITE) -l keeper2 keeper1_sprites.png 70 128 90 156 >> ron_sprites.inc - $(HGR_SPRITE) -l keeper3 keeper1_sprites.png 98 128 118 156 >> ron_sprites.inc - $(HGR_SPRITE) -l keeper4 keeper1_sprites.png 126 128 146 156 >> ron_sprites.inc - $(HGR_SPRITE) -l keeper5 keeper1_sprites.png 154 128 174 156 >> ron_sprites.inc - $(HGR_SPRITE) -l keeper6 keeper1_sprites.png 182 128 202 156 >> ron_sprites.inc - $(HGR_SPRITE) -l keeper7 keeper1_sprites.png 210 128 230 156 >> ron_sprites.inc - $(HGR_SPRITE) -l keeper0_mask keeper1_sprites.png 14 159 27 187 >> ron_sprites.inc - $(HGR_SPRITE) -l keeper1_mask keeper1_sprites.png 42 159 55 187 >> ron_sprites.inc - $(HGR_SPRITE) -l keeper2_mask keeper1_sprites.png 70 159 90 187 >> ron_sprites.inc - $(HGR_SPRITE) -l keeper3_mask keeper1_sprites.png 98 159 118 187 >> ron_sprites.inc - $(HGR_SPRITE) -l keeper4_mask keeper1_sprites.png 126 159 146 187 >> ron_sprites.inc - $(HGR_SPRITE) -l keeper5_mask keeper1_sprites.png 154 159 174 187 >> ron_sprites.inc - $(HGR_SPRITE) -l keeper6_mask keeper1_sprites.png 182 159 202 187 >> ron_sprites.inc - $(HGR_SPRITE) -l keeper7_mask keeper1_sprites.png 210 159 230 187 >> ron_sprites.inc - - clean: - rm -f *~ lightning_sprites.inc ron_sprites.inc + rm -f *~ lightning_sprites.inc \ + keeper1_sprites.inc ron_sprites.inc \ + keeper2_sprites.inc diff --git a/games/peasant/common_defines.inc b/games/peasant/common_defines.inc new file mode 100644 index 00000000..7e6907bc --- /dev/null +++ b/games/peasant/common_defines.inc @@ -0,0 +1,2 @@ + +collision_location = $bc00 ; FIXME: how big? somewhere else? diff --git a/games/peasant/docs/disk_map.txt b/games/peasant/docs/disk_map.txt index af287fe6..4c40d16f 100644 --- a/games/peasant/docs/disk_map.txt +++ b/games/peasant/docs/disk_map.txt @@ -29,11 +29,20 @@ T 1 = MAP 2556 bytes 2T (8192) 6k free T 3 = ARCHERY 2016 bytes 4T (16384) 14k free T 7 = INSIDE 13457 bytes 4T (16384) 3k free T 11 = INN 8935 bytes 4T (16384) 7k free + +Disk4 Map (disk has 35 tracks, each 4k in size) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +T 0 = WBOOT4 +T 1 = CLIFF_BASE 6071 bytes 2T (8192) 2k free +T 3 = CLIMB 12448 bytes 4T (16384) 4k free +T 7 = HEIGHTS 14948 bytes 4T (16384) 1k free +T 11 = OUTER 14948 bytes 4T (16384) 1k free T 15 = TROGDOR 14771 bytes 4T (16384) 3k free T 19 = ENDING 17037 bytes 5T (20480) 3k free -T 24 = CLIFF_BASE 6071 bytes 2T (8192) 2k free -T 26 = CLIMB 12448 bytes 4T (16384) 4k free -T 30 = HEIGHTS 14948 bytes 4T (16384) 1k free +SECOND COPY OF MUSIC TO AVOID DISK SWAP? PEASANT SPRITES? +S.A.M. CODE? + + diff --git a/games/peasant/outer/Makefile b/games/peasant/outer/Makefile new file mode 100644 index 00000000..a2b33073 --- /dev/null +++ b/games/peasant/outer/Makefile @@ -0,0 +1,51 @@ +include ../../../Makefile.inc + +LINKER_SCRIPTS = ../../../linker_scripts + +all: OUTER + +#### + +OUTER: outer.o + ld65 -o OUTER outer.o -C $(LINKER_SCRIPTS)/apple2_6000.inc + +outer.o: outer.s \ + ../zp.inc ../hardware.inc ../qload.inc ../version.inc \ + ../inventory/inventory.inc \ + ../parse_input.inc ../common_defines.inc \ + outer_actions.s \ + ../text/DIALOG_OUTER.ZX02 ../text/dialog_outer.inc \ + graphics_outer/outer_graphics.inc \ + graphics_outer/outer_priority.inc \ + sprites_outer/ron_sprites.inc \ + sprites_outer/keeper1_sprites.inc \ + sprites_outer/keeper2_sprites.inc \ + ../sprites_peasant/robe_sprites.zx02 \ + ../draw_peasant.s ../move_peasant.s \ + ../gr_copy.s ../hgr_copy.s \ + ../new_map_location.s \ + ../keyboard.s \ + ../wait.s ../wait_a_bit.s + ca65 -o outer.o outer.s -l outer.lst + +### + +graphics_outer/outer_graphics.inc: + cd graphics_outer && make + +### + +sprites_outer/ron_sprites.inc: + cd sprites_outer && make + +### + +distclean: + make clean + cd graphics_outer && make clean + cd sprites_outer && make clean + +### + +clean: + rm -f *~ *.o *.lst OUTER diff --git a/games/peasant/outer/graphics_outer/Makefile b/games/peasant/outer/graphics_outer/Makefile new file mode 100644 index 00000000..0d1e02d5 --- /dev/null +++ b/games/peasant/outer/graphics_outer/Makefile @@ -0,0 +1,50 @@ +PNG2GR = ../../../../utils/gr-utils/png2gr +PNG2HGR = ../../../../utils/hgr-utils/png2hgr +ZX02 = ~/research/6502_compression/zx02.git/build/zx02 +PNG2COLLISION = ../../../../utils/gr-utils/png2collision + +all: outer_graphics.inc \ + outer_priority.inc + +### + +outer_graphics.inc: \ + outer.zx02 + echo "outer_zx02: .incbin \"outer.zx02\"" > outer_graphics.inc + +### + +outer_priority.inc: \ + outer_priority.zx02 + echo "outer_priority_zx02: .incbin \"outer_priority.zx02\"" > outer_priority.inc + +### + +outer.zx02: outer.hgr + $(ZX02) -f outer.hgr outer.zx02 + +outer.hgr: outer.png + $(PNG2HGR) outer.png > outer.hgr + +#### + +outer_priority.zx02: outer_priority.combined + $(ZX02) -f outer_priority.combined outer_priority.zx02 + +outer_priority.combined: outer_priority.gr outer_collision.bin + cat outer_priority.gr > outer_priority.combined + cat outer_collision.bin >> outer_priority.combined + +outer_priority.gr: outer_priority.png + $(PNG2GR) outer_priority.png outer_priority.gr + +outer_collision.bin: outer_collision.png + $(PNG2COLLISION) outer_collision.png outer_collision.bin + +#### + + +clean: + rm -f *~ outer_graphics.inc outer_priority.inc \ + *.bin *.combined *.zx02 *.gr *.hgr + diff --git a/games/peasant/cliff_heights/graphics_heights/outer.png b/games/peasant/outer/graphics_outer/outer.png similarity index 100% rename from games/peasant/cliff_heights/graphics_heights/outer.png rename to games/peasant/outer/graphics_outer/outer.png diff --git a/games/peasant/cliff_heights/graphics_heights/outer_collision.png b/games/peasant/outer/graphics_outer/outer_collision.png similarity index 100% rename from games/peasant/cliff_heights/graphics_heights/outer_collision.png rename to games/peasant/outer/graphics_outer/outer_collision.png diff --git a/games/peasant/cliff_heights/graphics_heights/outer_priority.png b/games/peasant/outer/graphics_outer/outer_priority.png similarity index 100% rename from games/peasant/cliff_heights/graphics_heights/outer_priority.png rename to games/peasant/outer/graphics_outer/outer_priority.png diff --git a/games/peasant/outer/outer.s b/games/peasant/outer/outer.s new file mode 100644 index 00000000..5c5ede3c --- /dev/null +++ b/games/peasant/outer/outer.s @@ -0,0 +1,1024 @@ +; Peasant's Quest + +; Trogdor's Outer Sanctum + +; split off from cliff heights as it was too big and there's +; a lot going on + +; by Vince `deater` Weaver vince@deater.net + +.include "../zp.inc" +.include "../hardware.inc" + +.include "../peasant_sprite.inc" +.include "../qload.inc" +.include "../inventory/inventory.inc" +.include "../parse_input.inc" +.include "../redbook_sound.inc" +.include "../common_defines.inc" + +LOCATION_BASE = LOCATION_TROGDOR_OUTER ; (22 = $16) + +outer: + + lda #0 + sta LEVEL_OVER + sta FRAME + sta FLAME_COUNT + sta KEEPER_COUNT + sta IN_QUIZ + + jsr hgr_make_tables + + ;================================ + ; decompress dialog to $D000 + + lda #outer_text_zx02 + sta zx_src_h+1 + + lda #$D0 + + jsr zx02_full_decomp + + ;=============================== + ; update score + + jsr update_score + + + ;============================= + ;============================= + ; new screen location + ;============================= + ;============================= + +new_location: + lda #0 + sta LEVEL_OVER + + ;========================== + ; load updated verb table + + jsr setup_outer_verb_table + + + ;=============================== + ; load priority to $400 + ; indirectly as we can't trash screen holes + + lda MAP_LOCATION + sec + sbc #LOCATION_BASE + tax + + lda map_priority_low,X + sta zx_src_l+1 + lda map_priority_hi,X + sta zx_src_h+1 + + lda #$20 ; temporarily load to $2000 + + jsr zx02_full_decomp + + ; copy to $400 + + jsr gr_copy_to_page1 + + ; copy collision detection info + + ldx #0 +col_copy_loop: + lda $2400,X + sta collision_location,X + inx + bne col_copy_loop + + + ;===================== + ; load bg + + lda MAP_LOCATION + sec + sbc #LOCATION_BASE + tax + + lda map_backgrounds_low,X + sta zx_src_l+1 + lda map_backgrounds_hi,X + sta zx_src_h+1 + + lda #$20 ; load to $2000 + + jsr zx02_full_decomp + + jsr hgr_copy ; copy to $4000 + + ;=================== + ; put peasant text + + lda #peasant_text + sta OUTH + + jsr hgr_put_string + + ;=================== + ; put score + + jsr print_score + + + ;====================== + ; always activate text + + jsr setup_prompt + + + ;======================== + ; Load Peasant Sprites + ;======================== + ; Note: to get to this point of the game you have to be + ; in a robe and on fire, so we should enforce that + + lda GAME_STATE_2 + ora #ON_FIRE + sta GAME_STATE_2 + + lda #robe_sprite_data + sta zx_src_h+1 + + lda #$a0 + + jsr zx02_full_decomp + + + ; clear the keyboard in case we were holding it down + + bit KEYRESET + + + ;=========================== + ;=========================== + ;=========================== + ; main loop + ;=========================== + ;=========================== + ;=========================== +game_loop: + + ;=================== + ; move peasant + + jsr move_peasant + + ;==================== + ; check if done level + + lda LEVEL_OVER + bmi oops_new_location + beq level_good + + jmp level_over + +level_good: + + + ;===================== + ; see if keeper triggered + + lda MAP_LOCATION + cmp #LOCATION_TROGDOR_OUTER + bne done_check_keeper + + lda IN_QUIZ + bne done_check_keeper + +check_keeper1: + lda INVENTORY_2 + and #INV2_TROGSHIELD ; only if not have shield + bne check_keeper2 + + lda PEASANT_X ; only if ourx > 9 + cmp #10 + bcc check_keeper2 + + jsr handle_keeper1 + +check_keeper2: + + + + +done_check_keeper: + + + ;================================= + ; draw keeper if we need refresh + + lda REFRESH_SCREEN + beq no_draw_keeper + + lda #0 + sta REFRESH_SCREEN + + lda IN_QUIZ ; need to draw keeper if quizzing + beq no_draw_keeper + + jsr draw_standing_keeper + +no_draw_keeper: + + ;===================== + ; always draw peasant + + jsr draw_peasant + + ;===================== + ; increment frame + + inc FRAME + + ;===================== + ; increment flame + + jsr increment_flame + + ;====================== + ; check keyboard + + ; original code also waited approximately 100ms? + ; this led to keypressed being lost + + lda PEASANT_DIR + sta OLD_DIR + + lda #13 + sta WAIT_LOOP +wait_loop: + + + lda IN_QUIZ + cmp #2 ; means waiting for answer + bne normal_keyboard_check + + jsr check_keyboard_answer + jmp done_keyboard_check + +normal_keyboard_check: + + jsr check_keyboard + +done_keyboard_check: + + lda #50 ; approx 7ms + jsr wait + + dec WAIT_LOOP + bne wait_loop + + ;=================================== + ; keep from moving if being quizzed + ;=================================== + + lda IN_QUIZ + beq not_in_quiz + + lda #0 ; keep from moving + sta PEASANT_XADD + sta PEASANT_YADD + + lda OLD_DIR ; keep from changing dir + sta PEASANT_DIR + +not_in_quiz: + + jsr wait_vblank + + jmp game_loop + +oops_new_location: + + ; new location but same file + + lda MAP_LOCATION + cmp #LOCATION_CLIFF_HEIGHTS + bne not_the_cliff + + lda PREVIOUS_LOCATION + cmp #LOCATION_TROGDOR_OUTER + beq to_cliff_from_outer + +to_cliff_from_cliff: + lda #18 + sta PEASANT_X + lda #140 + sta PEASANT_Y + bne not_the_cliff ; bra + +to_cliff_from_outer: + lda #32 + sta PEASANT_X + lda #120 + sta PEASANT_Y + bne not_the_cliff ; bra + +not_the_cliff: + + lda MAP_LOCATION + cmp #LOCATION_TROGDOR_OUTER + bne not_outer + + lda #2 + sta PEASANT_X + lda #100 + sta PEASANT_Y + +not_outer: +just_go_there: + + jmp new_location + + + ;======================== + ; exit level + ;======================== +level_over: + + cmp #NEW_FROM_LOAD ; see if loading save game + beq exiting_cliff + + ; new location + ; in theory this can only be TROGDOR + + lda #4 + sta PEASANT_X + lda #170 + sta PEASANT_Y + + lda #0 + sta PEASANT_XADD + sta PEASANT_YADD +exiting_cliff: + rts + + +.include "../draw_peasant_new.s" +.include "../move_peasant_new.s" + +.include "../hgr_sprite_bg_mask.s" +.include "../gr_offsets.s" +.include "../hgr_partial_restore.s" +.include "../hgr_sprite.s" + +.include "../gr_copy.s" +.include "../hgr_copy.s" + +.include "../new_map_location.s" + +.include "../keyboard.s" + +.include "../wait.s" +.include "../wait_a_bit.s" + +.include "../vblank.s" + +.include "graphics_outer/outer_graphics.inc" +.include "graphics_outer/outer_priority.inc" + +map_backgrounds_low: + .byte outer_zx02 + +map_priority_low: + .byte outer_priority_zx02 + +verb_tables_low: + .byte cave_outer_verb_table + + + +outer_text_zx02: +.incbin "../text/DIALOG_OUTER.ZX02" + +.include "outer_actions.s" + +robe_sprite_data: + .incbin "../sprites_peasant/robe_sprites.zx02" +; .incbin "../sprites_peasant/robe_shield_sprites.zx02" + + +.include "sprites_outer/keeper1_sprites.inc" +.include "sprites_outer/ron_sprites.inc" +;.include "sprites_outer/keeper2_sprites.inc" + + +;========================================== +; first keeper ron + +; flips peasant forward +; 3 (4) (u shaped) +; 5 (4) (up) +; 6 (6) (up, up) +; 7 (4) (up, down) +; 6 (4) +; 7 (4) +; 6 (4) +; 7 (4) +; 6 (4) +; 7 (4) +; 6 (4) +; 7 (4) 9? repeats, ending on down +; ron transition happens +; (8) switches to 5 part way through first frame? +; 3 / ron next , to 1 part way through second (cloud frame) +; 5 ron (gap) +; 10 ron (tiny smoke) +; 10 full ron + +ron_which_keeper_sprite: +.byte 3, 5, 6, 7 +.byte 6, 7, 6, 7 +.byte 6, 7, 6, 7 + +.byte 7, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1 + +ron_which_ron_sprite: +.byte 0, 0, 0, 0 +.byte 0, 0, 0, 0 +.byte 0, 0, 0, 0 + +.byte 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 4 + + + ;=============================== + ; ron transform + ;=============================== +ron_transform: + + lda #0 + sta KEEPER_COUNT + + ; look down for this + + lda #PEASANT_DIR_DOWN + sta PEASANT_DIR + +ron1_loop: + + ; play sound if needed, 2.. 12 + + lda KEEPER_COUNT + cmp #2 + bcc skip_ron_sound + cmp #12 + bcs skip_ron_sound + + and #1 + beq ron_other_note + + lda #NOTE_F6 + beq ron_common_note ; bra +ron_other_note: + lda #NOTE_E6 + +ron_common_note: + sta speaker_frequency + lda #8 + sta speaker_duration + jsr speaker_tone + +skip_ron_sound: + + ; erase prev keeper + + ldy #3 ; erase slot 3? + jsr hgr_partial_restore_by_num + + inc KEEPER_COUNT + ldx KEEPER_COUNT + + lda #10 + sta SPRITE_X + lda #60 + sta SPRITE_Y + + ; get offset for graphics + + ldx KEEPER_COUNT + lda ron_which_keeper_sprite,X + clc + adc #5 ; skip ron + tax + + ldy #3 ; ? slot + + jsr hgr_draw_sprite_save + + ;======================= + ; see if done animation + + lda KEEPER_COUNT + cmp #21 ; + beq ron_done + + cmp #12 + bcc ron_peasant ; normal peasant first 12 frames + + ; erase prev peasant + + ldy #4 ; erase slot 4? + jsr hgr_partial_restore_by_num + + ldx KEEPER_COUNT + + lda PEASANT_X + sta SPRITE_X + lda PEASANT_Y + sta SPRITE_Y + + ; get offset for graphics + +; ldx KEEPER_COUNT + lda ron_which_ron_sprite,X + tax + + ldy #4 ; ? slot + + jsr hgr_draw_sprite_save + + jmp done_ron_peasant + +ron_peasant: + ;======================== + ; draw peasant + + jsr draw_peasant + + + ;======================== + ; increment flame + + jsr increment_flame +done_ron_peasant: + + ;========================= + ; delay + + lda #200 + jsr wait + + jsr wait_vblank + + jmp ron1_loop + +ron_done: + + ;=========================== + ; weep sound + + lda #32 + sta speaker_duration + lda #NOTE_E5 + sta speaker_frequency + jsr speaker_tone + lda #64 + sta speaker_duration + lda #NOTE_F5 + sta speaker_frequency + jsr speaker_tone + + jsr wait_until_keypress + + rts + +;========================================== +; first keeper info +; +; seems to trigger at approx peasant_x = 70 (10) +; + +; 0 (4), move down/r +; 0 (4), move down/r +; 1 (4), no move +; 1 (5), move down/r + +; 1 (5), move down/r +; 1 (5), move down/r +; 1 (5), move down/r +; 1 (5), move down/r + +; 2 (5) +; 3 (4) +; 4 (10) +; 3 (10) + +; 4 (15) +; 3 (5) +; 2 (5) +; 1 (11) ; starts talking + + + +keeper_x: +.byte 9, 9,10,10 +.byte 10,10,10,10 +.byte 10,10,10,10, 10,10 +.byte 10,10,10,10,10,10,10 + +keeper_y: +.byte 51,52,53,54 +.byte 56,58,59,60 +.byte 60,60,60,60, 60,60 +.byte 60,60,60,60, 60,60,60 + +which_keeper_sprite: +.byte 0, 0, 1, 1 +.byte 1, 1, 1, 1 +.byte 2, 3, 4, 4, 3, 3 + +.byte 4, 4, 4, 3, 2, 1, 1 + + + ;=============================== + ; handle keeper1 + ;=============================== + ; handle keeper1 + ; stop walking + ; have keeper come out to talk + ; special limited handling + ; can't walk unless win +handle_keeper1: + + lda #0 ; stop walking + sta PEASANT_XADD + sta PEASANT_YADD + + ;=========================== + ; animate keeper coming out + + +keeper1_loop: + + ; erase prev keeper + + ldy #3 ; erase slot 3? + jsr hgr_partial_restore_by_num + + inc KEEPER_COUNT + ldx KEEPER_COUNT + + lda keeper_x,X + sta SPRITE_X + lda keeper_y,X + sta SPRITE_Y + + ; get offset for graphics + + ldx KEEPER_COUNT + lda which_keeper_sprite,X + clc + adc #5 ; skip ron + tax + + ldy #3 ; ? slot + + jsr hgr_draw_sprite_save + + ;======================= + ; see if done animation + + lda KEEPER_COUNT + cmp #20 ; + beq keeper_talk1 + + + + ;======================== + ; increment flame + + jsr draw_peasant + + ;======================== + ; increment flame + + jsr increment_flame + + ;========================= + ; delay + + lda #200 + jsr wait + + jsr wait_vblank + + jmp keeper1_loop + + rts + + + ;==================== + ; increment flame + ;==================== +increment_flame: + inc FLAME_COUNT + lda FLAME_COUNT + cmp #3 + bne flame_good + + lda #0 + sta FLAME_COUNT + +flame_good: + rts + +keeper_talk1: + ; print the message + + ldx #cave_outer_keeper1_message1 + jsr finish_parse_message + + jsr draw_standing_keeper + + ldx #cave_outer_keeper1_message2 + jsr finish_parse_message + + jsr draw_standing_keeper + + ldx #cave_outer_keeper1_message3 + jsr finish_parse_message + + jsr draw_standing_keeper + + ldx #cave_outer_keeper1_message4 + jsr finish_parse_message + + jsr draw_standing_keeper + + ;=============================================== + ; if have sub print5, otherwise skip ahead + + lda INVENTORY_2 + and #INV2_MEATBALL_SUB + beq dont_have_sub + + ldx #cave_outer_keeper1_message5 + jsr finish_parse_message + + jsr draw_standing_keeper + +dont_have_sub: + + ; now we need to re-draw keeper + ; also we're in quiz mode + ; so we can't move and can only take quiz or give sub + + lda #1 + sta IN_QUIZ + + ; custom common verb table the essentially does nothing + jsr setup_quiz_verb_table + + ; respond only to take quiz and give sub + lda #keeper1_verb_table + sta INH + jsr load_custom_verb_table + + jmp game_loop + + + ;============================== + ; check_keyboard_answer + ;============================== + ; for when in quiz + ; looking for just A, B, or C + +check_keyboard_answer: + + lda KEYPRESS + bpl no_answer + + bit KEYRESET + + pha + jsr restore_parse_message + + lda #0 + sta REFRESH_SCREEN ; don't refresh or we draw keeper on top + + pla + + and #$7f ; strip high bit + and #$df ; convert to lowercase $61 -> $41 0110 -> 0100 + + cmp #'A' + bcc invalid_answer ; blt + cmp #'D' + bcs invalid_answer ; bge + + ldx WHICH_QUIZ + + cmp quiz1_answers,X + beq right_answer + bne wrong_answer + +no_answer: + rts + + ;====================== + ; quiz1 invalid answer + ;====================== + +invalid_answer: + bit KEYRESET ; clear the keyboard buffer + + lda WHICH_QUIZ + cmp #2 ; off by 1 + beq resay_quiz3 + cmp #1 + beq resay_quiz2 + +resay_quiz1: + ldx #cave_outer_quiz1_1again + jmp finish_parse_message_nowait +resay_quiz2: + ldx #cave_outer_quiz1_2again + jmp finish_parse_message_nowait +resay_quiz3: + ldx #cave_outer_quiz1_3again + jmp finish_parse_message_nowait + + + ;====================== + ; quiz1 wrong answer + ;====================== + +wrong_answer: + bit KEYRESET ; clear the keyboard buffer + + ldx #cave_outer_quiz1_wrong + jsr finish_parse_message + + jsr draw_standing_keeper + + ldx #cave_outer_quiz1_wrong_part2 + jsr finish_parse_message + + jsr draw_standing_keeper + + ldx #cave_outer_quiz1_wrong_part3 + jsr finish_parse_message + + ; transform to ron + + jsr ron_transform + + ldx #cave_outer_quiz1_wrong_part4 + jsr finish_parse_message + + lda #0 + sta IN_QUIZ + + ; game over + + lda #LOAD_GAME_OVER + sta WHICH_LOAD + + lda #NEW_FROM_DISK + sta LEVEL_OVER + + rts + + ;====================== + ; quiz1 correct answer + ;====================== + +right_answer: + bit KEYRESET ; clear the keyboard buffer + ldx #cave_outer_quiz1_correct + jsr finish_parse_message + + jsr cave_outer_get_shield + + ; FIXME: animate keeper backing off + + rts + +quiz1_answers: + .byte 'B','A','C' + + ;============================ + ; setup outer verb table + ;============================ + ; we do this a lot so make it a function + +setup_outer_verb_table: + ; setup default verb table + + jsr setup_default_verb_table + + ; local verb table + + lda MAP_LOCATION + sec + sbc #LOCATION_BASE + tax + + lda verb_tables_low,X + sta INL + lda verb_tables_hi,X + sta INH + jsr load_custom_verb_table + + rts + + + ;========================== + ; draw standing keeper + ;========================== +draw_standing_keeper: + + ; erase prev keeper + + ldy #3 ; erase slot 3? + jsr hgr_partial_restore_by_num + + ldx #19 + + lda keeper_x,X + sta SPRITE_X + lda keeper_y,X + sta SPRITE_Y + + ; get offset for graphics + + ldx #19 + lda which_keeper_sprite,X + clc + adc #5 ; skip ron + tax + + ldy #3 ; ? slot + + jsr hgr_draw_sprite_save + + rts + +sprites_xsize: + .byte 2, 2, 2, 2, 2 ; ron 0..4 + .byte 2, 2, 3, 3, 3, 3, 3, 3 ; keeper 0..7 + +sprites_ysize: + .byte 29,30,30,30,30 ; ron 0..4 + .byte 28,28,28,28,28,28,28,28 ; keeper 0..7 + +sprites_data_l: + .byte ron0,>ron1,>ron2,>ron3,>ron4 + .byte >keeper_r0,>keeper_r1,>keeper_r2,>keeper_r3 + .byte >keeper_r4,>keeper_r5,>keeper_r6,>keeper_r7 + + +sprites_mask_l: + .byte ron0_mask,>ron1_mask,>ron2_mask,>ron3_mask,>ron4_mask + .byte >keeper_r0_mask,>keeper_r1_mask,>keeper_r2_mask,>keeper_r3_mask + .byte >keeper_r4_mask,>keeper_r5_mask,>keeper_r6_mask,>keeper_r7_mask + +.include "../hgr_sprite_save.s" diff --git a/games/peasant/outer/outer_actions.s b/games/peasant/outer/outer_actions.s new file mode 100644 index 00000000..922a5258 --- /dev/null +++ b/games/peasant/outer/outer_actions.s @@ -0,0 +1,233 @@ +.include "../tokens.inc" + + ;======================= + ;======================= + ;======================= + ; Trogdor Cave Outer + ;======================= + ;======================= + ;======================= + +cave_outer_verb_table: + .byte VERB_CLIMB + .word cave_outer_climb-1 + .byte VERB_LOOK + .word cave_outer_look-1 + .byte 0 + + ;================= + ; look + ;================= + +cave_outer_look: + + lda CURRENT_NOUN + + cmp #NOUN_BEADS + beq cave_outer_look_at_curtain + cmp #NOUN_CURTAIN + beq cave_outer_look_at_curtain + cmp #NOUN_DOOR + beq cave_outer_look_at_door + cmp #NOUN_SKELETON + beq cave_outer_look_at_skeleton + cmp #NOUN_OPENINGS + beq cave_outer_look_at_openings + cmp #NOUN_NONE + beq cave_outer_look_at + + jmp parse_common_look + +cave_outer_look_at: + ldx #cave_outer_look_message + jmp finish_parse_message + +cave_outer_look_at_curtain: + ldx #cave_outer_look_curtain_message + jmp finish_parse_message + +cave_outer_look_at_door: + ldx #cave_outer_look_door_message + jmp finish_parse_message + +cave_outer_look_at_openings: + ldx #cave_outer_look_openings_message + jmp finish_parse_message + +cave_outer_look_at_skeleton: + ldx #cave_outer_look_skeleton_message + jmp finish_parse_message + + + ;================ + ; climb + ;================ +cave_outer_climb: + + lda CURRENT_NOUN + + cmp #NOUN_CLIFF + beq cave_outer_do_climb + cmp #NOUN_NONE + beq cave_outer_do_climb + + jmp parse_common_unknown + +cave_outer_do_climb: + ldx #cave_outer_climb_message + jmp finish_parse_message + + + ;======================= + ;======================= + ;======================= + ; Trogdor Cave Outer -- Keeper 1 + ;======================= + ;======================= + ;======================= + +keeper1_verb_table: + .byte VERB_TAKE + .word keeper1_take-1 + .byte VERB_GIVE + .word keeper1_give-1 + .byte 0 + + ;============================= + ; take + ;============================= + ; can only take quiz + ; + +keeper1_take: +; lda IN_QUIZ +; bne actual_quiz +; ; it not being quizzed, can't try to take it?? +; jmp parse_common_get ; is this the right path + +actual_quiz: + + lda CURRENT_NOUN + + cmp #NOUN_QUIZ + beq cave_outer_take_quiz + + ; if not say quiz, give hint + +cave_outer_hint: + ldx #cave_outer_keeper_wants_message + jmp finish_parse_message + +cave_outer_take_quiz: + inc IN_QUIZ ; make it 2 which means wait for answer + + jsr random8 + cmp #85 + bcc keeper1_quiz3 + cmp #170 + bcc keeper1_quiz2 +keeper1_quiz1: + lda #0 + ldx #cave_outer_quiz1_1 + jmp keeper1_quiz_common + +keeper1_quiz2: + lda #1 + ldx #cave_outer_quiz1_2 + jmp keeper1_quiz_common + +keeper1_quiz3: + lda #2 + ldx #cave_outer_quiz1_3 +keeper1_quiz_common: + sta WHICH_QUIZ + jmp finish_parse_message_nowait + + + ;============================= + ; give + ;============================= + ; can only give sub/sandwich + +keeper1_give: + + lda CURRENT_NOUN + + cmp #NOUN_SUB + beq cave_outer_give_sub + cmp #NOUN_SANDWICH + beq cave_outer_give_sandwich + +cave_outer_give_sub: +cave_outer_give_sandwich: + + ldx #cave_outer_give_sub_message + jsr finish_parse_message + + jsr cave_outer_get_shield + + ; FIXME: back out the keeper + + rts + +parse_quiz_unknown: + ldx #cave_outer_keeper_wants_message + jmp finish_parse_message + +verb_table = $BF00 + + +setup_quiz_verb_table: + ldx #0 +unknown_loop: + lda #<(parse_quiz_unknown-1) + sta verb_table,X + lda #>(parse_quiz_unknown-1) + sta verb_table+1,X + inx + inx + cpx #(VERB_ALL_DONE*2) + bne unknown_loop + + rts + + ;============================= + ; you got the shield somehow + ;============================= +cave_outer_get_shield: + + lda #0 + sta IN_QUIZ + + ; re-set up the verb table + + jsr setup_outer_verb_table + + ; actually get the shield + + lda INVENTORY_2 + ora #INV2_TROGSHIELD ; get the shield + sta INVENTORY_2 + + ; score points + lda #5 + jsr score_points + + ; FIXME: load new peasant sprite with shield + + rts + + +.include "../text/dialog_outer.inc" diff --git a/games/peasant/outer/sprites_outer/Makefile b/games/peasant/outer/sprites_outer/Makefile new file mode 100644 index 00000000..25f0c051 --- /dev/null +++ b/games/peasant/outer/sprites_outer/Makefile @@ -0,0 +1,59 @@ + +HGR_SPRITE = ../../../../utils/hgr-utils/hgr_make_sprite + +all: keeper1_sprites.inc ron_sprites.inc \ + keeper2_sprites.inc + +keeper1_sprites.inc: keeper1_sprites.png + $(HGR_SPRITE) -l keeper_r0 keeper1_sprites.png 14 128 27 156 > keeper1_sprites.inc + $(HGR_SPRITE) -l keeper_r1 keeper1_sprites.png 42 128 55 156 >> keeper1_sprites.inc + $(HGR_SPRITE) -l keeper_r2 keeper1_sprites.png 70 128 90 156 >> keeper1_sprites.inc + $(HGR_SPRITE) -l keeper_r3 keeper1_sprites.png 98 128 118 156 >> keeper1_sprites.inc + $(HGR_SPRITE) -l keeper_r4 keeper1_sprites.png 126 128 146 156 >> keeper1_sprites.inc + $(HGR_SPRITE) -l keeper_r5 keeper1_sprites.png 154 128 174 156 >> keeper1_sprites.inc + $(HGR_SPRITE) -l keeper_r6 keeper1_sprites.png 182 128 202 156 >> keeper1_sprites.inc + $(HGR_SPRITE) -l keeper_r7 keeper1_sprites.png 210 128 230 156 >> keeper1_sprites.inc + $(HGR_SPRITE) -l keeper_r0_mask keeper1_sprites.png 14 159 27 187 >> keeper1_sprites.inc + $(HGR_SPRITE) -l keeper_r1_mask keeper1_sprites.png 42 159 55 187 >> keeper1_sprites.inc + $(HGR_SPRITE) -l keeper_r2_mask keeper1_sprites.png 70 159 90 187 >> keeper1_sprites.inc + $(HGR_SPRITE) -l keeper_r3_mask keeper1_sprites.png 98 159 118 187 >> keeper1_sprites.inc + $(HGR_SPRITE) -l keeper_r4_mask keeper1_sprites.png 126 159 146 187 >> keeper1_sprites.inc + $(HGR_SPRITE) -l keeper_r5_mask keeper1_sprites.png 154 159 174 187 >> keeper1_sprites.inc + $(HGR_SPRITE) -l keeper_r6_mask keeper1_sprites.png 182 159 202 187 >> keeper1_sprites.inc + $(HGR_SPRITE) -l keeper_r7_mask keeper1_sprites.png 210 159 230 187 >> keeper1_sprites.inc + +ron_sprites.inc: keeper1_sprites.png + $(HGR_SPRITE) -l ron0 keeper1_sprites.png 14 32 27 61 > ron_sprites.inc + $(HGR_SPRITE) -l ron1 keeper1_sprites.png 42 32 55 62 >> ron_sprites.inc + $(HGR_SPRITE) -l ron2 keeper1_sprites.png 70 32 83 62 >> ron_sprites.inc + $(HGR_SPRITE) -l ron3 keeper1_sprites.png 98 32 111 62 >> ron_sprites.inc + $(HGR_SPRITE) -l ron4 keeper1_sprites.png 126 32 139 62 >> ron_sprites.inc + $(HGR_SPRITE) -l ron0_mask keeper1_sprites.png 14 63 27 93 >> ron_sprites.inc + $(HGR_SPRITE) -l ron1_mask keeper1_sprites.png 42 63 55 93 >> ron_sprites.inc + $(HGR_SPRITE) -l ron2_mask keeper1_sprites.png 70 63 83 93 >> ron_sprites.inc + $(HGR_SPRITE) -l ron3_mask keeper1_sprites.png 98 63 111 93 >> ron_sprites.inc + $(HGR_SPRITE) -l ron4_mask keeper1_sprites.png 126 63 139 93 >> ron_sprites.inc + + +keeper2_sprites.inc: keeper2_sprites.png + $(HGR_SPRITE) -l keeper_l0 keeper2_sprites.png 14 128 27 156 > keeper2_sprites.inc + $(HGR_SPRITE) -l keeper_l1 keeper2_sprites.png 42 128 55 156 >> keeper2_sprites.inc + $(HGR_SPRITE) -l keeper_l2 keeper2_sprites.png 70 128 90 156 >> keeper2_sprites.inc + $(HGR_SPRITE) -l keeper_l3 keeper2_sprites.png 98 128 118 156 >> keeper2_sprites.inc + $(HGR_SPRITE) -l keeper_l4 keeper2_sprites.png 126 128 146 156 >> keeper2_sprites.inc + $(HGR_SPRITE) -l keeper_l5 keeper2_sprites.png 154 128 174 156 >> keeper2_sprites.inc + $(HGR_SPRITE) -l keeper_l6 keeper2_sprites.png 182 128 202 156 >> keeper2_sprites.inc + $(HGR_SPRITE) -l keeper_l7 keeper2_sprites.png 210 128 230 156 >> keeper2_sprites.inc + $(HGR_SPRITE) -l keeper_l0_mask keeper2_sprites.png 14 159 27 187 >> keeper2_sprites.inc + $(HGR_SPRITE) -l keeper_l1_mask keeper2_sprites.png 42 159 55 187 >> keeper2_sprites.inc + $(HGR_SPRITE) -l keeper_l2_mask keeper2_sprites.png 70 159 90 187 >> keeper2_sprites.inc + $(HGR_SPRITE) -l keeper_l3_mask keeper2_sprites.png 98 159 118 187 >> keeper2_sprites.inc + $(HGR_SPRITE) -l keeper_l4_mask keeper2_sprites.png 126 159 146 187 >> keeper2_sprites.inc + $(HGR_SPRITE) -l keeper_l5_mask keeper2_sprites.png 154 159 174 187 >> keeper2_sprites.inc + $(HGR_SPRITE) -l keeper_l6_mask keeper2_sprites.png 182 159 202 187 >> keeper2_sprites.inc + $(HGR_SPRITE) -l keeper_l7_mask keeper2_sprites.png 210 159 230 187 >> keeper2_sprites.inc + +clean: + rm -f *~ \ + keeper1_sprites.inc ron_sprites.inc \ + keeper2_sprites.inc diff --git a/games/peasant/cliff_heights/sprites_heights/guitar_sprites.png b/games/peasant/outer/sprites_outer/guitar_sprites.png similarity index 100% rename from games/peasant/cliff_heights/sprites_heights/guitar_sprites.png rename to games/peasant/outer/sprites_outer/guitar_sprites.png diff --git a/games/peasant/cliff_heights/sprites_heights/keeper1_sprites.png b/games/peasant/outer/sprites_outer/keeper1_sprites.png similarity index 100% rename from games/peasant/cliff_heights/sprites_heights/keeper1_sprites.png rename to games/peasant/outer/sprites_outer/keeper1_sprites.png diff --git a/games/peasant/cliff_heights/sprites_heights/keeper2_sprites.png b/games/peasant/outer/sprites_outer/keeper2_sprites.png similarity index 100% rename from games/peasant/cliff_heights/sprites_heights/keeper2_sprites.png rename to games/peasant/outer/sprites_outer/keeper2_sprites.png diff --git a/games/peasant/text/Makefile b/games/peasant/text/Makefile index 87661435..da60916f 100644 --- a/games/peasant/text/Makefile +++ b/games/peasant/text/Makefile @@ -15,6 +15,7 @@ all: dump_text shrink_text \ DIALOG_INN.ZX02 dialog_inn.inc \ DIALOG_CLIFF_BASE.ZX02 dialog_cliff_base.inc \ DIALOG_CLIFF_HEIGHTS.ZX02 dialog_cliff_heights.inc \ + DIALOG_OUTER.ZX02 dialog_outer.inc \ DIALOG_TROGDOR.ZX02 dialog_trogdor.inc \ DIALOG_CLIMB.ZX02 dialog_climb.inc \ common.inc.lookup \ @@ -70,6 +71,23 @@ dialog_cliff_heights.o: dialog_cliff_heights.s \ dialog_cliff_heights.inc: ../generate_all_symbols dialog_cliff_heights ../generate_all_symbols -a 0xd000 dialog_cliff_heights.lst > dialog_cliff_heights.inc +### + +DIALOG_OUTER.ZX02: dialog_outer + $(ZX02) -f dialog_outer DIALOG_OUTER.ZX02 + +dialog_outer: dialog_outer.o + ld65 -o dialog_outer dialog_outer.o -C $(LINKER_SCRIPTS)/apple2_d000.inc + +dialog_outer.o: dialog_outer.s \ + outer.inc.lookup + ca65 -o dialog_outer.o dialog_outer.s -l dialog_outer.lst + +dialog_outer.inc: ../generate_all_symbols dialog_outer + ../generate_all_symbols -a 0xd000 dialog_outer.lst > dialog_outer.inc + + + ### @@ -258,6 +276,9 @@ mud.inc.lookup: mud.inc shrink_text ned_cottage.inc.lookup: ned_cottage.inc shrink_text ./shrink_text < ned_cottage.inc > ned_cottage.inc.lookup +outer.inc.lookup: outer.inc shrink_text + ./shrink_text < outer.inc > outer.inc.lookup + outside_inn.inc.lookup: outside_inn.inc shrink_text ./shrink_text < outside_inn.inc > outside_inn.inc.lookup diff --git a/games/peasant/text/cliff_heights.inc b/games/peasant/text/cliff_heights.inc index 85e29e6a..4f10ba5a 100644 --- a/games/peasant/text/cliff_heights.inc +++ b/games/peasant/text/cliff_heights.inc @@ -48,399 +48,3 @@ cliff_heights_get_bone_message: .byte "Eww. No. Grody. You're",13 .byte "grody. No. Eww.",0 - -;====================================== -; Trogdor's Outer Sanctum / Outer Cave -;====================================== - -; note: if you don't have the item, it doesn't give -; you an option and launches directly into the quiz - -; +5 POINTS (give sub or answer question) -; +5 POINTS (give soda or answer question) -; +5 POINTS (give pills or answer question) - -; walk in, you can walk out again. once the keeper appears -; you are stuck and have to talk -; will only say the "I think he wants... text - -; + look -cave_outer_look_message: -.byte "There are 3 openings with a",13 -.byte "little cliff in front of",13 -.byte "each. A beaded curtain",13 -.byte "hangs in a doorway on the",13 -.byte "far wall.",0 - -; + look curtain/beads -cave_outer_look_curtain_message: -.byte "That thing's awesome. You",13 -.byte "always wanted one for your",13 -.byte "dorm room but your roommate",13 -.byte "was a total drag and said",13 -.byte "no.",0 - -; + look door -cave_outer_look_door_message: -.byte "A wicked beaded curtain",13 -.byte "hangs in the doorway.",0 - -; + look openings -cave_outer_look_openings_message: -.byte "They're mysterious and out",13 -.byte "of reach. Like girls were",13 -.byte "to you in high school.",0 - -; + look skeleton -cave_outer_look_skeleton_message: -.byte "You can't be sure but you",13 -.byte "think those are dead person",13 -.byte "bones.",0 - -; + get bones -cave_outer_get_bones_message: -.byte "Eww. No. Grody. You're",13 -.byte "grody. No. Eww.",0 - - - -;========================= -; First Keeper -;========================= - -; + (approached by first keeper) -cave_outer_keeper1_message1: -.byte "Foolish peasant! How dare",13 -.byte "you enter this fairly",13 -.byte "sacred chamber!",0 - -cave_outer_keeper1_message2: -.byte "You explain that you're",13 -.byte "here to smote Trogdor and",13 -.byte "if he doesn't get outta",13 -.byte "your way, him too!",0 - -cave_outer_keeper1_message3: -.byte "You cannot vanquish",13 -.byte "Trogdor! Only the Three",13 -.byte "Keepers of Trogdor hold the",13 -.byte "tools with which to destroy",13 -.byte "the Burninator. The",13 -.byte "Trog-Shield, the",13 -.byte "Trog-Helmet, and the",13 -.byte "Trog-Sword.",0 - -cave_outer_keeper1_message4: -.byte "And the only way we'll give",13 -.byte "them up is if you answer",13 -.byte "the three Trog-Trivia",13 -.byte "questions correctly.",0 - -; only say this if have sub -cave_outer_keeper1_message5: -.byte "Unless you happen to have",13 -.byte "something to eat on ya.",13 -.byte "Then we could forego my",13 -.byte "question.",0 - -; can't leave or do anything except take quiz or give sub -; prints a message saying so - -; Type any command other than "take the quiz" or "give (requested item)" -; after being apporached by a Keeper -cave_outer_keeper_wants_message: -.byte "I think he wants something",13 -.byte "from your inventory. Or you",13 -.byte "could just tell him ",34,"take",13 -.byte "the quiz",34,0 - - -; take quiz - -cave_outer_keeper_take_quiz: -.byte "Your shake off the Keeper of",13 -.byte "Trogdor's request.",13 -.byte "Seriously - this guy should",13 -.byte "get a job.",0 - -; if you say other than A/B/C then... -; Peasant fool! Choose A, B, -; or C! -; followed by repeat of the question - -cave_outer_quiz1_1: -.byte "Okay here goes. What did",13 -.byte "you win from the Archery",13 -.byte "game?",13 -.byte "A. SuperBow FunTime TM",13 -.byte "B. SuperTime FunBow TM",13 ; correct -.byte "C. SuperFun BowTime TM",0 - -cave_outer_quiz1_1again: -.byte "Peasant fool! Choose A, B,",13 -.byte "or C!",13 -.byte "What did you win from the",13 -.byte "Archery game?",13 -.byte "A. SuperBow FunTime TM",13 -.byte "B. SuperTime FunBow TM",13 ; correct -.byte "C. SuperFun BowTime TM",0 - -cave_outer_quiz1_2: -.byte "Okay here goes. What does",13 -.byte "Mendelev have you tell",13 -.byte "Dongolev?",13 -.byte "A. Haldo",13 ; correct -.byte "B. Hallo",13 -.byte "C. Allo",0 - -cave_outer_quiz1_2again: -.byte "Peasant fool! Choose A, B,",13 -.byte "or C!",13 -.byte "What does Mendelev have you",13 -.byte "tell Dongolev?",13 -.byte "A. Haldo",13 ; correct -.byte "B. Hallo",13 -.byte "C. Allo",0 - -cave_outer_quiz1_3: -.byte "Okay here goes. What is the",13 -.byte "only creature the Jhonka",13 -.byte "fears?",13 -.byte "A. Poor Gary",13 -.byte "B. The Baby",13 -.byte "C. The Kerrek",0 ; correct - -cave_outer_quiz1_3again: -.byte "Peasant fool! Choose A, B,",13 -.byte "or C!",13 -.byte "What is the only creature",13 -.byte "the Jhonka fears?",13 -.byte "A. Poor Gary",13 -.byte "B. The Baby",13 -.byte "C. The Kerrek",0 ; correct - - -; Response to Correct Answer -; makes happy noise, then gives you +5 POINTS -cave_outer_quiz1_correct: -.byte 34,"Ah crap! You're right.",13 -.byte "Here, take this stupid",13 -.byte "Trog-Shield!",34,0 - -; Response to Incorrect Answer -; - -cave_outer_quiz1_wrong: -.byte "Sorry peasant! You fail!",13 -.byte "And as punishment, you will",13 -.byte "be turned into... RON ",13 -.byte "CUMBERDALE!!",0 - -cave_outer_quiz1_wrong_part2: -.byte "You ask who the crap Ron",13 -.byte "Cumberdale is.",0 - -cave_outer_quiz1_wrong_part3: -.byte 34,"Just this kid from 4th",13 -.byte "grade that I really hated.",13 -.byte "But he was a BIG LOSER and",13 -.byte "HE SMELLED!",34,0 - -; wiggles hands, poof of smoke, turn into Ron -; makes twinkly noise as wiggles hand, another noise (blrrp?) as poof of smoke -cave_outer_quiz1_wrong_part4: -.byte "Well, you not exactly dead.",13 -.byte "But there's no way you",13 -.byte "could defeat Trogdor as Ron",13 -.byte "Cumberdale. Your quest",13 -.byte "ends here. Thanks for",13 -.byte "playing.",0 - - -; + give sub, sandwich -; slowly backs away, you suddenly have shield -; +5 POINTS -cave_outer_give_sub_message: -cave_outer_give_sandwich_message: -.byte "No way! I was just kidding",13 -.byte "but you've really got a",13 -.byte "meatball sub. This rules!",13 -.byte "Here, you can have the",13 -.byte "Trog-Shield.",0 - -; you now have the shield and can leave if you want -; whole new walking animation - -;========================= -; Second Keeper -;========================= - -; + (approached by second keeper) -; comes out and waggles his hands - -.byte "Hold, peasant! You must",13 -.byte "answer the second dreaded",13 -.byte "Trog-Trivia question!",0 - -.byte "Or we could call it even if",13 -.byte "I had an ice cold drink",13 -.byte "right now.",0 - -; take quiz -; + get a job again - - -.byte "Listen careful now. Which",13 -.byte "one of these letters is the",13 -.byte "letter C?",13 -.byte "A. B",13 -.byte "B. C",13 ; correct -.byte "C. A",0 - -.byte "Listen careful now. How",13 -.byte "many berry bushes are there",13 -.byte "in the whole kingdom of",13 -.byte "Peasantry?",13 -.byte "A. 4",13 -.byte "B. 5",13 ; [sic] correct? -.byte "C. 6 ",0 - -.byte "Listen careful now. What",13 -.byte "was the Innkeeper's pantry",13 -.byte "full of?",13 -.byte "A. Epsom Salts",13 -.byte "B. Epson Printers",13 -.byte "C. Old Man Rub",0 ; correct - -; Response to Correct Answer -.byte 34,"That's right. Oh. This",13 -.byte "sucks. Guess I have to give",13 -.byte "you this Trog-Helmet.",13 -.byte "Dang.",0 -; backs out, you now have helm on, can leave - -; Response to Incorrect Answer -.byte 34,"WRONG! You are hereby",13 -.byte "cursed to write corny folk",13 -.byte "songs for the rest of",13 -.byte "eternity! The kind that",13 -.byte "only OLD PEOPLE LIKE!!",34,0 - -; waggles arms -; you face forward, then play the guitar for like 5 seconds - -.byte "Well, you not exactly dead.",13 -.byte "But you certainly can't",13 -.byte "face Trogdor after writing",13 -.byte "'Wheat Grows Sweet, But My",13 -.byte "Gal's Sweeter'. Your quest",13 -.byte "ends here. Thanks for",13 -.byte "playing.",0 - -; + give soda -.byte "Sweet deal, peasant. I",13 -.byte "underestimated you. Wear",13 -.byte "this Trog-Helmet with",13 -.byte "style.",0 - -;========================= -; Third Keeper -;========================= - -; + (approached by third keeper) -.byte "Think you're pretty hot",13 -.byte "stuff, eh? Let's see you",13 -.byte "answer the deadly and",13 -.byte "pretty impossible THIRD",13 -.byte "TROG-TRIVIA QUESTION!",0 - -.byte "That is, unless you've got",13 -.byte "something for my lower",13 -.byte "back. Man, it's killin me!",0 - -; .take quiz -; + get a job again - -.byte "Riddle me this. To whom",13 -.byte "did the robe you're wearing",13 -.byte "originally belong?",13 -.byte "A. Nobleman Nicholas",13 -.byte "B. Nina Neverawesome",13 -.byte "C. Naked Ned",0 ; correct - - -.byte "Riddle me this. What color",13 -.byte "are the leaves on the tree",13 -.byte "that grows by the well?",13 -.byte "A. Orange",13 ; correct -.byte "B. Green",13 -.byte "C. Yellow",0 - - -.byte "Riddle me this. Which way",13 -.byte "does the river that runs",13 -.byte "through Peasantry flow?",13 -.byte "A. West to East",13 -.byte "B. Northwest to South",13 -.byte "C. Northeast to Southwest",0 ; correct - -; Response to Correct Answer - -.byte "Uh oh. You got it right.",13 -.byte "Trogdor's gonna kill me.",13 -.byte "Okay, you can have the",13 -.byte "Trog-Sword. Just promise",13 -.byte "not to kill any Trogdor's",13 ; [sic] -.byte "with it, kay?",0 - -.byte "You just stare at the",13 -.byte "Keeper blankly.",0 - -.byte 34,"Okay fine! You can have",13 -.byte "the dumb thing anyways.",13 -.byte "Trogdor's through the",13 -.byte "beaded curtain over there.",34,0 - -; now print "fabled Trog-sword" below - -; Response to Incorrect Answer - -.byte "YES! I was hoping you'd get",13 -.byte "mine wrong. No Trog-Sword",13 -.byte "for you. In fact, no skin",13 -.byte "for you either!",0 - -; turns you into a skeleton -.byte "Wow. You sure dead. You had",13 -.byte "a good run, though. Thanks",13 -.byte "for playin.",0 - -; Response if not A, B, or C -; then print following followed by repeat of question -.byte "Peasant fool! Choose A, B,",13 -.byte "or C!",0 - - - -; + give pills -.byte "Whoa! Where'd you find this",13 -.byte "stuff? I don't think this",13 -.byte "is even legal anymore.",13 -.byte "These babies'll definitely",13 -.byte "smote LUMBAGO the, um,",13 -.byte "LOWER BACKINATOR!!",0 - -; lift sword and it gleams -; bead curtain parts - -.byte "The fabled Trog-Sword is",13 -.byte "yours. You now have the",13 -.byte "means to strike down",13 -.byte "Trogdor. Good luck,",13 -.byte "peasant.",0 - -; backs out, you raise the sword in the air animation - -; + climb cliff -cave_outer_climb_message: -.byte "Nope. It's too sheer.",0 diff --git a/games/peasant/text/dialog_outer.s b/games/peasant/text/dialog_outer.s new file mode 100644 index 00000000..f62d35ac --- /dev/null +++ b/games/peasant/text/dialog_outer.s @@ -0,0 +1,2 @@ +.include "lookup.inc" +.include "outer.inc.lookup" diff --git a/games/peasant/text/outer.inc b/games/peasant/text/outer.inc new file mode 100644 index 00000000..2dea8dbe --- /dev/null +++ b/games/peasant/text/outer.inc @@ -0,0 +1,395 @@ +;====================================== +; Trogdor's Outer Sanctum / Outer Cave +;====================================== + +; note: if you don't have the item, it doesn't give +; you an option and launches directly into the quiz + +; +5 POINTS (give sub or answer question) +; +5 POINTS (give soda or answer question) +; +5 POINTS (give pills or answer question) + +; walk in, you can walk out again. once the keeper appears +; you are stuck and have to talk +; will only say the "I think he wants... text + +; + look +cave_outer_look_message: +.byte "There are 3 openings with a",13 +.byte "little cliff in front of",13 +.byte "each. A beaded curtain",13 +.byte "hangs in a doorway on the",13 +.byte "far wall.",0 + +; + look curtain/beads +cave_outer_look_curtain_message: +.byte "That thing's awesome. You",13 +.byte "always wanted one for your",13 +.byte "dorm room but your roommate",13 +.byte "was a total drag and said",13 +.byte "no.",0 + +; + look door +cave_outer_look_door_message: +.byte "A wicked beaded curtain",13 +.byte "hangs in the doorway.",0 + +; + look openings +cave_outer_look_openings_message: +.byte "They're mysterious and out",13 +.byte "of reach. Like girls were",13 +.byte "to you in high school.",0 + +; + look skeleton +cave_outer_look_skeleton_message: +.byte "You can't be sure but you",13 +.byte "think those are dead person",13 +.byte "bones.",0 + +; + get bones +cave_outer_get_bones_message: +.byte "Eww. No. Grody. You're",13 +.byte "grody. No. Eww.",0 + + + +;========================= +; First Keeper +;========================= + +; + (approached by first keeper) +cave_outer_keeper1_message1: +.byte "Foolish peasant! How dare",13 +.byte "you enter this fairly",13 +.byte "sacred chamber!",0 + +cave_outer_keeper1_message2: +.byte "You explain that you're",13 +.byte "here to smote Trogdor and",13 +.byte "if he doesn't get outta",13 +.byte "your way, him too!",0 + +cave_outer_keeper1_message3: +.byte "You cannot vanquish",13 +.byte "Trogdor! Only the Three",13 +.byte "Keepers of Trogdor hold the",13 +.byte "tools with which to destroy",13 +.byte "the Burninator. The",13 +.byte "Trog-Shield, the",13 +.byte "Trog-Helmet, and the",13 +.byte "Trog-Sword.",0 + +cave_outer_keeper1_message4: +.byte "And the only way we'll give",13 +.byte "them up is if you answer",13 +.byte "the three Trog-Trivia",13 +.byte "questions correctly.",0 + +; only say this if have sub +cave_outer_keeper1_message5: +.byte "Unless you happen to have",13 +.byte "something to eat on ya.",13 +.byte "Then we could forego my",13 +.byte "question.",0 + +; can't leave or do anything except take quiz or give sub +; prints a message saying so + +; Type any command other than "take the quiz" or "give (requested item)" +; after being apporached by a Keeper +cave_outer_keeper_wants_message: +.byte "I think he wants something",13 +.byte "from your inventory. Or you",13 +.byte "could just tell him ",34,"take",13 +.byte "the quiz",34,0 + + +; take quiz + +cave_outer_keeper_take_quiz: +.byte "Your shake off the Keeper of",13 +.byte "Trogdor's request.",13 +.byte "Seriously - this guy should",13 +.byte "get a job.",0 + +; if you say other than A/B/C then... +; Peasant fool! Choose A, B, +; or C! +; followed by repeat of the question + +cave_outer_quiz1_1: +.byte "Okay here goes. What did",13 +.byte "you win from the Archery",13 +.byte "game?",13 +.byte "A. SuperBow FunTime TM",13 +.byte "B. SuperTime FunBow TM",13 ; correct +.byte "C. SuperFun BowTime TM",0 + +cave_outer_quiz1_1again: +.byte "Peasant fool! Choose A, B,",13 +.byte "or C!",13 +.byte "What did you win from the",13 +.byte "Archery game?",13 +.byte "A. SuperBow FunTime TM",13 +.byte "B. SuperTime FunBow TM",13 ; correct +.byte "C. SuperFun BowTime TM",0 + +cave_outer_quiz1_2: +.byte "Okay here goes. What does",13 +.byte "Mendelev have you tell",13 +.byte "Dongolev?",13 +.byte "A. Haldo",13 ; correct +.byte "B. Hallo",13 +.byte "C. Allo",0 + +cave_outer_quiz1_2again: +.byte "Peasant fool! Choose A, B,",13 +.byte "or C!",13 +.byte "What does Mendelev have you",13 +.byte "tell Dongolev?",13 +.byte "A. Haldo",13 ; correct +.byte "B. Hallo",13 +.byte "C. Allo",0 + +cave_outer_quiz1_3: +.byte "Okay here goes. What is the",13 +.byte "only creature the Jhonka",13 +.byte "fears?",13 +.byte "A. Poor Gary",13 +.byte "B. The Baby",13 +.byte "C. The Kerrek",0 ; correct + +cave_outer_quiz1_3again: +.byte "Peasant fool! Choose A, B,",13 +.byte "or C!",13 +.byte "What is the only creature",13 +.byte "the Jhonka fears?",13 +.byte "A. Poor Gary",13 +.byte "B. The Baby",13 +.byte "C. The Kerrek",0 ; correct + + +; Response to Correct Answer +; makes happy noise, then gives you +5 POINTS +cave_outer_quiz1_correct: +.byte 34,"Ah crap! You're right.",13 +.byte "Here, take this stupid",13 +.byte "Trog-Shield!",34,0 + +; Response to Incorrect Answer +; + +cave_outer_quiz1_wrong: +.byte "Sorry peasant! You fail!",13 +.byte "And as punishment, you will",13 +.byte "be turned into... RON ",13 +.byte "CUMBERDALE!!",0 + +cave_outer_quiz1_wrong_part2: +.byte "You ask who the crap Ron",13 +.byte "Cumberdale is.",0 + +cave_outer_quiz1_wrong_part3: +.byte 34,"Just this kid from 4th",13 +.byte "grade that I really hated.",13 +.byte "But he was a BIG LOSER and",13 +.byte "HE SMELLED!",34,0 + +; wiggles hands, poof of smoke, turn into Ron +; makes twinkly noise as wiggles hand, another noise (blrrp?) as poof of smoke +cave_outer_quiz1_wrong_part4: +.byte "Well, you not exactly dead.",13 +.byte "But there's no way you",13 +.byte "could defeat Trogdor as Ron",13 +.byte "Cumberdale. Your quest",13 +.byte "ends here. Thanks for",13 +.byte "playing.",0 + + +; + give sub, sandwich +; slowly backs away, you suddenly have shield +; +5 POINTS +cave_outer_give_sub_message: +cave_outer_give_sandwich_message: +.byte "No way! I was just kidding",13 +.byte "but you've really got a",13 +.byte "meatball sub. This rules!",13 +.byte "Here, you can have the",13 +.byte "Trog-Shield.",0 + +; you now have the shield and can leave if you want +; whole new walking animation + +;========================= +; Second Keeper +;========================= + +; + (approached by second keeper) +; comes out and waggles his hands + +.byte "Hold, peasant! You must",13 +.byte "answer the second dreaded",13 +.byte "Trog-Trivia question!",0 + +.byte "Or we could call it even if",13 +.byte "I had an ice cold drink",13 +.byte "right now.",0 + +; take quiz +; + get a job again + + +.byte "Listen careful now. Which",13 +.byte "one of these letters is the",13 +.byte "letter C?",13 +.byte "A. B",13 +.byte "B. C",13 ; correct +.byte "C. A",0 + +.byte "Listen careful now. How",13 +.byte "many berry bushes are there",13 +.byte "in the whole kingdom of",13 +.byte "Peasantry?",13 +.byte "A. 4",13 +.byte "B. 5",13 ; [sic] correct? +.byte "C. 6 ",0 + +.byte "Listen careful now. What",13 +.byte "was the Innkeeper's pantry",13 +.byte "full of?",13 +.byte "A. Epsom Salts",13 +.byte "B. Epson Printers",13 +.byte "C. Old Man Rub",0 ; correct + +; Response to Correct Answer +.byte 34,"That's right. Oh. This",13 +.byte "sucks. Guess I have to give",13 +.byte "you this Trog-Helmet.",13 +.byte "Dang.",0 +; backs out, you now have helm on, can leave + +; Response to Incorrect Answer +.byte 34,"WRONG! You are hereby",13 +.byte "cursed to write corny folk",13 +.byte "songs for the rest of",13 +.byte "eternity! The kind that",13 +.byte "only OLD PEOPLE LIKE!!",34,0 + +; waggles arms +; you face forward, then play the guitar for like 5 seconds + +.byte "Well, you not exactly dead.",13 +.byte "But you certainly can't",13 +.byte "face Trogdor after writing",13 +.byte "'Wheat Grows Sweet, But My",13 +.byte "Gal's Sweeter'. Your quest",13 +.byte "ends here. Thanks for",13 +.byte "playing.",0 + +; + give soda +.byte "Sweet deal, peasant. I",13 +.byte "underestimated you. Wear",13 +.byte "this Trog-Helmet with",13 +.byte "style.",0 + +;========================= +; Third Keeper +;========================= + +; + (approached by third keeper) +.byte "Think you're pretty hot",13 +.byte "stuff, eh? Let's see you",13 +.byte "answer the deadly and",13 +.byte "pretty impossible THIRD",13 +.byte "TROG-TRIVIA QUESTION!",0 + +.byte "That is, unless you've got",13 +.byte "something for my lower",13 +.byte "back. Man, it's killin me!",0 + +; .take quiz +; + get a job again + +.byte "Riddle me this. To whom",13 +.byte "did the robe you're wearing",13 +.byte "originally belong?",13 +.byte "A. Nobleman Nicholas",13 +.byte "B. Nina Neverawesome",13 +.byte "C. Naked Ned",0 ; correct + + +.byte "Riddle me this. What color",13 +.byte "are the leaves on the tree",13 +.byte "that grows by the well?",13 +.byte "A. Orange",13 ; correct +.byte "B. Green",13 +.byte "C. Yellow",0 + + +.byte "Riddle me this. Which way",13 +.byte "does the river that runs",13 +.byte "through Peasantry flow?",13 +.byte "A. West to East",13 +.byte "B. Northwest to South",13 +.byte "C. Northeast to Southwest",0 ; correct + +; Response to Correct Answer + +.byte "Uh oh. You got it right.",13 +.byte "Trogdor's gonna kill me.",13 +.byte "Okay, you can have the",13 +.byte "Trog-Sword. Just promise",13 +.byte "not to kill any Trogdor's",13 ; [sic] +.byte "with it, kay?",0 + +.byte "You just stare at the",13 +.byte "Keeper blankly.",0 + +.byte 34,"Okay fine! You can have",13 +.byte "the dumb thing anyways.",13 +.byte "Trogdor's through the",13 +.byte "beaded curtain over there.",34,0 + +; now print "fabled Trog-sword" below + +; Response to Incorrect Answer + +.byte "YES! I was hoping you'd get",13 +.byte "mine wrong. No Trog-Sword",13 +.byte "for you. In fact, no skin",13 +.byte "for you either!",0 + +; turns you into a skeleton +.byte "Wow. You sure dead. You had",13 +.byte "a good run, though. Thanks",13 +.byte "for playin.",0 + +; Response if not A, B, or C +; then print following followed by repeat of question +.byte "Peasant fool! Choose A, B,",13 +.byte "or C!",0 + + + +; + give pills +.byte "Whoa! Where'd you find this",13 +.byte "stuff? I don't think this",13 +.byte "is even legal anymore.",13 +.byte "These babies'll definitely",13 +.byte "smote LUMBAGO the, um,",13 +.byte "LOWER BACKINATOR!!",0 + +; lift sword and it gleams +; bead curtain parts + +.byte "The fabled Trog-Sword is",13 +.byte "yours. You now have the",13 +.byte "means to strike down",13 +.byte "Trogdor. Good luck,",13 +.byte "peasant.",0 + +; backs out, you raise the sword in the air animation + +; + climb cliff +cave_outer_climb_message: +.byte "Nope. It's too sheer.",0