Cheevos badges

This commit is contained in:
GameDragon2k 2017-11-23 06:58:19 -05:00
parent 63090ae2e4
commit cfe59bcf2a
6 changed files with 102 additions and 68 deletions

View File

@ -1,6 +1,7 @@
#include <file/file_path.h>
#include <streams/file_stream.h>
#include "../file_path_special.h"
#include "../verbosity.h"
#include "../network/net_http_special.h"
@ -8,49 +9,12 @@
badges_ctx_t badges_ctx;
bool download_badge(const char* filename)
bool badge_exists(const char* filepath)
{
char fullpath[PATH_MAX_LENGTH];
strcpy(fullpath, "badges/");
strcat(fullpath, filename);
if(path_file_exists(fullpath))
{
if(path_file_exists(filepath))
return true;
}
else
{
size_t mysize = 1024 * 100;
size_t *size;
size = &mysize;
const char **buffer = malloc(sizeof(*buffer) * mysize);
char url[PATH_MAX_LENGTH];
strcpy(url, "http://i.retroachievements.org/Badge/");
strcat(url, filename);
retro_time_t *timeout;
retro_time_t timesecs = 10000000; //10 seconds
timeout = &timesecs;
if(net_http_get(buffer, size, url, timeout) != NET_HTTP_GET_OK)
{
printf("[CHEEVOS]: Download to %s failed.\n", fullpath);
return false;
}
if (!filestream_write_file(fullpath, *buffer, *size))
{
printf("[CHEEVOS]: Write to %s failed.\n", fullpath);
return false;
}
else
{
printf("[CHEEVOS]: %s downloaded.\n", fullpath);
return true;
}
}
return false;
}
void set_badge_menu_texture(badges_ctx_t * badges, int i)
@ -63,8 +27,12 @@ void set_badge_menu_texture(badges_ctx_t * badges, int i)
snprintf(badge_file, bufferSize, "%s", badges->badge_id_list[i]);
strcat(badge_file, locked_suffix);
// Badge directory should probably use a definition
menu_display_reset_textures_list(badge_file, "badges", &badges->menu_texture_list[i],TEXTURE_FILTER_MIPMAP_LINEAR);
char fullpath[PATH_MAX_LENGTH];
fill_pathname_application_special(fullpath,
PATH_MAX_LENGTH * sizeof(char),
APPLICATION_SPECIAL_DIRECTORY_THUMBNAILS_CHEEVOS_BADGES);
menu_display_reset_textures_list(badge_file, fullpath, &badges->menu_texture_list[i],TEXTURE_FILTER_MIPMAP_LINEAR);
}
void set_badge_info (badges_ctx_t *badge_struct, int id, const char *badge_id, bool active)

View File

@ -16,10 +16,10 @@ typedef struct
menu_texture_item menu_texture_list[CHEEVOS_BADGE_LIMIT];
} badges_ctx_t;
bool badge_exists(const char* filepath);
void set_badge_menu_texture(badges_ctx_t * badges, int i);
extern void set_badge_info (badges_ctx_t *badge_struct, int id, const char *badge_id, bool active);
extern menu_texture_item get_badge_texture(int id);
extern bool download_badge(const char* filename);
extern badges_ctx_t badges_ctx;

View File

@ -16,6 +16,7 @@
#include <string.h>
#include <ctype.h>
#include <file/file_path.h>
#include <formats/jsonsax.h>
#include <streams/file_stream.h>
#include <features/features_cpu.h>
@ -40,6 +41,7 @@
#include "var.h"
#include "cond.h"
#include "../file_path_special.h"
#include "../command.h"
#include "../dynamic.h"
#include "../configuration.h"
@ -77,6 +79,9 @@
* THE USER'S PASSWORD, TAKE CARE! */
#undef CHEEVOS_LOG_PASSWORD
/* Define this macro to log downloaded badge images. */
#undef CHEEVOS_LOG_BADGES
/* C89 wants only int values in enums. */
#define CHEEVOS_JSON_KEY_GAMEID 0xb4960eecU
#define CHEEVOS_JSON_KEY_ACHIEVEMENTS 0x69749ae1U
@ -2856,6 +2861,8 @@ static int cheevos_iterate(coro_t* coro)
runloop_msg_queue_push(msg, 0, 6 * 60, false);
}
CORO_GOSUB(GET_BADGES);
CORO_STOP();
/**************************************************************************
@ -3163,24 +3170,54 @@ static int cheevos_iterate(coro_t* coro)
CORO_SUB(GET_BADGES)
char badge_filename[16];
char fullpath[PATH_MAX_LENGTH];
FILE* file;
cheevo_t *cheevo = cheevos_locals.core.cheevos;
const cheevo_t *end = cheevos_locals.core.cheevos +
cheevos_locals.core.count;
for (unsigned i = 0; cheevo < end ; cheevo++)
{
strcpy(badge_filename, cheevo->badge);
strcat(badge_filename, ".png");
if (!download_badge(badge_filename))
break;
for (unsigned j = 0; j < 2; j++)
{
strcpy(badge_filename, cheevo->badge);
if (j == 0) strcat(badge_filename, ".png");
else strcat(badge_filename, "_lock.png");
strcpy(badge_filename, cheevo->badge);
strcat(badge_filename, "_lock.png");
if (!download_badge(badge_filename))
break;
fill_pathname_application_special(fullpath,
PATH_MAX_LENGTH * sizeof(char),
APPLICATION_SPECIAL_DIRECTORY_THUMBNAILS_CHEEVOS_BADGES);
if (!path_is_directory(fullpath))
path_mkdir(fullpath);
strcat(fullpath, badge_filename);
if (!badge_exists(fullpath))
{
snprintf(
CHEEVOS_VAR_URL, sizeof(CHEEVOS_VAR_URL),
"http://i.retroachievements.org/Badge/%s",
badge_filename
);
CORO_GOSUB(HTTP_GET);
if (CHEEVOS_VAR_K > 5)
{
file = fopen (fullpath, "wb");
fwrite(CHEEVOS_VAR_JSON, 1, CHEEVOS_VAR_K, file);
fclose(file);
#ifdef CHEEVOS_LOG_BADGES
RARCH_LOG("[CHEEVOS]: downloaded badge %s.\n", badge_filename);
#endif
}
}
}
}
CORO_RET();
CORO_RET();
/**************************************************************************
* Info Logs in the user at Retro Achievements
@ -3323,6 +3360,7 @@ static int cheevos_iterate(coro_t* coro)
CHEEVOS_VAR_JSON[length] = 0;
}
CHEEVOS_VAR_K = length;
net_http_delete(CHEEVOS_VAR_HTTP);
net_http_connection_free(CHEEVOS_VAR_CONN);
CORO_RET();

View File

@ -501,6 +501,31 @@ void fill_pathname_application_special(char *s,
}
#endif
break;
case APPLICATION_SPECIAL_DIRECTORY_THUMBNAILS_CHEEVOS_BADGES:
{
char *s1 = (char*)malloc(PATH_MAX_LENGTH * sizeof(char));
char *s2 = (char*)malloc(PATH_MAX_LENGTH * sizeof(char));
settings_t *settings = config_get_ptr();
s1[0] = s2[0] = '\0';
fill_pathname_join(s1,
settings->paths.directory_thumbnails,
"cheevos",
len);
fill_pathname_join(s2,
s1, "badges",
PATH_MAX_LENGTH * sizeof(char)
);
fill_pathname_slash(s2,
PATH_MAX_LENGTH * sizeof(char)
);
strlcpy(s, s2, len);
free(s1);
free(s2);
}
break;
case APPLICATION_SPECIAL_NONE:
default:
break;

View File

@ -104,7 +104,8 @@ enum application_special_type
APPLICATION_SPECIAL_DIRECTORY_ASSETS_XMB_FONT,
APPLICATION_SPECIAL_DIRECTORY_ASSETS_ZARCH,
APPLICATION_SPECIAL_DIRECTORY_ASSETS_ZARCH_FONT,
APPLICATION_SPECIAL_DIRECTORY_ASSETS_ZARCH_ICONS
APPLICATION_SPECIAL_DIRECTORY_ASSETS_ZARCH_ICONS,
APPLICATION_SPECIAL_DIRECTORY_THUMBNAILS_CHEEVOS_BADGES
};
/**

View File

@ -2245,9 +2245,11 @@ static uintptr_t xmb_icon_get_id(xmb_handle_t *xmb,
if ((type >= MENU_SETTINGS_CHEEVOS_START) &&
(type < MENU_SETTINGS_NETPLAY_ROOMS_START))
{
//return badges_ctx.menu_texture_list[type - MENU_SETTINGS_CHEEVOS_START];
int new_id = type - MENU_SETTINGS_CHEEVOS_START;
return get_badge_texture( new_id );
if ( get_badge_texture(new_id) != 0 )
return get_badge_texture( new_id );
else
return xmb->textures.list[XMB_TEXTURE_SUBSETTING]; // Should be replaced with placeholder badge icon.
}
#endif