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,101 @@
|
|
|
1
|
+
#ifndef RC_CLIENT_RAINTEGRATION_H
|
|
2
|
+
#define RC_CLIENT_RAINTEGRATION_H
|
|
3
|
+
|
|
4
|
+
#ifndef _WIN32
|
|
5
|
+
#undef RC_CLIENT_SUPPORTS_RAINTEGRATION /* Windows required for RAIntegration */
|
|
6
|
+
#endif
|
|
7
|
+
|
|
8
|
+
#include <stdint.h>
|
|
9
|
+
|
|
10
|
+
#include "rc_export.h"
|
|
11
|
+
|
|
12
|
+
RC_BEGIN_C_DECLS
|
|
13
|
+
|
|
14
|
+
typedef struct rc_client_t rc_client_t; /* forward reference; in rc_client.h */
|
|
15
|
+
|
|
16
|
+
/* types needed to implement raintegration */
|
|
17
|
+
|
|
18
|
+
typedef struct rc_client_raintegration_menu_item_t {
|
|
19
|
+
const char* label;
|
|
20
|
+
uint32_t id;
|
|
21
|
+
uint8_t checked;
|
|
22
|
+
uint8_t enabled;
|
|
23
|
+
} rc_client_raintegration_menu_item_t;
|
|
24
|
+
|
|
25
|
+
typedef struct rc_client_raintegration_menu_t {
|
|
26
|
+
rc_client_raintegration_menu_item_t* items;
|
|
27
|
+
uint32_t num_items;
|
|
28
|
+
} rc_client_raintegration_menu_t;
|
|
29
|
+
|
|
30
|
+
enum {
|
|
31
|
+
RC_CLIENT_RAINTEGRATION_ACHIEVEMENT_STATE_NONE = 0,
|
|
32
|
+
RC_CLIENT_RAINTEGRATION_ACHIEVEMENT_STATE_PUBLISHED = 1,
|
|
33
|
+
RC_CLIENT_RAINTEGRATION_ACHIEVEMENT_STATE_LOCAL = 2,
|
|
34
|
+
RC_CLIENT_RAINTEGRATION_ACHIEVEMENT_STATE_MODIFIED = 3,
|
|
35
|
+
RC_CLIENT_RAINTEGRATION_ACHIEVEMENT_STATE_INSECURE = 4,
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
enum {
|
|
39
|
+
RC_CLIENT_RAINTEGRATION_EVENT_TYPE_NONE = 0,
|
|
40
|
+
RC_CLIENT_RAINTEGRATION_EVENT_MENUITEM_CHECKED_CHANGED = 1, /* [menu_item] checked changed */
|
|
41
|
+
RC_CLIENT_RAINTEGRATION_EVENT_HARDCORE_CHANGED = 2, /* hardcore was enabled or disabled */
|
|
42
|
+
RC_CLIENT_RAINTEGRATION_EVENT_PAUSE = 3, /* emulated system should be paused */
|
|
43
|
+
RC_CLIENT_RAINTEGRATION_EVENT_MENU_CHANGED = 4 /* one or more items were added/removed from the menu and it should be rebuilt */
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
typedef struct rc_client_raintegration_event_t {
|
|
47
|
+
uint32_t type;
|
|
48
|
+
|
|
49
|
+
const rc_client_raintegration_menu_item_t* menu_item;
|
|
50
|
+
} rc_client_raintegration_event_t;
|
|
51
|
+
|
|
52
|
+
typedef void (RC_CCONV *rc_client_raintegration_event_handler_t)(const rc_client_raintegration_event_t* event,
|
|
53
|
+
rc_client_t* client);
|
|
54
|
+
|
|
55
|
+
typedef void (RC_CCONV *rc_client_raintegration_write_memory_func_t)(uint32_t address, uint8_t* buffer,
|
|
56
|
+
uint32_t num_bytes, rc_client_t* client);
|
|
57
|
+
|
|
58
|
+
typedef void (RC_CCONV* rc_client_raintegration_get_game_name_func_t)(char* buffer, uint32_t buffer_size, rc_client_t* client);
|
|
59
|
+
|
|
60
|
+
/* types needed to integrate raintegration */
|
|
61
|
+
|
|
62
|
+
#ifdef RC_CLIENT_SUPPORTS_RAINTEGRATION
|
|
63
|
+
|
|
64
|
+
#ifndef RC_CLIENT_SUPPORTS_EXTERNAL
|
|
65
|
+
#define RC_CLIENT_SUPPORTS_EXTERNAL /* external rc_client required for RAIntegration */
|
|
66
|
+
#endif
|
|
67
|
+
|
|
68
|
+
#include <wtypes.h> /* HWND */
|
|
69
|
+
|
|
70
|
+
#include "rc_client.h"
|
|
71
|
+
|
|
72
|
+
RC_EXPORT rc_client_async_handle_t* RC_CCONV rc_client_begin_load_raintegration(rc_client_t* client,
|
|
73
|
+
const wchar_t* search_directory, HWND main_window_handle,
|
|
74
|
+
const char* client_name, const char* client_version,
|
|
75
|
+
rc_client_callback_t callback, void* callback_userdata);
|
|
76
|
+
|
|
77
|
+
RC_EXPORT void RC_CCONV rc_client_unload_raintegration(rc_client_t* client);
|
|
78
|
+
|
|
79
|
+
RC_EXPORT void RC_CCONV rc_client_raintegration_update_main_window_handle(rc_client_t* client, HWND main_window_handle);
|
|
80
|
+
|
|
81
|
+
RC_EXPORT const rc_client_raintegration_menu_t* RC_CCONV rc_client_raintegration_get_menu(const rc_client_t* client);
|
|
82
|
+
|
|
83
|
+
RC_EXPORT void RC_CCONV rc_client_raintegration_rebuild_submenu(rc_client_t* client, HMENU hMenu);
|
|
84
|
+
RC_EXPORT void RC_CCONV rc_client_raintegration_update_menu_item(const rc_client_t* client, const rc_client_raintegration_menu_item_t* menu_item);
|
|
85
|
+
RC_EXPORT int RC_CCONV rc_client_raintegration_activate_menu_item(const rc_client_t* client, uint32_t menu_item_id);
|
|
86
|
+
|
|
87
|
+
RC_EXPORT void RC_CCONV rc_client_raintegration_set_write_memory_function(rc_client_t* client, rc_client_raintegration_write_memory_func_t handler);
|
|
88
|
+
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);
|
|
89
|
+
RC_EXPORT void RC_CCONV rc_client_raintegration_set_console_id(rc_client_t* client, uint32_t console_id);
|
|
90
|
+
RC_EXPORT int RC_CCONV rc_client_raintegration_has_modifications(const rc_client_t* client);
|
|
91
|
+
|
|
92
|
+
RC_EXPORT void RC_CCONV rc_client_raintegration_set_event_handler(rc_client_t* client,
|
|
93
|
+
rc_client_raintegration_event_handler_t handler);
|
|
94
|
+
|
|
95
|
+
RC_EXPORT int RC_CCONV rc_client_raintegration_get_achievement_state(const rc_client_t* client, uint32_t achievement_id);
|
|
96
|
+
|
|
97
|
+
#endif /* RC_CLIENT_SUPPORTS_RAINTEGRATION */
|
|
98
|
+
|
|
99
|
+
RC_END_C_DECLS
|
|
100
|
+
|
|
101
|
+
#endif /* RC_CLIENT_RAINTEGRATION_H */
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
#ifndef RC_CONSOLES_H
|
|
2
|
+
#define RC_CONSOLES_H
|
|
3
|
+
|
|
4
|
+
#include "rc_export.h"
|
|
5
|
+
|
|
6
|
+
#include <stdint.h>
|
|
7
|
+
|
|
8
|
+
RC_BEGIN_C_DECLS
|
|
9
|
+
|
|
10
|
+
/*****************************************************************************\
|
|
11
|
+
| Console identifiers |
|
|
12
|
+
\*****************************************************************************/
|
|
13
|
+
|
|
14
|
+
enum {
|
|
15
|
+
RC_CONSOLE_UNKNOWN = 0,
|
|
16
|
+
RC_CONSOLE_MEGA_DRIVE = 1,
|
|
17
|
+
RC_CONSOLE_NINTENDO_64 = 2,
|
|
18
|
+
RC_CONSOLE_SUPER_NINTENDO = 3,
|
|
19
|
+
RC_CONSOLE_GAMEBOY = 4,
|
|
20
|
+
RC_CONSOLE_GAMEBOY_ADVANCE = 5,
|
|
21
|
+
RC_CONSOLE_GAMEBOY_COLOR = 6,
|
|
22
|
+
RC_CONSOLE_NINTENDO = 7,
|
|
23
|
+
RC_CONSOLE_PC_ENGINE = 8,
|
|
24
|
+
RC_CONSOLE_SEGA_CD = 9,
|
|
25
|
+
RC_CONSOLE_SEGA_32X = 10,
|
|
26
|
+
RC_CONSOLE_MASTER_SYSTEM = 11,
|
|
27
|
+
RC_CONSOLE_PLAYSTATION = 12,
|
|
28
|
+
RC_CONSOLE_ATARI_LYNX = 13,
|
|
29
|
+
RC_CONSOLE_NEOGEO_POCKET = 14,
|
|
30
|
+
RC_CONSOLE_GAME_GEAR = 15,
|
|
31
|
+
RC_CONSOLE_GAMECUBE = 16,
|
|
32
|
+
RC_CONSOLE_ATARI_JAGUAR = 17,
|
|
33
|
+
RC_CONSOLE_NINTENDO_DS = 18,
|
|
34
|
+
RC_CONSOLE_WII = 19,
|
|
35
|
+
RC_CONSOLE_WII_U = 20,
|
|
36
|
+
RC_CONSOLE_PLAYSTATION_2 = 21,
|
|
37
|
+
RC_CONSOLE_XBOX = 22,
|
|
38
|
+
RC_CONSOLE_MAGNAVOX_ODYSSEY2 = 23,
|
|
39
|
+
RC_CONSOLE_POKEMON_MINI = 24,
|
|
40
|
+
RC_CONSOLE_ATARI_2600 = 25,
|
|
41
|
+
RC_CONSOLE_MS_DOS = 26,
|
|
42
|
+
RC_CONSOLE_ARCADE = 27,
|
|
43
|
+
RC_CONSOLE_VIRTUAL_BOY = 28,
|
|
44
|
+
RC_CONSOLE_MSX = 29,
|
|
45
|
+
RC_CONSOLE_COMMODORE_64 = 30,
|
|
46
|
+
RC_CONSOLE_ZX81 = 31,
|
|
47
|
+
RC_CONSOLE_ORIC = 32,
|
|
48
|
+
RC_CONSOLE_SG1000 = 33,
|
|
49
|
+
RC_CONSOLE_VIC20 = 34,
|
|
50
|
+
RC_CONSOLE_AMIGA = 35,
|
|
51
|
+
RC_CONSOLE_ATARI_ST = 36,
|
|
52
|
+
RC_CONSOLE_AMSTRAD_PC = 37,
|
|
53
|
+
RC_CONSOLE_APPLE_II = 38,
|
|
54
|
+
RC_CONSOLE_SATURN = 39,
|
|
55
|
+
RC_CONSOLE_DREAMCAST = 40,
|
|
56
|
+
RC_CONSOLE_PSP = 41,
|
|
57
|
+
RC_CONSOLE_CDI = 42,
|
|
58
|
+
RC_CONSOLE_3DO = 43,
|
|
59
|
+
RC_CONSOLE_COLECOVISION = 44,
|
|
60
|
+
RC_CONSOLE_INTELLIVISION = 45,
|
|
61
|
+
RC_CONSOLE_VECTREX = 46,
|
|
62
|
+
RC_CONSOLE_PC8800 = 47,
|
|
63
|
+
RC_CONSOLE_PC9800 = 48,
|
|
64
|
+
RC_CONSOLE_PCFX = 49,
|
|
65
|
+
RC_CONSOLE_ATARI_5200 = 50,
|
|
66
|
+
RC_CONSOLE_ATARI_7800 = 51,
|
|
67
|
+
RC_CONSOLE_X68K = 52,
|
|
68
|
+
RC_CONSOLE_WONDERSWAN = 53,
|
|
69
|
+
RC_CONSOLE_CASSETTEVISION = 54,
|
|
70
|
+
RC_CONSOLE_SUPER_CASSETTEVISION = 55,
|
|
71
|
+
RC_CONSOLE_NEO_GEO_CD = 56,
|
|
72
|
+
RC_CONSOLE_FAIRCHILD_CHANNEL_F = 57,
|
|
73
|
+
RC_CONSOLE_FM_TOWNS = 58,
|
|
74
|
+
RC_CONSOLE_ZX_SPECTRUM = 59,
|
|
75
|
+
RC_CONSOLE_GAME_AND_WATCH = 60,
|
|
76
|
+
RC_CONSOLE_NOKIA_NGAGE = 61,
|
|
77
|
+
RC_CONSOLE_NINTENDO_3DS = 62,
|
|
78
|
+
RC_CONSOLE_SUPERVISION = 63,
|
|
79
|
+
RC_CONSOLE_SHARPX1 = 64,
|
|
80
|
+
RC_CONSOLE_TIC80 = 65,
|
|
81
|
+
RC_CONSOLE_THOMSONTO8 = 66,
|
|
82
|
+
RC_CONSOLE_PC6000 = 67,
|
|
83
|
+
RC_CONSOLE_PICO = 68,
|
|
84
|
+
RC_CONSOLE_MEGADUCK = 69,
|
|
85
|
+
RC_CONSOLE_ZEEBO = 70,
|
|
86
|
+
RC_CONSOLE_ARDUBOY = 71,
|
|
87
|
+
RC_CONSOLE_WASM4 = 72,
|
|
88
|
+
RC_CONSOLE_ARCADIA_2001 = 73,
|
|
89
|
+
RC_CONSOLE_INTERTON_VC_4000 = 74,
|
|
90
|
+
RC_CONSOLE_ELEKTOR_TV_GAMES_COMPUTER = 75,
|
|
91
|
+
RC_CONSOLE_PC_ENGINE_CD = 76,
|
|
92
|
+
RC_CONSOLE_ATARI_JAGUAR_CD = 77,
|
|
93
|
+
RC_CONSOLE_NINTENDO_DSI = 78,
|
|
94
|
+
RC_CONSOLE_TI83 = 79,
|
|
95
|
+
RC_CONSOLE_UZEBOX = 80,
|
|
96
|
+
RC_CONSOLE_FAMICOM_DISK_SYSTEM = 81,
|
|
97
|
+
|
|
98
|
+
RC_CONSOLE_HUBS = 100,
|
|
99
|
+
RC_CONSOLE_EVENTS = 101,
|
|
100
|
+
RC_CONSOLE_STANDALONE = 102
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
RC_EXPORT const char* RC_CCONV rc_console_name(uint32_t console_id);
|
|
104
|
+
|
|
105
|
+
/*****************************************************************************\
|
|
106
|
+
| Memory mapping |
|
|
107
|
+
\*****************************************************************************/
|
|
108
|
+
|
|
109
|
+
enum {
|
|
110
|
+
RC_MEMORY_TYPE_SYSTEM_RAM, /* normal system memory */
|
|
111
|
+
RC_MEMORY_TYPE_SAVE_RAM, /* memory that persists between sessions */
|
|
112
|
+
RC_MEMORY_TYPE_VIDEO_RAM, /* memory reserved for graphical processing */
|
|
113
|
+
RC_MEMORY_TYPE_READONLY, /* memory that maps to read only data */
|
|
114
|
+
RC_MEMORY_TYPE_HARDWARE_CONTROLLER, /* memory for interacting with system components */
|
|
115
|
+
RC_MEMORY_TYPE_VIRTUAL_RAM, /* secondary address space that maps to real memory in system RAM */
|
|
116
|
+
RC_MEMORY_TYPE_UNUSED /* these addresses don't really exist */
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
typedef struct rc_memory_region_t {
|
|
120
|
+
uint32_t start_address; /* first address of block as queried by RetroAchievements */
|
|
121
|
+
uint32_t end_address; /* last address of block as queried by RetroAchievements */
|
|
122
|
+
uint32_t real_address; /* real address for first address of block */
|
|
123
|
+
uint8_t type; /* RC_MEMORY_TYPE_ for block */
|
|
124
|
+
const char* description; /* short description of block */
|
|
125
|
+
}
|
|
126
|
+
rc_memory_region_t;
|
|
127
|
+
|
|
128
|
+
typedef struct rc_memory_regions_t {
|
|
129
|
+
const rc_memory_region_t* region;
|
|
130
|
+
uint32_t num_regions;
|
|
131
|
+
}
|
|
132
|
+
rc_memory_regions_t;
|
|
133
|
+
|
|
134
|
+
RC_EXPORT const rc_memory_regions_t* RC_CCONV rc_console_memory_regions(uint32_t console_id);
|
|
135
|
+
|
|
136
|
+
RC_END_C_DECLS
|
|
137
|
+
|
|
138
|
+
#endif /* RC_CONSOLES_H */
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
#ifndef RC_ERROR_H
|
|
2
|
+
#define RC_ERROR_H
|
|
3
|
+
|
|
4
|
+
#include "rc_export.h"
|
|
5
|
+
|
|
6
|
+
RC_BEGIN_C_DECLS
|
|
7
|
+
|
|
8
|
+
/*****************************************************************************\
|
|
9
|
+
| Return values |
|
|
10
|
+
\*****************************************************************************/
|
|
11
|
+
|
|
12
|
+
enum {
|
|
13
|
+
RC_OK = 0,
|
|
14
|
+
RC_INVALID_FUNC_OPERAND = -1,
|
|
15
|
+
RC_INVALID_MEMORY_OPERAND = -2,
|
|
16
|
+
RC_INVALID_CONST_OPERAND = -3,
|
|
17
|
+
RC_INVALID_FP_OPERAND = -4,
|
|
18
|
+
RC_INVALID_CONDITION_TYPE = -5,
|
|
19
|
+
RC_INVALID_OPERATOR = -6,
|
|
20
|
+
RC_INVALID_REQUIRED_HITS = -7,
|
|
21
|
+
RC_DUPLICATED_START = -8,
|
|
22
|
+
RC_DUPLICATED_CANCEL = -9,
|
|
23
|
+
RC_DUPLICATED_SUBMIT = -10,
|
|
24
|
+
RC_DUPLICATED_VALUE = -11,
|
|
25
|
+
RC_DUPLICATED_PROGRESS = -12,
|
|
26
|
+
RC_MISSING_START = -13,
|
|
27
|
+
RC_MISSING_CANCEL = -14,
|
|
28
|
+
RC_MISSING_SUBMIT = -15,
|
|
29
|
+
RC_MISSING_VALUE = -16,
|
|
30
|
+
RC_INVALID_LBOARD_FIELD = -17,
|
|
31
|
+
RC_MISSING_DISPLAY_STRING = -18,
|
|
32
|
+
RC_OUT_OF_MEMORY = -19,
|
|
33
|
+
RC_INVALID_VALUE_FLAG = -20,
|
|
34
|
+
RC_MISSING_VALUE_MEASURED = -21,
|
|
35
|
+
RC_MULTIPLE_MEASURED = -22,
|
|
36
|
+
RC_INVALID_MEASURED_TARGET = -23,
|
|
37
|
+
RC_INVALID_COMPARISON = -24,
|
|
38
|
+
RC_INVALID_STATE = -25,
|
|
39
|
+
RC_INVALID_JSON = -26,
|
|
40
|
+
RC_API_FAILURE = -27,
|
|
41
|
+
RC_LOGIN_REQUIRED = -28,
|
|
42
|
+
RC_NO_GAME_LOADED = -29,
|
|
43
|
+
RC_HARDCORE_DISABLED = -30,
|
|
44
|
+
RC_ABORTED = -31,
|
|
45
|
+
RC_NO_RESPONSE = -32,
|
|
46
|
+
RC_ACCESS_DENIED = -33,
|
|
47
|
+
RC_INVALID_CREDENTIALS = -34,
|
|
48
|
+
RC_EXPIRED_TOKEN = -35,
|
|
49
|
+
RC_INSUFFICIENT_BUFFER = -36,
|
|
50
|
+
RC_INVALID_VARIABLE_NAME = -37,
|
|
51
|
+
RC_UNKNOWN_VARIABLE_NAME = -38,
|
|
52
|
+
RC_NOT_FOUND = -39
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
RC_EXPORT const char* RC_CCONV rc_error_str(int ret);
|
|
56
|
+
|
|
57
|
+
RC_END_C_DECLS
|
|
58
|
+
|
|
59
|
+
#endif /* RC_ERROR_H */
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
#ifndef RC_EXPORT_H
|
|
2
|
+
#define RC_EXPORT_H
|
|
3
|
+
|
|
4
|
+
/* These macros control how callbacks and public functions are defined */
|
|
5
|
+
|
|
6
|
+
/* RC_SHARED should be defined when building rcheevos as a shared library (e.g. dll/dylib/so). External code should not define this macro. */
|
|
7
|
+
/* RC_STATIC should be defined when building rcheevos as a static library. External code should also define this macro. */
|
|
8
|
+
/* RC_IMPORT should be defined for external code using rcheevos as a shared library. */
|
|
9
|
+
|
|
10
|
+
/* For compatibility, if none of these three macros are defined, then the build is assumed to be RC_STATIC */
|
|
11
|
+
|
|
12
|
+
#if !defined(RC_SHARED) && !defined(RC_STATIC) && !defined(RC_IMPORT)
|
|
13
|
+
#define RC_STATIC
|
|
14
|
+
#endif
|
|
15
|
+
|
|
16
|
+
#if (defined(RC_SHARED) && defined(RC_STATIC)) || (defined(RC_SHARED) && defined(RC_IMPORT)) || (defined(RC_STATIC) && defined(RC_IMPORT))
|
|
17
|
+
#error RC_SHARED, RC_STATIC, and RC_IMPORT are mutually exclusive
|
|
18
|
+
#endif
|
|
19
|
+
|
|
20
|
+
/* RC_BEGIN_C_DECLS and RC_END_C_DECLS should be used for all headers, to enforce C linkage and the C calling convention */
|
|
21
|
+
/* RC_BEGIN_C_DECLS should be placed after #include's and before header declarations */
|
|
22
|
+
/* RC_END_C_DECLS should be placed after header declarations */
|
|
23
|
+
|
|
24
|
+
/* example usage
|
|
25
|
+
*
|
|
26
|
+
* #ifndef RC_HEADER_H
|
|
27
|
+
* #define RC_HEADER_H
|
|
28
|
+
*
|
|
29
|
+
* #include <stdint.h>
|
|
30
|
+
*
|
|
31
|
+
* RC_BEGIN_C_DECLS
|
|
32
|
+
*
|
|
33
|
+
* uint8_t rc_function(void);
|
|
34
|
+
*
|
|
35
|
+
* RC_END_C_DECLS
|
|
36
|
+
*
|
|
37
|
+
* #endif
|
|
38
|
+
*/
|
|
39
|
+
|
|
40
|
+
#if defined(__cplusplus) && !defined(CXX_BUILD)
|
|
41
|
+
#define RC_BEGIN_C_DECLS extern "C" {
|
|
42
|
+
#define RC_END_C_DECLS }
|
|
43
|
+
#else
|
|
44
|
+
#define RC_BEGIN_C_DECLS
|
|
45
|
+
#define RC_END_C_DECLS
|
|
46
|
+
#endif
|
|
47
|
+
|
|
48
|
+
/* RC_CCONV should be used for public functions and callbacks, to enforce the cdecl calling convention, if applicable */
|
|
49
|
+
/* RC_CCONV should be placed after the return type, and between the ( and * for callbacks */
|
|
50
|
+
|
|
51
|
+
/* example usage */
|
|
52
|
+
/* void RC_CCONV rc_function(void) */
|
|
53
|
+
/* void (RC_CCONV *rc_callback)(void) */
|
|
54
|
+
|
|
55
|
+
#if defined(_WIN32)
|
|
56
|
+
/* Windows compilers will ignore __cdecl when not applicable */
|
|
57
|
+
#define RC_CCONV __cdecl
|
|
58
|
+
#elif defined(__GNUC__) && defined(__i386__)
|
|
59
|
+
/* GNU C compilers will warn if cdecl is defined on an unsupported platform */
|
|
60
|
+
#define RC_CCONV __attribute__((cdecl))
|
|
61
|
+
#else
|
|
62
|
+
#define RC_CCONV
|
|
63
|
+
#endif
|
|
64
|
+
|
|
65
|
+
/* RC_EXPORT should be used for public functions */
|
|
66
|
+
/* RC_EXPORT will provide necessary hints for shared library usage, if applicable */
|
|
67
|
+
/* RC_EXPORT should be placed before the return type */
|
|
68
|
+
|
|
69
|
+
/* example usage */
|
|
70
|
+
/* RC_EXPORT void rc_function(void) */
|
|
71
|
+
|
|
72
|
+
#ifdef RC_SHARED
|
|
73
|
+
#if defined(_WIN32)
|
|
74
|
+
#define RC_EXPORT __declspec(dllexport)
|
|
75
|
+
#elif defined(__GNUC__) && __GNUC__ >= 4
|
|
76
|
+
#define RC_EXPORT __attribute__((visibility("default")))
|
|
77
|
+
#else
|
|
78
|
+
#define RC_EXPORT
|
|
79
|
+
#endif
|
|
80
|
+
#endif
|
|
81
|
+
|
|
82
|
+
#ifdef RC_IMPORT
|
|
83
|
+
#if defined(_WIN32)
|
|
84
|
+
#define RC_EXPORT __declspec(dllimport)
|
|
85
|
+
#elif defined(__GNUC__) && __GNUC__ >= 4
|
|
86
|
+
#define RC_EXPORT __attribute__((visibility("default")))
|
|
87
|
+
#else
|
|
88
|
+
#define RC_EXPORT
|
|
89
|
+
#endif
|
|
90
|
+
#endif
|
|
91
|
+
|
|
92
|
+
#ifdef RC_STATIC
|
|
93
|
+
#if defined(__GNUC__) && __GNUC__ >= 4
|
|
94
|
+
#define RC_EXPORT __attribute__((visibility("default")))
|
|
95
|
+
#else
|
|
96
|
+
#define RC_EXPORT
|
|
97
|
+
#endif
|
|
98
|
+
#endif
|
|
99
|
+
|
|
100
|
+
#endif /* RC_EXPORT_H */
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
#ifndef RC_HASH_H
|
|
2
|
+
#define RC_HASH_H
|
|
3
|
+
|
|
4
|
+
#include <stddef.h>
|
|
5
|
+
#include <stdio.h>
|
|
6
|
+
#include <stdint.h>
|
|
7
|
+
|
|
8
|
+
#include "rc_consoles.h"
|
|
9
|
+
|
|
10
|
+
RC_BEGIN_C_DECLS
|
|
11
|
+
|
|
12
|
+
struct rc_hash_iterator;
|
|
13
|
+
|
|
14
|
+
/* ===================================================== */
|
|
15
|
+
|
|
16
|
+
typedef void (RC_CCONV *rc_hash_message_callback_deprecated)(const char*);
|
|
17
|
+
|
|
18
|
+
/* specifies a function to call when an error occurs to display the error message */
|
|
19
|
+
/* [deprecated] set callbacks in rc_hash_iterator_t */
|
|
20
|
+
RC_EXPORT void RC_CCONV rc_hash_init_error_message_callback(rc_hash_message_callback_deprecated callback);
|
|
21
|
+
|
|
22
|
+
/* specifies a function to call for verbose logging */
|
|
23
|
+
/* [deprecated] set callbacks in rc_hash_iterator_t */
|
|
24
|
+
RC_EXPORT void rc_hash_init_verbose_message_callback(rc_hash_message_callback_deprecated callback);
|
|
25
|
+
|
|
26
|
+
/* ===================================================== */
|
|
27
|
+
|
|
28
|
+
/* opens a file */
|
|
29
|
+
typedef void* (RC_CCONV *rc_hash_filereader_open_file_handler)(const char* path_utf8);
|
|
30
|
+
|
|
31
|
+
/* moves the file pointer - standard fseek parameters */
|
|
32
|
+
typedef void (RC_CCONV *rc_hash_filereader_seek_handler)(void* file_handle, int64_t offset, int origin);
|
|
33
|
+
|
|
34
|
+
/* locates the file pointer */
|
|
35
|
+
typedef int64_t (RC_CCONV *rc_hash_filereader_tell_handler)(void* file_handle);
|
|
36
|
+
|
|
37
|
+
/* reads the specified number of bytes from the file starting at the read pointer.
|
|
38
|
+
* returns the number of bytes actually read.
|
|
39
|
+
*/
|
|
40
|
+
typedef size_t (RC_CCONV *rc_hash_filereader_read_handler)(void* file_handle, void* buffer, size_t requested_bytes);
|
|
41
|
+
|
|
42
|
+
/* closes the file */
|
|
43
|
+
typedef void (RC_CCONV *rc_hash_filereader_close_file_handler)(void* file_handle);
|
|
44
|
+
|
|
45
|
+
typedef struct rc_hash_filereader
|
|
46
|
+
{
|
|
47
|
+
rc_hash_filereader_open_file_handler open;
|
|
48
|
+
rc_hash_filereader_seek_handler seek;
|
|
49
|
+
rc_hash_filereader_tell_handler tell;
|
|
50
|
+
rc_hash_filereader_read_handler read;
|
|
51
|
+
rc_hash_filereader_close_file_handler close;
|
|
52
|
+
} rc_hash_filereader_t;
|
|
53
|
+
|
|
54
|
+
/* [deprecated] set callbacks in rc_hash_iterator_t */
|
|
55
|
+
RC_EXPORT void RC_CCONV rc_hash_init_custom_filereader(struct rc_hash_filereader* reader);
|
|
56
|
+
|
|
57
|
+
/* ===================================================== */
|
|
58
|
+
|
|
59
|
+
#ifndef RC_HASH_NO_DISC
|
|
60
|
+
|
|
61
|
+
#define RC_HASH_CDTRACK_FIRST_DATA ((uint32_t)-1) /* the first data track (skip audio tracks) */
|
|
62
|
+
#define RC_HASH_CDTRACK_LAST ((uint32_t)-2) /* the last data/audio track */
|
|
63
|
+
#define RC_HASH_CDTRACK_LARGEST ((uint32_t)-3) /* the largest data/audio track */
|
|
64
|
+
#define RC_HASH_CDTRACK_FIRST_OF_SECOND_SESSION ((uint32_t)-4) /* the first data/audio track of the second session */
|
|
65
|
+
|
|
66
|
+
/* opens a track from the specified file. see the RC_HASH_CDTRACK_ defines for special tracks.
|
|
67
|
+
* returns a handle to be passed to the other functions, or NULL if the track could not be opened.
|
|
68
|
+
*/
|
|
69
|
+
typedef void* (RC_CCONV *rc_hash_cdreader_open_track_handler)(const char* path, uint32_t track);
|
|
70
|
+
typedef void* (RC_CCONV* rc_hash_cdreader_open_track_iterator_handler)(const char* path, uint32_t track, const struct rc_hash_iterator* iterator);
|
|
71
|
+
|
|
72
|
+
/* attempts to read the specified number of bytes from the file starting at the specified absolute sector.
|
|
73
|
+
* returns the number of bytes actually read.
|
|
74
|
+
*/
|
|
75
|
+
typedef size_t (RC_CCONV *rc_hash_cdreader_read_sector_handler)(void* track_handle, uint32_t sector, void* buffer, size_t requested_bytes);
|
|
76
|
+
|
|
77
|
+
/* closes the track handle */
|
|
78
|
+
typedef void (RC_CCONV *rc_hash_cdreader_close_track_handler)(void* track_handle);
|
|
79
|
+
|
|
80
|
+
/* gets the absolute sector index for the first sector of a track */
|
|
81
|
+
typedef uint32_t(RC_CCONV *rc_hash_cdreader_first_track_sector_handler)(void* track_handle);
|
|
82
|
+
|
|
83
|
+
typedef struct rc_hash_cdreader
|
|
84
|
+
{
|
|
85
|
+
rc_hash_cdreader_open_track_handler open_track;
|
|
86
|
+
rc_hash_cdreader_read_sector_handler read_sector;
|
|
87
|
+
rc_hash_cdreader_close_track_handler close_track;
|
|
88
|
+
rc_hash_cdreader_first_track_sector_handler first_track_sector;
|
|
89
|
+
rc_hash_cdreader_open_track_iterator_handler open_track_iterator;
|
|
90
|
+
} rc_hash_cdreader_t;
|
|
91
|
+
|
|
92
|
+
RC_EXPORT void RC_CCONV rc_hash_get_default_cdreader(struct rc_hash_cdreader* cdreader);
|
|
93
|
+
/* [deprecated] don't set callbacks in rc_hash_iterator_t */
|
|
94
|
+
RC_EXPORT void RC_CCONV rc_hash_init_default_cdreader(void);
|
|
95
|
+
/* [deprecated] set callbacks in rc_hash_iterator_t */
|
|
96
|
+
RC_EXPORT void RC_CCONV rc_hash_init_custom_cdreader(struct rc_hash_cdreader* reader);
|
|
97
|
+
|
|
98
|
+
#endif /* RC_HASH_NO_DISC */
|
|
99
|
+
|
|
100
|
+
#ifndef RC_HASH_NO_ENCRYPTED
|
|
101
|
+
|
|
102
|
+
/* specifies a function called to obtain a 3DS CIA decryption normal key.
|
|
103
|
+
* this key would be derived from slot0x3DKeyX and the common key specified by the passed index.
|
|
104
|
+
* the normal key should be written in big endian format
|
|
105
|
+
* returns non-zero on success, or zero on failure.
|
|
106
|
+
*/
|
|
107
|
+
typedef int (RC_CCONV *rc_hash_3ds_get_cia_normal_key_func)(uint8_t common_key_index, uint8_t out_normal_key[16]);
|
|
108
|
+
/* [deprecated] set callbacks in rc_hash_iterator_t */
|
|
109
|
+
RC_EXPORT void RC_CCONV rc_hash_init_3ds_get_cia_normal_key_func(rc_hash_3ds_get_cia_normal_key_func func);
|
|
110
|
+
|
|
111
|
+
/* specifies a function called to obtain 3DS NCCH decryption normal keys.
|
|
112
|
+
* the primary key will always use slot0x2CKeyX and the passed primary KeyY.
|
|
113
|
+
* the secondary key will use the KeyX slot passed
|
|
114
|
+
* the secondary KeyY will be identical to the primary keyY if the passed program id is NULL
|
|
115
|
+
* if the program id is not null, then the secondary KeyY will be obtained with "seed crypto"
|
|
116
|
+
* with "seed crypto" the 8 byte program id can be used to obtain a 16 byte "seed" within the seeddb.bin firmware file
|
|
117
|
+
* the primary KeyY then the seed will then be hashed with SHA256, and the upper 16 bytes of the digest will be the secondary KeyY used
|
|
118
|
+
* the normal keys should be written in big endian format
|
|
119
|
+
* returns non-zero on success, or zero on failure.
|
|
120
|
+
*/
|
|
121
|
+
typedef int (RC_CCONV *rc_hash_3ds_get_ncch_normal_keys_func)(uint8_t primary_key_y[16], uint8_t secondary_key_x_slot, uint8_t* optional_program_id,
|
|
122
|
+
uint8_t out_primary_key[16], uint8_t out_secondary_key[16]);
|
|
123
|
+
/* [deprecated] set callbacks in rc_hash_iterator_t */
|
|
124
|
+
RC_EXPORT void RC_CCONV rc_hash_init_3ds_get_ncch_normal_keys_func(rc_hash_3ds_get_ncch_normal_keys_func func);
|
|
125
|
+
|
|
126
|
+
#endif /* RC_HASH_NO_ENCRYPTED */
|
|
127
|
+
|
|
128
|
+
/* ===================================================== */
|
|
129
|
+
|
|
130
|
+
typedef void (RC_CCONV* rc_hash_message_callback_func)(const char*, const struct rc_hash_iterator* iterator);
|
|
131
|
+
|
|
132
|
+
typedef struct rc_hash_callbacks {
|
|
133
|
+
rc_hash_message_callback_func verbose_message;
|
|
134
|
+
rc_hash_message_callback_func error_message;
|
|
135
|
+
|
|
136
|
+
rc_hash_filereader_t filereader;
|
|
137
|
+
#ifndef RC_HASH_NO_DISC
|
|
138
|
+
rc_hash_cdreader_t cdreader;
|
|
139
|
+
#endif
|
|
140
|
+
|
|
141
|
+
#ifndef RC_HASH_NO_ENCRYPTED
|
|
142
|
+
struct rc_hash_encryption_callbacks {
|
|
143
|
+
rc_hash_3ds_get_cia_normal_key_func get_3ds_cia_normal_key;
|
|
144
|
+
rc_hash_3ds_get_ncch_normal_keys_func get_3ds_ncch_normal_keys;
|
|
145
|
+
} encryption;
|
|
146
|
+
#endif
|
|
147
|
+
} rc_hash_callbacks_t;
|
|
148
|
+
|
|
149
|
+
/* data for rc_hash_iterate
|
|
150
|
+
*/
|
|
151
|
+
typedef struct rc_hash_iterator {
|
|
152
|
+
const uint8_t* buffer;
|
|
153
|
+
size_t buffer_size;
|
|
154
|
+
uint8_t consoles[12];
|
|
155
|
+
int index;
|
|
156
|
+
const char* path;
|
|
157
|
+
void* userdata;
|
|
158
|
+
|
|
159
|
+
rc_hash_callbacks_t callbacks;
|
|
160
|
+
} rc_hash_iterator_t;
|
|
161
|
+
|
|
162
|
+
/* initializes a rc_hash_iterator
|
|
163
|
+
* - path must be provided
|
|
164
|
+
* - if buffer and buffer_size are provided, path may be a filename (i.e. for something extracted from a zip file)
|
|
165
|
+
*/
|
|
166
|
+
RC_EXPORT void RC_CCONV rc_hash_initialize_iterator(rc_hash_iterator_t* iterator, const char* path, const uint8_t* buffer, size_t buffer_size);
|
|
167
|
+
|
|
168
|
+
/* releases resources associated to a rc_hash_iterator
|
|
169
|
+
*/
|
|
170
|
+
RC_EXPORT void RC_CCONV rc_hash_destroy_iterator(rc_hash_iterator_t* iterator);
|
|
171
|
+
|
|
172
|
+
/* generates the next hash for the data in the rc_hash_iterator.
|
|
173
|
+
* returns non-zero if a hash was generated, or zero if no more hashes can be generated for the data.
|
|
174
|
+
*/
|
|
175
|
+
RC_EXPORT int RC_CCONV rc_hash_iterate(char hash[33], rc_hash_iterator_t* iterator);
|
|
176
|
+
|
|
177
|
+
/* generates a hash for the data in the rc_hash_iterator.
|
|
178
|
+
* returns non-zero if a hash was generated.
|
|
179
|
+
*/
|
|
180
|
+
RC_EXPORT int RC_CCONV rc_hash_generate(char hash[33], uint32_t console_id, const rc_hash_iterator_t* iterator);
|
|
181
|
+
|
|
182
|
+
/* ===================================================== */
|
|
183
|
+
|
|
184
|
+
/* generates a hash from a block of memory.
|
|
185
|
+
* returns non-zero on success, or zero on failure.
|
|
186
|
+
*/
|
|
187
|
+
/* [deprecated] use rc_hash_generate instead */
|
|
188
|
+
RC_EXPORT int RC_CCONV rc_hash_generate_from_buffer(char hash[33], uint32_t console_id, const uint8_t* buffer, size_t buffer_size);
|
|
189
|
+
|
|
190
|
+
/* generates a hash from a file.
|
|
191
|
+
* returns non-zero on success, or zero on failure.
|
|
192
|
+
*/
|
|
193
|
+
/* [deprecated] use rc_hash_generate instead */
|
|
194
|
+
RC_EXPORT int RC_CCONV rc_hash_generate_from_file(char hash[33], uint32_t console_id, const char* path);
|
|
195
|
+
|
|
196
|
+
/* ===================================================== */
|
|
197
|
+
|
|
198
|
+
RC_END_C_DECLS
|
|
199
|
+
|
|
200
|
+
#endif /* RC_HASH_H */
|