From bc7733cc36e8cd68ae0d2f89d8bd3532b882e3c6 Mon Sep 17 00:00:00 2001 From: Philippe Symons Date: Tue, 20 Aug 2024 23:57:35 +0200 Subject: [PATCH] Feature/add about screen (#1) Adds the "About" scene, which displays the version info and credits. The user can scroll up/down through this screen. --- Makefile | 7 + assets/logo-bulbagarden.png | Bin 0 -> 10583 bytes assets/logo-datacrystal.png | Bin 0 -> 6354 bytes assets/logo-gbdevio.png | Bin 0 -> 1266 bytes assets/logo-libdragon.png | Bin 0 -> 14754 bytes assets/logo-nesdevwiki.png | Bin 0 -> 16996 bytes assets/logo-pkhex.png | Bin 0 -> 2118 bytes assets/logo-retrogamemechanicsexplained.png | Bin 0 -> 12549 bytes assets/oak.png | Bin 5508 -> 0 bytes assets/pokeball.png | Bin 600 -> 0 bytes include/core/RDPQGraphics.h | 14 + include/menu/MenuFunctions.h | 1 + include/scenes/AboutScene.h | 52 ++++ include/scenes/IScene.h | 3 +- include/widget/ImageWidget.h | 1 - include/widget/TextWidget.h | 2 +- src/core/RDPQGraphics.cpp | 4 +- src/menu/MenuEntries.cpp | 12 + src/menu/MenuFunctions.cpp | 8 + src/scenes/AboutScene.cpp | 272 ++++++++++++++++++++ src/scenes/MenuScene.cpp | 4 +- src/scenes/SceneManager.cpp | 4 + src/scenes/TestScene.cpp | 3 - src/widget/ImageWidget.cpp | 5 +- src/widget/TextWidget.cpp | 6 + 25 files changed, 387 insertions(+), 11 deletions(-) create mode 100644 assets/logo-bulbagarden.png create mode 100644 assets/logo-datacrystal.png create mode 100644 assets/logo-gbdevio.png create mode 100644 assets/logo-libdragon.png create mode 100644 assets/logo-nesdevwiki.png create mode 100644 assets/logo-pkhex.png create mode 100644 assets/logo-retrogamemechanicsexplained.png delete mode 100755 assets/oak.png delete mode 100755 assets/pokeball.png create mode 100644 include/scenes/AboutScene.h create mode 100644 src/scenes/AboutScene.cpp diff --git a/Makefile b/Makefile index 62fbfa3..1c97fc2 100755 --- a/Makefile +++ b/Makefile @@ -39,6 +39,13 @@ filesystem/%.sprite: assets/%.png filesystem/Arial.font64: MKFONT_FLAGS+=--size 11 --outline 1.0 --char-spacing 1.0 --range 20-E9 filesystem/Arial-small.font64: MKFONT_FLAGS+=--size 10 --outline 1.0 --char-spacing 1.0 --range 20-E9 +filesystem/logo-libdragon.sprite: MKSPRITE_FLAGS += -f RGBA32 +filesystem/logo-bulbagarden.sprite: MKSPRITE_FLAGS += -f RGBA32 +filesystem/logo-retrogamemechanicsexplained.sprite: MKSPRITE_FLAGS += -f RGBA32 +filesystem/logo-datacrystal.sprite: MKSPRITE_FLAGS += -f RGBA32 +filesystem/logo-pkhex.sprite: MKSPRITE_FLAGS += -f RGBA32 +filesystem/logo-gbdevio.sprite: MKSPRITE_FLAGS += -f RGBA32 +filesystem/logo-nesdevwiki.sprite: MKSPRITE_FLAGS += -f RGBA32 filesystem/menu-bg-9slice.sprite: MKSPRITE_FLAGS += -f RGBA16 pokemegb: diff --git a/assets/logo-bulbagarden.png b/assets/logo-bulbagarden.png new file mode 100644 index 0000000000000000000000000000000000000000..821767ace1e27072510e3969355c7b12fffa7b43 GIT binary patch literal 10583 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 OKwVi!sY1av@_zsZqHaV0 literal 0 HcmV?d00001 diff --git a/assets/logo-datacrystal.png b/assets/logo-datacrystal.png new file mode 100644 index 0000000000000000000000000000000000000000..ab3ed0ef8a30f8ed270274040dc82f2bc7e4af00 GIT binary patch literal 6354 zcmV;@7%k_CP)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{02n$+L_t(&-qo9Vl`OOc5FdcG_qnN4$CwS=rU^5ZX@Y*R-{=Z zfJ?*(g4(U3f@l;RVhk!oKz;HC-mBq`zv&G9$M4pyDtHo!(YAkU)vCI6fA@FJKIgml z{_gKSSMUqGo_67X-!aZ|)9JL?*6UR_z3IGtzo@ar&+EZYKIgwYrQJxLV5@Rh;rww? z+S(zc?5zyONs=UNUs}w2o%WhX>=R1ei!yiVIQhfkcC&A76?=rzaVn-o#oBmEWDJYF4om$m#+VR<^o>TE$8oxvIqn`;?u$v%xcS;Q zzW9s3G=?5~_G@qufl5=9hM#k90GN}9{9PWKL(wyw*p|I8=e^3uKk&kWsl_QmHW(p})n{KVzu zL(So6EM#yjbz3ZSTJ!s&B&9+!m=u)OktQ*{c9Vr}n@DS>d4cnuG&1C6NtPE#A&BER zG`qctNZPlTGQRwim!5ykFVxT{zwB*KZD22y<@9%CuzevA2M(>U|KJKn!tuxK;K*%@ zR8@siiYQK)l#T~hhpdh!Byq%!r3H>$>SK(isvMQIG~$Tm!H|`;AwobaP3d*p*dRhB z%&JH_H#!-8;QBYc`0I~!&gzkV;L+#2{=CHH?`}|@R%DZAUKGM8O_mpovm7M^-ByDn zj?hZc>$FLdgoFF{GFUmpXt0XUr|3}8>$GXL+QgB;IZtFXWm%CGB}zauiAj@~;bbbR zB2ODSJh8IXZ|pk#h2y)vaQ)x^+zdVToY!9x72`K`BOdK-r6$viG>!Tt}oC?Eu+ zfXZ4TW9W6-xFGn-XKv)4J3h~F&)uy4@O%9Ddw<8VkAD)qr6rv84BSyeI)d5^3qme7nS*@|fTJkICJ)-gxUzJ9qt4<-dzAJ97BI18*pY2Vc6_j@ygf zHj`i*+9F zJ?&;={hNFWRF%bAhbLgI0|Y_{gp?R#&`PoIp6}xF2>?gF z@Q+CQ+laNMyKR9qGCc78gztR$v$b11=^2d18P-~?bMqbWzTQdaJE8hFpmn`qU|5a;iYt72KI=Hl&bXpBM%?6DmB90@{B*t1d4~PI*pjBDyghRNe877L-Wpd`CmetJ+2)?xK6%R{hVCC;_Tk+J@Bh*J9@u|i z+wwSLG|dSi&`e`Gjf8eHCChV)(vqezD{CY69a>@Shj&r@;9C$c&_DCFcqGkkpM(GV zFRAXmW6K!lz5nBEf80~>2yT4GtGMTu>j60RyjPMo+q9bv+U+)@X@(EbYNQlpMF@fM zG-GuzoEab>X&*GbBQE;?w=R`#mAmHUO9B}bhx$z0V!%&I`63}3karp z!P;m-2sL!`vciY3v4Tn>03iiRDuj9{c$AcADbW(7*gPq*>2<(5KXVTVp`MSD5-BB8 z2p~{Q22165_2M($dgZVE)IK_1TfK0!a`1%UoRC7W{u619(76n$4Qo zI9G?;EqIX#sgPO`H=4+ukEt1t(Fg%T)P~3hK}$&iA>f=N%y!cI00Fd;Sm!A#3n3tc zsK@nARO7)3qFlTXc*#Er-3#CUp>tRE?YS%)t}gfx$V$uVq+pm80Bq}Z=(ZYUd4cne zMiR69zzgpW{=1{&oO{ z_uq%F@|rR>Iv^!WM;*h-&pR7q3}t00$_gnZrL~O4Q@nQ=C2>BGmlhYGySQzoxwPZL zn=ZZJnxD9%m;BZL**RQ3aDi}TUr9;u4j}|m);nsQXPo7D@2PB6L$)ZHOmjk&ZC$Zy zLiU9#0LTD&##tzBP}aViaHh>~A!hz02m!2hlvPE$k>b6d!)g8MpYU(6Nf%d@WPkTL!l*X%mbaew@a*f1bLjQ^ zv=YV2z8}pDRitr5R#p(8-E7RLr6vT=a5N?ak01cE&Cr@ui>49o%*}?*XZV(DK7C4+ zO`cX1g(#{DA3Or)J1PL{9Mim@vW`ifvoah}R2A0wjm4VnzL1ZsFj5kf042g4j$#JQ zqO8cvvL*}8BM=y^>TwPib%Gb6%uamKd$0Ys582VlcygK_tS%166RfpcCq7FrN-4Ut zIx;T`(m1BwOj+9mT`{{?imeXxtap5bcBf0KCEI&Vl$6}{wJ&o0yDzR+TnLoh7;8P1 zKwZUzP(NF1MerVHH`o)i2rgxvc7hMMGFuQT{Vm|uEryN%`jz9Jm-p}T&XGhBN(!8{ zgy3h;t&J|NV|g%QlI2v^K?qE;g3)BU5yq7Qr3uPzLDawh(93BlIVS-jTIAbLIeP=T zLZD?0-F4Jk>ljTkqRLTJmT8frq^hHSS=RY>({lO{nC3ZB%6h)q9)HGLuYBq!-u!#t z&;W^6CzwR{o6Q9Tfzf!(U^t#dwRI>0Gbkl-gp#!(jWni;qm2nGRqv=$Y+mj?M-_CE z4o4mHBmnm9`3H{u;SC!|kYcu=8xvPr(Q2e5NlaN;loDuN7w02u=Rs&5b%msn#B^FI z07a1f)Tk4H+E67pK8Z}yZ^k(1sLGPD5?EVDtMwg~Qj*3oOT7-(I;`_l*5bY2G+~Wa z2Csb`sb~M++bh|z>uJ#H)`m_56x~fEN+D%Hij4&_TG4K$L?)uu5G1idYt3Yuk>@$y z+4=JY0;Lu0W=b3x%F@zF<0NjF#fByP=i;txzWzBZPdTSTu(l7>uWwqN1p3%}GuqVpiF#-@b0I^NzuIg7r1Lo%4{i(vB^SULPbV zfzg^q5}}2lDC*Kn%p+lqT|1LCk~qR>MG{AdVgtGh&6I8$Q`mA#jVai`WB{J{qXAzU zet1)QS!YFZ9uLH9ZbmDN*2Iw^GMb_+QA%Jp@2C(2@3GDkLa6UIhHkS#+A!!iimXl> zdGI;060{mAxe|=VW6Jfx#5!pfG}4q~c5I{FNNc6eI>K}?A1~1oZ3M6tS|SLHH$43x zkDO~b(e(QH`%B-y9r^UrQ9`j!osH2fbXufILL5gl)0$te4M*fzMkUG(Qa?jpq!kOD zHqAzY6q0_olO-yx2JSn9Re*6Xs^ZPRTw@UCVr z8^K6ol*DMcg|+jtHhYy;Ayi&em7N(T=RU9=wxh_8O;Ac= zj7A9gAO%6xo3+m9lng#~7`V zGtypJM+o5|>Wx;C$QUAHkV<)^x_549ZvEZUX_3dFY{o`Y6b03+f)N6=62w~K35-T# zs-w{yjW;7wtroRSr4J zjYVZySsUU5C^^L#J+EH!Ji`aSv72J!kGv>Y8II6#nya3_d(MoMF?S|Ox*A1wV`wwq zkV0T&y`x$Rl&oRqoWptlka|$eDiHCYGVR`N3IF(v-=ubk!2Q2*D*G2VT8nbuy(9`+ zk;3R2l3^x@#gV}i7-u;}SyEOdwzA+i)vhyDv5`bX#?%xwh*clLopVFqd%^R*xpU{v zyN=p^1pRKCB#BXKJve}tV*b-i6Sgn*+1BsQqFYL`i5M6y(ORSAR&B35_X?x}rRoSQ zq(VLOl^ed@?qY;fttLv90#x>Re70Ovj9NzQn(QFz~c&7Tu@ z7V*wAIPl{Q|NK|S*Tp*lG2^uAh>d#m^2`4xjW|XK`06d6n;Y6lVq6HskwIxiWE3K( zd5Km_p7ok4S=Y-(Yeu=XNtE37_VZ4ywrWPod~RC0S4^_(2&EK}R)k8-fHo7cLmmB` zcNnb+LexEwO~UmTul?X*rIPiWDx|3MWY{WNU-|xb9riO?3cL$5DA)a$xq@++%Xv>; zl$6L7WOVaGq?A`a_vyF3_v%mFu9QB*SA~!wpk$qwWME!^8zYHLUEP${(n=FLo4D>1 zPk9zmvqK1hzyJJAxU$x2^XV8N0-_WMT?^D@zJY|_e!*Ep#vlaT`K@no@7>=c1dsO? ztu&RZjWnr3P^TBUiF&Rp4AZP2FKsBJ&K-aD2QRqw@G78*t`kz7nq^tbtt;UhsThI4 z`@l3W5R{aaMMyD^egL~)_YOKoKNcT6Z#(-W4t)Pk0M2~!Q4cGQz5TMw>9$*F0e||( zZ{hv#ycFjgc{T+VF)b^chuCP8Jgg#yb)La^f=XJGxEX)sC-z>1RG&%G#_fU-!b}Ae zn;25SlNSYR!x4k=glSPwmeoe3Gr#wraWo>ZHC4>~FZg;_gAXWKi`PY2;l1CQL&FTV zr42G|-X5oo&pvER;;%pPxfeaK=Z7EIcmIzUilQI@HUtU_g$H9I7WzGsB%TxK;o2(q z-1S{b>v_s=Js;EAMj%j*R_iWUq`2XO@8hnoe|gJTuYU78Iqvu;0D*3=hfxwO1Yi36 zr@8yCyD)LWS)ZQuvizUyvKWJ_7+zck9yRru6e`m zYaX`A^x`v~dCe6cx$(DG4jnqLEK5xYv+h>FC`G%~V5#3Fj$+i z1IHczIN~Is+iqc^2xTIaj>w9Vs#IvL9>Q~V6xn8P@x})m`4iiQjdtq;{l&#Ql~O@$ zt_+NxHGpFxqtQxXttBtYy8G=MZpMVZUtVRLl~e(uX7^xw`_UI& z`$sRi>JcB-_#c1u;Y;@J+4I`9!Ju6@k42)Rm`2(liVQx~xvr`#gVBg=rm6P2T^fy) z5B|xetQ|T~6N!6=w3`i5Eikg)v70}26R$k?1pvJHo$sTOCRAm~+Hh2h&?X{HQ$h%6 zZIIef&2*%}aLmeROjbHn+8#BQcD(1>H(hY)PqIZmoT0D$PcMAi_8mL_SF6>^gs4+X zSyqfEQc5BdPp>$H?0s`%DA<)HAbT`lj#&|?W~h- zDQALRQ51~EBc{_S_W!Vj3kcv^xu34B_&3Jo~5g7Jm#V|zM0{0L=;6d z(gZh4A3`{kQnZ>48fl92b(htEz7;8h>{)Xsf}R$g~# zW#y%jQEg))lvGG1@gYzaC5Kkl7z{@s1pQu@gyu`#Y+ZGpSHJf!E8UlG`DJsV>ccZCFudq?)U4L=m z@BWhqs(z}IW4nL%IeURu|F^4dSeD*i=&Eu_D=F4_FG(U=*w@uW;ajgSe_fX-U7=W3k`I zc}E->T8##i>69Pu-OFf_6U8x$3kxJkOp+udX<}8B+$qz}dtUtPldpOt^Old)&(t7X@U??mKLJ~sZlsvVaozRKr2nN*{G>xWpU1;X2fEe<&@T;vKE-v7~Ck1ERXX`_{uGY2cnCr&2g1tHMQG^vGgA4nrZq$Nc* zWjdV_yd#YhI-NFg93h0jC`AaKX_hg~3oCTI(&}_?Z+E-bHCo-zzT|hFdH*lXmj~W; z<;PDcitMxy!bu9hD>&Q7+ax$EBPB#x6s)bT;+&)1YO=JrK$0XOiDRE8Nge{Lm9uvj z*4-9lbo0wz`21V{rRMf?`#Q*<-EhlOgLO~vuH0pd{L!fjJF24SjfcY|1V^jY%KQEP zAWhS~Q54-5N73CvsXL!_(yxEx|Eur49PYaM6JOYAi&ASmCQaHq)$ literal 0 HcmV?d00001 diff --git a/assets/logo-gbdevio.png b/assets/logo-gbdevio.png new file mode 100644 index 0000000000000000000000000000000000000000..1d47126e07294f6a4ba0c4b2c8d37bf3b88b9e6c GIT binary patch literal 1266 zcmVe zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00de|L_t(o!|j;MZ(BtahrgM* zo@+bTiJZg^O_MgQTcWn23Xh7aYIvwD5C{p01xPGdAS8CMf`5Q5d$ue^ z8Q>Iv%(+1`KfJD`V+>!rcI}s`si}yyIOt}_@n-Ms2!KxZqPzRSm`D%=!(kY9E`iKn z`kt^jvm+pGdoNutzrSkCS`M07P9!0)wQAVLeh}jO;fe$aADCmU^~Yz2_Hg3(V8cLi zxdLB){cGJha?Kbv&>H}j_3-s%ZEZg)TLO72U*Mz3$(`L?hzE1zJEsj}rFRr0Tu~r$ zrP76uLuekgwLn@REsz#S3*>(bvgQpfJ2lT_HrKHG$?V+1)v5(X4U z&a8Hs2`P@A1wh3+>VlZiXZrkC1i3o^B%Xeg_}-%c#P%Ge{O=gv^lhU1o?mkvYh_PF zC3>ncEnv!(PMUI3)#E|e^+r&bTY>;^Cq|Y)RJ4uGlkZ|ofRI-GWEGaC`;`v?$lv^p z!j&HpDzY^8FjFxH8A~p8og!U(Yvf%Z+#*C18?TzJB&o18ox|@@ygP!5Iz)SG8a>8` z!hMLuL8*;_*y(+!V{e1poZhK;JI;aU*47GPLD#_M1TE6uO{BehYqdIe7gQYDlG|6- zZJFHxV)L!9CV)7NJ8SBhH-DedU8t6&gXJU%^3(XGLS;caj!JYrnEqY~gv59yWURdb zAk%m7<|_ADo!pJ(B=KhN;m%A{#yZl(YCuf6hyMD`v-C409AvM5rk?x1~# ziS`{{NB0BDH_joH1_46IjW>MPm(MbU0fZq)1%X!)D8B@uUp+$w=-9HtUO$V7L@~u2 zCMYAF6v50tsLsA^fOthH<*VnBfJNDN^A!-^hj{1e4blhj{=S5aB@xveu@9cCd~0LBYY>@8AtE+Ng{XQ_OL#IB zK?pICN~Lm52LX`I>ToFmuOE!!*b*t_Hvm?LtxV1hcIJXCU|)ygc)v|gyFyBNU2FXr zfOTY-lX<3xZ;c6FY&M9Jpp^g!l~Si|+x{Sv$;`8OOpcC@9uh*lwi90QegBTu`j1Q| cbA9Fbe_QQh*qoe_(EtDd07*qoM6N<$f)FNB=Kufz literal 0 HcmV?d00001 diff --git a/assets/logo-libdragon.png b/assets/logo-libdragon.png new file mode 100644 index 0000000000000000000000000000000000000000..0f25baad74af36b2b11cdf7af40210cf3970ca27 GIT binary patch literal 14754 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 CVg^9~ literal 0 HcmV?d00001 diff --git a/assets/logo-nesdevwiki.png b/assets/logo-nesdevwiki.png new file mode 100644 index 0000000000000000000000000000000000000000..e613fd87a2e1077c2ab02b89a33b857cd95c83ec GIT binary patch literal 16996 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 literal 0 HcmV?d00001 diff --git a/assets/logo-retrogamemechanicsexplained.png b/assets/logo-retrogamemechanicsexplained.png new file mode 100644 index 0000000000000000000000000000000000000000..4f109515a0af46db21f2a6ec8178da49b5c45e54 GIT binary patch literal 12549 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 bl(PQ=+$$~;Enb(u00000NkvXXu0mjf@Emmi literal 0 HcmV?d00001 diff --git a/assets/oak.png b/assets/oak.png deleted file mode 100755 index bc08c45b776d3431c8581debf08157aa7fb84689..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5508 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.width), .height = static_cast(dstRect.height), - .align = ALIGN_LEFT, - .valign = VALIGN_TOP, + .align = renderSettings.halign, + .valign = renderSettings.valign, .char_spacing = renderSettings.charSpacing, .line_spacing = renderSettings.lineSpacing, .wrap = WRAP_WORD, diff --git a/src/menu/MenuEntries.cpp b/src/menu/MenuEntries.cpp index 7a5c3c4..856665f 100755 --- a/src/menu/MenuEntries.cpp +++ b/src/menu/MenuEntries.cpp @@ -15,6 +15,10 @@ MenuItemData gen1MenuEntries[] = { .title = "Teach Pikachu Fly", .onConfirmAction = gen1PrepareToTeachPikachu, .itemParam = &MOVE_FLY + }, + { + .title = "About", + .onConfirmAction = goToAboutScene } }; @@ -32,6 +36,10 @@ MenuItemData gen2MenuEntries[] = { { .title = "Unlock Decoration", .onConfirmAction = goToGen2DecorationMenu + }, + { + .title = "About", + .onConfirmAction = goToAboutScene } }; @@ -53,6 +61,10 @@ MenuItemData gen2CrystalMenuEntries[] = { { .title = "Unlock Decoration", .onConfirmAction = goToGen2DecorationMenu + }, + { + .title = "About", + .onConfirmAction = goToAboutScene } }; diff --git a/src/menu/MenuFunctions.cpp b/src/menu/MenuFunctions.cpp index 2e0c2fe..e57b22d 100755 --- a/src/menu/MenuFunctions.cpp +++ b/src/menu/MenuFunctions.cpp @@ -113,6 +113,14 @@ void goToTestScene(void* context, const void* param) sceneManager.switchScene(SceneType::TEST); } +void goToAboutScene(void* context, const void* param) +{ + MenuScene* scene = static_cast(context); + SceneManager& sceneManager = scene->getDependencies().sceneManager; + + sceneManager.switchScene(SceneType::ABOUT); +} + void goToGen1DistributionPokemonMenu(void* context, const void*) { goToDistributionPokemonListMenu(context, DistributionPokemonListType::GEN1); diff --git a/src/scenes/AboutScene.cpp b/src/scenes/AboutScene.cpp new file mode 100644 index 0000000..fbfb800 --- /dev/null +++ b/src/scenes/AboutScene.cpp @@ -0,0 +1,272 @@ +#include "scenes/AboutScene.h" +#include "core/FontManager.h" +#include "scenes/SceneManager.h" + +static const ScrollWidgetStyle scrollWidgetStyle = { + .scrollStep = 15, + .marginRight = 0, + .marginBottom = 0 +}; + +static const Rectangle scrollWidgetBounds = {0, 0, 320, 240}; +static const Rectangle headerTextBounds = {10, 10, 300, 70}; +static const Rectangle imgDragonBounds = {5, 80, 133, 78}; +static const Rectangle imgBulbagardenBounds = {163, 121, 134, 17}; +static const Rectangle imgRetroGameMechanicsExplainedBounds = {5, 173, 133, 39}; +static const Rectangle imgDataCrystalBounds = {153, 163, 60, 60}; +static const Rectangle dataCrystalTextBounds = {215, 185, 100, 16}; +static const Rectangle imgPKHEXBounds = {25, 233, 38, 37}; +static const Rectangle PKHEXTextBounds = {68, 248, 50, 16}; +static const Rectangle pretPokeCrystalTextBounds = {153, 248, 175, 16}; +static const Rectangle imgGBDevIoBounds = {28, 280, 34, 55}; +static const Rectangle gbDevIOTextBounds = {68, 300, 75, 16}; +static const Rectangle imgNESDevWikiBounds = {163, 280, 96, 60}; +static const Rectangle otherCreditsTextBounds = {5, 350, 310, 80}; + +static const char* otherCreditsString = R"delim(github.com/magical/pokemon-sprites-rby +glitchcity.wiki +github.com/seanmorris/pokemon-parser +github.com/LinusU/pokemon-sprite-compression +github.com/xvillaneau/poke-sprite-python +)delim"; + +static const char* headerTextString = R"delim(PokeMe64 Version 0.1 +by risingPhil + +SPECIAL THANKS TO: +(For docs, tools and/or inspiration) +)delim"; + +AboutScene::AboutScene(SceneDependencies& deps, void*) + : AbstractUIScene(deps) + , fontIdArial_(1) + , fontArialStyleWhiteId_(0) + , logoLibDragon_(nullptr) + , logoBulbagarden_(nullptr) + , logoRetroGameMechanicsExplained_(nullptr) + , logoDataCrystal_(nullptr) + , logoPKHEX_(nullptr) + , logoGBDevIO_(nullptr) + , logoNESDevWiki_(nullptr) + , scrollWidget_(deps.animationManager) + , headerText_() + , imgDragonWidget_() + , imgBulbagardenWidget_() + , imgRetroGameMechanicsExplained_() + , imgDataCrystal_() + , dataCrystalText_() + , imgPKHEX_() + , PKHEXText_() + , pretPokeCrystalText_() + , imgGBDevIO_() + , gbDevIOText_() + , imgNESDevWiki_() + , otherCreditsText_() + , scrollFocusSegment_(WidgetFocusChainSegment{ + .current = &scrollWidget_ + }) + , bButtonPressed_(false) +{ + fontIdArial_ = deps.fontManager.getFont("rom://Arial.font64"); + + const rdpq_fontstyle_t arialWhite = { + .color = RGBA32(0xFF, 0xFF, 0xFF, 0xFF), + .outline_color = RGBA32(0, 0, 0, 0xFF) + }; + + deps.fontManager.registerFontStyle(fontIdArial_, fontArialStyleWhiteId_, arialWhite); +} + +AboutScene::~AboutScene() +{ +} + +void AboutScene::init() +{ + logoLibDragon_ = sprite_load("rom://logo-libdragon.sprite"); + logoBulbagarden_ = sprite_load("rom://logo-bulbagarden.sprite"); + logoRetroGameMechanicsExplained_ = sprite_load("rom://logo-retrogamemechanicsexplained.sprite"); + logoDataCrystal_ = sprite_load("rom://logo-datacrystal.sprite"); + logoPKHEX_ = sprite_load("rom://logo-pkhex.sprite"); + logoGBDevIO_ = sprite_load("rom://logo-gbdevio.sprite"); + logoNESDevWiki_ = sprite_load("rom://logo-nesdevwiki.sprite"); + scrollWidget_.setBounds(scrollWidgetBounds); + scrollWidget_.setStyle(scrollWidgetStyle); + + const TextWidgetStyle headerTextStyle = { + .renderSettingsNotFocused = { + .fontId = fontIdArial_, + .fontStyleId = fontArialStyleWhiteId_, + .halign = ALIGN_CENTER + } + // ,.backgroundColor_ = 0xF801 + }; + + const TextWidgetStyle commonLeftAlignedTextStyle = { + .renderSettingsNotFocused = { + .fontId = fontIdArial_, + .fontStyleId = fontArialStyleWhiteId_, + .halign = ALIGN_LEFT + } + }; + const TextWidgetStyle commonCenterAlignedTextStyle = { + .renderSettingsNotFocused = { + .fontId = fontIdArial_, + .fontStyleId = fontArialStyleWhiteId_, + .halign = ALIGN_CENTER + } + }; + + headerText_.setBounds(headerTextBounds); + headerText_.setStyle(headerTextStyle); + headerText_.setData(headerTextString); + scrollWidget_.addWidget(&headerText_); + + const ImageWidgetStyle imgDragonStyle = { + .image = { + .sprite = logoLibDragon_, + .spriteBounds = Rectangle{0, 0, imgDragonBounds.width, imgDragonBounds.height} + } + }; + + imgDragonWidget_.setBounds(imgDragonBounds); + imgDragonWidget_.setStyle(imgDragonStyle); + scrollWidget_.addWidget(&imgDragonWidget_); + + const ImageWidgetStyle imgBulbaStyle = { + .image = { + .sprite = logoBulbagarden_, + .spriteBounds = Rectangle{0, 0, imgBulbagardenBounds.width, imgBulbagardenBounds.height} + } + }; + + imgBulbagardenWidget_.setBounds(imgBulbagardenBounds); + imgBulbagardenWidget_.setStyle(imgBulbaStyle); + scrollWidget_.addWidget(&imgBulbagardenWidget_); + + + const ImageWidgetStyle imgRetroGameMechanicsExplainedStyle = { + .image = { + .sprite = logoRetroGameMechanicsExplained_, + .spriteBounds = Rectangle{0, 0, imgRetroGameMechanicsExplainedBounds.width, imgRetroGameMechanicsExplainedBounds.height} + } + }; + + imgRetroGameMechanicsExplained_.setBounds(imgRetroGameMechanicsExplainedBounds); + imgRetroGameMechanicsExplained_.setStyle(imgRetroGameMechanicsExplainedStyle); + scrollWidget_.addWidget(&imgRetroGameMechanicsExplained_); + + const ImageWidgetStyle imgDataCrystalStyle = { + .image = { + .sprite = logoDataCrystal_, + .spriteBounds = Rectangle{0, 0, imgDataCrystalBounds.width, imgDataCrystalBounds.height} + } + }; + + imgDataCrystal_.setBounds(imgDataCrystalBounds); + imgDataCrystal_.setStyle(imgDataCrystalStyle); + scrollWidget_.addWidget(&imgDataCrystal_); + + dataCrystalText_.setBounds(dataCrystalTextBounds); + dataCrystalText_.setStyle(commonLeftAlignedTextStyle); + dataCrystalText_.setData("Datacrystal"); + scrollWidget_.addWidget(&dataCrystalText_); + + const ImageWidgetStyle imgPKHEXStyle = { + .image = { + .sprite = logoPKHEX_, + .spriteBounds = Rectangle{0, 0, imgPKHEXBounds.width, imgPKHEXBounds.height} + } + }; + + imgPKHEX_.setBounds(imgPKHEXBounds); + imgPKHEX_.setStyle(imgPKHEXStyle); + scrollWidget_.addWidget(&imgPKHEX_); + + PKHEXText_.setBounds(PKHEXTextBounds); + PKHEXText_.setStyle(commonLeftAlignedTextStyle); + PKHEXText_.setData("PKHeX"); + scrollWidget_.addWidget(&PKHEXText_); + + pretPokeCrystalText_.setBounds(pretPokeCrystalTextBounds); + pretPokeCrystalText_.setStyle(commonLeftAlignedTextStyle); + pretPokeCrystalText_.setData("github.com/pret/pokecrystal"); + scrollWidget_.addWidget(&pretPokeCrystalText_); + + const ImageWidgetStyle imgGBDevIOStyle = { + .image = { + .sprite = logoGBDevIO_, + .spriteBounds = Rectangle{0, 0, imgGBDevIoBounds.width, imgGBDevIoBounds.height} + } + }; + + imgGBDevIO_.setBounds(imgGBDevIoBounds); + imgGBDevIO_.setStyle(imgGBDevIOStyle); + scrollWidget_.addWidget(&imgGBDevIO_); + + gbDevIOText_.setBounds(gbDevIOTextBounds); + gbDevIOText_.setStyle(commonLeftAlignedTextStyle); + gbDevIOText_.setData("gbdev.io"); + scrollWidget_.addWidget(&gbDevIOText_); + + const ImageWidgetStyle imgNESDevWikiStyle = { + .image = { + .sprite = logoNESDevWiki_, + .spriteBounds = Rectangle{0, 0, imgNESDevWikiBounds.width, imgNESDevWikiBounds.height} + } + }; + + imgNESDevWiki_.setBounds(imgNESDevWikiBounds); + imgNESDevWiki_.setStyle(imgNESDevWikiStyle); + scrollWidget_.addWidget(&imgNESDevWiki_); + + otherCreditsText_.setBounds(otherCreditsTextBounds); + otherCreditsText_.setStyle(commonCenterAlignedTextStyle); + otherCreditsText_.setData(otherCreditsString); + scrollWidget_.addWidget(&otherCreditsText_); + + setFocusChain(&scrollFocusSegment_); +} + +void AboutScene::destroy() +{ + sprite_free(logoLibDragon_); + logoLibDragon_ = nullptr; + sprite_free(logoBulbagarden_); + logoBulbagarden_ = nullptr; + sprite_free(logoRetroGameMechanicsExplained_); + logoRetroGameMechanicsExplained_ = nullptr; + sprite_free(logoDataCrystal_); + logoDataCrystal_ = nullptr; + sprite_free(logoPKHEX_); + logoPKHEX_ = nullptr; + sprite_free(logoGBDevIO_); + logoGBDevIO_ = nullptr; + sprite_free(logoNESDevWiki_); + logoNESDevWiki_ = nullptr; +} + +bool AboutScene::handleUserInput(joypad_port_t port, const joypad_inputs_t& inputs) +{ + if(AbstractUIScene::handleUserInput(port, inputs)) + { + return true; + } + + if(inputs.btn.b && !bButtonPressed_) + { + bButtonPressed_ = true; + return true; + } + else if(!inputs.btn.b && bButtonPressed_) + { + deps_.sceneManager.goBackToPreviousScene(); + return true; + } + return false; +} + +void AboutScene::render(RDPQGraphics& gfx, const Rectangle& sceneBounds) +{ + scrollWidget_.render(gfx, sceneBounds); +} \ No newline at end of file diff --git a/src/scenes/MenuScene.cpp b/src/scenes/MenuScene.cpp index 96afdc0..fcee981 100755 --- a/src/scenes/MenuScene.cpp +++ b/src/scenes/MenuScene.cpp @@ -90,13 +90,13 @@ bool MenuScene::handleUserInput(joypad_port_t port, const joypad_inputs_t& input return true; } - if(inputs.btn.b) + if(inputs.btn.b && !bButtonPressed_) { // we will only handle b button release. bButtonPressed_ = true; return true; } - else if(bButtonPressed_) + else if(!inputs.btn.b && bButtonPressed_) { // b button release occurred. Switch back to previous scene. bButtonPressed_ = false; diff --git a/src/scenes/SceneManager.cpp b/src/scenes/SceneManager.cpp index b87a96b..25dea55 100755 --- a/src/scenes/SceneManager.cpp +++ b/src/scenes/SceneManager.cpp @@ -1,6 +1,7 @@ #include "scenes/SceneManager.h" #include "scenes/TestScene.h" #include "scenes/StatsScene.h" +#include "scenes/AboutScene.h" #include "scenes/InitTransferPakScene.h" #include "scenes/DistributionPokemonListScene.h" @@ -135,6 +136,9 @@ void SceneManager::loadScene() case SceneType::TEST: scene_ = new TestScene(sceneDeps_, newSceneContext_); break; + case SceneType::ABOUT: + scene_ = new AboutScene(sceneDeps_, newSceneContext_); + break; default: break; } diff --git a/src/scenes/TestScene.cpp b/src/scenes/TestScene.cpp index 0b1fd9e..82cb81c 100755 --- a/src/scenes/TestScene.cpp +++ b/src/scenes/TestScene.cpp @@ -62,14 +62,12 @@ void TestScene::init() const Dimensions pokeballDimensions = {.width = pokeballSprite_->width, .height = pokeballSprite_->height}; TextWidgetStyle type1Style = { - .size = {textDimensions.width, textDimensions.height}, .renderSettingsNotFocused = { .fontId = fontId } }; ImageWidgetStyle type2Style = { - .size = oakDimensions, .image = { .sprite = oakSprite_, .spriteBounds = {0, 0, oakDimensions.width, oakDimensions.height} @@ -77,7 +75,6 @@ void TestScene::init() }; ImageWidgetStyle type3Style = { - .size = pokeballDimensions, .image = { .sprite = pokeballSprite_, .spriteBounds = {0, 0, pokeballDimensions.width, pokeballDimensions.height} diff --git a/src/widget/ImageWidget.cpp b/src/widget/ImageWidget.cpp index 27507a9..7c07dcc 100644 --- a/src/widget/ImageWidget.cpp +++ b/src/widget/ImageWidget.cpp @@ -57,7 +57,10 @@ void ImageWidget::setBounds(const Rectangle& bounds) Dimensions ImageWidget::getSize() const { - return style_.size; + return Dimensions{ + .width = bounds_.width, + .height = bounds_.height + }; } void ImageWidget::setConfirmAction(void (*onConfirmAction)(void*), void* context) diff --git a/src/widget/TextWidget.cpp b/src/widget/TextWidget.cpp index 5e7b135..d4724e6 100644 --- a/src/widget/TextWidget.cpp +++ b/src/widget/TextWidget.cpp @@ -105,5 +105,11 @@ void TextWidget::render(RDPQGraphics& gfx, const Rectangle& parentBounds) TextRenderSettings& renderSettings = (focused_) ? style_.renderSettingsFocused : style_.renderSettingsNotFocused; const Rectangle absoluteBounds = addOffset(bounds_, parentBounds); + + if((style_.backgroundColor_ & 0x1)) + { + gfx.fillRectangle(absoluteBounds, color_from_packed16(style_.backgroundColor_)); + } + gfx.drawText(absoluteBounds, text_, renderSettings); } \ No newline at end of file