diff --git a/Assets/dll/librcheevos.dll b/Assets/dll/librcheevos.dll index 929e302110..51972197dd 100644 Binary files a/Assets/dll/librcheevos.dll and b/Assets/dll/librcheevos.dll differ diff --git a/Assets/dll/librcheevos.so b/Assets/dll/librcheevos.so index 22acf83d39..9e27e1f4e9 100755 Binary files a/Assets/dll/librcheevos.so and b/Assets/dll/librcheevos.so differ diff --git a/ExternalProjects/librcheevos/CMakeLists.txt b/ExternalProjects/librcheevos/CMakeLists.txt index ff09059eee..97b42e315b 100644 --- a/ExternalProjects/librcheevos/CMakeLists.txt +++ b/ExternalProjects/librcheevos/CMakeLists.txt @@ -6,14 +6,11 @@ endif() project(rcheevos C) -set(CMAKE_C_STANDARD 90) +set(CMAKE_C_STANDARD 99) set(CMAKE_C_STANDARD_REQUIRED ON) -set(CMAKE_C_EXTENSIONS OFF) +set(CMAKE_C_EXTENSIONS ON) if(MSVC) - # silence dumb warnings over CRT functions be "unsafe" - add_compile_definitions(_CRT_SECURE_NO_WARNINGS) - # MSVC targets don't export all symbols unless this is on set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) @@ -25,14 +22,13 @@ if(MSVC) # this differs between clang-cl and cl if(CMAKE_C_COMPILER_ID MATCHES "Clang") add_compile_options( - -Wno-missing-field-initializers -Wno-unused-parameter - -Wno-null-pointer-subtraction ) else() add_compile_options( /wd4100 # "unreferenced formal parameter" - /wd4701 # "potentially uninitialized local variable used" (detection here is just faulty) + /wd4244 # "conversion from 'type1' to 'type2', possible loss of data" + /wd4245 # "conversion from 'type1' to 'type2', signed/unsigned mismatch" ) endif() @@ -53,11 +49,8 @@ else() # ignore some warnings add_compile_options( - -Wno-missing-field-initializers -Wno-unused-parameter - -Wno-null-pointer-subtraction -Wno-implicit-fallthrough - -Wno-array-bounds # interestingly this warning isn't triggered with lto active, it's likely just a false positive when there isn't lto ) # strip in release, optimize for gdb usage in debug @@ -73,42 +66,43 @@ else() set(RC_TARGET rcheevos) endif() -set(RC_RAPI_DIR ${CMAKE_SOURCE_DIR}/rcheevos/src/rapi) -set(RC_RCHEEVOS_DIR ${CMAKE_SOURCE_DIR}/rcheevos/src/rcheevos) -set(RC_RHASH_DIR ${CMAKE_SOURCE_DIR}/rcheevos/src/rhash) +set(RC_SRC_DIR ${CMAKE_SOURCE_DIR}/rcheevos/src) set(RC_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/rcheevos/include) add_library( ${RC_TARGET} SHARED - ${RC_RAPI_DIR}/rc_api_common.c - ${RC_RAPI_DIR}/rc_api_common.h - ${RC_RAPI_DIR}/rc_api_editor.c - ${RC_RAPI_DIR}/rc_api_info.c - ${RC_RAPI_DIR}/rc_api_runtime.c - ${RC_RAPI_DIR}/rc_api_user.c - ${RC_RCHEEVOS_DIR}/alloc.c - ${RC_RCHEEVOS_DIR}/compat.c - ${RC_RCHEEVOS_DIR}/condition.c - ${RC_RCHEEVOS_DIR}/condset.c - ${RC_RCHEEVOS_DIR}/consoleinfo.c - ${RC_RCHEEVOS_DIR}/format.c - ${RC_RCHEEVOS_DIR}/lboard.c - ${RC_RCHEEVOS_DIR}/memref.c - ${RC_RCHEEVOS_DIR}/operand.c - ${RC_RCHEEVOS_DIR}/rc_compat.h - ${RC_RCHEEVOS_DIR}/rc_internal.h - ${RC_RCHEEVOS_DIR}/rc_validate.c - ${RC_RCHEEVOS_DIR}/rc_validate.h - ${RC_RCHEEVOS_DIR}/richpresence.c - ${RC_RCHEEVOS_DIR}/runtime.c - ${RC_RCHEEVOS_DIR}/runtime_progress.c - ${RC_RCHEEVOS_DIR}/trigger.c - ${RC_RCHEEVOS_DIR}/value.c - ${RC_RHASH_DIR}/cdreader.c - ${RC_RHASH_DIR}/hash.c - ${RC_RHASH_DIR}/md5.c - ${RC_RHASH_DIR}/md5.h + ${RC_SRC_DIR}/rc_compat.c + ${RC_SRC_DIR}/rc_compat.h + ${RC_SRC_DIR}/rc_util.c + ${RC_SRC_DIR}/rc_util.h + ${RC_SRC_DIR}/rc_version.h + ${RC_SRC_DIR}/rapi/rc_api_common.c + ${RC_SRC_DIR}/rapi/rc_api_common.h + ${RC_SRC_DIR}/rapi/rc_api_editor.c + ${RC_SRC_DIR}/rapi/rc_api_info.c + ${RC_SRC_DIR}/rapi/rc_api_runtime.c + ${RC_SRC_DIR}/rapi/rc_api_user.c + ${RC_SRC_DIR}/rcheevos/alloc.c + ${RC_SRC_DIR}/rcheevos/condition.c + ${RC_SRC_DIR}/rcheevos/condset.c + ${RC_SRC_DIR}/rcheevos/consoleinfo.c + ${RC_SRC_DIR}/rcheevos/format.c + ${RC_SRC_DIR}/rcheevos/lboard.c + ${RC_SRC_DIR}/rcheevos/memref.c + ${RC_SRC_DIR}/rcheevos/operand.c + ${RC_SRC_DIR}/rcheevos/rc_internal.h + ${RC_SRC_DIR}/rcheevos/rc_validate.c + ${RC_SRC_DIR}/rcheevos/rc_validate.h + ${RC_SRC_DIR}/rcheevos/richpresence.c + ${RC_SRC_DIR}/rcheevos/runtime.c + ${RC_SRC_DIR}/rcheevos/runtime_progress.c + ${RC_SRC_DIR}/rcheevos/trigger.c + ${RC_SRC_DIR}/rcheevos/value.c + ${RC_SRC_DIR}/rhash/cdreader.c + ${RC_SRC_DIR}/rhash/hash.c + ${RC_SRC_DIR}/rhash/md5.c + ${RC_SRC_DIR}/rhash/md5.h ${RC_INCLUDE_DIR}/rc_api_editor.h ${RC_INCLUDE_DIR}/rc_api_info.h ${RC_INCLUDE_DIR}/rc_api_request.h @@ -119,11 +113,10 @@ add_library( ${RC_INCLUDE_DIR}/rc_hash.h ${RC_INCLUDE_DIR}/rc_runtime.h ${RC_INCLUDE_DIR}/rc_runtime_types.h - ${RC_INCLUDE_DIR}/rc_url.h ${RC_INCLUDE_DIR}/rcheevos.h ) -target_compile_definitions(${RC_TARGET} PRIVATE -DRC_DISABLE_LUA) +target_compile_definitions(${RC_TARGET} PRIVATE RC_DISABLE_LUA RC_NO_THREADS) target_include_directories(${RC_TARGET} PRIVATE ${RC_INCLUDE_DIR}) add_custom_command( diff --git a/ExternalProjects/librcheevos/build_debug.sh b/ExternalProjects/librcheevos/build_debug.sh index 4441cff9e4..bce7d74972 100644 --- a/ExternalProjects/librcheevos/build_debug.sh +++ b/ExternalProjects/librcheevos/build_debug.sh @@ -1,6 +1,9 @@ #!/bin/sh +set -e +if [ -z "$CC" ]; then export CC="clang"; fi + rm -rf build mkdir build cd build -cmake .. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_C_COMPILER=clang -G Ninja +cmake .. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_C_COMPILER=$CC -G Ninja ninja diff --git a/ExternalProjects/librcheevos/build_release.bat b/ExternalProjects/librcheevos/build_release.bat index bb115070c6..630473cd34 100644 --- a/ExternalProjects/librcheevos/build_release.bat +++ b/ExternalProjects/librcheevos/build_release.bat @@ -1,6 +1,6 @@ rmdir /s /q build mkdir build cd build -cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_INTERPROCEDURAL_OPTIMIZATION=TRUE -DCMAKE_C_COMPILER=clang-cl -G Ninja +cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_INTERPROCEDURAL_OPTIMIZATION=ON -DCMAKE_C_COMPILER=clang-cl -G Ninja ninja cd .. diff --git a/ExternalProjects/librcheevos/build_release.sh b/ExternalProjects/librcheevos/build_release.sh index ff3b380109..81d43cab39 100644 --- a/ExternalProjects/librcheevos/build_release.sh +++ b/ExternalProjects/librcheevos/build_release.sh @@ -1,6 +1,9 @@ #!/bin/sh +set -e +if [ -z "$CC" ]; then export CC="clang"; fi + rm -rf build mkdir build cd build -cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_INTERPROCEDURAL_OPTIMIZATION=TRUE -DCMAKE_C_COMPILER=clang -G Ninja +cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_INTERPROCEDURAL_OPTIMIZATION=ON -DCMAKE_C_COMPILER=$CC -G Ninja ninja diff --git a/ExternalProjects/librcheevos/rcheevos b/ExternalProjects/librcheevos/rcheevos index 46e1feaafb..6fb3ebca22 160000 --- a/ExternalProjects/librcheevos/rcheevos +++ b/ExternalProjects/librcheevos/rcheevos @@ -1 +1 @@ -Subproject commit 46e1feaafb2e777ced9fbef14a22d54fd0191287 +Subproject commit 6fb3ebca22fe4f3a97e7a391e5e9c4623aa2286a diff --git a/src/BizHawk.Client.EmuHawk/RetroAchievements/LibRCheevos.cs b/src/BizHawk.Client.EmuHawk/RetroAchievements/LibRCheevos.cs index 87d135ff18..829547e500 100644 --- a/src/BizHawk.Client.EmuHawk/RetroAchievements/LibRCheevos.cs +++ b/src/BizHawk.Client.EmuHawk/RetroAchievements/LibRCheevos.cs @@ -47,7 +47,16 @@ namespace BizHawk.Client.EmuHawk RC_INVALID_MEASURED_TARGET = -23, RC_INVALID_COMPARISON = -24, RC_INVALID_STATE = -25, - RC_INVALID_JSON = -26 + RC_INVALID_JSON = -26, + RC_API_FAILURE = -27, + RC_LOGIN_REQUIRED = -28, + RC_NO_GAME_LOADED = -29, + RC_HARDCORE_DISABLED = -30, + RC_ABORTED = -31, + RC_NO_RESPONSE = -32, + RC_ACCESS_DENIED = -33, + RC_INVALID_CREDENTIALS = -34, + RC_EXPIRED_TOKEN = -35 } public enum rc_runtime_event_type_t : byte @@ -63,10 +72,11 @@ namespace BizHawk.Client.EmuHawk RC_RUNTIME_EVENT_LBOARD_TRIGGERED, RC_RUNTIME_EVENT_ACHIEVEMENT_DISABLED, RC_RUNTIME_EVENT_LBOARD_DISABLED, - RC_RUNTIME_EVENT_ACHIEVEMENT_UNPRIMED + RC_RUNTIME_EVENT_ACHIEVEMENT_UNPRIMED, + RC_RUNTIME_EVENT_ACHIEVEMENT_PROGRESS_UPDATED } - public enum rc_api_image_type_t : int + public enum rc_api_image_type_t : uint { RC_IMAGE_TYPE_GAME = 1, RC_IMAGE_TYPE_ACHIEVEMENT, @@ -74,7 +84,7 @@ namespace BizHawk.Client.EmuHawk RC_IMAGE_TYPE_USER, } - public enum rc_runtime_achievement_category_t : int + public enum rc_runtime_achievement_category_t : uint { RC_ACHIEVEMENT_CATEGORY_CORE = 3, RC_ACHIEVEMENT_CATEGORY_UNOFFICIAL = 5, @@ -83,17 +93,24 @@ namespace BizHawk.Client.EmuHawk [StructLayout(LayoutKind.Sequential)] public struct rc_runtime_event_t { - public int id; + public uint id; public int value; public rc_runtime_event_type_t type; } [StructLayout(LayoutKind.Sequential)] - public struct rc_api_buffer_t + public struct rc_buffer_chunk_t { public IntPtr write; public IntPtr end; + public IntPtr start; public IntPtr next; + } + + [StructLayout(LayoutKind.Sequential)] + public struct rc_buffer_t + { + public rc_buffer_chunk_t chunk; public unsafe fixed byte data[256]; } @@ -102,10 +119,12 @@ namespace BizHawk.Client.EmuHawk { public IntPtr url; public IntPtr post_data; - public rc_api_buffer_t buffer; + public IntPtr content_type; + public rc_buffer_t buffer; public string URL => Mershul.PtrToStringUtf8(url); public string PostData => Mershul.PtrToStringUtf8(post_data); + public string ContentType => Mershul.PtrToStringUtf8(content_type); } [StructLayout(LayoutKind.Sequential)] @@ -113,16 +132,18 @@ namespace BizHawk.Client.EmuHawk { public int succeeded; public IntPtr error_message; - public rc_api_buffer_t buffer; + public IntPtr error_code; + public rc_buffer_t buffer; - public string ErrorMessage => Mershul.PtrToStringUtf8(error_message); + public readonly string ErrorMessage => Mershul.PtrToStringUtf8(error_message); + public readonly string ErrorCode => Mershul.PtrToStringUtf8(error_code); } [StructLayout(LayoutKind.Sequential)] public struct rc_api_fetch_user_unlocks_response_t { - public IntPtr achievement_ids; - public int num_achievement_ids; + public unsafe uint* achievement_ids; + public uint num_achievement_ids; public rc_api_response_t response; } @@ -131,19 +152,32 @@ namespace BizHawk.Client.EmuHawk { public IntPtr username; public IntPtr api_token; - public int score; - public int num_unread_messages; + public uint score; + public uint score_softcore; + public uint num_unread_messages; public IntPtr display_name; public rc_api_response_t response; - public string Username => Mershul.PtrToStringUtf8(username); - public string ApiToken => Mershul.PtrToStringUtf8(api_token); - public string DisplayName => Mershul.PtrToStringUtf8(display_name); + public readonly string Username => Mershul.PtrToStringUtf8(username); + public readonly string ApiToken => Mershul.PtrToStringUtf8(api_token); + public readonly string DisplayName => Mershul.PtrToStringUtf8(display_name); + } + + [StructLayout(LayoutKind.Sequential)] + public struct rc_api_unlock_entry_t + { + public uint achievement_id; + public long when; // time_t? } [StructLayout(LayoutKind.Sequential)] public struct rc_api_start_session_response_t { + public unsafe rc_api_unlock_entry_t* hardcore_unlocks; + public unsafe rc_api_unlock_entry_t* unlocks; + public uint num_hardcore_unlocks; + public uint num_unlocks; + public long server_now; // time_t? public rc_api_response_t response; } @@ -154,11 +188,11 @@ namespace BizHawk.Client.EmuHawk public string username; [MarshalAs(UnmanagedType.LPUTF8Str)] public string api_token; - public int game_id; + public uint game_id; [MarshalAs(UnmanagedType.Bool)] public bool hardcore; - public rc_api_fetch_user_unlocks_request_t(string username, string api_token, int game_id, bool hardcore) + public rc_api_fetch_user_unlocks_request_t(string username, string api_token, uint game_id, bool hardcore) { this.username = username; this.api_token = api_token; @@ -192,9 +226,9 @@ namespace BizHawk.Client.EmuHawk public string username; [MarshalAs(UnmanagedType.LPUTF8Str)] public string api_token; - public int game_id; + public uint game_id; - public rc_api_start_session_request_t(string username, string api_token, int game_id) + public rc_api_start_session_request_t(string username, string api_token, uint game_id) { this.username = username; this.api_token = api_token; @@ -205,17 +239,18 @@ namespace BizHawk.Client.EmuHawk [StructLayout(LayoutKind.Sequential)] public struct rc_api_award_achievement_response_t { - public int awarded_achievement_id; - public int new_player_score; - public int achievements_remaining; + public uint awarded_achievement_id; + public uint new_player_score; + public uint new_player_score_softcore; + public uint achievements_remaining; public rc_api_response_t response; } [StructLayout(LayoutKind.Sequential)] public struct rc_api_achievement_definition_t { - public int id; - public int points; + public uint id; + public uint points; public rc_runtime_achievement_category_t category; public IntPtr title; public IntPtr description; @@ -225,46 +260,46 @@ namespace BizHawk.Client.EmuHawk public long created; // time_t? public long updated; // time_t? - public string Title => Mershul.PtrToStringUtf8(title); - public string Description => Mershul.PtrToStringUtf8(description); - public string Definition => Mershul.PtrToStringUtf8(definition); - public string Author => Mershul.PtrToStringUtf8(author); - public string BadgeName => Mershul.PtrToStringUtf8(badge_name); + public readonly string Title => Mershul.PtrToStringUtf8(title); + public readonly string Description => Mershul.PtrToStringUtf8(description); + public readonly string Definition => Mershul.PtrToStringUtf8(definition); + public readonly string Author => Mershul.PtrToStringUtf8(author); + public readonly string BadgeName => Mershul.PtrToStringUtf8(badge_name); } [StructLayout(LayoutKind.Sequential)] public struct rc_api_leaderboard_definition_t { - public int id; + public uint id; public int format; public IntPtr title; public IntPtr description; public IntPtr definition; - public int lower_is_better; - public int hidden; + public byte lower_is_better; + public byte hidden; - public string Title => Mershul.PtrToStringUtf8(title); - public string Description => Mershul.PtrToStringUtf8(description); - public string Definition => Mershul.PtrToStringUtf8(definition); + public readonly string Title => Mershul.PtrToStringUtf8(title); + public readonly string Description => Mershul.PtrToStringUtf8(description); + public readonly string Definition => Mershul.PtrToStringUtf8(definition); } [StructLayout(LayoutKind.Sequential)] public struct rc_api_fetch_game_data_response_t { - public int id; + public uint id; public RetroAchievements.ConsoleID console_id; public IntPtr title; public IntPtr image_name; public IntPtr rich_presence_script; - public IntPtr achievements; - public int num_achievements; - public IntPtr leaderboards; - public int num_leaderboards; + public unsafe rc_api_achievement_definition_t* achievements; + public uint num_achievements; + public unsafe rc_api_leaderboard_definition_t* leaderboards; + public uint num_leaderboards; public rc_api_response_t response; - public string Title => Mershul.PtrToStringUtf8(title); - public string ImageName => Mershul.PtrToStringUtf8(image_name); - public string RichPresenceScript => Mershul.PtrToStringUtf8(rich_presence_script); + public readonly string Title => Mershul.PtrToStringUtf8(title); + public readonly string ImageName => Mershul.PtrToStringUtf8(image_name); + public readonly string RichPresenceScript => Mershul.PtrToStringUtf8(rich_presence_script); } [StructLayout(LayoutKind.Sequential)] @@ -276,19 +311,29 @@ namespace BizHawk.Client.EmuHawk [StructLayout(LayoutKind.Sequential)] public struct rc_api_resolve_hash_response_t { - public int game_id; + public uint game_id; public rc_api_response_t response; } + [StructLayout(LayoutKind.Sequential)] + public struct rc_api_lboard_entry_t + { + public IntPtr username; + public uint rank; + public int score; + + public readonly string Username => Mershul.PtrToStringUtf8(username); + } + [StructLayout(LayoutKind.Sequential)] public struct rc_api_submit_lboard_entry_response_t { public int submitted_score; public int best_score; - public int new_rank; - public int num_entries; - public IntPtr top_entries; - public int num_top_entries; + public uint new_rank; + public uint num_entries; + public unsafe rc_api_lboard_entry_t* top_entries; + public uint num_top_entries; public rc_api_response_t response; } @@ -299,13 +344,13 @@ namespace BizHawk.Client.EmuHawk public string username; [MarshalAs(UnmanagedType.LPUTF8Str)] public string api_token; - public int achievement_id; + public uint achievement_id; [MarshalAs(UnmanagedType.Bool)] public bool hardcore; [MarshalAs(UnmanagedType.LPUTF8Str)] public string game_hash; - public rc_api_award_achievement_request_t(string username, string api_token, int achievement_id, bool hardcore, string game_hash) + public rc_api_award_achievement_request_t(string username, string api_token, uint achievement_id, bool hardcore, string game_hash) { this.username = username; this.api_token = api_token; @@ -322,9 +367,9 @@ namespace BizHawk.Client.EmuHawk public string username; [MarshalAs(UnmanagedType.LPUTF8Str)] public string api_token; - public int game_id; + public uint game_id; - public rc_api_fetch_game_data_request_t(string username, string api_token, int game_id) + public rc_api_fetch_game_data_request_t(string username, string api_token, uint game_id) { this.username = username; this.api_token = api_token; @@ -353,11 +398,11 @@ namespace BizHawk.Client.EmuHawk public string username; [MarshalAs(UnmanagedType.LPUTF8Str)] public string api_token; - public int game_id; + public uint game_id; [MarshalAs(UnmanagedType.LPUTF8Str)] public string rich_presence; - public rc_api_ping_request_t(string username, string api_token, int game_id, string rich_presence) + public rc_api_ping_request_t(string username, string api_token, uint game_id, string rich_presence) { this.username = username; this.api_token = api_token; @@ -391,12 +436,12 @@ namespace BizHawk.Client.EmuHawk public string username; [MarshalAs(UnmanagedType.LPUTF8Str)] public string api_token; - public int leaderboard_id; + public uint leaderboard_id; public int score; [MarshalAs(UnmanagedType.LPUTF8Str)] public string game_hash; - public rc_api_submit_lboard_entry_request_t(string username, string api_token, int leaderboard_id, int score, string game_hash) + public rc_api_submit_lboard_entry_request_t(string username, string api_token, uint leaderboard_id, int score, string game_hash) { this.username = username; this.api_token = api_token; @@ -406,46 +451,76 @@ namespace BizHawk.Client.EmuHawk } } + [StructLayout(LayoutKind.Sequential)] + public struct rc_api_achievement_awarded_entry_t + { + public IntPtr username; + public long awarded; // time_t? + + public string Username => Mershul.PtrToStringUtf8(username); + } + [StructLayout(LayoutKind.Sequential)] public struct rc_api_fetch_achievement_info_response_t { - public int id; - public int game_id; - public int num_awarded; - public int num_players; - public IntPtr recently_awarded; - public int num_recently_awarded; + public uint id; + public uint game_id; + public uint num_awarded; + public uint num_players; + public unsafe rc_api_achievement_awarded_entry_t* recently_awarded; + public uint num_recently_awarded; public rc_api_response_t response; } + [StructLayout(LayoutKind.Sequential)] + public struct rc_api_game_list_entry_t + { + public uint id; + public IntPtr name; + + public readonly string Name => Mershul.PtrToStringUtf8(name); + } + [StructLayout(LayoutKind.Sequential)] public struct rc_api_fetch_games_list_response_t { - public IntPtr entries; - public int num_entries; + public unsafe rc_api_game_list_entry_t* entries; + public uint num_entries; public rc_api_response_t response; } + [StructLayout(LayoutKind.Sequential)] + public struct rc_api_lboard_info_entry_t + { + public IntPtr username; + public uint rank; + public uint index; + public int score; + public long submitted; // time_t? + + public readonly string Username => Mershul.PtrToStringUtf8(username); + } + [StructLayout(LayoutKind.Sequential)] public struct rc_api_fetch_leaderboard_info_response_t { - public int id; + public uint id; public int format; - public int lower_is_better; + public uint lower_is_better; public IntPtr title; public IntPtr description; public IntPtr definition; - public int game_id; + public uint game_id; public IntPtr author; public long created; // time_t? public long updated; // time_t? - public IntPtr entries; - public int num_entries; + public unsafe rc_api_lboard_info_entry_t* entries; + public uint num_entries; public rc_api_response_t response; - public string Title => Mershul.PtrToStringUtf8(title); - public string Description => Mershul.PtrToStringUtf8(description); - public string Definition => Mershul.PtrToStringUtf8(definition); + public readonly string Title => Mershul.PtrToStringUtf8(title); + public readonly string Description => Mershul.PtrToStringUtf8(description); + public readonly string Definition => Mershul.PtrToStringUtf8(definition); } [StructLayout(LayoutKind.Sequential)] @@ -455,12 +530,12 @@ namespace BizHawk.Client.EmuHawk public string username; [MarshalAs(UnmanagedType.LPUTF8Str)] public string api_token; - public int achievement_id; - public int first_entry; - public int count; - public int friends_only; + public uint achievement_id; + public uint first_entry; + public uint count; + public uint friends_only; - public rc_api_fetch_achievement_info_request_t(string username, string api_token, int achievement_id, int first_entry, int count, int friends_only) + public rc_api_fetch_achievement_info_request_t(string username, string api_token, uint achievement_id, uint first_entry, uint count, uint friends_only) { this.username = username; this.api_token = api_token; @@ -474,9 +549,9 @@ namespace BizHawk.Client.EmuHawk [StructLayout(LayoutKind.Sequential)] public struct rc_api_fetch_games_list_request_t { - public int console_id; + public uint console_id; - public rc_api_fetch_games_list_request_t(int console_id) + public rc_api_fetch_games_list_request_t(uint console_id) { this.console_id = console_id; } @@ -485,13 +560,13 @@ namespace BizHawk.Client.EmuHawk [StructLayout(LayoutKind.Sequential)] public struct rc_api_fetch_leaderboard_info_request_t { - public int leaderboard_id; - public int count; - public int first_entry; + public uint leaderboard_id; + public uint count; + public uint first_entry; [MarshalAs(UnmanagedType.LPUTF8Str)] public string username; - public rc_api_fetch_leaderboard_info_request_t(int leaderboard_id, int count, int first_entry, string username) + public rc_api_fetch_leaderboard_info_request_t(uint leaderboard_id, uint count, uint first_entry, string username) { this.leaderboard_id = leaderboard_id; this.count = count; @@ -576,11 +651,11 @@ namespace BizHawk.Client.EmuHawk public delegate void rc_runtime_event_handler_t(IntPtr runtime_event); [UnmanagedFunctionPointer(cc)] - public delegate int rc_peek_t(int address, int num_bytes, IntPtr ud); + public delegate uint rc_runtime_peek_t(uint address, uint num_bytes, IntPtr ud); [UnmanagedFunctionPointer(cc)] [return: MarshalAs(UnmanagedType.Bool)] - public delegate bool rc_runtime_validate_address_t(int address); + public delegate bool rc_runtime_validate_address_t(uint address); [UnmanagedFunctionPointer(cc)] public delegate void rc_hash_message_callback(string message); @@ -607,7 +682,7 @@ namespace BizHawk.Client.EmuHawk public abstract void rc_runtime_reset(IntPtr runtime); [BizImport(cc)] - public abstract void rc_runtime_do_frame(IntPtr runtime, rc_runtime_event_handler_t rc_runtime_event_handler_t, rc_peek_t peek, IntPtr ud, IntPtr unused); + public abstract void rc_runtime_do_frame(IntPtr runtime, rc_runtime_event_handler_t rc_runtime_event_handler_t, rc_runtime_peek_t peek, IntPtr ud, IntPtr unused); [BizImport(cc)] public abstract rc_error_t rc_runtime_progress_size(IntPtr runtime, IntPtr unused); @@ -619,44 +694,44 @@ namespace BizHawk.Client.EmuHawk public abstract rc_error_t rc_runtime_deserialize_progress(IntPtr runtime, byte[] serialized, IntPtr unused); [BizImport(cc)] - public abstract void rc_runtime_invalidate_address(IntPtr runtime, int address); + public abstract void rc_runtime_invalidate_address(IntPtr runtime, uint address); [BizImport(cc)] public abstract void rc_runtime_validate_addresses(IntPtr runtime, rc_runtime_event_handler_t event_handler, rc_runtime_validate_address_t validate_handler); [BizImport(cc)] - public abstract rc_error_t rc_runtime_activate_achievement(IntPtr runtime, int id, string memaddr, IntPtr unused, int unused_idx); + public abstract rc_error_t rc_runtime_activate_achievement(IntPtr runtime, uint id, string memaddr, IntPtr unused, int unused_idx); [BizImport(cc)] - public abstract rc_error_t rc_runtime_activate_lboard(IntPtr runtime, int id, string memaddr, IntPtr unused, int unused_idx); + public abstract rc_error_t rc_runtime_activate_lboard(IntPtr runtime, uint id, string memaddr, IntPtr unused, int unused_idx); [BizImport(cc)] public abstract rc_error_t rc_runtime_activate_richpresence(IntPtr runtime, string script, IntPtr unused, int unused_idx); [BizImport(cc)] - public abstract IntPtr rc_runtime_get_achievement(IntPtr runtime, int id); + public abstract IntPtr rc_runtime_get_achievement(IntPtr runtime, uint id); [BizImport(cc)] - public abstract IntPtr rc_runtime_get_lboard(IntPtr runtime, int id); + public abstract IntPtr rc_runtime_get_lboard(IntPtr runtime, uint id); [BizImport(cc)] - public abstract int rc_runtime_get_richpresence(IntPtr runtime, byte[] buffer, int buffersize, rc_peek_t peek, IntPtr ud, IntPtr unused); + public abstract int rc_runtime_get_richpresence(IntPtr runtime, byte[] buffer, UIntPtr buffersize, rc_runtime_peek_t peek, IntPtr ud, IntPtr unused); [BizImport(cc)] [return: MarshalAs(UnmanagedType.Bool)] - public abstract bool rc_runtime_get_achievement_measured(IntPtr runtime, int id, out int measured_value, out int measured_target); + public abstract bool rc_runtime_get_achievement_measured(IntPtr runtime, uint id, out uint measured_value, out uint measured_target); [BizImport(cc)] - public abstract int rc_runtime_format_achievement_measured(IntPtr runtime, int id, byte[] buffer, long buffer_size); + public abstract int rc_runtime_format_achievement_measured(IntPtr runtime, uint id, byte[] buffer, UIntPtr buffer_size); [BizImport(cc)] public abstract int rc_runtime_format_lboard_value(byte[] buffer, int size, int value, int format); [BizImport(cc)] - public abstract void rc_runtime_deactivate_achievement(IntPtr runtime, int id); + public abstract void rc_runtime_deactivate_achievement(IntPtr runtime, uint id); [BizImport(cc)] - public abstract void rc_runtime_deactivate_lboard(IntPtr runtime, int id); + public abstract void rc_runtime_deactivate_lboard(IntPtr runtime, uint id); [BizImport(cc)] public abstract void rc_hash_init_error_message_callback(rc_hash_message_callback callback); @@ -672,14 +747,14 @@ namespace BizHawk.Client.EmuHawk [BizImport(cc)] [return: MarshalAs(UnmanagedType.Bool)] - public abstract bool rc_hash_generate_from_buffer(byte[] hash, RetroAchievements.ConsoleID console_id, byte[] buffer, long buffer_size); + public abstract bool rc_hash_generate_from_buffer(byte[] hash, RetroAchievements.ConsoleID console_id, byte[] buffer, UIntPtr buffer_size); [BizImport(cc)] [return: MarshalAs(UnmanagedType.Bool)] public abstract bool rc_hash_generate_from_file(byte[] hash, RetroAchievements.ConsoleID console_id, string path); [BizImport(cc)] - public abstract void rc_hash_initialize_iterator(IntPtr iterator, string path, byte[] buffer, long buffer_size); + public abstract void rc_hash_initialize_iterator(IntPtr iterator, string path, byte[] buffer, UIntPtr buffer_size); [BizImport(cc)] [return: MarshalAs(UnmanagedType.Bool)] diff --git a/src/BizHawk.Client.EmuHawk/RetroAchievements/RAIntegration.cs b/src/BizHawk.Client.EmuHawk/RetroAchievements/RAIntegration.cs index ddc905dbf3..25de91ee35 100644 --- a/src/BizHawk.Client.EmuHawk/RetroAchievements/RAIntegration.cs +++ b/src/BizHawk.Client.EmuHawk/RetroAchievements/RAIntegration.cs @@ -107,10 +107,10 @@ namespace BizHawk.Client.EmuHawk RA.WarnDisableHardcore(null); } - protected override int IdentifyHash(string hash) + protected override uint IdentifyHash(string hash) => RA.IdentifyHash(hash); - protected override int IdentifyRom(byte[] rom) + protected override uint IdentifyRom(byte[] rom) => RA.IdentifyRom(rom, rom.Length); public RAIntegration( @@ -213,7 +213,7 @@ namespace BizHawk.Client.EmuHawk for (var i = 0; i < _memFunctions.Count; i++) { _memFunctions[i].MemGuard = _memGuard; - RA.InstallMemoryBank(i, _memFunctions[i].ReadFunc, _memFunctions[i].WriteFunc, _memFunctions[i].BankSize); + RA.InstallMemoryBank(i, _memFunctions[i].ReadFunc, _memFunctions[i].WriteFunc, checked((int)_memFunctions[i].BankSize)); RA.InstallMemoryBankBlockReader(i, _memFunctions[i].ReadBlockFunc); } } @@ -224,9 +224,9 @@ namespace BizHawk.Client.EmuHawk { var ids = GetRAGameIds(_mainForm.CurrentlyOpenRomArgs.OpenAdvanced, consoleId); - AllGamesVerified = !ids.Contains(0); + AllGamesVerified = !ids.Contains(0u); - RA.ActivateGame(ids.Count > 0 ? ids[0] : 0); + RA.ActivateGame(ids.Count > 0 ? ids[0] : 0u); } else { diff --git a/src/BizHawk.Client.EmuHawk/RetroAchievements/RAInterface.cs b/src/BizHawk.Client.EmuHawk/RetroAchievements/RAInterface.cs index c5d7ff7c49..5d6e718636 100644 --- a/src/BizHawk.Client.EmuHawk/RetroAchievements/RAInterface.cs +++ b/src/BizHawk.Client.EmuHawk/RetroAchievements/RAInterface.cs @@ -137,13 +137,13 @@ namespace BizHawk.Client.EmuHawk public abstract void UpdateHWnd(IntPtr hwnd); [BizImport(cc, EntryPoint = "_RA_IdentifyRom")] - public abstract int IdentifyRom(byte[] rom, int romSize); + public abstract uint IdentifyRom(byte[] rom, int romSize); [BizImport(cc, EntryPoint = "_RA_IdentifyHash")] - public abstract int IdentifyHash(string hash); + public abstract uint IdentifyHash(string hash); [BizImport(cc, EntryPoint = "_RA_ActivateGame")] - public abstract void ActivateGame(int gameId); + public abstract void ActivateGame(uint gameId); [BizImport(cc, EntryPoint = "_RA_OnLoadNewRom")] [return: MarshalAs(UnmanagedType.Bool)] diff --git a/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevos.Achievements.cs b/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevos.Achievements.cs index 0539e2fdc7..a15e461480 100644 --- a/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevos.Achievements.cs +++ b/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevos.Achievements.cs @@ -29,7 +29,7 @@ namespace BizHawk.Client.EmuHawk InternalDoRequest(apiParamsResult, ref api_req); } - public CheevoUnlockRequest(string username, string api_token, int achievement_id, bool hardcore, string game_hash) + public CheevoUnlockRequest(string username, string api_token, uint achievement_id, bool hardcore, string game_hash) { _apiParams = new(username, api_token, achievement_id, hardcore, game_hash); } @@ -40,8 +40,8 @@ namespace BizHawk.Client.EmuHawk public class Cheevo { - public int ID { get; } - public int Points { get; } + public uint ID { get; } + public uint Points { get; } public LibRCheevos.rc_runtime_achievement_category_t Category { get; } public string Title { get; } public string Description { get; } @@ -129,9 +129,9 @@ namespace BizHawk.Client.EmuHawk private readonly byte[] _cheevoFormatBuffer = new byte[1024]; - private string GetCheevoProgress(int id) + private string GetCheevoProgress(uint id) { - var len = _lib.rc_runtime_format_achievement_measured(_runtime, id, _cheevoFormatBuffer, _cheevoFormatBuffer.Length); + var len = _lib.rc_runtime_format_achievement_measured(_runtime, id, _cheevoFormatBuffer, new((uint)_cheevoFormatBuffer.Length)); return Encoding.ASCII.GetString(_cheevoFormatBuffer, 0, len); } diff --git a/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevos.Debug.cs b/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevos.Debug.cs index fb3260419d..671b9ce5fe 100644 --- a/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevos.Debug.cs +++ b/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevos.Debug.cs @@ -247,12 +247,11 @@ namespace BizHawk.Client.EmuHawk // outputs results in the console public static void DebugHash() { - using var ofd = new OpenFileDialog - { - CheckFileExists = true, - CheckPathExists = true, - InitialDirectory = PathUtils.ExeDirectoryPath, - }; + using var ofd = new OpenFileDialog(); + + ofd.CheckFileExists = true; + ofd.CheckPathExists = true; + ofd.InitialDirectory = PathUtils.ExeDirectoryPath; string path = null; if (ofd.ShowDialog() diff --git a/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevos.GameInfo.cs b/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevos.GameInfo.cs index 07f3fb3b52..da5f8c1547 100644 --- a/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevos.GameInfo.cs +++ b/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevos.GameInfo.cs @@ -16,15 +16,15 @@ namespace BizHawk.Client.EmuHawk private ConsoleID _consoleId; private string _gameHash; - private readonly Dictionary _cachedGameIds = new(); // keep around IDs per hash to avoid unneeded API calls for a simple RebootCore + private readonly Dictionary _cachedGameIds = new(); // keep around IDs per hash to avoid unneeded API calls for a simple RebootCore private GameData _gameData; - private readonly Dictionary _cachedGameDatas = new(); // keep game data around to avoid unneeded API calls for a simple RebootCore + private readonly Dictionary _cachedGameDatas = new(); // keep game data around to avoid unneeded API calls for a simple RebootCore public sealed class UserUnlocksRequest : RCheevoHttpRequest { private LibRCheevos.rc_api_fetch_user_unlocks_request_t _apiParams; - private readonly IReadOnlyDictionary _cheevos; + private readonly IReadOnlyDictionary _cheevos; protected override void ResponseCallback(byte[] serv_resp) { @@ -33,10 +33,9 @@ namespace BizHawk.Client.EmuHawk { unsafe { - var unlocks = (int*)resp.achievement_ids; for (var i = 0; i < resp.num_achievement_ids; i++) { - if (_cheevos.TryGetValue(unlocks![i], out var cheevo)) + if (_cheevos.TryGetValue(resp.achievement_ids[i], out var cheevo)) { cheevo.SetUnlocked(_apiParams.hardcore, true); } @@ -57,7 +56,7 @@ namespace BizHawk.Client.EmuHawk InternalDoRequest(apiParamsResult, ref api_req); } - public UserUnlocksRequest(string username, string api_token, int game_id, bool hardcore, IReadOnlyDictionary cheevos) + public UserUnlocksRequest(string username, string api_token, uint game_id, bool hardcore, IReadOnlyDictionary cheevos) { _apiParams = new(username, api_token, game_id, hardcore); _cheevos = cheevos; @@ -95,7 +94,7 @@ namespace BizHawk.Client.EmuHawk InternalDoRequest(apiParamsResult, ref api_req); } - public GameDataRequest(string username, string api_token, int game_id, Func allowUnofficialCheevos) + public GameDataRequest(string username, string api_token, uint game_id, Func allowUnofficialCheevos) { _apiParams = new(username, api_token, game_id); _allowUnofficialCheevos = allowUnofficialCheevos; @@ -144,7 +143,7 @@ namespace BizHawk.Client.EmuHawk public class GameData { - public int GameID { get; } + public uint GameID { get; } public ConsoleID ConsoleID { get; } public string Title { get; } private string ImageName { get; } @@ -153,14 +152,14 @@ namespace BizHawk.Client.EmuHawk private ImageRequest _gameBadgeImageRequest; - private readonly IReadOnlyDictionary _cheevos; - private readonly IReadOnlyDictionary _lboards; + private readonly IReadOnlyDictionary _cheevos; + private readonly IReadOnlyDictionary _lboards; public IEnumerable CheevoEnumerable => _cheevos.Values; public IEnumerable LBoardEnumerable => _lboards.Values; - public Cheevo GetCheevoById(int i) => _cheevos[i]; - public LBoard GetLboardById(int i) => _lboards[i]; + public Cheevo GetCheevoById(uint i) => _cheevos[i]; + public LBoard GetLboardById(uint i) => _lboards[i]; public UserUnlocksRequest InitUnlocks(string username, string api_token, bool hardcore) { @@ -184,7 +183,7 @@ namespace BizHawk.Client.EmuHawk return requests; } - public int TotalCheevoPoints(bool hardcore) + public long TotalCheevoPoints(bool hardcore) => _cheevos?.Values.Sum(c => c.IsEnabled && !c.Invalid && c.IsUnlocked(hardcore) ? c.Points : 0) ?? 0; public unsafe GameData(in LibRCheevos.rc_api_fetch_game_data_response_t resp, Func allowUnofficialCheevos) @@ -195,20 +194,18 @@ namespace BizHawk.Client.EmuHawk ImageName = resp.ImageName; RichPresenseScript = resp.RichPresenceScript; - var cheevos = new Dictionary(); - var cptr = (LibRCheevos.rc_api_achievement_definition_t*)resp.achievements; + var cheevos = new Dictionary(); for (var i = 0; i < resp.num_achievements; i++) { - cheevos.Add(cptr![i].id, new(in cptr[i], allowUnofficialCheevos)); + cheevos.Add(resp.achievements[i].id, new(in resp.achievements[i], allowUnofficialCheevos)); } _cheevos = cheevos; - var lboards = new Dictionary(); - var lptr = (LibRCheevos.rc_api_leaderboard_definition_t*)resp.leaderboards; + var lboards = new Dictionary(); for (var i = 0; i < resp.num_leaderboards; i++) { - lboards.Add(lptr![i].id, new(in lptr[i])); + lboards.Add(resp.leaderboards[i].id, new(in resp.leaderboards[i])); } _lboards = lboards; @@ -222,8 +219,8 @@ namespace BizHawk.Client.EmuHawk ImageName = gameData.ImageName; RichPresenseScript = gameData.RichPresenseScript; - _cheevos = gameData.CheevoEnumerable.ToDictionary(cheevo => cheevo.ID, cheevo => new(in cheevo, allowUnofficialCheevos)); - _lboards = gameData.LBoardEnumerable.ToDictionary(lboard => lboard.ID, lboard => new(in lboard)); + _cheevos = gameData.CheevoEnumerable.ToDictionary(cheevo => cheevo.ID, cheevo => new(in cheevo, allowUnofficialCheevos)); + _lboards = gameData.LBoardEnumerable.ToDictionary(lboard => lboard.ID, lboard => new(in lboard)); } public GameData() @@ -235,7 +232,7 @@ namespace BizHawk.Client.EmuHawk private sealed class ResolveHashRequest : RCheevoHttpRequest { private LibRCheevos.rc_api_resolve_hash_request_t _apiParams; - public int GameID { get; private set; } + public uint GameID { get; private set; } // eh? not sure I want this retried, given the blocking behavior public override bool ShouldRetry => false; @@ -268,7 +265,7 @@ namespace BizHawk.Client.EmuHawk } } - private int SendHash(string hash) + private uint SendHash(string hash) { var resolveHashRequest = new ResolveHashRequest(hash); PushRequest(resolveHashRequest); @@ -276,16 +273,16 @@ namespace BizHawk.Client.EmuHawk return resolveHashRequest.GameID; } - protected override int IdentifyHash(string hash) + protected override uint IdentifyHash(string hash) { _gameHash ??= hash; return _cachedGameIds.GetValueOrPut(hash, SendHash); } - protected override int IdentifyRom(byte[] rom) + protected override uint IdentifyRom(byte[] rom) { var hash = new byte[33]; - if (_lib.rc_hash_generate_from_buffer(hash, _consoleId, rom, rom.Length)) + if (_lib.rc_hash_generate_from_buffer(hash, _consoleId, rom, new((uint)rom.Length))) { return IdentifyHash(Encoding.ASCII.GetString(hash, 0, 32)); } @@ -315,7 +312,7 @@ namespace BizHawk.Client.EmuHawk } } - private GameData GetGameData(int id) + private GameData GetGameData(uint id) { var gameDataRequest = new GameDataRequest(Username, ApiToken, id, () => AllowUnofficialCheevos); PushRequest(gameDataRequest); diff --git a/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevos.Leaderboards.cs b/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevos.Leaderboards.cs index 9cfcd24889..d78ec9f72f 100644 --- a/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevos.Leaderboards.cs +++ b/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevos.Leaderboards.cs @@ -29,7 +29,7 @@ namespace BizHawk.Client.EmuHawk InternalDoRequest(apiParamsResult, ref api_req); } - public LboardTriggerRequest(string username, string api_token, int id, int value, string hash) + public LboardTriggerRequest(string username, string api_token, uint id, int value, string hash) { _apiParams = new(username, api_token, id, value, hash); } @@ -40,7 +40,7 @@ namespace BizHawk.Client.EmuHawk public class LBoard { - public int ID { get; } + public uint ID { get; } public int Format { get; } public string Title { get; } public string Description { get; } diff --git a/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevos.Ping.cs b/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevos.Ping.cs index e0b373bfa9..64f12208d0 100644 --- a/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevos.Ping.cs +++ b/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevos.Ping.cs @@ -12,7 +12,7 @@ namespace BizHawk.Client.EmuHawk { private LibRCheevos.rc_api_start_session_request_t _apiParams; - public StartGameSessionRequest(string username, string apiToken, int gameId) + public StartGameSessionRequest(string username, string apiToken, uint gameId) { _apiParams = new(username, apiToken, gameId); } @@ -43,7 +43,7 @@ namespace BizHawk.Client.EmuHawk { private LibRCheevos.rc_api_ping_request_t _apiParams; - public PingRequest(string username, string apiToken, int gameId, string richPresence) + public PingRequest(string username, string apiToken, uint gameId, string richPresence) { _apiParams = new(username, apiToken, gameId, richPresence); } @@ -79,7 +79,7 @@ namespace BizHawk.Client.EmuHawk { if (RichPresenceActive) { - var len = _lib.rc_runtime_get_richpresence(_runtime, _richPresenceBuffer, _richPresenceBuffer.Length, _peekcb, IntPtr.Zero, IntPtr.Zero); + var len = _lib.rc_runtime_get_richpresence(_runtime, _richPresenceBuffer, new((uint)_richPresenceBuffer.Length), _peekcb, IntPtr.Zero, IntPtr.Zero); CurrentRichPresence = Encoding.UTF8.GetString(_richPresenceBuffer, 0, len); } else diff --git a/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevos.cs b/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevos.cs index fb4ae31bd9..0e90ef5fee 100644 --- a/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevos.cs +++ b/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevos.cs @@ -41,9 +41,9 @@ namespace BizHawk.Client.EmuHawk private IntPtr _runtime; private readonly LibRCheevos.rc_runtime_event_handler_t _eventcb; - private readonly LibRCheevos.rc_peek_t _peekcb; + private readonly LibRCheevos.rc_runtime_peek_t _peekcb; - private readonly Dictionary _readMap = new(); + private readonly Dictionary _readMap = new(); private ToolStripMenuItem _hardcoreModeMenuItem; private bool _hardcoreMode; @@ -369,12 +369,12 @@ namespace BizHawk.Client.EmuHawk { _memFunctions = CreateMemoryBanks(_consoleId, Domains, Emu.CanDebug() ? Emu.AsDebuggable() : null); - var addr = 0; + uint addr = 0; foreach (var memFunctions in _memFunctions) { if (memFunctions.ReadFunc is not null) { - for (var i = 0; i < memFunctions.BankSize; i++) + for (uint i = 0; i < memFunctions.BankSize; i++) { _readMap.Add(addr + i, (memFunctions.ReadFunc, addr)); } @@ -392,7 +392,7 @@ namespace BizHawk.Client.EmuHawk { var ids = GetRAGameIds(_mainForm.CurrentlyOpenRomArgs.OpenAdvanced, _consoleId); - AllGamesVerified = !ids.Contains(0); + AllGamesVerified = !ids.Contains(0u); var gameId = ids.Count > 0 ? ids[0] : 0; _gameData = new(); @@ -427,7 +427,9 @@ namespace BizHawk.Client.EmuHawk // validate addresses now that we have cheevos init // ReSharper disable once ConvertToLocalFunction +#pragma warning disable IDE0039 LibRCheevos.rc_runtime_validate_address_t peekcb = address => _readMap.ContainsKey(address); +#pragma warning restore IDE0039 _lib.rc_runtime_validate_addresses(_runtime, _eventcb, peekcb); _gameInfoForm.Restart(_gameData.Title, _gameData.TotalCheevoPoints(HardcoreMode), CurrentRichPresence ?? "N/A"); @@ -613,10 +615,10 @@ namespace BizHawk.Client.EmuHawk } } - private int PeekCallback(int address, int num_bytes, IntPtr ud) + private uint PeekCallback(uint address, uint num_bytes, IntPtr ud) { - byte Peek(int addr) - => _readMap.TryGetValue(addr, out var reader) ? reader.Func(addr - reader.Start) : (byte)0; + uint Peek(uint addr) + => _readMap.TryGetValue(addr, out var reader) ? reader.Func(addr - reader.Start) : 0u; return num_bytes switch { diff --git a/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevosAchievementForm.cs b/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevosAchievementForm.cs index db753ffbef..b6e18facb1 100644 --- a/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevosAchievementForm.cs +++ b/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevosAchievementForm.cs @@ -23,9 +23,9 @@ namespace BizHawk.Client.EmuHawk private Bitmap _unlockedBadge, _lockedBadge; private readonly RCheevos.Cheevo _cheevo; - private readonly Func _getCheevoProgress; + private readonly Func _getCheevoProgress; - public RCheevosAchievementForm(RCheevos.Cheevo cheevo, Func getCheevoProgress) + public RCheevosAchievementForm(RCheevos.Cheevo cheevo, Func getCheevoProgress) { InitializeComponent(); titleBox.Text = cheevo.Title; diff --git a/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevosAchievementListForm.cs b/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevosAchievementListForm.cs index 0d5d946753..f6a2c07b88 100644 --- a/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevosAchievementListForm.cs +++ b/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevosAchievementListForm.cs @@ -32,7 +32,7 @@ namespace BizHawk.Client.EmuHawk } } - public void Restart(IEnumerable cheevos, Func getCheevoProgress) + public void Restart(IEnumerable cheevos, Func getCheevoProgress) { flowLayoutPanel1.Controls.Clear(); DisposeCheevoForms(); @@ -52,14 +52,14 @@ namespace BizHawk.Client.EmuHawk { _updateCooldown = 5; - for (int i = 0; i < _cheevoForms.Length; i++) + foreach (var form in _cheevoForms) { - _cheevoForms[i].OnFrameAdvance(hardcore); + form.OnFrameAdvance(hardcore); } var reorderedForms = _cheevoForms.OrderByDescending(f => f.OrderByKey()).ToArray(); - for (int i = 0; i < _cheevoForms.Length; i++) + for (var i = 0; i < _cheevoForms.Length; i++) { if (_cheevoForms[i] != reorderedForms[i]) { diff --git a/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevosGameInfoForm.cs b/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevosGameInfoForm.cs index 7eb6e44cae..bd3e0ac283 100644 --- a/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevosGameInfoForm.cs +++ b/src/BizHawk.Client.EmuHawk/RetroAchievements/RCheevosGameInfoForm.cs @@ -19,7 +19,7 @@ namespace BizHawk.Client.EmuHawk Shown += (_, _) => IsShown = true; } - public void Restart(string gameTitle, int totalPoints, string richPresence) + public void Restart(string gameTitle, long totalPoints, string richPresence) { titleTextBox.Text = gameTitle; totalPointsBox.Text = totalPoints.ToString(); @@ -28,7 +28,7 @@ namespace BizHawk.Client.EmuHawk _iconLoaded = false; } - public void OnFrameAdvance(Bitmap gameIcon, int totalPoints, string lboardStr, string richPresence) + public void OnFrameAdvance(Bitmap gameIcon, long totalPoints, string lboardStr, string richPresence) { // probably bad idea to set this every frame, so if (!_iconLoaded && gameIcon is not null) diff --git a/src/BizHawk.Client.EmuHawk/RetroAchievements/RetroAchievements.ConsoleID.cs b/src/BizHawk.Client.EmuHawk/RetroAchievements/RetroAchievements.ConsoleID.cs index c7b8bf7276..6b12a5c094 100644 --- a/src/BizHawk.Client.EmuHawk/RetroAchievements/RetroAchievements.ConsoleID.cs +++ b/src/BizHawk.Client.EmuHawk/RetroAchievements/RetroAchievements.ConsoleID.cs @@ -10,7 +10,7 @@ namespace BizHawk.Client.EmuHawk { public abstract partial class RetroAchievements { - public enum ConsoleID : int + public enum ConsoleID : uint { UnknownConsoleID = 0, MegaDrive = 1, diff --git a/src/BizHawk.Client.EmuHawk/RetroAchievements/RetroAchievements.GameVerification.cs b/src/BizHawk.Client.EmuHawk/RetroAchievements/RetroAchievements.GameVerification.cs index 2a619a59dc..e6fd0eb2a2 100644 --- a/src/BizHawk.Client.EmuHawk/RetroAchievements/RetroAchievements.GameVerification.cs +++ b/src/BizHawk.Client.EmuHawk/RetroAchievements/RetroAchievements.GameVerification.cs @@ -13,10 +13,10 @@ namespace BizHawk.Client.EmuHawk public abstract partial class RetroAchievements { protected bool AllGamesVerified { get; set; } - protected abstract int IdentifyHash(string hash); - protected abstract int IdentifyRom(byte[] rom); + protected abstract uint IdentifyHash(string hash); + protected abstract uint IdentifyRom(byte[] rom); - private int HashDisc(string path, ConsoleID consoleID) + private uint HashDisc(string path, ConsoleID consoleID) { // this shouldn't throw in practice, this is only called when loading was successful! using var disc = DiscExtensions.CreateAnyType(path, e => throw new(e)); @@ -276,7 +276,7 @@ namespace BizHawk.Client.EmuHawk return IdentifyHash(hash); } - private int HashArcade(string path) + private uint HashArcade(string path) { // Arcade wants to just hash the filename (with no extension) var name = Encoding.UTF8.GetBytes(Path.GetFileNameWithoutExtension(path)); @@ -284,7 +284,7 @@ namespace BizHawk.Client.EmuHawk return IdentifyHash(hash); } - private int Hash3DS(string path) + private uint Hash3DS(string path) { // 3DS is too big to hash as a byte array... var hash = new byte[33]; @@ -292,9 +292,9 @@ namespace BizHawk.Client.EmuHawk ? IdentifyHash(Encoding.ASCII.GetString(hash, 0, 32)) : 0; } - protected IReadOnlyList GetRAGameIds(IOpenAdvanced ioa, ConsoleID consoleID) + protected IReadOnlyList GetRAGameIds(IOpenAdvanced ioa, ConsoleID consoleID) { - var ret = new List(); + var ret = new List(); switch (ioa.TypeName) { case OpenAdvancedTypes.OpenRom: diff --git a/src/BizHawk.Client.EmuHawk/RetroAchievements/RetroAchievements.Memory.cs b/src/BizHawk.Client.EmuHawk/RetroAchievements/RetroAchievements.Memory.cs index 6f7564641a..e291937f15 100644 --- a/src/BizHawk.Client.EmuHawk/RetroAchievements/RetroAchievements.Memory.cs +++ b/src/BizHawk.Client.EmuHawk/RetroAchievements/RetroAchievements.Memory.cs @@ -94,32 +94,32 @@ namespace BizHawk.Client.EmuHawk } [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - public delegate byte ReadMemoryFunc(int address); + public delegate byte ReadMemoryFunc(uint address); [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - public delegate void WriteMemoryFunc(int address, byte value); + public delegate void WriteMemoryFunc(uint address, byte value); [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - public delegate int ReadMemoryBlockFunc(int address, IntPtr buffer, int bytes); + public delegate uint ReadMemoryBlockFunc(uint address, IntPtr buffer, uint bytes); protected class MemFunctions { protected readonly MemoryDomain _domain; - private readonly int _domainAddrStart; // addr of _domain where bank begins - private readonly int _addressMangler; // of course, let's *not* correct internal core byteswapping! + private readonly uint _domainAddrStart; // addr of _domain where bank begins + private readonly uint _addressMangler; // of course, let's *not* correct internal core byteswapping! public ReadMemoryFunc ReadFunc { get; protected init; } public WriteMemoryFunc WriteFunc { get; protected init; } public ReadMemoryBlockFunc ReadBlockFunc { get; protected init; } - public readonly int BankSize; + public readonly uint BankSize; public RAMemGuard MemGuard { get; set; } - protected virtual int FixAddr(int addr) + protected virtual uint FixAddr(uint addr) => _domainAddrStart + addr; - protected virtual byte ReadMem(int addr) + protected virtual byte ReadMem(uint addr) { using (MemGuard.EnterExit()) { @@ -127,7 +127,7 @@ namespace BizHawk.Client.EmuHawk } } - protected virtual void WriteMem(int addr, byte val) + protected virtual void WriteMem(uint addr, byte val) { using (MemGuard.EnterExit()) { @@ -135,7 +135,7 @@ namespace BizHawk.Client.EmuHawk } } - protected virtual int ReadMemBlock(int addr, IntPtr buffer, int bytes) + protected virtual uint ReadMemBlock(uint addr, IntPtr buffer, uint bytes) { addr = FixAddr(addr); @@ -153,7 +153,7 @@ namespace BizHawk.Client.EmuHawk { var ret = new byte[length]; _domain.BulkPeekByte(((long)addr).RangeToExclusive(end), ret); - Marshal.Copy(ret, 0, buffer, length); + Marshal.Copy(ret, 0, buffer, (int)length); } else { @@ -170,7 +170,7 @@ namespace BizHawk.Client.EmuHawk } } - public MemFunctions(MemoryDomain domain, int domainAddrStart, long bankSize, int addressMangler = 0) + public MemFunctions(MemoryDomain domain, uint domainAddrStart, long bankSize, uint addressMangler = 0) { _domain = domain; _domainAddrStart = domainAddrStart; @@ -180,12 +180,12 @@ namespace BizHawk.Client.EmuHawk WriteFunc = WriteMem; ReadBlockFunc = ReadMemBlock; - if (bankSize > int.MaxValue) + if (bankSize > uint.MaxValue) { throw new OverflowException("bankSize is too big!"); } - BankSize = (int)bankSize; + BankSize = (uint)bankSize; } } @@ -203,10 +203,10 @@ namespace BizHawk.Client.EmuHawk // this is a complete hack because the libretro Intelli core sucks and so achievements are made expecting this format private class IntelliMemFunctions : MemFunctions { - protected override int FixAddr(int addr) + protected override uint FixAddr(uint addr) => (addr >> 1) + (~addr & 1); - protected override byte ReadMem(int addr) + protected override byte ReadMem(uint addr) { if ((addr & 2) != 0) { @@ -216,7 +216,7 @@ namespace BizHawk.Client.EmuHawk return base.ReadMem(addr); } - protected override void WriteMem(int addr, byte val) + protected override void WriteMem(uint addr, byte val) { if ((addr & 2) != 0) { @@ -226,7 +226,7 @@ namespace BizHawk.Client.EmuHawk base.WriteMem(addr, val); } - protected override int ReadMemBlock(int addr, IntPtr buffer, int bytes) + protected override uint ReadMemBlock(uint addr, IntPtr buffer, uint bytes) { if (addr >= BankSize) { @@ -268,7 +268,7 @@ namespace BizHawk.Client.EmuHawk private readonly IDebuggable _debuggable; private readonly MemoryDomain _vram; // our vram is unpacked, but RA expects it packed - private byte ReadVRAMPacked(int addr) + private byte ReadVRAMPacked(uint addr) { return (byte)(((_vram.PeekByte(addr * 4 + 0) & 3) << 6) | ((_vram.PeekByte(addr * 4 + 1) & 3) << 4) @@ -276,7 +276,7 @@ namespace BizHawk.Client.EmuHawk | ((_vram.PeekByte(addr * 4 + 3) & 3) << 0)); } - protected override byte ReadMem(int addr) + protected override byte ReadMem(uint addr) { using (MemGuard.EnterExit()) { @@ -291,7 +291,7 @@ namespace BizHawk.Client.EmuHawk } } - protected override void WriteMem(int addr, byte val) + protected override void WriteMem(uint addr, byte val) { using (MemGuard.EnterExit()) { @@ -310,7 +310,7 @@ namespace BizHawk.Client.EmuHawk } } - protected override int ReadMemBlock(int addr, IntPtr buffer, int bytes) + protected override uint ReadMemBlock(uint addr, IntPtr buffer, uint bytes) { if (addr >= BankSize) { @@ -367,12 +367,12 @@ namespace BizHawk.Client.EmuHawk }; // these consoles will use part of the system bus at an offset - private static readonly Dictionary UsePartialSysBus = new() + private static readonly Dictionary UsePartialSysBus = new() { - [ConsoleID.MasterSystem] = new[] { (0xC000, 0x2000) }, - [ConsoleID.GameGear] = new[] { (0xC000, 0x2000) }, - [ConsoleID.Colecovision] = new[] { (0x6000, 0x400) }, - [ConsoleID.SG1000] = new[] { (0xC000, 0x2000), (0x2000, 0x2000), (0x8000, 0x2000) }, + [ConsoleID.MasterSystem] = new[] { (0xC000u, 0x2000u) }, + [ConsoleID.GameGear] = new[] { (0xC000u, 0x2000u) }, + [ConsoleID.Colecovision] = new[] { (0x6000u, 0x400u) }, + [ConsoleID.SG1000] = new[] { (0xC000u, 0x2000u), (0x2000u, 0x2000u), (0x8000u, 0x2000u) }, }; // anything more complicated will be handled accordingly @@ -381,7 +381,7 @@ namespace BizHawk.Client.EmuHawk { var mfs = new List(); - void TryAddDomain(string domain, int? size = null, int addressMangler = 0) + void TryAddDomain(string domain, uint? size = null, uint addressMangler = 0) { if (domains.Has(domain)) { @@ -422,7 +422,7 @@ namespace BizHawk.Client.EmuHawk mfs.Add(new(domains["68K RAM"], 0, domains["68K RAM"].Size, 1)); TryAddDomain("32X RAM", addressMangler: 1); // our picodrive doesn't byteswap its SRAM, so... - TryAddDomain("SRAM", addressMangler: domains["SRAM"] is MemoryDomainIntPtrSwap16Monitor ? 1 : 0); + TryAddDomain("SRAM", addressMangler: domains["SRAM"] is MemoryDomainIntPtrSwap16Monitor ? 1u : 0u); break; case ConsoleID.SNES: mfs.Add(new(domains["WRAM"], 0, domains["WRAM"].Size));