mirror of
https://github.com/libretro/RetroArch
synced 2025-04-01 04:20:27 +00:00
(Cheevos) Stylistic changes; try to fit text within 80-char limit,
remove brackets around conditionals that exist out of one line, etc.
This commit is contained in:
parent
8328043897
commit
bbabbd1373
@ -279,7 +279,7 @@ static void rcheevos_filter_url_param(char* url, char* param)
|
|||||||
size_t param_len = strlen(param);
|
size_t param_len = strlen(param);
|
||||||
char *start = strchr(url, '?');
|
char *start = strchr(url, '?');
|
||||||
if (!start)
|
if (!start)
|
||||||
start = url;
|
start = url;
|
||||||
else
|
else
|
||||||
++start;
|
++start;
|
||||||
|
|
||||||
@ -290,11 +290,11 @@ static void rcheevos_filter_url_param(char* url, char* param)
|
|||||||
if (start[param_len] == '=' && memcmp(start, param, param_len) == 0)
|
if (start[param_len] == '=' && memcmp(start, param, param_len) == 0)
|
||||||
{
|
{
|
||||||
if (next)
|
if (next)
|
||||||
strcpy(start, next + 1);
|
strcpy_literal(start, next + 1);
|
||||||
else if (start > url)
|
else if (start > url)
|
||||||
start[-1] = '\0';
|
start[-1] = '\0';
|
||||||
else
|
else
|
||||||
*start = '\0';
|
*start = '\0';
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -361,7 +361,8 @@ static void rcheevos_log_post_url(
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool rcheevos_condset_contains_memref(const rc_condset_t* condset, const rc_memref_value_t* memref)
|
static bool rcheevos_condset_contains_memref(const rc_condset_t* condset,
|
||||||
|
const rc_memref_value_t* memref)
|
||||||
{
|
{
|
||||||
if (condset)
|
if (condset)
|
||||||
{
|
{
|
||||||
@ -377,7 +378,8 @@ static bool rcheevos_condset_contains_memref(const rc_condset_t* condset, const
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool rcheevos_trigger_contains_memref(const rc_trigger_t* trigger, const rc_memref_value_t* memref)
|
static bool rcheevos_trigger_contains_memref(const rc_trigger_t* trigger,
|
||||||
|
const rc_memref_value_t* memref)
|
||||||
{
|
{
|
||||||
rc_condset_t* condset;
|
rc_condset_t* condset;
|
||||||
if (!trigger)
|
if (!trigger)
|
||||||
@ -400,9 +402,10 @@ static void rcheevos_invalidate_address(unsigned address)
|
|||||||
unsigned i, count;
|
unsigned i, count;
|
||||||
rcheevos_racheevo_t* cheevo = NULL;
|
rcheevos_racheevo_t* cheevo = NULL;
|
||||||
rcheevos_ralboard_t* lboard = NULL;
|
rcheevos_ralboard_t* lboard = NULL;
|
||||||
/* remove the invalid memref from the chain so we don't try to evaluate it in the future.
|
/* Remove the invalid memref from the chain so we don't
|
||||||
* it's still there, so anything referencing it will continue to fetch 0.
|
* try to evaluate it in the future.
|
||||||
*/
|
* It's still there, so anything referencing it will
|
||||||
|
* continue to fetch 0. */
|
||||||
rc_memref_value_t **last_memref = &rcheevos_locals.runtime.memrefs;
|
rc_memref_value_t **last_memref = &rcheevos_locals.runtime.memrefs;
|
||||||
rc_memref_value_t *memref = *last_memref;
|
rc_memref_value_t *memref = *last_memref;
|
||||||
|
|
||||||
@ -416,7 +419,7 @@ static void rcheevos_invalidate_address(unsigned address)
|
|||||||
|
|
||||||
last_memref = &memref->next;
|
last_memref = &memref->next;
|
||||||
memref = *last_memref;
|
memref = *last_memref;
|
||||||
} while (memref);
|
} while(memref);
|
||||||
|
|
||||||
/* If the address is only used indirectly,
|
/* If the address is only used indirectly,
|
||||||
* don't disable anything dependent on it */
|
* don't disable anything dependent on it */
|
||||||
@ -441,11 +444,14 @@ static void rcheevos_invalidate_address(unsigned address)
|
|||||||
{
|
{
|
||||||
if (cheevo->memaddr)
|
if (cheevo->memaddr)
|
||||||
{
|
{
|
||||||
const rc_trigger_t* trigger = rc_runtime_get_achievement(&rcheevos_locals.runtime, cheevo->id);
|
const rc_trigger_t* trigger = rc_runtime_get_achievement(
|
||||||
|
&rcheevos_locals.runtime, cheevo->id);
|
||||||
|
|
||||||
if (trigger && rcheevos_trigger_contains_memref(trigger, memref))
|
if (trigger && rcheevos_trigger_contains_memref(trigger, memref))
|
||||||
{
|
{
|
||||||
CHEEVOS_ERR(RCHEEVOS_TAG "Achievement disabled (invalid address %06X): %s\n", address, cheevo->title);
|
CHEEVOS_ERR(RCHEEVOS_TAG "Achievement disabled (invalid address %06X): %s\n", address, cheevo->title);
|
||||||
rc_runtime_deactivate_achievement(&rcheevos_locals.runtime, cheevo->id);
|
rc_runtime_deactivate_achievement(&rcheevos_locals.runtime,
|
||||||
|
cheevo->id);
|
||||||
|
|
||||||
CHEEVOS_FREE(cheevo->memaddr);
|
CHEEVOS_FREE(cheevo->memaddr);
|
||||||
cheevo->memaddr = NULL;
|
cheevo->memaddr = NULL;
|
||||||
@ -462,12 +468,16 @@ static void rcheevos_invalidate_address(unsigned address)
|
|||||||
{
|
{
|
||||||
if (lboard->mem)
|
if (lboard->mem)
|
||||||
{
|
{
|
||||||
const rc_lboard_t* rc_lboard = rc_runtime_get_lboard(&rcheevos_locals.runtime, lboard->id);
|
const rc_lboard_t* rc_lboard = rc_runtime_get_lboard(
|
||||||
if (rc_lboard &&
|
&rcheevos_locals.runtime, lboard->id);
|
||||||
(rcheevos_trigger_contains_memref(&rc_lboard->start, memref) ||
|
|
||||||
|
if ( rc_lboard &&
|
||||||
|
( rcheevos_trigger_contains_memref(&rc_lboard->start, memref) ||
|
||||||
rcheevos_trigger_contains_memref(&rc_lboard->cancel, memref) ||
|
rcheevos_trigger_contains_memref(&rc_lboard->cancel, memref) ||
|
||||||
rcheevos_trigger_contains_memref(&rc_lboard->submit, memref) ||
|
rcheevos_trigger_contains_memref(&rc_lboard->submit, memref) ||
|
||||||
rcheevos_condset_contains_memref(rc_lboard->value.conditions, memref)))
|
rcheevos_condset_contains_memref(rc_lboard->value.conditions,
|
||||||
|
memref))
|
||||||
|
)
|
||||||
{
|
{
|
||||||
CHEEVOS_ERR(RCHEEVOS_TAG "Leaderboard disabled (invalid address %06X): %s\n", address, lboard->title);
|
CHEEVOS_ERR(RCHEEVOS_TAG "Leaderboard disabled (invalid address %06X): %s\n", address, lboard->title);
|
||||||
rc_runtime_deactivate_lboard(&rcheevos_locals.runtime, lboard->id);
|
rc_runtime_deactivate_lboard(&rcheevos_locals.runtime, lboard->id);
|
||||||
@ -512,7 +522,12 @@ static void rcheevos_async_award_achievement(
|
|||||||
{
|
{
|
||||||
char buffer[256];
|
char buffer[256];
|
||||||
settings_t *settings = config_get_ptr();
|
settings_t *settings = config_get_ptr();
|
||||||
int ret = rc_url_award_cheevo(buffer, sizeof(buffer), settings->arrays.cheevos_username, locals->token, request->id, request->hardcore, locals->hash);
|
int ret = rc_url_award_cheevo(buffer, sizeof(buffer),
|
||||||
|
settings->arrays.cheevos_username,
|
||||||
|
locals->token,
|
||||||
|
request->id,
|
||||||
|
request->hardcore,
|
||||||
|
locals->hash);
|
||||||
|
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
{
|
{
|
||||||
@ -522,11 +537,13 @@ static void rcheevos_async_award_achievement(
|
|||||||
}
|
}
|
||||||
|
|
||||||
rcheevos_log_url("rc_url_award_cheevo", buffer);
|
rcheevos_log_url("rc_url_award_cheevo", buffer);
|
||||||
task_push_http_transfer_with_user_agent(buffer, true, NULL, request->user_agent, rcheevos_async_task_callback, request);
|
task_push_http_transfer_with_user_agent(buffer, true, NULL,
|
||||||
|
request->user_agent, rcheevos_async_task_callback, request);
|
||||||
|
|
||||||
#ifdef HAVE_AUDIOMIXER
|
#ifdef HAVE_AUDIOMIXER
|
||||||
if (settings->bools.cheevos_unlock_sound_enable)
|
if (settings->bools.cheevos_unlock_sound_enable)
|
||||||
audio_driver_mixer_play_menu_sound(AUDIO_MIXER_SYSTEM_SLOT_ACHIEVEMENT_UNLOCK);
|
audio_driver_mixer_play_menu_sound(
|
||||||
|
AUDIO_MIXER_SYSTEM_SLOT_ACHIEVEMENT_UNLOCK);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -622,44 +639,47 @@ static void rcheevos_async_schedule(
|
|||||||
static void rcheevos_async_task_callback(
|
static void rcheevos_async_task_callback(
|
||||||
retro_task_t* task, void* task_data, void* user_data, const char* error)
|
retro_task_t* task, void* task_data, void* user_data, const char* error)
|
||||||
{
|
{
|
||||||
rcheevos_async_io_request* request = (rcheevos_async_io_request*)user_data;
|
rcheevos_async_io_request *request = (rcheevos_async_io_request*)user_data;
|
||||||
http_transfer_data_t* data = (http_transfer_data_t*)task_data;
|
http_transfer_data_t *data = (http_transfer_data_t*)task_data;
|
||||||
|
|
||||||
if (!error)
|
if (!error)
|
||||||
{
|
{
|
||||||
char buffer[224] = "";
|
char buffer[224] = "";
|
||||||
|
/* Server did not return HTTP headers */
|
||||||
if (!data)
|
if (!data)
|
||||||
{
|
|
||||||
/* server did not return HTTP headers */
|
|
||||||
snprintf(buffer, sizeof(buffer), "Server communication error");
|
snprintf(buffer, sizeof(buffer), "Server communication error");
|
||||||
}
|
|
||||||
else if (data->status != 200)
|
else if (data->status != 200)
|
||||||
{
|
{
|
||||||
/* server returned an error via status code - check to see if it also returned a JSON error */
|
/* Server returned an error via status code.
|
||||||
|
* Check to see if it also returned a JSON error */
|
||||||
if (!data->data || rcheevos_get_json_error(data->data, buffer, sizeof(buffer)) != RC_OK)
|
if (!data->data || rcheevos_get_json_error(data->data, buffer, sizeof(buffer)) != RC_OK)
|
||||||
snprintf(buffer, sizeof(buffer), "HTTP error code: %d", data->status);
|
snprintf(buffer, sizeof(buffer), "HTTP error code: %d",
|
||||||
|
data->status);
|
||||||
}
|
}
|
||||||
else if (!data->data || !data->len)
|
else if (!data->data || !data->len)
|
||||||
{
|
{
|
||||||
/* server sent an empty response without an error status code */
|
/* Server sent an empty response without an error status code */
|
||||||
snprintf(buffer, sizeof(buffer), "No response from server");
|
snprintf(buffer, sizeof(buffer), "No response from server");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* server sent a message - assume its JSON and check for a JSON error */
|
/* Server sent a message - assume it's JSON
|
||||||
|
* and check for a JSON error */
|
||||||
rcheevos_get_json_error(data->data, buffer, sizeof(buffer));
|
rcheevos_get_json_error(data->data, buffer, sizeof(buffer));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (buffer[0])
|
if (buffer[0])
|
||||||
{
|
{
|
||||||
char errbuf[256];
|
char errbuf[256];
|
||||||
snprintf(errbuf, sizeof(errbuf), "%s %u: %s", request->failure_message, request->id, buffer);
|
snprintf(errbuf, sizeof(errbuf), "%s %u: %s",
|
||||||
|
request->failure_message, request->id, buffer);
|
||||||
CHEEVOS_LOG(RCHEEVOS_TAG "%s\n", errbuf);
|
CHEEVOS_LOG(RCHEEVOS_TAG "%s\n", errbuf);
|
||||||
|
|
||||||
switch (request->type)
|
switch (request->type)
|
||||||
{
|
{
|
||||||
case CHEEVOS_ASYNC_RICHPRESENCE:
|
case CHEEVOS_ASYNC_RICHPRESENCE:
|
||||||
/* don't bother informing user when rich presence update fails */
|
/* Don't bother informing user when
|
||||||
|
* rich presence update fails */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CHEEVOS_ASYNC_AWARD_ACHIEVEMENT:
|
case CHEEVOS_ASYNC_AWARD_ACHIEVEMENT:
|
||||||
@ -684,14 +704,19 @@ static void rcheevos_async_task_callback(
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* double the wait between each attempt until we hit a maximum delay of two minutes
|
/* Double the wait between each attempt until we hit
|
||||||
|
* a maximum delay of two minutes.
|
||||||
* 250ms -> 500ms -> 1s -> 2s -> 4s -> 8s -> 16s -> 32s -> 64s -> 120s -> 120s... */
|
* 250ms -> 500ms -> 1s -> 2s -> 4s -> 8s -> 16s -> 32s -> 64s -> 120s -> 120s... */
|
||||||
retro_time_t retry_delay = (request->attempt_count > 8) ? (120 * 1000 * 1000) : ((250 * 1000) << request->attempt_count);
|
retro_time_t retry_delay =
|
||||||
|
(request->attempt_count > 8)
|
||||||
|
? (120 * 1000 * 1000)
|
||||||
|
: ((250 * 1000) << request->attempt_count);
|
||||||
|
|
||||||
request->attempt_count++;
|
request->attempt_count++;
|
||||||
rcheevos_async_schedule(request, retry_delay);
|
rcheevos_async_schedule(request, retry_delay);
|
||||||
|
|
||||||
CHEEVOS_ERR(RCHEEVOS_TAG "%s %u: %s\n", request->failure_message, request->id, error);
|
CHEEVOS_ERR(RCHEEVOS_TAG "%s %u: %s\n", request->failure_message,
|
||||||
|
request->id, error);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data)
|
if (data)
|
||||||
@ -710,7 +735,8 @@ static void rcheevos_validate_memrefs(rcheevos_locals_t* locals)
|
|||||||
{
|
{
|
||||||
if (!memref->memref.is_indirect)
|
if (!memref->memref.is_indirect)
|
||||||
{
|
{
|
||||||
uint8_t* data = rcheevos_memory_find(&rcheevos_locals.memory, memref->memref.address);
|
uint8_t* data = rcheevos_memory_find(&rcheevos_locals.memory,
|
||||||
|
memref->memref.address);
|
||||||
if (!data)
|
if (!data)
|
||||||
rcheevos_invalidate_address(memref->memref.address);
|
rcheevos_invalidate_address(memref->memref.address);
|
||||||
}
|
}
|
||||||
@ -722,14 +748,15 @@ static void rcheevos_validate_memrefs(rcheevos_locals_t* locals)
|
|||||||
static void rcheevos_activate_achievements(rcheevos_locals_t *locals,
|
static void rcheevos_activate_achievements(rcheevos_locals_t *locals,
|
||||||
rcheevos_racheevo_t* cheevo, unsigned count, unsigned flags)
|
rcheevos_racheevo_t* cheevo, unsigned count, unsigned flags)
|
||||||
{
|
{
|
||||||
settings_t *settings = config_get_ptr();
|
|
||||||
char buffer[256];
|
|
||||||
unsigned i;
|
|
||||||
int res;
|
int res;
|
||||||
|
unsigned i;
|
||||||
|
char buffer[256];
|
||||||
|
settings_t *settings = config_get_ptr();
|
||||||
|
|
||||||
for (i = 0; i < count; i++, cheevo++)
|
for (i = 0; i < count; i++, cheevo++)
|
||||||
{
|
{
|
||||||
res = rc_runtime_activate_achievement(&locals->runtime, cheevo->id, cheevo->memaddr, NULL, 0);
|
res = rc_runtime_activate_achievement(&locals->runtime, cheevo->id,
|
||||||
|
cheevo->memaddr, NULL, 0);
|
||||||
|
|
||||||
if (res < 0)
|
if (res < 0)
|
||||||
{
|
{
|
||||||
@ -738,7 +765,8 @@ static void rcheevos_activate_achievements(rcheevos_locals_t *locals,
|
|||||||
cheevo->id, cheevo->title, rc_error_str(res));
|
cheevo->id, cheevo->title, rc_error_str(res));
|
||||||
|
|
||||||
if (settings->bools.cheevos_verbose_enable)
|
if (settings->bools.cheevos_verbose_enable)
|
||||||
runloop_msg_queue_push(buffer, 0, 4 * 60, false, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO);
|
runloop_msg_queue_push(buffer, 0, 4 * 60, false, NULL,
|
||||||
|
MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO);
|
||||||
|
|
||||||
CHEEVOS_ERR(RCHEEVOS_TAG "%s: mem %s\n", buffer, cheevo->memaddr);
|
CHEEVOS_ERR(RCHEEVOS_TAG "%s: mem %s\n", buffer, cheevo->memaddr);
|
||||||
CHEEVOS_FREE(cheevo->memaddr);
|
CHEEVOS_FREE(cheevo->memaddr);
|
||||||
@ -746,7 +774,10 @@ static void rcheevos_activate_achievements(rcheevos_locals_t *locals,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
cheevo->active = RCHEEVOS_ACTIVE_SOFTCORE | RCHEEVOS_ACTIVE_HARDCORE | flags;
|
cheevo->active =
|
||||||
|
RCHEEVOS_ACTIVE_SOFTCORE
|
||||||
|
| RCHEEVOS_ACTIVE_HARDCORE
|
||||||
|
| flags;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -762,9 +793,9 @@ static int rcheevos_parse(rcheevos_locals_t *locals, const char* json)
|
|||||||
|
|
||||||
if (res != 0)
|
if (res != 0)
|
||||||
{
|
{
|
||||||
char* ptr = NULL;
|
char *ptr = NULL;
|
||||||
strcpy_literal(buffer, "Error retrieving achievement data: ");
|
strcpy_literal(buffer, "Error retrieving achievement data: ");
|
||||||
ptr = buffer + strlen(buffer);
|
ptr = buffer + strlen(buffer);
|
||||||
|
|
||||||
/* Extract the Error field from the JSON.
|
/* Extract the Error field from the JSON.
|
||||||
* If not found, remove the colon from the message. */
|
* If not found, remove the colon from the message. */
|
||||||
@ -807,17 +838,17 @@ static int rcheevos_parse(rcheevos_locals_t *locals, const char* json)
|
|||||||
rcheevos_locals.core_supports = false;
|
rcheevos_locals.core_supports = false;
|
||||||
|
|
||||||
if (settings->bools.cheevos_verbose_enable)
|
if (settings->bools.cheevos_verbose_enable)
|
||||||
{
|
|
||||||
runloop_msg_queue_push(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CANNOT_ACTIVATE_ACHIEVEMENTS_WITH_THIS_CORE),
|
runloop_msg_queue_push(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CANNOT_ACTIVATE_ACHIEVEMENTS_WITH_THIS_CORE),
|
||||||
0, 4 * 60, false, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_WARNING);
|
0, 4 * 60, false, NULL,
|
||||||
}
|
MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_WARNING);
|
||||||
|
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Initialize. */
|
/* Initialize. */
|
||||||
rcheevos_activate_achievements(locals, locals->patchdata.core, locals->patchdata.core_count, 0);
|
rcheevos_activate_achievements(locals, locals->patchdata.core,
|
||||||
|
locals->patchdata.core_count, 0);
|
||||||
|
|
||||||
if (settings->bools.cheevos_test_unofficial)
|
if (settings->bools.cheevos_test_unofficial)
|
||||||
rcheevos_activate_achievements(locals, locals->patchdata.unofficial,
|
rcheevos_activate_achievements(locals, locals->patchdata.unofficial,
|
||||||
@ -830,7 +861,8 @@ static int rcheevos_parse(rcheevos_locals_t *locals, const char* json)
|
|||||||
|
|
||||||
for (j = 0; j < count; j++, lboard++)
|
for (j = 0; j < count; j++, lboard++)
|
||||||
{
|
{
|
||||||
res = rc_runtime_activate_lboard(&locals->runtime, lboard->id, lboard->mem, NULL, 0);
|
res = rc_runtime_activate_lboard(&locals->runtime, lboard->id,
|
||||||
|
lboard->mem, NULL, 0);
|
||||||
|
|
||||||
if (res < 0)
|
if (res < 0)
|
||||||
{
|
{
|
||||||
@ -839,7 +871,8 @@ static int rcheevos_parse(rcheevos_locals_t *locals, const char* json)
|
|||||||
lboard->id, lboard->title, rc_error_str(res));
|
lboard->id, lboard->title, rc_error_str(res));
|
||||||
|
|
||||||
if (settings->bools.cheevos_verbose_enable)
|
if (settings->bools.cheevos_verbose_enable)
|
||||||
runloop_msg_queue_push(buffer, 0, 4 * 60, false, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO);
|
runloop_msg_queue_push(buffer, 0, 4 * 60, false, NULL,
|
||||||
|
MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO);
|
||||||
|
|
||||||
CHEEVOS_ERR(RCHEEVOS_TAG "%s mem: %s\n", buffer, lboard->mem);
|
CHEEVOS_ERR(RCHEEVOS_TAG "%s mem: %s\n", buffer, lboard->mem);
|
||||||
CHEEVOS_FREE(lboard->mem);
|
CHEEVOS_FREE(lboard->mem);
|
||||||
@ -853,7 +886,8 @@ static int rcheevos_parse(rcheevos_locals_t *locals, const char* json)
|
|||||||
if ( locals->patchdata.richpresence_script
|
if ( locals->patchdata.richpresence_script
|
||||||
&& *locals->patchdata.richpresence_script)
|
&& *locals->patchdata.richpresence_script)
|
||||||
{
|
{
|
||||||
res = rc_runtime_activate_richpresence(&locals->runtime, locals->patchdata.richpresence_script, NULL, 0);
|
res = rc_runtime_activate_richpresence(&locals->runtime,
|
||||||
|
locals->patchdata.richpresence_script, NULL, 0);
|
||||||
|
|
||||||
if (res < 0)
|
if (res < 0)
|
||||||
{
|
{
|
||||||
@ -862,7 +896,8 @@ static int rcheevos_parse(rcheevos_locals_t *locals, const char* json)
|
|||||||
rc_error_str(res));
|
rc_error_str(res));
|
||||||
|
|
||||||
if (settings->bools.cheevos_verbose_enable)
|
if (settings->bools.cheevos_verbose_enable)
|
||||||
runloop_msg_queue_push(buffer, 0, 4 * 60, false, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO);
|
runloop_msg_queue_push(buffer, 0, 4 * 60, false, NULL,
|
||||||
|
MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO);
|
||||||
|
|
||||||
CHEEVOS_ERR(RCHEEVOS_TAG "%s\n", buffer);
|
CHEEVOS_ERR(RCHEEVOS_TAG "%s\n", buffer);
|
||||||
}
|
}
|
||||||
@ -877,8 +912,10 @@ static int rcheevos_parse(rcheevos_locals_t *locals, const char* json)
|
|||||||
|
|
||||||
if (locals->runtime.richpresence_display_buffer)
|
if (locals->runtime.richpresence_display_buffer)
|
||||||
{
|
{
|
||||||
memcpy(locals->runtime.richpresence_display_buffer, "Playing ", 8);
|
memcpy(locals->runtime.richpresence_display_buffer,
|
||||||
memcpy(&locals->runtime.richpresence_display_buffer[8], locals->patchdata.title, len + 1);
|
"Playing ", 8);
|
||||||
|
memcpy(&locals->runtime.richpresence_display_buffer[8],
|
||||||
|
locals->patchdata.title, len + 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -925,7 +962,8 @@ static rcheevos_racheevo_t* rcheevos_find_cheevo(unsigned id)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rcheevos_award_achievement(rcheevos_locals_t *locals, rcheevos_racheevo_t* cheevo, bool widgets_ready)
|
static void rcheevos_award_achievement(rcheevos_locals_t *locals,
|
||||||
|
rcheevos_racheevo_t* cheevo, bool widgets_ready)
|
||||||
{
|
{
|
||||||
char buffer[256] = "";
|
char buffer[256] = "";
|
||||||
|
|
||||||
@ -950,9 +988,12 @@ static void rcheevos_award_achievement(rcheevos_locals_t *locals, rcheevos_rache
|
|||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
snprintf(buffer, sizeof(buffer), "Achievement Unlocked: %s", cheevo->title);
|
snprintf(buffer, sizeof(buffer),
|
||||||
runloop_msg_queue_push(buffer, 0, 2 * 60, false, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO);
|
"Achievement Unlocked: %s", cheevo->title);
|
||||||
runloop_msg_queue_push(cheevo->description, 0, 3 * 60, false, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO);
|
runloop_msg_queue_push(buffer, 0, 2 * 60, false, NULL,
|
||||||
|
MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO);
|
||||||
|
runloop_msg_queue_push(cheevo->description, 0, 3 * 60, false, NULL,
|
||||||
|
MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -986,10 +1027,15 @@ static void rcheevos_award_achievement(rcheevos_locals_t *locals, rcheevos_rache
|
|||||||
|
|
||||||
if (take_screenshot(settings->paths.directory_screenshot,
|
if (take_screenshot(settings->paths.directory_screenshot,
|
||||||
shotname, true,
|
shotname, true,
|
||||||
video_driver_cached_frame_has_valid_framebuffer(), false, true))
|
video_driver_cached_frame_has_valid_framebuffer(),
|
||||||
CHEEVOS_LOG(RCHEEVOS_TAG "Captured screenshot for achievement %u\n", cheevo->id);
|
false, true))
|
||||||
|
CHEEVOS_LOG(
|
||||||
|
RCHEEVOS_TAG "Captured screenshot for achievement %u\n",
|
||||||
|
cheevo->id);
|
||||||
else
|
else
|
||||||
CHEEVOS_LOG(RCHEEVOS_TAG "Failed to capture screenshot for achievement %u\n", cheevo->id);
|
CHEEVOS_LOG(
|
||||||
|
RCHEEVOS_TAG "Failed to capture screenshot for achievement %u\n",
|
||||||
|
cheevo->id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -1000,7 +1046,7 @@ static void rcheevos_async_submit_lboard(rcheevos_locals_t *locals,
|
|||||||
{
|
{
|
||||||
char buffer[256];
|
char buffer[256];
|
||||||
settings_t *settings = config_get_ptr();
|
settings_t *settings = config_get_ptr();
|
||||||
int ret = rc_url_submit_lboard(buffer, sizeof(buffer),
|
int ret = rc_url_submit_lboard(buffer, sizeof(buffer),
|
||||||
settings->arrays.cheevos_username,
|
settings->arrays.cheevos_username,
|
||||||
locals->token, request->id, request->value);
|
locals->token, request->id, request->value);
|
||||||
|
|
||||||
@ -1012,7 +1058,8 @@ static void rcheevos_async_submit_lboard(rcheevos_locals_t *locals,
|
|||||||
}
|
}
|
||||||
|
|
||||||
rcheevos_log_url("rc_url_submit_lboard", buffer);
|
rcheevos_log_url("rc_url_submit_lboard", buffer);
|
||||||
task_push_http_transfer_with_user_agent(buffer, true, NULL, request->user_agent, rcheevos_async_task_callback, request);
|
task_push_http_transfer_with_user_agent(buffer, true, NULL,
|
||||||
|
request->user_agent, rcheevos_async_task_callback, request);
|
||||||
}
|
}
|
||||||
|
|
||||||
static rcheevos_ralboard_t* rcheevos_find_lboard(unsigned id)
|
static rcheevos_ralboard_t* rcheevos_find_lboard(unsigned id)
|
||||||
@ -1036,12 +1083,15 @@ static void rcheevos_lboard_submit(rcheevos_locals_t *locals,
|
|||||||
char formatted_value[16];
|
char formatted_value[16];
|
||||||
|
|
||||||
/* Show the OSD message (regardless of notifications setting). */
|
/* Show the OSD message (regardless of notifications setting). */
|
||||||
rc_format_value(formatted_value, sizeof(formatted_value), value, lboard->format);
|
rc_format_value(formatted_value, sizeof(formatted_value),
|
||||||
|
value, lboard->format);
|
||||||
|
|
||||||
CHEEVOS_LOG(RCHEEVOS_TAG "Submitting %s for leaderboard %u\n", formatted_value, lboard->id);
|
CHEEVOS_LOG(RCHEEVOS_TAG "Submitting %s for leaderboard %u\n",
|
||||||
|
formatted_value, lboard->id);
|
||||||
snprintf(buffer, sizeof(buffer), "Submitted %s for %s",
|
snprintf(buffer, sizeof(buffer), "Submitted %s for %s",
|
||||||
formatted_value, lboard->title);
|
formatted_value, lboard->title);
|
||||||
runloop_msg_queue_push(buffer, 0, 2 * 60, false, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO);
|
runloop_msg_queue_push(buffer, 0, 2 * 60, false, NULL,
|
||||||
|
MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO);
|
||||||
|
|
||||||
#if defined(HAVE_GFX_WIDGETS)
|
#if defined(HAVE_GFX_WIDGETS)
|
||||||
/* Hide the tracker */
|
/* Hide the tracker */
|
||||||
@ -1051,10 +1101,13 @@ static void rcheevos_lboard_submit(rcheevos_locals_t *locals,
|
|||||||
|
|
||||||
/* Start the submit task. */
|
/* Start the submit task. */
|
||||||
{
|
{
|
||||||
rcheevos_async_io_request* request = (rcheevos_async_io_request*)calloc(1, sizeof(rcheevos_async_io_request));
|
rcheevos_async_io_request
|
||||||
request->type = CHEEVOS_ASYNC_SUBMIT_LBOARD;
|
*request = (rcheevos_async_io_request*)
|
||||||
request->id = lboard->id;
|
calloc(1, sizeof(rcheevos_async_io_request));
|
||||||
request->value = value;
|
|
||||||
|
request->type = CHEEVOS_ASYNC_SUBMIT_LBOARD;
|
||||||
|
request->id = lboard->id;
|
||||||
|
request->value = value;
|
||||||
request->success_message = "Submitted leaderboard";
|
request->success_message = "Submitted leaderboard";
|
||||||
request->failure_message = "Error submitting leaderboard";
|
request->failure_message = "Error submitting leaderboard";
|
||||||
rcheevos_get_user_agent(locals,
|
rcheevos_get_user_agent(locals,
|
||||||
@ -1070,7 +1123,8 @@ static void rcheevos_lboard_canceled(rcheevos_ralboard_t * lboard,
|
|||||||
if (!lboard)
|
if (!lboard)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
CHEEVOS_LOG(RCHEEVOS_TAG "Leaderboard %u canceled: %s\n", lboard->id, lboard->title);
|
CHEEVOS_LOG(RCHEEVOS_TAG "Leaderboard %u canceled: %s\n",
|
||||||
|
lboard->id, lboard->title);
|
||||||
|
|
||||||
#if defined(HAVE_GFX_WIDGETS)
|
#if defined(HAVE_GFX_WIDGETS)
|
||||||
if (widgets_ready)
|
if (widgets_ready)
|
||||||
@ -1079,7 +1133,8 @@ static void rcheevos_lboard_canceled(rcheevos_ralboard_t * lboard,
|
|||||||
|
|
||||||
if (rcheevos_locals.leaderboard_notifications)
|
if (rcheevos_locals.leaderboard_notifications)
|
||||||
{
|
{
|
||||||
snprintf(buffer, sizeof(buffer), "Leaderboard attempt failed: %s", lboard->title);
|
snprintf(buffer, sizeof(buffer),
|
||||||
|
"Leaderboard attempt failed: %s", lboard->title);
|
||||||
runloop_msg_queue_push(buffer, 0, 2 * 60, false, NULL,
|
runloop_msg_queue_push(buffer, 0, 2 * 60, false, NULL,
|
||||||
MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO);
|
MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO);
|
||||||
}
|
}
|
||||||
@ -1092,7 +1147,8 @@ static void rcheevos_lboard_started(rcheevos_ralboard_t * lboard, int value,
|
|||||||
if (!lboard)
|
if (!lboard)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
CHEEVOS_LOG(RCHEEVOS_TAG "Leaderboard %u started: %s\n", lboard->id, lboard->title);
|
CHEEVOS_LOG(RCHEEVOS_TAG "Leaderboard %u started: %s\n",
|
||||||
|
lboard->id, lboard->title);
|
||||||
|
|
||||||
#if defined(HAVE_GFX_WIDGETS)
|
#if defined(HAVE_GFX_WIDGETS)
|
||||||
if (widgets_ready && rcheevos_locals.leaderboard_trackers)
|
if (widgets_ready && rcheevos_locals.leaderboard_trackers)
|
||||||
@ -1105,9 +1161,13 @@ static void rcheevos_lboard_started(rcheevos_ralboard_t * lboard, int value,
|
|||||||
if (rcheevos_locals.leaderboard_notifications)
|
if (rcheevos_locals.leaderboard_notifications)
|
||||||
{
|
{
|
||||||
if (lboard->description && *lboard->description)
|
if (lboard->description && *lboard->description)
|
||||||
snprintf(buffer, sizeof(buffer), "Leaderboard attempt started: %s - %s", lboard->title, lboard->description);
|
snprintf(buffer, sizeof(buffer),
|
||||||
|
"Leaderboard attempt started: %s - %s",
|
||||||
|
lboard->title, lboard->description);
|
||||||
else
|
else
|
||||||
snprintf(buffer, sizeof(buffer), "Leaderboard attempt started: %s", lboard->title);
|
snprintf(buffer, sizeof(buffer),
|
||||||
|
"Leaderboard attempt started: %s",
|
||||||
|
lboard->title);
|
||||||
|
|
||||||
runloop_msg_queue_push(buffer, 0, 2 * 60, false, NULL,
|
runloop_msg_queue_push(buffer, 0, 2 * 60, false, NULL,
|
||||||
MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO);
|
MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO);
|
||||||
@ -1151,42 +1211,48 @@ void rcheevos_reset_game(bool widgets_ready)
|
|||||||
|
|
||||||
rc_runtime_reset(&rcheevos_locals.runtime);
|
rc_runtime_reset(&rcheevos_locals.runtime);
|
||||||
|
|
||||||
/* some cores reallocate memory on reset, make sure we update our pointers */
|
/* Some cores reallocate memory on reset,
|
||||||
|
* make sure we update our pointers */
|
||||||
if (rcheevos_locals.memory.total_size > 0)
|
if (rcheevos_locals.memory.total_size > 0)
|
||||||
rcheevos_memory_init(&rcheevos_locals.memory, rcheevos_locals.patchdata.console_id);
|
rcheevos_memory_init(
|
||||||
|
&rcheevos_locals.memory,
|
||||||
|
rcheevos_locals.patchdata.console_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_MENU
|
#ifdef HAVE_MENU
|
||||||
void rcheevos_get_achievement_state(unsigned index,
|
void rcheevos_get_achievement_state(unsigned index,
|
||||||
char *buffer, size_t len)
|
char *buffer, size_t len)
|
||||||
{
|
{
|
||||||
rcheevos_racheevo_t* cheevo;
|
|
||||||
enum msg_hash_enums enum_idx;
|
enum msg_hash_enums enum_idx;
|
||||||
bool check_measured = false;
|
rcheevos_racheevo_t *cheevo = NULL;
|
||||||
|
bool check_measured = false;
|
||||||
|
|
||||||
if (index < rcheevos_locals.patchdata.core_count)
|
if (index < rcheevos_locals.patchdata.core_count)
|
||||||
{
|
{
|
||||||
enum_idx = MENU_ENUM_LABEL_VALUE_CHEEVOS_LOCKED_ENTRY;
|
enum_idx = MENU_ENUM_LABEL_VALUE_CHEEVOS_LOCKED_ENTRY;
|
||||||
cheevo = rcheevos_locals.patchdata.core ? &rcheevos_locals.patchdata.core[index] : NULL;
|
if (rcheevos_locals.patchdata.core)
|
||||||
|
cheevo = &rcheevos_locals.patchdata.core[index];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
enum_idx = MENU_ENUM_LABEL_VALUE_CHEEVOS_UNOFFICIAL_ENTRY;
|
enum_idx = MENU_ENUM_LABEL_VALUE_CHEEVOS_UNOFFICIAL_ENTRY;
|
||||||
cheevo = rcheevos_locals.patchdata.unofficial ? &rcheevos_locals.patchdata.unofficial[index - rcheevos_locals.patchdata.core_count] : NULL;
|
if (rcheevos_locals.patchdata.unofficial)
|
||||||
|
cheevo = &rcheevos_locals.patchdata.unofficial[index -
|
||||||
|
rcheevos_locals.patchdata.core_count];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!cheevo || !cheevo->memaddr)
|
if (!cheevo || !cheevo->memaddr)
|
||||||
enum_idx = MENU_ENUM_LABEL_VALUE_CHEEVOS_UNSUPPORTED_ENTRY;
|
enum_idx = MENU_ENUM_LABEL_VALUE_CHEEVOS_UNSUPPORTED_ENTRY;
|
||||||
else if (!(cheevo->active & RCHEEVOS_ACTIVE_HARDCORE))
|
else if (!(cheevo->active & RCHEEVOS_ACTIVE_HARDCORE))
|
||||||
enum_idx = MENU_ENUM_LABEL_VALUE_CHEEVOS_UNLOCKED_ENTRY_HARDCORE;
|
enum_idx = MENU_ENUM_LABEL_VALUE_CHEEVOS_UNLOCKED_ENTRY_HARDCORE;
|
||||||
else if (!(cheevo->active & RCHEEVOS_ACTIVE_SOFTCORE))
|
else if (!(cheevo->active & RCHEEVOS_ACTIVE_SOFTCORE))
|
||||||
{
|
{
|
||||||
|
enum_idx = MENU_ENUM_LABEL_VALUE_CHEEVOS_UNLOCKED_ENTRY;
|
||||||
/* if in hardcore mode, track progress towards hardcore unlock */
|
/* if in hardcore mode, track progress towards hardcore unlock */
|
||||||
check_measured = rcheevos_locals.hardcore_active;
|
check_measured = rcheevos_locals.hardcore_active;
|
||||||
|
|
||||||
enum_idx = MENU_ENUM_LABEL_VALUE_CHEEVOS_UNLOCKED_ENTRY;
|
|
||||||
}
|
}
|
||||||
/* Use either "Locked" for core or "Unofficial" for unofficial as set above and track progress */
|
/* Use either "Locked" for core or "Unofficial"
|
||||||
|
* for unofficial as set above and track progress */
|
||||||
else
|
else
|
||||||
check_measured = true;
|
check_measured = true;
|
||||||
|
|
||||||
@ -1194,22 +1260,26 @@ void rcheevos_get_achievement_state(unsigned index,
|
|||||||
|
|
||||||
if (check_measured)
|
if (check_measured)
|
||||||
{
|
{
|
||||||
const rc_trigger_t* trigger = rc_runtime_get_achievement(&rcheevos_locals.runtime, cheevo->id);
|
const rc_trigger_t* trigger = rc_runtime_get_achievement(
|
||||||
const unsigned int target = trigger->measured_target;
|
&rcheevos_locals.runtime, cheevo->id);
|
||||||
|
const unsigned int target = trigger->measured_target;
|
||||||
|
|
||||||
if (target > 0 && trigger->measured_value > 0)
|
if (target > 0 && trigger->measured_value > 0)
|
||||||
{
|
{
|
||||||
char measured_buffer[12];
|
char measured_buffer[12];
|
||||||
const unsigned int value = MIN(trigger->measured_value, target);
|
const unsigned int value = MIN(trigger->measured_value, target);
|
||||||
const int percent = (int)(((unsigned long)value) * 100 / target);
|
const int percent = (int)(((unsigned long)value) * 100 / target);
|
||||||
|
|
||||||
snprintf(measured_buffer, sizeof(measured_buffer), " - %d%%", percent);
|
snprintf(measured_buffer, sizeof(measured_buffer),
|
||||||
|
" - %d%%", percent);
|
||||||
strlcat(buffer, measured_buffer, len);
|
strlcat(buffer, measured_buffer, len);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rcheevos_append_menu_achievement(
|
static void rcheevos_append_menu_achievement(
|
||||||
menu_displaylist_info_t* info, size_t idx, rcheevos_racheevo_t* cheevo)
|
menu_displaylist_info_t* info, size_t idx,
|
||||||
|
rcheevos_racheevo_t* cheevo)
|
||||||
{
|
{
|
||||||
bool badge_grayscale;
|
bool badge_grayscale;
|
||||||
|
|
||||||
@ -1217,6 +1287,10 @@ static void rcheevos_append_menu_achievement(
|
|||||||
cheevo->description, MENU_ENUM_LABEL_CHEEVOS_LOCKED_ENTRY,
|
cheevo->description, MENU_ENUM_LABEL_CHEEVOS_LOCKED_ENTRY,
|
||||||
(unsigned)(MENU_SETTINGS_CHEEVOS_START + idx), 0, 0);
|
(unsigned)(MENU_SETTINGS_CHEEVOS_START + idx), 0, 0);
|
||||||
|
|
||||||
|
/* TODO/FIXME - can we refactor this?
|
||||||
|
* Make badge_grayscale true by default, then
|
||||||
|
* have one conditional (second one here) that sets it
|
||||||
|
* to false */
|
||||||
if (!cheevo->memaddr)
|
if (!cheevo->memaddr)
|
||||||
badge_grayscale = true; /* unsupported */
|
badge_grayscale = true; /* unsupported */
|
||||||
else if (!(cheevo->active & RCHEEVOS_ACTIVE_HARDCORE) ||
|
else if (!(cheevo->active & RCHEEVOS_ACTIVE_HARDCORE) ||
|
||||||
@ -1359,10 +1433,9 @@ bool rcheevos_get_description(rcheevos_ctx_desc_t* desc)
|
|||||||
{
|
{
|
||||||
idx -= rcheevos_locals.patchdata.core_count;
|
idx -= rcheevos_locals.patchdata.core_count;
|
||||||
|
|
||||||
if (idx < rcheevos_locals.patchdata.unofficial_count)
|
if (idx >= rcheevos_locals.patchdata.unofficial_count)
|
||||||
cheevo = rcheevos_locals.patchdata.unofficial + idx;
|
|
||||||
else
|
|
||||||
return true;
|
return true;
|
||||||
|
cheevo = rcheevos_locals.patchdata.unofficial + idx;
|
||||||
}
|
}
|
||||||
|
|
||||||
strlcpy(desc->s, cheevo->description, desc->len);
|
strlcpy(desc->s, cheevo->description, desc->len);
|
||||||
@ -1424,7 +1497,8 @@ bool rcheevos_unload(void)
|
|||||||
|
|
||||||
rc_runtime_destroy(&rcheevos_locals.runtime);
|
rc_runtime_destroy(&rcheevos_locals.runtime);
|
||||||
|
|
||||||
/* if the config-level token has been cleared, we need to re-login on loading the next game */
|
/* If the config-level token has been cleared,
|
||||||
|
* we need to re-login on loading the next game */
|
||||||
if (!settings->arrays.cheevos_token[0])
|
if (!settings->arrays.cheevos_token[0])
|
||||||
rcheevos_locals.token[0] = '\0';
|
rcheevos_locals.token[0] = '\0';
|
||||||
|
|
||||||
@ -1434,13 +1508,16 @@ bool rcheevos_unload(void)
|
|||||||
static void rcheevos_toggle_hardcore_achievements(rcheevos_locals_t *locals,
|
static void rcheevos_toggle_hardcore_achievements(rcheevos_locals_t *locals,
|
||||||
rcheevos_racheevo_t* cheevo, unsigned count)
|
rcheevos_racheevo_t* cheevo, unsigned count)
|
||||||
{
|
{
|
||||||
const unsigned active_mask = RCHEEVOS_ACTIVE_SOFTCORE | RCHEEVOS_ACTIVE_HARDCORE;
|
const unsigned active_mask =
|
||||||
|
RCHEEVOS_ACTIVE_SOFTCORE | RCHEEVOS_ACTIVE_HARDCORE;
|
||||||
|
|
||||||
while (count--)
|
while (count--)
|
||||||
{
|
{
|
||||||
if (cheevo->memaddr && (cheevo->active & active_mask) == RCHEEVOS_ACTIVE_HARDCORE)
|
if (cheevo->memaddr && (cheevo->active & active_mask)
|
||||||
|
== RCHEEVOS_ACTIVE_HARDCORE)
|
||||||
{
|
{
|
||||||
/* player has unlocked achievement in non-hardcore but has not unlocked in hardcore; toggle state */
|
/* player has unlocked achievement in non-hardcore,
|
||||||
|
* but has not unlocked in hardcore. Toggle state */
|
||||||
if (locals->hardcore_active)
|
if (locals->hardcore_active)
|
||||||
{
|
{
|
||||||
rc_runtime_activate_achievement(&locals->runtime, cheevo->id, cheevo->memaddr, NULL, 0);
|
rc_runtime_activate_achievement(&locals->runtime, cheevo->id, cheevo->memaddr, NULL, 0);
|
||||||
@ -1465,7 +1542,8 @@ static void rcheevos_activate_leaderboards(rcheevos_locals_t* locals)
|
|||||||
for (i = 0; i < locals->patchdata.lboard_count; ++i, ++lboard)
|
for (i = 0; i < locals->patchdata.lboard_count; ++i, ++lboard)
|
||||||
{
|
{
|
||||||
if (lboard->mem)
|
if (lboard->mem)
|
||||||
rc_runtime_activate_lboard(&locals->runtime, lboard->id, lboard->mem, NULL, 0);
|
rc_runtime_activate_lboard(&locals->runtime, lboard->id,
|
||||||
|
lboard->mem, NULL, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1490,9 +1568,9 @@ static void rcheevos_deactivate_leaderboards(rcheevos_locals_t* locals)
|
|||||||
|
|
||||||
void rcheevos_leaderboards_enabled_changed(void)
|
void rcheevos_leaderboards_enabled_changed(void)
|
||||||
{
|
{
|
||||||
const settings_t* settings = config_get_ptr();
|
const settings_t* settings = config_get_ptr();
|
||||||
const bool leaderboards_enabled = rcheevos_locals.leaderboards_enabled;
|
const bool leaderboards_enabled = rcheevos_locals.leaderboards_enabled;
|
||||||
const bool leaderboard_trackers = rcheevos_locals.leaderboard_trackers;
|
const bool leaderboard_trackers = rcheevos_locals.leaderboard_trackers;
|
||||||
|
|
||||||
rcheevos_locals.leaderboards_enabled = rcheevos_hardcore_active();
|
rcheevos_locals.leaderboards_enabled = rcheevos_hardcore_active();
|
||||||
|
|
||||||
@ -1502,22 +1580,24 @@ void rcheevos_leaderboards_enabled_changed(void)
|
|||||||
rcheevos_locals.leaderboard_trackers = true;
|
rcheevos_locals.leaderboard_trackers = true;
|
||||||
}
|
}
|
||||||
#if defined(HAVE_GFX_WIDGETS)
|
#if defined(HAVE_GFX_WIDGETS)
|
||||||
else if (string_is_equal(settings->arrays.cheevos_leaderboards_enable, "trackers"))
|
else if (string_is_equal(
|
||||||
|
settings->arrays.cheevos_leaderboards_enable, "trackers"))
|
||||||
{
|
{
|
||||||
rcheevos_locals.leaderboard_notifications = false;
|
rcheevos_locals.leaderboard_notifications = false;
|
||||||
rcheevos_locals.leaderboard_trackers = true;
|
rcheevos_locals.leaderboard_trackers = true;
|
||||||
}
|
}
|
||||||
else if (string_is_equal(settings->arrays.cheevos_leaderboards_enable, "notifications"))
|
else if (string_is_equal(
|
||||||
|
settings->arrays.cheevos_leaderboards_enable, "notifications"))
|
||||||
{
|
{
|
||||||
rcheevos_locals.leaderboard_notifications = true;
|
rcheevos_locals.leaderboard_notifications = true;
|
||||||
rcheevos_locals.leaderboard_trackers = false;
|
rcheevos_locals.leaderboard_trackers = false;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
rcheevos_locals.leaderboards_enabled = false;
|
rcheevos_locals.leaderboards_enabled = false;
|
||||||
rcheevos_locals.leaderboard_notifications = false;
|
rcheevos_locals.leaderboard_notifications = false;
|
||||||
rcheevos_locals.leaderboard_trackers = false;
|
rcheevos_locals.leaderboard_trackers = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rcheevos_locals.loaded)
|
if (rcheevos_locals.loaded)
|
||||||
@ -1534,8 +1614,8 @@ void rcheevos_leaderboards_enabled_changed(void)
|
|||||||
if (!rcheevos_locals.leaderboard_trackers && leaderboard_trackers)
|
if (!rcheevos_locals.leaderboard_trackers && leaderboard_trackers)
|
||||||
{
|
{
|
||||||
/* Hide any visible trackers */
|
/* Hide any visible trackers */
|
||||||
rcheevos_ralboard_t* lboard = rcheevos_locals.patchdata.lboards;
|
|
||||||
unsigned i;
|
unsigned i;
|
||||||
|
rcheevos_ralboard_t* lboard = rcheevos_locals.patchdata.lboards;
|
||||||
|
|
||||||
for (i = 0; i < rcheevos_locals.patchdata.lboard_count; ++i, ++lboard)
|
for (i = 0; i < rcheevos_locals.patchdata.lboard_count; ++i, ++lboard)
|
||||||
{
|
{
|
||||||
@ -1550,20 +1630,20 @@ void rcheevos_leaderboards_enabled_changed(void)
|
|||||||
static void rcheevos_toggle_hardcore_active(rcheevos_locals_t* locals)
|
static void rcheevos_toggle_hardcore_active(rcheevos_locals_t* locals)
|
||||||
{
|
{
|
||||||
settings_t* settings = config_get_ptr();
|
settings_t* settings = config_get_ptr();
|
||||||
bool rewind_enable = settings->bools.rewind_enable;
|
bool rewind_enable = settings->bools.rewind_enable;
|
||||||
|
|
||||||
if (!locals->hardcore_active)
|
if (!locals->hardcore_active)
|
||||||
{
|
{
|
||||||
/* activate hardcore */
|
/* Activate hardcore */
|
||||||
locals->hardcore_active = true;
|
locals->hardcore_active = true;
|
||||||
|
|
||||||
/* if one or more invalid settings is enabled, abort*/
|
/* If one or more invalid settings is enabled, abort*/
|
||||||
rcheevos_validate_config_settings();
|
rcheevos_validate_config_settings();
|
||||||
if (!locals->hardcore_active)
|
if (!locals->hardcore_active)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
#ifdef HAVE_CHEATS
|
#ifdef HAVE_CHEATS
|
||||||
/* if one or more emulator managed cheats is active, abort */
|
/* If one or more emulator managed cheats is active, abort */
|
||||||
cheat_manager_apply_cheats();
|
cheat_manager_apply_cheats();
|
||||||
if (!locals->hardcore_active)
|
if (!locals->hardcore_active)
|
||||||
return;
|
return;
|
||||||
@ -1576,7 +1656,7 @@ static void rcheevos_toggle_hardcore_active(rcheevos_locals_t* locals)
|
|||||||
runloop_msg_queue_push(msg, 0, 3 * 60, true, NULL,
|
runloop_msg_queue_push(msg, 0, 3 * 60, true, NULL,
|
||||||
MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO);
|
MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO);
|
||||||
|
|
||||||
/* reactivate leaderboards */
|
/* Reactivate leaderboards */
|
||||||
if (locals->leaderboards_enabled)
|
if (locals->leaderboards_enabled)
|
||||||
rcheevos_activate_leaderboards(locals);
|
rcheevos_activate_leaderboards(locals);
|
||||||
|
|
||||||
@ -1588,7 +1668,9 @@ static void rcheevos_toggle_hardcore_active(rcheevos_locals_t* locals)
|
|||||||
if (rewind_enable)
|
if (rewind_enable)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
/* have to "schedule" this. CMD_EVENT_REWIND_DEINIT should only be called on the main thread */
|
/* have to "schedule" this.
|
||||||
|
* CMD_EVENT_REWIND_DEINIT should
|
||||||
|
* only be called on the main thread */
|
||||||
rcheevos_locals.queued_command = CMD_EVENT_REWIND_DEINIT;
|
rcheevos_locals.queued_command = CMD_EVENT_REWIND_DEINIT;
|
||||||
#else
|
#else
|
||||||
command_event(CMD_EVENT_REWIND_DEINIT, NULL);
|
command_event(CMD_EVENT_REWIND_DEINIT, NULL);
|
||||||
@ -1612,7 +1694,9 @@ static void rcheevos_toggle_hardcore_active(rcheevos_locals_t* locals)
|
|||||||
if (rewind_enable)
|
if (rewind_enable)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
/* have to "schedule" this. CMD_EVENT_REWIND_INIT should only be called on the main thread */
|
/* have to "schedule" this.
|
||||||
|
* CMD_EVENT_REWIND_INIT should
|
||||||
|
* only be called on the main thread */
|
||||||
rcheevos_locals.queued_command = CMD_EVENT_REWIND_INIT;
|
rcheevos_locals.queued_command = CMD_EVENT_REWIND_INIT;
|
||||||
#else
|
#else
|
||||||
command_event(CMD_EVENT_REWIND_INIT, NULL);
|
command_event(CMD_EVENT_REWIND_INIT, NULL);
|
||||||
@ -1622,19 +1706,18 @@ static void rcheevos_toggle_hardcore_active(rcheevos_locals_t* locals)
|
|||||||
|
|
||||||
if (locals->loaded)
|
if (locals->loaded)
|
||||||
{
|
{
|
||||||
rcheevos_toggle_hardcore_achievements(locals, locals->patchdata.core, locals->patchdata.core_count);
|
rcheevos_toggle_hardcore_achievements(locals,
|
||||||
|
locals->patchdata.core, locals->patchdata.core_count);
|
||||||
if (settings->bools.cheevos_test_unofficial)
|
if (settings->bools.cheevos_test_unofficial)
|
||||||
{
|
|
||||||
rcheevos_toggle_hardcore_achievements(locals,
|
rcheevos_toggle_hardcore_achievements(locals,
|
||||||
locals->patchdata.unofficial, locals->patchdata.unofficial_count);
|
locals->patchdata.unofficial,
|
||||||
}
|
locals->patchdata.unofficial_count);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void rcheevos_toggle_hardcore_paused(void)
|
void rcheevos_toggle_hardcore_paused(void)
|
||||||
{
|
{
|
||||||
settings_t* settings = config_get_ptr();
|
settings_t* settings = config_get_ptr();
|
||||||
|
|
||||||
/* if hardcore mode is not enabled, we can't toggle it */
|
/* if hardcore mode is not enabled, we can't toggle it */
|
||||||
if (settings->bools.cheevos_hardcore_mode_enable)
|
if (settings->bools.cheevos_hardcore_mode_enable)
|
||||||
rcheevos_toggle_hardcore_active(&rcheevos_locals);
|
rcheevos_toggle_hardcore_active(&rcheevos_locals);
|
||||||
@ -1643,7 +1726,9 @@ void rcheevos_toggle_hardcore_paused(void)
|
|||||||
void rcheevos_hardcore_enabled_changed(void)
|
void rcheevos_hardcore_enabled_changed(void)
|
||||||
{
|
{
|
||||||
const settings_t* settings = config_get_ptr();
|
const settings_t* settings = config_get_ptr();
|
||||||
const bool enabled = settings && settings->bools.cheevos_enable && settings->bools.cheevos_hardcore_mode_enable;
|
const bool enabled = settings
|
||||||
|
&& settings->bools.cheevos_enable
|
||||||
|
&& settings->bools.cheevos_hardcore_mode_enable;
|
||||||
|
|
||||||
if (enabled != rcheevos_locals.hardcore_active)
|
if (enabled != rcheevos_locals.hardcore_active)
|
||||||
{
|
{
|
||||||
@ -1667,38 +1752,38 @@ typedef struct rc_disallowed_core_settings_t
|
|||||||
} rc_disallowed_core_settings_t;
|
} rc_disallowed_core_settings_t;
|
||||||
|
|
||||||
static const rc_disallowed_setting_t _rc_disallowed_dolphin_settings[] = {
|
static const rc_disallowed_setting_t _rc_disallowed_dolphin_settings[] = {
|
||||||
{ "dolphin_cheats_enabled", "enabled" },
|
{ "dolphin_cheats_enabled", "enabled" },
|
||||||
{ NULL, NULL }
|
{ NULL, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
static const rc_disallowed_setting_t _rc_disallowed_ecwolf_settings[] = {
|
static const rc_disallowed_setting_t _rc_disallowed_ecwolf_settings[] = {
|
||||||
{ "ecwolf-invulnerability", "enabled" },
|
{ "ecwolf-invulnerability", "enabled" },
|
||||||
{ NULL, NULL }
|
{ NULL, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
static const rc_disallowed_setting_t _rc_disallowed_fbneo_settings[] = {
|
static const rc_disallowed_setting_t _rc_disallowed_fbneo_settings[] = {
|
||||||
{ "fbneo-allow-patched-romsets", "enabled" },
|
{ "fbneo-allow-patched-romsets", "enabled" },
|
||||||
{ "fbneo-cheat-*", "!,Disabled,0 - Disabled" },
|
{ "fbneo-cheat-*", "!,Disabled,0 - Disabled" },
|
||||||
{ NULL, NULL }
|
{ NULL, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
static const rc_disallowed_setting_t _rc_disallowed_gpgx_settings[] = {
|
static const rc_disallowed_setting_t _rc_disallowed_gpgx_settings[] = {
|
||||||
{ "genesis_plus_gx_lock_on", ",action replay (pro),game genie" },
|
{ "genesis_plus_gx_lock_on", ",action replay (pro),game genie" },
|
||||||
{ NULL, NULL }
|
{ NULL, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
static const rc_disallowed_setting_t _rc_disallowed_ppsspp_settings[] = {
|
static const rc_disallowed_setting_t _rc_disallowed_ppsspp_settings[] = {
|
||||||
{ "ppsspp_cheats", "enabled" },
|
{ "ppsspp_cheats", "enabled" },
|
||||||
{ NULL, NULL }
|
{ NULL, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
static const rc_disallowed_core_settings_t rc_disallowed_core_settings[] = {
|
static const rc_disallowed_core_settings_t rc_disallowed_core_settings[] = {
|
||||||
{ "dolphin-emu", _rc_disallowed_dolphin_settings },
|
{ "dolphin-emu", _rc_disallowed_dolphin_settings },
|
||||||
{ "ecwolf", _rc_disallowed_ecwolf_settings },
|
{ "ecwolf", _rc_disallowed_ecwolf_settings },
|
||||||
{ "FinalBurn Neo", _rc_disallowed_fbneo_settings },
|
{ "FinalBurn Neo", _rc_disallowed_fbneo_settings },
|
||||||
{ "Genesis Plus GX", _rc_disallowed_gpgx_settings },
|
{ "Genesis Plus GX", _rc_disallowed_gpgx_settings },
|
||||||
{ "PPSSPP", _rc_disallowed_ppsspp_settings },
|
{ "PPSSPP", _rc_disallowed_ppsspp_settings },
|
||||||
{ NULL, NULL }
|
{ NULL, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
static int rcheevos_match_value(const char* val, const char* match)
|
static int rcheevos_match_value(const char* val, const char* match)
|
||||||
@ -1731,7 +1816,8 @@ static int rcheevos_match_value(const char* val, const char* match)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* a leading exclamation point means the provided value(s) are not forbidden (are allowed) */
|
/* a leading exclamation point means the provided value(s)
|
||||||
|
* are not forbidden (are allowed) */
|
||||||
if (*match == '!')
|
if (*match == '!')
|
||||||
return !rcheevos_match_value(val, &match[1]);
|
return !rcheevos_match_value(val, &match[1]);
|
||||||
|
|
||||||
@ -1773,7 +1859,9 @@ void rcheevos_validate_config_settings(void)
|
|||||||
if (string_starts_with_size(
|
if (string_starts_with_size(
|
||||||
coreopts->opts[i].key, key, key_len - 1))
|
coreopts->opts[i].key, key, key_len - 1))
|
||||||
{
|
{
|
||||||
const char* val = core_option_manager_get_val(coreopts, i);
|
const char* val = core_option_manager_get_val(
|
||||||
|
coreopts, i);
|
||||||
|
|
||||||
if (val)
|
if (val)
|
||||||
{
|
{
|
||||||
if (rcheevos_match_value(
|
if (rcheevos_match_value(
|
||||||
@ -1811,7 +1899,7 @@ void rcheevos_validate_config_settings(void)
|
|||||||
rcheevos_pause_hardcore();
|
rcheevos_pause_hardcore();
|
||||||
|
|
||||||
runloop_msg_queue_push(buffer, 0, 4 * 60, false, NULL,
|
runloop_msg_queue_push(buffer, 0, 4 * 60, false, NULL,
|
||||||
MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_WARNING);
|
MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_WARNING);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1884,10 +1972,10 @@ void rcheevos_test(void)
|
|||||||
/* we were unable to initialize memory earlier, try now */
|
/* we were unable to initialize memory earlier, try now */
|
||||||
if (!rcheevos_memory_init(&rcheevos_locals.memory, rcheevos_locals.patchdata.console_id))
|
if (!rcheevos_memory_init(&rcheevos_locals.memory, rcheevos_locals.patchdata.console_id))
|
||||||
{
|
{
|
||||||
const settings_t* settings = config_get_ptr();
|
const settings_t* settings = config_get_ptr();
|
||||||
|
rcheevos_locals.core_supports = false;
|
||||||
|
|
||||||
CHEEVOS_ERR(RCHEEVOS_TAG "No memory exposed by core\n");
|
CHEEVOS_ERR(RCHEEVOS_TAG "No memory exposed by core\n");
|
||||||
rcheevos_locals.core_supports = false;
|
|
||||||
|
|
||||||
if (settings && settings->bools.cheevos_verbose_enable)
|
if (settings && settings->bools.cheevos_verbose_enable)
|
||||||
{
|
{
|
||||||
@ -1910,7 +1998,6 @@ size_t rcheevos_get_serialize_size(void)
|
|||||||
{
|
{
|
||||||
if (!rcheevos_locals.loaded)
|
if (!rcheevos_locals.loaded)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
return rc_runtime_progress_size(&rcheevos_locals.runtime, NULL);
|
return rc_runtime_progress_size(&rcheevos_locals.runtime, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1918,7 +2005,6 @@ bool rcheevos_get_serialized_data(void* buffer)
|
|||||||
{
|
{
|
||||||
if (!rcheevos_locals.loaded)
|
if (!rcheevos_locals.loaded)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return (rc_runtime_serialize_progress(buffer, &rcheevos_locals.runtime, NULL) == RC_OK);
|
return (rc_runtime_serialize_progress(buffer, &rcheevos_locals.runtime, NULL) == RC_OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2135,20 +2221,19 @@ static int rcheevos_iterate(rcheevos_coro_t* coro)
|
|||||||
|
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
{
|
{
|
||||||
if (rcheevos_locals.patchdata.core_count == 0
|
if ( rcheevos_locals.patchdata.core_count == 0
|
||||||
&& rcheevos_locals.patchdata.unofficial_count == 0
|
&& rcheevos_locals.patchdata.unofficial_count == 0
|
||||||
&& rcheevos_locals.patchdata.lboard_count == 0)
|
&& rcheevos_locals.patchdata.lboard_count == 0
|
||||||
|
)
|
||||||
{
|
{
|
||||||
runloop_msg_queue_push(
|
runloop_msg_queue_push(
|
||||||
"This game has no achievements.",
|
"This game has no achievements.",
|
||||||
0, 5 * 60, false, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO);
|
0, 5 * 60, false, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO);
|
||||||
|
|
||||||
rcheevos_pause_hardcore();
|
rcheevos_pause_hardcore();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
|
||||||
rcheevos_locals.loaded = true;
|
rcheevos_locals.loaded = true;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if HAVE_REWIND
|
#if HAVE_REWIND
|
||||||
|
Loading…
x
Reference in New Issue
Block a user