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,390 @@
1
+ #ifndef RC_INTERNAL_H
2
+ #define RC_INTERNAL_H
3
+
4
+ #include "rc_runtime_types.h"
5
+ #include "rc_util.h"
6
+
7
+ RC_BEGIN_C_DECLS
8
+
9
+ typedef struct rc_scratch_string {
10
+ char* value;
11
+ struct rc_scratch_string* left;
12
+ struct rc_scratch_string* right;
13
+ }
14
+ rc_scratch_string_t;
15
+
16
+ typedef struct rc_modified_memref_t {
17
+ rc_memref_t memref; /* For compatibility with rc_operand_t.value.memref */
18
+ rc_operand_t parent; /* The parent memref this memref is derived from (type will always be a memref type) */
19
+ rc_operand_t modifier; /* The modifier to apply to the parent. */
20
+ uint8_t modifier_type; /* How to apply the modifier to the parent. (RC_OPERATOR_*) */
21
+ uint16_t depth; /* The number of parents this memref has. */
22
+ }
23
+ rc_modified_memref_t;
24
+
25
+ typedef struct rc_memref_list_t {
26
+ rc_memref_t* items;
27
+ struct rc_memref_list_t* next;
28
+ uint16_t count;
29
+ uint16_t capacity;
30
+ uint8_t allocated;
31
+ } rc_memref_list_t;
32
+
33
+ typedef struct rc_modified_memref_list_t {
34
+ rc_modified_memref_t* items;
35
+ struct rc_modified_memref_list_t* next;
36
+ uint16_t count;
37
+ uint16_t capacity;
38
+ uint8_t allocated;
39
+ } rc_modified_memref_list_t;
40
+
41
+ typedef struct rc_memrefs_t {
42
+ rc_memref_list_t memrefs;
43
+ rc_modified_memref_list_t modified_memrefs;
44
+ } rc_memrefs_t;
45
+
46
+ typedef struct rc_trigger_with_memrefs_t {
47
+ rc_trigger_t trigger;
48
+ rc_memrefs_t memrefs;
49
+ } rc_trigger_with_memrefs_t;
50
+
51
+ typedef struct rc_lboard_with_memrefs_t {
52
+ rc_lboard_t lboard;
53
+ rc_memrefs_t memrefs;
54
+ } rc_lboard_with_memrefs_t;
55
+
56
+ typedef struct rc_richpresence_with_memrefs_t {
57
+ rc_richpresence_t richpresence;
58
+ rc_memrefs_t memrefs;
59
+ } rc_richpresence_with_memrefs_t;
60
+
61
+ typedef struct rc_value_with_memrefs_t {
62
+ rc_value_t value;
63
+ rc_memrefs_t memrefs;
64
+ } rc_value_with_memrefs_t;
65
+
66
+ /* enum helpers for natvis expansion. Have to use a struct to define the mapping,
67
+ * and a single field to allow the conditional logic to switch on the value */
68
+ typedef struct __rc_bool_enum_t { uint8_t value; } __rc_bool_enum_t;
69
+ typedef struct __rc_memsize_enum_t { uint8_t value; } __rc_memsize_enum_t;
70
+ typedef struct __rc_memsize_enum_func_t { uint8_t value; } __rc_memsize_enum_func_t;
71
+ typedef struct __rc_operand_enum_t { uint8_t value; } __rc_operand_enum_t;
72
+ typedef struct __rc_value_type_enum_t { uint8_t value; } __rc_value_type_enum_t;
73
+ typedef struct __rc_memref_type_enum_t { uint8_t value; } __rc_memref_type_enum_t;
74
+ typedef struct __rc_condition_enum_t { uint8_t value; } __rc_condition_enum_t;
75
+ typedef struct __rc_condition_enum_str_t { uint8_t value; } __rc_condition_enum_str_t;
76
+ typedef struct __rc_condset_list_t { rc_condset_t* first_condset; } __rc_condset_list_t;
77
+ typedef struct __rc_operator_enum_t { uint8_t value; } __rc_operator_enum_t;
78
+ typedef struct __rc_operator_enum_str_t { uint8_t value; } __rc_operator_enum_str_t;
79
+ typedef struct __rc_operand_memref_t { rc_operand_t operand; } __rc_operand_memref_t; /* requires &rc_operand_t to be the same as &rc_operand_t.value.memref */
80
+ typedef struct __rc_value_list_t { rc_value_t* first_value; } __rc_value_list_t;
81
+ typedef struct __rc_trigger_state_enum_t { uint8_t value; } __rc_trigger_state_enum_t;
82
+ typedef struct __rc_lboard_state_enum_t { uint8_t value; } __rc_lboard_state_enum_t;
83
+ typedef struct __rc_richpresence_display_list_t { rc_richpresence_display_t* first_display; } __rc_richpresence_display_list_t;
84
+ typedef struct __rc_richpresence_display_part_list_t { rc_richpresence_display_part_t* display; } __rc_richpresence_display_part_list_t;
85
+ typedef struct __rc_richpresence_lookup_list_t { rc_richpresence_lookup_t* first_lookup; } __rc_richpresence_lookup_list_t;
86
+ typedef struct __rc_format_enum_t { uint8_t value; } __rc_format_enum_t;
87
+
88
+ #define RC_ALLOW_ALIGN(T) struct __align_ ## T { uint8_t ch; T t; };
89
+
90
+ RC_ALLOW_ALIGN(rc_condition_t)
91
+ RC_ALLOW_ALIGN(rc_condset_t)
92
+ RC_ALLOW_ALIGN(rc_modified_memref_t)
93
+ RC_ALLOW_ALIGN(rc_lboard_t)
94
+ RC_ALLOW_ALIGN(rc_lboard_with_memrefs_t)
95
+ RC_ALLOW_ALIGN(rc_memref_t)
96
+ RC_ALLOW_ALIGN(rc_memref_list_t)
97
+ RC_ALLOW_ALIGN(rc_memrefs_t)
98
+ RC_ALLOW_ALIGN(rc_modified_memref_list_t)
99
+ RC_ALLOW_ALIGN(rc_operand_t)
100
+ RC_ALLOW_ALIGN(rc_richpresence_t)
101
+ RC_ALLOW_ALIGN(rc_richpresence_display_t)
102
+ RC_ALLOW_ALIGN(rc_richpresence_display_part_t)
103
+ RC_ALLOW_ALIGN(rc_richpresence_lookup_t)
104
+ RC_ALLOW_ALIGN(rc_richpresence_lookup_item_t)
105
+ RC_ALLOW_ALIGN(rc_richpresence_with_memrefs_t)
106
+ RC_ALLOW_ALIGN(rc_scratch_string_t)
107
+ RC_ALLOW_ALIGN(rc_trigger_t)
108
+ RC_ALLOW_ALIGN(rc_trigger_with_memrefs_t)
109
+ RC_ALLOW_ALIGN(rc_value_t)
110
+ RC_ALLOW_ALIGN(rc_value_with_memrefs_t)
111
+ RC_ALLOW_ALIGN(char)
112
+
113
+ #define RC_ALIGNOF(T) (sizeof(struct __align_ ## T) - sizeof(T))
114
+ #define RC_OFFSETOF(o, t) (int)((uint8_t*)&(o.t) - (uint8_t*)&(o))
115
+
116
+ #define RC_ALLOC(t, p) ((t*)rc_alloc((p)->buffer, &(p)->offset, sizeof(t), RC_ALIGNOF(t), &(p)->scratch, RC_OFFSETOF((p)->scratch.objs, __ ## t)))
117
+ #define RC_ALLOC_SCRATCH(t, p) ((t*)rc_alloc_scratch((p)->buffer, &(p)->offset, sizeof(t), RC_ALIGNOF(t), &(p)->scratch, RC_OFFSETOF((p)->scratch.objs, __ ## t)))
118
+ #define RC_ALLOC_ARRAY(t, n, p) ((t*)rc_alloc((p)->buffer, &(p)->offset, (n) * sizeof(t), RC_ALIGNOF(t), &(p)->scratch, RC_OFFSETOF((p)->scratch.objs, __ ## t)))
119
+ #define RC_ALLOC_ARRAY_SCRATCH(t, n, p) ((t*)rc_alloc_scratch((p)->buffer, &(p)->offset, (n) * sizeof(t), RC_ALIGNOF(t), &(p)->scratch, RC_OFFSETOF((p)->scratch.objs, __ ## t)))
120
+
121
+ #define RC_ALLOC_WITH_TRAILING(container_type, trailing_type, trailing_field, trailing_count, parse) ((container_type*)rc_alloc(\
122
+ (parse)->buffer, &(parse)->offset, \
123
+ RC_OFFSETOF((*(container_type*)NULL),trailing_field) + trailing_count * sizeof(trailing_type), \
124
+ RC_ALIGNOF(container_type), &(parse)->scratch, 0))
125
+ #define RC_GET_TRAILING(container_pointer, container_type, trailing_type, trailing_field) (trailing_type*)(&((container_type*)(container_pointer))->trailing_field)
126
+
127
+ /* force alignment to 4 bytes on 32-bit systems, or 8 bytes on 64-bit systems */
128
+ #define RC_ALIGN(n) (((n) + (sizeof(void*)-1)) & ~(sizeof(void*)-1))
129
+
130
+ typedef struct {
131
+ rc_buffer_t buffer;
132
+ rc_scratch_string_t* strings;
133
+
134
+ struct objs {
135
+ rc_condition_t* __rc_condition_t;
136
+ rc_condset_t* __rc_condset_t;
137
+ rc_modified_memref_t* __rc_modified_memref_t;
138
+ rc_lboard_t* __rc_lboard_t;
139
+ rc_lboard_with_memrefs_t* __rc_lboard_with_memrefs_t;
140
+ rc_memref_t* __rc_memref_t;
141
+ rc_memref_list_t* __rc_memref_list_t;
142
+ rc_memrefs_t* __rc_memrefs_t;
143
+ rc_modified_memref_list_t* __rc_modified_memref_list_t;
144
+ rc_operand_t* __rc_operand_t;
145
+ rc_richpresence_t* __rc_richpresence_t;
146
+ rc_richpresence_display_t* __rc_richpresence_display_t;
147
+ rc_richpresence_display_part_t* __rc_richpresence_display_part_t;
148
+ rc_richpresence_lookup_t* __rc_richpresence_lookup_t;
149
+ rc_richpresence_lookup_item_t* __rc_richpresence_lookup_item_t;
150
+ rc_richpresence_with_memrefs_t* __rc_richpresence_with_memrefs_t;
151
+ rc_scratch_string_t __rc_scratch_string_t;
152
+ rc_trigger_t* __rc_trigger_t;
153
+ rc_trigger_with_memrefs_t* __rc_trigger_with_memrefs_t;
154
+ rc_value_t* __rc_value_t;
155
+ rc_value_with_memrefs_t* __rc_value_with_memrefs_t;
156
+
157
+ /* these fields aren't actually used by the code, but they force the
158
+ * virtual enum wrapper types to exist so natvis can use them */
159
+ union {
160
+ __rc_bool_enum_t boolean;
161
+ __rc_memsize_enum_t memsize;
162
+ __rc_memsize_enum_func_t memsize_func;
163
+ __rc_operand_enum_t operand;
164
+ __rc_value_type_enum_t value_type;
165
+ __rc_memref_type_enum_t memref_type;
166
+ __rc_condition_enum_t condition;
167
+ __rc_condition_enum_str_t condition_str;
168
+ __rc_condset_list_t condset_list;
169
+ __rc_operator_enum_t oper;
170
+ __rc_operator_enum_str_t oper_str;
171
+ __rc_operand_memref_t operand_memref;
172
+ __rc_value_list_t value_list;
173
+ __rc_trigger_state_enum_t trigger_state;
174
+ __rc_lboard_state_enum_t lboard_state;
175
+ __rc_richpresence_display_list_t richpresence_display_list;
176
+ __rc_richpresence_display_part_list_t richpresence_display_part_list;
177
+ __rc_richpresence_lookup_list_t richpresence_lookup_list;
178
+ __rc_format_enum_t format;
179
+ } natvis_extension;
180
+ } objs;
181
+ }
182
+ rc_scratch_t;
183
+
184
+ enum {
185
+ RC_VALUE_TYPE_NONE,
186
+ RC_VALUE_TYPE_UNSIGNED,
187
+ RC_VALUE_TYPE_SIGNED,
188
+ RC_VALUE_TYPE_FLOAT
189
+ };
190
+
191
+ typedef struct {
192
+ union {
193
+ uint32_t u32;
194
+ int32_t i32;
195
+ float f32;
196
+ } value;
197
+
198
+ char type;
199
+ }
200
+ rc_typed_value_t;
201
+
202
+ enum {
203
+ RC_MEMREF_TYPE_MEMREF, /* rc_memref_t */
204
+ RC_MEMREF_TYPE_MODIFIED_MEMREF, /* rc_modified_memref_t */
205
+ RC_MEMREF_TYPE_VALUE /* rc_value_t */
206
+ };
207
+
208
+ #define RC_MEASURED_UNKNOWN 0xFFFFFFFF
209
+ #define RC_OPERAND_NONE 0xFF
210
+
211
+ typedef struct {
212
+ /* memory accessors */
213
+ rc_peek_t peek;
214
+ void* peek_userdata;
215
+
216
+ /* processing state */
217
+ rc_typed_value_t measured_value; /* captured Measured value */
218
+ int32_t add_hits; /* AddHits/SubHits accumulator */
219
+ uint8_t is_true; /* true if all conditions are true */
220
+ uint8_t is_primed; /* true if all non-Trigger conditions are true */
221
+ uint8_t is_paused; /* true if one or more PauseIf conditions is true */
222
+ uint8_t can_measure; /* false if the measured value should be ignored */
223
+ uint8_t measured_from_hits; /* true if the measured_value came from a condition's hit count */
224
+ uint8_t and_next; /* true if the previous condition was AndNext true */
225
+ uint8_t or_next; /* true if the previous condition was OrNext true */
226
+ uint8_t reset_next; /* true if the previous condition was ResetNextIf true */
227
+ uint8_t stop_processing; /* true to abort the processing loop */
228
+
229
+ /* result state */
230
+ uint8_t has_hits; /* true if one of more hit counts is non-zero */
231
+ uint8_t was_reset; /* true if one or more ResetIf conditions is true */
232
+ uint8_t was_cond_reset; /* true if one or more ResetNextIf conditions is true */
233
+
234
+ /* control settings */
235
+ uint8_t can_short_curcuit; /* allows logic processing to stop as soon as a false condition is encountered */
236
+ }
237
+ rc_eval_state_t;
238
+
239
+ typedef struct {
240
+ int32_t offset;
241
+
242
+ void* buffer;
243
+ rc_scratch_t scratch;
244
+
245
+ rc_memrefs_t* memrefs;
246
+ rc_memrefs_t* existing_memrefs;
247
+ rc_value_t** variables;
248
+
249
+ uint32_t measured_target;
250
+ int lines_read;
251
+
252
+ rc_operand_t addsource_parent;
253
+ rc_operand_t indirect_parent;
254
+ rc_operand_t remember;
255
+ uint8_t addsource_oper;
256
+
257
+ uint8_t is_value;
258
+ uint8_t has_required_hits;
259
+ uint8_t measured_as_percent;
260
+ uint8_t ignore_non_parse_errors;
261
+ }
262
+ rc_parse_state_t;
263
+
264
+ typedef struct rc_preparse_state_t {
265
+ rc_parse_state_t parse;
266
+ rc_memrefs_t memrefs;
267
+ } rc_preparse_state_t;
268
+
269
+ void rc_init_parse_state(rc_parse_state_t* parse, void* buffer);
270
+ void rc_init_parse_state_memrefs(rc_parse_state_t* parse, rc_memrefs_t* memrefs);
271
+ void rc_reset_parse_state(rc_parse_state_t* parse, void* buffer);
272
+ void rc_destroy_parse_state(rc_parse_state_t* parse);
273
+ void rc_init_preparse_state(rc_preparse_state_t* preparse);
274
+ void rc_preparse_alloc_memrefs(rc_memrefs_t* memrefs, rc_preparse_state_t* preparse);
275
+ void rc_preparse_reserve_memrefs(rc_preparse_state_t* preparse, rc_memrefs_t* memrefs);
276
+ void rc_preparse_copy_memrefs(rc_parse_state_t* parse, rc_memrefs_t* memrefs);
277
+ void rc_destroy_preparse_state(rc_preparse_state_t *preparse);
278
+
279
+ void* rc_alloc(void* pointer, int32_t* offset, uint32_t size, uint32_t alignment, rc_scratch_t* scratch, uint32_t scratch_object_pointer_offset);
280
+ void* rc_alloc_scratch(void* pointer, int32_t* offset, uint32_t size, uint32_t alignment, rc_scratch_t* scratch, uint32_t scratch_object_pointer_offset);
281
+ char* rc_alloc_str(rc_parse_state_t* parse, const char* text, size_t length);
282
+
283
+ rc_memref_t* rc_alloc_memref(rc_parse_state_t* parse, uint32_t address, uint8_t size);
284
+ rc_modified_memref_t* rc_alloc_modified_memref(rc_parse_state_t* parse, uint8_t size, const rc_operand_t* parent,
285
+ uint8_t modifier_type, const rc_operand_t* modifier);
286
+ int rc_parse_memref(const char** memaddr, uint8_t* size, uint32_t* address);
287
+ void rc_update_memref_values(rc_memrefs_t* memrefs, rc_peek_t peek, void* ud);
288
+ void rc_update_memref_value(rc_memref_value_t* memref, uint32_t value);
289
+ void rc_get_memref_value(rc_typed_value_t* value, rc_memref_t* memref, int operand_type);
290
+ uint32_t rc_get_modified_memref_value(const rc_modified_memref_t* memref, rc_peek_t peek, void* ud);
291
+ uint8_t rc_memref_shared_size(uint8_t size);
292
+ uint32_t rc_memref_mask(uint8_t size);
293
+ void rc_transform_memref_value(rc_typed_value_t* value, uint8_t size);
294
+ uint32_t rc_peek_value(uint32_t address, uint8_t size, rc_peek_t peek, void* ud);
295
+
296
+ void rc_memrefs_init(rc_memrefs_t* memrefs);
297
+ void rc_memrefs_destroy(rc_memrefs_t* memrefs);
298
+ uint32_t rc_memrefs_count_memrefs(const rc_memrefs_t* memrefs);
299
+ uint32_t rc_memrefs_count_modified_memrefs(const rc_memrefs_t* memrefs);
300
+
301
+ void rc_parse_trigger_internal(rc_trigger_t* self, const char** memaddr, rc_parse_state_t* parse);
302
+ int rc_trigger_state_active(int state);
303
+ rc_memrefs_t* rc_trigger_get_memrefs(rc_trigger_t* self);
304
+
305
+ typedef struct rc_condset_with_trailing_conditions_t {
306
+ rc_condset_t condset;
307
+ rc_condition_t conditions[2];
308
+ } rc_condset_with_trailing_conditions_t;
309
+ RC_ALLOW_ALIGN(rc_condset_with_trailing_conditions_t)
310
+
311
+ rc_condset_t* rc_parse_condset(const char** memaddr, rc_parse_state_t* parse);
312
+ int rc_test_condset(rc_condset_t* self, rc_eval_state_t* eval_state);
313
+ void rc_reset_condset(rc_condset_t* self);
314
+ rc_condition_t* rc_condset_get_conditions(rc_condset_t* self);
315
+ void rc_test_condset_internal(rc_condition_t* condition, uint32_t num_conditions, rc_eval_state_t* eval_state, int can_short_circuit);
316
+
317
+ enum {
318
+ RC_PROCESSING_COMPARE_DEFAULT = 0,
319
+ RC_PROCESSING_COMPARE_MEMREF_TO_CONST,
320
+ RC_PROCESSING_COMPARE_MEMREF_TO_DELTA,
321
+ RC_PROCESSING_COMPARE_MEMREF_TO_MEMREF,
322
+ RC_PROCESSING_COMPARE_DELTA_TO_MEMREF,
323
+ RC_PROCESSING_COMPARE_DELTA_TO_CONST,
324
+ RC_PROCESSING_COMPARE_MEMREF_TO_CONST_TRANSFORMED,
325
+ RC_PROCESSING_COMPARE_MEMREF_TO_DELTA_TRANSFORMED,
326
+ RC_PROCESSING_COMPARE_MEMREF_TO_MEMREF_TRANSFORMED,
327
+ RC_PROCESSING_COMPARE_DELTA_TO_MEMREF_TRANSFORMED,
328
+ RC_PROCESSING_COMPARE_DELTA_TO_CONST_TRANSFORMED,
329
+ RC_PROCESSING_COMPARE_ALWAYS_TRUE,
330
+ RC_PROCESSING_COMPARE_ALWAYS_FALSE
331
+ };
332
+
333
+ rc_condition_t* rc_parse_condition(const char** memaddr, rc_parse_state_t* parse);
334
+ void rc_parse_condition_internal(rc_condition_t* self, const char** memaddr, rc_parse_state_t* parse);
335
+ void rc_condition_update_parse_state(rc_condition_t* condition, rc_parse_state_t* parse);
336
+ int rc_test_condition(rc_condition_t* self, rc_eval_state_t* eval_state);
337
+ void rc_evaluate_condition_value(rc_typed_value_t* value, rc_condition_t* self, rc_eval_state_t* eval_state);
338
+ int rc_condition_is_combining(const rc_condition_t* self);
339
+ void rc_condition_convert_to_operand(const rc_condition_t* condition, rc_operand_t* operand, rc_parse_state_t* parse);
340
+ const rc_operand_t* rc_condition_get_real_operand1(const rc_condition_t* self);
341
+
342
+ int rc_parse_operand(rc_operand_t* self, const char** memaddr, rc_parse_state_t* parse);
343
+ void rc_evaluate_operand(rc_typed_value_t* value, const rc_operand_t* self, rc_eval_state_t* eval_state);
344
+ int rc_operator_is_modifying(int oper);
345
+ int rc_memsize_is_float(uint8_t size);
346
+ int rc_operand_is_float_memref(const rc_operand_t* self);
347
+ int rc_operand_is_float(const rc_operand_t* self);
348
+ int rc_operand_is_recall(const rc_operand_t* self);
349
+ int rc_operand_type_is_memref(uint8_t type);
350
+ int rc_operand_type_is_transform(uint8_t type);
351
+ int rc_operands_are_equal(const rc_operand_t* left, const rc_operand_t* right);
352
+ void rc_operand_addsource(rc_operand_t* self, rc_parse_state_t* parse, uint8_t new_size);
353
+ void rc_operand_set_const(rc_operand_t* self, uint32_t value);
354
+ void rc_operand_set_float_const(rc_operand_t* self, double value);
355
+
356
+ int rc_is_valid_variable_character(char ch, int is_first);
357
+ void rc_parse_value_internal(rc_value_t* self, const char** memaddr, rc_parse_state_t* parse);
358
+ int rc_evaluate_value_typed(rc_value_t* self, rc_typed_value_t* value, rc_peek_t peek, void* ud);
359
+ void rc_reset_value(rc_value_t* self);
360
+ int rc_value_from_hits(rc_value_t* self);
361
+ rc_value_t* rc_alloc_variable(const char* memaddr, size_t memaddr_len, rc_parse_state_t* parse);
362
+ uint32_t rc_count_values(const rc_value_t* values);
363
+ void rc_update_values(rc_value_t* values, rc_peek_t peek, void* ud);
364
+ void rc_reset_values(rc_value_t* values);
365
+
366
+ void rc_typed_value_convert(rc_typed_value_t* value, char new_type);
367
+ void rc_typed_value_add(rc_typed_value_t* value, const rc_typed_value_t* amount);
368
+ void rc_typed_value_multiply(rc_typed_value_t* value, const rc_typed_value_t* amount);
369
+ void rc_typed_value_divide(rc_typed_value_t* value, const rc_typed_value_t* amount);
370
+ void rc_typed_value_modulus(rc_typed_value_t* value, const rc_typed_value_t* amount);
371
+ void rc_typed_value_negate(rc_typed_value_t* value);
372
+ int rc_typed_value_compare(const rc_typed_value_t* value1, const rc_typed_value_t* value2, char oper);
373
+ void rc_typed_value_combine(rc_typed_value_t* value, rc_typed_value_t* amount, uint8_t oper);
374
+ void rc_typed_value_from_memref_value(rc_typed_value_t* value, const rc_memref_value_t* memref);
375
+
376
+ int rc_format_typed_value(char* buffer, size_t size, const rc_typed_value_t* value, int format);
377
+
378
+ void rc_parse_lboard_internal(rc_lboard_t* self, const char* memaddr, rc_parse_state_t* parse);
379
+ int rc_lboard_state_active(int state);
380
+
381
+ void rc_parse_richpresence_internal(rc_richpresence_t* self, const char* script, rc_parse_state_t* parse);
382
+ rc_memrefs_t* rc_richpresence_get_memrefs(rc_richpresence_t* self);
383
+ void rc_reset_richpresence_triggers(rc_richpresence_t* self);
384
+ void rc_update_richpresence_internal(rc_richpresence_t* richpresence, rc_peek_t peek, void* peek_ud);
385
+
386
+ int rc_validate_memrefs_for_console(const rc_memrefs_t* memrefs, char result[], const size_t result_size, uint32_t console_id);
387
+
388
+ RC_END_C_DECLS
389
+
390
+ #endif /* RC_INTERNAL_H */