TP Badge Browser. Incomplete - see notes
TODO: - Load icons for browser - Fix previews (max tex size 512x512 and preview image 512x1024?
This commit is contained in:
BIN
assets/badge.png
Normal file
BIN
assets/badge.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.7 KiB |
@@ -26,3 +26,4 @@ qr.png
|
|||||||
bgm_only.png
|
bgm_only.png
|
||||||
back.png
|
back.png
|
||||||
dump.png
|
dump.png
|
||||||
|
badge.png
|
||||||
|
|||||||
@@ -71,6 +71,14 @@ typedef enum {
|
|||||||
DRAW_MODE_AMOUNT,
|
DRAW_MODE_AMOUNT,
|
||||||
} DrawMode;
|
} DrawMode;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
REMOTE_MODE_THEMES = 0,
|
||||||
|
REMOTE_MODE_SPLASHES,
|
||||||
|
REMOTE_MODE_BADGES,
|
||||||
|
|
||||||
|
REMOTE_MODE_AMOUNT,
|
||||||
|
} RemoteMode;
|
||||||
|
|
||||||
extern const char * main_paths[MODE_AMOUNT];
|
extern const char * main_paths[MODE_AMOUNT];
|
||||||
extern const int entries_per_screen_v[MODE_AMOUNT];
|
extern const int entries_per_screen_v[MODE_AMOUNT];
|
||||||
extern const int entries_per_screen_h[MODE_AMOUNT];
|
extern const int entries_per_screen_h[MODE_AMOUNT];
|
||||||
|
|||||||
@@ -52,6 +52,7 @@ typedef enum InstallType_e {
|
|||||||
|
|
||||||
INSTALL_LOADING_REMOTE_THEMES,
|
INSTALL_LOADING_REMOTE_THEMES,
|
||||||
INSTALL_LOADING_REMOTE_SPLASHES,
|
INSTALL_LOADING_REMOTE_SPLASHES,
|
||||||
|
INSTALL_LOADING_REMOTE_BADGES,
|
||||||
INSTALL_LOADING_REMOTE_PREVIEW,
|
INSTALL_LOADING_REMOTE_PREVIEW,
|
||||||
INSTALL_LOADING_REMOTE_BGM,
|
INSTALL_LOADING_REMOTE_BGM,
|
||||||
|
|
||||||
@@ -82,6 +83,7 @@ typedef enum {
|
|||||||
|
|
||||||
TEXT_INSTALL_LOADING_REMOTE_THEMES,
|
TEXT_INSTALL_LOADING_REMOTE_THEMES,
|
||||||
TEXT_INSTALL_LOADING_REMOTE_SPLASHES,
|
TEXT_INSTALL_LOADING_REMOTE_SPLASHES,
|
||||||
|
TEXT_INSTALL_LOADING_REMOTE_BADGES,
|
||||||
TEXT_INSTALL_LOADING_REMOTE_PREVIEW,
|
TEXT_INSTALL_LOADING_REMOTE_PREVIEW,
|
||||||
TEXT_INSTALL_LOADING_REMOTE_BGM,
|
TEXT_INSTALL_LOADING_REMOTE_BGM,
|
||||||
|
|
||||||
@@ -111,6 +113,7 @@ typedef enum {
|
|||||||
|
|
||||||
TEXT_THEMEPLAZA_THEME_MODE,
|
TEXT_THEMEPLAZA_THEME_MODE,
|
||||||
TEXT_THEMEPLAZA_SPLASH_MODE,
|
TEXT_THEMEPLAZA_SPLASH_MODE,
|
||||||
|
TEXT_THEMEPLAZA_BADGE_MODE,
|
||||||
|
|
||||||
TEXT_SEARCH,
|
TEXT_SEARCH,
|
||||||
TEXT_PAGE,
|
TEXT_PAGE,
|
||||||
@@ -167,7 +170,7 @@ void set_screen(C3D_RenderTarget * screen);
|
|||||||
void throw_error(const char * error, ErrorLevel level);
|
void throw_error(const char * error, ErrorLevel level);
|
||||||
bool draw_confirm(const char * conf_msg, Entry_List_s * list, DrawMode draw_mode);
|
bool draw_confirm(const char * conf_msg, Entry_List_s * list, DrawMode draw_mode);
|
||||||
|
|
||||||
void draw_preview(C2D_Image preview, int preview_offset);
|
void draw_preview(C2D_Image preview, int preview_offset, float preview_scale);
|
||||||
|
|
||||||
void draw_install(InstallType type);
|
void draw_install(InstallType type);
|
||||||
void draw_loading_bar(u32 current, u32 max, InstallType type);
|
void draw_loading_bar(u32 current, u32 max, InstallType type);
|
||||||
|
|||||||
@@ -66,6 +66,6 @@ u32 compress_lz_file_fast(FS_Path path, FS_Archive archive, char * in_buf, u32 s
|
|||||||
|
|
||||||
Result buf_to_file(u32 size, FS_Path path, FS_Archive archive, char * buf);
|
Result buf_to_file(u32 size, FS_Path path, FS_Archive archive, char * buf);
|
||||||
void remake_file(FS_Path path, FS_Archive archive, u32 size);
|
void remake_file(FS_Path path, FS_Archive archive, u32 size);
|
||||||
void save_zip_to_sd(char * filename, u32 size, char * buf, EntryMode mode);
|
void save_zip_to_sd(char * filename, u32 size, char * buf, RemoteMode mode);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -39,6 +39,12 @@
|
|||||||
#define THEMEPLAZA_JSON_PAGE_COUNT "pages"
|
#define THEMEPLAZA_JSON_PAGE_COUNT "pages"
|
||||||
#define THEMEPLAZA_JSON_PAGE_IDS "items"
|
#define THEMEPLAZA_JSON_PAGE_IDS "items"
|
||||||
|
|
||||||
|
#define THEMEPLAZA_QUERY_ENTRY_INFO THEMEPLAZA_BASE_API_URL "/query?item_id=%" JSON_INTEGER_FORMAT
|
||||||
|
#define THEMEPLAZA_JSON_TITLE "title"
|
||||||
|
#define THEMEPLAZA_JSON_AUTHOR "author"
|
||||||
|
#define THEMEPLAZA_JSON_DESC "description"
|
||||||
|
#define THEMEPLAZA_JSON_SUCCESS "success"
|
||||||
|
|
||||||
#define THEMEPLAZA_JSON_ERROR_MESSAGE "message"
|
#define THEMEPLAZA_JSON_ERROR_MESSAGE "message"
|
||||||
#define THEMEPLAZA_JSON_ERROR_MESSAGE_NOT_FOUND "No items found"
|
#define THEMEPLAZA_JSON_ERROR_MESSAGE_NOT_FOUND "No items found"
|
||||||
|
|
||||||
@@ -62,7 +68,7 @@ typedef struct {
|
|||||||
char *mime_type;
|
char *mime_type;
|
||||||
} curl_header;
|
} curl_header;
|
||||||
|
|
||||||
bool themeplaza_browser(EntryMode mode);
|
bool themeplaza_browser(RemoteMode mode);
|
||||||
Result http_get(const char * url, char ** filename, char ** buf, u32 * size, InstallType install_type, const char * acceptable_mime_types);
|
Result http_get(const char * url, char ** filename, char ** buf, u32 * size, InstallType install_type, const char * acceptable_mime_types);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -31,9 +31,6 @@
|
|||||||
#include "draw.h"
|
#include "draw.h"
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
|
||||||
#define SPLASHES_STRINGS 2
|
|
||||||
#define THEMES_STRINGS 6
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
const char *quit;
|
const char *quit;
|
||||||
const char *thread_error;
|
const char *thread_error;
|
||||||
@@ -56,6 +53,7 @@ typedef struct {
|
|||||||
const char *sel;
|
const char *sel;
|
||||||
const char *tp_theme_mode;
|
const char *tp_theme_mode;
|
||||||
const char *tp_splash_mode;
|
const char *tp_splash_mode;
|
||||||
|
const char *tp_badge_mode;
|
||||||
const char *search;
|
const char *search;
|
||||||
const char *page;
|
const char *page;
|
||||||
const char *err_quit;
|
const char *err_quit;
|
||||||
@@ -75,6 +73,7 @@ typedef struct {
|
|||||||
const char *delete_sd;
|
const char *delete_sd;
|
||||||
const char *download_themes;
|
const char *download_themes;
|
||||||
const char *download_splashes;
|
const char *download_splashes;
|
||||||
|
const char *download_badges;
|
||||||
const char *download_preview;
|
const char *download_preview;
|
||||||
const char *download_bgm;
|
const char *download_bgm;
|
||||||
const char *dump_single;
|
const char *dump_single;
|
||||||
@@ -176,7 +175,7 @@ typedef struct {
|
|||||||
Loading_Strings_s loading;
|
Loading_Strings_s loading;
|
||||||
Main_Strings_s main;
|
Main_Strings_s main;
|
||||||
Remote_Strings_s remote;
|
Remote_Strings_s remote;
|
||||||
Instructions_s remote_instructions[MODE_AMOUNT];
|
Instructions_s remote_instructions[REMOTE_MODE_AMOUNT];
|
||||||
Instructions_s remote_extra_instructions;
|
Instructions_s remote_extra_instructions;
|
||||||
Splashes_Strings_s splashes;
|
Splashes_Strings_s splashes;
|
||||||
Themes_Strings_s themes;
|
Themes_Strings_s themes;
|
||||||
|
|||||||
@@ -249,7 +249,7 @@ Result install_badges(void)
|
|||||||
Handle folder = 0;
|
Handle folder = 0;
|
||||||
Result res = 0;
|
Result res = 0;
|
||||||
|
|
||||||
res = actInit();
|
res = actInit();
|
||||||
if (R_FAILED(res))
|
if (R_FAILED(res))
|
||||||
{
|
{
|
||||||
DEBUG("actInit() failed!\n");
|
DEBUG("actInit() failed!\n");
|
||||||
@@ -271,9 +271,6 @@ Result install_badges(void)
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
u64 badgeDataSize = 0xF4DF80;
|
|
||||||
u64 badgeMngSize = 0xD4A8;
|
|
||||||
|
|
||||||
badgeMngBuffer = NULL;
|
badgeMngBuffer = NULL;
|
||||||
badgeDataBuffer = NULL;
|
badgeDataBuffer = NULL;
|
||||||
rgb_buf_64x64 = NULL;
|
rgb_buf_64x64 = NULL;
|
||||||
@@ -296,8 +293,8 @@ Result install_badges(void)
|
|||||||
alpha_buf_64x64 = malloc(12*6*64*64/2); //Same thing, but 2 pixels of alpha data per byte
|
alpha_buf_64x64 = malloc(12*6*64*64/2); //Same thing, but 2 pixels of alpha data per byte
|
||||||
rgb_buf_32x32 = malloc(12*6*32*32*2); //Same thing, but 32x32
|
rgb_buf_32x32 = malloc(12*6*32*32*2); //Same thing, but 32x32
|
||||||
alpha_buf_32x32 = malloc(12*6*32*32/2);
|
alpha_buf_32x32 = malloc(12*6*32*32/2);
|
||||||
badgeDataBuffer = calloc(1, badgeDataSize);
|
badgeDataBuffer = calloc(1, BADGE_DATA_SIZE);
|
||||||
badgeMngBuffer = calloc(1, badgeMngSize);
|
badgeMngBuffer = calloc(1, BADGE_MNG_SIZE);
|
||||||
int badge_count = 0;
|
int badge_count = 0;
|
||||||
int set_count = 0;
|
int set_count = 0;
|
||||||
int default_set = 0;
|
int default_set = 0;
|
||||||
@@ -366,7 +363,7 @@ Result install_badges(void)
|
|||||||
memcpy(badgeDataBuffer + 0x250F80 + default_index * 0x2000, rgb_buf_64x64, 64 * 64 * 2);
|
memcpy(badgeDataBuffer + 0x250F80 + default_index * 0x2000, rgb_buf_64x64, 64 * 64 * 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
res = buf_to_file(badgeDataSize, fsMakePath(PATH_ASCII, "/BadgeData.dat"), ArchiveBadgeExt, badgeDataBuffer);
|
res = buf_to_file(BADGE_DATA_SIZE, fsMakePath(PATH_ASCII, "/BadgeData.dat"), ArchiveBadgeExt, badgeDataBuffer);
|
||||||
if (res)
|
if (res)
|
||||||
{
|
{
|
||||||
DEBUG("Error writing badge data! %lx\n", res);
|
DEBUG("Error writing badge data! %lx\n", res);
|
||||||
@@ -405,7 +402,7 @@ Result install_badges(void)
|
|||||||
FSFILE_Close(handle);
|
FSFILE_Close(handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
res = buf_to_file(badgeMngSize, fsMakePath(PATH_ASCII, "/BadgeMngFile.dat"), ArchiveBadgeExt, badgeMngBuffer);
|
res = buf_to_file(BADGE_MNG_SIZE, fsMakePath(PATH_ASCII, "/BadgeMngFile.dat"), ArchiveBadgeExt, badgeMngBuffer);
|
||||||
if (res)
|
if (res)
|
||||||
{
|
{
|
||||||
DEBUG("Error writing badge manage data! %lx\n", res);
|
DEBUG("Error writing badge manage data! %lx\n", res);
|
||||||
@@ -413,7 +410,9 @@ Result install_badges(void)
|
|||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
end:
|
end:
|
||||||
|
actExit();
|
||||||
if (rgb_buf_64x64) free(rgb_buf_64x64);
|
if (rgb_buf_64x64) free(rgb_buf_64x64);
|
||||||
if (alpha_buf_64x64) free(alpha_buf_64x64);
|
if (alpha_buf_64x64) free(alpha_buf_64x64);
|
||||||
if (rgb_buf_32x32) free(rgb_buf_32x32);
|
if (rgb_buf_32x32) free(rgb_buf_32x32);
|
||||||
|
|||||||
@@ -97,6 +97,7 @@ void init_screens(void)
|
|||||||
|
|
||||||
C2D_TextParse(&text[TEXT_THEMEPLAZA_THEME_MODE], staticBuf, language.draw.tp_theme_mode);
|
C2D_TextParse(&text[TEXT_THEMEPLAZA_THEME_MODE], staticBuf, language.draw.tp_theme_mode);
|
||||||
C2D_TextParse(&text[TEXT_THEMEPLAZA_SPLASH_MODE], staticBuf, language.draw.tp_splash_mode);
|
C2D_TextParse(&text[TEXT_THEMEPLAZA_SPLASH_MODE], staticBuf, language.draw.tp_splash_mode);
|
||||||
|
C2D_TextParse(&text[TEXT_THEMEPLAZA_BADGE_MODE], staticBuf, language.draw.tp_badge_mode);
|
||||||
|
|
||||||
C2D_TextParse(&text[TEXT_SEARCH], staticBuf, language.draw.search);
|
C2D_TextParse(&text[TEXT_SEARCH], staticBuf, language.draw.search);
|
||||||
C2D_TextParse(&text[TEXT_PAGE], staticBuf, language.draw.page);
|
C2D_TextParse(&text[TEXT_PAGE], staticBuf, language.draw.page);
|
||||||
@@ -124,6 +125,7 @@ void init_screens(void)
|
|||||||
|
|
||||||
C2D_TextParse(&text[TEXT_INSTALL_LOADING_REMOTE_THEMES], staticBuf, language.draw.download_themes);
|
C2D_TextParse(&text[TEXT_INSTALL_LOADING_REMOTE_THEMES], staticBuf, language.draw.download_themes);
|
||||||
C2D_TextParse(&text[TEXT_INSTALL_LOADING_REMOTE_SPLASHES], staticBuf, language.draw.download_splashes);
|
C2D_TextParse(&text[TEXT_INSTALL_LOADING_REMOTE_SPLASHES], staticBuf, language.draw.download_splashes);
|
||||||
|
C2D_TextParse(&text[TEXT_INSTALL_LOADING_REMOTE_BADGES], staticBuf, language.draw.download_badges);
|
||||||
C2D_TextParse(&text[TEXT_INSTALL_LOADING_REMOTE_PREVIEW], staticBuf, language.draw.download_preview);
|
C2D_TextParse(&text[TEXT_INSTALL_LOADING_REMOTE_PREVIEW], staticBuf, language.draw.download_preview);
|
||||||
C2D_TextParse(&text[TEXT_INSTALL_LOADING_REMOTE_BGM], staticBuf, language.draw.download_bgm);
|
C2D_TextParse(&text[TEXT_INSTALL_LOADING_REMOTE_BGM], staticBuf, language.draw.download_bgm);
|
||||||
C2D_TextParse(&text[TEXT_INSTALL_DUMPING_THEME], staticBuf, language.draw.dump_single);
|
C2D_TextParse(&text[TEXT_INSTALL_DUMPING_THEME], staticBuf, language.draw.dump_single);
|
||||||
@@ -340,13 +342,13 @@ bool draw_confirm(const char * conf_msg, Entry_List_s * list, DrawMode draw_mode
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void draw_preview(C2D_Image preview, int preview_offset)
|
void draw_preview(C2D_Image preview, int preview_offset, float preview_scale)
|
||||||
{
|
{
|
||||||
start_frame();
|
start_frame();
|
||||||
set_screen(top);
|
set_screen(top);
|
||||||
C2D_DrawImageAt(preview, -preview_offset, 0, 0.5f, NULL, 1.0f, 1.0f);
|
C2D_DrawImageAt(preview, -preview_offset, 0, 0.5f, NULL, preview_scale, preview_scale);
|
||||||
set_screen(bottom);
|
set_screen(bottom);
|
||||||
C2D_DrawImageAt(preview, -(preview_offset+40), -240, 0.5f, NULL, 1.0f, 1.0f);
|
C2D_DrawImageAt(preview, -(preview_offset+40), -240, 0.5f, NULL, preview_scale, preview_scale);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void draw_install_handler(InstallType type)
|
static void draw_install_handler(InstallType type)
|
||||||
@@ -520,9 +522,10 @@ void draw_grid_interface(Entry_List_s * list, Instructions_s instructions, int e
|
|||||||
draw_base_interface();
|
draw_base_interface();
|
||||||
EntryMode current_mode = list->mode;
|
EntryMode current_mode = list->mode;
|
||||||
|
|
||||||
C2D_Text * mode_string[MODE_AMOUNT] = {
|
C2D_Text * mode_string[REMOTE_MODE_AMOUNT] = {
|
||||||
&text[TEXT_THEMEPLAZA_THEME_MODE],
|
&text[TEXT_THEMEPLAZA_THEME_MODE],
|
||||||
&text[TEXT_THEMEPLAZA_SPLASH_MODE],
|
&text[TEXT_THEMEPLAZA_SPLASH_MODE],
|
||||||
|
&text[TEXT_THEMEPLAZA_BADGE_MODE],
|
||||||
};
|
};
|
||||||
|
|
||||||
draw_c2d_text_center(GFX_TOP, 4, 0.5f, 0.5f, 0.5f, colors[COLOR_WHITE], mode_string[current_mode]);
|
draw_c2d_text_center(GFX_TOP, 4, 0.5f, 0.5f, 0.5f, colors[COLOR_WHITE], mode_string[current_mode]);
|
||||||
@@ -699,16 +702,17 @@ void draw_interface(Entry_List_s * list, Instructions_s instructions, DrawMode d
|
|||||||
draw_image(sprites_browse_idx, 320-24, 0);
|
draw_image(sprites_browse_idx, 320-24, 0);
|
||||||
draw_image(sprites_dump_idx, 320-48, 0);
|
draw_image(sprites_dump_idx, 320-48, 0);
|
||||||
draw_image(sprites_sort_idx, 320-72, 0);
|
draw_image(sprites_sort_idx, 320-72, 0);
|
||||||
draw_image(sprites_back_idx, 320-96, 0);
|
draw_image(sprites_badge_idx, 320-96, 0);
|
||||||
|
draw_image(sprites_back_idx, 320-120, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Show arrows if there are themes out of bounds
|
// Show arrows if there are themes out of bounds
|
||||||
//----------------------------------------------------------------
|
//----------------------------------------------------------------
|
||||||
if(list->scroll > 0)
|
if(list->scroll > 0)
|
||||||
draw_image(sprites_arrow_up_idx, 136, 220);
|
draw_image(sprites_arrow_up_idx, 141, 220);
|
||||||
if(list->scroll + list->entries_loaded < list->entries_count)
|
if(list->scroll + list->entries_loaded < list->entries_count)
|
||||||
draw_image(sprites_arrow_down_idx, 152, 220);
|
draw_image(sprites_arrow_down_idx, 157, 220);
|
||||||
|
|
||||||
for(int i = list->scroll; i < (list->entries_loaded + list->scroll); i++)
|
for(int i = list->scroll; i < (list->entries_loaded + list->scroll); i++)
|
||||||
{
|
{
|
||||||
|
|||||||
34
source/fs.c
34
source/fs.c
@@ -30,6 +30,7 @@
|
|||||||
#include "draw.h"
|
#include "draw.h"
|
||||||
#include "unicode.h"
|
#include "unicode.h"
|
||||||
#include "ui_strings.h"
|
#include "ui_strings.h"
|
||||||
|
#include "remote.h"
|
||||||
|
|
||||||
#include <archive.h>
|
#include <archive.h>
|
||||||
#include <archive_entry.h>
|
#include <archive_entry.h>
|
||||||
@@ -108,6 +109,7 @@ Result open_archives(void)
|
|||||||
FSUSER_CreateDirectory(ArchiveSD, fsMakePath(PATH_ASCII, "/Themes"), FS_ATTRIBUTE_DIRECTORY);
|
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, "/Splashes"), FS_ATTRIBUTE_DIRECTORY);
|
||||||
FSUSER_CreateDirectory(ArchiveSD, fsMakePath(PATH_ASCII, "/Badges"), 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"), FS_ATTRIBUTE_DIRECTORY);
|
||||||
FSUSER_CreateDirectory(ArchiveSD, fsMakePath(PATH_ASCII, "/3ds/" APP_TITLE), 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 "/cache"), FS_ATTRIBUTE_DIRECTORY);
|
||||||
@@ -145,6 +147,20 @@ Result open_archives(void)
|
|||||||
Handle test_handle;
|
Handle test_handle;
|
||||||
if(R_FAILED(res = FSUSER_OpenFile(&test_handle, ArchiveThemeExt, fsMakePath(PATH_ASCII, "/ThemeManage.bin"), FS_OPEN_READ, 0))) return res;
|
if(R_FAILED(res = FSUSER_OpenFile(&test_handle, ArchiveThemeExt, fsMakePath(PATH_ASCII, "/ThemeManage.bin"), FS_OPEN_READ, 0))) return res;
|
||||||
FSFILE_Close(test_handle);
|
FSFILE_Close(test_handle);
|
||||||
|
if(R_FAILED(res = FSUSER_OpenFile(&test_handle, ArchiveSD, fsMakePath(PATH_ASCII, "/Badges/ThemePlaza Badges/_seticon.png"), FS_OPEN_READ, 0)))
|
||||||
|
{
|
||||||
|
FILE *fp = fopen("romfs:/tp_set.png", "rb");
|
||||||
|
fseek(fp, 0L, SEEK_END);
|
||||||
|
ssize_t size = ftell(fp);
|
||||||
|
char *icon_buf = malloc(size);
|
||||||
|
fseek(fp, 0L, SEEK_SET);
|
||||||
|
fread(icon_buf, 1, size, fp);
|
||||||
|
fclose(fp);
|
||||||
|
remake_file(fsMakePath(PATH_ASCII, "/Badges/ThemePlaza Badges/_seticon.png"), ArchiveSD, size);
|
||||||
|
buf_to_file(size, fsMakePath(PATH_ASCII, "/Badges/ThemePlaza Badges/_seticon.png"), ArchiveSD, icon_buf);
|
||||||
|
DEBUG("res: 0x%08lx\n", res);
|
||||||
|
free(icon_buf);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -156,6 +172,7 @@ Result close_archives(void)
|
|||||||
if(R_FAILED(res = FSUSER_CloseArchive(ArchiveSD))) return res;
|
if(R_FAILED(res = FSUSER_CloseArchive(ArchiveSD))) return res;
|
||||||
if(R_FAILED(res = FSUSER_CloseArchive(ArchiveHomeExt))) return res;
|
if(R_FAILED(res = FSUSER_CloseArchive(ArchiveHomeExt))) return res;
|
||||||
if(R_FAILED(res = FSUSER_CloseArchive(ArchiveThemeExt))) return res;
|
if(R_FAILED(res = FSUSER_CloseArchive(ArchiveThemeExt))) return res;
|
||||||
|
if(R_FAILED(res = FSUSER_CloseArchive(ArchiveBadgeExt))) return res;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -433,16 +450,26 @@ static SwkbdCallbackResult fat32filter(void * user, const char ** ppMessage, con
|
|||||||
}
|
}
|
||||||
|
|
||||||
// assumes the input buffer is a ZIP. if it isn't, why are you calling this?
|
// assumes the input buffer is a ZIP. if it isn't, why are you calling this?
|
||||||
void save_zip_to_sd(char * filename, u32 size, char * buf, EntryMode mode)
|
void save_zip_to_sd(char * filename, u32 size, char * buf, RemoteMode mode)
|
||||||
{
|
{
|
||||||
static char path_to_file[32761]; // FAT32 paths can be quite long.
|
static char path_to_file[32761]; // FAT32 paths can be quite long.
|
||||||
const int max_chars = 250;
|
const int max_chars = 250;
|
||||||
char new_filename[max_chars + 5]; // .zip + \0
|
char new_filename[max_chars + 5]; // .zip + \0
|
||||||
renamed:
|
renamed:
|
||||||
sprintf(path_to_file, "%s%s", main_paths[mode], filename);
|
char * curr_filename;
|
||||||
|
if (mode == REMOTE_MODE_BADGES)
|
||||||
|
{
|
||||||
|
DEBUG("Remote mode badges! Saving to /Badges/ThemePlaza Badges/\n");
|
||||||
|
sprintf(path_to_file, "%s%s", "/Badges/ThemePlaza Badges/", filename);
|
||||||
|
curr_filename = path_to_file + strlen("/Badges/ThemePlaza Badges/");
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
sprintf(path_to_file, "%s%s", main_paths[mode], filename);
|
||||||
|
curr_filename = path_to_file + strlen(main_paths[mode]);
|
||||||
|
}
|
||||||
|
|
||||||
|
DEBUG("Filtering out illegal chars...\n");
|
||||||
// filter out characters illegal in FAT32 filenames
|
// filter out characters illegal in FAT32 filenames
|
||||||
char * curr_filename = path_to_file + strlen(main_paths[mode]);
|
|
||||||
char * illegal_char = curr_filename;
|
char * illegal_char = curr_filename;
|
||||||
while ((illegal_char = strpbrk(illegal_char, ILLEGAL_CHARS)))
|
while ((illegal_char = strpbrk(illegal_char, ILLEGAL_CHARS)))
|
||||||
{
|
{
|
||||||
@@ -462,6 +489,7 @@ renamed:
|
|||||||
*illegal_char = '-';
|
*illegal_char = '-';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DEBUG("Checking extension\n");
|
||||||
// ensure the extension is .zip
|
// ensure the extension is .zip
|
||||||
char * extension = strrchr(path_to_file, '.');
|
char * extension = strrchr(path_to_file, '.');
|
||||||
if (extension == NULL || strcmp(extension, ".zip"))
|
if (extension == NULL || strcmp(extension, ".zip"))
|
||||||
|
|||||||
@@ -454,7 +454,7 @@ int main(void)
|
|||||||
|
|
||||||
if(preview_mode)
|
if(preview_mode)
|
||||||
{
|
{
|
||||||
draw_preview(preview, preview_offset);
|
draw_preview(preview, preview_offset, 1.0f);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if(!iconLoadingThread_arg.run_thread)
|
if(!iconLoadingThread_arg.run_thread)
|
||||||
@@ -574,7 +574,7 @@ int main(void)
|
|||||||
if(preview_mode)
|
if(preview_mode)
|
||||||
{
|
{
|
||||||
end_frame();
|
end_frame();
|
||||||
draw_preview(preview, preview_offset);
|
draw_preview(preview, preview_offset, 1.0f);
|
||||||
end_frame();
|
end_frame();
|
||||||
if(current_mode == MODE_THEMES && dspfirm)
|
if(current_mode == MODE_THEMES && dspfirm)
|
||||||
{
|
{
|
||||||
@@ -606,11 +606,12 @@ int main(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int selected_entry = current_list->selected_entry;
|
||||||
|
Entry_s * current_entry = ¤t_list->entries[selected_entry];
|
||||||
|
|
||||||
if(preview_mode || current_list->entries == NULL)
|
if(preview_mode || current_list->entries == NULL)
|
||||||
goto touch;
|
goto touch;
|
||||||
|
|
||||||
int selected_entry = current_list->selected_entry;
|
|
||||||
Entry_s * current_entry = ¤t_list->entries[selected_entry];
|
|
||||||
|
|
||||||
if(install_mode)
|
if(install_mode)
|
||||||
{
|
{
|
||||||
@@ -786,6 +787,9 @@ int main(void)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else if (BETWEEN(320-96, x, 320-72))
|
} else if (BETWEEN(320-96, x, 320-72))
|
||||||
|
{
|
||||||
|
goto badge_install;
|
||||||
|
} else if (BETWEEN(320-120, x, 320-96))
|
||||||
{
|
{
|
||||||
extra_mode = false;
|
extra_mode = false;
|
||||||
extra_index = 1;
|
extra_index = 1;
|
||||||
@@ -804,7 +808,7 @@ int main(void)
|
|||||||
else if(kDown & KEY_DLEFT)
|
else if(kDown & KEY_DLEFT)
|
||||||
{
|
{
|
||||||
browse_themeplaza:
|
browse_themeplaza:
|
||||||
if(themeplaza_browser(current_mode))
|
if(themeplaza_browser((RemoteMode) current_mode))
|
||||||
{
|
{
|
||||||
current_mode = MODE_THEMES;
|
current_mode = MODE_THEMES;
|
||||||
load_lists(lists);
|
load_lists(lists);
|
||||||
@@ -831,6 +835,10 @@ int main(void)
|
|||||||
}
|
}
|
||||||
else if (kDown & KEY_DRIGHT)
|
else if (kDown & KEY_DRIGHT)
|
||||||
{
|
{
|
||||||
|
badge_install:
|
||||||
|
extra_mode = false;
|
||||||
|
extra_index = 1;
|
||||||
|
draw_mode = DRAW_MODE_LIST;
|
||||||
draw_install(INSTALL_BADGES);
|
draw_install(INSTALL_BADGES);
|
||||||
install_badges();
|
install_badges();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -50,6 +50,41 @@ static void free_icons(Entry_List_s * list)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void load_remote_metadata(Entry_s * entry)
|
||||||
|
{
|
||||||
|
char *page_json = NULL;
|
||||||
|
char *api_url = NULL;
|
||||||
|
asprintf(&api_url, THEMEPLAZA_QUERY_ENTRY_INFO, entry->tp_download_id);
|
||||||
|
u32 json_len;
|
||||||
|
Result res = http_get(api_url, NULL, &page_json, &json_len, INSTALL_NONE, "application/json");
|
||||||
|
free(api_url);
|
||||||
|
if (R_FAILED(res))
|
||||||
|
{
|
||||||
|
free(page_json);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (json_len)
|
||||||
|
{
|
||||||
|
json_error_t error;
|
||||||
|
json_t *root = json_loadb(page_json, json_len, 0, &error);
|
||||||
|
if (root)
|
||||||
|
{
|
||||||
|
const char *key;
|
||||||
|
json_t *value;
|
||||||
|
json_object_foreach(root, key, value)
|
||||||
|
{
|
||||||
|
if (json_is_string(value) && !strcmp(key, THEMEPLAZA_JSON_TITLE))
|
||||||
|
utf8_to_utf16(entry->name, (u8 *) json_string_value(value), min(json_string_length(value), 0x41));
|
||||||
|
else if (json_is_string(value) && !strcmp(key, THEMEPLAZA_JSON_AUTHOR))
|
||||||
|
utf8_to_utf16(entry->author, (u8 *) json_string_value(value), min(json_string_length(value), 0x41));
|
||||||
|
else if (json_is_string(value) && !strcmp(key, THEMEPLAZA_JSON_DESC))
|
||||||
|
utf8_to_utf16(entry->desc, (u8 *) json_string_value(value), min(json_string_length(value), 0x81));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void load_remote_smdh(Entry_s * entry, C3D_Tex * into_tex, const Entry_Icon_s * icon_info, bool ignore_cache)
|
static void load_remote_smdh(Entry_s * entry, C3D_Tex * into_tex, const Entry_Icon_s * icon_info, bool ignore_cache)
|
||||||
{
|
{
|
||||||
bool not_cached = true;
|
bool not_cached = true;
|
||||||
@@ -102,7 +137,7 @@ static void load_remote_smdh(Entry_s * entry, C3D_Tex * into_tex, const Entry_Ic
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void load_remote_entries(Entry_List_s * list, json_t * ids_array, bool ignore_cache, InstallType type)
|
static void load_remote_entries(Entry_List_s * list, json_t * ids_array, bool ignore_cache, InstallType type, RemoteMode mode)
|
||||||
{
|
{
|
||||||
free(list->entries);
|
free(list->entries);
|
||||||
list->entries_count = json_array_size(ids_array);
|
list->entries_count = json_array_size(ids_array);
|
||||||
@@ -122,11 +157,17 @@ static void load_remote_entries(Entry_List_s * list, json_t * ids_array, bool ig
|
|||||||
utf8_to_utf16(current_entry->path, (u8 *)entry_path, 0x106);
|
utf8_to_utf16(current_entry->path, (u8 *)entry_path, 0x106);
|
||||||
free(entry_path);
|
free(entry_path);
|
||||||
|
|
||||||
load_remote_smdh(current_entry, &list->icons_texture, &list->icons_info[i], ignore_cache);
|
if (mode != REMOTE_MODE_BADGES)
|
||||||
|
load_remote_smdh(current_entry, &list->icons_texture, &list->icons_info[i], ignore_cache);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
list->entries[i].placeholder_color = C2D_Color32(rand() * 255, rand() * 255, rand() * 255, 255);
|
||||||
|
load_remote_metadata(current_entry);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void load_remote_list(Entry_List_s * list, json_int_t page, EntryMode mode, bool ignore_cache)
|
static void load_remote_list(Entry_List_s * list, json_int_t page, RemoteMode mode, bool ignore_cache)
|
||||||
{
|
{
|
||||||
if (page > list->tp_page_count)
|
if (page > list->tp_page_count)
|
||||||
page = 1;
|
page = 1;
|
||||||
@@ -136,10 +177,12 @@ static void load_remote_list(Entry_List_s * list, json_int_t page, EntryMode mod
|
|||||||
list->selected_entry = 0;
|
list->selected_entry = 0;
|
||||||
|
|
||||||
InstallType loading_screen = INSTALL_NONE;
|
InstallType loading_screen = INSTALL_NONE;
|
||||||
if (mode == MODE_THEMES)
|
if (mode == REMOTE_MODE_THEMES)
|
||||||
loading_screen = INSTALL_LOADING_REMOTE_THEMES;
|
loading_screen = INSTALL_LOADING_REMOTE_THEMES;
|
||||||
else if (mode == MODE_SPLASHES)
|
else if (mode == REMOTE_MODE_SPLASHES)
|
||||||
loading_screen = INSTALL_LOADING_REMOTE_SPLASHES;
|
loading_screen = INSTALL_LOADING_REMOTE_SPLASHES;
|
||||||
|
else if (mode == REMOTE_MODE_BADGES)
|
||||||
|
loading_screen = INSTALL_LOADING_REMOTE_BADGES;
|
||||||
draw_install(loading_screen);
|
draw_install(loading_screen);
|
||||||
|
|
||||||
char * page_json = NULL;
|
char * page_json = NULL;
|
||||||
@@ -170,7 +213,7 @@ static void load_remote_list(Entry_List_s * list, json_int_t page, EntryMode mod
|
|||||||
if (json_is_integer(value) && !strcmp(key, THEMEPLAZA_JSON_PAGE_COUNT))
|
if (json_is_integer(value) && !strcmp(key, THEMEPLAZA_JSON_PAGE_COUNT))
|
||||||
list->tp_page_count = json_integer_value(value);
|
list->tp_page_count = json_integer_value(value);
|
||||||
else if (json_is_array(value) && !strcmp(key, THEMEPLAZA_JSON_PAGE_IDS))
|
else if (json_is_array(value) && !strcmp(key, THEMEPLAZA_JSON_PAGE_IDS))
|
||||||
load_remote_entries(list, value, ignore_cache, loading_screen);
|
load_remote_entries(list, value, ignore_cache, loading_screen, mode);
|
||||||
else if (json_is_string(value) && !strcmp(key, THEMEPLAZA_JSON_ERROR_MESSAGE)
|
else if (json_is_string(value) && !strcmp(key, THEMEPLAZA_JSON_ERROR_MESSAGE)
|
||||||
&& !strcmp(json_string_value(value), THEMEPLAZA_JSON_ERROR_MESSAGE_NOT_FOUND))
|
&& !strcmp(json_string_value(value), THEMEPLAZA_JSON_ERROR_MESSAGE_NOT_FOUND))
|
||||||
throw_error(language.remote.no_results, ERROR_LEVEL_WARNING);
|
throw_error(language.remote.no_results, ERROR_LEVEL_WARNING);
|
||||||
@@ -189,7 +232,7 @@ static void load_remote_list(Entry_List_s * list, json_int_t page, EntryMode mod
|
|||||||
|
|
||||||
static u16 previous_path_preview[0x106];
|
static u16 previous_path_preview[0x106];
|
||||||
|
|
||||||
static bool load_remote_preview(const Entry_s * entry, C2D_Image * preview_image, int * preview_offset)
|
static bool load_remote_preview(const Entry_s * entry, C2D_Image * preview_image, int * preview_offset, u32 height)
|
||||||
{
|
{
|
||||||
bool not_cached = true;
|
bool not_cached = true;
|
||||||
|
|
||||||
@@ -224,7 +267,6 @@ static bool load_remote_preview(const Entry_s * entry, C2D_Image * preview_image
|
|||||||
char * preview_buf = malloc(preview_size);
|
char * preview_buf = malloc(preview_size);
|
||||||
u32 preview_buf_size = preview_size;
|
u32 preview_buf_size = preview_size;
|
||||||
memcpy(preview_buf, preview_png, preview_size);
|
memcpy(preview_buf, preview_png, preview_size);
|
||||||
u32 height = 480;
|
|
||||||
|
|
||||||
if (!(preview_buf_size = png_to_abgr(&preview_buf, preview_buf_size, &height)))
|
if (!(preview_buf_size = png_to_abgr(&preview_buf, preview_buf_size, &height)))
|
||||||
{
|
{
|
||||||
@@ -288,7 +330,7 @@ static void load_remote_bgm(const Entry_s * entry)
|
|||||||
free(bgm_ogg);
|
free(bgm_ogg);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void download_remote_entry(Entry_s * entry, EntryMode mode)
|
static void download_remote_entry(Entry_s * entry, RemoteMode mode)
|
||||||
{
|
{
|
||||||
char * download_url = NULL;
|
char * download_url = NULL;
|
||||||
asprintf(&download_url, THEMEPLAZA_DOWNLOAD_FORMAT, entry->tp_download_id);
|
asprintf(&download_url, THEMEPLAZA_DOWNLOAD_FORMAT, entry->tp_download_id);
|
||||||
@@ -411,7 +453,7 @@ static void change_selected(Entry_List_s * list, int change_value)
|
|||||||
list->selected_entry = newval;
|
list->selected_entry = newval;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool themeplaza_browser(EntryMode mode)
|
bool themeplaza_browser(RemoteMode mode)
|
||||||
{
|
{
|
||||||
bool downloaded = false;
|
bool downloaded = false;
|
||||||
|
|
||||||
@@ -489,7 +531,9 @@ bool themeplaza_browser(EntryMode mode)
|
|||||||
|
|
||||||
if (preview_mode)
|
if (preview_mode)
|
||||||
{
|
{
|
||||||
draw_preview(preview, preview_offset);
|
if (mode == REMOTE_MODE_BADGES) draw_preview(preview, -40, 0.625f);
|
||||||
|
else draw_preview(preview, preview_offset, 1.0f);
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -531,7 +575,7 @@ bool themeplaza_browser(EntryMode mode)
|
|||||||
extra_mode = false;
|
extra_mode = false;
|
||||||
change_mode:
|
change_mode:
|
||||||
mode++;
|
mode++;
|
||||||
mode %= MODE_AMOUNT;
|
mode %= REMOTE_MODE_AMOUNT;
|
||||||
|
|
||||||
free(current_list->tp_search);
|
free(current_list->tp_search);
|
||||||
current_list->tp_search = strdup("");
|
current_list->tp_search = strdup("");
|
||||||
@@ -564,8 +608,9 @@ bool themeplaza_browser(EntryMode mode)
|
|||||||
toggle_preview:
|
toggle_preview:
|
||||||
if (!preview_mode)
|
if (!preview_mode)
|
||||||
{
|
{
|
||||||
preview_mode = load_remote_preview(current_entry, &preview, &preview_offset);
|
u32 height = mode == REMOTE_MODE_BADGES ? 1024 : 480;
|
||||||
if (mode == MODE_THEMES && dspfirm)
|
preview_mode = load_remote_preview(current_entry, &preview, &preview_offset, height);
|
||||||
|
if (mode == REMOTE_MODE_THEMES && dspfirm)
|
||||||
{
|
{
|
||||||
load_remote_bgm(current_entry);
|
load_remote_bgm(current_entry);
|
||||||
audio = calloc(1, sizeof(audio_s));
|
audio = calloc(1, sizeof(audio_s));
|
||||||
@@ -576,7 +621,7 @@ bool themeplaza_browser(EntryMode mode)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
preview_mode = false;
|
preview_mode = false;
|
||||||
if (mode == MODE_THEMES && audio != NULL)
|
if (mode == REMOTE_MODE_THEMES && audio != NULL)
|
||||||
{
|
{
|
||||||
stop_audio(&audio);
|
stop_audio(&audio);
|
||||||
}
|
}
|
||||||
@@ -588,7 +633,7 @@ bool themeplaza_browser(EntryMode mode)
|
|||||||
if (preview_mode)
|
if (preview_mode)
|
||||||
{
|
{
|
||||||
preview_mode = false;
|
preview_mode = false;
|
||||||
if (mode == MODE_THEMES && audio != NULL)
|
if (mode == REMOTE_MODE_THEMES && audio != NULL)
|
||||||
{
|
{
|
||||||
stop_audio(&audio);
|
stop_audio(&audio);
|
||||||
}
|
}
|
||||||
@@ -654,7 +699,7 @@ bool themeplaza_browser(EntryMode mode)
|
|||||||
if (preview_mode)
|
if (preview_mode)
|
||||||
{
|
{
|
||||||
preview_mode = false;
|
preview_mode = false;
|
||||||
if (mode == MODE_THEMES && audio)
|
if (mode == REMOTE_MODE_THEMES && audio)
|
||||||
{
|
{
|
||||||
stop_audio(&audio);
|
stop_audio(&audio);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -187,6 +187,7 @@ const Language_s language_english = {
|
|||||||
.sel = "Sel.:",
|
.sel = "Sel.:",
|
||||||
.tp_theme_mode = "ThemePlaza Theme mode",
|
.tp_theme_mode = "ThemePlaza Theme mode",
|
||||||
.tp_splash_mode = "ThemePlaza Splash mode",
|
.tp_splash_mode = "ThemePlaza Splash mode",
|
||||||
|
.tp_badge_mode = "ThemePlaza Badge mode",
|
||||||
.search = "Search...",
|
.search = "Search...",
|
||||||
.page = "Page:",
|
.page = "Page:",
|
||||||
.err_quit = "Press \uE000 to quit.",
|
.err_quit = "Press \uE000 to quit.",
|
||||||
@@ -206,6 +207,7 @@ const Language_s language_english = {
|
|||||||
.delete_sd = "Deleting from SD...",
|
.delete_sd = "Deleting from SD...",
|
||||||
.download_themes = "Downloading theme list, please wait...",
|
.download_themes = "Downloading theme list, please wait...",
|
||||||
.download_splashes = "Downloading splash list, please wait...",
|
.download_splashes = "Downloading splash list, please wait...",
|
||||||
|
.download_badges = "Downloading badge list, please wait...",
|
||||||
.download_preview = "Downloading preview, please wait...",
|
.download_preview = "Downloading preview, please wait...",
|
||||||
.download_bgm = "Downloading BGM, please wait...",
|
.download_bgm = "Downloading BGM, please wait...",
|
||||||
.dump_single = "Dumping theme, please wait...",
|
.dump_single = "Dumping theme, please wait...",
|
||||||
@@ -320,6 +322,27 @@ const Language_s language_english = {
|
|||||||
NULL
|
NULL
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.info_line = NULL,
|
||||||
|
.instructions = {
|
||||||
|
{
|
||||||
|
"\uE000 Download badges",
|
||||||
|
"\uE001 Go back"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"\uE002 More options",
|
||||||
|
"\uE003 Preview badges"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"\uE004 Previous page",
|
||||||
|
"\uE005 Next page"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Exit",
|
||||||
|
NULL
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
.remote_extra_instructions =
|
.remote_extra_instructions =
|
||||||
@@ -360,7 +383,7 @@ const Language_s language_english = {
|
|||||||
},
|
},
|
||||||
.badges =
|
.badges =
|
||||||
{
|
{
|
||||||
.extdata_locked = "Ext Data Locked\nTry restarting Anemone3DS, or using\nthe CIA version instead."
|
.extdata_locked = "Ext Data Locked\nTry pressing the Home Button and then returning\nto Anemone3DS, or using the CIA version instead."
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -524,6 +547,7 @@ const Language_s language_french = {
|
|||||||
.sel = "Sél.:",
|
.sel = "Sél.:",
|
||||||
.tp_theme_mode = "Thèmes de ThemePlaza",
|
.tp_theme_mode = "Thèmes de ThemePlaza",
|
||||||
.tp_splash_mode = "Splashs de ThemePlaza",
|
.tp_splash_mode = "Splashs de ThemePlaza",
|
||||||
|
.tp_badge_mode = "ThemePlaza Badge mode",
|
||||||
.search = "Rechercher...",
|
.search = "Rechercher...",
|
||||||
.page = "Page:",
|
.page = "Page:",
|
||||||
.err_quit = "Appuyez sur \uE000 pour quitter.",
|
.err_quit = "Appuyez sur \uE000 pour quitter.",
|
||||||
@@ -543,6 +567,7 @@ const Language_s language_french = {
|
|||||||
.delete_sd = "Effacement...",
|
.delete_sd = "Effacement...",
|
||||||
.download_themes = "Téléchargement de la liste des thèmes,\nveuillez patienter...",
|
.download_themes = "Téléchargement de la liste des thèmes,\nveuillez patienter...",
|
||||||
.download_splashes = "Téléchargement de la liste des splashs,\nveuillez patienter...",
|
.download_splashes = "Téléchargement de la liste des splashs,\nveuillez patienter...",
|
||||||
|
.download_badges = "Downloading badge list, please wait...",
|
||||||
.download_preview = "Téléchargement de l'aperçu,\nveuillez patienter...",
|
.download_preview = "Téléchargement de l'aperçu,\nveuillez patienter...",
|
||||||
.download_bgm = "Téléchargement de la musique,\nveuillez patienter...",
|
.download_bgm = "Téléchargement de la musique,\nveuillez patienter...",
|
||||||
.dump_single = "Extraction du thème installé,\nveuillez patienter...",
|
.dump_single = "Extraction du thème installé,\nveuillez patienter...",
|
||||||
@@ -657,6 +682,27 @@ const Language_s language_french = {
|
|||||||
NULL
|
NULL
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.info_line = NULL,
|
||||||
|
.instructions = {
|
||||||
|
{
|
||||||
|
"\uE000 Download badges",
|
||||||
|
"\uE001 Go back"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"\uE002 More options",
|
||||||
|
"\uE003 Preview badges"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"\uE004 Previous page",
|
||||||
|
"\uE005 Next page"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Exit",
|
||||||
|
NULL
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
.remote_extra_instructions =
|
.remote_extra_instructions =
|
||||||
@@ -697,7 +743,7 @@ const Language_s language_french = {
|
|||||||
},
|
},
|
||||||
.badges =
|
.badges =
|
||||||
{
|
{
|
||||||
.extdata_locked = "Ext Data Locked\nTry restarting Anemone3DS, or using\nthe CIA version instead."
|
.extdata_locked = "Ext Data Locked\nTry pressing the Home Button and then returning\nto Anemone3DS, or using the CIA version instead."
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -861,6 +907,7 @@ const Language_s language_portuguese = {
|
|||||||
.sel = "Sel.:",
|
.sel = "Sel.:",
|
||||||
.tp_theme_mode = "Modo de tema ThemePlaza",
|
.tp_theme_mode = "Modo de tema ThemePlaza",
|
||||||
.tp_splash_mode = "Modo de splash ThemePlaza",
|
.tp_splash_mode = "Modo de splash ThemePlaza",
|
||||||
|
.tp_badge_mode = "ThemePlaza Badge mode",
|
||||||
.search = "Pesquisar...",
|
.search = "Pesquisar...",
|
||||||
.page = "Página:",
|
.page = "Página:",
|
||||||
.err_quit = "Aperte \uE000 para sair.",
|
.err_quit = "Aperte \uE000 para sair.",
|
||||||
@@ -880,6 +927,7 @@ const Language_s language_portuguese = {
|
|||||||
.delete_sd = "Deletando do SD...",
|
.delete_sd = "Deletando do SD...",
|
||||||
.download_themes = "Baixando a lista de temas, aguarde...",
|
.download_themes = "Baixando a lista de temas, aguarde...",
|
||||||
.download_splashes = "Baixando a lista de splashes, aguarde...",
|
.download_splashes = "Baixando a lista de splashes, aguarde...",
|
||||||
|
.download_badges = "Downloading badge list, please wait...",
|
||||||
.download_preview = "Baixando prévia, aguarde...",
|
.download_preview = "Baixando prévia, aguarde...",
|
||||||
.download_bgm = "Baixando BGM, aguarde...",
|
.download_bgm = "Baixando BGM, aguarde...",
|
||||||
.dump_single = "Exportando tema, aguarde...",
|
.dump_single = "Exportando tema, aguarde...",
|
||||||
@@ -994,6 +1042,27 @@ const Language_s language_portuguese = {
|
|||||||
NULL
|
NULL
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.info_line = NULL,
|
||||||
|
.instructions = {
|
||||||
|
{
|
||||||
|
"\uE000 Download badges",
|
||||||
|
"\uE001 Go back"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"\uE002 More options",
|
||||||
|
"\uE003 Preview badges"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"\uE004 Previous page",
|
||||||
|
"\uE005 Next page"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Exit",
|
||||||
|
NULL
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
.remote_extra_instructions =
|
.remote_extra_instructions =
|
||||||
@@ -1034,7 +1103,7 @@ const Language_s language_portuguese = {
|
|||||||
},
|
},
|
||||||
.badges =
|
.badges =
|
||||||
{
|
{
|
||||||
.extdata_locked = "Ext Data Locked\nTry restarting Anemone3DS, or using\nthe CIA version instead."
|
.extdata_locked = "Ext Data Locked\nTry pressing the Home Button and then returning\nto Anemone3DS, or using the CIA version instead."
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user