Skip to content

Commit

Permalink
update to rcheevos 11.3
Browse files Browse the repository at this point in the history
  • Loading branch information
Jamiras committed May 10, 2024
1 parent ee5f64d commit 264aa45
Show file tree
Hide file tree
Showing 13 changed files with 278 additions and 51 deletions.
11 changes: 8 additions & 3 deletions cheevos/cheevos.c
Original file line number Diff line number Diff line change
Expand Up @@ -339,8 +339,7 @@ static rcheevos_racheevo_t* rcheevos_find_cheevo(unsigned id)
static bool rcheevos_is_game_loaded(void)
{
#ifdef HAVE_RC_CLIENT
const rc_client_game_t* game = rc_client_get_game_info(rcheevos_locals.client);
return (game && game->id);
return rc_client_is_game_loaded(rcheevos_locals.client);
#else
return rcheevos_locals.loaded;
#endif
Expand Down Expand Up @@ -1189,7 +1188,13 @@ void rcheevos_refresh_memory(void)
bool rcheevos_hardcore_active(void)
{
#ifdef HAVE_RC_CLIENT
return rcheevos_locals.client && rc_client_get_hardcore_enabled(rcheevos_locals.client);
/* normal hardcore check */
if (rcheevos_locals.client && rc_client_get_hardcore_enabled(rcheevos_locals.client))
return true;

/* if we're trying to enable hardcore, pretend it's on so the caller can decide to disable
* it (by calling rcheevos_pause_hardcore) before we actually turn it on. */
return rcheevos_locals.hardcore_allowed;
#else
return rcheevos_locals.hardcore_active;
#endif
Expand Down
6 changes: 6 additions & 0 deletions deps/rcheevos/include/rc_client.h
Original file line number Diff line number Diff line change
Expand Up @@ -251,6 +251,11 @@ enum {
RC_CLIENT_LOAD_GAME_STATE_ABORTED
};

/**
* Determines if a game was successfully identified and loaded.
*/
RC_EXPORT int RC_CCONV rc_client_is_game_loaded(const rc_client_t* client);

/**
* Unloads the current game.
*/
Expand All @@ -266,6 +271,7 @@ typedef struct rc_client_game_t {

/**
* Get information about the current game. Returns NULL if no game is loaded.
* NOTE: returns a dummy game record if an unidentified game is loaded.
*/
RC_EXPORT const rc_client_game_t* RC_CCONV rc_client_get_game_info(const rc_client_t* client);

Expand Down
11 changes: 11 additions & 0 deletions deps/rcheevos/include/rc_client_raintegration.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,14 @@ typedef struct rc_client_raintegration_menu_t {
uint32_t num_items;
} rc_client_raintegration_menu_t;

enum {
RC_CLIENT_RAINTEGRATION_ACHIEVEMENT_STATE_NONE = 0,
RC_CLIENT_RAINTEGRATION_ACHIEVEMENT_STATE_PUBLISHED = 1,
RC_CLIENT_RAINTEGRATION_ACHIEVEMENT_STATE_LOCAL = 2,
RC_CLIENT_RAINTEGRATION_ACHIEVEMENT_STATE_MODIFIED = 3,
RC_CLIENT_RAINTEGRATION_ACHIEVEMENT_STATE_INSECURE = 4,
};

enum {
RC_CLIENT_RAINTEGRATION_EVENT_TYPE_NONE = 0,
RC_CLIENT_RAINTEGRATION_EVENT_MENUITEM_CHECKED_CHANGED = 1, /* [menu_item] checked changed */
Expand Down Expand Up @@ -77,11 +85,14 @@ RC_EXPORT int RC_CCONV rc_client_raintegration_activate_menu_item(const rc_clien

RC_EXPORT void RC_CCONV rc_client_raintegration_set_write_memory_function(rc_client_t* client, rc_client_raintegration_write_memory_func_t handler);
RC_EXPORT void RC_CCONV rc_client_raintegration_set_get_game_name_function(rc_client_t* client, rc_client_raintegration_get_game_name_func_t handler);
RC_EXPORT void RC_CCONV rc_client_raintegration_set_console_id(rc_client_t* client, uint32_t console_id);
RC_EXPORT int RC_CCONV rc_client_raintegration_has_modifications(const rc_client_t* client);

RC_EXPORT void RC_CCONV rc_client_raintegration_set_event_handler(rc_client_t* client,
rc_client_raintegration_event_handler_t handler);

RC_EXPORT int RC_CCONV rc_client_raintegration_get_achievement_state(const rc_client_t* client, uint32_t achievement_id);

#endif /* RC_CLIENT_SUPPORTS_RAINTEGRATION */

RC_END_C_DECLS
Expand Down
3 changes: 2 additions & 1 deletion deps/rcheevos/include/rc_runtime_types.h
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,8 @@ enum {
RC_OPERATOR_MULT,
RC_OPERATOR_DIV,
RC_OPERATOR_AND,
RC_OPERATOR_XOR
RC_OPERATOR_XOR,
RC_OPERATOR_MOD
};

typedef struct rc_condition_t rc_condition_t;
Expand Down
38 changes: 31 additions & 7 deletions deps/rcheevos/src/rc_client.c
Original file line number Diff line number Diff line change
Expand Up @@ -1947,13 +1947,13 @@ static void rc_client_fetch_game_data_callback(const rc_api_server_response_t* s
if (!subset->public_.title) {
const char* core_subset_title = rc_client_subset_extract_title(load_state->game, load_state->game->public_.title);
if (core_subset_title) {
rc_client_subset_info_t* scan = load_state->game->subsets;
for (; scan; scan = scan->next) {
if (scan->public_.title == load_state->game->public_.title) {
scan->public_.title = core_subset_title;
break;
}
}
scan = load_state->game->subsets;
for (; scan; scan = scan->next) {
if (scan->public_.title == load_state->game->public_.title) {
scan->public_.title = core_subset_title;
break;
}
}
}

subset->public_.title = rc_buffer_strcpy(&load_state->game->buffer, fetch_game_data_response.title);
Expand Down Expand Up @@ -2058,8 +2058,15 @@ static void rc_client_begin_fetch_game_data(rc_client_load_state_t* load_state)
#endif /* RC_CLIENT_SUPPORTS_HASH */

if (load_state->hash->game_id == 0) {
rc_client_subset_info_t* subset;

subset = (rc_client_subset_info_t*)rc_buffer_alloc(&load_state->game->buffer, sizeof(rc_client_subset_info_t));
memset(subset, 0, sizeof(*subset));
subset->public_.title = "";

load_state->game->public_.title = "Unknown Game";
load_state->game->public_.badge_name = "";
load_state->game->subsets = subset;
client->game = load_state->game;
load_state->game = NULL;

Expand Down Expand Up @@ -2405,6 +2412,23 @@ int rc_client_get_load_game_state(const rc_client_t* client)
return state;
}

int rc_client_is_game_loaded(const rc_client_t* client)
{
const rc_client_game_t* game;

if (!client)
return 0;

#ifdef RC_CLIENT_SUPPORTS_EXTERNAL
if (client->state.external_client && client->state.external_client->get_game_info)
game = client->state.external_client->get_game_info();
else
#endif
game = client->game ? &client->game->public_ : NULL;

return (game && game->id != 0);
}

static void rc_client_game_mark_ui_to_be_hidden(rc_client_t* client, rc_client_game_info_t* game)
{
rc_client_achievement_info_t* achievement;
Expand Down
43 changes: 33 additions & 10 deletions deps/rcheevos/src/rc_client_raintegration.c
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ static void rc_client_raintegration_load_dll(rc_client_t* client,
raintegration->get_host_url = (rc_client_raintegration_get_string_func_t)GetProcAddress(hDLL, "_RA_HostUrl");
raintegration->init_client = (rc_client_raintegration_init_client_func_t)GetProcAddress(hDLL, "_RA_InitClient");
raintegration->init_client_offline = (rc_client_raintegration_init_client_func_t)GetProcAddress(hDLL, "_RA_InitOffline");
raintegration->set_console_id = (rc_client_raintegration_set_int_func_t)GetProcAddress(hDLL, "_RA_SetConsoleID");
raintegration->shutdown = (rc_client_raintegration_action_func_t)GetProcAddress(hDLL, "_RA_Shutdown");

raintegration->update_main_window_handle = (rc_client_raintegration_hwnd_action_func_t)GetProcAddress(hDLL, "_RA_UpdateHWnd");
Expand All @@ -80,6 +81,7 @@ static void rc_client_raintegration_load_dll(rc_client_t* client,
raintegration->set_get_game_name_function = (rc_client_raintegration_set_get_game_name_func_t)GetProcAddress(hDLL, "_Rcheevos_SetRAIntegrationGetGameNameFunction");
raintegration->set_event_handler = (rc_client_raintegration_set_event_handler_func_t)GetProcAddress(hDLL, "_Rcheevos_SetRAIntegrationEventHandler");
raintegration->has_modifications = (rc_client_raintegration_get_int_func_t)GetProcAddress(hDLL, "_Rcheevos_HasModifications");
raintegration->get_achievement_state = (rc_client_raintegration_get_achievement_state_func_t)GetProcAddress(hDLL, "_Rcheevos_GetAchievementState");

if (!raintegration->get_version ||
!raintegration->init_client ||
Expand Down Expand Up @@ -204,6 +206,7 @@ static void rc_client_init_raintegration(rc_client_t* client,
/* attach the external client and call the callback */
client->state.external_client = external_client;

client->state.raintegration->hMainWindow = version_validation_callback_data->main_window_handle;
client->state.raintegration->bIsInited = 1;

version_validation_callback_data->callback(RC_OK, NULL,
Expand Down Expand Up @@ -352,12 +355,14 @@ rc_client_async_handle_t* rc_client_begin_load_raintegration(rc_client_t* client

void rc_client_raintegration_update_main_window_handle(rc_client_t* client, HWND main_window_handle)
{
if (client && client->state.raintegration &&
client->state.raintegration->bIsInited &&
client->state.raintegration->update_main_window_handle)
{
if (client && client->state.raintegration) {
client->state.raintegration->hMainWindow = main_window_handle;

if (client->state.raintegration->bIsInited &&
client->state.raintegration->update_main_window_handle) {
client->state.raintegration->update_main_window_handle(main_window_handle);
}
}
}
}

void rc_client_raintegration_set_write_memory_function(rc_client_t* client, rc_client_raintegration_write_memory_func_t handler)
Expand All @@ -383,26 +388,41 @@ const rc_client_raintegration_menu_t* rc_client_raintegration_get_menu(const rc_
{
if (!client || !client->state.raintegration ||
!client->state.raintegration->bIsInited ||
!client->state.raintegration->get_menu)
{
!client->state.raintegration->get_menu) {
return NULL;
}

return client->state.raintegration->get_menu();
}

void rc_client_raintegration_set_console_id(rc_client_t* client, uint32_t console_id)
{
if (client && client->state.raintegration && client->state.raintegration->set_console_id)
client->state.raintegration->set_console_id(console_id);
}

int rc_client_raintegration_has_modifications(const rc_client_t* client)
{
if (!client || !client->state.raintegration ||
!client->state.raintegration->bIsInited ||
!client->state.raintegration->has_modifications)
{
!client->state.raintegration->bIsInited ||
!client->state.raintegration->has_modifications) {
return 0;
}

return client->state.raintegration->has_modifications();
}

int rc_client_raintegration_get_achievement_state(const rc_client_t* client, uint32_t achievement_id)
{
if (!client || !client->state.raintegration ||
!client->state.raintegration->bIsInited ||
!client->state.raintegration->get_achievement_state) {
return RC_CLIENT_RAINTEGRATION_ACHIEVEMENT_STATE_NONE;
}

return client->state.raintegration->get_achievement_state(achievement_id);
}

void rc_client_raintegration_rebuild_submenu(rc_client_t* client, HMENU hMenu)
{
HMENU hPopupMenu = NULL;
Expand Down Expand Up @@ -464,6 +484,9 @@ void rc_client_raintegration_rebuild_submenu(rc_client_t* client, HMENU hMenu)
AppendMenuA(hMenu, flags, (UINT_PTR)hPopupMenu, menuText);
else
ModifyMenuA(hMenu, nIndex, flags | MF_BYPOSITION, (UINT_PTR)hPopupMenu, menuText);

if (client->state.raintegration->hMainWindow && GetMenu(client->state.raintegration->hMainWindow) == hMenu)
DrawMenuBar(client->state.raintegration->hMainWindow);
}

client->state.raintegration->hPopupMenu = hPopupMenu;
Expand Down
5 changes: 5 additions & 0 deletions deps/rcheevos/src/rc_client_raintegration_internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,23 +17,27 @@ typedef const char* (RC_CCONV* rc_client_raintegration_get_string_func_t)(void);
typedef int (RC_CCONV* rc_client_raintegration_init_client_func_t)(HWND hMainWnd, const char* sClientName, const char* sClientVersion);
typedef int (RC_CCONV* rc_client_raintegration_get_external_client_func_t)(rc_client_external_t* pClient, int nVersion);
typedef void (RC_CCONV* rc_client_raintegration_hwnd_action_func_t)(HWND hWnd);
typedef int (RC_CCONV* rc_client_raintegration_get_achievement_state_func_t)(uint32_t nMenuItemId);
typedef const rc_client_raintegration_menu_t* (RC_CCONV* rc_client_raintegration_get_menu_func_t)(void);
typedef int (RC_CCONV* rc_client_raintegration_activate_menuitem_func_t)(uint32_t nMenuItemId);
typedef void (RC_CCONV* rc_client_raintegration_set_write_memory_func_t)(rc_client_t* pClient, rc_client_raintegration_write_memory_func_t handler);
typedef void (RC_CCONV* rc_client_raintegration_set_get_game_name_func_t)(rc_client_t* pClient, rc_client_raintegration_get_game_name_func_t handler);
typedef void (RC_CCONV* rc_client_raintegration_set_event_handler_func_t)(rc_client_t* pClient, rc_client_raintegration_event_handler_t handler);
typedef void (RC_CCONV* rc_client_raintegration_set_int_func_t)(int);
typedef int (RC_CCONV* rc_client_raintegration_get_int_func_t)(void);

typedef struct rc_client_raintegration_t
{
HINSTANCE hDLL;
HWND hMainWindow;
HMENU hPopupMenu;
uint8_t bIsInited;

rc_client_raintegration_get_string_func_t get_version;
rc_client_raintegration_get_string_func_t get_host_url;
rc_client_raintegration_init_client_func_t init_client;
rc_client_raintegration_init_client_func_t init_client_offline;
rc_client_raintegration_set_int_func_t set_console_id;
rc_client_raintegration_action_func_t shutdown;

rc_client_raintegration_hwnd_action_func_t update_main_window_handle;
Expand All @@ -44,6 +48,7 @@ typedef struct rc_client_raintegration_t
rc_client_raintegration_get_menu_func_t get_menu;
rc_client_raintegration_activate_menuitem_func_t activate_menu_item;
rc_client_raintegration_get_int_func_t has_modifications;
rc_client_raintegration_get_achievement_state_func_t get_achievement_state;

rc_client_raintegration_get_external_client_func_t get_external_client;

Expand Down
9 changes: 9 additions & 0 deletions deps/rcheevos/src/rcheevos/condition.c
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,10 @@ static int rc_parse_operator(const char** memaddr) {
++(*memaddr);
return RC_OPERATOR_XOR;

case '%':
++(*memaddr);
return RC_OPERATOR_MOD;

case '\0':/* end of string */
case '_': /* next condition */
case 'S': /* next condset */
Expand Down Expand Up @@ -226,6 +230,7 @@ rc_condition_t* rc_parse_condition(const char** memaddr, rc_parse_state_t* parse
case RC_OPERATOR_DIV:
case RC_OPERATOR_AND:
case RC_OPERATOR_XOR:
case RC_OPERATOR_MOD:
/* modifying operators are only valid on modifying statements */
if (can_modify)
break;
Expand Down Expand Up @@ -551,5 +556,9 @@ void rc_evaluate_condition_value(rc_typed_value_t* value, rc_condition_t* self,
rc_typed_value_convert(&amount, RC_VALUE_TYPE_UNSIGNED);
value->value.u32 ^= amount.value.u32;
break;

case RC_OPERATOR_MOD:
rc_typed_value_modulus(value, &amount);
break;
}
}
1 change: 1 addition & 0 deletions deps/rcheevos/src/rcheevos/condset.c
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ rc_condset_t* rc_parse_condset(const char** memaddr, rc_parse_state_t* parse, in
case RC_OPERATOR_XOR:
case RC_OPERATOR_DIV:
case RC_OPERATOR_MULT:
case RC_OPERATOR_MOD:
case RC_OPERATOR_NONE:
/* measuring value. leave required_hits at 0 */
break;
Expand Down
Loading

0 comments on commit 264aa45

Please sign in to comment.