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.
Files changed (285) hide show
  1. checksums.yaml +4 -4
  2. data/THIRD_PARTY_NOTICES +37 -2
  3. data/assets/placeholder_boxart.png +0 -0
  4. data/bin/gemba +2 -2
  5. data/ext/gemba/extconf.rb +23 -1
  6. data/ext/gemba/gemba_ext.c +436 -2
  7. data/ext/gemba/gemba_ext.h +2 -0
  8. data/gemba.gemspec +5 -3
  9. data/lib/gemba/achievements/achievement.rb +23 -0
  10. data/lib/gemba/achievements/backend.rb +186 -0
  11. data/lib/gemba/achievements/cache.rb +70 -0
  12. data/lib/gemba/achievements/credentials_presenter.rb +142 -0
  13. data/lib/gemba/achievements/fake_backend.rb +205 -0
  14. data/lib/gemba/achievements/null_backend.rb +11 -0
  15. data/lib/gemba/achievements/offline_backend.rb +168 -0
  16. data/lib/gemba/achievements/retro_achievements/backend.rb +453 -0
  17. data/lib/gemba/achievements/retro_achievements/cli_sync_requester.rb +64 -0
  18. data/lib/gemba/achievements/retro_achievements/ping_worker.rb +27 -0
  19. data/lib/gemba/achievements.rb +19 -0
  20. data/lib/gemba/achievements_window.rb +556 -0
  21. data/lib/gemba/app_controller.rb +1015 -0
  22. data/lib/gemba/bios.rb +54 -0
  23. data/lib/gemba/boxart_fetcher/libretro_backend.rb +39 -0
  24. data/lib/gemba/boxart_fetcher/null_backend.rb +12 -0
  25. data/lib/gemba/boxart_fetcher.rb +79 -0
  26. data/lib/gemba/bus_emitter.rb +13 -0
  27. data/lib/gemba/child_window.rb +24 -1
  28. data/lib/gemba/cli/commands/config_cmd.rb +83 -0
  29. data/lib/gemba/cli/commands/decode.rb +154 -0
  30. data/lib/gemba/cli/commands/patch.rb +78 -0
  31. data/lib/gemba/cli/commands/play.rb +78 -0
  32. data/lib/gemba/cli/commands/record.rb +114 -0
  33. data/lib/gemba/cli/commands/replay.rb +161 -0
  34. data/lib/gemba/cli/commands/retro_achievements.rb +213 -0
  35. data/lib/gemba/cli/commands/version.rb +22 -0
  36. data/lib/gemba/cli.rb +52 -364
  37. data/lib/gemba/config.rb +134 -1
  38. data/lib/gemba/data/gb_games.json +1 -0
  39. data/lib/gemba/data/gb_md5.json +1 -0
  40. data/lib/gemba/data/gba_games.json +1 -0
  41. data/lib/gemba/data/gba_md5.json +1 -0
  42. data/lib/gemba/data/gbc_games.json +1 -0
  43. data/lib/gemba/data/gbc_md5.json +1 -0
  44. data/lib/gemba/emulator_frame.rb +1060 -0
  45. data/lib/gemba/event_bus.rb +48 -0
  46. data/lib/gemba/frame_stack.rb +60 -0
  47. data/lib/gemba/game_index.rb +84 -0
  48. data/lib/gemba/game_picker_frame.rb +268 -0
  49. data/lib/gemba/gamepad_map.rb +103 -0
  50. data/lib/gemba/headless.rb +6 -5
  51. data/lib/gemba/headless_player.rb +33 -3
  52. data/lib/gemba/help_window.rb +61 -0
  53. data/lib/gemba/hotkey_map.rb +3 -1
  54. data/lib/gemba/input_recorder.rb +107 -0
  55. data/lib/gemba/input_replayer.rb +119 -0
  56. data/lib/gemba/keyboard_map.rb +90 -0
  57. data/lib/gemba/locales/en.yml +97 -5
  58. data/lib/gemba/locales/ja.yml +97 -5
  59. data/lib/gemba/main_window.rb +56 -0
  60. data/lib/gemba/modal_stack.rb +81 -0
  61. data/lib/gemba/patcher_window.rb +223 -0
  62. data/lib/gemba/platform/gb.rb +21 -0
  63. data/lib/gemba/platform/gba.rb +21 -0
  64. data/lib/gemba/platform/gbc.rb +23 -0
  65. data/lib/gemba/platform.rb +20 -0
  66. data/lib/gemba/platform_open.rb +19 -0
  67. data/lib/gemba/recorder.rb +4 -3
  68. data/lib/gemba/replay_player.rb +691 -0
  69. data/lib/gemba/rom_info.rb +57 -0
  70. data/lib/gemba/rom_info_window.rb +16 -3
  71. data/lib/gemba/rom_library.rb +106 -0
  72. data/lib/gemba/rom_overrides.rb +47 -0
  73. data/lib/gemba/rom_patcher/bps.rb +161 -0
  74. data/lib/gemba/rom_patcher/ips.rb +101 -0
  75. data/lib/gemba/rom_patcher/ups.rb +118 -0
  76. data/lib/gemba/rom_patcher.rb +109 -0
  77. data/lib/gemba/{rom_loader.rb → rom_resolver.rb} +7 -6
  78. data/lib/gemba/runtime.rb +59 -26
  79. data/lib/gemba/save_state_manager.rb +4 -7
  80. data/lib/gemba/save_state_picker.rb +17 -4
  81. data/lib/gemba/session_logger.rb +64 -0
  82. data/lib/gemba/settings/audio_tab.rb +77 -0
  83. data/lib/gemba/settings/gamepad_tab.rb +351 -0
  84. data/lib/gemba/settings/hotkeys_tab.rb +259 -0
  85. data/lib/gemba/settings/paths.rb +11 -0
  86. data/lib/gemba/settings/recording_tab.rb +83 -0
  87. data/lib/gemba/settings/save_states_tab.rb +91 -0
  88. data/lib/gemba/settings/system_tab.rb +362 -0
  89. data/lib/gemba/settings/video_tab.rb +318 -0
  90. data/lib/gemba/settings_window.rb +162 -1036
  91. data/lib/gemba/version.rb +1 -1
  92. data/lib/gemba/virtual_keyboard.rb +19 -0
  93. data/lib/gemba.rb +2 -12
  94. data/test/achievements_window/test_bulk_sync.rb +218 -0
  95. data/test/achievements_window/test_bus_events.rb +125 -0
  96. data/test/achievements_window/test_close_confirmation.rb +201 -0
  97. data/test/achievements_window/test_initial_state.rb +164 -0
  98. data/test/achievements_window/test_sorting.rb +227 -0
  99. data/test/achievements_window/test_tree_rendering.rb +133 -0
  100. data/test/fixtures/fake_bios.bin +0 -0
  101. data/test/fixtures/pong.gba +0 -0
  102. data/test/fixtures/test.gb +0 -0
  103. data/test/fixtures/test.gbc +0 -0
  104. data/test/fixtures/test_quicksave.ss +0 -0
  105. data/test/screenshots/no_focus.png +0 -0
  106. data/test/shared/teek_test_worker.rb +17 -1
  107. data/test/shared/tk_test_helper.rb +91 -4
  108. data/test/support/achievements_window_helpers.rb +18 -0
  109. data/test/support/fake_core.rb +25 -0
  110. data/test/support/fake_ra_runtime.rb +74 -0
  111. data/test/support/fake_requester.rb +68 -0
  112. data/test/support/player_helpers.rb +20 -5
  113. data/test/test_achievement.rb +32 -0
  114. data/test/{test_player.rb → test_app_controller.rb} +353 -85
  115. data/test/test_bios.rb +123 -0
  116. data/test/test_boxart_fetcher.rb +150 -0
  117. data/test/test_cli.rb +17 -265
  118. data/test/test_cli_config.rb +64 -0
  119. data/test/test_cli_decode.rb +97 -0
  120. data/test/test_cli_patch.rb +58 -0
  121. data/test/test_cli_play.rb +213 -0
  122. data/test/test_cli_ra.rb +175 -0
  123. data/test/test_cli_record.rb +69 -0
  124. data/test/test_cli_replay.rb +72 -0
  125. data/test/test_cli_sync_requester.rb +152 -0
  126. data/test/test_cli_version.rb +27 -0
  127. data/test/test_config.rb +2 -3
  128. data/test/test_config_ra.rb +69 -0
  129. data/test/test_core.rb +62 -1
  130. data/test/test_credentials_presenter.rb +192 -0
  131. data/test/test_event_bus.rb +100 -0
  132. data/test/test_fake_backend_achievements.rb +130 -0
  133. data/test/test_fake_backend_auth.rb +68 -0
  134. data/test/test_game_index.rb +77 -0
  135. data/test/test_game_picker_frame.rb +310 -0
  136. data/test/test_gamepad_map.rb +1 -3
  137. data/test/test_headless_player.rb +17 -3
  138. data/test/test_help_window.rb +82 -0
  139. data/test/test_hotkey_map.rb +22 -1
  140. data/test/test_input_recorder.rb +179 -0
  141. data/test/test_input_replay_determinism.rb +113 -0
  142. data/test/test_input_replayer.rb +162 -0
  143. data/test/test_keyboard_map.rb +1 -3
  144. data/test/test_libretro_backend.rb +41 -0
  145. data/test/test_locale.rb +1 -1
  146. data/test/test_logging.rb +123 -0
  147. data/test/test_null_backend.rb +42 -0
  148. data/test/test_offline_backend.rb +116 -0
  149. data/test/test_overlay_renderer.rb +1 -1
  150. data/test/test_platform.rb +149 -0
  151. data/test/test_ra_backend.rb +313 -0
  152. data/test/test_ra_backend_unlock_gate.rb +56 -0
  153. data/test/test_recorder.rb +0 -3
  154. data/test/test_replay_player.rb +316 -0
  155. data/test/test_rom_info.rb +149 -0
  156. data/test/test_rom_overrides.rb +86 -0
  157. data/test/test_rom_patcher.rb +382 -0
  158. data/test/{test_rom_loader.rb → test_rom_resolver.rb} +25 -26
  159. data/test/test_save_state_manager.rb +2 -4
  160. data/test/test_settings_audio.rb +107 -0
  161. data/test/test_settings_hotkeys.rb +83 -66
  162. data/test/test_settings_recording.rb +49 -0
  163. data/test/test_settings_save_states.rb +97 -0
  164. data/test/test_settings_system.rb +133 -0
  165. data/test/test_settings_video.rb +450 -0
  166. data/test/test_settings_window.rb +76 -507
  167. data/test/test_tip_service.rb +6 -6
  168. data/test/test_toast_overlay.rb +1 -1
  169. data/test/test_virtual_events.rb +156 -0
  170. data/test/test_virtual_keyboard.rb +1 -1
  171. data/vendor/rcheevos/CHANGELOG.md +495 -0
  172. data/vendor/rcheevos/LICENSE +21 -0
  173. data/vendor/rcheevos/Package.swift +33 -0
  174. data/vendor/rcheevos/README.md +67 -0
  175. data/vendor/rcheevos/include/module.modulemap +70 -0
  176. data/vendor/rcheevos/include/rc_api_editor.h +296 -0
  177. data/vendor/rcheevos/include/rc_api_info.h +280 -0
  178. data/vendor/rcheevos/include/rc_api_request.h +77 -0
  179. data/vendor/rcheevos/include/rc_api_runtime.h +417 -0
  180. data/vendor/rcheevos/include/rc_api_user.h +262 -0
  181. data/vendor/rcheevos/include/rc_client.h +877 -0
  182. data/vendor/rcheevos/include/rc_client_raintegration.h +101 -0
  183. data/vendor/rcheevos/include/rc_consoles.h +138 -0
  184. data/vendor/rcheevos/include/rc_error.h +59 -0
  185. data/vendor/rcheevos/include/rc_export.h +100 -0
  186. data/vendor/rcheevos/include/rc_hash.h +200 -0
  187. data/vendor/rcheevos/include/rc_runtime.h +148 -0
  188. data/vendor/rcheevos/include/rc_runtime_types.h +452 -0
  189. data/vendor/rcheevos/include/rc_util.h +51 -0
  190. data/vendor/rcheevos/include/rcheevos.h +8 -0
  191. data/vendor/rcheevos/src/rapi/rc_api_common.c +1379 -0
  192. data/vendor/rcheevos/src/rapi/rc_api_common.h +88 -0
  193. data/vendor/rcheevos/src/rapi/rc_api_editor.c +625 -0
  194. data/vendor/rcheevos/src/rapi/rc_api_info.c +587 -0
  195. data/vendor/rcheevos/src/rapi/rc_api_runtime.c +901 -0
  196. data/vendor/rcheevos/src/rapi/rc_api_user.c +483 -0
  197. data/vendor/rcheevos/src/rc_client.c +6941 -0
  198. data/vendor/rcheevos/src/rc_client_external.c +281 -0
  199. data/vendor/rcheevos/src/rc_client_external.h +177 -0
  200. data/vendor/rcheevos/src/rc_client_external_versions.h +171 -0
  201. data/vendor/rcheevos/src/rc_client_internal.h +409 -0
  202. data/vendor/rcheevos/src/rc_client_raintegration.c +566 -0
  203. data/vendor/rcheevos/src/rc_client_raintegration_internal.h +61 -0
  204. data/vendor/rcheevos/src/rc_client_types.natvis +396 -0
  205. data/vendor/rcheevos/src/rc_compat.c +251 -0
  206. data/vendor/rcheevos/src/rc_compat.h +121 -0
  207. data/vendor/rcheevos/src/rc_libretro.c +915 -0
  208. data/vendor/rcheevos/src/rc_libretro.h +98 -0
  209. data/vendor/rcheevos/src/rc_util.c +199 -0
  210. data/vendor/rcheevos/src/rc_version.c +11 -0
  211. data/vendor/rcheevos/src/rc_version.h +32 -0
  212. data/vendor/rcheevos/src/rcheevos/alloc.c +312 -0
  213. data/vendor/rcheevos/src/rcheevos/condition.c +754 -0
  214. data/vendor/rcheevos/src/rcheevos/condset.c +777 -0
  215. data/vendor/rcheevos/src/rcheevos/consoleinfo.c +1215 -0
  216. data/vendor/rcheevos/src/rcheevos/format.c +330 -0
  217. data/vendor/rcheevos/src/rcheevos/lboard.c +287 -0
  218. data/vendor/rcheevos/src/rcheevos/memref.c +805 -0
  219. data/vendor/rcheevos/src/rcheevos/operand.c +607 -0
  220. data/vendor/rcheevos/src/rcheevos/rc_internal.h +390 -0
  221. data/vendor/rcheevos/src/rcheevos/rc_runtime_types.natvis +541 -0
  222. data/vendor/rcheevos/src/rcheevos/rc_validate.c +1406 -0
  223. data/vendor/rcheevos/src/rcheevos/rc_validate.h +18 -0
  224. data/vendor/rcheevos/src/rcheevos/richpresence.c +922 -0
  225. data/vendor/rcheevos/src/rcheevos/runtime.c +852 -0
  226. data/vendor/rcheevos/src/rcheevos/runtime_progress.c +1073 -0
  227. data/vendor/rcheevos/src/rcheevos/trigger.c +344 -0
  228. data/vendor/rcheevos/src/rcheevos/value.c +935 -0
  229. data/vendor/rcheevos/src/rhash/aes.c +480 -0
  230. data/vendor/rcheevos/src/rhash/aes.h +49 -0
  231. data/vendor/rcheevos/src/rhash/cdreader.c +838 -0
  232. data/vendor/rcheevos/src/rhash/hash.c +1402 -0
  233. data/vendor/rcheevos/src/rhash/hash_disc.c +1340 -0
  234. data/vendor/rcheevos/src/rhash/hash_encrypted.c +566 -0
  235. data/vendor/rcheevos/src/rhash/hash_rom.c +426 -0
  236. data/vendor/rcheevos/src/rhash/hash_zip.c +460 -0
  237. data/vendor/rcheevos/src/rhash/md5.c +382 -0
  238. data/vendor/rcheevos/src/rhash/md5.h +91 -0
  239. data/vendor/rcheevos/src/rhash/rc_hash_internal.h +116 -0
  240. data/vendor/rcheevos/test/libretro.h +205 -0
  241. data/vendor/rcheevos/test/rapi/test_rc_api_common.c +941 -0
  242. data/vendor/rcheevos/test/rapi/test_rc_api_editor.c +931 -0
  243. data/vendor/rcheevos/test/rapi/test_rc_api_info.c +545 -0
  244. data/vendor/rcheevos/test/rapi/test_rc_api_runtime.c +2213 -0
  245. data/vendor/rcheevos/test/rapi/test_rc_api_user.c +998 -0
  246. data/vendor/rcheevos/test/rcheevos/mock_memory.h +32 -0
  247. data/vendor/rcheevos/test/rcheevos/test_condition.c +570 -0
  248. data/vendor/rcheevos/test/rcheevos/test_condset.c +5170 -0
  249. data/vendor/rcheevos/test/rcheevos/test_consoleinfo.c +203 -0
  250. data/vendor/rcheevos/test/rcheevos/test_format.c +112 -0
  251. data/vendor/rcheevos/test/rcheevos/test_lboard.c +746 -0
  252. data/vendor/rcheevos/test/rcheevos/test_memref.c +520 -0
  253. data/vendor/rcheevos/test/rcheevos/test_operand.c +692 -0
  254. data/vendor/rcheevos/test/rcheevos/test_rc_validate.c +502 -0
  255. data/vendor/rcheevos/test/rcheevos/test_richpresence.c +1564 -0
  256. data/vendor/rcheevos/test/rcheevos/test_runtime.c +1667 -0
  257. data/vendor/rcheevos/test/rcheevos/test_runtime_progress.c +1821 -0
  258. data/vendor/rcheevos/test/rcheevos/test_timing.c +166 -0
  259. data/vendor/rcheevos/test/rcheevos/test_trigger.c +2521 -0
  260. data/vendor/rcheevos/test/rcheevos/test_value.c +870 -0
  261. data/vendor/rcheevos/test/rcheevos-test.sln +46 -0
  262. data/vendor/rcheevos/test/rcheevos-test.vcxproj +239 -0
  263. data/vendor/rcheevos/test/rcheevos-test.vcxproj.filters +335 -0
  264. data/vendor/rcheevos/test/rhash/data.c +657 -0
  265. data/vendor/rcheevos/test/rhash/data.h +32 -0
  266. data/vendor/rcheevos/test/rhash/mock_filereader.c +236 -0
  267. data/vendor/rcheevos/test/rhash/mock_filereader.h +31 -0
  268. data/vendor/rcheevos/test/rhash/test_cdreader.c +920 -0
  269. data/vendor/rcheevos/test/rhash/test_hash.c +310 -0
  270. data/vendor/rcheevos/test/rhash/test_hash_disc.c +1450 -0
  271. data/vendor/rcheevos/test/rhash/test_hash_rom.c +899 -0
  272. data/vendor/rcheevos/test/rhash/test_hash_zip.c +551 -0
  273. data/vendor/rcheevos/test/test.c +113 -0
  274. data/vendor/rcheevos/test/test_framework.h +205 -0
  275. data/vendor/rcheevos/test/test_rc_client.c +10509 -0
  276. data/vendor/rcheevos/test/test_rc_client_external.c +2197 -0
  277. data/vendor/rcheevos/test/test_rc_client_raintegration.c +441 -0
  278. data/vendor/rcheevos/test/test_rc_libretro.c +952 -0
  279. data/vendor/rcheevos/test/test_types.natvis +9 -0
  280. data/vendor/rcheevos/validator/validator.c +658 -0
  281. data/vendor/rcheevos/validator/validator.vcxproj +152 -0
  282. data/vendor/rcheevos/validator/validator.vcxproj.filters +82 -0
  283. metadata +274 -11
  284. data/lib/gemba/input_mappings.rb +0 -214
  285. data/lib/gemba/player.rb +0 -1525
@@ -0,0 +1,495 @@
1
+ # v12.3.0
2
+ * add rc_client_get_next_achievement_info
3
+ * rc_client image functions will now return RC_INSUFFICENT_BUFFER instead of truncating if buffer is not large enough
4
+ * fix race condition where rich presence from previous game may get associated to current game
5
+ * fix rc_client_has_leaderboards returning true if the game only has hidden leaderboards
6
+ * fix memory leak parsing large achievements
7
+ * fix incomplete rich presence display condition affecting later display conditions
8
+
9
+ # v12.2.1
10
+ * fix parsing of leaderboards with comparisons in legacy-formatted values
11
+ * fix validation warning on long AddSource chains
12
+
13
+ # v12.2.0
14
+ * add rc_client_create_subset_list
15
+ * add rc_client_begin_fetch_game_titles
16
+ * greatly improve performance parsing long AddSource chains
17
+ * don't send pings if not processing frames; allows server to suspend session while emulator is paused
18
+ * modify validation logic to return most severe error instead of first error found
19
+ * improve validation warning when 'PauseIf {recall}' attempts to use non-PauseIf Remember
20
+ * fix rounding error when subtracting floats from integers
21
+ * fix infinite loop processing 'Remember {recall}' with no modifiers
22
+ * fix measured value jumping to 0 if all measured-generating alts are paused
23
+ * fix buffer overflow converting long user names between rc_client_external versions
24
+ * fix validation warning when adding differently sized values
25
+ * fix validation warning when ResetIf only applies to hit count inside an AndNext chain
26
+ * fix validation warning when only last node of modified memref chain differs
27
+
28
+ # v12.1.0
29
+ * add rc_client_get_user_subset_summary
30
+ * add validation warning for using MeasuredIf without Measured
31
+ * add validation warning for using ResetIf without hit targets
32
+ * add rapi function for update_rich_presence
33
+ * add gap to RC_CONSOLE_WII memory map to make it easier to convert pointers
34
+ * improve range validation logic
35
+ * fix error Remembering float value
36
+ * fix MeasuredIf evaluation in rich presence
37
+ * fix parsing of code notes with addresses above 0x7FFFFFFF
38
+ * fix double evaluation of rich presence parameters
39
+ * fix validation of SubSource chain
40
+ * fix error if rc_client_allow_background_memory_reads called before calling rc_client_begin_load_raintegration
41
+ * fix memory corruption when mixing legacy and new-format macros in rich presence
42
+ * fix invalid pointer reference when iterator gets cloned
43
+
44
+ # v12.0.0
45
+ * rc_client changes
46
+ * add RC_CLIENT_EVENT_SUBSET_COMPLETED event
47
+ * add 'avatar_url' to rc_client_user_t
48
+ * add 'badge_url' to rc_client_game_t
49
+ * add 'badge_url' and 'badge_locked_url' to rc_client_achievement_t
50
+ * add rc_client_set_hash_callbacks
51
+ * add rc_client_set_allow_background_memory_reads
52
+ * renamed rc_client_begin_change_media to rc_client_begin_identify_and_change_media
53
+ * renamed rc_client_begin_change_media_from_hash to rc_client_begin_change_media
54
+ * use slim read/write locks for rc_mutex on Windows Vista+
55
+ * use critical sections for rc_mutex on older versions of Windows
56
+ * add translation layer in rc_client_external for cross-version support
57
+ * rhash changes
58
+ * rc_hash_init_verbose_message_callback and rc_hash_init_error_message_callback have been deprecated.
59
+ - set values in iterator.callbacks instead.
60
+ * rc_hash_init_custom_filereader and rc_hash_init_custom_cdreader have been deprecated.
61
+ - set values in iterator.callbacks instead.
62
+ * rc_hash_generate_from_file and rc_hash_generate_from_buffer have been deprecated.
63
+ - use rc_hash_initialize_iterator and rc_hash_generate instead.
64
+ * hash.c has been split into several smaller files which can be conditionally excluded from the build.
65
+ - hash_disc.c can be excluded by defining RC_HASH_NO_DISC
66
+ - hash_encrypted.c can be excluded by defining RC_HASH_NO_ENCRYPTED
67
+ - hash_rom.c can be excluded by defining RC_HASH_NO_ROM
68
+ - hash_zip.c can be excluded by defining RC_HASH_NO_ZIP
69
+ * add hash method for RC_CONSOLE_WII
70
+ * add hash method for Arduboy FX games (RC_CONSOLE_ARDUBOY)
71
+ * fix hash for PCE homebrew games that aren't multiples of 128KB
72
+ * rapi changes
73
+ * add _hosted variations of rc_api_init functions for interacting with custom hosts
74
+ - rc_api_set_host and rc_api_set_image_host have been deprecated
75
+ * add rc_api_fetch_game_sets
76
+ * add rc_api_fetch_followed_users
77
+ * add rc_api_fetch_hash_library
78
+ * add rc_api_fetch_all_user_progress
79
+ * add 'avatar_url' to login response, achievement_info response, and leaderboard_info responses
80
+ * add 'badge_url' to game_data response
81
+ * rurl has been removed (deprecated in v10.0.0)
82
+ * trigger parsing/processing code has been largely modified to improve processing performance
83
+ * AddAddress/AddSource chains can now be shared across triggers to avoid recalculating them multiple times
84
+ * triggers are preprocessed to allocate conditions as array instead of linked list.
85
+ - array is sorted such that similar conditions (pause/reset/hittarget/etc) can be processed together
86
+ without having to scan the linked list multiple times
87
+ - the linked list still exists for backwards compatibility and to maintain the original ordering
88
+ * each condition type has its own handler, eliminating many switches and branches when processing triggers
89
+ * memrefs are now allocated in arrays (eliminating the linked list pointer from each to reduce memory footprint)
90
+ * commas are now inserted into all numeric formats except SCORE. a new format type UNFORMATTED (@Unformatted) has
91
+ been added to display a number without commas.
92
+ - To forcibly exclude commas in a backwards-compatible way, use the @Unformatted macro and define Unformatted as
93
+ a VALUE formatter. Legacy clients will use the VALUE formatted and new clients will use the @Unformatted macro.
94
+ * add RC_CONSOLE_FAMICOM_DISK_SYSTEM (split off of RC_CONSOLE_NINTENDO)
95
+ * update RC_CONSOLE_SNES memory map to support SA-1 I-RAM and BW-RAM
96
+ * update RC_CONSOLE_SEGACD memory map to supprot WORD RAM
97
+ * update RC_CONSOLE_N64 memory map to place RDRAM at $80000000 and expansion pak RAM at $80400000
98
+ * remove HAVE_LUA define and support (implementation was never finished)
99
+ * report error when RP contains address starting with `0x0x`.
100
+ * add .natvis files to improve debugging in Visual Studio
101
+
102
+ # v11.6.0
103
+ * backdate retried unlocks in rc_client
104
+ * add memory map and hash method for RC_CONSOLE_ZX_SPECTRUM
105
+ * add RC_CONSOLE_GAMECUBE to supported consoles for iso file extension
106
+ * add DTCM to RC_CONSOLE_NINTENDO_DS and RC_CONSOLE_NINTENDO_DSI memory maps
107
+ * don't report conflict if last conditions of OrNext chain conflict
108
+ * don't report conflict if last conditions of AddSource chain conflict
109
+ * fix hits not being reset on leaderboard value when start and submit are both true in a single frame
110
+ * fix crash when multiple items in a CSV lookup overlap
111
+ * fix crash if game is unloaded while activating achievements
112
+
113
+ # v11.5.0
114
+ * add total_entries to rc_api_fetch_leaderboard_info_response_t
115
+ * add RC_CLIENT_RAINTEGRATION_EVENT_MENU_CHANGED event
116
+ * modify rc_client_begin_identify_and_load_game and rc_client_begin_change_media to use locally
117
+ registered filereader/cdreader for hash resolution when using rc_client_raintegration
118
+ * add support for ISO-8601 timestamps in JSON responses
119
+ * update RC_CONSOLE_MS_DOS hash logic to support parent archives
120
+ * fix infinite loop that sometimes occurs when resetting while progress tracker is onscreen
121
+
122
+ # v11.4.0
123
+ * add RC_CONDITION_REMEMBER and RC_OPERAND_RECALL
124
+ * add RC_OPERATOR_ADD and RC_OPERATOR_SUB
125
+ * add scratch pad memory to PSX memory map
126
+ * add Super Game Module memory to Colecovision memory map
127
+ * add rapi function fetch_game_titles
128
+ * modify progress functions to return RC_NO_GAME_LOADED when "Unknown Game" is loaded
129
+ * update subsystem list for arcade hash
130
+ * fix exception if server sends null as achievement.author
131
+
132
+ # v11.3.0
133
+ * add RC_OPERATOR_MOD
134
+ * add cartridge RAM to Game Gear and Master System memory maps
135
+ * add extended cartridge RAM to Gameboy and Gameboy Color memory maps
136
+ * add rc_client_is_game_loaded helper function
137
+ * add rc_client_raintegration_set_console_id to specify console in case game resolution fails
138
+ * add rc_client_raintegration_get_achievement_state to detect local unlocks
139
+ * report validation errors on multi-condition logic
140
+ * hash whole file for PSP homebrew files (eboot.pbp)
141
+ * call DrawMenuBar in rc_client_raintegration_rebuild_submenu if menu changes
142
+ * fix file sharing issue using default filereader on Windows
143
+ * fix exception calling rc_client_get_game_summary with an unidentified game loaded
144
+
145
+ # v11.2.0
146
+ * add alternate methods for state serialization/deserialization that accept a buffer_size parameter
147
+ * add RC_CLIENT_SUPPORTS_HASH compile flag
148
+ - allows rc_client code to build without the rhash files (except md5.c)
149
+ - must be explicitly defined to use rc_client_begin_identify_and_load_game
150
+ * add rc_client_get_load_game_state
151
+ * add rc_client_raintegration_set_get_game_name_function
152
+ * add RC_MEMSIZE_DOUBLE32 and RC_MEMSIZE_DOUBLE32_BE
153
+ * exclude directory records from ZIP hash algorithm
154
+ * fix media host when explicitly setting host to production server
155
+ * fix potential out-of-bounds read looking for error message in non-JSON response
156
+
157
+ # v11.1.0
158
+ * add rc_client_get_user_agent_clause to generate substring to include in client User-Agents
159
+ * add rc_client_can_pause function to control pause spam
160
+ * add achievement type and rarity to rc_api_fetch_game_data_response_t and rc_client_achievement_t
161
+ * add RC_CLIENT_ACHIEVEMENT_BUCKET_UNSYNCED for achievements that have been unlocked locally but not synced to the server
162
+ * add RC_CONSOLE_NEO_GEO_CD to supported consoles for chd file extension
163
+ * add hash logic for RC_CONSOLE_NINTENDO_3DS (note: added new file rhash/aes.c to support this)
164
+ * add hash logic for RC_CONSOLE_MS_DOS
165
+ * add game_hash and hardcore fields to rc_api_start_session_request_t and rc_api_ping_request_t
166
+ * add RC_FORMAT_FIXED1/2/3, RC_FORMAT_TENS, RC_FORMAT_HUNDREDS, RC_FORMAT_THOUSANDS, and RC_FORMAT_UNSIGNED_VALUE
167
+ * add RC_CONSOLE_STANDALONE
168
+ * add extern "C" and __cdecl attributes to public functions
169
+ * add __declspec(dllexport/dllimport) attributes to public functions via #define enablement
170
+ * add rc_version and rc_version_string functions for accessing version from external linkage
171
+ * add unicode path support to default filereader (Windows builds)
172
+ * add rc_mutex support for GEKKO (libogc)
173
+ * fix async_handle being returned when rc_client_begin_login is aborted synchronously
174
+ * fix logic error hashing CD files smaller than one sector
175
+ * fix read across region boundary in rc_libretro_memory_read
176
+ * fix RC_CLIENT_EVENT_ACHIEVEMENT_CHALLENGE_INDICATOR_SHOW event not being raised if achievement is reset in the same frame that it's primed
177
+ * moved rc_util.h from src/ to include/
178
+ * initial (incomplete) support for rc_client_external_t and rc_client_raintegration_t
179
+
180
+ # v11.0.0
181
+ * add rc_client_t and related functions
182
+ * add RC_MEMSIZE_FLOAT_BE
183
+ * add Game Pak SRAM to GBA memory map
184
+ * add hash method for Super Cassettevision
185
+ * add PSP to potential consoles for chd iterator
186
+ * add content_type to rc_api_request_t for client to pass to server
187
+ * add rc_api_process_X_server_response methods to pass status_code and body_length to response processing functions
188
+ * add additional error codes to rc_api_process_login_response: RC_INVALID_CREDENTIALS, RC_EXPIRED_TOKEN, RC_ACCESS_DENIED
189
+ * rc_api_start_session now also returns unlocks without having to explicitly call rc_api_fetch_user_unlocks separately
190
+ * add validation warning for using hit target of 1 on ResetIf condition
191
+ * move compat.c up a directory and rename to rc_compat.c as it's shared by all subfolders
192
+ * move rc_libretro.c up a directory as it uses files from all subfolders
193
+ * convert loosely sized types to strongly sized types (unsigned -> uint32t, unsigned char -> uint8_t, etc)
194
+
195
+ # v10.7.1
196
+ * add rc_runtime_alloc
197
+ * add rc_libretro_memory_find_avail
198
+ * extract nginx errors from HTML returned for JSON endpoints
199
+ * fix real address for 32X extension RAM
200
+ * fix crash attempting to calculate gamecube hash for non-existent file
201
+
202
+ # v10.7.0
203
+ * add hash method and memory map for Gamecube
204
+ * add console enum, hash method, and memory map for DSi
205
+ * add console enum, hash method, and memory map for TI-83
206
+ * add console enum, hash method, and memory map for Uzebox
207
+ * add constant for rcheevos version; include in start session server API call
208
+ * fix SubSource calculations using float values
209
+ * fix game identification for homebrew Jaguar CD games
210
+ * fix game identification for CD with many files at root directory
211
+ * address _CRT_SECURE_NO_WARNINGS warnings
212
+
213
+ # v10.6.0
214
+ * add RC_RUNTIME_EVENT_ACHIEVEMENT_PROGRESS_UPDATED
215
+ * use optimized comparators for most common condition logic
216
+ * fix game identification of psx ISOs that have extra slashes in their boot path
217
+ * fix game identification of ndd files
218
+
219
+ # v10.5.0
220
+ * add RC_MEMSIZE_MBF32_LE
221
+ * add RC_OPERATOR_XOR
222
+ * add RC_CONSOLE_ATARI_JAGUAR_CD and hash/memory map for Atari Jaguar CD
223
+ * add RC_CONSOLE_ARCADIA_2001 and hash/memory map for Arcadia 2001
224
+ * add RC_CONSOLE_INTERTON_VC_4000 and hash/memory map for Interton VC 4000
225
+ * add RC_CONSOLE_ELEKTOR_TV_GAMES_COMPUTER and hash/memory map for Elektor TV Games Computer
226
+ * split RC_CONSOLE_PC_ENGINE_CD off of RC_CONSOLE_PC_ENGINE
227
+ * add hash/memory map for RC_CONSOLE_NEO_GEO_CD
228
+ * add additional 256KB of RAM to memory map for RC_CONSOLE_SEGA_32X
229
+ * validation: don't report redundancy between trigger and non-trigger conditions
230
+ * validation: don't report range validation errors for float comparisons
231
+ * change default image host to media.retroachievements.org
232
+ * fix decoding of denormalized floats
233
+ * fix full line comments in the middle of Display: section causing RC_MISSING_DISPLAY_STRING
234
+
235
+ # v10.4.0
236
+ * add rc_libretro_hash_set_t with support for #SAVEDISK: m3u extension
237
+ * add rc_libretro_is_system_allowed for finer-grain control over core support
238
+ * fix measured value from hitcount not resetting while paused
239
+ * add RC_CONSOLE_WASM and hash/memory map for WASM-4
240
+ * add scratchpad memory to RC_CONSOLE_PLAYSTATION_2 memory map
241
+ * add hash/memory map for RC_CONSOLE_FAIRCHILD_CHANNEL_F
242
+ * add hash/memory map for RC_CONSOLE_COMMODORE_64
243
+ * add memory map for RC_CONSOLE_AMIGA
244
+
245
+ # v10.3.3
246
+ * add RC_CONSOLE_ARDUBOY and hash/memory map for Arduboy
247
+ * add display_name to rc_api_login_response_t
248
+ * detect logical conflicts and redundancies in validator
249
+ * fix tab sequences in JSON responses being turned into t
250
+ * fix overflow when float value has more than 9 digits after the decimal
251
+ * fix libretro memory mapping when disconnect mask breaks a region into multiple blocks
252
+ * fix non-virtualized file system call when reading some iso files
253
+
254
+ # v10.3.2
255
+ * fix RC_OPERAND_PRIOR for bit sizes other than RC_MEMSIZE_BIT_0
256
+ * add memory map and hash for Amstrad CPC
257
+ * fix an issue where fetch_game_data and fetch_user_unlocks could return RC_MISSING_VALUE instead of acknowledging a server error
258
+
259
+ # v10.3.1
260
+ * allow empty description in rc_api_init_update_leaderboard_request
261
+ * fix buffered n64 hash when no filereader is registered
262
+ * add memory map and hash for Mega Duck
263
+
264
+ # v10.3.0
265
+ * support for floating point memory sizes and logic
266
+ * add built-in macros for rich presence: @Number, @Score, @Centisecs, @Seconds, @Minutes, @ASCIIChar, @UnicodeChar
267
+ * add rapi functions for fetch_code_notes, update_code_note, upload_achievement, update_leaderboard, fetch_badge_range, and add_game_hash
268
+ * add lower_is_better and hidden flags to leaderboards in rc_api_fetch_game_data_response_t
269
+ * add achievements_remaining to rc_api_award_achievement_response_t
270
+ * add console enums for PC6000, PICO, MEGADUCK and ZEEBO
271
+ * add memory map for Dreamcast
272
+ * capture leaderboard/rich presence state in rc_runtime_progress data
273
+ * support for hashing Dreamcast bin/cues
274
+ * support for hashing buffered NDS ROMs
275
+ * fix prior for sizes smaller than a byte sometimes returning current value
276
+
277
+ # v10.2.0
278
+
279
+ * add RC_MEMSIZE_16_BITS_BE, RC_MEMSIZE_24_BITS_BE, and RC_MEMSIZE_32_BITS_BE
280
+ * add secondary flag for RC_CONDITION_MEASURED that tells the UI when to show progress as raw vs. as a percentage
281
+ * add rapi calls for fetch_leaderboard_info, fetch_achievement_info and fetch_game_list
282
+ * add hash support for RC_CONSOLE_PSP
283
+ * add RCHEEVOS_URL_SSL compile flag to use https in rurl functions
284
+ * add space to "PC Engine" label
285
+ * update RC_CONSOLE_INTELLIVISION memory map to acknowledge non-8-bit addresses
286
+ * standardize to z64 format when hashing RC_CONSOLE_N64
287
+ * prevent generating hash for PSX disc when requesting RC_CONSOLE_PLAYSTATION2
288
+ * fix wrong error message being returned when a leaderboard was only slightly malformed
289
+
290
+ # v10.1.0
291
+
292
+ * add RC_RUNTIME_EVENT_ACHIEVEMENT_UNPRIMED
293
+ * add rc_runtime_validate_addresses
294
+ * add external memory to memory map for Magnavox Odyssey 2
295
+ * fix memory map base address for NeoGeo Pocket
296
+ * fix bitcount always returning 0 when used in rich presence
297
+
298
+ # v10.0.0
299
+
300
+ * add rapi sublibrary for communicating with server (eliminates need for client-side JSON parsing; client must still
301
+ provide HTTP functionality). rurl is now deprecated
302
+ * renamed 'rhash.h' to 'rc_hash.h' to eliminate conflict with system headers, renamed 'rconsoles.h' and 'rurl.h' for
303
+ consistency
304
+ * split non-runtime functions out of 'rcheevos.h' as they're not needed by most clients
305
+ * allow ranges in rich presence lookups
306
+ * add rc_richpresence_size_lines function to fetch line associated to error when processing rich presence script
307
+ * add rc_runtime_invalidate_address function to disable achievements when an unknown address is queried
308
+ * add RC_CONDITION_RESET_NEXT_IF
309
+ * add RC_CONDITION_SUB_HITS
310
+ * support MAXOF operator ($) for leaderboard values using trigger syntax
311
+ * allow RC_CONDITION_PAUSE_IF and RC_CONDITION_RESET_IF in leaderboard value expression
312
+ * changed track parameter of rc_hash_cdreader_open_track_handler to support three virtual tracks:
313
+ RC_HASH_CDTRACK_FIRST_DATA, RC_HASH_CDTRACK_LAST and RC_HASH_CDTRACK_LARGEST.
314
+ * changed offset parameter of rc_hash_filereader_seek_handler and return value of rc_hash_filereader_tell_handler
315
+ from size_t to int64_t to support files larger than 2GB when compiling in 32-bit mode.
316
+ * reset to default cd reader if NULL is passed to rc_hash_init_custom_cdreader
317
+ * add hash support for RC_CONSOLE_DREAMCAST, RC_CONSOLE_PLAYSTATION_2, RC_CONSOLE_SUPERVISION, and RC_CONSOLE_TIC80
318
+ * ignore headers when generating hashs for RC_CONSOLE_PC_ENGINE and RC_CONSOLE_ATARI_7800
319
+ * require unique identifier when hashing RC_CONSOLE_SEGA_CD and RC_CONSOLE_SATURN discs
320
+ * add expansion memory to RC_CONSOLE_SG1000 memory map
321
+ * rename RC_CONSOLE_MAGNAVOX_ODYSSEY -> RC_CONSOLE_MAGNAVOX_ODYSSEY2
322
+ * rename RC_CONSOLE_AMIGA_ST -> RC_CONSOLE_ATARI_ST
323
+ * add RC_CONSOLE_SUPERVISION, RC_CONSOLE_SHARPX1, RC_CONSOLE_TIC80, RC_CONSOLE_THOMSONTO8
324
+ * fix error identifying largest track when track has multiple bins
325
+ * fix memory corruption error when cue track has more than 6 INDEXs
326
+ * several improvements to data storage for conditions (rc_memref_t and rc_memref_value_t structures have been modified)
327
+
328
+ # v9.2.0
329
+
330
+ * fix issue identifying some PC-FX titles where the boot code is not in the first data track
331
+ * add enums and labels for RC_CONSOLE_MAGNAVOX_ODYSSEY, RC_CONSOLE_SUPER_CASSETTEVISION, RC_CONSOLE_NEO_GEO_CD,
332
+ RC_CONSOLE_FAIRCHILD_CHANNEL_F, RC_CONSOLE_FM_TOWNS, RC_CONSOLE_ZX_SPECTRUM, RC_CONSOLE_GAME_AND_WATCH,
333
+ RC_CONSOLE_NOKIA_NGAGE, RC_CONSOLE_NINTENDO_3DS
334
+
335
+ # v9.1.0
336
+
337
+ * add hash support and memory map for RC_CONSOLE_MSX
338
+ * add hash support and memory map for RC_CONSOLE_PCFX
339
+ * include parent directory when hashing non-arcade titles in arcade mode
340
+ * support absolute paths in m3u
341
+ * make cue scanning case-insensitive
342
+ * expand SRAM mapping for RC_CONSOLE_WONDERSWAN
343
+ * fix display of measured value when another group has an unmeasured hit count
344
+ * fix memory read error when hashing file with no extension
345
+ * fix possible divide by zero when using RC_CONDITION_ADD_SOURCE/RC_CONDITION_SUB_SOURCE
346
+ * fix classification of secondary RC_CONSOLE_SATURN memory region
347
+
348
+ # v9.0.0
349
+
350
+ * new size: RC_MEMSIZE_BITCOUNT
351
+ * new flag: RC_CONDITION_OR_NEXT
352
+ * new flag: RC_CONDITION_TRIGGER
353
+ * new flag: RC_CONDITION_MEASURED_IF
354
+ * new operators: RC_OPERATOR_MULT / RC_OPERATOR_DIV
355
+ * is_bcd removed from memref - now part of RC_MEMSIZE
356
+ * add rc_runtime_t and associated functions
357
+ * add rc_hash_ functions
358
+ * add rc_error_str function
359
+ * add game_hash parameter to rc_url_award_cheevo
360
+ * remove hash parameter from rc_url_submit_lboard
361
+ * add rc_url_ping function
362
+ * add rc_console_ functions
363
+
364
+ # v8.1.0
365
+
366
+ * new flag: RC_CONDITION_MEASURED
367
+ * new flag: RC_CONDITION_ADD_ADDRESS
368
+ * add rc_evaluate_trigger - extended version of rc_test_trigger with more granular return codes
369
+ * make rc_evaluate_value return a signed int (was unsigned int)
370
+ * new formats: RC_FORMAT_MINUTES and RC_FORMAT_SECONDS_AS_MINUTES
371
+ * removed " Points" text from RC_FORMAT_SCORE format
372
+ * removed RC_FORMAT_OTHER format. "OTHER" format now parses to RC_FORMAT_SCORE
373
+ * bugfix: AddHits will now honor AndNext on previous condition
374
+
375
+ # v8.0.1
376
+
377
+ * bugfix: prevent null reference exception if rich presence contains condition without display string
378
+ * bugfix: 24-bit read from memory should only read 24-bits
379
+
380
+ # v8.0.0
381
+
382
+ * support for prior operand type
383
+ * support for AndNext condition flag
384
+ * support for rich presence
385
+ * bugfix: update delta/prior memory values while group is paused
386
+ * bugfix: allow floating point number without leading 0
387
+ * bugfix: support empty alt groups
388
+
389
+ # v7.1.1
390
+
391
+ * Address signed/unsigned mismatch warnings
392
+
393
+ # v7.1.0
394
+
395
+ * Added the RC_DISABLE_LUA macro to compile rcheevos without Lua support
396
+
397
+ # v7.0.2
398
+
399
+ * Make sure the code is C89-compliant
400
+ * Use 32-bit types in Lua
401
+ * Only evaluate Lua operands when the Lua state is not `NULL`
402
+
403
+ # v7.0.1
404
+
405
+ * Fix the alignment of memory allocations
406
+
407
+ # v7.0.0
408
+
409
+ * Removed **rjson**
410
+
411
+ # v6.5.0
412
+
413
+ * Added a schema for errors returned by the server
414
+
415
+ # v6.4.0
416
+
417
+ * Added an enumeration with the console identifiers used in RetroAchievements
418
+
419
+ # v6.3.1
420
+
421
+ * Pass the peek function and the user data to the Lua functions used in operands.
422
+
423
+ # v6.3.0
424
+
425
+ * Added **rurl**, an API to build URLs to access RetroAchievements web services.
426
+
427
+ # v6.2.0
428
+
429
+ * Added **rjson**, an API to easily decode RetroAchievements JSON files into C structures.
430
+
431
+ # v6.1.0
432
+
433
+ * Added support for 24-bit operands with the `'W'` prefix (`RC_OPERAND_24_BITS`)
434
+
435
+ # v6.0.2
436
+
437
+ * Only define RC_ALIGNMENT if it has not been already defined
438
+
439
+ # v6.0.1
440
+
441
+ * Use `sizeof(void*)` as a better default for `RC_ALIGNMENT`
442
+
443
+ # v6.0.0
444
+
445
+ * Simplified API: separate functions to get the buffer size and to parse `memaddr` into the provided buffer
446
+ * Fixed crash trying to call `rc_update_condition_pause` during a dry-run
447
+ * The callers are now responsible to pass down a scratch buffer to avoid accesses to out-of-scope memory
448
+
449
+ # v5.0.0
450
+
451
+ * Pre-compute if a condition has a pause condition in its group
452
+ * Added a pre-computed flag that tells if the condition set has at least one pause condition
453
+ * Removed the link to the previous condition in a condition set chain
454
+
455
+ # v4.0.0
456
+
457
+ * Fixed `ret` not being properly initialized in `rc_parse_trigger`
458
+ * Build the unit tests with optimizations and `-Wall` to help catch more issues
459
+ * Added `extern "C"` around the inclusion of the Lua headers so that **rcheevos** can be compiled cleanly as C++
460
+ * Exposed `rc_parse_value` and `rc_evaluate_value` to be used with rich presence
461
+ * Removed the `reset` and `dirty` flags from the external API
462
+
463
+ # v3.2.0
464
+
465
+ * Added the ability to reset triggers and leaderboards
466
+ * Add a function to parse a format string and return the format enum, and some unit tests for it
467
+
468
+ # v3.1.0
469
+
470
+ * Added `rc_format_value` to the API
471
+
472
+ # v3.0.1
473
+
474
+ * Fixed wrong 32-bit value on 64-bit platforms
475
+
476
+ # v3.0.0
477
+
478
+ * Removed function rc_evaluate_value from the API
479
+
480
+ # v2.0.0
481
+
482
+ * Removed leaderboard callbacks in favor of a simpler scheme
483
+
484
+ # v1.1.2
485
+
486
+ * Fixed NULL pointer deference when there's an error during the parse
487
+
488
+ # v1.1.1
489
+
490
+ * Removed unwanted garbage
491
+ * Should be v1.0.1 :/
492
+
493
+ # v1.0.0
494
+
495
+ * First version
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2018 RetroAchievements.org
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,33 @@
1
+ // swift-tools-version: 5.8
2
+ // The swift-tools-version declares the minimum version of Swift required to build this package.
3
+
4
+ import PackageDescription
5
+
6
+ let package = Package(
7
+ name: "rcheevos",
8
+ products: [
9
+ // Products define the executables and libraries a package produces, and make them visible to other packages.
10
+ .library(
11
+ name: "rcheevos",
12
+ targets: ["rcheevos"]),
13
+ ],
14
+ dependencies: [
15
+ // Dependencies declare other packages that this package depends on.
16
+ // .package(url: /* package url */, from: "1.0.0"),
17
+ ],
18
+ targets: [
19
+ // Targets are the basic building blocks of a package. A target can define a module or a test suite.
20
+ // Targets can depend on other targets in this package, and on products in packages this package depends on.
21
+ .target(
22
+ name: "rcheevos",
23
+ dependencies: [],
24
+ path: ".",
25
+ exclude: ["src/rc_libretro.c", "src/rc_client_external.c"],
26
+ sources: ["include", "src", "src/rcheevos", "src/rapi", "src/rhash"],
27
+ publicHeadersPath: "include",
28
+ cSettings: [
29
+ .define("RC_DISABLE_LUA"),
30
+ .define("RC_CLIENT_SUPPORTS_HASH")
31
+ ]),
32
+ ]
33
+ )
@@ -0,0 +1,67 @@
1
+ # **rcheevos**
2
+
3
+ **rcheevos** is a set of C code, or a library if you will, that tries to make it easier for emulators to process [RetroAchievements](https://retroachievements.org) data, providing support for achievements and leaderboards for their players.
4
+
5
+ Keep in mind that **rcheevos** does *not* provide HTTP network connections. Clients must get data from RetroAchievements, and pass the response down to **rcheevos** for processing.
6
+
7
+ Not all structures defined by **rcheevos** can be created via the public API, but are exposed to allow interactions beyond just creation, destruction, and testing, such as the ones required by UI code that helps to create them.
8
+
9
+ **NOTE**: development occurs on the _develop_ branch, which is set as the default branch in GitHub so newly opened PRs will request to be merged into the _develop_ branch. When integrating **rcheevos** into your project, we recommend using the _master_ branch, which corresponds to the last official release, and minimizes the risk of encountering a bug that has been introduced since the last official release.
10
+
11
+ ## API
12
+
13
+ An understanding about how achievements are developed may be useful, you can read more about it [here](https://docs.retroachievements.org/developer-docs/).
14
+
15
+ Most of the exposed APIs are documented [here](https://github.com/RetroAchievements/rcheevos/wiki)
16
+
17
+ ### Return values
18
+
19
+ Any function in the rcheevos library that returns a success indicator will return `RC_OK` or one of the constants defined in `rc_error.h`.
20
+
21
+ To convert the return code into something human-readable, pass it to:
22
+ ```c
23
+ const char* rc_error_str(int ret);
24
+ ```
25
+
26
+ ### Console identifiers
27
+
28
+ Platforms supported by RetroAchievements are enumerated in `rc_consoles.h`. Note that some consoles in the enum are not yet fully supported (may require a memory map or some way to uniquely identify games).
29
+
30
+ ## Runtime support
31
+
32
+ A set of functions for managing an active game is provided by the library. If you are considering adding achievement support to your emulator, you should look at the `rc_client_t` functions which will prepare the API calls and other implement other common functionality (like managing the user information, identifying/loading a game, and building the active/inactive achievements list for the UI). It has several callback functions which allow the client to implement dependent functionality (UI and HTTP calls). Please see [the wiki](https://github.com/RetroAchievements/rcheevos/wiki/rc_client-integration) for details on using the `rc_client_t` functions.
33
+
34
+ ## Server Communication
35
+
36
+ **rapi** builds URLs to access many RetroAchievements web services. Its purpose it to just to free the developer from having to URL-encode parameters and build correct URLs that are valid for the server.
37
+
38
+ **rapi** does *not* make HTTP requests.
39
+
40
+ NOTE: `rc_client` is the preferred way to have a client interact with the server.
41
+
42
+ **rapi** headers are `rc_api_user.h`, `rc_api_runtime.h` and `rc_api_common.h`.
43
+
44
+ The basic process of making an **rapi** call is to initialize a params object, call a function to convert it to a URL, send that to the server, then pass the response to a function to convert it into a response object, and handle the response values.
45
+
46
+ An example can be found on the [rc_api_init_login_request](https://github.com/RetroAchievements/rcheevos/wiki/rc_api_init_login_request#example) page.
47
+
48
+ ### Functions
49
+
50
+ Please see the [wiki](https://github.com/RetroAchievements/rcheevos/wiki) for details on the functions exposed for **rapi**.
51
+
52
+ ## Game Identification
53
+
54
+ **rhash** provides logic for generating a RetroAchievements hash for a given game. There are two ways to use the API - you can pass the filename and let rhash open and process the file, or you can pass the buffered copy of the file to rhash if you've already loaded it into memory.
55
+
56
+ These are in `rc_hash.h`.
57
+
58
+ ```c
59
+ void rc_hash_initialize_iterator(rc_hash_iterator_t* iterator, const char* path, const uint8_t* buffer, size_t buffer_size);
60
+ int rc_hash_generate(char hash[33], uint32_t console_id, const rc_hash_iterator_t* iterator);
61
+ int rc_hash_iterate(char hash[33], rc_hash_iterator_t* iterator);
62
+ void rc_hash_destroy_iterator(rc_hash_iterator_t* iterator);
63
+ ```
64
+
65
+ ### Custom file handling
66
+
67
+ **rhash** (and by extension **rc_client**) support custom handlers for opening/reading files. This allows the client to redirect file reads to support custom file formats (like ZIP or CHD).