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,409 @@
|
|
|
1
|
+
#ifndef RC_CLIENT_INTERNAL_H
|
|
2
|
+
#define RC_CLIENT_INTERNAL_H
|
|
3
|
+
|
|
4
|
+
#include "rc_client.h"
|
|
5
|
+
|
|
6
|
+
#ifdef RC_CLIENT_SUPPORTS_RAINTEGRATION
|
|
7
|
+
#include "rc_client_raintegration_internal.h"
|
|
8
|
+
#endif
|
|
9
|
+
#ifdef RC_CLIENT_SUPPORTS_EXTERNAL
|
|
10
|
+
#include "rc_client_external.h"
|
|
11
|
+
#endif
|
|
12
|
+
#ifdef RC_CLIENT_SUPPORTS_HASH
|
|
13
|
+
#include "rhash/rc_hash_internal.h"
|
|
14
|
+
#endif
|
|
15
|
+
|
|
16
|
+
#include "rc_compat.h"
|
|
17
|
+
#include "rc_runtime.h"
|
|
18
|
+
#include "rc_runtime_types.h"
|
|
19
|
+
|
|
20
|
+
RC_BEGIN_C_DECLS
|
|
21
|
+
|
|
22
|
+
/*****************************************************************************\
|
|
23
|
+
| Callbacks |
|
|
24
|
+
\*****************************************************************************/
|
|
25
|
+
|
|
26
|
+
struct rc_api_fetch_game_sets_response_t;
|
|
27
|
+
typedef void (RC_CCONV *rc_client_post_process_game_sets_response_t)(const rc_api_server_response_t* server_response,
|
|
28
|
+
struct rc_api_fetch_game_sets_response_t* game_sets_response, rc_client_t* client, void* userdata);
|
|
29
|
+
typedef int (RC_CCONV *rc_client_can_submit_achievement_unlock_t)(uint32_t achievement_id, rc_client_t* client);
|
|
30
|
+
typedef int (RC_CCONV *rc_client_can_submit_leaderboard_entry_t)(uint32_t leaderboard_id, rc_client_t* client);
|
|
31
|
+
typedef int (RC_CCONV *rc_client_rich_presence_override_t)(rc_client_t* client, char buffer[], size_t buffersize);
|
|
32
|
+
typedef uint32_t (RC_CCONV* rc_client_identify_hash_func_t)(uint32_t console_id, const char* hash,
|
|
33
|
+
rc_client_t* client, void* callback_userdata);
|
|
34
|
+
|
|
35
|
+
typedef struct rc_client_callbacks_t {
|
|
36
|
+
rc_client_read_memory_func_t read_memory;
|
|
37
|
+
rc_client_event_handler_t event_handler;
|
|
38
|
+
rc_client_server_call_t server_call;
|
|
39
|
+
rc_client_message_callback_t log_call;
|
|
40
|
+
rc_get_time_millisecs_func_t get_time_millisecs;
|
|
41
|
+
rc_client_identify_hash_func_t identify_unknown_hash;
|
|
42
|
+
rc_client_post_process_game_sets_response_t post_process_game_sets_response;
|
|
43
|
+
rc_client_can_submit_achievement_unlock_t can_submit_achievement_unlock;
|
|
44
|
+
rc_client_can_submit_leaderboard_entry_t can_submit_leaderboard_entry;
|
|
45
|
+
rc_client_rich_presence_override_t rich_presence_override;
|
|
46
|
+
|
|
47
|
+
#ifdef RC_CLIENT_SUPPORTS_HASH
|
|
48
|
+
rc_hash_callbacks_t hash;
|
|
49
|
+
#endif
|
|
50
|
+
|
|
51
|
+
void* client_data;
|
|
52
|
+
} rc_client_callbacks_t;
|
|
53
|
+
|
|
54
|
+
struct rc_client_scheduled_callback_data_t;
|
|
55
|
+
typedef void (RC_CCONV *rc_client_scheduled_callback_t)(struct rc_client_scheduled_callback_data_t* callback_data, rc_client_t* client, rc_clock_t now);
|
|
56
|
+
|
|
57
|
+
typedef struct rc_client_scheduled_callback_data_t
|
|
58
|
+
{
|
|
59
|
+
rc_clock_t when;
|
|
60
|
+
uint32_t related_id;
|
|
61
|
+
rc_client_scheduled_callback_t callback;
|
|
62
|
+
void* data;
|
|
63
|
+
struct rc_client_scheduled_callback_data_t* next;
|
|
64
|
+
} rc_client_scheduled_callback_data_t;
|
|
65
|
+
|
|
66
|
+
void rc_client_schedule_callback(rc_client_t* client, rc_client_scheduled_callback_data_t* scheduled_callback);
|
|
67
|
+
|
|
68
|
+
struct rc_client_async_handle_t {
|
|
69
|
+
uint8_t aborted;
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
int rc_client_async_handle_aborted(rc_client_t* client, rc_client_async_handle_t* async_handle);
|
|
73
|
+
|
|
74
|
+
/*****************************************************************************\
|
|
75
|
+
| Achievements |
|
|
76
|
+
\*****************************************************************************/
|
|
77
|
+
|
|
78
|
+
enum {
|
|
79
|
+
RC_CLIENT_ACHIEVEMENT_PENDING_EVENT_NONE = 0,
|
|
80
|
+
RC_CLIENT_ACHIEVEMENT_PENDING_EVENT_TRIGGERED = (1 << 1),
|
|
81
|
+
RC_CLIENT_ACHIEVEMENT_PENDING_EVENT_CHALLENGE_INDICATOR_SHOW = (1 << 2),
|
|
82
|
+
RC_CLIENT_ACHIEVEMENT_PENDING_EVENT_CHALLENGE_INDICATOR_HIDE = (1 << 3),
|
|
83
|
+
RC_CLIENT_ACHIEVEMENT_PENDING_EVENT_UPDATE = (1 << 4) /* not a real event, just triggers update */
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
typedef struct rc_client_achievement_info_t {
|
|
87
|
+
rc_client_achievement_t public_;
|
|
88
|
+
|
|
89
|
+
rc_trigger_t* trigger;
|
|
90
|
+
uint8_t md5[16];
|
|
91
|
+
|
|
92
|
+
time_t unlock_time_hardcore;
|
|
93
|
+
time_t unlock_time_softcore;
|
|
94
|
+
|
|
95
|
+
uint8_t pending_events;
|
|
96
|
+
|
|
97
|
+
const char* author;
|
|
98
|
+
time_t created_time;
|
|
99
|
+
time_t updated_time;
|
|
100
|
+
} rc_client_achievement_info_t;
|
|
101
|
+
|
|
102
|
+
struct rc_client_achievement_list_info_t;
|
|
103
|
+
typedef void (RC_CCONV *rc_client_destroy_achievement_list_func_t)(struct rc_client_achievement_list_info_t* list);
|
|
104
|
+
|
|
105
|
+
typedef struct rc_client_achievement_list_info_t {
|
|
106
|
+
rc_client_achievement_list_t public_;
|
|
107
|
+
rc_client_destroy_achievement_list_func_t destroy_func;
|
|
108
|
+
} rc_client_achievement_list_info_t;
|
|
109
|
+
|
|
110
|
+
enum {
|
|
111
|
+
RC_CLIENT_PROGRESS_TRACKER_ACTION_NONE,
|
|
112
|
+
RC_CLIENT_PROGRESS_TRACKER_ACTION_SHOW,
|
|
113
|
+
RC_CLIENT_PROGRESS_TRACKER_ACTION_UPDATE,
|
|
114
|
+
RC_CLIENT_PROGRESS_TRACKER_ACTION_HIDE
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
typedef struct rc_client_progress_tracker_t {
|
|
118
|
+
rc_client_achievement_info_t* achievement;
|
|
119
|
+
float progress;
|
|
120
|
+
|
|
121
|
+
rc_client_scheduled_callback_data_t* hide_callback;
|
|
122
|
+
uint8_t action;
|
|
123
|
+
} rc_client_progress_tracker_t;
|
|
124
|
+
|
|
125
|
+
/*****************************************************************************\
|
|
126
|
+
| Leaderboard Trackers |
|
|
127
|
+
\*****************************************************************************/
|
|
128
|
+
|
|
129
|
+
enum {
|
|
130
|
+
RC_CLIENT_LEADERBOARD_TRACKER_PENDING_EVENT_NONE = 0,
|
|
131
|
+
RC_CLIENT_LEADERBOARD_TRACKER_PENDING_EVENT_UPDATE = (1 << 1),
|
|
132
|
+
RC_CLIENT_LEADERBOARD_TRACKER_PENDING_EVENT_SHOW = (1 << 2),
|
|
133
|
+
RC_CLIENT_LEADERBOARD_TRACKER_PENDING_EVENT_HIDE = (1 << 3)
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
typedef struct rc_client_leaderboard_tracker_info_t {
|
|
137
|
+
rc_client_leaderboard_tracker_t public_;
|
|
138
|
+
struct rc_client_leaderboard_tracker_info_t* next;
|
|
139
|
+
int32_t raw_value;
|
|
140
|
+
|
|
141
|
+
uint32_t value_djb2;
|
|
142
|
+
|
|
143
|
+
uint8_t format;
|
|
144
|
+
uint8_t pending_events;
|
|
145
|
+
uint8_t reference_count;
|
|
146
|
+
uint8_t value_from_hits;
|
|
147
|
+
} rc_client_leaderboard_tracker_info_t;
|
|
148
|
+
|
|
149
|
+
/*****************************************************************************\
|
|
150
|
+
| Leaderboards |
|
|
151
|
+
\*****************************************************************************/
|
|
152
|
+
|
|
153
|
+
enum {
|
|
154
|
+
RC_CLIENT_LEADERBOARD_PENDING_EVENT_NONE = 0,
|
|
155
|
+
RC_CLIENT_LEADERBOARD_PENDING_EVENT_STARTED = (1 << 1),
|
|
156
|
+
RC_CLIENT_LEADERBOARD_PENDING_EVENT_FAILED = (1 << 2),
|
|
157
|
+
RC_CLIENT_LEADERBOARD_PENDING_EVENT_SUBMITTED = (1 << 3)
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
typedef struct rc_client_leaderboard_info_t {
|
|
161
|
+
rc_client_leaderboard_t public_;
|
|
162
|
+
|
|
163
|
+
rc_lboard_t* lboard;
|
|
164
|
+
uint8_t md5[16];
|
|
165
|
+
|
|
166
|
+
rc_client_leaderboard_tracker_info_t* tracker;
|
|
167
|
+
|
|
168
|
+
uint32_t value_djb2;
|
|
169
|
+
int32_t value;
|
|
170
|
+
|
|
171
|
+
uint8_t format;
|
|
172
|
+
uint8_t pending_events;
|
|
173
|
+
uint8_t bucket;
|
|
174
|
+
uint8_t hidden;
|
|
175
|
+
} rc_client_leaderboard_info_t;
|
|
176
|
+
|
|
177
|
+
struct rc_client_leaderboard_list_info_t;
|
|
178
|
+
typedef void (RC_CCONV *rc_client_destroy_leaderboard_list_func_t)(struct rc_client_leaderboard_list_info_t* list);
|
|
179
|
+
|
|
180
|
+
typedef struct rc_client_leaderboard_list_info_t {
|
|
181
|
+
rc_client_leaderboard_list_t public_;
|
|
182
|
+
rc_client_destroy_leaderboard_list_func_t destroy_func;
|
|
183
|
+
} rc_client_leaderboard_list_info_t;
|
|
184
|
+
|
|
185
|
+
struct rc_client_leaderboard_entry_list_info_t;
|
|
186
|
+
typedef void (RC_CCONV *rc_client_destroy_leaderboard_entry_list_func_t)(struct rc_client_leaderboard_entry_list_info_t* list);
|
|
187
|
+
|
|
188
|
+
typedef struct rc_client_leaderboard_entry_list_info_t {
|
|
189
|
+
rc_client_leaderboard_entry_list_t public_;
|
|
190
|
+
rc_client_destroy_leaderboard_entry_list_func_t destroy_func;
|
|
191
|
+
} rc_client_leaderboard_entry_list_info_t;
|
|
192
|
+
|
|
193
|
+
uint8_t rc_client_map_leaderboard_format(int format);
|
|
194
|
+
|
|
195
|
+
/*****************************************************************************\
|
|
196
|
+
| Subsets |
|
|
197
|
+
\*****************************************************************************/
|
|
198
|
+
|
|
199
|
+
enum {
|
|
200
|
+
RC_CLIENT_SUBSET_PENDING_EVENT_NONE = 0,
|
|
201
|
+
RC_CLIENT_SUBSET_PENDING_EVENT_ACHIEVEMENT = (1 << 1),
|
|
202
|
+
RC_CLIENT_SUBSET_PENDING_EVENT_LEADERBOARD = (1 << 2)
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
typedef struct rc_client_subset_info_t {
|
|
206
|
+
rc_client_subset_t public_;
|
|
207
|
+
|
|
208
|
+
rc_client_achievement_info_t* achievements;
|
|
209
|
+
rc_client_leaderboard_info_t* leaderboards;
|
|
210
|
+
|
|
211
|
+
struct rc_client_subset_info_t* next;
|
|
212
|
+
|
|
213
|
+
const char* all_label;
|
|
214
|
+
const char* inactive_label;
|
|
215
|
+
const char* locked_label;
|
|
216
|
+
const char* unlocked_label;
|
|
217
|
+
const char* unofficial_label;
|
|
218
|
+
const char* unsupported_label;
|
|
219
|
+
|
|
220
|
+
uint8_t active;
|
|
221
|
+
uint8_t mastery;
|
|
222
|
+
uint8_t pending_events;
|
|
223
|
+
} rc_client_subset_info_t;
|
|
224
|
+
|
|
225
|
+
struct rc_client_subset_list_info_t;
|
|
226
|
+
typedef void (RC_CCONV* rc_client_destroy_subset_list_func_t)(struct rc_client_subset_list_info_t* list);
|
|
227
|
+
|
|
228
|
+
typedef struct rc_client_subset_list_info_t {
|
|
229
|
+
rc_client_subset_list_t public_;
|
|
230
|
+
rc_client_destroy_subset_list_func_t destroy_func;
|
|
231
|
+
} rc_client_subset_list_info_t;
|
|
232
|
+
|
|
233
|
+
/*****************************************************************************\
|
|
234
|
+
| Game |
|
|
235
|
+
\*****************************************************************************/
|
|
236
|
+
|
|
237
|
+
typedef struct rc_client_game_hash_t {
|
|
238
|
+
char hash[33];
|
|
239
|
+
uint8_t is_unknown;
|
|
240
|
+
uint32_t game_id;
|
|
241
|
+
struct rc_client_game_hash_t* next;
|
|
242
|
+
} rc_client_game_hash_t;
|
|
243
|
+
|
|
244
|
+
rc_client_game_hash_t* rc_client_find_game_hash(rc_client_t* client, const char* hash);
|
|
245
|
+
|
|
246
|
+
typedef struct rc_client_media_hash_t {
|
|
247
|
+
rc_client_game_hash_t* game_hash;
|
|
248
|
+
struct rc_client_media_hash_t* next;
|
|
249
|
+
uint32_t path_djb2;
|
|
250
|
+
} rc_client_media_hash_t;
|
|
251
|
+
|
|
252
|
+
enum {
|
|
253
|
+
RC_CLIENT_GAME_PENDING_EVENT_NONE = 0,
|
|
254
|
+
RC_CLIENT_GAME_PENDING_EVENT_LEADERBOARD_TRACKER = (1 << 1),
|
|
255
|
+
RC_CLIENT_GAME_PENDING_EVENT_UPDATE_ACTIVE_ACHIEVEMENTS = (1 << 2),
|
|
256
|
+
RC_CLIENT_GAME_PENDING_EVENT_PROGRESS_TRACKER = (1 << 3)
|
|
257
|
+
};
|
|
258
|
+
|
|
259
|
+
typedef struct rc_client_game_info_t {
|
|
260
|
+
rc_client_game_t public_;
|
|
261
|
+
rc_client_leaderboard_tracker_info_t* leaderboard_trackers;
|
|
262
|
+
rc_client_progress_tracker_t progress_tracker;
|
|
263
|
+
|
|
264
|
+
rc_client_subset_info_t* subsets;
|
|
265
|
+
|
|
266
|
+
rc_client_media_hash_t* media_hash;
|
|
267
|
+
|
|
268
|
+
rc_runtime_t runtime;
|
|
269
|
+
|
|
270
|
+
uint32_t max_valid_address;
|
|
271
|
+
|
|
272
|
+
uint8_t waiting_for_reset;
|
|
273
|
+
uint8_t pending_events;
|
|
274
|
+
|
|
275
|
+
rc_buffer_t buffer;
|
|
276
|
+
} rc_client_game_info_t;
|
|
277
|
+
|
|
278
|
+
void rc_client_update_active_achievements(rc_client_game_info_t* game);
|
|
279
|
+
void rc_client_update_active_leaderboards(rc_client_game_info_t* game);
|
|
280
|
+
|
|
281
|
+
/*****************************************************************************\
|
|
282
|
+
| Client |
|
|
283
|
+
\*****************************************************************************/
|
|
284
|
+
|
|
285
|
+
enum {
|
|
286
|
+
RC_CLIENT_USER_STATE_NONE,
|
|
287
|
+
RC_CLIENT_USER_STATE_LOGIN_REQUESTED,
|
|
288
|
+
RC_CLIENT_USER_STATE_LOGGED_IN
|
|
289
|
+
};
|
|
290
|
+
|
|
291
|
+
enum {
|
|
292
|
+
RC_CLIENT_MASTERY_STATE_NONE,
|
|
293
|
+
RC_CLIENT_MASTERY_STATE_PENDING,
|
|
294
|
+
RC_CLIENT_MASTERY_STATE_SHOWN
|
|
295
|
+
};
|
|
296
|
+
|
|
297
|
+
enum {
|
|
298
|
+
RC_CLIENT_SPECTATOR_MODE_OFF,
|
|
299
|
+
RC_CLIENT_SPECTATOR_MODE_ON,
|
|
300
|
+
RC_CLIENT_SPECTATOR_MODE_LOCKED
|
|
301
|
+
};
|
|
302
|
+
|
|
303
|
+
enum {
|
|
304
|
+
RC_CLIENT_DISCONNECT_HIDDEN = 0,
|
|
305
|
+
RC_CLIENT_DISCONNECT_VISIBLE = (1 << 0),
|
|
306
|
+
RC_CLIENT_DISCONNECT_SHOW_PENDING = (1 << 1),
|
|
307
|
+
RC_CLIENT_DISCONNECT_HIDE_PENDING = (1 << 2)
|
|
308
|
+
};
|
|
309
|
+
|
|
310
|
+
struct rc_client_load_state_t;
|
|
311
|
+
|
|
312
|
+
typedef struct rc_client_state_t {
|
|
313
|
+
rc_mutex_t mutex;
|
|
314
|
+
rc_buffer_t buffer;
|
|
315
|
+
|
|
316
|
+
rc_client_scheduled_callback_data_t* scheduled_callbacks;
|
|
317
|
+
rc_api_host_t host;
|
|
318
|
+
|
|
319
|
+
#ifdef RC_CLIENT_SUPPORTS_EXTERNAL
|
|
320
|
+
rc_client_external_t* external_client;
|
|
321
|
+
struct rc_client_external_conversions_t* external_client_conversions;
|
|
322
|
+
#endif
|
|
323
|
+
#ifdef RC_CLIENT_SUPPORTS_RAINTEGRATION
|
|
324
|
+
rc_client_raintegration_t* raintegration;
|
|
325
|
+
#endif
|
|
326
|
+
|
|
327
|
+
uint32_t frames_processed;
|
|
328
|
+
uint32_t frames_at_last_ping;
|
|
329
|
+
uint16_t unpaused_frame_decay;
|
|
330
|
+
uint16_t required_unpaused_frames;
|
|
331
|
+
|
|
332
|
+
uint8_t hardcore;
|
|
333
|
+
uint8_t encore_mode;
|
|
334
|
+
uint8_t spectator_mode;
|
|
335
|
+
uint8_t unofficial_enabled;
|
|
336
|
+
uint8_t log_level;
|
|
337
|
+
uint8_t user;
|
|
338
|
+
uint8_t disconnect;
|
|
339
|
+
uint8_t allow_leaderboards_in_softcore;
|
|
340
|
+
uint8_t allow_background_memory_reads;
|
|
341
|
+
|
|
342
|
+
struct rc_client_load_state_t* load;
|
|
343
|
+
struct rc_client_async_handle_t* async_handles[4];
|
|
344
|
+
rc_memref_t* processing_memref;
|
|
345
|
+
|
|
346
|
+
rc_peek_t legacy_peek;
|
|
347
|
+
} rc_client_state_t;
|
|
348
|
+
|
|
349
|
+
struct rc_client_t {
|
|
350
|
+
rc_client_game_info_t* game;
|
|
351
|
+
rc_client_game_hash_t* hashes;
|
|
352
|
+
|
|
353
|
+
rc_client_user_t user;
|
|
354
|
+
|
|
355
|
+
rc_client_callbacks_t callbacks;
|
|
356
|
+
|
|
357
|
+
rc_client_state_t state;
|
|
358
|
+
};
|
|
359
|
+
|
|
360
|
+
/*****************************************************************************\
|
|
361
|
+
| Helpers |
|
|
362
|
+
\*****************************************************************************/
|
|
363
|
+
|
|
364
|
+
#ifdef RC_NO_VARIADIC_MACROS
|
|
365
|
+
void RC_CLIENT_LOG_ERR_FORMATTED(const rc_client_t* client, const char* format, ...);
|
|
366
|
+
void RC_CLIENT_LOG_WARN_FORMATTED(const rc_client_t* client, const char* format, ...);
|
|
367
|
+
void RC_CLIENT_LOG_INFO_FORMATTED(const rc_client_t* client, const char* format, ...);
|
|
368
|
+
void RC_CLIENT_LOG_VERBOSE_FORMATTED(const rc_client_t* client, const char* format, ...);
|
|
369
|
+
#else
|
|
370
|
+
void rc_client_log_message_formatted(const rc_client_t* client, const char* format, ...);
|
|
371
|
+
#define RC_CLIENT_LOG_ERR_FORMATTED(client, format, ...) { if (client->state.log_level >= RC_CLIENT_LOG_LEVEL_ERROR) rc_client_log_message_formatted(client, format, __VA_ARGS__); }
|
|
372
|
+
#define RC_CLIENT_LOG_WARN_FORMATTED(client, format, ...) { if (client->state.log_level >= RC_CLIENT_LOG_LEVEL_WARN) rc_client_log_message_formatted(client, format, __VA_ARGS__); }
|
|
373
|
+
#define RC_CLIENT_LOG_INFO_FORMATTED(client, format, ...) { if (client->state.log_level >= RC_CLIENT_LOG_LEVEL_INFO) rc_client_log_message_formatted(client, format, __VA_ARGS__); }
|
|
374
|
+
#define RC_CLIENT_LOG_VERBOSE_FORMATTED(client, format, ...) { if (client->state.log_level >= RC_CLIENT_LOG_LEVEL_VERBOSE) rc_client_log_message_formatted(client, format, __VA_ARGS__); }
|
|
375
|
+
#endif
|
|
376
|
+
|
|
377
|
+
void rc_client_log_message(const rc_client_t* client, const char* message);
|
|
378
|
+
#define RC_CLIENT_LOG_ERR(client, message) { if (client->state.log_level >= RC_CLIENT_LOG_LEVEL_ERROR) rc_client_log_message(client, message); }
|
|
379
|
+
#define RC_CLIENT_LOG_WARN(client, message) { if (client->state.log_level >= RC_CLIENT_LOG_LEVEL_WARN) rc_client_log_message(client, message); }
|
|
380
|
+
#define RC_CLIENT_LOG_INFO(client, message) { if (client->state.log_level >= RC_CLIENT_LOG_LEVEL_INFO) rc_client_log_message(client, message); }
|
|
381
|
+
#define RC_CLIENT_LOG_VERBOSE(client, message) { if (client->state.log_level >= RC_CLIENT_LOG_LEVEL_VERBOSE) rc_client_log_message(client, message); }
|
|
382
|
+
|
|
383
|
+
/* internals pulled from runtime.c */
|
|
384
|
+
void rc_runtime_checksum(const char* memaddr, uint8_t* md5);
|
|
385
|
+
int rc_trigger_contains_memref(const rc_trigger_t* trigger, const rc_memref_t* memref);
|
|
386
|
+
int rc_value_contains_memref(const rc_value_t* value, const rc_memref_t* memref);
|
|
387
|
+
/* end runtime.c internals */
|
|
388
|
+
|
|
389
|
+
/* helper functions for unit tests */
|
|
390
|
+
#ifdef RC_CLIENT_SUPPORTS_HASH
|
|
391
|
+
struct rc_hash_iterator;
|
|
392
|
+
struct rc_hash_iterator* rc_client_get_load_state_hash_iterator(rc_client_t* client);
|
|
393
|
+
#endif
|
|
394
|
+
/* end helper functions for unit tests */
|
|
395
|
+
|
|
396
|
+
enum {
|
|
397
|
+
RC_CLIENT_LEGACY_PEEK_AUTO,
|
|
398
|
+
RC_CLIENT_LEGACY_PEEK_CONSTRUCTED,
|
|
399
|
+
RC_CLIENT_LEGACY_PEEK_LITTLE_ENDIAN_READS
|
|
400
|
+
};
|
|
401
|
+
|
|
402
|
+
void rc_client_set_legacy_peek(rc_client_t* client, int method);
|
|
403
|
+
|
|
404
|
+
void rc_client_allocate_leaderboard_tracker(rc_client_game_info_t* game, rc_client_leaderboard_info_t* leaderboard);
|
|
405
|
+
void rc_client_release_leaderboard_tracker(rc_client_game_info_t* game, rc_client_leaderboard_info_t* leaderboard);
|
|
406
|
+
|
|
407
|
+
RC_END_C_DECLS
|
|
408
|
+
|
|
409
|
+
#endif /* RC_CLIENT_INTERNAL_H */
|