gemba 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/THIRD_PARTY_NOTICES +37 -2
- data/assets/placeholder_boxart.png +0 -0
- data/bin/gemba +2 -2
- data/ext/gemba/extconf.rb +23 -1
- data/ext/gemba/gemba_ext.c +436 -2
- data/ext/gemba/gemba_ext.h +2 -0
- data/gemba.gemspec +5 -3
- data/lib/gemba/achievements/achievement.rb +23 -0
- data/lib/gemba/achievements/backend.rb +186 -0
- data/lib/gemba/achievements/cache.rb +70 -0
- data/lib/gemba/achievements/credentials_presenter.rb +142 -0
- data/lib/gemba/achievements/fake_backend.rb +205 -0
- data/lib/gemba/achievements/null_backend.rb +11 -0
- data/lib/gemba/achievements/offline_backend.rb +168 -0
- data/lib/gemba/achievements/retro_achievements/backend.rb +453 -0
- data/lib/gemba/achievements/retro_achievements/cli_sync_requester.rb +64 -0
- data/lib/gemba/achievements/retro_achievements/ping_worker.rb +27 -0
- data/lib/gemba/achievements.rb +19 -0
- data/lib/gemba/achievements_window.rb +556 -0
- data/lib/gemba/app_controller.rb +1015 -0
- data/lib/gemba/bios.rb +54 -0
- data/lib/gemba/boxart_fetcher/libretro_backend.rb +39 -0
- data/lib/gemba/boxart_fetcher/null_backend.rb +12 -0
- data/lib/gemba/boxart_fetcher.rb +79 -0
- data/lib/gemba/bus_emitter.rb +13 -0
- data/lib/gemba/child_window.rb +24 -1
- data/lib/gemba/cli/commands/config_cmd.rb +83 -0
- data/lib/gemba/cli/commands/decode.rb +154 -0
- data/lib/gemba/cli/commands/patch.rb +78 -0
- data/lib/gemba/cli/commands/play.rb +78 -0
- data/lib/gemba/cli/commands/record.rb +114 -0
- data/lib/gemba/cli/commands/replay.rb +161 -0
- data/lib/gemba/cli/commands/retro_achievements.rb +213 -0
- data/lib/gemba/cli/commands/version.rb +22 -0
- data/lib/gemba/cli.rb +52 -364
- data/lib/gemba/config.rb +134 -1
- data/lib/gemba/data/gb_games.json +1 -0
- data/lib/gemba/data/gb_md5.json +1 -0
- data/lib/gemba/data/gba_games.json +1 -0
- data/lib/gemba/data/gba_md5.json +1 -0
- data/lib/gemba/data/gbc_games.json +1 -0
- data/lib/gemba/data/gbc_md5.json +1 -0
- data/lib/gemba/emulator_frame.rb +1060 -0
- data/lib/gemba/event_bus.rb +48 -0
- data/lib/gemba/frame_stack.rb +60 -0
- data/lib/gemba/game_index.rb +84 -0
- data/lib/gemba/game_picker_frame.rb +268 -0
- data/lib/gemba/gamepad_map.rb +103 -0
- data/lib/gemba/headless.rb +6 -5
- data/lib/gemba/headless_player.rb +33 -3
- data/lib/gemba/help_window.rb +61 -0
- data/lib/gemba/hotkey_map.rb +3 -1
- data/lib/gemba/input_recorder.rb +107 -0
- data/lib/gemba/input_replayer.rb +119 -0
- data/lib/gemba/keyboard_map.rb +90 -0
- data/lib/gemba/locales/en.yml +97 -5
- data/lib/gemba/locales/ja.yml +97 -5
- data/lib/gemba/main_window.rb +56 -0
- data/lib/gemba/modal_stack.rb +81 -0
- data/lib/gemba/patcher_window.rb +223 -0
- data/lib/gemba/platform/gb.rb +21 -0
- data/lib/gemba/platform/gba.rb +21 -0
- data/lib/gemba/platform/gbc.rb +23 -0
- data/lib/gemba/platform.rb +20 -0
- data/lib/gemba/platform_open.rb +19 -0
- data/lib/gemba/recorder.rb +4 -3
- data/lib/gemba/replay_player.rb +691 -0
- data/lib/gemba/rom_info.rb +57 -0
- data/lib/gemba/rom_info_window.rb +16 -3
- data/lib/gemba/rom_library.rb +106 -0
- data/lib/gemba/rom_overrides.rb +47 -0
- data/lib/gemba/rom_patcher/bps.rb +161 -0
- data/lib/gemba/rom_patcher/ips.rb +101 -0
- data/lib/gemba/rom_patcher/ups.rb +118 -0
- data/lib/gemba/rom_patcher.rb +109 -0
- data/lib/gemba/{rom_loader.rb → rom_resolver.rb} +7 -6
- data/lib/gemba/runtime.rb +59 -26
- data/lib/gemba/save_state_manager.rb +4 -7
- data/lib/gemba/save_state_picker.rb +17 -4
- data/lib/gemba/session_logger.rb +64 -0
- data/lib/gemba/settings/audio_tab.rb +77 -0
- data/lib/gemba/settings/gamepad_tab.rb +351 -0
- data/lib/gemba/settings/hotkeys_tab.rb +259 -0
- data/lib/gemba/settings/paths.rb +11 -0
- data/lib/gemba/settings/recording_tab.rb +83 -0
- data/lib/gemba/settings/save_states_tab.rb +91 -0
- data/lib/gemba/settings/system_tab.rb +362 -0
- data/lib/gemba/settings/video_tab.rb +318 -0
- data/lib/gemba/settings_window.rb +162 -1036
- data/lib/gemba/version.rb +1 -1
- data/lib/gemba/virtual_keyboard.rb +19 -0
- data/lib/gemba.rb +2 -12
- data/test/achievements_window/test_bulk_sync.rb +218 -0
- data/test/achievements_window/test_bus_events.rb +125 -0
- data/test/achievements_window/test_close_confirmation.rb +201 -0
- data/test/achievements_window/test_initial_state.rb +164 -0
- data/test/achievements_window/test_sorting.rb +227 -0
- data/test/achievements_window/test_tree_rendering.rb +133 -0
- data/test/fixtures/fake_bios.bin +0 -0
- data/test/fixtures/pong.gba +0 -0
- data/test/fixtures/test.gb +0 -0
- data/test/fixtures/test.gbc +0 -0
- data/test/fixtures/test_quicksave.ss +0 -0
- data/test/screenshots/no_focus.png +0 -0
- data/test/shared/teek_test_worker.rb +17 -1
- data/test/shared/tk_test_helper.rb +91 -4
- data/test/support/achievements_window_helpers.rb +18 -0
- data/test/support/fake_core.rb +25 -0
- data/test/support/fake_ra_runtime.rb +74 -0
- data/test/support/fake_requester.rb +68 -0
- data/test/support/player_helpers.rb +20 -5
- data/test/test_achievement.rb +32 -0
- data/test/{test_player.rb → test_app_controller.rb} +353 -85
- data/test/test_bios.rb +123 -0
- data/test/test_boxart_fetcher.rb +150 -0
- data/test/test_cli.rb +17 -265
- data/test/test_cli_config.rb +64 -0
- data/test/test_cli_decode.rb +97 -0
- data/test/test_cli_patch.rb +58 -0
- data/test/test_cli_play.rb +213 -0
- data/test/test_cli_ra.rb +175 -0
- data/test/test_cli_record.rb +69 -0
- data/test/test_cli_replay.rb +72 -0
- data/test/test_cli_sync_requester.rb +152 -0
- data/test/test_cli_version.rb +27 -0
- data/test/test_config.rb +2 -3
- data/test/test_config_ra.rb +69 -0
- data/test/test_core.rb +62 -1
- data/test/test_credentials_presenter.rb +192 -0
- data/test/test_event_bus.rb +100 -0
- data/test/test_fake_backend_achievements.rb +130 -0
- data/test/test_fake_backend_auth.rb +68 -0
- data/test/test_game_index.rb +77 -0
- data/test/test_game_picker_frame.rb +310 -0
- data/test/test_gamepad_map.rb +1 -3
- data/test/test_headless_player.rb +17 -3
- data/test/test_help_window.rb +82 -0
- data/test/test_hotkey_map.rb +22 -1
- data/test/test_input_recorder.rb +179 -0
- data/test/test_input_replay_determinism.rb +113 -0
- data/test/test_input_replayer.rb +162 -0
- data/test/test_keyboard_map.rb +1 -3
- data/test/test_libretro_backend.rb +41 -0
- data/test/test_locale.rb +1 -1
- data/test/test_logging.rb +123 -0
- data/test/test_null_backend.rb +42 -0
- data/test/test_offline_backend.rb +116 -0
- data/test/test_overlay_renderer.rb +1 -1
- data/test/test_platform.rb +149 -0
- data/test/test_ra_backend.rb +313 -0
- data/test/test_ra_backend_unlock_gate.rb +56 -0
- data/test/test_recorder.rb +0 -3
- data/test/test_replay_player.rb +316 -0
- data/test/test_rom_info.rb +149 -0
- data/test/test_rom_overrides.rb +86 -0
- data/test/test_rom_patcher.rb +382 -0
- data/test/{test_rom_loader.rb → test_rom_resolver.rb} +25 -26
- data/test/test_save_state_manager.rb +2 -4
- data/test/test_settings_audio.rb +107 -0
- data/test/test_settings_hotkeys.rb +83 -66
- data/test/test_settings_recording.rb +49 -0
- data/test/test_settings_save_states.rb +97 -0
- data/test/test_settings_system.rb +133 -0
- data/test/test_settings_video.rb +450 -0
- data/test/test_settings_window.rb +76 -507
- data/test/test_tip_service.rb +6 -6
- data/test/test_toast_overlay.rb +1 -1
- data/test/test_virtual_events.rb +156 -0
- data/test/test_virtual_keyboard.rb +1 -1
- data/vendor/rcheevos/CHANGELOG.md +495 -0
- data/vendor/rcheevos/LICENSE +21 -0
- data/vendor/rcheevos/Package.swift +33 -0
- data/vendor/rcheevos/README.md +67 -0
- data/vendor/rcheevos/include/module.modulemap +70 -0
- data/vendor/rcheevos/include/rc_api_editor.h +296 -0
- data/vendor/rcheevos/include/rc_api_info.h +280 -0
- data/vendor/rcheevos/include/rc_api_request.h +77 -0
- data/vendor/rcheevos/include/rc_api_runtime.h +417 -0
- data/vendor/rcheevos/include/rc_api_user.h +262 -0
- data/vendor/rcheevos/include/rc_client.h +877 -0
- data/vendor/rcheevos/include/rc_client_raintegration.h +101 -0
- data/vendor/rcheevos/include/rc_consoles.h +138 -0
- data/vendor/rcheevos/include/rc_error.h +59 -0
- data/vendor/rcheevos/include/rc_export.h +100 -0
- data/vendor/rcheevos/include/rc_hash.h +200 -0
- data/vendor/rcheevos/include/rc_runtime.h +148 -0
- data/vendor/rcheevos/include/rc_runtime_types.h +452 -0
- data/vendor/rcheevos/include/rc_util.h +51 -0
- data/vendor/rcheevos/include/rcheevos.h +8 -0
- data/vendor/rcheevos/src/rapi/rc_api_common.c +1379 -0
- data/vendor/rcheevos/src/rapi/rc_api_common.h +88 -0
- data/vendor/rcheevos/src/rapi/rc_api_editor.c +625 -0
- data/vendor/rcheevos/src/rapi/rc_api_info.c +587 -0
- data/vendor/rcheevos/src/rapi/rc_api_runtime.c +901 -0
- data/vendor/rcheevos/src/rapi/rc_api_user.c +483 -0
- data/vendor/rcheevos/src/rc_client.c +6941 -0
- data/vendor/rcheevos/src/rc_client_external.c +281 -0
- data/vendor/rcheevos/src/rc_client_external.h +177 -0
- data/vendor/rcheevos/src/rc_client_external_versions.h +171 -0
- data/vendor/rcheevos/src/rc_client_internal.h +409 -0
- data/vendor/rcheevos/src/rc_client_raintegration.c +566 -0
- data/vendor/rcheevos/src/rc_client_raintegration_internal.h +61 -0
- data/vendor/rcheevos/src/rc_client_types.natvis +396 -0
- data/vendor/rcheevos/src/rc_compat.c +251 -0
- data/vendor/rcheevos/src/rc_compat.h +121 -0
- data/vendor/rcheevos/src/rc_libretro.c +915 -0
- data/vendor/rcheevos/src/rc_libretro.h +98 -0
- data/vendor/rcheevos/src/rc_util.c +199 -0
- data/vendor/rcheevos/src/rc_version.c +11 -0
- data/vendor/rcheevos/src/rc_version.h +32 -0
- data/vendor/rcheevos/src/rcheevos/alloc.c +312 -0
- data/vendor/rcheevos/src/rcheevos/condition.c +754 -0
- data/vendor/rcheevos/src/rcheevos/condset.c +777 -0
- data/vendor/rcheevos/src/rcheevos/consoleinfo.c +1215 -0
- data/vendor/rcheevos/src/rcheevos/format.c +330 -0
- data/vendor/rcheevos/src/rcheevos/lboard.c +287 -0
- data/vendor/rcheevos/src/rcheevos/memref.c +805 -0
- data/vendor/rcheevos/src/rcheevos/operand.c +607 -0
- data/vendor/rcheevos/src/rcheevos/rc_internal.h +390 -0
- data/vendor/rcheevos/src/rcheevos/rc_runtime_types.natvis +541 -0
- data/vendor/rcheevos/src/rcheevos/rc_validate.c +1406 -0
- data/vendor/rcheevos/src/rcheevos/rc_validate.h +18 -0
- data/vendor/rcheevos/src/rcheevos/richpresence.c +922 -0
- data/vendor/rcheevos/src/rcheevos/runtime.c +852 -0
- data/vendor/rcheevos/src/rcheevos/runtime_progress.c +1073 -0
- data/vendor/rcheevos/src/rcheevos/trigger.c +344 -0
- data/vendor/rcheevos/src/rcheevos/value.c +935 -0
- data/vendor/rcheevos/src/rhash/aes.c +480 -0
- data/vendor/rcheevos/src/rhash/aes.h +49 -0
- data/vendor/rcheevos/src/rhash/cdreader.c +838 -0
- data/vendor/rcheevos/src/rhash/hash.c +1402 -0
- data/vendor/rcheevos/src/rhash/hash_disc.c +1340 -0
- data/vendor/rcheevos/src/rhash/hash_encrypted.c +566 -0
- data/vendor/rcheevos/src/rhash/hash_rom.c +426 -0
- data/vendor/rcheevos/src/rhash/hash_zip.c +460 -0
- data/vendor/rcheevos/src/rhash/md5.c +382 -0
- data/vendor/rcheevos/src/rhash/md5.h +91 -0
- data/vendor/rcheevos/src/rhash/rc_hash_internal.h +116 -0
- data/vendor/rcheevos/test/libretro.h +205 -0
- data/vendor/rcheevos/test/rapi/test_rc_api_common.c +941 -0
- data/vendor/rcheevos/test/rapi/test_rc_api_editor.c +931 -0
- data/vendor/rcheevos/test/rapi/test_rc_api_info.c +545 -0
- data/vendor/rcheevos/test/rapi/test_rc_api_runtime.c +2213 -0
- data/vendor/rcheevos/test/rapi/test_rc_api_user.c +998 -0
- data/vendor/rcheevos/test/rcheevos/mock_memory.h +32 -0
- data/vendor/rcheevos/test/rcheevos/test_condition.c +570 -0
- data/vendor/rcheevos/test/rcheevos/test_condset.c +5170 -0
- data/vendor/rcheevos/test/rcheevos/test_consoleinfo.c +203 -0
- data/vendor/rcheevos/test/rcheevos/test_format.c +112 -0
- data/vendor/rcheevos/test/rcheevos/test_lboard.c +746 -0
- data/vendor/rcheevos/test/rcheevos/test_memref.c +520 -0
- data/vendor/rcheevos/test/rcheevos/test_operand.c +692 -0
- data/vendor/rcheevos/test/rcheevos/test_rc_validate.c +502 -0
- data/vendor/rcheevos/test/rcheevos/test_richpresence.c +1564 -0
- data/vendor/rcheevos/test/rcheevos/test_runtime.c +1667 -0
- data/vendor/rcheevos/test/rcheevos/test_runtime_progress.c +1821 -0
- data/vendor/rcheevos/test/rcheevos/test_timing.c +166 -0
- data/vendor/rcheevos/test/rcheevos/test_trigger.c +2521 -0
- data/vendor/rcheevos/test/rcheevos/test_value.c +870 -0
- data/vendor/rcheevos/test/rcheevos-test.sln +46 -0
- data/vendor/rcheevos/test/rcheevos-test.vcxproj +239 -0
- data/vendor/rcheevos/test/rcheevos-test.vcxproj.filters +335 -0
- data/vendor/rcheevos/test/rhash/data.c +657 -0
- data/vendor/rcheevos/test/rhash/data.h +32 -0
- data/vendor/rcheevos/test/rhash/mock_filereader.c +236 -0
- data/vendor/rcheevos/test/rhash/mock_filereader.h +31 -0
- data/vendor/rcheevos/test/rhash/test_cdreader.c +920 -0
- data/vendor/rcheevos/test/rhash/test_hash.c +310 -0
- data/vendor/rcheevos/test/rhash/test_hash_disc.c +1450 -0
- data/vendor/rcheevos/test/rhash/test_hash_rom.c +899 -0
- data/vendor/rcheevos/test/rhash/test_hash_zip.c +551 -0
- data/vendor/rcheevos/test/test.c +113 -0
- data/vendor/rcheevos/test/test_framework.h +205 -0
- data/vendor/rcheevos/test/test_rc_client.c +10509 -0
- data/vendor/rcheevos/test/test_rc_client_external.c +2197 -0
- data/vendor/rcheevos/test/test_rc_client_raintegration.c +441 -0
- data/vendor/rcheevos/test/test_rc_libretro.c +952 -0
- data/vendor/rcheevos/test/test_types.natvis +9 -0
- data/vendor/rcheevos/validator/validator.c +658 -0
- data/vendor/rcheevos/validator/validator.vcxproj +152 -0
- data/vendor/rcheevos/validator/validator.vcxproj.filters +82 -0
- metadata +274 -11
- data/lib/gemba/input_mappings.rb +0 -214
- data/lib/gemba/player.rb +0 -1525
|
@@ -0,0 +1,877 @@
|
|
|
1
|
+
#ifndef RC_CLIENT_H
|
|
2
|
+
#define RC_CLIENT_H
|
|
3
|
+
|
|
4
|
+
#include "rc_api_request.h"
|
|
5
|
+
#include "rc_error.h"
|
|
6
|
+
|
|
7
|
+
#include <stddef.h>
|
|
8
|
+
#include <stdint.h>
|
|
9
|
+
#include <time.h>
|
|
10
|
+
|
|
11
|
+
RC_BEGIN_C_DECLS
|
|
12
|
+
|
|
13
|
+
/* implementation abstracted in rc_client_internal.h */
|
|
14
|
+
typedef struct rc_client_t rc_client_t;
|
|
15
|
+
typedef struct rc_client_async_handle_t rc_client_async_handle_t;
|
|
16
|
+
|
|
17
|
+
/*****************************************************************************\
|
|
18
|
+
| Callbacks |
|
|
19
|
+
\*****************************************************************************/
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Callback used to read num_bytes bytes from memory starting at address into buffer.
|
|
23
|
+
* Returns the number of bytes read. A return value of 0 indicates the address was invalid.
|
|
24
|
+
*/
|
|
25
|
+
typedef uint32_t (RC_CCONV *rc_client_read_memory_func_t)(uint32_t address, uint8_t* buffer, uint32_t num_bytes, rc_client_t* client);
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Internal method passed to rc_client_server_call_t to process the server response.
|
|
29
|
+
*/
|
|
30
|
+
typedef void (RC_CCONV *rc_client_server_callback_t)(const rc_api_server_response_t* server_response, void* callback_data);
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Callback used to issue a request to the server.
|
|
34
|
+
*/
|
|
35
|
+
typedef void (RC_CCONV *rc_client_server_call_t)(const rc_api_request_t* request, rc_client_server_callback_t callback, void* callback_data, rc_client_t* client);
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Generic callback for asynchronous eventing.
|
|
39
|
+
*/
|
|
40
|
+
typedef void (RC_CCONV *rc_client_callback_t)(int result, const char* error_message, rc_client_t* client, void* userdata);
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Callback for logging or displaying a message.
|
|
44
|
+
*/
|
|
45
|
+
typedef void (RC_CCONV *rc_client_message_callback_t)(const char* message, const rc_client_t* client);
|
|
46
|
+
|
|
47
|
+
/*****************************************************************************\
|
|
48
|
+
| Runtime |
|
|
49
|
+
\*****************************************************************************/
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Creates a new rc_client_t object.
|
|
53
|
+
*/
|
|
54
|
+
RC_EXPORT rc_client_t* RC_CCONV rc_client_create(rc_client_read_memory_func_t read_memory_function, rc_client_server_call_t server_call_function);
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Releases resources associated to a rc_client_t object.
|
|
58
|
+
* Pointer will no longer be valid after making this call.
|
|
59
|
+
*/
|
|
60
|
+
RC_EXPORT void RC_CCONV rc_client_destroy(rc_client_t* client);
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Sets whether hardcore is enabled (on by default).
|
|
64
|
+
* Can be called with a game loaded.
|
|
65
|
+
* Enabling hardcore with a game loaded will raise an RC_CLIENT_EVENT_RESET
|
|
66
|
+
* event. Processing will be disabled until rc_client_reset is called.
|
|
67
|
+
*/
|
|
68
|
+
RC_EXPORT void RC_CCONV rc_client_set_hardcore_enabled(rc_client_t* client, int enabled);
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Gets whether hardcore is enabled (on by default).
|
|
72
|
+
*/
|
|
73
|
+
RC_EXPORT int RC_CCONV rc_client_get_hardcore_enabled(const rc_client_t* client);
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Sets whether encore mode is enabled (off by default).
|
|
77
|
+
* Evaluated when loading a game. Has no effect while a game is loaded.
|
|
78
|
+
*/
|
|
79
|
+
RC_EXPORT void RC_CCONV rc_client_set_encore_mode_enabled(rc_client_t* client, int enabled);
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Gets whether encore mode is enabled (off by default).
|
|
83
|
+
*/
|
|
84
|
+
RC_EXPORT int RC_CCONV rc_client_get_encore_mode_enabled(const rc_client_t* client);
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Sets whether unofficial achievements should be loaded.
|
|
88
|
+
* Evaluated when loading a game. Has no effect while a game is loaded.
|
|
89
|
+
*/
|
|
90
|
+
RC_EXPORT void RC_CCONV rc_client_set_unofficial_enabled(rc_client_t* client, int enabled);
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Gets whether unofficial achievements should be loaded.
|
|
94
|
+
*/
|
|
95
|
+
RC_EXPORT int RC_CCONV rc_client_get_unofficial_enabled(const rc_client_t* client);
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Sets whether spectator mode is enabled (off by default).
|
|
99
|
+
* If enabled, events for achievement unlocks and leaderboard submissions will be
|
|
100
|
+
* raised, but server calls to actually perform the unlock/submit will not occur.
|
|
101
|
+
* Can be modified while a game is loaded. Evaluated at unlock/submit time.
|
|
102
|
+
* Cannot be modified if disabled before a game is loaded.
|
|
103
|
+
*/
|
|
104
|
+
RC_EXPORT void RC_CCONV rc_client_set_spectator_mode_enabled(rc_client_t* client, int enabled);
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Gets whether spectator mode is enabled (off by default).
|
|
108
|
+
*/
|
|
109
|
+
RC_EXPORT int RC_CCONV rc_client_get_spectator_mode_enabled(const rc_client_t* client);
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Attaches client-specific data to the runtime.
|
|
113
|
+
*/
|
|
114
|
+
RC_EXPORT void RC_CCONV rc_client_set_userdata(rc_client_t* client, void* userdata);
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Gets the client-specific data attached to the runtime.
|
|
118
|
+
*/
|
|
119
|
+
RC_EXPORT void* RC_CCONV rc_client_get_userdata(const rc_client_t* client);
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Sets the name of the server to use.
|
|
123
|
+
*/
|
|
124
|
+
RC_EXPORT void RC_CCONV rc_client_set_host(rc_client_t* client, const char* hostname);
|
|
125
|
+
|
|
126
|
+
typedef uint64_t rc_clock_t;
|
|
127
|
+
typedef rc_clock_t (RC_CCONV *rc_get_time_millisecs_func_t)(const rc_client_t* client);
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Specifies a function that returns a value that increases once per millisecond.
|
|
131
|
+
*/
|
|
132
|
+
RC_EXPORT void RC_CCONV rc_client_set_get_time_millisecs_function(rc_client_t* client, rc_get_time_millisecs_func_t handler);
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Marks an async process as aborted. The associated callback will not be called.
|
|
136
|
+
*/
|
|
137
|
+
RC_EXPORT void RC_CCONV rc_client_abort_async(rc_client_t* client, rc_client_async_handle_t* async_handle);
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Gets a clause that can be added to the User-Agent to identify the version of rcheevos being used.
|
|
141
|
+
*/
|
|
142
|
+
RC_EXPORT size_t RC_CCONV rc_client_get_user_agent_clause(rc_client_t* client, char buffer[], size_t buffer_size);
|
|
143
|
+
|
|
144
|
+
/*****************************************************************************\
|
|
145
|
+
| Logging |
|
|
146
|
+
\*****************************************************************************/
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Sets the logging level and provides a callback to be called to do the logging.
|
|
150
|
+
*/
|
|
151
|
+
RC_EXPORT void RC_CCONV rc_client_enable_logging(rc_client_t* client, int level, rc_client_message_callback_t callback);
|
|
152
|
+
enum {
|
|
153
|
+
RC_CLIENT_LOG_LEVEL_NONE = 0,
|
|
154
|
+
RC_CLIENT_LOG_LEVEL_ERROR = 1,
|
|
155
|
+
RC_CLIENT_LOG_LEVEL_WARN = 2,
|
|
156
|
+
RC_CLIENT_LOG_LEVEL_INFO = 3,
|
|
157
|
+
RC_CLIENT_LOG_LEVEL_VERBOSE = 4,
|
|
158
|
+
NUM_RC_CLIENT_LOG_LEVELS = 5
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
/*****************************************************************************\
|
|
162
|
+
| User |
|
|
163
|
+
\*****************************************************************************/
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Attempt to login a user.
|
|
167
|
+
*/
|
|
168
|
+
RC_EXPORT rc_client_async_handle_t* RC_CCONV rc_client_begin_login_with_password(rc_client_t* client,
|
|
169
|
+
const char* username, const char* password,
|
|
170
|
+
rc_client_callback_t callback, void* callback_userdata);
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Attempt to login a user.
|
|
174
|
+
*/
|
|
175
|
+
RC_EXPORT rc_client_async_handle_t* RC_CCONV rc_client_begin_login_with_token(rc_client_t* client,
|
|
176
|
+
const char* username, const char* token,
|
|
177
|
+
rc_client_callback_t callback, void* callback_userdata);
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* Logout the user.
|
|
181
|
+
*/
|
|
182
|
+
RC_EXPORT void RC_CCONV rc_client_logout(rc_client_t* client);
|
|
183
|
+
|
|
184
|
+
typedef struct rc_client_user_t {
|
|
185
|
+
const char* display_name;
|
|
186
|
+
const char* username;
|
|
187
|
+
const char* token;
|
|
188
|
+
uint32_t score;
|
|
189
|
+
uint32_t score_softcore;
|
|
190
|
+
uint32_t num_unread_messages;
|
|
191
|
+
/* minimum version: 12.0 */
|
|
192
|
+
const char* avatar_url;
|
|
193
|
+
} rc_client_user_t;
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Gets information about the logged in user. Will return NULL if the user is not logged in.
|
|
197
|
+
*/
|
|
198
|
+
RC_EXPORT const rc_client_user_t* RC_CCONV rc_client_get_user_info(const rc_client_t* client);
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* Gets the URL for the user's profile picture.
|
|
202
|
+
* Returns RC_OK on success.
|
|
203
|
+
*/
|
|
204
|
+
RC_EXPORT int RC_CCONV rc_client_user_get_image_url(const rc_client_user_t* user, char buffer[], size_t buffer_size);
|
|
205
|
+
|
|
206
|
+
typedef struct rc_client_user_game_summary_t {
|
|
207
|
+
uint32_t num_core_achievements;
|
|
208
|
+
uint32_t num_unofficial_achievements;
|
|
209
|
+
uint32_t num_unlocked_achievements;
|
|
210
|
+
uint32_t num_unsupported_achievements;
|
|
211
|
+
|
|
212
|
+
uint32_t points_core;
|
|
213
|
+
uint32_t points_unlocked;
|
|
214
|
+
|
|
215
|
+
/* minimum version: 12.1 */
|
|
216
|
+
time_t beaten_time;
|
|
217
|
+
time_t completed_time;
|
|
218
|
+
} rc_client_user_game_summary_t;
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* Gets a breakdown of the number of achievements in the game, and how many the user has unlocked.
|
|
222
|
+
* Used for the "You have unlocked X of Y achievements" message shown when the game starts.
|
|
223
|
+
*/
|
|
224
|
+
RC_EXPORT void RC_CCONV rc_client_get_user_game_summary(const rc_client_t* client, rc_client_user_game_summary_t* summary);
|
|
225
|
+
|
|
226
|
+
typedef struct rc_client_all_user_progress_entry_t {
|
|
227
|
+
uint32_t game_id;
|
|
228
|
+
uint32_t num_achievements;
|
|
229
|
+
uint32_t num_unlocked_achievements;
|
|
230
|
+
uint32_t num_unlocked_achievements_hardcore;
|
|
231
|
+
} rc_client_all_user_progress_entry_t;
|
|
232
|
+
|
|
233
|
+
typedef struct rc_client_all_user_progress_t {
|
|
234
|
+
rc_client_all_user_progress_entry_t* entries;
|
|
235
|
+
uint32_t num_entries;
|
|
236
|
+
} rc_client_all_user_progress_t;
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* Callback that is fired when an all progress query completes. list may be null if the query failed.
|
|
240
|
+
*/
|
|
241
|
+
typedef void(RC_CCONV* rc_client_fetch_all_user_progress_callback_t)(int result, const char* error_message,
|
|
242
|
+
rc_client_all_user_progress_t* list,
|
|
243
|
+
rc_client_t* client, void* callback_userdata);
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* Starts an asynchronous request for all progress for the given console.
|
|
247
|
+
* This query returns the total number of achievements for all games tracked by this console, as well as
|
|
248
|
+
* the user's achievement unlock count for both softcore and hardcore modes.
|
|
249
|
+
*/
|
|
250
|
+
RC_EXPORT rc_client_async_handle_t* RC_CCONV
|
|
251
|
+
rc_client_begin_fetch_all_user_progress(rc_client_t* client, uint32_t console_id,
|
|
252
|
+
rc_client_fetch_all_user_progress_callback_t callback, void* callback_userdata);
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* Destroys a previously-allocated result from the rc_client_begin_fetch_all_progress_list() callback.
|
|
256
|
+
*/
|
|
257
|
+
RC_EXPORT void RC_CCONV rc_client_destroy_all_user_progress(rc_client_all_user_progress_t* list);
|
|
258
|
+
|
|
259
|
+
/*****************************************************************************\
|
|
260
|
+
| Game |
|
|
261
|
+
\*****************************************************************************/
|
|
262
|
+
|
|
263
|
+
#ifdef RC_CLIENT_SUPPORTS_HASH
|
|
264
|
+
/**
|
|
265
|
+
* Start loading an unidentified game.
|
|
266
|
+
*/
|
|
267
|
+
RC_EXPORT rc_client_async_handle_t* RC_CCONV rc_client_begin_identify_and_load_game(rc_client_t* client,
|
|
268
|
+
uint32_t console_id, const char* file_path,
|
|
269
|
+
const uint8_t* data, size_t data_size,
|
|
270
|
+
rc_client_callback_t callback, void* callback_userdata);
|
|
271
|
+
|
|
272
|
+
struct rc_hash_callbacks;
|
|
273
|
+
/**
|
|
274
|
+
* Provide callback functions for interacting with the file system and processing disc-based files when generating hashes.
|
|
275
|
+
*/
|
|
276
|
+
RC_EXPORT void rc_client_set_hash_callbacks(rc_client_t* client, const struct rc_hash_callbacks* callbacks);
|
|
277
|
+
#endif
|
|
278
|
+
|
|
279
|
+
/**
|
|
280
|
+
* Start loading a game.
|
|
281
|
+
*/
|
|
282
|
+
RC_EXPORT rc_client_async_handle_t* RC_CCONV rc_client_begin_load_game(rc_client_t* client, const char* hash,
|
|
283
|
+
rc_client_callback_t callback, void* callback_userdata);
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* Gets the current progress of the asynchronous load game process.
|
|
287
|
+
*/
|
|
288
|
+
RC_EXPORT int RC_CCONV rc_client_get_load_game_state(const rc_client_t* client);
|
|
289
|
+
enum {
|
|
290
|
+
RC_CLIENT_LOAD_GAME_STATE_NONE,
|
|
291
|
+
RC_CLIENT_LOAD_GAME_STATE_AWAIT_LOGIN,
|
|
292
|
+
RC_CLIENT_LOAD_GAME_STATE_IDENTIFYING_GAME,
|
|
293
|
+
RC_CLIENT_LOAD_GAME_STATE_FETCHING_GAME_DATA, /* [deprecated] - game data is now returned by identify call */
|
|
294
|
+
RC_CLIENT_LOAD_GAME_STATE_STARTING_SESSION,
|
|
295
|
+
RC_CLIENT_LOAD_GAME_STATE_DONE,
|
|
296
|
+
RC_CLIENT_LOAD_GAME_STATE_ABORTED
|
|
297
|
+
};
|
|
298
|
+
|
|
299
|
+
/**
|
|
300
|
+
* Determines if a game was successfully identified and loaded.
|
|
301
|
+
*/
|
|
302
|
+
RC_EXPORT int RC_CCONV rc_client_is_game_loaded(const rc_client_t* client);
|
|
303
|
+
|
|
304
|
+
/**
|
|
305
|
+
* Unloads the current game.
|
|
306
|
+
*/
|
|
307
|
+
RC_EXPORT void RC_CCONV rc_client_unload_game(rc_client_t* client);
|
|
308
|
+
|
|
309
|
+
typedef struct rc_client_game_t {
|
|
310
|
+
uint32_t id;
|
|
311
|
+
uint32_t console_id;
|
|
312
|
+
const char* title;
|
|
313
|
+
const char* hash;
|
|
314
|
+
const char* badge_name;
|
|
315
|
+
/* minimum version: 12.0 */
|
|
316
|
+
const char* badge_url;
|
|
317
|
+
} rc_client_game_t;
|
|
318
|
+
|
|
319
|
+
/**
|
|
320
|
+
* Get information about the current game. Returns NULL if no game is loaded.
|
|
321
|
+
* NOTE: returns a dummy game record if an unidentified game is loaded.
|
|
322
|
+
*/
|
|
323
|
+
RC_EXPORT const rc_client_game_t* RC_CCONV rc_client_get_game_info(const rc_client_t* client);
|
|
324
|
+
|
|
325
|
+
/**
|
|
326
|
+
* Gets the URL for the game image.
|
|
327
|
+
* Returns RC_OK on success.
|
|
328
|
+
*/
|
|
329
|
+
RC_EXPORT int RC_CCONV rc_client_game_get_image_url(const rc_client_game_t* game, char buffer[], size_t buffer_size);
|
|
330
|
+
|
|
331
|
+
#ifdef RC_CLIENT_SUPPORTS_HASH
|
|
332
|
+
/**
|
|
333
|
+
* Changes the active disc in a multi-disc game.
|
|
334
|
+
*/
|
|
335
|
+
RC_EXPORT rc_client_async_handle_t* RC_CCONV rc_client_begin_identify_and_change_media(rc_client_t* client, const char* file_path,
|
|
336
|
+
const uint8_t* data, size_t data_size, rc_client_callback_t callback, void* callback_userdata);
|
|
337
|
+
#endif
|
|
338
|
+
|
|
339
|
+
/**
|
|
340
|
+
* Changes the active disc in a multi-disc game.
|
|
341
|
+
*/
|
|
342
|
+
RC_EXPORT rc_client_async_handle_t* RC_CCONV rc_client_begin_change_media(rc_client_t* client, const char* hash,
|
|
343
|
+
rc_client_callback_t callback, void* callback_userdata);
|
|
344
|
+
/* this function was renamed in rcheevos 12.0 */
|
|
345
|
+
#define rc_client_begin_change_media_from_hash rc_client_begin_change_media
|
|
346
|
+
|
|
347
|
+
/*****************************************************************************\
|
|
348
|
+
| Subsets |
|
|
349
|
+
\*****************************************************************************/
|
|
350
|
+
|
|
351
|
+
typedef struct rc_client_subset_t {
|
|
352
|
+
uint32_t id;
|
|
353
|
+
const char* title;
|
|
354
|
+
char badge_name[16];
|
|
355
|
+
|
|
356
|
+
uint32_t num_achievements;
|
|
357
|
+
uint32_t num_leaderboards;
|
|
358
|
+
|
|
359
|
+
/* minimum version: 12.0 */
|
|
360
|
+
const char* badge_url;
|
|
361
|
+
} rc_client_subset_t;
|
|
362
|
+
|
|
363
|
+
RC_EXPORT const rc_client_subset_t* RC_CCONV rc_client_get_subset_info(rc_client_t* client, uint32_t subset_id);
|
|
364
|
+
|
|
365
|
+
RC_EXPORT void RC_CCONV rc_client_get_user_subset_summary(const rc_client_t* client, uint32_t subset_id, rc_client_user_game_summary_t* summary);
|
|
366
|
+
|
|
367
|
+
typedef struct rc_client_subset_list_t {
|
|
368
|
+
const rc_client_subset_t** subsets;
|
|
369
|
+
uint32_t num_subsets;
|
|
370
|
+
} rc_client_subset_list_t;
|
|
371
|
+
|
|
372
|
+
/**
|
|
373
|
+
* Creates a list of subsets for the currently loaded game.
|
|
374
|
+
* Returns an allocated list that must be free'd by calling rc_client_destroy_subset_list.
|
|
375
|
+
*/
|
|
376
|
+
RC_EXPORT rc_client_subset_list_t* RC_CCONV rc_client_create_subset_list(rc_client_t* client);
|
|
377
|
+
|
|
378
|
+
/**
|
|
379
|
+
* Destroys a list allocated by rc_client_create_subset_list_list.
|
|
380
|
+
*/
|
|
381
|
+
RC_EXPORT void RC_CCONV rc_client_destroy_subset_list(rc_client_subset_list_t* list);
|
|
382
|
+
|
|
383
|
+
/*****************************************************************************\
|
|
384
|
+
| Fetch Game Hashes |
|
|
385
|
+
\*****************************************************************************/
|
|
386
|
+
|
|
387
|
+
typedef struct rc_client_hash_library_entry_t {
|
|
388
|
+
char hash[33];
|
|
389
|
+
uint32_t game_id;
|
|
390
|
+
} rc_client_hash_library_entry_t;
|
|
391
|
+
|
|
392
|
+
typedef struct rc_client_hash_library_t {
|
|
393
|
+
rc_client_hash_library_entry_t* entries;
|
|
394
|
+
uint32_t num_entries;
|
|
395
|
+
} rc_client_hash_library_t;
|
|
396
|
+
|
|
397
|
+
/**
|
|
398
|
+
* Callback that is fired when a hash library request completes. list may be null if the query failed.
|
|
399
|
+
*/
|
|
400
|
+
typedef void(RC_CCONV* rc_client_fetch_hash_library_callback_t)(int result, const char* error_message,
|
|
401
|
+
rc_client_hash_library_t* list, rc_client_t* client,
|
|
402
|
+
void* callback_userdata);
|
|
403
|
+
|
|
404
|
+
/**
|
|
405
|
+
* Starts an asynchronous request for all hashes for the given console.
|
|
406
|
+
* This request returns a mapping from hashes to the game's unique identifier. A single game may have multiple
|
|
407
|
+
* hashes in the case of multi-disc games, or variants that are still compatible with the same achievement set.
|
|
408
|
+
*/
|
|
409
|
+
RC_EXPORT rc_client_async_handle_t* RC_CCONV rc_client_begin_fetch_hash_library(
|
|
410
|
+
rc_client_t* client, uint32_t console_id, rc_client_fetch_hash_library_callback_t callback, void* callback_userdata);
|
|
411
|
+
|
|
412
|
+
/**
|
|
413
|
+
* Destroys a previously-allocated result from the rc_client_destroy_hash_library() callback.
|
|
414
|
+
*/
|
|
415
|
+
RC_EXPORT void RC_CCONV rc_client_destroy_hash_library(rc_client_hash_library_t* list);
|
|
416
|
+
|
|
417
|
+
/*****************************************************************************\
|
|
418
|
+
| Fetch Game Titles |
|
|
419
|
+
\*****************************************************************************/
|
|
420
|
+
|
|
421
|
+
typedef struct rc_client_game_title_entry_t {
|
|
422
|
+
uint32_t game_id;
|
|
423
|
+
const char* title;
|
|
424
|
+
char badge_name[16];
|
|
425
|
+
const char* badge_url;
|
|
426
|
+
} rc_client_game_title_entry_t;
|
|
427
|
+
|
|
428
|
+
typedef struct rc_client_game_title_list_t {
|
|
429
|
+
rc_client_game_title_entry_t* entries;
|
|
430
|
+
uint32_t num_entries;
|
|
431
|
+
} rc_client_game_title_list_t;
|
|
432
|
+
|
|
433
|
+
/**
|
|
434
|
+
* Callback that is fired when a game titles request completes. list may be null if the query failed.
|
|
435
|
+
*/
|
|
436
|
+
typedef void(RC_CCONV* rc_client_fetch_game_titles_callback_t)(int result, const char* error_message,
|
|
437
|
+
rc_client_game_title_list_t* list, rc_client_t* client,
|
|
438
|
+
void* callback_userdata);
|
|
439
|
+
|
|
440
|
+
/**
|
|
441
|
+
* Starts an asynchronous request for titles and badge names for the specified games.
|
|
442
|
+
* The caller must provide an array of game IDs and the number of IDs in the array.
|
|
443
|
+
*/
|
|
444
|
+
RC_EXPORT rc_client_async_handle_t* RC_CCONV rc_client_begin_fetch_game_titles(
|
|
445
|
+
rc_client_t* client, const uint32_t* game_ids, uint32_t num_game_ids,
|
|
446
|
+
rc_client_fetch_game_titles_callback_t callback, void* callback_userdata);
|
|
447
|
+
|
|
448
|
+
/**
|
|
449
|
+
* Destroys a previously-allocated result from the rc_client_begin_fetch_game_titles() callback.
|
|
450
|
+
*/
|
|
451
|
+
RC_EXPORT void RC_CCONV rc_client_destroy_game_title_list(rc_client_game_title_list_t* list);
|
|
452
|
+
|
|
453
|
+
/*****************************************************************************\
|
|
454
|
+
| Achievements |
|
|
455
|
+
\*****************************************************************************/
|
|
456
|
+
|
|
457
|
+
enum {
|
|
458
|
+
RC_CLIENT_ACHIEVEMENT_STATE_INACTIVE = 0, /* unprocessed */
|
|
459
|
+
RC_CLIENT_ACHIEVEMENT_STATE_ACTIVE = 1, /* eligible to trigger */
|
|
460
|
+
RC_CLIENT_ACHIEVEMENT_STATE_UNLOCKED = 2, /* earned by user */
|
|
461
|
+
RC_CLIENT_ACHIEVEMENT_STATE_DISABLED = 3, /* not supported by this version of the runtime */
|
|
462
|
+
NUM_RC_CLIENT_ACHIEVEMENT_STATES = 4
|
|
463
|
+
};
|
|
464
|
+
|
|
465
|
+
enum {
|
|
466
|
+
RC_CLIENT_ACHIEVEMENT_CATEGORY_NONE = 0,
|
|
467
|
+
RC_CLIENT_ACHIEVEMENT_CATEGORY_CORE = (1 << 0),
|
|
468
|
+
RC_CLIENT_ACHIEVEMENT_CATEGORY_UNOFFICIAL = (1 << 1),
|
|
469
|
+
RC_CLIENT_ACHIEVEMENT_CATEGORY_CORE_AND_UNOFFICIAL = RC_CLIENT_ACHIEVEMENT_CATEGORY_CORE | RC_CLIENT_ACHIEVEMENT_CATEGORY_UNOFFICIAL
|
|
470
|
+
};
|
|
471
|
+
|
|
472
|
+
enum {
|
|
473
|
+
RC_CLIENT_ACHIEVEMENT_TYPE_STANDARD = 0,
|
|
474
|
+
RC_CLIENT_ACHIEVEMENT_TYPE_MISSABLE = 1,
|
|
475
|
+
RC_CLIENT_ACHIEVEMENT_TYPE_PROGRESSION = 2,
|
|
476
|
+
RC_CLIENT_ACHIEVEMENT_TYPE_WIN = 3
|
|
477
|
+
};
|
|
478
|
+
|
|
479
|
+
enum {
|
|
480
|
+
RC_CLIENT_ACHIEVEMENT_BUCKET_UNKNOWN = 0,
|
|
481
|
+
RC_CLIENT_ACHIEVEMENT_BUCKET_LOCKED = 1,
|
|
482
|
+
RC_CLIENT_ACHIEVEMENT_BUCKET_UNLOCKED = 2,
|
|
483
|
+
RC_CLIENT_ACHIEVEMENT_BUCKET_UNSUPPORTED = 3,
|
|
484
|
+
RC_CLIENT_ACHIEVEMENT_BUCKET_UNOFFICIAL = 4,
|
|
485
|
+
RC_CLIENT_ACHIEVEMENT_BUCKET_RECENTLY_UNLOCKED = 5,
|
|
486
|
+
RC_CLIENT_ACHIEVEMENT_BUCKET_ACTIVE_CHALLENGE = 6,
|
|
487
|
+
RC_CLIENT_ACHIEVEMENT_BUCKET_ALMOST_THERE = 7,
|
|
488
|
+
RC_CLIENT_ACHIEVEMENT_BUCKET_UNSYNCED = 8,
|
|
489
|
+
NUM_RC_CLIENT_ACHIEVEMENT_BUCKETS = 9
|
|
490
|
+
};
|
|
491
|
+
|
|
492
|
+
enum {
|
|
493
|
+
RC_CLIENT_ACHIEVEMENT_UNLOCKED_NONE = 0,
|
|
494
|
+
RC_CLIENT_ACHIEVEMENT_UNLOCKED_SOFTCORE = (1 << 0),
|
|
495
|
+
RC_CLIENT_ACHIEVEMENT_UNLOCKED_HARDCORE = (1 << 1),
|
|
496
|
+
RC_CLIENT_ACHIEVEMENT_UNLOCKED_BOTH = RC_CLIENT_ACHIEVEMENT_UNLOCKED_SOFTCORE | RC_CLIENT_ACHIEVEMENT_UNLOCKED_HARDCORE
|
|
497
|
+
};
|
|
498
|
+
|
|
499
|
+
typedef struct rc_client_achievement_t {
|
|
500
|
+
const char* title;
|
|
501
|
+
const char* description;
|
|
502
|
+
char badge_name[8];
|
|
503
|
+
char measured_progress[24];
|
|
504
|
+
float measured_percent;
|
|
505
|
+
uint32_t id;
|
|
506
|
+
uint32_t points;
|
|
507
|
+
time_t unlock_time;
|
|
508
|
+
uint8_t state;
|
|
509
|
+
uint8_t category;
|
|
510
|
+
uint8_t bucket;
|
|
511
|
+
uint8_t unlocked;
|
|
512
|
+
/* minimum version: 11.1 */
|
|
513
|
+
float rarity;
|
|
514
|
+
float rarity_hardcore;
|
|
515
|
+
uint8_t type;
|
|
516
|
+
/* minimum version: 12.0 */
|
|
517
|
+
const char* badge_url;
|
|
518
|
+
const char* badge_locked_url;
|
|
519
|
+
} rc_client_achievement_t;
|
|
520
|
+
|
|
521
|
+
/**
|
|
522
|
+
* Get information about an achievement. Returns NULL if not found.
|
|
523
|
+
*/
|
|
524
|
+
RC_EXPORT const rc_client_achievement_t* RC_CCONV rc_client_get_achievement_info(rc_client_t* client, uint32_t id);
|
|
525
|
+
|
|
526
|
+
/**
|
|
527
|
+
* Gets the next achievement after a provided achievement that fits in the specified bucket. Returns NULL if none found.
|
|
528
|
+
*/
|
|
529
|
+
RC_EXPORT const rc_client_achievement_t * RC_CCONV rc_client_get_next_achievement_info(rc_client_t * client, const rc_client_achievement_t * achievement, int bucket);
|
|
530
|
+
|
|
531
|
+
/**
|
|
532
|
+
* Gets the URL for the achievement image.
|
|
533
|
+
* Returns RC_OK on success.
|
|
534
|
+
*/
|
|
535
|
+
RC_EXPORT int RC_CCONV rc_client_achievement_get_image_url(const rc_client_achievement_t* achievement, int state, char buffer[], size_t buffer_size);
|
|
536
|
+
|
|
537
|
+
typedef struct rc_client_achievement_bucket_t {
|
|
538
|
+
const rc_client_achievement_t** achievements;
|
|
539
|
+
uint32_t num_achievements;
|
|
540
|
+
|
|
541
|
+
const char* label;
|
|
542
|
+
uint32_t subset_id;
|
|
543
|
+
uint8_t bucket_type;
|
|
544
|
+
} rc_client_achievement_bucket_t;
|
|
545
|
+
|
|
546
|
+
typedef struct rc_client_achievement_list_t {
|
|
547
|
+
const rc_client_achievement_bucket_t* buckets;
|
|
548
|
+
uint32_t num_buckets;
|
|
549
|
+
} rc_client_achievement_list_t;
|
|
550
|
+
|
|
551
|
+
enum {
|
|
552
|
+
RC_CLIENT_ACHIEVEMENT_LIST_GROUPING_LOCK_STATE = 0,
|
|
553
|
+
RC_CLIENT_ACHIEVEMENT_LIST_GROUPING_PROGRESS = 1
|
|
554
|
+
};
|
|
555
|
+
|
|
556
|
+
/**
|
|
557
|
+
* Creates a list of achievements matching the specified category and grouping.
|
|
558
|
+
* Returns an allocated list that must be free'd by calling rc_client_destroy_achievement_list.
|
|
559
|
+
*/
|
|
560
|
+
RC_EXPORT rc_client_achievement_list_t* RC_CCONV rc_client_create_achievement_list(rc_client_t* client, int category, int grouping);
|
|
561
|
+
|
|
562
|
+
/**
|
|
563
|
+
* Destroys a list allocated by rc_client_create_achievement_list.
|
|
564
|
+
*/
|
|
565
|
+
RC_EXPORT void RC_CCONV rc_client_destroy_achievement_list(rc_client_achievement_list_t* list);
|
|
566
|
+
|
|
567
|
+
/**
|
|
568
|
+
* Returns non-zero if there are any achievements that can be queried through rc_client_create_achievement_list().
|
|
569
|
+
*/
|
|
570
|
+
RC_EXPORT int RC_CCONV rc_client_has_achievements(rc_client_t* client);
|
|
571
|
+
|
|
572
|
+
/*****************************************************************************\
|
|
573
|
+
| Leaderboards |
|
|
574
|
+
\*****************************************************************************/
|
|
575
|
+
|
|
576
|
+
enum {
|
|
577
|
+
RC_CLIENT_LEADERBOARD_STATE_INACTIVE = 0,
|
|
578
|
+
RC_CLIENT_LEADERBOARD_STATE_ACTIVE = 1,
|
|
579
|
+
RC_CLIENT_LEADERBOARD_STATE_TRACKING = 2,
|
|
580
|
+
RC_CLIENT_LEADERBOARD_STATE_DISABLED = 3,
|
|
581
|
+
NUM_RC_CLIENT_LEADERBOARD_STATES = 4
|
|
582
|
+
};
|
|
583
|
+
|
|
584
|
+
enum {
|
|
585
|
+
RC_CLIENT_LEADERBOARD_FORMAT_TIME = 0,
|
|
586
|
+
RC_CLIENT_LEADERBOARD_FORMAT_SCORE = 1,
|
|
587
|
+
RC_CLIENT_LEADERBOARD_FORMAT_VALUE = 2,
|
|
588
|
+
NUM_RC_CLIENT_LEADERBOARD_FORMATS = 3
|
|
589
|
+
};
|
|
590
|
+
|
|
591
|
+
#define RC_CLIENT_LEADERBOARD_DISPLAY_SIZE 24
|
|
592
|
+
|
|
593
|
+
typedef struct rc_client_leaderboard_t {
|
|
594
|
+
const char* title;
|
|
595
|
+
const char* description;
|
|
596
|
+
const char* tracker_value;
|
|
597
|
+
uint32_t id;
|
|
598
|
+
uint8_t state;
|
|
599
|
+
uint8_t format;
|
|
600
|
+
uint8_t lower_is_better;
|
|
601
|
+
} rc_client_leaderboard_t;
|
|
602
|
+
|
|
603
|
+
/**
|
|
604
|
+
* Get information about a leaderboard. Returns NULL if not found.
|
|
605
|
+
*/
|
|
606
|
+
RC_EXPORT const rc_client_leaderboard_t* RC_CCONV rc_client_get_leaderboard_info(const rc_client_t* client, uint32_t id);
|
|
607
|
+
|
|
608
|
+
typedef struct rc_client_leaderboard_tracker_t {
|
|
609
|
+
char display[RC_CLIENT_LEADERBOARD_DISPLAY_SIZE];
|
|
610
|
+
uint32_t id;
|
|
611
|
+
} rc_client_leaderboard_tracker_t;
|
|
612
|
+
|
|
613
|
+
typedef struct rc_client_leaderboard_bucket_t {
|
|
614
|
+
const rc_client_leaderboard_t** leaderboards;
|
|
615
|
+
uint32_t num_leaderboards;
|
|
616
|
+
|
|
617
|
+
const char* label;
|
|
618
|
+
uint32_t subset_id;
|
|
619
|
+
uint8_t bucket_type;
|
|
620
|
+
} rc_client_leaderboard_bucket_t;
|
|
621
|
+
|
|
622
|
+
typedef struct rc_client_leaderboard_list_t {
|
|
623
|
+
const rc_client_leaderboard_bucket_t* buckets;
|
|
624
|
+
uint32_t num_buckets;
|
|
625
|
+
} rc_client_leaderboard_list_t;
|
|
626
|
+
|
|
627
|
+
enum {
|
|
628
|
+
RC_CLIENT_LEADERBOARD_BUCKET_UNKNOWN = 0,
|
|
629
|
+
RC_CLIENT_LEADERBOARD_BUCKET_INACTIVE = 1,
|
|
630
|
+
RC_CLIENT_LEADERBOARD_BUCKET_ACTIVE = 2,
|
|
631
|
+
RC_CLIENT_LEADERBOARD_BUCKET_UNSUPPORTED = 3,
|
|
632
|
+
RC_CLIENT_LEADERBOARD_BUCKET_ALL = 4,
|
|
633
|
+
NUM_RC_CLIENT_LEADERBOARD_BUCKETS = 5
|
|
634
|
+
};
|
|
635
|
+
|
|
636
|
+
enum {
|
|
637
|
+
RC_CLIENT_LEADERBOARD_LIST_GROUPING_NONE = 0,
|
|
638
|
+
RC_CLIENT_LEADERBOARD_LIST_GROUPING_TRACKING = 1
|
|
639
|
+
};
|
|
640
|
+
|
|
641
|
+
/**
|
|
642
|
+
* Creates a list of leaderboards matching the specified grouping.
|
|
643
|
+
* Returns an allocated list that must be free'd by calling rc_client_destroy_leaderboard_list.
|
|
644
|
+
*/
|
|
645
|
+
RC_EXPORT rc_client_leaderboard_list_t* RC_CCONV rc_client_create_leaderboard_list(rc_client_t* client, int grouping);
|
|
646
|
+
|
|
647
|
+
/**
|
|
648
|
+
* Destroys a list allocated by rc_client_create_leaderboard_list.
|
|
649
|
+
*/
|
|
650
|
+
RC_EXPORT void RC_CCONV rc_client_destroy_leaderboard_list(rc_client_leaderboard_list_t* list);
|
|
651
|
+
|
|
652
|
+
/**
|
|
653
|
+
* Returns non-zero if the current game has any leaderboards.
|
|
654
|
+
*/
|
|
655
|
+
RC_EXPORT int RC_CCONV rc_client_has_leaderboards(rc_client_t* client);
|
|
656
|
+
|
|
657
|
+
typedef struct rc_client_leaderboard_entry_t {
|
|
658
|
+
const char* user;
|
|
659
|
+
char display[RC_CLIENT_LEADERBOARD_DISPLAY_SIZE];
|
|
660
|
+
time_t submitted;
|
|
661
|
+
uint32_t rank;
|
|
662
|
+
uint32_t index;
|
|
663
|
+
} rc_client_leaderboard_entry_t;
|
|
664
|
+
|
|
665
|
+
typedef struct rc_client_leaderboard_entry_list_t {
|
|
666
|
+
rc_client_leaderboard_entry_t* entries;
|
|
667
|
+
uint32_t num_entries;
|
|
668
|
+
uint32_t total_entries;
|
|
669
|
+
int32_t user_index;
|
|
670
|
+
} rc_client_leaderboard_entry_list_t;
|
|
671
|
+
|
|
672
|
+
typedef void (RC_CCONV *rc_client_fetch_leaderboard_entries_callback_t)(int result, const char* error_message,
|
|
673
|
+
rc_client_leaderboard_entry_list_t* list, rc_client_t* client, void* callback_userdata);
|
|
674
|
+
|
|
675
|
+
/**
|
|
676
|
+
* Fetches a list of leaderboard entries from the server.
|
|
677
|
+
* Callback receives an allocated list that must be free'd by calling rc_client_destroy_leaderboard_entry_list.
|
|
678
|
+
*/
|
|
679
|
+
RC_EXPORT rc_client_async_handle_t* RC_CCONV rc_client_begin_fetch_leaderboard_entries(rc_client_t* client, uint32_t leaderboard_id,
|
|
680
|
+
uint32_t first_entry, uint32_t count, rc_client_fetch_leaderboard_entries_callback_t callback, void* callback_userdata);
|
|
681
|
+
|
|
682
|
+
/**
|
|
683
|
+
* Fetches a list of leaderboard entries from the server containing the logged-in user.
|
|
684
|
+
* Callback receives an allocated list that must be free'd by calling rc_client_destroy_leaderboard_entry_list.
|
|
685
|
+
*/
|
|
686
|
+
RC_EXPORT rc_client_async_handle_t* RC_CCONV rc_client_begin_fetch_leaderboard_entries_around_user(rc_client_t* client, uint32_t leaderboard_id,
|
|
687
|
+
uint32_t count, rc_client_fetch_leaderboard_entries_callback_t callback, void* callback_userdata);
|
|
688
|
+
|
|
689
|
+
/**
|
|
690
|
+
* Gets the URL for the profile picture of the user associated to a leaderboard entry.
|
|
691
|
+
* Returns RC_OK on success.
|
|
692
|
+
*/
|
|
693
|
+
RC_EXPORT int RC_CCONV rc_client_leaderboard_entry_get_user_image_url(const rc_client_leaderboard_entry_t* entry, char buffer[], size_t buffer_size);
|
|
694
|
+
|
|
695
|
+
/**
|
|
696
|
+
* Destroys a list allocated by rc_client_begin_fetch_leaderboard_entries or rc_client_begin_fetch_leaderboard_entries_around_user.
|
|
697
|
+
*/
|
|
698
|
+
RC_EXPORT void RC_CCONV rc_client_destroy_leaderboard_entry_list(rc_client_leaderboard_entry_list_t* list);
|
|
699
|
+
|
|
700
|
+
/**
|
|
701
|
+
* Used for scoreboard events. Contains the response from the server when a leaderboard entry is submitted.
|
|
702
|
+
* NOTE: This structure is only valid within the event callback. If you want to make use of the data outside
|
|
703
|
+
* of the callback, you should create copies of both the top entries and usernames within.
|
|
704
|
+
*/
|
|
705
|
+
typedef struct rc_client_leaderboard_scoreboard_entry_t {
|
|
706
|
+
/* The user associated to the entry */
|
|
707
|
+
const char* username;
|
|
708
|
+
/* The rank of the entry */
|
|
709
|
+
uint32_t rank;
|
|
710
|
+
/* The value of the entry */
|
|
711
|
+
char score[RC_CLIENT_LEADERBOARD_DISPLAY_SIZE];
|
|
712
|
+
} rc_client_leaderboard_scoreboard_entry_t;
|
|
713
|
+
|
|
714
|
+
typedef struct rc_client_leaderboard_scoreboard_t {
|
|
715
|
+
/* The ID of the leaderboard which was submitted */
|
|
716
|
+
uint32_t leaderboard_id;
|
|
717
|
+
/* The value that was submitted */
|
|
718
|
+
char submitted_score[RC_CLIENT_LEADERBOARD_DISPLAY_SIZE];
|
|
719
|
+
/* The player's best submitted value */
|
|
720
|
+
char best_score[RC_CLIENT_LEADERBOARD_DISPLAY_SIZE];
|
|
721
|
+
/* The player's new rank within the leaderboard */
|
|
722
|
+
uint32_t new_rank;
|
|
723
|
+
/* The total number of entries in the leaderboard */
|
|
724
|
+
uint32_t num_entries;
|
|
725
|
+
|
|
726
|
+
/* An array of the top entries for the leaderboard */
|
|
727
|
+
rc_client_leaderboard_scoreboard_entry_t* top_entries;
|
|
728
|
+
/* The number of items in the top_entries array */
|
|
729
|
+
uint32_t num_top_entries;
|
|
730
|
+
} rc_client_leaderboard_scoreboard_t;
|
|
731
|
+
|
|
732
|
+
/*****************************************************************************\
|
|
733
|
+
| Rich Presence |
|
|
734
|
+
\*****************************************************************************/
|
|
735
|
+
|
|
736
|
+
/**
|
|
737
|
+
* Returns non-zero if the current game supports rich presence.
|
|
738
|
+
*/
|
|
739
|
+
RC_EXPORT int RC_CCONV rc_client_has_rich_presence(rc_client_t* client);
|
|
740
|
+
|
|
741
|
+
/**
|
|
742
|
+
* Gets the current rich presence message.
|
|
743
|
+
* Returns the number of characters written to buffer.
|
|
744
|
+
*/
|
|
745
|
+
RC_EXPORT size_t RC_CCONV rc_client_get_rich_presence_message(rc_client_t* client, char buffer[], size_t buffer_size);
|
|
746
|
+
|
|
747
|
+
/*****************************************************************************\
|
|
748
|
+
| Processing |
|
|
749
|
+
\*****************************************************************************/
|
|
750
|
+
|
|
751
|
+
enum {
|
|
752
|
+
RC_CLIENT_EVENT_TYPE_NONE = 0,
|
|
753
|
+
RC_CLIENT_EVENT_ACHIEVEMENT_TRIGGERED = 1, /* [achievement] was earned by the player */
|
|
754
|
+
RC_CLIENT_EVENT_LEADERBOARD_STARTED = 2, /* [leaderboard] attempt has started */
|
|
755
|
+
RC_CLIENT_EVENT_LEADERBOARD_FAILED = 3, /* [leaderboard] attempt failed */
|
|
756
|
+
RC_CLIENT_EVENT_LEADERBOARD_SUBMITTED = 4, /* [leaderboard] attempt submitted */
|
|
757
|
+
RC_CLIENT_EVENT_ACHIEVEMENT_CHALLENGE_INDICATOR_SHOW = 5, /* [achievement] challenge indicator should be shown */
|
|
758
|
+
RC_CLIENT_EVENT_ACHIEVEMENT_CHALLENGE_INDICATOR_HIDE = 6, /* [achievement] challenge indicator should be hidden */
|
|
759
|
+
RC_CLIENT_EVENT_ACHIEVEMENT_PROGRESS_INDICATOR_SHOW = 7, /* progress indicator should be shown for [achievement] */
|
|
760
|
+
RC_CLIENT_EVENT_ACHIEVEMENT_PROGRESS_INDICATOR_HIDE = 8, /* progress indicator should be hidden */
|
|
761
|
+
RC_CLIENT_EVENT_ACHIEVEMENT_PROGRESS_INDICATOR_UPDATE = 9, /* progress indicator should be updated to reflect new badge/progress for [achievement] */
|
|
762
|
+
RC_CLIENT_EVENT_LEADERBOARD_TRACKER_SHOW = 10, /* [leaderboard_tracker] should be shown */
|
|
763
|
+
RC_CLIENT_EVENT_LEADERBOARD_TRACKER_HIDE = 11, /* [leaderboard_tracker] should be hidden */
|
|
764
|
+
RC_CLIENT_EVENT_LEADERBOARD_TRACKER_UPDATE = 12, /* [leaderboard_tracker] updated */
|
|
765
|
+
RC_CLIENT_EVENT_LEADERBOARD_SCOREBOARD = 13, /* [leaderboard_scoreboard] possibly-new ranking received for [leaderboard] */
|
|
766
|
+
RC_CLIENT_EVENT_RESET = 14, /* emulated system should be reset (as the result of enabling hardcore) */
|
|
767
|
+
RC_CLIENT_EVENT_GAME_COMPLETED = 15, /* all achievements for the game have been earned */
|
|
768
|
+
RC_CLIENT_EVENT_SERVER_ERROR = 16, /* an API response returned a [server_error] and will not be retried */
|
|
769
|
+
RC_CLIENT_EVENT_DISCONNECTED = 17, /* an unlock request could not be completed and is pending */
|
|
770
|
+
RC_CLIENT_EVENT_RECONNECTED = 18, /* all pending unlocks have been completed */
|
|
771
|
+
RC_CLIENT_EVENT_SUBSET_COMPLETED = 19 /* all achievements for the subset have been earned */
|
|
772
|
+
};
|
|
773
|
+
|
|
774
|
+
typedef struct rc_client_server_error_t {
|
|
775
|
+
const char* error_message;
|
|
776
|
+
const char* api;
|
|
777
|
+
int result;
|
|
778
|
+
uint32_t related_id;
|
|
779
|
+
} rc_client_server_error_t;
|
|
780
|
+
|
|
781
|
+
typedef struct rc_client_event_t {
|
|
782
|
+
uint32_t type;
|
|
783
|
+
|
|
784
|
+
rc_client_achievement_t* achievement;
|
|
785
|
+
rc_client_leaderboard_t* leaderboard;
|
|
786
|
+
rc_client_leaderboard_tracker_t* leaderboard_tracker;
|
|
787
|
+
rc_client_leaderboard_scoreboard_t* leaderboard_scoreboard;
|
|
788
|
+
rc_client_server_error_t* server_error;
|
|
789
|
+
rc_client_subset_t* subset;
|
|
790
|
+
|
|
791
|
+
} rc_client_event_t;
|
|
792
|
+
|
|
793
|
+
/**
|
|
794
|
+
* Callback used to notify the client when certain events occur.
|
|
795
|
+
*/
|
|
796
|
+
typedef void (RC_CCONV *rc_client_event_handler_t)(const rc_client_event_t* event, rc_client_t* client);
|
|
797
|
+
|
|
798
|
+
/**
|
|
799
|
+
* Provides a callback for event handling.
|
|
800
|
+
*/
|
|
801
|
+
RC_EXPORT void RC_CCONV rc_client_set_event_handler(rc_client_t* client, rc_client_event_handler_t handler);
|
|
802
|
+
|
|
803
|
+
/**
|
|
804
|
+
* Provides a callback for reading memory.
|
|
805
|
+
*/
|
|
806
|
+
RC_EXPORT void RC_CCONV rc_client_set_read_memory_function(rc_client_t* client, rc_client_read_memory_func_t handler);
|
|
807
|
+
|
|
808
|
+
/**
|
|
809
|
+
* Specifies whether rc_client is allowed to read memory outside of rc_client_do_frame/rc_client_idle.
|
|
810
|
+
*/
|
|
811
|
+
RC_EXPORT void RC_CCONV rc_client_set_allow_background_memory_reads(rc_client_t* client, int allowed);
|
|
812
|
+
|
|
813
|
+
/**
|
|
814
|
+
* Determines if there are any active achievements/leaderboards/rich presence that need processing.
|
|
815
|
+
*/
|
|
816
|
+
RC_EXPORT int RC_CCONV rc_client_is_processing_required(rc_client_t* client);
|
|
817
|
+
|
|
818
|
+
/**
|
|
819
|
+
* Processes achievements for the current frame.
|
|
820
|
+
*/
|
|
821
|
+
RC_EXPORT void RC_CCONV rc_client_do_frame(rc_client_t* client);
|
|
822
|
+
|
|
823
|
+
/**
|
|
824
|
+
* Processes the periodic queue.
|
|
825
|
+
* Called internally by rc_client_do_frame.
|
|
826
|
+
* Should be explicitly called if rc_client_do_frame is not being called because emulation is paused.
|
|
827
|
+
*/
|
|
828
|
+
RC_EXPORT void RC_CCONV rc_client_idle(rc_client_t* client);
|
|
829
|
+
|
|
830
|
+
/**
|
|
831
|
+
* Determines if a sufficient amount of frames have been processed since the last call to rc_client_can_pause.
|
|
832
|
+
* Should not be called unless the client is trying to pause.
|
|
833
|
+
* If false is returned, and frames_remaining is not NULL, frames_remaining will be set to the number of frames
|
|
834
|
+
* still required before pause is allowed, which can be converted to a time in seconds for displaying to the user.
|
|
835
|
+
*/
|
|
836
|
+
RC_EXPORT int RC_CCONV rc_client_can_pause(rc_client_t* client, uint32_t* frames_remaining);
|
|
837
|
+
|
|
838
|
+
/**
|
|
839
|
+
* Informs the runtime that the emulator has been reset. Will reset all achievements and leaderboards
|
|
840
|
+
* to their initial state (includes hiding indicators/trackers).
|
|
841
|
+
*/
|
|
842
|
+
RC_EXPORT void RC_CCONV rc_client_reset(rc_client_t* client);
|
|
843
|
+
|
|
844
|
+
/**
|
|
845
|
+
* Gets the number of bytes needed to serialized the runtime state.
|
|
846
|
+
*/
|
|
847
|
+
RC_EXPORT size_t RC_CCONV rc_client_progress_size(rc_client_t* client);
|
|
848
|
+
|
|
849
|
+
/**
|
|
850
|
+
* Serializes the runtime state into a buffer.
|
|
851
|
+
* Returns RC_OK on success, or an error indicator.
|
|
852
|
+
* [deprecated] use rc_client_serialize_progress_sized instead
|
|
853
|
+
*/
|
|
854
|
+
RC_EXPORT int RC_CCONV rc_client_serialize_progress(rc_client_t* client, uint8_t* buffer);
|
|
855
|
+
|
|
856
|
+
/**
|
|
857
|
+
* Serializes the runtime state into a buffer.
|
|
858
|
+
* Returns RC_OK on success, or an error indicator.
|
|
859
|
+
*/
|
|
860
|
+
RC_EXPORT int RC_CCONV rc_client_serialize_progress_sized(rc_client_t* client, uint8_t* buffer, size_t buffer_size);
|
|
861
|
+
|
|
862
|
+
/**
|
|
863
|
+
* Deserializes the runtime state from a buffer.
|
|
864
|
+
* Returns RC_OK on success, or an error indicator.
|
|
865
|
+
* [deprecated] use rc_client_deserialize_progress_sized instead
|
|
866
|
+
*/
|
|
867
|
+
RC_EXPORT int RC_CCONV rc_client_deserialize_progress(rc_client_t* client, const uint8_t* serialized);
|
|
868
|
+
|
|
869
|
+
/**
|
|
870
|
+
* Serializes the runtime state into a buffer.
|
|
871
|
+
* Returns RC_OK on success, or an error indicator.
|
|
872
|
+
*/
|
|
873
|
+
RC_EXPORT int RC_CCONV rc_client_deserialize_progress_sized(rc_client_t* client, const uint8_t* serialized, size_t serialized_size);
|
|
874
|
+
|
|
875
|
+
RC_END_C_DECLS
|
|
876
|
+
|
|
877
|
+
#endif /* RC_RUNTIME_H */
|