diff --git a/include/colors.h b/include/colors.h
index 1b2b90d..efbfc5f 100644
--- a/include/colors.h
+++ b/include/colors.h
@@ -28,6 +28,7 @@
#define COLORS_H
#include "common.h"
+#include "config.h"
typedef u32 Color;
diff --git a/include/config.h b/include/config.h
new file mode 100644
index 0000000..8c9748e
--- /dev/null
+++ b/include/config.h
@@ -0,0 +1,45 @@
+/*
+* This file is part of Anemone3DS
+* Copyright (C) 2016-2024 Contributors in CONTRIBUTORS.md
+*
+* This program is free software: you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program. If not, see .
+*
+* Additional Terms 7.b and 7.c of GPLv3 apply to this file:
+* * Requiring preservation of specified reasonable legal notices or
+* author attributions in that material or in the Appropriate Legal
+* Notices displayed by works containing it.
+* * Prohibiting misrepresentation of the origin of that material,
+* or requiring that modified versions of such material be marked in
+* reasonable ways as different from the original version.
+*/
+
+#ifndef CONFIG_H
+#define CONFIG_H
+
+#include "common.h"
+#include "fs.h"
+#include
+
+typedef struct {
+ u32 background_color;
+ u32 accent_color;
+ u32 red_color;
+ u32 yellow_color;
+} Config_s;
+
+extern Config_s config;
+
+void load_config(void);
+
+#endif
\ No newline at end of file
diff --git a/include/fs.h b/include/fs.h
index 564c2e5..2a84a80 100644
--- a/include/fs.h
+++ b/include/fs.h
@@ -29,6 +29,7 @@
#include "common.h"
#include "badges.h"
+#include "config.h"
#define ILLEGAL_CHARS "><\"?;:/\\+,.|[=]*"
@@ -54,6 +55,7 @@ typedef struct {
u32 coppa : 1;
} Parental_Restrictions_s;
+Result init_sd(void);
Result open_archives(void);
Result open_badge_extdata(void);
Result close_archives(void);
diff --git a/source/badges.c b/source/badges.c
index 14f9c1a..41a3d39 100644
--- a/source/badges.c
+++ b/source/badges.c
@@ -115,7 +115,7 @@ u64 getShortcut(char *filename)
if (sscanf(p1, "%08x", &lowpath) != 1) return shortcut;
shortcut = 0x0004001000000000 + lowpath;
- DEBUG("Shortcut %08lx found for %s\n", shortcut, filename);
+ DEBUG("Shortcut %08llx found for %s\n", shortcut, filename);
return shortcut;
}
diff --git a/source/colors.c b/source/colors.c
index 95986e8..26ebf24 100644
--- a/source/colors.c
+++ b/source/colors.c
@@ -30,11 +30,11 @@ Color colors[COLOR_AMOUNT] = {0};
void init_colors(void)
{
- colors[COLOR_BACKGROUND] = C2D_Color32(35, 28, 32, 255); //silver-y black
- colors[COLOR_ACCENT] = C2D_Color32(12, 58, 111, 255);
+ colors[COLOR_BACKGROUND] = config.background_color;
+ colors[COLOR_ACCENT] = config.accent_color;
colors[COLOR_WHITE] = C2D_Color32(255, 255, 255, 255);
colors[COLOR_CURSOR] = C2D_Color32(200, 200, 200, 255);
colors[COLOR_BLACK] = C2D_Color32(0, 0, 0, 255);
- colors[COLOR_RED] = C2D_Color32(229, 66, 66, 255);
- colors[COLOR_YELLOW] = C2D_Color32(239, 220, 11, 255);
+ colors[COLOR_RED] = config.red_color;
+ colors[COLOR_YELLOW] = config.yellow_color;
}
\ No newline at end of file
diff --git a/source/config.c b/source/config.c
new file mode 100644
index 0000000..62f48ef
--- /dev/null
+++ b/source/config.c
@@ -0,0 +1,117 @@
+/*
+* This file is part of Anemone3DS
+* Copyright (C) 2016-2024 Contributors in CONTRIBUTORS.md
+*
+* This program is free software: you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program. If not, see .
+*
+* Additional Terms 7.b and 7.c of GPLv3 apply to this file:
+* * Requiring preservation of specified reasonable legal notices or
+* author attributions in that material or in the Appropriate Legal
+* Notices displayed by works containing it.
+* * Prohibiting misrepresentation of the origin of that material,
+* or requiring that modified versions of such material be marked in
+* reasonable ways as different from the original version.
+*/
+
+#include "config.h"
+
+Config_s config;
+
+void load_config(void)
+{
+ memset(&config, 0, sizeof(Config_s));
+ char *json_buf = NULL;
+ u32 json_len = file_to_buf(fsMakePath(PATH_ASCII, "/3ds/" APP_TITLE "/config.json"), ArchiveSD, &json_buf);
+ if (json_len)
+ {
+ json_error_t error;
+ json_t *root = json_loadb(json_buf, json_len, 0, &error);
+ if (root)
+ {
+ const char *key;
+ json_t *value;
+ json_object_foreach(root, key, value)
+ {
+ if (json_is_array(value) && !strcmp(key, "Accent Color") && json_array_size(value) == 4)
+ {
+ if (json_is_integer(json_array_get(value, 0)) && json_is_integer(json_array_get(value, 1))
+ && json_is_integer(json_array_get(value, 2)) && json_is_integer(json_array_get(value, 3)))
+ {
+ u8 r = min(255, json_integer_value(json_array_get(value, 0)));
+ u8 g = min(255, json_integer_value(json_array_get(value, 1)));
+ u8 b = min(255, json_integer_value(json_array_get(value, 2)));
+ u8 a = min(255, json_integer_value(json_array_get(value, 3)));
+
+ config.accent_color = C2D_Color32(r, g, b, a);
+ }
+ }
+ else if (json_is_array(value) && !strcmp(key, "Background Color") && json_array_size(value) == 4)
+ {
+ if (json_is_integer(json_array_get(value, 0)) && json_is_integer(json_array_get(value, 1))
+ && json_is_integer(json_array_get(value, 2)) && json_is_integer(json_array_get(value, 3)))
+ {
+ u8 r = min(255, json_integer_value(json_array_get(value, 0)));
+ u8 g = min(255, json_integer_value(json_array_get(value, 1)));
+ u8 b = min(255, json_integer_value(json_array_get(value, 2)));
+ u8 a = min(255, json_integer_value(json_array_get(value, 3)));
+
+ config.background_color = C2D_Color32(r, g, b, a);
+ }
+ }
+ else if (json_is_array(value) && !strcmp(key, "Red Color") && json_array_size(value) == 4)
+ {
+ if (json_is_integer(json_array_get(value, 0)) && json_is_integer(json_array_get(value, 1))
+ && json_is_integer(json_array_get(value, 2)) && json_is_integer(json_array_get(value, 3)))
+ {
+ u8 r = min(255, json_integer_value(json_array_get(value, 0)));
+ u8 g = min(255, json_integer_value(json_array_get(value, 1)));
+ u8 b = min(255, json_integer_value(json_array_get(value, 2)));
+ u8 a = min(255, json_integer_value(json_array_get(value, 3)));
+
+ config.red_color = C2D_Color32(r, g, b, a);
+ }
+ }
+ else if (json_is_array(value) && !strcmp(key, "Yellow Color") && json_array_size(value) == 4)
+ {
+ if (json_is_integer(json_array_get(value, 0)) && json_is_integer(json_array_get(value, 1))
+ && json_is_integer(json_array_get(value, 2)) && json_is_integer(json_array_get(value, 3)))
+ {
+ u8 r = min(255, json_integer_value(json_array_get(value, 0)));
+ u8 g = min(255, json_integer_value(json_array_get(value, 1)));
+ u8 b = min(255, json_integer_value(json_array_get(value, 2)));
+ u8 a = min(255, json_integer_value(json_array_get(value, 3)));
+
+ config.yellow_color = C2D_Color32(r, g, b, a);
+ }
+ }
+ }
+ } else
+ {
+ DEBUG(error.text);
+ }
+ }
+ if (config.accent_color == 0)
+ config.accent_color = C2D_Color32(12, 58, 111, 255);
+
+ if (config.background_color == 0)
+ config.background_color = C2D_Color32(35, 28, 32, 255); //silver-y black
+
+ if (config.red_color == 0)
+ config.red_color = C2D_Color32(229, 66, 66, 255);
+
+ if (config.yellow_color == 0)
+ config.yellow_color = C2D_Color32(239, 220, 11, 255);
+
+ if (json_buf) free(json_buf);
+}
\ No newline at end of file
diff --git a/source/fs.c b/source/fs.c
index d836c4a..a7128a3 100644
--- a/source/fs.c
+++ b/source/fs.c
@@ -67,6 +67,20 @@ Result createExtSaveData(u32 extdataID)
return cmdbuf[1];
}
+Result init_sd(void)
+{
+ Result res;
+ if(R_FAILED(res = FSUSER_OpenArchive(&ArchiveSD, ARCHIVE_SDMC, fsMakePath(PATH_EMPTY, "")))) return res;
+ load_config();
+
+ FSUSER_CreateDirectory(ArchiveSD, fsMakePath(PATH_ASCII, "/3ds"), FS_ATTRIBUTE_DIRECTORY);
+ FSUSER_CreateDirectory(ArchiveSD, fsMakePath(PATH_ASCII, "/3ds/" APP_TITLE), FS_ATTRIBUTE_DIRECTORY);
+ FSUSER_CreateDirectory(ArchiveSD, fsMakePath(PATH_ASCII, "/3ds/" APP_TITLE "/cache"), FS_ATTRIBUTE_DIRECTORY);
+ FSUSER_CreateDirectory(ArchiveSD, fsMakePath(PATH_ASCII, "/3ds/" APP_TITLE "/BadgeBackups"), FS_ATTRIBUTE_DIRECTORY);
+
+ return 0;
+}
+
Result open_archives(void)
{
romfsInit();
@@ -103,16 +117,10 @@ Result open_archives(void)
archive2 = 0x00;
}
- if(R_FAILED(res = FSUSER_OpenArchive(&ArchiveSD, ARCHIVE_SDMC, fsMakePath(PATH_EMPTY, "")))) return res;
-
FSUSER_CreateDirectory(ArchiveSD, fsMakePath(PATH_ASCII, "/Themes"), FS_ATTRIBUTE_DIRECTORY);
FSUSER_CreateDirectory(ArchiveSD, fsMakePath(PATH_ASCII, "/Splashes"), FS_ATTRIBUTE_DIRECTORY);
FSUSER_CreateDirectory(ArchiveSD, fsMakePath(PATH_ASCII, "/Badges"), FS_ATTRIBUTE_DIRECTORY);
FSUSER_CreateDirectory(ArchiveSD, fsMakePath(PATH_ASCII, "/Badges/ThemePlaza Badges"), FS_ATTRIBUTE_DIRECTORY);
- FSUSER_CreateDirectory(ArchiveSD, fsMakePath(PATH_ASCII, "/3ds"), FS_ATTRIBUTE_DIRECTORY);
- FSUSER_CreateDirectory(ArchiveSD, fsMakePath(PATH_ASCII, "/3ds/" APP_TITLE), FS_ATTRIBUTE_DIRECTORY);
- FSUSER_CreateDirectory(ArchiveSD, fsMakePath(PATH_ASCII, "/3ds/" APP_TITLE "/cache"), FS_ATTRIBUTE_DIRECTORY);
- FSUSER_CreateDirectory(ArchiveSD, fsMakePath(PATH_ASCII, "/3ds/" APP_TITLE "/BadgeBackups"), FS_ATTRIBUTE_DIRECTORY);
u32 homeMenuPath[3] = {MEDIATYPE_SD, archive2, 0};
home.type = PATH_BINARY;
diff --git a/source/main.c b/source/main.c
index f0e89a7..d5611d1 100644
--- a/source/main.c
+++ b/source/main.c
@@ -88,6 +88,7 @@ static void init_services(void)
APT_GetAppCpuTimeLimit(&old_time_limit);
APT_SetAppCpuTimeLimit(30);
httpcInit(0);
+ init_sd();
archive_result = open_archives();
badge_archive_result = open_badge_extdata();
if(envIsHomebrew())