From 1fa8b6f4e4e29dcdafbbc9f4ed9a7f4efd958197 Mon Sep 17 00:00:00 2001 From: MrHuu Date: Thu, 28 Nov 2019 00:19:00 +0100 Subject: [PATCH] [3DS] Initial port --- 3rdParty/StormLib/src/FileStream.cpp | 22 +-- 3rdParty/StormLib/src/StormPort.h | 26 ++- Packaging/ctr/audio_silent.wav | Bin 0 -> 2212 bytes Packaging/ctr/banner.png | Bin 0 -> 20433 bytes Packaging/ctr/banner_hellfire.png | Bin 0 -> 28599 bytes Packaging/ctr/hb_logo.bin | Bin 0 -> 8192 bytes Packaging/ctr/icon.png | Bin 0 -> 968 bytes Packaging/ctr/icon_hellfire.png | Bin 0 -> 4693 bytes Packaging/ctr/template.rsf | 219 ++++++++++++++++++++++++ Packaging/ctr/template_hellfire.rsf | 219 ++++++++++++++++++++++++ Source/nthread.cpp | 4 + SourceS/config.h | 4 + SourceS/sdl2_to_1_2_backports.h | 9 + SourceX/DiabloUI/selhero.cpp | 6 + SourceX/DiabloUI/ttf_render_wrapped.cpp | 11 ++ SourceX/display.cpp | 4 + SourceX/dx.cpp | 3 +- SourceX/main.cpp | 6 + 18 files changed, 519 insertions(+), 14 deletions(-) create mode 100644 Packaging/ctr/audio_silent.wav create mode 100644 Packaging/ctr/banner.png create mode 100644 Packaging/ctr/banner_hellfire.png create mode 100644 Packaging/ctr/hb_logo.bin create mode 100644 Packaging/ctr/icon.png create mode 100644 Packaging/ctr/icon_hellfire.png create mode 100644 Packaging/ctr/template.rsf create mode 100644 Packaging/ctr/template_hellfire.rsf create mode 100644 SourceS/config.h diff --git a/3rdParty/StormLib/src/FileStream.cpp b/3rdParty/StormLib/src/FileStream.cpp index 08a5ac80f..0dc7db051 100644 --- a/3rdParty/StormLib/src/FileStream.cpp +++ b/3rdParty/StormLib/src/FileStream.cpp @@ -91,7 +91,7 @@ static bool BaseFile_Create(TFileStream * pStream) } #endif -#if defined(PLATFORM_MAC) || defined(PLATFORM_LINUX) || defined(PLATFORM_HAIKU) || defined(PLATFORM_AMIGA) || defined(PLATFORM_SWITCH) +#if defined(PLATFORM_MAC) || defined(PLATFORM_LINUX) || defined(PLATFORM_HAIKU) || defined(PLATFORM_AMIGA) || defined(PLATFORM_SWITCH) || defined(PLATFORM_CTR) { intptr_t handle; @@ -141,7 +141,7 @@ static bool BaseFile_Open(TFileStream * pStream, const TCHAR * szFileName, DWORD } #endif -#if defined(PLATFORM_MAC) || defined(PLATFORM_LINUX) || defined(PLATFORM_HAIKU) || defined(PLATFORM_AMIGA) || defined(PLATFORM_SWITCH) +#if defined(PLATFORM_MAC) || defined(PLATFORM_LINUX) || defined(PLATFORM_HAIKU) || defined(PLATFORM_AMIGA) || defined(PLATFORM_SWITCH) || defined(PLATFORM_CTR) { struct stat64 fileinfo; int oflag = (dwStreamFlags & STREAM_FLAG_READ_ONLY) ? O_RDONLY : O_RDWR; @@ -212,7 +212,7 @@ static bool BaseFile_Read( } #endif -#if defined(PLATFORM_MAC) || defined(PLATFORM_LINUX) || defined(PLATFORM_HAIKU) || defined(PLATFORM_AMIGA) || defined(PLATFORM_SWITCH) +#if defined(PLATFORM_MAC) || defined(PLATFORM_LINUX) || defined(PLATFORM_HAIKU) || defined(PLATFORM_AMIGA) || defined(PLATFORM_SWITCH) || defined(PLATFORM_CTR) { ssize_t bytes_read; @@ -283,7 +283,7 @@ static bool BaseFile_Write(TFileStream * pStream, ULONGLONG * pByteOffset, const } #endif -#if defined(PLATFORM_MAC) || defined(PLATFORM_LINUX) || defined(PLATFORM_HAIKU) || defined(PLATFORM_AMIGA) || defined(PLATFORM_SWITCH) +#if defined(PLATFORM_MAC) || defined(PLATFORM_LINUX) || defined(PLATFORM_HAIKU) || defined(PLATFORM_AMIGA) || defined(PLATFORM_SWITCH) || defined(PLATFORM_CTR) { ssize_t bytes_written; @@ -350,7 +350,7 @@ static bool BaseFile_Resize(TFileStream * pStream, ULONGLONG NewFileSize) } #endif -#if defined(PLATFORM_MAC) || defined(PLATFORM_LINUX) || defined(PLATFORM_HAIKU) || defined(PLATFORM_AMIGA) || defined(PLATFORM_SWITCH) +#if defined(PLATFORM_MAC) || defined(PLATFORM_LINUX) || defined(PLATFORM_HAIKU) || defined(PLATFORM_AMIGA) || defined(PLATFORM_SWITCH) || defined(PLATFORM_CTR) { if(ftruncate64((intptr_t)pStream->Base.File.hFile, (off64_t)NewFileSize) == -1) { @@ -394,7 +394,7 @@ static bool BaseFile_Replace(TFileStream * pStream, TFileStream * pNewStream) return (bool)MoveFile(pNewStream->szFileName, pStream->szFileName); #endif -#if defined(PLATFORM_MAC) || defined(PLATFORM_LINUX) || defined(PLATFORM_HAIKU) || defined(PLATFORM_AMIGA) || defined(PLATFORM_SWITCH) +#if defined(PLATFORM_MAC) || defined(PLATFORM_LINUX) || defined(PLATFORM_HAIKU) || defined(PLATFORM_AMIGA) || defined(PLATFORM_SWITCH) || defined(PLATFORM_CTR) // "rename" on Linux also works if the target file exists if(rename(pNewStream->szFileName, pStream->szFileName) == -1) { @@ -414,7 +414,7 @@ static void BaseFile_Close(TFileStream * pStream) CloseHandle(pStream->Base.File.hFile); #endif -#if defined(PLATFORM_MAC) || defined(PLATFORM_LINUX) || defined(PLATFORM_HAIKU) || defined(PLATFORM_AMIGA) || defined(PLATFORM_SWITCH) +#if defined(PLATFORM_MAC) || defined(PLATFORM_LINUX) || defined(PLATFORM_HAIKU) || defined(PLATFORM_AMIGA) || defined(PLATFORM_SWITCH) || defined(PLATFORM_CTR) close((intptr_t)pStream->Base.File.hFile); #endif } @@ -493,7 +493,7 @@ static bool BaseMap_Open(TFileStream * pStream, const TCHAR * szFileName, DWORD return false; #endif -#if defined(PLATFORM_MAC) || defined(PLATFORM_LINUX) || defined(PLATFORM_HAIKU) || defined(PLATFORM_AMIGA) || defined(PLATFORM_SWITCH) +#if defined(PLATFORM_MAC) || defined(PLATFORM_LINUX) || defined(PLATFORM_HAIKU) || defined(PLATFORM_AMIGA) || defined(PLATFORM_SWITCH) || defined(PLATFORM_CTR) struct stat64 fileinfo; intptr_t handle; bool bResult = false; @@ -506,7 +506,7 @@ static bool BaseMap_Open(TFileStream * pStream, const TCHAR * szFileName, DWORD if(fstat64(handle, &fileinfo) != -1) { #if !defined(PLATFORM_AMIGA) -#if defined(PLATFORM_SWITCH) +#if defined(PLATFORM_SWITCH) || defined(PLATFORM_CTR) pStream->Base.Map.pbFile = (LPBYTE)malloc((size_t)fileinfo.st_size); #else pStream->Base.Map.pbFile = (LPBYTE)mmap(NULL, (size_t)fileinfo.st_size, PROT_READ, MAP_PRIVATE, handle, 0); @@ -568,11 +568,11 @@ static void BaseMap_Close(TFileStream * pStream) UnmapViewOfFile(pStream->Base.Map.pbFile); #endif -#if (defined(PLATFORM_MAC) || defined(PLATFORM_LINUX) || defined(PLATFORM_HAIKU)) && !defined(PLATFORM_AMIGA) && !defined(PLATFORM_SWITCH) +#if (defined(PLATFORM_MAC) || defined(PLATFORM_LINUX) || defined(PLATFORM_HAIKU)) && !defined(PLATFORM_AMIGA) && !defined(PLATFORM_SWITCH) && !defined(PLATFORM_CTR) //Todo(Amiga): Fix a proper solution for this if(pStream->Base.Map.pbFile != NULL) munmap(pStream->Base.Map.pbFile, (size_t )pStream->Base.Map.FileSize); -#elif defined(PLATFORM_SWITCH) +#elif defined(PLATFORM_SWITCH) || defined(PLATFORM_CTR) if(pStream->Base.Map.pbFile != NULL) free(pStream->Base.Map.pbFile); #endif diff --git a/3rdParty/StormLib/src/StormPort.h b/3rdParty/StormLib/src/StormPort.h index 681ba7584..771426040 100644 --- a/3rdParty/StormLib/src/StormPort.h +++ b/3rdParty/StormLib/src/StormPort.h @@ -174,6 +174,28 @@ #define PLATFORM_DEFINED #endif + +#if !defined(PLATFORM_DEFINED) && defined(__3DS__) + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + + #define PLATFORM_LITTLE_ENDIAN + + #define PLATFORM_CTR + #define PLATFORM_DEFINED + +#endif + //----------------------------------------------------------------------------- // Assumption: we are not on Windows nor Macintosh, so this must be linux *grin* @@ -275,7 +297,7 @@ #endif // !PLATFORM_WINDOWS // 64-bit calls are supplied by "normal" calls on Mac -#if defined(PLATFORM_MAC) || defined(PLATFORM_HAIKU) || defined(PLATFORM_AMIGA) || defined(PLATFORM_SWITCH) +#if defined(PLATFORM_MAC) || defined(PLATFORM_HAIKU) || defined(PLATFORM_AMIGA) || defined(PLATFORM_SWITCH) || defined(PLATFORM_CTR) #define stat64 stat #define fstat64 fstat #define lseek64 lseek @@ -285,7 +307,7 @@ #endif // Platform-specific error codes for UNIX-based platforms -#if defined(PLATFORM_MAC) || defined(PLATFORM_LINUX) || defined(PLATFORM_HAIKU) || defined(PLATFORM_AMIGA) || defined(PLATFORM_SWITCH) +#if defined(PLATFORM_MAC) || defined(PLATFORM_LINUX) || defined(PLATFORM_HAIKU) || defined(PLATFORM_AMIGA) || defined(PLATFORM_SWITCH) || defined(PLATFORM_CTR) #define ERROR_SUCCESS 0 #define ERROR_FILE_NOT_FOUND ENOENT #define ERROR_ACCESS_DENIED EPERM diff --git a/Packaging/ctr/audio_silent.wav b/Packaging/ctr/audio_silent.wav new file mode 100644 index 0000000000000000000000000000000000000000..e0b684b62fea209617584c9533dfc2432b67ebfc GIT binary patch literal 2212 zcmZ9O!H&~F5JboJ*iLTw1bzhxR^rM5&MP5q-1fl7@CjV_IChiR&QPyw8wVn7Y|pf- zyQ``v`|-oW!;eELpWl9Z|MlC`n^P&JD}8zQvy{`XzSMFmUml+xzbhs`eYv%@jf%Rq zQbsMWjdz-!ioRPs6-C{2SGBhMjcctJJ~3Q3tq+RZTGi94wLxp_IRXrjL8{tY6gdd5 zi~F@5gnriA^or%$x2Ud`i{3hD=OQqw+=NALqW;Av4_PxGHSosrnw=U}t<8Z(wN-Dd zLaN%?qR+(av{Ql&YG;*i@H-*yeP@sKeN#5NgVjmbt1^s=U9{8du2&CqIYcZB@G-vc zK?eVR%@ui{UEZTsSoR%jsL+CcRGNfvQN*kWo~aTXdLE_sB1VVuqUTxHy>oL)_8N6} zLTWMwC_tq49r_e~f$4t9t@OLQV1&bw-zYLW%lgKtm= z7t$HtMKhGKXJOM>(GVUEipIxAr8n2WyUw{+Vx_6itWUbjv*SfrbdA2&%-Zb8sGhF& zIpRup#qHfO`eU-F45jdXIvpl(?nO)-)xlX@&$^mzxPo2Jf!U*f&Lpdc6OwD66sU*4 z(H{p@v3M2g6elL93#*$l9>msjT*puuWOI`Kf*WgrHdd088#e7lYQoJ|p-nm;IGdR~ zSfJaZV$V@6b<($I4;R`O;F0zJxi&-TVRShvk_?Do^d`*p{e6Ju7_xYu3c51pYD-N@Izf7 xP>)gb%%cx}8$3Hc{Wx(^2etUk^#2K<@H@vY^Z8p?v)%(cdDWIac#166@ek+nz@z{G literal 0 HcmV?d00001 diff --git a/Packaging/ctr/banner.png b/Packaging/ctr/banner.png new file mode 100644 index 0000000000000000000000000000000000000000..d60cb241c3b75fa9f5b090fcdfccad0abc2e2f9d GIT binary patch literal 20433 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 P{T@I^Q%|Ex%_{tVVQ2z- literal 0 HcmV?d00001 diff --git a/Packaging/ctr/banner_hellfire.png b/Packaging/ctr/banner_hellfire.png new file mode 100644 index 0000000000000000000000000000000000000000..36769b2f4d0dcfa5d4eb4ecff6a054354a6bd8bb GIT binary patch literal 28599 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℞gc!)Uu>~PNPFZ$HD4| z?$5IQA0O@A@*8<*Sh)YJK(5*QS^hLI`@$1W+p>1Be%=3Gl5F4fgLvB|k1t>Ow7K@I zx?H_?b^dR_d;SQ9UAwLr3jIWEmi-UUT=?k2Jw0-N&b6L+UnRO{?n|NOEIYR@Kij)9dtpz45)mHGs-O6Vk>QXBe_JVJFZ^lYy9sr&D`Z34 zs$Niu?%um1dtoo^g}tyB_QGD+3wvSDfVFoC_QGEH{cz-r#)GFcCO^=Su)5NzrjbIm z`eJ96Ns~xTO{Cg}t6}*s?Y->35In78UsCV&p|OfCW-nRpg+DaRm_cHGs_iGPW1ZB~ zJ9@#|;qWG2QJsEL*zq|>SOnF#{H490`eRSH5TqfNAN-)^e zdGMznsvpeO-QQG;r;^-nPV<$HAGGFkf?o=WVfRwFCYEa7Hx|)VoorxQp z+n#(r|Mn-g`CE5)u7lFdKXY+*=|Phs26}BaZwu)!NVPl9<`v!f<2RHU-cxIO(BbL- zx%i|hA9m`)6w5+)f1QD%goCt)%hvZVdA2uP@wzwvRHmGM*o@7`?3eVOTd{@F{wN@D zRD)P5l}gy#`->|Ed~0h#MWb`3@}t2D;&|R+wrdwQY%kvS&=CFOneY4s?tYzf=3F+k zdF$#HKU~^ZgN-|))la_Skl0-~?f`qq5%b*t*>{GuAc<|KLd)%HZK9GJC1q=}xYX-4 z+@vNuCB=?hg>@s7xc!0db-nrAp-=ZweLd@UL?bgBvP`d+q3Bb8w#KsmlMFx)*V^{+ zlDgd=p_~RMt*O^S63S_PDB@UN(JwA2)bV?A_`V_#u#=i}w#0+a`B*#Z<0{sf$+}Z7 zc~Fy)8{O-QXDYl?RnDwuN1?5 zYl^+*k>}?>oue>b{AV@m=Jy{n_3*iwenz^h6bB+0&f}G1bgW6#4UL{6;Xzi_NGCmR zeYR&yZ>o6E(`yM|r^Mm@&6^K==7_0L({NvztvyA~sszvZb!A2>5rJ)}ISzisAeH!r zNZH-%Bz@QVk&)709Rt|bKl;SI_ZK*#&EOrai3Ou#EKie&BN7^d zk&qpEpTgkyXuuRJ`xG{XbjMJw3ne2Amn%$i)3m$Rh4}IP0F%S!Yv#^r{@a67p;I5N z9Q%mKzf8#o`#uEG?#>nF?c&HyTimMN1`E)9XfujVOMJxYW1)Oe;^3DpB0+nhgmhomMsf|FIW zXDkj;*~!1I^KM|=k&u-1I=YC5z>i7#ImidkGS;Pf)9nO=zgT+^%OQ6_yK5O3;=f87pkpMl{

b3^a(K8X4@gp(SaNPH0NTW}qn8%3eQ?J;`Vx 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 D6|7Yq literal 0 HcmV?d00001 diff --git a/Packaging/ctr/icon.png b/Packaging/ctr/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..558d3c47a042d92bdf4a3fa72d33dd080c9b3e16 GIT binary patch literal 968 zcmV;(12_DMP)P)t-sQ2+n{ z0000001*)p92^`oGc!U$LRD2&UteEl003rYW`Fi+-$|NsA|H%F!b0004WQchCDsc+@;P;u|P^vDD||eyc%5QrT1i)sjT&?f!T?LYuz5 z0h`0*{RKyqC1!!3$=hDbN*IH{$k_{-?EsLZ%PbukG-BF}DK<@r8BDkqY?5lfu z1KvqP-kKZxdRZq88(U6=v(vuYD#b`Tw7|*n4NTGjBEm?zz7HO)$X7Y$}21Fvp>eiY$?eH@g zNizUI6bTm~VLCMD0<*ng-i&nUR!S+FL_#r6O+02PHEi&24M zh>f<-mft``)AD_NMM{Yh1g1eg0|H|^0lVdL{t6eMv^h=XA6C)@2;l0($sxWqA(D#f zH6>9Wa}GyIDHV+(HoYYgk)#UX)vfn1HqN$c%i!?T%nOOr2Xg-nEaUJ9*wcbS}76kw_Z$|ba5qfdI$~)|;C`orkTM$vb z`k#U4^KsvIbeF11j76{hSK#@4?10Tq4i(pgS98Mc6YvZYM9}7%V{AH*5Jg0CIs*Ix zs+25%kGY2T)yzaBiRQn6r{qoGq|Z6$nxhxVIpWU<&s&73lSYm{*6LKv1xao{fN0j@UA5d1an46aW=YP)e!{&c>sY-EAh2uE@0000jL}QGK5=-og z@&6bjiHRB;8l#@S&-Kl$VMNgUKWm*e!+Y=Ed&)lhoO>T;X8-4pTrRKXEK@C1%hiiN zcC5-;)n09_KBAJVQgt$&{C`%)%F3$#M-Hg~C3erP^BF;r2_G^*DN_dE*s@x+fBBUg6twX&xCPpYv2L(6%*GNP2-M5*Ry_epE2 z@SEbQRHYGBs*tTr@t0PiZT!y+uvQMiWcj7tb98j9%1|-A4uuZPsa}JQep-zHgUwK= z?)&Cvhz-!HXo60`2At<>3WdUh4cJ_{3T2s@QDn_pgeaWi$bPK%9hx?@_+2YkJ;9$9 z-@&R}HA!o&buz(zy+#(YSKG1hO-NYXdITj`mo~pfrfCzRQqdOq=d=-m=gx}ja!o%w znUW4*d?92Uq>+W3)CzUmk4dDiKA&4Yo?5XY`B-AGT5WD(oXXxx@e;-*n2zgGs}3#2 zqK_bnl`6Ami%XA`>ihBV{KG1hX*&$CwN@V$*R9p-gX%XV;E7&ARzNr()YAQOKX@?A z$;$f8W+?w0gM%$(gs?iAJd@I`R&5HcTkjXU`gXPS*L8B`s-#MlC>`VefaF5F%&kbH z&;*qjZ>6>kg!l97*AYr?vNk6dg?b<793uN@5a4%6GT<^~Y=sJBD_3%qT*~)8JTn8z z@nAN<4G9SY)F#-?o`xiw2W6cs6^rF@7?45(I}^Wc8D2H46~m!HFH|G}WPb?bBXcQM?vv~4i7R-M%(F%>`v16nSN|z|WGm_eoy+TKfB_(K9Sl5jD&`n;FT{(y}@t zdv9r-y5ioY+BL`zN!_YmL)vdLZoM?0e*<$yLtOa=DAb*&*Q`xnRgDjB3I~)pTN{i*1D8Z5nrvL)iR0`D~X}%DhT=jG-lANiOYeF7wy z1sl~A1qlg#%-|F&l^qD-(98x6sIx*rD=>%gIM5r#!f>5Txk0as)N5rzC(p8K!5Hpo z^agR2WDKSNR^4I13rxIM3NJ6vyJv4|hpMYL;FysT{OmkP9~h7Zc57efv)5b*jn}i0 zD9Bx7G5xWQ5)TJ^tHE2C%e350fT&ke^v9Rb^AwN<iSzY}Oq3Sl@_qtGgIw~LDl6M&>?=~tfPrOqqVBEYl_w-?0QwFf9FG6>4eI$(Q zfN>n9;kD~fCThrXz#>N?0d`0X=49pfNyf7BSyCQ7=5`u71R{|OCFO5Gx?(r0RnY;|>E+=?ZCbYx63`-m>@~I&kH+dZD996Hw*v;MPhNQbPb_u|)ioM)8|dpw zQT=Txag>IV62S38v=q_aom}jlC;&x?4WDn6+&3lVbENvhNnC)r#=zh_ZuaOFMn{f>(Srv~AU>3zzlIJUK1^G;Y^8Q>+L4z`LFXjeJB+3; zhj(GXXosdQbo8hrUA^i=$BqTk!Gj%X&z?xyzdx3~|9&ZL*sz8M4ID&XDy=Z$8!2Kd zCAPYXYr{bt&N8t}6XFa<`XLGoS8lc6dsx7n5A0t^OYKDW?>B=Iqv_<$o;^o53JdAXnKN+45z5QUqrH3g(xF3# zC@C?C0?-d-NbJTrwi7sah2pJR2GFc5FFJDAmQI{-rro=gG(OFdygi*s$2GvHKYOQu zMRpIM-+t>rKi;|o1+ClPM)7g&b@gXh^*VqUiJjEOOWS(t-u4bo}^ndi>-G zy?Xsd$ltGC3nTXJ+ehQakEiVHY)Vg0r#@fyL7QBM^0;9G{QSX8{rZN}k3Tko^U^Wq zl+YnRe-GWf8ADsQ4x%odyYL37h--o=bS!N&Hc!r>a9%{KyqEYqh?7vlr`0(e}C0sA&;n}=u4j1r5p z#V1aj5Q`o-a6mwYzt^o>SHgqINy&ypWBIc8mje3?nTLNq65;1X_w3n2vu4dQjGH@m zE|krsxZ!aO2Qk*u-IJCqSpx5070R;_C-d_Sin9?{uU@0Czdj^j7&9z}3*l{1%`r*y z?p=fE(WCXk0JeJj_U*J{#R~DAm6b)qqK8r6K7C6Vz}I+j7!U0Bqp4G;(y3FY=+WaR z@Z?3q;`*qu;y+xtAaa4>z|RjIGL)M8G#7@@22#q{ z6pD?F74sw~C)1rfzfjSyztWa1TZE^_j2R;gH+CFLpnsqkBf4hpI8WvK8tPw^qv=T-okY^*$60qwO z(TO^QcM!ivju=VbefOP#=@?>dzGx#NW2`(=uwf3lI>t<^(yqIEH&6`BS&?J#EK9d8 z-4M1>g1^}-3l}UD%G%r5mr#V2U}cQ2v4pk`rKL-kQbIz4Fv|44yNf$H+dGTjY~cR= z`)Tv$&4S^)8++6D1t?L`|QbPj&_b4@7`@E4Cocv ztHc6v!=n(^c4E@hlvJ^ZK758s>EKL*qXrA_gtrSP-=@Cg;pRbJjlB@Tt^&vX`}G%f zLqCQw&(Foj$BP``JYrg9&vT*lZsHBtrciOQT;w9x43Tdd8-WmBE2LEjC-QPLom#gz zFK@4?lsu_^5$-Sx3cTt1^#oeGb}a=41is@zmM)#T&}k(8lc!JV{118H>}bFykS<+v z$Jmjyal=O8H74I3tuW245WrPJfbPQn0&vVJ{w zU|L!lxjDNrgmU;aE;c78M|hd(2@w$)#AHjL`Rx9 zaiU;~Goa2BCr*M4(&&#rnge>f$luqW{F?h2Fg#_-6q+_|8cmomff5rFDSBu$IodiJ z7>%RC5MnYYDry5~EE9SeqK7?rWB115+!Yl$luwmqUj%>gjKjZR!F-`i?%G^ff06F| z@(XR+xQYB*_?J+g6L$z&ZEl4ff$b4-BPgh4kf;T$VJ zLfg#4-8ui%+$(_Ve|lo;`XBIB{pl?d?EpWVA-cwe)K#oWKcb zr?V5$<0NNV=45n2ORY~_me%M#$DnoQLj&HawP@CYMkkLJb;rfQg=S}^i~O89b0#(M zXd8X!B$W%8A9Ph(kK>M64_2|)v1UF{7 zwBCZJa)Kf2j8|2d-U6m|&D$Hy>Dp`@VcnzhA7|C;`w7ZL(i;#9k$~l2GrCdq?nr_#VzCyv5{v_yT(k zFTj`E7xp$ME+;qV21gIL{1h@u-hJ=#4rJRz{yJt!VTz?xa z`nzPnv2UYLu{TmghX~>qc+>5aG((aM>3e-nI;v}opvvwNgf2?QHW#FGB|cE#S4&#t z6cY#cV_ZjC2e%f94DTnu|0Rb~8PLD4_E}P5te`l1o&68oF9C0}9IX^@cu{7JNmyv1 zw4dcOAU@c-cJ(Zxw_FsWG+QNQ+Py2QKnw*1r$wLBuUZYmQA(PWM|@0aZ>1=Pl56-d zIHG+-A;WO&n6V-kz(Q}da;>h+b0KFtb^j@o(?u>Azvg7Rg)!^knIdN^>o+h+a5%pj zazlh}+_)i%6en_XrJ7o>s901&_!vDNQ7r^Tb3S>X7b93_=V2#(JJ?1v|eMk5@$IiUr0hS+^_X0a4 z$YX0^p{FQr8kOdRQDi>s!)K)J+qM6i=?h*wX#B#jw9oeKp4UN-Ps(~jk9!u27cG8c zr?J~!)?7A9n~qtTEwBf1eE|o4#arKh`fn2zkZ=P~LGJ=4%gTB%JKJjwAdywxggv_T zC^UV4Z2Au%c3RtC(J5z}zUKX({*4B#(7UWKx;Q%aVGo!4DodvBRMvfd10%hsDEISU XYS_H#?UH(n00000NkvXXu0mjfA5r;T literal 0 HcmV?d00001 diff --git a/Packaging/ctr/template.rsf b/Packaging/ctr/template.rsf new file mode 100644 index 000000000..ff7acd029 --- /dev/null +++ b/Packaging/ctr/template.rsf @@ -0,0 +1,219 @@ +BasicInfo: + Title : DevilutionX + ProductCode : CTR-P-DIABLO + Logo : Nintendo # Nintendo / Licensed / Distributed / iQue / iQueForSystem + +RomFs: + # Specifies the root path of the read only file system to include in the ROM. + RootPath : build/romfs + +TitleInfo: + Category : Application + UniqueId : 0x3F395 + +Option: + UseOnSD : true # true if App is to be installed to SD + FreeProductCode : true # Removes limitations on ProductCode + MediaFootPadding : false # If true CCI files are created with padding + EnableCrypt : false # Enables encryption for NCCH and CIA + EnableCompress : true # Compresses where applicable (currently only exefs:/.code) + +AccessControlInfo: + CoreVersion : 2 + + # Exheader Format Version + DescVersion : 2 + + # Minimum Required Kernel Version (below is for 4.5.0) + ReleaseKernelMajor : "02" + ReleaseKernelMinor : "33" + + # ExtData + UseExtSaveData : false # enables ExtData + #ExtSaveDataId : 0x300 # only set this when the ID is different to the UniqueId + + # FS:USER Archive Access Permissions + # Uncomment as required + FileSystemAccess: + #- CategorySystemApplication + #- CategoryHardwareCheck + - CategoryFileSystemTool + #- Debug + #- TwlCardBackup + #- TwlNandData + #- Boss + - DirectSdmc + #- Core + #- CtrNandRo + #- CtrNandRw + #- CtrNandRoWrite + #- CategorySystemSettings + #- CardBoard + #- ExportImportIvs + #- DirectSdmcWrite + #- SwitchCleanup + #- SaveDataMove + #- Shop + #- Shell + #- CategoryHomeMenu + + # Process Settings + MemoryType : Application # Application/System/Base + SystemMode : 96MB # 64MB(Default)/96MB/80MB/72MB/32MB + IdealProcessor : 0 + AffinityMask : 1 + Priority : 16 + MaxCpu : 0x9E # Default + HandleTableSize : 0x200 + DisableDebug : false + EnableForceDebug : false + CanWriteSharedPage : true + CanUsePrivilegedPriority : false + CanUseNonAlphabetAndNumber : true + PermitMainFunctionArgument : true + CanShareDeviceMemory : true + RunnableOnSleep : false + SpecialMemoryArrange : true + + # New3DS Exclusive Process Settings + SystemModeExt : 124MB # Legacy(Default)/124MB/178MB Legacy:Use Old3DS SystemMode + CpuSpeed : 804MHz # 256MHz(Default)/804MHz + EnableL2Cache : true # false(default)/true + CanAccessCore2 : true + + # Virtual Address Mappings + IORegisterMapping: + - 1ff00000-1ff7ffff # DSP memory + MemoryMapping: + - 1f000000-1f5fffff:r # VRAM + + # Accessible SVCs, : + SystemCallAccess: + ArbitrateAddress: 34 + Backdoor: 123 + Break: 60 + CancelTimer: 28 + ClearEvent: 25 + ClearTimer: 29 + CloseHandle: 35 + ConnectToPort: 45 + ControlMemory: 1 + ControlProcessMemory: 112 + CreateAddressArbiter: 33 + CreateEvent: 23 + CreateMemoryBlock: 30 + CreateMutex: 19 + CreateSemaphore: 21 + CreateThread: 8 + CreateTimer: 26 + DuplicateHandle: 39 + ExitProcess: 3 + ExitThread: 9 + GetCurrentProcessorNumber: 17 + GetHandleInfo: 41 + GetProcessId: 53 + GetProcessIdOfThread: 54 + GetProcessIdealProcessor: 6 + GetProcessInfo: 43 + GetResourceLimit: 56 + GetResourceLimitCurrentValues: 58 + GetResourceLimitLimitValues: 57 + GetSystemInfo: 42 + GetSystemTick: 40 + GetThreadContext: 59 + GetThreadId: 55 + GetThreadIdealProcessor: 15 + GetThreadInfo: 44 + GetThreadPriority: 11 + MapMemoryBlock: 31 + OutputDebugString: 61 + QueryMemory: 2 + ReleaseMutex: 20 + ReleaseSemaphore: 22 + SendSyncRequest1: 46 + SendSyncRequest2: 47 + SendSyncRequest3: 48 + SendSyncRequest4: 49 + SendSyncRequest: 50 + SetThreadPriority: 12 + SetTimer: 27 + SignalEvent: 24 + SleepThread: 10 + UnmapMemoryBlock: 32 + WaitSynchronization1: 36 + WaitSynchronizationN: 37 + + # Service List + # Maximum 34 services (32 if firmware is prior to 9.6.0) + ServiceAccessControl: + - APT:U + - ac:u + - am:net + - boss:U + - cam:u + - cecd:u + - cfg:nor + - cfg:u + - csnd:SND + - dsp::DSP + - frd:u + - fs:USER + - gsp::Gpu + - hid:USER + - http:C + - ir:rst + - ir:u + - ir:USER + - mic:u + - ndm:u + - news:u + - nwm::UDS + - ptm:u + - pxi:dev + - soc:U + - ssl:C + - y2r:u + + +SystemControlInfo: + SaveDataSize: 0KB # Change if the app uses savedata + RemasterVersion: 2 + StackSize: 0x40000 + + # Modules that run services listed above should be included below + # Maximum 48 dependencies + # : + Dependency: + ac: 0x0004013000002402 + act: 0x0004013000003802 + am: 0x0004013000001502 + boss: 0x0004013000003402 + camera: 0x0004013000001602 + cecd: 0x0004013000002602 + cfg: 0x0004013000001702 + codec: 0x0004013000001802 + csnd: 0x0004013000002702 + dlp: 0x0004013000002802 + dsp: 0x0004013000001a02 + friends: 0x0004013000003202 + gpio: 0x0004013000001b02 + gsp: 0x0004013000001c02 + hid: 0x0004013000001d02 + http: 0x0004013000002902 + i2c: 0x0004013000001e02 + ir: 0x0004013000003302 + mcu: 0x0004013000001f02 + mic: 0x0004013000002002 + ndm: 0x0004013000002b02 + news: 0x0004013000003502 + nfc: 0x0004013000004002 + nim: 0x0004013000002c02 + nwm: 0x0004013000002d02 + pdn: 0x0004013000002102 + ps: 0x0004013000003102 + ptm: 0x0004013000002202 + qtm: 0x0004013020004202 + ro: 0x0004013000003702 + socket: 0x0004013000002e02 + spi: 0x0004013000002302 + ssl: 0x0004013000002f02 diff --git a/Packaging/ctr/template_hellfire.rsf b/Packaging/ctr/template_hellfire.rsf new file mode 100644 index 000000000..827bdae42 --- /dev/null +++ b/Packaging/ctr/template_hellfire.rsf @@ -0,0 +1,219 @@ +BasicInfo: + Title : DevilutionX + ProductCode : CTR-P-HELLFIRE + Logo : Nintendo # Nintendo / Licensed / Distributed / iQue / iQueForSystem + +RomFs: + # Specifies the root path of the read only file system to include in the ROM. + RootPath : build/romfs + +TitleInfo: + Category : Application + UniqueId : 0x3F396 + +Option: + UseOnSD : true # true if App is to be installed to SD + FreeProductCode : true # Removes limitations on ProductCode + MediaFootPadding : false # If true CCI files are created with padding + EnableCrypt : false # Enables encryption for NCCH and CIA + EnableCompress : true # Compresses where applicable (currently only exefs:/.code) + +AccessControlInfo: + CoreVersion : 2 + + # Exheader Format Version + DescVersion : 2 + + # Minimum Required Kernel Version (below is for 4.5.0) + ReleaseKernelMajor : "02" + ReleaseKernelMinor : "33" + + # ExtData + UseExtSaveData : false # enables ExtData + #ExtSaveDataId : 0x300 # only set this when the ID is different to the UniqueId + + # FS:USER Archive Access Permissions + # Uncomment as required + FileSystemAccess: + #- CategorySystemApplication + #- CategoryHardwareCheck + - CategoryFileSystemTool + #- Debug + #- TwlCardBackup + #- TwlNandData + #- Boss + - DirectSdmc + #- Core + #- CtrNandRo + #- CtrNandRw + #- CtrNandRoWrite + #- CategorySystemSettings + #- CardBoard + #- ExportImportIvs + #- DirectSdmcWrite + #- SwitchCleanup + #- SaveDataMove + #- Shop + #- Shell + #- CategoryHomeMenu + + # Process Settings + MemoryType : Application # Application/System/Base + SystemMode : 96MB # 64MB(Default)/96MB/80MB/72MB/32MB + IdealProcessor : 0 + AffinityMask : 1 + Priority : 16 + MaxCpu : 0x9E # Default + HandleTableSize : 0x200 + DisableDebug : false + EnableForceDebug : false + CanWriteSharedPage : true + CanUsePrivilegedPriority : false + CanUseNonAlphabetAndNumber : true + PermitMainFunctionArgument : true + CanShareDeviceMemory : true + RunnableOnSleep : false + SpecialMemoryArrange : true + + # New3DS Exclusive Process Settings + SystemModeExt : 124MB # Legacy(Default)/124MB/178MB Legacy:Use Old3DS SystemMode + CpuSpeed : 804MHz # 256MHz(Default)/804MHz + EnableL2Cache : true # false(default)/true + CanAccessCore2 : true + + # Virtual Address Mappings + IORegisterMapping: + - 1ff00000-1ff7ffff # DSP memory + MemoryMapping: + - 1f000000-1f5fffff:r # VRAM + + # Accessible SVCs, : + SystemCallAccess: + ArbitrateAddress: 34 + Backdoor: 123 + Break: 60 + CancelTimer: 28 + ClearEvent: 25 + ClearTimer: 29 + CloseHandle: 35 + ConnectToPort: 45 + ControlMemory: 1 + ControlProcessMemory: 112 + CreateAddressArbiter: 33 + CreateEvent: 23 + CreateMemoryBlock: 30 + CreateMutex: 19 + CreateSemaphore: 21 + CreateThread: 8 + CreateTimer: 26 + DuplicateHandle: 39 + ExitProcess: 3 + ExitThread: 9 + GetCurrentProcessorNumber: 17 + GetHandleInfo: 41 + GetProcessId: 53 + GetProcessIdOfThread: 54 + GetProcessIdealProcessor: 6 + GetProcessInfo: 43 + GetResourceLimit: 56 + GetResourceLimitCurrentValues: 58 + GetResourceLimitLimitValues: 57 + GetSystemInfo: 42 + GetSystemTick: 40 + GetThreadContext: 59 + GetThreadId: 55 + GetThreadIdealProcessor: 15 + GetThreadInfo: 44 + GetThreadPriority: 11 + MapMemoryBlock: 31 + OutputDebugString: 61 + QueryMemory: 2 + ReleaseMutex: 20 + ReleaseSemaphore: 22 + SendSyncRequest1: 46 + SendSyncRequest2: 47 + SendSyncRequest3: 48 + SendSyncRequest4: 49 + SendSyncRequest: 50 + SetThreadPriority: 12 + SetTimer: 27 + SignalEvent: 24 + SleepThread: 10 + UnmapMemoryBlock: 32 + WaitSynchronization1: 36 + WaitSynchronizationN: 37 + + # Service List + # Maximum 34 services (32 if firmware is prior to 9.6.0) + ServiceAccessControl: + - APT:U + - ac:u + - am:net + - boss:U + - cam:u + - cecd:u + - cfg:nor + - cfg:u + - csnd:SND + - dsp::DSP + - frd:u + - fs:USER + - gsp::Gpu + - hid:USER + - http:C + - ir:rst + - ir:u + - ir:USER + - mic:u + - ndm:u + - news:u + - nwm::UDS + - ptm:u + - pxi:dev + - soc:U + - ssl:C + - y2r:u + + +SystemControlInfo: + SaveDataSize: 0KB # Change if the app uses savedata + RemasterVersion: 2 + StackSize: 0x40000 + + # Modules that run services listed above should be included below + # Maximum 48 dependencies + # : + Dependency: + ac: 0x0004013000002402 + act: 0x0004013000003802 + am: 0x0004013000001502 + boss: 0x0004013000003402 + camera: 0x0004013000001602 + cecd: 0x0004013000002602 + cfg: 0x0004013000001702 + codec: 0x0004013000001802 + csnd: 0x0004013000002702 + dlp: 0x0004013000002802 + dsp: 0x0004013000001a02 + friends: 0x0004013000003202 + gpio: 0x0004013000001b02 + gsp: 0x0004013000001c02 + hid: 0x0004013000001d02 + http: 0x0004013000002902 + i2c: 0x0004013000001e02 + ir: 0x0004013000003302 + mcu: 0x0004013000001f02 + mic: 0x0004013000002002 + ndm: 0x0004013000002b02 + news: 0x0004013000003502 + nfc: 0x0004013000004002 + nim: 0x0004013000002c02 + nwm: 0x0004013000002d02 + pdn: 0x0004013000002102 + ps: 0x0004013000003102 + ptm: 0x0004013000002202 + qtm: 0x0004013020004202 + ro: 0x0004013000003702 + socket: 0x0004013000002e02 + spi: 0x0004013000002302 + ssl: 0x0004013000002f02 diff --git a/Source/nthread.cpp b/Source/nthread.cpp index 622f5a08a..90eb162d2 100644 --- a/Source/nthread.cpp +++ b/Source/nthread.cpp @@ -89,6 +89,9 @@ BOOL nthread_recv_turns(BOOL *pfSendAsync) last_tick += tick_delay; return TRUE; } +#ifdef __3DS__ + return FALSE; +#else if (!SNetReceiveTurns(0, MAX_PLRS, (char **)glpMsgTbl, gdwMsgLenTbl, (LPDWORD)player_state)) { if (SErrGetLastError() != STORM_ERROR_NO_MESSAGES_WAITING) nthread_terminate_game("SNetReceiveTurns"); @@ -107,6 +110,7 @@ BOOL nthread_recv_turns(BOOL *pfSendAsync) last_tick += tick_delay; return TRUE; } +#endif } static unsigned int nthread_handler(void *data) diff --git a/SourceS/config.h b/SourceS/config.h new file mode 100644 index 000000000..fc6486fac --- /dev/null +++ b/SourceS/config.h @@ -0,0 +1,4 @@ +#pragma once + +#define PROJECT_NAME "DevilutionX" +#define PROJECT_VERSION "ctr_v1" diff --git a/SourceS/sdl2_to_1_2_backports.h b/SourceS/sdl2_to_1_2_backports.h index fa2e8315f..3ad21b015 100644 --- a/SourceS/sdl2_to_1_2_backports.h +++ b/SourceS/sdl2_to_1_2_backports.h @@ -759,6 +759,10 @@ inline char *SDL_GetBasePath() } } #endif +#if defined(__3DS__) + retval = SDL_strdup("file:sdmc:/3ds/devilutionx/"); + return retval; +#endif /* is a Linux-style /proc filesystem available? */ if (!retval && (access("/proc", F_OK) == 0)) { @@ -825,6 +829,11 @@ inline char *SDL_GetPrefPath(const char *org, const char *app) char *ptr = NULL; size_t len = 0; +#if defined(__3DS__) + retval = SDL_strdup("sdmc:/3ds/devilutionx/"); + return retval; +#endif + if (!app) { SDL_InvalidParamError("app"); return NULL; diff --git a/SourceX/DiabloUI/selhero.cpp b/SourceX/DiabloUI/selhero.cpp index eb481feae..f1f044f18 100644 --- a/SourceX/DiabloUI/selhero.cpp +++ b/SourceX/DiabloUI/selhero.cpp @@ -13,6 +13,10 @@ #include "DiabloUI/selok.h" #include "DiabloUI/selgame.h" +#ifdef __3DS__ +#include "../platform/ctr/keyboard.h" +#endif + namespace dvl { const char *selhero_GenerateName(uint8_t hero_class); @@ -362,6 +366,8 @@ void selhero_ClassSelector_Select(int value) memset(selhero_heroInfo.name, '\0', sizeof(selhero_heroInfo.name)); #ifdef PREFILL_PLAYER_NAME strncpy(selhero_heroInfo.name, selhero_GenerateName(selhero_heroInfo.heroclass), sizeof(selhero_heroInfo.name) - 1); +#elif defined __3DS__ + ctr_vkbdInput("Enter Hero name..", selhero_GenerateName(selhero_heroInfo.heroclass), selhero_heroInfo.name); #endif selhero_FreeDlgItems(); SDL_Rect rect1 = { PANEL_LEFT + 264, (UI_OFFSET_Y + 211), 320, 33 }; diff --git a/SourceX/DiabloUI/ttf_render_wrapped.cpp b/SourceX/DiabloUI/ttf_render_wrapped.cpp index 8630ae97b..4fd84f5d4 100644 --- a/SourceX/DiabloUI/ttf_render_wrapped.cpp +++ b/SourceX/DiabloUI/ttf_render_wrapped.cpp @@ -1,6 +1,9 @@ #include "DiabloUI/ttf_render_wrapped.h" #include +#ifdef __3DS__ +#include +#endif namespace dvl { @@ -40,7 +43,11 @@ SDL_Surface *RenderUTF8_Solid_Wrapped(TTF_Font *font, const char *text, SDL_Colo int w, h; char *spot, *tok, *next_tok, *end; char delim; +#ifdef __3DS__ + size_t str_len = strlen(text); +#else size_t str_len = SDL_strlen(text); +#endif numLines = 0; @@ -50,7 +57,11 @@ SDL_Surface *RenderUTF8_Solid_Wrapped(TTF_Font *font, const char *text, SDL_Colo return NULL; } +#ifdef __3DS__ + memcpy(str, text, str_len + 1); +#else SDL_strlcpy(str, text, str_len + 1); +#endif tok = str; end = str + str_len; do { diff --git a/SourceX/display.cpp b/SourceX/display.cpp index 0292036b9..547bb56b5 100644 --- a/SourceX/display.cpp +++ b/SourceX/display.cpp @@ -116,7 +116,11 @@ void CalculatePreferdWindowSize(int &width, int &height, bool useIntegerScaling) bool SpawnWindow(const char *lpWindowName) { +#ifdef __3DS__ + if (SDL_Init(SDL_INIT_TIMER | SDL_INIT_VIDEO | SDL_INIT_JOYSTICK) <= -1) { +#else if (SDL_Init(SDL_INIT_EVERYTHING & ~SDL_INIT_HAPTIC) <= -1) { +#endif ErrSdl(); } diff --git a/SourceX/dx.cpp b/SourceX/dx.cpp index 3bd2004f0..4da175893 100644 --- a/SourceX/dx.cpp +++ b/SourceX/dx.cpp @@ -252,8 +252,9 @@ void LimitFrameRate() void RenderPresent() { SDL_Surface *surface = GetOutputSurface(); +#if !defined(__3DS__) assert(!SDL_MUSTLOCK(surface)); - +#endif if (!gbActive) { LimitFrameRate(); return; diff --git a/SourceX/main.cpp b/SourceX/main.cpp index d49005898..0b1e867dd 100644 --- a/SourceX/main.cpp +++ b/SourceX/main.cpp @@ -2,6 +2,9 @@ #ifdef __SWITCH__ #include "platform/switch/network.h" #endif +#ifdef __3DS__ +#include "platform/ctr/system.h" +#endif #ifdef RUN_TESTS #include #endif @@ -24,6 +27,9 @@ int main(int argc, char **argv) #ifdef __SWITCH__ switch_enable_network(); #endif +#ifdef __3DS__ + ctr_sys_init(); +#endif return dvl::DiabloMain(argc, argv); }