From 7c31356d14402925e36776a134ab932956a2d184 Mon Sep 17 00:00:00 2001 From: 4am Date: Wed, 23 Sep 2020 14:01:27 -0400 Subject: [PATCH] interstitial after every 10% progress --- res/M.ERROR | Bin 0 -> 12 bytes res/M.HUPFEN | Bin 145 -> 0 bytes res/M.JOY01 | Bin 0 -> 226 bytes res/PROGRESS.0 | Bin 0 -> 192 bytes res/PROGRESS.9 | Bin 0 -> 192 bytes res/PROGRESS.99 | Bin 0 -> 192 bytes src/glue.sound.a | 26 ++----- src/hw.vbl.a | 41 ----------- src/hw.vbl.init.a | 45 ------------ src/million.a | 20 ++++-- src/million.init.a | 2 - src/storage.a | 10 ++- src/ui.about.a | 122 +++------------------------------ src/ui.common.a | 7 +- src/ui.interstitial.a | 155 ++++++++++++++++++++++++++++++++++++++++++ src/ui.play.a | 4 +- src/ui.reveal.a | 131 +++++++++++++++++++++++++++++++++++ 17 files changed, 327 insertions(+), 236 deletions(-) create mode 100644 res/M.ERROR delete mode 100644 res/M.HUPFEN create mode 100644 res/M.JOY01 create mode 100644 res/PROGRESS.0 create mode 100644 res/PROGRESS.9 create mode 100644 res/PROGRESS.99 delete mode 100644 src/hw.vbl.a delete mode 100644 src/hw.vbl.init.a create mode 100644 src/ui.interstitial.a create mode 100644 src/ui.reveal.a diff --git a/res/M.ERROR b/res/M.ERROR new file mode 100644 index 0000000000000000000000000000000000000000..212ed1adeb8e6c0e5b1ccd4e2b4bac428e8de216 GIT binary patch literal 12 TcmZQ%VPRrmU=t8zU|;|M0X6_L literal 0 HcmV?d00001 diff --git a/res/M.HUPFEN b/res/M.HUPFEN deleted file mode 100644 index 3aff607bcfe81ac0f287aed061469f95c42f7a6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 145 zcmZQ%X68sSVq;)nXHa7AP-72OVvjNcksU_t4QlK&l-Orzv9DHQ-)aORXSe{xIZ_-D z>RpuBeT>*$blIb{*nMT7eRnfgltDmxJInNInHH{WJ2c{nsWZma-y2(q+E|az_MNEjUQZ! xb76|0WdE5({D)8#^WNobvjO`9_bvfW$+#$70 for IIc) -patch_VBL_iic2 -patch_VBL_iigs2 - bmi - -WaitForVBL_nop ; II/II+ have no easy VBL - rts - -iUnwaitForVBL -- bit $C019 - bpl - - lda $C070 ; $c019 bit 7 is sticky, reset it - sta $C07F ; enable access to VBL register - sta $C05A ; disable VBL polling - sta $C07E ; disable access to VBL register - cli - rts diff --git a/src/hw.vbl.init.a b/src/hw.vbl.init.a deleted file mode 100644 index f5671cc..0000000 --- a/src/hw.vbl.init.a +++ /dev/null @@ -1,45 +0,0 @@ -;license:MIT -;(c) 2020 by qkumba -; -; Identify platform and construct appropriate VBL routine - -romid = $FBB3 -; $38=][, $EA=][+, $06=//e compatible -ROMID_IIECOMPAT = 6 -romid_ec = $FBC0 -; $EA=//e original, $E0=//e enhanced, $E1=//e EDM, $00=//c - -; IIGS -idroutine = $FE1F ; SEC, JSR $FE1F, BCS notgs - -InitVBL - ldx romid - cpx #ROMID_IIECOMPAT - bne @build_none ; not a //e - lda romid_ec - beq @build_iic ; //c family - sec - jsr idroutine ; check for IIgs - bcs @NotGS - lda #$30 - sta patch_VBL_iigs1 - lda #$10 - sta patch_VBL_iigs2 -@NotGS - rts -@build_iic - lda #$70 - sta patch_VBL_iic1+1 - lda #$60 - sta patch_VBL_iic2 - lda #iWaitForVBL - sta WaitForVBL+2 - lda #$4C - sta UnwaitForVBL - rts -@build_none - lda #$60 - sta WaitForVBL - rts diff --git a/src/million.a b/src/million.a index ebf17fd..6e8936b 100644 --- a/src/million.a +++ b/src/million.a @@ -14,7 +14,6 @@ !source "src/macros.a" ; no code !source "src/million.init.a" ; one-time initialization code, exits via Start !source "src/hw.mockingboard.a" - !source "src/hw.vbl.init.a" FirstMover !pseudopc $4000 { @@ -28,15 +27,15 @@ Start ; (e.g. title sequence ended prematurely, or we're ; returning from another screen) jsr MainMenuEventLoop + ; A = world ID bcc + jmp Quit + - ; A = world ID (from MainMenu) sta gWorldID jsr MaybeLoadWorldFromDisk bcs @GoToMainMenu jsr LoadProgressFromMemory - ; A = next puzzle ID (from LoadProgressFromMemory) + ; A = next puzzle ID @Play sta gPuzzleID ldx gWorldID @@ -60,8 +59,11 @@ Start jsr AnimatePuzzleCompleted ldx gPuzzleID jsr MarkPuzzleCompleted - ; A = next puzzle ID (from MarkPuzzleCompleted) - jmp @Play + ; A = next puzzle ID + ; X = number of puzzles completed + jsr MaybeShowInterstitial + bcc @Play + bcs @GoToMainMenu + cpx #kRequestedRestart bne + @@ -69,12 +71,14 @@ Start lda gPuzzleID jmp @Play + - sec ; full redraw + sec ; C=1 triggers full redraw bcs @GoToMainMenu !source "src/ui.title.a" !source "src/ui.main.menu.a" + !source "src/ui.reveal.a" !source "src/ui.about.a" + !source "src/ui.interstitial.a" !source "src/ui.play.a" !source "src/ui.help.a" !source "src/ui.message.a" @@ -84,7 +88,6 @@ Start !source "src/prefs.a" !source "src/glue.sound.a" !source "src/glue.mli.a" - !source "src/hw.vbl.a" !source "src/ui.font.courier.double.prime.a" !source "src/ui.font.courier.double.prime.data.a" !source "src/ui.font.heavy.silk.a" @@ -93,10 +96,13 @@ Start !source "src/mockingduet.a" MainMenuMusic !bin "res/M.SICILIENNE" +InterstitialProgressMusic + !bin "res/M.JOY01" M_ii !bin "res/M.II" M_V !bin "res/M.V" M_I !bin "res/M.I" M_I_LONG !bin "res/M.I.LONG" M_vi6 !bin "res/M.VI6" +M_ERROR !bin "res/M.ERROR" } LastMover diff --git a/src/million.init.a b/src/million.init.a index f37fd64..b285a7c 100644 --- a/src/million.init.a +++ b/src/million.init.a @@ -35,8 +35,6 @@ FMDEST sta $4000, x cmp #$40 bcs FM - jsr InitVBL - jsr GetMockingboardSlot cpx #0 beq + diff --git a/src/storage.a b/src/storage.a index f5e36f7..35395bf 100644 --- a/src/storage.a +++ b/src/storage.a @@ -265,7 +265,8 @@ HasPuzzleBeenCompleted ; MarkPuzzleCompleted ; ; in: X = puzzle ID -; out: all registers and flags clobbered +; out: A = next puzzle ID +; X = number of puzzles completed in this world (0x01..0x64) ;------------------------------------------------------------------------------ MarkPuzzleCompleted ; Completion status for the current world (100 puzzles) is stored unpacked in @@ -360,6 +361,7 @@ MarkPuzzleCompleted cpy #$0D bne -- pla ; A = next puzzle ID (pushed earlier) + pha sta ($FE), y eor checksum sta checksum @@ -372,6 +374,7 @@ MarkPuzzleCompleted + dex bpl - tya ; A = number of puzzles completed (out of 100, so also the percent complete) + pha ldy #$0E sta ($FE), y eor checksum @@ -385,8 +388,9 @@ MarkPuzzleCompleted !word $00C0 lda progressRefNum jsr FlushFile - ldy #$0D - lda ($FE), y + pla + tax + pla rts FindPackedProgressAddr diff --git a/src/ui.about.a b/src/ui.about.a index 6c0921c..29f4f18 100644 --- a/src/ui.about.a +++ b/src/ui.about.a @@ -1,5 +1,4 @@ ;license:MIT -;(c) 2019 by qkumba ;(c) 2020 by 4am ; ; animated about screen @@ -8,17 +7,12 @@ ; - AboutPage ; -targetVTAB = $F0 -minHTAB = $F1 -maxHTAB = $F2 -randomchar = $F3 -revealchar = $F4 revealindex = $F5 -revealtext = $FE revealStringsLo !byte kAboutWritten !byte >kAboutTested + !byte >kAboutTested2 !byte >kAboutMusic !byte >kAboutElectricDuet !byte >kAboutMockingDuet @@ -34,12 +29,14 @@ revealStringsHi revealVTABs !byte 4 !byte 20 + !byte 21 !byte 9 !byte 14 !byte 19 revealHTABs !byte 5 !byte 16 + !byte 20 !byte 17 !byte 9 !byte 1 @@ -49,6 +46,9 @@ kAboutWritten kAboutTested !byte 21 !raw "PLAYTESTED BY OPTION8" +kAboutTested2 + !byte 10 + !raw "AND BESLEY" kAboutMusic !byte 22 !raw "MUSIC BY GABRIEL FAURE" @@ -60,6 +60,8 @@ kAboutMockingDuet !raw "MOCKINGBOARD ROUTINES BY CYBERNESTO" AboutPage +; in: none +; out: everything clobbered jsr Home @outerloop lda #0 @@ -74,7 +76,7 @@ AboutPage tay lda revealStringsLo, x jsr HeavySilkReveal - ldx #5 + ldx #10 lda #0 - jsr WaitForKeyWithTimeout bmi @exit @@ -83,107 +85,3 @@ AboutPage inc revealindex bne @loop @exit rts - -HeavySilkReveal - +ST16 revealtext - ldy #0 - lda (revealtext), y - clc - adc minHTAB - sta maxHTAB -RevealStartingChar=*+1 - lda #$41 ; 'A' -@outerloop - sta randomchar - ; init RNG - ldy #1 - sty @rnd1+1 - dey - sty @rnd2+1 -@loop - ; generate next value in linear feedback shift register (LFSR) - ldy @rnd1+1 - ldx @rnd2+1 - lsr @rnd2+1 - ror @rnd1+1 - bcc + - ; feedback polynomial form #$03FC for period of 1023 - ; https://en.wikipedia.org/wiki/Linear-feedback_shift_register - ; https://users.ece.cmu.edu/~koopman/lfsr/index.html - lda @rnd1+1 - eor #$FC - sta @rnd1+1 - lda @rnd2+1 - eor #$03 - sta @rnd2+1 - ; calculate VTAB/HTAB from 2-byte LFSR value -+ lda #24 - sta VTAB - dey - cpy #$FF - bne + - dex -+ tya -- dec VTAB - bmi @loop - sec - sbc #40 - bcs - - dex - bpl - - eor #$FF - sta HTAB - jsr @draw - lda randomchar - cmp #$20 - beq + - inc randomchar - cmp #$5A - bcc + - sbc #$19 - sta randomchar - ; wait after drawing each letter, while checking for keypress -+ lda #$0A - jsr WaitForKeyWithTimeout - bmi @exit - ; exit conditions for feedback polynomial -@rnd2 lda #0 ; SMC - bne @loop -@rnd1 lda #0 ; SMC - cmp #1 - bne @loop - ; loop back to do the reveal - lda randomchar - cmp #$20 - beq @exit - sta RevealStartingChar - lda #$20 - bne @outerloop ; always branches -@exit - rts -@draw - ; check if this position is part of the reveal text - lda VTAB - cmp targetVTAB - bne @drawRandom - lda HTAB - cmp minHTAB - bcc @drawRandom - cmp maxHTAB - bcc @drawReveal -@drawRandom - ; draw 'random' character - lda #randomchar -- ldy #$00 - ldx #$01 - jmp DrawHeavySilkBuffer -@drawReveal - ; draw character from reveal text - sec - sbc minHTAB - tay - iny - lda (revealtext), y - sta revealchar - lda #revealchar - bne - ; always branches diff --git a/src/ui.common.a b/src/ui.common.a index 6431bf0..cf0a31b 100644 --- a/src/ui.common.a +++ b/src/ui.common.a @@ -23,6 +23,9 @@ GlobalLeftMargin Home ; in: none, but assumes text screen 1 is clear (this is done at program startup) ; out: hi-res page 1 cleared and displayed +; X preserved +; A/Y clobbered +; flags clobbered bit PAGE1 bit FULLGFX bit HIRES @@ -92,9 +95,7 @@ ScrollDownBy tax jsr LogicalColumnToPhysicalColumn jsr InitScrollStorage - jsr WaitForVBL jsr GENSCROLLDOWN - jsr UnwaitForVBL @x ldx #$FD ; SMC @y ldy #$FD ; SMC rts @@ -110,9 +111,7 @@ ScrollUpBy tax jsr LogicalColumnToPhysicalColumn jsr InitScrollStorage - jsr WaitForVBL jsr GENSCROLLUP - jsr UnwaitForVBL @x ldx #$FD ; SMC @y ldy #$FD ; SMC rts diff --git a/src/ui.interstitial.a b/src/ui.interstitial.a new file mode 100644 index 0000000..e7b7ed3 --- /dev/null +++ b/src/ui.interstitial.a @@ -0,0 +1,155 @@ +;license:MIT +;(c) 2019 by qkumba +;(c) 2020 by 4am +; +; animated interstitial screen +; +; Public functions: +; - MaybeShowInterstitial +; + +targetVTAB = $F0 +minHTAB = $F1 +maxHTAB = $F2 +randomchar = $F3 +revealchar = $F4 +revealindex = $F5 +revealtext = $FE + +progressStringsLo + !byte kProgress10 + !byte >kProgress20 + !byte >kProgress30 + !byte >kProgress40 + !byte >kProgress50 + !byte >kProgress60 + !byte >kProgress70 + !byte >kProgress80 + !byte >kProgress90 + !byte >kProgress100 + +progressHTABs + !byte 7 + !byte 8 + !byte 8 + !byte 8 + !byte 7 + !byte 2 + !byte 9 + !byte 7 + !byte 6 + !byte 4 + +kProgress10 + !byte 25 + !raw "10% COMPLETE! KEEP IT UP!" +kProgress20 + !byte 24 + !raw "20% COMPLETE! WAY TO GO!" +kProgress30 + !byte 24 + !raw "30% COMPLETE! FANTASTIC!" +kProgress40 + !byte 24 + !raw "40% COMPLETE! EXCELLENT!" +kProgress50 + !byte 26 + !raw "WHOA, WE'RE HALFWAY THERE!" +kProgress60 + !byte 36 + !raw "60% OF THE TIME, IT WORKS EVERY TIME" +kProgress70 + !byte 22 + !raw "70% COMPLETE! AMAZING!" +kProgress80 + !byte 25 + !raw "80% COMPLETE! PHENOMENAL!" +kProgress90 + !byte 28 + !raw "90% COMPLETE! INCONCEIVABLE!" +kProgress100 + !byte 31 + !raw "100% COMPLETE! CONGRATULATIONS!" +kEmptyString + !byte 1 + !raw " " + +MaybeShowInterstitial +; in: A = next puzzle ID (in this world) +; X = # of puzzles completed (in this world) +; out: preserves A +; C set if all puzzles were completed +; C clear if there are more puzzles in this world (and A = next puzzle ID) +; Y, other flags clobbered + pha + cpx #100 + bne + + ldy #10 + jsr ShowInterstitialWorldComplete + sec + bcs @exit ; always branches ++ ldy #0 +- iny + dex + dex + dex + dex + dex + dex + dex + dex + dex + dex ; don't judge me + bmi + + bne - + jsr ShowInterstitialWorldProgress ++ clc +@exit pla + rts + +ShowInterstitialWorldProgress +ShowInterstitialWorldComplete +; in: Y = which progress string to display (1..9) +; out: all registers and flags clobbered + bit CLEARKBD + tya + tax + dex + jsr Home + lda #11 + sta targetVTAB + lda progressHTABs, x + sta minHTAB + lda progressStringsHi, x + tay + lda progressStringsLo, x + jsr HeavySilkReveal + lda KBD + bmi @exit + +LDADDR InterstitialProgressMusic + jsr PlaySound + ldx #20 + lda #0 +- jsr WaitForKeyWithTimeout + bmi + + dex + bpl - ++ lda KBD + bmi @exit + lda #0 + sta targetVTAB + sta minHTAB + +LDADDR kEmptyString + jsr HeavySilkReveal +@exit jmp Home diff --git a/src/ui.play.a b/src/ui.play.a index c044420..d84dc66 100644 --- a/src/ui.play.a +++ b/src/ui.play.a @@ -145,7 +145,7 @@ PlayEventDownArrow jsr ScrollPuzzleDown bcc + CantMove - jsr SoftBell + jsr ErrorSound KeepPlaying ldx #kKeepPlaying rts @@ -198,7 +198,7 @@ PlayEventLetter ldy gSelectedLogicalColumn jsr FindLetterInColumn bcc + - jsr SoftBell ; didn't find letter, we're done + jsr ErrorSound ; didn't find letter, we're done ldx #kKeepPlaying rts + beq PlayEventRightArrow ; found letter but it's already on center row, we're done, exit through right arrow handler diff --git a/src/ui.reveal.a b/src/ui.reveal.a new file mode 100644 index 0000000..3cd3c11 --- /dev/null +++ b/src/ui.reveal.a @@ -0,0 +1,131 @@ +;license:MIT +;(c) 2019 by qkumba +;(c) 2020 by 4am +; +; graphic text animation routine +; used by credits page and interstitials during play +; +; Public functions: +; - HeavySilkReveal +; + +targetVTAB = $F0 +minHTAB = $F1 +maxHTAB = $F2 +randomchar = $F3 +revealchar = $F4 +revealtext = $FE + +HeavySilkReveal +; in: A/Y points to length-prefixed string to reveal +; targetVTAB contains 0-based row for reveal string (0..39 but no wrapping so be careful) +; minHTAB contains starting 0-based column for reveal string (0..23) +; out: VTAB clobbered +; HTAB clobbered +; maxHTAB clobbered +; randomchar clobbered +; revealchar clobbered +; revealtext clobbered [word] + + +ST16 revealtext + ldy #0 + lda (revealtext), y + clc + adc minHTAB + sta maxHTAB +@revealStartingChar=*+1 + lda #$41 ; 'A' +@outerloop + sta randomchar + ; init RNG + ldy #1 + sty @rnd1+1 + dey + sty @rnd2+1 +@loop + ; generate next value in linear feedback shift register (LFSR) + ldy @rnd1+1 + ldx @rnd2+1 + lsr @rnd2+1 + ror @rnd1+1 + bcc + + ; feedback polynomial form #$03FC for period of 1023 + ; https://en.wikipedia.org/wiki/Linear-feedback_shift_register + ; https://users.ece.cmu.edu/~koopman/lfsr/index.html + lda @rnd1+1 + eor #$FC + sta @rnd1+1 + lda @rnd2+1 + eor #$03 + sta @rnd2+1 + ; calculate VTAB/HTAB from 2-byte LFSR value ++ lda #24 + sta VTAB + dey + cpy #$FF + bne + + dex ++ tya +- dec VTAB + bmi @loop + sec + sbc #40 + bcs - + dex + bpl - + eor #$FF + sta HTAB + jsr @draw + lda randomchar + cmp #$20 + beq + + inc randomchar + cmp #$5A + bcc + + sbc #$19 + sta randomchar + ; wait after drawing each letter, while checking for keypress ++ lda #$0A + jsr WaitForKeyWithTimeout + bmi @exit + ; exit conditions for feedback polynomial +@rnd2 lda #0 ; SMC + bne @loop +@rnd1 lda #0 ; SMC + cmp #1 + bne @loop + ; loop back to do the reveal + lda randomchar + cmp #$20 + beq @exit + sta @revealStartingChar + lda #$20 + bne @outerloop ; always branches +@exit + rts +@draw + ; check if this position is part of the reveal text + lda VTAB + cmp targetVTAB + bne @drawRandom + lda HTAB + cmp minHTAB + bcc @drawRandom + cmp maxHTAB + bcc @drawReveal +@drawRandom + ; draw 'random' character + lda #randomchar +- ldy #$00 + ldx #$01 + jmp DrawHeavySilkBuffer +@drawReveal + ; draw character from reveal text + sec + sbc minHTAB + tay + iny + lda (revealtext), y + sta revealchar + lda #revealchar + bne - ; always branches