From 3e5c7c6400ecdb8acbec23dbeefc8a048e5916bb Mon Sep 17 00:00:00 2001 From: d0k3 Date: Mon, 19 Mar 2018 23:08:25 +0100 Subject: [PATCH] Fix a critical bug --- arm9/source/common/colors.h | 5 +- arm9/source/common/lottery.c | 54 +++++++++++++++++++++ arm9/source/common/lottery.h | 26 ++++++++++ arm9/source/common/ui.c | 4 +- arm9/source/godmode.c | 8 +-- data/lottery/bricked/bootrom_splash.pcx | Bin 0 -> 5470 bytes data/lottery/bricked/font_nbraille_4x6.pbm | Bin 0 -> 908 bytes data/lottery/c64/c64_splash.pcx | Bin 0 -> 9066 bytes data/lottery/c64/font_c64_8x8.pbm | Bin 0 -> 2086 bytes data/lottery/mirror/font_6x10_mr.pbm | Bin 0 -> 2006 bytes data/lottery/mirror/mirror_splash.pcx | Bin 0 -> 8708 bytes data/lottery/zuish/font_zuish_8x8.pbm | Bin 0 -> 2142 bytes data/lottery/zuish/zuish_splash.pcx | Bin 0 -> 5529 bytes 13 files changed, 91 insertions(+), 6 deletions(-) create mode 100644 arm9/source/common/lottery.c create mode 100644 arm9/source/common/lottery.h create mode 100644 data/lottery/bricked/bootrom_splash.pcx create mode 100644 data/lottery/bricked/font_nbraille_4x6.pbm create mode 100644 data/lottery/c64/c64_splash.pcx create mode 100644 data/lottery/c64/font_c64_8x8.pbm create mode 100644 data/lottery/mirror/font_6x10_mr.pbm create mode 100644 data/lottery/mirror/mirror_splash.pcx create mode 100644 data/lottery/zuish/font_zuish_8x8.pbm create mode 100644 data/lottery/zuish/zuish_splash.pcx diff --git a/arm9/source/common/colors.h b/arm9/source/common/colors.h index 993676a..6c6e2bc 100644 --- a/arm9/source/common/colors.h +++ b/arm9/source/common/colors.h @@ -1,5 +1,6 @@ #pragma once +#include "lottery.h" #define RGB(r,g,b) ((b)<<16|(g)<<8|(r)) @@ -31,8 +32,8 @@ #define COLOR_SUPERFUCHSIA RGB(0xFF, 0x00, 0xEF) // standard colors - used everywhere -#define COLOR_STD_BG COLOR_BLACK -#define COLOR_STD_FONT COLOR_WHITE +#define COLOR_STD_BG LOTTERY_COLOR_BG +#define COLOR_STD_FONT LOTTERY_COLOR_FONT // colors for GodMode9 file browser #define COLOR_SIDE_BAR COLOR_DARKGREY diff --git a/arm9/source/common/lottery.c b/arm9/source/common/lottery.c new file mode 100644 index 0000000..15437c8 --- /dev/null +++ b/arm9/source/common/lottery.c @@ -0,0 +1,54 @@ +#include "lottery.h" +#include "rtc.h" +#include "colors.h" +#include "vram0.h" + +#define LOTTERY_MAX 8 + +const LotteryTheme lo_theme[] = +{ + { // standard scheme + COLOR_WHITE, + COLOR_BLACK, + VRAM0_SPLASH_PCX, + VRAM0_FONT_PBM, + false + }, + { // bricked scheme + RGB(0xFF, 0xFF, 0x00), + RGB(0x00, 0x00, 0xFF), + "lottery/bricked/bootrom_splash.pcx", + "lottery/bricked/font_nbraille_4x6.pbm", + true + }, + { // C64 scheme + RGB(0x7B, 0x71, 0xD5), + RGB(0x41, 0x30, 0xA4), + "lottery/c64/c64_splash.pcx", + "lottery/c64/font_c64_8x8.pbm", + false + }, + { // mirror scheme + COLOR_WHITE, + COLOR_BLACK, + "lottery/mirror/mirror_splash.pcx", + "lottery/mirror/font_6x10_mr.pbm", + false + }, + { // zuish scheme + COLOR_WHITE, + COLOR_BLACK, + "lottery/zuish/zuish_splash.pcx", + "lottery/zuish/font_zuish_8x8.pbm", + false + } +}; + +u32 lo_n = 0; + +u32 InitLottery(void) { + DsTime dstime; + get_dstime(&dstime); + lo_n = (DSTIMEGET(&dstime, bcd_s)>>1) % LOTTERY_MAX; + return lo_n; +} diff --git a/arm9/source/common/lottery.h b/arm9/source/common/lottery.h new file mode 100644 index 0000000..7cc4f7e --- /dev/null +++ b/arm9/source/common/lottery.h @@ -0,0 +1,26 @@ +#pragma once + +#include "common.h" + + +// general scheme access +#define LOTTERY_N ((lo_n > 4) ? 0 : lo_n) +#define LOTTERY_COLOR_FONT (lo_theme[LOTTERY_N].color_font) +#define LOTTERY_COLOR_BG (lo_theme[LOTTERY_N].color_bg) +#define LOTTERY_SPLASH (lo_theme[LOTTERY_N].splash) +#define LOTTERY_FONT (lo_theme[LOTTERY_N].font) +#define LOTTERY_PROMPTHACK (lo_theme[LOTTERY_N].prompthack) + + +typedef struct { + const u32 color_font; + const u32 color_bg; + const char* splash; + const char* font; + const bool prompthack; +} __attribute__((packed)) LotteryTheme; + +extern const LotteryTheme lo_theme[]; +extern u32 lo_n; + +u32 InitLottery(void); diff --git a/arm9/source/common/ui.c b/arm9/source/common/ui.c index 47a7726..b313528 100644 --- a/arm9/source/common/ui.c +++ b/arm9/source/common/ui.c @@ -14,6 +14,7 @@ #include "timer.h" #include "power.h" #include "hid.h" +#include "lottery.h" #define STRBUF_SIZE 512 // maximum size of the string buffer #define FONT_MAX_WIDTH 8 @@ -95,7 +96,7 @@ bool SetFontFromPbm(const void* pbm, u32 pbm_size) { if (!pbm) { u64 pbm_size64 = 0; - pbm = FindVTarFileInfo(VRAM0_FONT_PBM, &pbm_size64); + pbm = FindVTarFileInfo(LOTTERY_FONT, &pbm_size64); pbm_size = (u32) pbm_size64; } @@ -276,6 +277,7 @@ void DrawStringCenter(u8* screen, int color, int bgcolor, const char *format, .. u32 h = GetDrawStringHeight(str); int x = (w >= SCREEN_WIDTH(screen)) ? 0 : (SCREEN_WIDTH(screen) - w) >> 1; int y = (h >= SCREEN_HEIGHT) ? 0 : (SCREEN_HEIGHT - h) >> 1; + if (LOTTERY_PROMPTHACK) x = y = 8; DrawStringF(screen, x, y, color, bgcolor, str); } diff --git a/arm9/source/godmode.c b/arm9/source/godmode.c index ace1cdb..4006ca7 100644 --- a/arm9/source/godmode.c +++ b/arm9/source/godmode.c @@ -19,6 +19,7 @@ #include "power.h" #include "vram0.h" #include "i2c.h" +#include "lottery.h" #define N_PANES 2 @@ -47,7 +48,7 @@ typedef struct { u32 SplashInit(const char* modestr) { u64 splash_size; - u8* splash = FindVTarFileInfo(VRAM0_SPLASH_PCX, &splash_size); + u8* splash = FindVTarFileInfo(LOTTERY_SPLASH, &splash_size); u8* bitmap = (u8*) malloc(SCREEN_SIZE_TOP); const char* namestr = FLAVOR " " VERSION; const char* loadstr = "booting..."; @@ -61,7 +62,7 @@ u32 SplashInit(const char* modestr) { if (splash && bitmap && PCX_Decompress(bitmap, SCREEN_SIZE_TOP, splash, splash_size)) { PCXHdr* hdr = (PCXHdr*) (void*) splash; DrawBitmap(TOP_SCREEN, -1, -1, PCX_Width(hdr), PCX_Height(hdr), bitmap); - } else DrawStringF(TOP_SCREEN, 10, 10, COLOR_STD_FONT, COLOR_TRANSPARENT, "(" VRAM0_SPLASH_PCX " not found)"); + } else DrawStringF(TOP_SCREEN, 10, 10, COLOR_STD_FONT, COLOR_TRANSPARENT, "(%s not found)", LOTTERY_SPLASH); if (modestr) DrawStringF(TOP_SCREEN, SCREEN_WIDTH_TOP - 10 - GetDrawStringWidth(modestr), SCREEN_HEIGHT - 10 - GetDrawStringHeight(modestr), COLOR_STD_FONT, COLOR_TRANSPARENT, modestr); @@ -1932,7 +1933,8 @@ u32 GodMode(int entrypoint) { show_splash = !bootloader; #endif - // init font + // init font / lottery + InitLottery(); if (!SetFontFromPbm(NULL, 0)) return exit_mode; // show splash screen (if enabled) diff --git a/data/lottery/bricked/bootrom_splash.pcx b/data/lottery/bricked/bootrom_splash.pcx new file mode 100644 index 0000000000000000000000000000000000000000..b4258329018b45dded8173208150012038d630cd GIT binary patch literal 5470 zcmeHL+fKtU3~ekSA;gFAckoRu16ew(Xh?`p% z9Pk_UBGVaI@jbQacOLm zuguMtwxVaCjNf8#j~RT{6-=M*`-vGG0V`~O-cxw+QK5vPd+FgNV!+B=mq7>{cnY2Q z$X)y^kTIenDcJxzMKa=X41JOR`%E!0vV2TLs%pMIXfG^)h~j>nNL0ZrKVdm>tCAx} zEs-j&WxR%*-@Ct}kLh7alfB~+n^Q9^!vCBSQ5vCV4VLDrPV#GBKcd#w$htDjP@T#c{oc=#YWxg_Bv(8RIWuh`sf2%A9 jDif6nX5f6PV&fY&&?{Zzqt9VqlV-jWRdHqD92xiqh#f-O literal 0 HcmV?d00001 diff --git a/data/lottery/bricked/font_nbraille_4x6.pbm b/data/lottery/bricked/font_nbraille_4x6.pbm new file mode 100644 index 0000000000000000000000000000000000000000..fcf6806ed9458d01d2468de85c1b79d924a10351 GIT binary patch literal 908 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 literal 0 HcmV?d00001 diff --git a/data/lottery/mirror/font_6x10_mr.pbm b/data/lottery/mirror/font_6x10_mr.pbm new file mode 100644 index 0000000000000000000000000000000000000000..994c7ad437c87fd4ed3d960fae406b7a1a29267d GIT binary patch literal 2006 zcma)-e@s(X6vxkdebe$(ytjR>E-~vvAuDlNaaQs=yLfN8Z@{8WpR^OR7*Ju;#9sqk zY68i_b%YW2Ca7`Ak~zut=d%B1vOgSZrwP$IqW-rGn&RA_AP|;}*xlPQW)?Nxyx#li z_nn^e&bjBl#zX2Redpn0CsTTDYD-yV^Urav&&v*r|qV^)0nEDip`!+R+m5xx~^#8}jzz z+AQwN$iHO}g~eOr;T!i|+hgI&w{CB?P&6j{Cweab-sk(;h`#UI-eTkjZ*Oj3O+XxiyU+~g!{|kKOJ|Vo2b?4K@)j>s8SQM9Oj8zP}C1|5kH)jNR zI-MYW4ZhRH%%Bd@U4&LoNhTh|)4eQXy&_8{0=I;XI;U*rqA>}IT>eCeXJXjroSG|V zdEBGLsK=^OFk{11v-UlT7x^6Lr1wnK!wcQyOPUzp=ixeH}Y@}#UhUt%%QSY2u z$g}nd%j{!5uB8;mJCG2mYwoBoY5u0rWVJV zRgKa*Bc^6?HWAaKcIu(i!`YW1qSU3af{d1+99AqzqVlEM&pV-+H7tk2iJ0`VwM+6c z>cI&M=HliIW^{vKu6xfis^Rx6c;JL`Yf{%e_&dj~fFc0_#JdG?hEYOM4S>EJ1b~Qc z0+?sbejzXoeE7Vl$_Y~e+Aj7w@@BMI=CdH~WuZ6pIq?-X}=l+se1MPUHC z=d(tBS0wMGSTi+w+`FchWGqeR#WR>%g3f1BdxnafB+Q`?%Ec3Ev5yuM@{({QX^ecE z?skm@qUpdCY4o}HA%b4Fyx!(Df7)2d^N-{|H+>TZ$dPCpV@>=}m|!)t;Rv%#ZDU#t@${-(gxh)oery=A1D8tv zm-tB?Bn7An->3oEeqkPq{QP(Dalv1>S(sU+7n?-16CHc~ae?ba77hb)`dJK7o4?kO zw4=~F`XcOlWN+vgSS;G}w>_#Wc&`>*y@k!w>V^~QBH6(?04gsydM@*F7yC%8;^2y& z5@TDN+I_Rm_~S;{HQuPHRh4P%`7AMoIpfN7SZhosaAT!fR+%>E8k0>!+bUbo+(lD+ z$C$#BM)=N#wFb~ITo~=R~A}@=j9$QonRpWV7s{RXP9*mk;M^n*^8n*)|D8d zG9qpun$Y<%s=o#~!P0a;BI|01Y+Wzv)ZGAb{1aYGc{PCskm981ng7uM?6=_`@PX1w literal 0 HcmV?d00001 diff --git a/data/lottery/mirror/mirror_splash.pcx b/data/lottery/mirror/mirror_splash.pcx new file mode 100644 index 0000000000000000000000000000000000000000..eb566ce5d0c7a3b7fefede1ba3f1780438845ebd GIT binary patch literal 8708 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