From 7182fd90783a906c5247d9bbaf01eb9de642d910 Mon Sep 17 00:00:00 2001 From: Alex Taber Date: Mon, 17 Jun 2024 12:00:25 -0400 Subject: [PATCH] Beginning config support Currently only supports changing 4 colors --- include/colors.h | 1 + include/config.h | 45 ++++++++++++++++++ include/fs.h | 2 + source/badges.c | 2 +- source/colors.c | 8 ++-- source/config.c | 117 +++++++++++++++++++++++++++++++++++++++++++++++ source/fs.c | 20 +++++--- source/main.c | 1 + 8 files changed, 185 insertions(+), 11 deletions(-) create mode 100644 include/config.h create mode 100644 source/config.c 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())