From a03204688a0e1794138b80f3e2d5dad6fb8d035d Mon Sep 17 00:00:00 2001 From: shoofle Date: Wed, 5 Mar 2025 17:19:52 -0500 Subject: [PATCH] curve authoring tool and also full fool --- 00TheFool.inc | 295 ++++++++++++++++++++++++++++++++++------- 00thefool.aseprite | Bin 6804 -> 6912 bytes 01themagician.aseprite | Bin 6483 -> 6692 bytes CardHelpers.inc | 3 + SpriteTiles.asm | 13 +- curve_authoring.html | 258 +++++++++++++++++++++++++++++++++++ main.asm | 1 + source.zip | Bin 299581 -> 304114 bytes 8 files changed, 516 insertions(+), 54 deletions(-) create mode 100644 curve_authoring.html diff --git a/00TheFool.inc b/00TheFool.inc index 40627ed..551aa5b 100644 --- a/00TheFool.inc +++ b/00TheFool.inc @@ -26,26 +26,32 @@ def Card_Offset_functions equ @-TheFool dw .fUpdate dw .fDraw -; CARD_VARS_START: timer -; CARD_VARS_START+2: timer 2 -; CARD_VARS_START+4: animation frame for dog -; CARD_VARS_START+5: -; CARD_VARS_START+6: frame of zero -; CARD_VARS_START+7: +; CVS: timer for dog +; CVS+2: frame for dog +; CVS+3: timer for zero +; CVS+5: frame for zero +; CVS+6: timer for cloud 1 +; CVS+8: frame for cloud 1 +; CVS+9: timer for cloud 2 +; CVS+11: frame for cloud 2 .fInit: - ld a, [rLCDC] - and a, %1111_1011 - ld [rLCDC], a - ld hl, CARD_VARS_START + ld hl, CVS ld a, 0 - ld [hl+], a ; timer for dog @ +0 + ld [hl+], a ; CVS: timer for dog ld [hl+], a - ld [hl+], a ; timer for big zero @ +2 - ld [hl+], a - ld [hl+], a ; frame of dog animation - ld [hl+], a - ld [hl+], a ; frame of zero animation + ld [hl+], a ; CVS+2: frame for dog + ld [hl+], a ; CVS+3: timer for zero ld [hl+], a + ld [hl+], a ; CVS+5: frame for zero + ld [hl+], a ; CVS+6: timer for cloud 1 + ld [hl+], a + ld [hl+], a ; CVS+8: frame for cloud 1 + ld [hl+], a ; CVS+9: timer for cloud 2 + ld [hl+], a + ld [hl+], a ; CVS+11: frame for cloud 2 + ld [hl+], a ; CVS+12: timer for cloud 3 + ld [hl+], a + ld [hl+], a ; CVS+14: frame for cloud 3 ld hl, .doggie1 ld de, MY_OAM @@ -59,57 +65,137 @@ def Card_Offset_functions equ @-TheFool ; y and x in b and c ; height and width in a & %11110000 and a & %00001111 ??? that's deranged call BuildMetaSprite + + ld hl, .zero + ld de, MY_OAM + 6*4 ; we've already written six sprites for the doggie, 4 bytes each + ld bc, $100*26+41 + ld a, $22 ; two by two + call BuildMetaSprite + + + ; set up the palette for the clouds + ld hl, rOBP1 + ld [hl], %00_10_01_11 + + ld hl, .cloud1 + ; six sprites for the doggie, four for the zero, 4 bytes each + ld de, MY_OAM + 10*4 + ld bc, 73*$100 + 15 + ld a, $13 ; one by three + call BuildMetaSprite + ; set those three sprites to use OBP palette 1 + ld hl, MY_OAM + 10*4 + 3 + set 4, [hl] + ld hl, MY_OAM + 11*4 + 3 + set 4, [hl] + ld hl, MY_OAM + 12*4 + 3 + set 4, [hl] + + ld hl, .cloud2 + ; six sprites for the doggie, four for the zero, 4 bytes each + ld de, MY_OAM + 13*4 + ld bc, 84*$100 + 58 + ld a, $13 ; one by three + call BuildMetaSprite + ld hl, MY_OAM + 13*4 + 3 + set 4, [hl] + ld hl, MY_OAM + 14*4 + 3 + set 4, [hl] + ld hl, MY_OAM + 15*4 + 3 + set 4, [hl] + + ld hl, .cloud3 + ld de, MY_OAM + 16*4 + ld bc, 90*$100 + 67 + ld a, $11 + call BuildMetaSprite + ld hl, MY_OAM + 16*4+3 + set 4, [hl] + ret .fUpdate: - ld hl, CARD_VARS_START + ld hl, CVS call IncrementTimer - ld a, [CARD_VARS_START+1] + ld a, [CVS+1] ; checking the high byte of the timer cp a, 06 ; $10 00 = 1 second - jp c, .doneWithTimer1 ; if the timer is less than $0800, skip to end + jp c, .doneWithTimer1 ; if the timer is less than $0600, skip - ;otherwise reset the timer + ; if the timer is greater or equal to $0600, reset it ld a, 0 - ld [CARD_VARS_START], a - ld [CARD_VARS_START+1], a - ; and make the dog dance - - call .dogDance - + ld [CVS], a + ld [CVS+1], a + call .dogDance ; and make the dog dance .doneWithTimer1 - ld hl, CARD_VARS_START+2 + + ld hl, CVS+3 call IncrementTimer - ld a, [CARD_VARS_START+2+1] - cp a, $02 ; $10 00 = 1 second - jp c, .doneWithTimer2 ; if the timer is less than $0800, skip to end + ld a, [CVS+3+1] ; check the high byte of the zero sprite timer + cp a, $30 ; $10 00 = 1 second + jp c, .doneWithTimer2 - ;otherwise reset the timer ld a, 0 - ld [CARD_VARS_START+2], a - ld [CARD_VARS_START+2+1], a - + ld [CVS+3], a + ld [CVS+3+1], a call .zeroRotate - .doneWithTimer2 + + ld hl, CVS+6 + call IncrementTimer + + ld a, [CVS+6+1] + cp a, $20 + jp c, .doneWithTimer3 + + ld a, 0 + ld [CVS+6], a + ld [CVS+6+1], a + call .cloud1Move +.doneWithTimer3 + + ld hl, CVS+9 + call IncrementTimer + + ld a, [CVS+9+1] + cp a, $20 + jp c, .doneWithTimer4 + + ld a, 0 + ld [CVS+9], a + ld [CVS+9+1], a + call .cloud2Move +.doneWithTimer4 + + ld hl, CVS+12 + call IncrementTimer + + ld a, [CVS+12+1] + cp a, $60 + jp c, .doneWithTimer5 + + ld a, 0 + ld [CVS+12], a + ld [CVS+12+1], a + call .cloud3Move +.doneWithTimer5 ret .dogDance: - ld a, [CARD_VARS_START+4] ; dog animation frame + ld a, [CVS+2] ; dog animation frame inc a cp a, 2 jp nz, :+ ld a, 0 ; zero the frame if it was 2 : - ld [CARD_VARS_START+4], a + ld [CVS+2], a cp a, 0 jp z, .frame1 cp a, 1 jp z, .frame2 ret ; shouldn't ever hit this - .frame1 ld hl, .doggie1 ld de, MY_OAM @@ -132,13 +218,20 @@ def Card_Offset_functions equ @-TheFool ld a, $23 call BuildMetaSprite ret +.doggie1: ; tiles start at 0 + db $01, $02, $03 + db $04, $08, $06 +.doggie2: + db $01, $02, $07 + db $04, $05, $09 + .zeroRotate: ld hl, .zeroCoords - ld a, [CARD_VARS_START + 6] + ld a, [CVS+5] inc a call ArrayClampLooping - ld [CARD_VARS_START + 6], a + ld [CVS+5], a ld b, 0 ld c, a @@ -160,10 +253,113 @@ def Card_Offset_functions equ @-TheFool ; height and width in a & %11110000 and a & %00001111 ??? that's deranged call BuildMetaSprite ret - +.zero: + db $0a, $0b + db $0c, $0d .zeroCoords: ; length-prefixed list of y, x db 4, 26, 41, 27, 42, 26, 43, 25, 42 + +.cloud1Move: + ld hl, .cloud1Anim + ld a, [CVS+8] + inc a + call ArrayClampLooping + ld [CVS+8], a + ld b, 0 + ld c, a + + ld hl, .cloud1Anim+1 + add hl, bc ; add bc twice (it's a list of pairs) to jump to the bc'th element + add hl, bc ; of the list + ld b, [hl] ; load y into b + inc hl + ld c, [hl] ; load x into c + + + ld hl, .cloud1 + ; six sprites for the doggie, four for the zero, 4 bytes each + ld de, MY_OAM + 10*4 + ld a, $13 ; two by two + ; location of source tile map: hl + ; location in memory to write to: de + ; y and x in b and c (set above) + ; height and width in a & %11110000 and a & %00001111 ??? that's deranged + call BuildMetaSprite + ret +.cloud1: + db $0e, $0f, $10 +.cloud1Anim: + db 9, 73, 15, 73, 15, 73, 16, 73, 17, 73, 18, 73, 19, 73, 18, 73, 17, 73, 16, + +.cloud2Move: + ld hl, .cloud2Anim + ld a, [CVS+11] + inc a + call ArrayClampLooping + ld [CVS+11], a + + ld b, 0 + ld c, a + + ld hl, .cloud2Anim+1 + add hl, bc ; add bc twice (it's a list of pairs) to jump to the bc'th element + add hl, bc ; of the list + ld b, [hl] ; load y into b + inc hl + ld c, [hl] ; load x into c + + + ld hl, .cloud2 + ; six sprites for the doggie, four for the zero, 4 bytes each + ld de, MY_OAM + 13*4 + ld a, $13 ; two by two + ; location of source tile map: hl + ; location in memory to write to: de + ; y and x in b and c (set above) + ; height and width in a & %11110000 and a & %00001111 ??? that's deranged + call BuildMetaSprite + ret +.cloud2: + db $11, $12, $13 +.cloud2Anim: + db 4, 84, 58, 84, 59, 84, 60, 84, 59, + +.cloud3Move: + ld hl, .cloud3Anim + ld a, [CVS+14] + inc a + call ArrayClampLooping + ld [CVS+14], a + + ld b, 0 + ld c, a + + ld hl, .cloud3Anim+1 + add hl, bc ; add bc twice (it's a list of pairs) to jump to the bc'th element + add hl, bc ; of the list + ld b, [hl] ; load y into b + inc hl + ld c, [hl] ; load x into c + + + ld hl, .cloud3 + ; six sprites for the doggie, four for the zero, 4 bytes each + ld de, MY_OAM + 16*4 + ld a, $11 + ; location of source tile map: hl + ; location in memory to write to: de + ; y and x in b and c (set above) + ; height and width in a & %11110000 and a & %00001111 ??? that's deranged + call BuildMetaSprite + ret +.cloud3: + db $14 +.cloud3Anim: + db 2, 90, 66, 90, 67, + + + .fDraw: ret @@ -185,18 +381,15 @@ def Card_Offset_functions equ @-TheFool db $00,$00,$c0,$c0,$e0,$e0,$30,$30,$18,$18,$18,$18,$0c,$0c,$0c,$0c db $30,$30,$30,$30,$18,$18,$18,$18,$0c,$0c,$07,$07,$03,$03,$00,$00 db $0c,$0c,$0c,$0c,$18,$18,$18,$18,$30,$30,$e0,$e0,$c0,$c0,$00,$00 + db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$00,$3f + db $00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$00,$1f,$00,$ff,$00,$ff + db $00,$00,$00,$00,$00,$00,$00,$00,$00,$80,$00,$c0,$00,$f0,$00,$fc + db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07 + db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$78,$00,$ff,$00,$ff + db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$c0,$00,$f0 + db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$ff .SpriteTilesEnd: -.doggie1: ; tiles start at 0 - db $01, $02, $03 - db $04, $08, $06 -.doggie2: - db $01, $02, $07 - db $04, $05, $09 - -.zero: - db $0a, $0b - db $0c, $0d .KeyArtTiles: db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 diff --git a/00thefool.aseprite b/00thefool.aseprite index 8e49e047363af9b9685552686aed7a2ad4d3c826..2d488994494928d981c80b0984e5667fa1536d52 100644 GIT binary patch delta 340 zcmbPY+F-`SAU%<(j<-RIf#KIjQ^phq1_slOy?=!GZvk1#3M@d94Twc1A7mAuyk3~M zeld_&F=uU{qtFor4(3n)?ZXAvTw3H;UYxPOgM;~Ed;{y^MMmO1JwlPa5^Dn2PVH!M zWzH+8OL%+gNa*gS#d3e{ruB==T%R~0cjcXJX5qE*b-#+*I0Mu+#O;?oaJ~NK{~PwN zTd%Mc@Y{c%&%tv1v2B%DSFlxi-|`;EPszdaG@8%8v2oS-$0B&K|I^FrY>pe-$~yH_ z&$VBEe~kb0{S>>i{%>M#u48^b`6K_O$+tx`7@0P+h-NZL)&Skjs=x#!IT-#k11T`z zWDuDAP(t1%Il+N7#^KD_2Kf&RhWd=A&a5984ebTECoJ?A=xAN>PU%yFfyiWLiN+b6 k9Wy81c$1M8(J+I#*2hp*xo&Rei^lK1*mQ4zt5lW(f(8X@ARD$ zZZOjUwtn`mKNX=O&-Zwz#T%}3(Jc!fGFHuGcAUJCaoS{4Q4L1s z&2gfcOyXHUm$51^F-S0QF#Kl*a=?IV@;z~7gM@?!Oi6ichZ@*BDmw$rx!Uv-Sd!Ef j(%h0ZCkGy9IwIq6hAnk7lcBm;DMQ5(hUCr85__2dAH{8; diff --git a/01themagician.aseprite b/01themagician.aseprite index 7de7e0994c8cd3dde7f184801caf578d74fd7bc7..e45f5f4a142191eb97364002d07430da3b9bfa64 100644 GIT binary patch delta 211 zcmca?w8Vr-MQS2b9q$rJ28LfB)fiJ47#P$x_O=W2djeU?3M@d94Tza0A7m9*W@iX4 zD9S8JEfxa`Rm@3FSRj^=mev;FaE2jSkcENe0)yn_jf`@WMMQj6HGoQ36qp&9fHVaB z2U0vR6MPaYQ;S$O$BD==Njd=~SQVHU6c_{;{xd^WGcYnRPF4_?7fen`NC1j)FfjFk k)iF + + + curve editor for gameboy animation + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ control mode +
+ + +
+
+ + +
+
+ + +
+
+
+ + +
+
+ + +
+

output is a length-prefixed list of y,x pairs.

+ +
+ + + \ No newline at end of file diff --git a/main.asm b/main.asm index 86aa7e3..5e0d9a3 100644 --- a/main.asm +++ b/main.asm @@ -33,6 +33,7 @@ def GLOBAL_VARS_START equ $c400 ; defined mostly in mainmenu, program-wide state def SCREEN_VARS_START equ $c500 ; per-screen variables like animation stuff def CARD_HELPER_VARS_START equ $c600 def CARD_VARS_START equ $c700 ; variables for animation of individual cards +def CVS equ CARD_VARS_START def SHUFFLED_DECK equ $c800 ; location for the shuffled deck def ZEROES equ $D000 diff --git a/source.zip b/source.zip index e1b807b36889be0b1a8d792913ac47d27ee4bd80..0e9922137ca4b2fcbeaaddcc34df8cdd5a34e854 100644 GIT binary patch delta 5007 zcmbtYYitzP6`r{}7_zkq*gU<)OtDdey>VyuAVd_8y0oX2;*d*A7O|&KUE^Jv zmv{fgmlQMEzY9o-rdL!!DvB3k2Bqu9BzGOhx$BZ`+lXQrYW3EL@o>Kq6MNK{7*u<$ zwPJm%x7<-9_Qd@CN`}~(uKk!2Q+0KBx_X-2ldd0#sEME`>n2rb(vb>bd{&)p=FrV# zIX#qS=CD@uY>tNGHC9oK1jSIqjycfjW>S<7lXPd0AwBz+rTC$Hq{$p~gd*j;?V?}Q zl(Ld$9yVwXvokkyVa5aVQm=VoWMpz-=E#g0=BQC~WKNHnCmEJ_cI7o9oy?U@cjd}v z+L@esg!J)remjXQ><-w)QdyG99G-HQO#9nO5pC!o%ZFeY;I~#BRN`V{K#YeJalju@ z;&H8<@SepRoL#Tj_J^Bg?H1Sv^4CgIrz~|!a;J>)S?N&@9!au` zgMHxvTweIC6~k#dVt7#OjVb;(w0h|D%D#j@B0_1FO3W^%V9|x+^!6U1AOKC1^*=3} z4%`srlpx@bM8pc{qYeIOK!GU!Xi)6;_hH%N+t(`w@qraoqROM;c*uv_i)__=>Akt! ziJ7i>7#us((lpNz-(CG}(mEEn3Ji!?KTe6h>mv`+f9?^MHX}@D3MSCbaHD%{}{sdsxzUXLj!3Hn!^N|D-)VbM}1@kD`8|!b{MdE?nN6m zSW|4WBZVZz8*`bB&Y6YIqQum*3HAJawk{rBpV4`-bG4iR|oORR(%`7plP2Sy0k7D?w`qq zm0{JavnmSC>{e~HQIl@pN!}d#zuVf}8nH>Uf?aKvTW$Y}A5hu;bwCA}wPHjK(9w4C z-jI$TGYWP?Z-CvgRO(^dd@5r^tUs^DP0|j#W5(5^-&g9_D*c+$Pu-`UgFXa=06)Yp zL{?^5oI0{Om1Rb14r@(625 zuY%zQme>_o!>b3nyMC{cg^$=llD?C1X>-_s6u;{_JmB4%;A#FCf8 zW`A5~QLXIA`TpVk&-HEOxV~hK%W`nua;SCOyT$stmWIyOx)yJz*H_o#OP;Q_e7=F% zo_fskcXkj>9v-n+3Yctk%F=Lz&91H!{_0?}GrNRQ4QbuagyZ+2j9xn;R2omZwD71P zv1d(31sl2VS9I@Dfu%){fMC}uxqGNi%TDTwj<__3YqD|Z%GcjtvyYY($ z?k?px91ByC*!5$9=VT9<`qTr8sqH!EowE4=6Nk|@-v+jBUx;2kCa{A$y@lu+sdZRj zYfJ6Jf~`jNfts@cKC?n**dA5)#a~;=aX9h~*q)?M3=7|1jc0UU{%_AdZR0o`OAJc; z==88qvKy6755IBwav{gzxZj|({v^*yNa~N3Sbx}bMc(<#*g}61$Kf!h>AFDcMs&Kn zMj*jydT2yX@L9b7l3o}QSP9b);r^lGC4`gZEs4Q+IG~uNd}{pLQ(Q41gi&As+CUwn z!kP}_za=;>&!CjpMmR}=Y&NQD#LWNQ-vl>3Qo?aK78^{jj?kAzb?onrLh!!ST=-F%YXOj>$hRKa2QvuXsv~-_s4?U!rd`{?4ViD5AvR9uiT4eJhHp+GuGS4;>Z6Vy(Cz;lkar361k!Q-{`#Dq}FG%lf_ElRIX W=!^6%3T{qN+i{^N=g`vvME@_^zKS#e delta 2179 zcmaJ>du)?c6u;m7F4L8jJzZek)~iK%bdO!??XO8P!;hrC zdOS%e7xs_ph4R)=R!}*6&Z-lL=K7^Xt^{rnX?Cj6^g78byaFXQX;zxRHkV0B4+*VP zm42Hcv=_EXqasM4z$aY~`q__3JJW^r^tV!WFv^r$k|9%I#uRJ_`W2h7DRUYpKRoY` z_s+~m=*;{;`%~B{Z?%`?Rj;;}lvbCP*-Of7)T=f*J(^s)BHUoKhD_8N#h7iQic4)$ zysFzp>pV)6lh(OCwANi8#W}}DC(-%inT-o=p_A@9+UoSUCw(Sd7TG9_?7;`Y+<`S( zhgvTj>2hkc!l%t71J-xosalqGlFcMOjR(EY;QvmZ9vCXY4ha^PV;#hF;6zBS#1AJ% z+}u(HedTzyv>0}tlI;s33R9Iu6{?}Mv6iljFc~c&Bebr?X^&CvR--gFQWK+?r?_gI z4A8KR%ehANHk9$oTj1|Kc!p$z_)0t-M%Uu0`UpB!7M2IvK$R>y(`+Q(jNOEvbuJ_k1JExu76 zFnaI@!3O!I9d9v+7H|yWAA${HKaJyp4N~+wJ{fEfU7S2M*j#fSm30Z?M1GE}jS6xgba5%+;jY@b^@gpg%PS%b5*#br`mHAMvyPC*l6tRiz@*@#Am5Et!uRI%=bGvkrR zc;u51*AvQQ>|y)Ekl#Zx)^UD^7hIeBfF2<(;ruS9Nyw7J(&ss!R~w@dxP!O8d}jti zT-X@B?@NGBdWd)=_?aiP!QCDrCK#k0AUe5FmB6n`$xv{B#EBYKFqkaeCLtJGAg4h4 zINr^0DHetfger4^?U&vAP(tR#rCyKIRqt(xM(y(I3%|y)D{%>@whJsiqSy1g9~xOS zb~^(hF7fxVN9Z$f`$7pjd_;#YC&K_+1=G*D5^utwm~aZ*^^rIcY;qn)zQ%Hx-AmFH zp7Gw>wfV&cgt#PzWn8)$BeR87dzDhJ)~HI<7e9MtcjCM02ysabJ3j2g2(DV?RQRYj zRMF91M!ahnF7=YktvtDL_CBvJ3k|C;i%+J{Q4RFpM`k&n9z~CH6?IZdn zobE)gvVMIqETJJ=Moo(9GAYeX5lsQEJ{D$wE41~IM?|7S9N5$jU-S_wfH4ld)C=1F z5Mb_Sz{xqVs-MghJv;cuKcf!zLR`XMslO6B`-xt7k(j0LKg%k?CD@eXB(q