diff --git a/.clang-format b/.clang-format index 5a58fac71..dd223c27f 100644 --- a/.clang-format +++ b/.clang-format @@ -1,7 +1,6 @@ -# Tested with clang-format 6.0.1 AccessModifierOffset: -4 +AlignAfterOpenBracket: BlockIndent AlignEscapedNewlines: Left -AllowShortLoopsOnASingleLine: true AllowShortFunctionsOnASingleLine: Empty AlwaysBreakTemplateDeclarations: true BraceWrapping: @@ -21,6 +20,10 @@ BreakBeforeBraces: Custom BreakConstructorInitializers: AfterColon ColumnLimit: 120 Cpp11BracedListStyle: true +FixNamespaceComments: false +IndentCaseLabels: true IndentWidth: 4 +NamespaceIndentation: All PointerAlignment: Left SpaceAfterTemplateKeyword: false +SortIncludes: Never diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d45944290..559f8061e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -53,3 +53,14 @@ jobs: shell: cmd working-directory: ${{github.workspace}}/build run: cmake --build . --config %BUILD_TYPE% -j 4 + + check: + runs-on: ubuntu-24.04 + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Check formatting + run: tools/format.sh + env: + CMAKE_FORMAT_FLAGS: -n -Werror diff --git a/common/include/common/ComPtr.h b/common/include/common/ComPtr.h index f30083ff8..8b9bc15bc 100644 --- a/common/include/common/ComPtr.h +++ b/common/include/common/ComPtr.h @@ -4,27 +4,24 @@ template class ComPtr { private: - T *m_ptr = nullptr; + T* m_ptr = nullptr; public: ComPtr() = default; - ComPtr(const ComPtr& other) : - m_ptr(other.m_ptr) + ComPtr(const ComPtr& other) : m_ptr(other.m_ptr) { if (m_ptr) { m_ptr->AddRef(); } } - ComPtr(ComPtr&& other) : - m_ptr(other.m_ptr) + ComPtr(ComPtr&& other) : m_ptr(other.m_ptr) { other.m_ptr = nullptr; } - ComPtr(T* ptr) : - m_ptr(ptr) + ComPtr(T* ptr) : m_ptr(ptr) { if (m_ptr) { m_ptr->AddRef(); diff --git a/common/include/common/DynamicLinkLibrary.h b/common/include/common/DynamicLinkLibrary.h index ad1167233..28089db84 100644 --- a/common/include/common/DynamicLinkLibrary.h +++ b/common/include/common/DynamicLinkLibrary.h @@ -1,6 +1,7 @@ #pragma once #include +#include class DynamicLinkLibrary { @@ -12,9 +13,7 @@ class DynamicLinkLibrary DynamicLinkLibrary(const DynamicLinkLibrary& other) = delete; - DynamicLinkLibrary(DynamicLinkLibrary&& other) noexcept - : handle_(std::exchange(other.handle_, nullptr)) - {} + DynamicLinkLibrary(DynamicLinkLibrary&& other) noexcept : handle_(std::exchange(other.handle_, nullptr)) {} ~DynamicLinkLibrary() { @@ -41,7 +40,7 @@ class DynamicLinkLibrary { static_assert(std::is_pointer_v); // Note: double cast is needed to fix cast-function-type GCC warning - return reinterpret_cast(reinterpret_cast(GetProcAddress(handle_, name))); + return reinterpret_cast(reinterpret_cast(GetProcAddress(handle_, name))); } private: diff --git a/common/include/common/HttpRequest.h b/common/include/common/HttpRequest.h index d8905d9d7..324048ebb 100644 --- a/common/include/common/HttpRequest.h +++ b/common/include/common/HttpRequest.h @@ -20,7 +20,7 @@ class InternetHandle InternetCloseHandle(m_handle); } - InternetHandle(const InternetHandle&) = delete; // copy constructor + InternetHandle(const InternetHandle&) = delete; // copy constructor InternetHandle& operator=(const InternetHandle&) = delete; // assignment operator InternetHandle(InternetHandle&& other) noexcept : // move constructor @@ -33,7 +33,7 @@ class InternetHandle return *this; } - InternetHandle &operator=(HINTERNET handle) + InternetHandle& operator=(HINTERNET handle) { if (m_handle) InternetCloseHandle(m_handle); diff --git a/common/include/common/config/GameConfig.h b/common/include/common/config/GameConfig.h index 392a8e623..17bf73073 100644 --- a/common/include/common/config/GameConfig.h +++ b/common/include/common/config/GameConfig.h @@ -49,7 +49,6 @@ struct GameConfig CfgVar nearest_texture_filtering = false; CfgVar msaa = 0; - CfgVar high_scanner_res = true; CfgVar high_monitor_res = true; CfgVar true_color_textures = true; @@ -74,7 +73,9 @@ struct GameConfig static constexpr unsigned default_update_rate = 200000; // T1/LAN in stock launcher CfgVar update_rate = default_update_rate; - CfgVar force_port{0, [](auto val) { return std::min(val, std::numeric_limits::max()); }}; + CfgVar force_port{0, [](auto val) { + return std::min(val, std::numeric_limits::max()); + }}; // Input CfgVar direct_input = false; diff --git a/common/include/common/config/RegKey.h b/common/include/common/config/RegKey.h index 09f72ccb1..5e9d58c0b 100644 --- a/common/include/common/config/RegKey.h +++ b/common/include/common/config/RegKey.h @@ -16,8 +16,7 @@ class RegKey RegKey(RegKey&& other) noexcept : m_key(std::exchange(other.m_key, nullptr)), m_open(std::exchange(other.m_open, false)) - { - } + {} RegKey& operator=(RegKey&& other) noexcept { @@ -114,7 +113,8 @@ class RegKey bool read_value(const char* name, float* value) { static_assert(sizeof(float) == sizeof(uint32_t)); - union { + union + { float f; uint32_t u32; } u; @@ -144,7 +144,8 @@ class RegKey void write_value(const char* name, const std::string& value) { - LONG error = RegSetValueExA(m_key, name, 0, REG_SZ, reinterpret_cast(value.c_str()), value.size() + 1); + LONG error = + RegSetValueExA(m_key, name, 0, REG_SZ, reinterpret_cast(value.c_str()), value.size() + 1); if (error != ERROR_SUCCESS) throw Win32Error(error, "RegSetValueExA failed"); } @@ -162,7 +163,8 @@ class RegKey void write_value(const char* name, float value) { static_assert(sizeof(float) == sizeof(uint32_t)); - union { + union + { float f; uint32_t u32; } u; diff --git a/common/include/common/error/Win32Error.h b/common/include/common/error/Win32Error.h index 0701288f4..bffa1aa72 100644 --- a/common/include/common/error/Win32Error.h +++ b/common/include/common/error/Win32Error.h @@ -7,13 +7,9 @@ class Win32Error : public std::exception { public: - Win32Error(const char* msg = "") : - Win32Error(GetLastError(), msg) - {} + Win32Error(const char* msg = "") : Win32Error(GetLastError(), msg) {} - Win32Error(DWORD error, const char* msg = "") : - m_error(error), - m_what(msg) + Win32Error(DWORD error, const char* msg = "") : m_error(error), m_what(msg) { if (!m_what.empty()) m_what += ": "; @@ -37,7 +33,6 @@ class Win32Error : public std::exception std::string m_what; }; - #define S(x) #x #define S_(x) S(x) #define S_LINE S_(__LINE__) diff --git a/common/include/common/error/error-utils.h b/common/include/common/error/error-utils.h index db3695321..d7a79328f 100644 --- a/common/include/common/error/error-utils.h +++ b/common/include/common/error/error-utils.h @@ -38,9 +38,12 @@ inline void print_exception(const std::exception& e, std::string& buf, int level buf += '\n'; try { std::rethrow_if_nested(e); - } catch(const std::exception& e) { + } + catch (const std::exception& e) { print_exception(e, buf, level + 1); - } catch(...) {} + } + catch (...) { + } } inline std::string generate_message_for_exception(const std::exception& e) diff --git a/common/include/common/rfproto.h b/common/include/common/rfproto.h index 734d26907..526ad0772 100644 --- a/common/include/common/rfproto.h +++ b/common/include/common/rfproto.h @@ -1,12 +1,12 @@ /***************************************************************************** -* -* PROJECT: Open Faction -* LICENSE: See LICENSE in the top level directory -* FILE: rfproto.h -* PURPOSE: RF protocol documentation -* DEVELOPERS: Rafał Harabień -* -*****************************************************************************/ + * + * PROJECT: Open Faction + * LICENSE: See LICENSE in the top level directory + * FILE: rfproto.h + * PURPOSE: RF protocol documentation + * DEVELOPERS: Rafał Harabień + * + *****************************************************************************/ // Note: This file assumes a little-endian binary representation of integers and IEEE 754 compatible representation of // floating point numbers. @@ -22,7 +22,7 @@ #pragma pack(push, 1) #define RF_MAX_NAME_LEN 20 -#define RF_MAX_LEVEL_NAME_LEN (MAX_PATH-1) +#define RF_MAX_LEVEL_NAME_LEN (MAX_PATH - 1) #define RF_MAX_PASSWORD_LEN 22 #define RF_TRACKER_HOST "rf.thqmultiplay.net" #define RF_TRACKER_PORT 18444 @@ -33,9 +33,9 @@ */ enum RF_MainPacketType { - RF_GAME = 0x00, + RF_GAME = 0x00, RF_RELIABLE = 0x01, - RF_TRACKER = 0x02, + RF_TRACKER = 0x02, }; /** @@ -48,61 +48,61 @@ enum RF_MainPacketType */ enum RF_GamePacketType { - RF_GPT_GAME_INFO_REQUEST = 0x00, - RF_GPT_GAME_INFO = 0x01, - RF_GPT_JOIN_REQUEST = 0x02, - RF_GPT_JOIN_ACCEPT = 0x03, - RF_GPT_JOIN_DENY = 0x04, - RF_GPT_NEW_PLAYER = 0x05, - RF_GPT_PLAYERS = 0x06, - RF_GPT_LEFT_GAME = 0x07, - RF_GPT_END_GAME = 0x08, - RF_GPT_STATE_INFO_REQUEST = 0x09, - RF_GPT_STATE_INFO_DONE = 0x0A, - RF_GPT_CLIENT_IN_GAME = 0x0B, // sent after joining and when player exit menu screen - RF_GPT_CHAT_LINE = 0x0C, - RF_GPT_NAME_CHANGE = 0x0D, - RF_GPT_RESPAWN_REQUEST = 0x0E, - RF_GPT_TRIGGER_ACTIVATE = 0x0F, - RF_GPT_USE_KEY_PRESSED = 0x10, - RF_GPT_PREGAME_BOOLEAN = 0x11, - RF_GPT_PREGAME_GLASS = 0x12, - RF_GPT_PREGAME_REMOTE_CHARGE = 0x13, - RF_GPT_SUICIDE = 0x14, - RF_GPT_ENTER_LIMBO = 0x15, // level ended - RF_GPT_LEAVE_LIMBO = 0x16, // level is changing - RF_GPT_TEAM_CHANGE = 0x17, - RF_GPT_PING = 0x18, - RF_GPT_PONG = 0x19, - RF_GPT_NETGAME_UPDATE = 0x1A, - RF_GPT_RATE_CHANGE = 0x1B, - RF_GPT_SELECT_WEAPON = 0x1C, - RF_GPT_CLUTTER_UPDATE = 0x1D, - RF_GPT_CLUTTER_KILL = 0x1E, - RF_GPT_CTF_FLAG_PICKED_UP = 0x1F, - RF_GPT_CTF_FLAG_CAPTURED = 0x20, - RF_GPT_CTF_FLAG_UPDATE = 0x21, - RF_GPT_CTF_FLAG_RETURNED = 0x22, - RF_GPT_CTF_FLAG_DROPED = 0x23, - RF_GPT_REMOTE_CHARGE_KILL = 0x24, - RF_GPT_ITEM_UPDATE = 0x25, - RF_GPT_OBJECT_UPDATE = 0x26, - RF_GPT_OBJECT_KILL = 0x27, - RF_GPT_ITEM_APPLY = 0x28, - RF_GPT_BOOLEAN = 0x29, // geomod - RF_GPT_MOVER_UPDATE = 0x2A, // unused - RF_GPT_RESPAWN = 0x2B, - RF_GPT_ENTITY_CREATE = 0x2C, - RF_GPT_ITEM_CREATE = 0x2D, - RF_GPT_RELOAD = 0x2E, - RF_GPT_RELOAD_REQUEST = 0x2F, - RF_GPT_WEAPON_FIRE = 0x30, - RF_GPT_FALL_DAMAGE = 0x31, - RF_GPT_RCON_REQUEST = 0x32, - RF_GPT_RCON = 0x33, - RF_GPT_SOUND = 0x34, - RF_GPT_TEAM_SCORES = 0x35, - RF_GPT_GLASS_KILL = 0x36, + RF_GPT_GAME_INFO_REQUEST = 0x00, + RF_GPT_GAME_INFO = 0x01, + RF_GPT_JOIN_REQUEST = 0x02, + RF_GPT_JOIN_ACCEPT = 0x03, + RF_GPT_JOIN_DENY = 0x04, + RF_GPT_NEW_PLAYER = 0x05, + RF_GPT_PLAYERS = 0x06, + RF_GPT_LEFT_GAME = 0x07, + RF_GPT_END_GAME = 0x08, + RF_GPT_STATE_INFO_REQUEST = 0x09, + RF_GPT_STATE_INFO_DONE = 0x0A, + RF_GPT_CLIENT_IN_GAME = 0x0B, // sent after joining and when player exit menu screen + RF_GPT_CHAT_LINE = 0x0C, + RF_GPT_NAME_CHANGE = 0x0D, + RF_GPT_RESPAWN_REQUEST = 0x0E, + RF_GPT_TRIGGER_ACTIVATE = 0x0F, + RF_GPT_USE_KEY_PRESSED = 0x10, + RF_GPT_PREGAME_BOOLEAN = 0x11, + RF_GPT_PREGAME_GLASS = 0x12, + RF_GPT_PREGAME_REMOTE_CHARGE = 0x13, + RF_GPT_SUICIDE = 0x14, + RF_GPT_ENTER_LIMBO = 0x15, // level ended + RF_GPT_LEAVE_LIMBO = 0x16, // level is changing + RF_GPT_TEAM_CHANGE = 0x17, + RF_GPT_PING = 0x18, + RF_GPT_PONG = 0x19, + RF_GPT_NETGAME_UPDATE = 0x1A, + RF_GPT_RATE_CHANGE = 0x1B, + RF_GPT_SELECT_WEAPON = 0x1C, + RF_GPT_CLUTTER_UPDATE = 0x1D, + RF_GPT_CLUTTER_KILL = 0x1E, + RF_GPT_CTF_FLAG_PICKED_UP = 0x1F, + RF_GPT_CTF_FLAG_CAPTURED = 0x20, + RF_GPT_CTF_FLAG_UPDATE = 0x21, + RF_GPT_CTF_FLAG_RETURNED = 0x22, + RF_GPT_CTF_FLAG_DROPED = 0x23, + RF_GPT_REMOTE_CHARGE_KILL = 0x24, + RF_GPT_ITEM_UPDATE = 0x25, + RF_GPT_OBJECT_UPDATE = 0x26, + RF_GPT_OBJECT_KILL = 0x27, + RF_GPT_ITEM_APPLY = 0x28, + RF_GPT_BOOLEAN = 0x29, // geomod + RF_GPT_MOVER_UPDATE = 0x2A, // unused + RF_GPT_RESPAWN = 0x2B, + RF_GPT_ENTITY_CREATE = 0x2C, + RF_GPT_ITEM_CREATE = 0x2D, + RF_GPT_RELOAD = 0x2E, + RF_GPT_RELOAD_REQUEST = 0x2F, + RF_GPT_WEAPON_FIRE = 0x30, + RF_GPT_FALL_DAMAGE = 0x31, + RF_GPT_RCON_REQUEST = 0x32, + RF_GPT_RCON = 0x33, + RF_GPT_SOUND = 0x34, + RF_GPT_TEAM_SCORES = 0x35, + RF_GPT_GLASS_KILL = 0x36, }; /** @@ -117,7 +117,7 @@ struct RF_GamePacketHeader enum RF_ReliablePacketType { - RF_RPT_REPLY = 0x00, + RF_RPT_REPLY = 0x00, RF_RPT_PACKETS = 0x01, RF_RPT_JOIN_03 = 0x03, RF_RPT_JOIN_06 = 0x06, @@ -130,11 +130,11 @@ enum RF_ReliablePacketType */ struct RF_ReliablePacket { - uint8_t type; // usually RF_RPT_PACKETS + uint8_t type; // usually RF_RPT_PACKETS uint8_t unknown; - uint16_t id; // Packet ID - uint16_t len; // Length of data - uint32_t ticks; // Milliseconds since client/server start + uint16_t id; // Packet ID + uint16_t len; // Length of data + uint32_t ticks; // Milliseconds since client/server start uint8_t data[]; }; @@ -156,22 +156,22 @@ struct RF_ReliableReplyPacket enum RF_ProtocolVersion { RF_VER_10_11 = 0x87, // 1.0 and 1.1 servers - RF_VER_12 = 0x89, // 1.2 servers - RF_VER_13 = 0x91, // 1.3 servers (unofficial path) + RF_VER_12 = 0x89, // 1.2 servers + RF_VER_13 = 0x91, // 1.3 servers (unofficial path) }; enum RF_GameType { - RF_GT_DM = 0x00, - RF_GT_CTF = 0x01, + RF_GT_DM = 0x00, + RF_GT_CTF = 0x01, RF_GT_TEAMDM = 0x02, }; enum RF_ServerFlags { RF_SF_DEDICATED = 0x01, - RF_SF_NOT_LAN = 0x02, - RF_SF_PASSWORD = 0x04, + RF_SF_NOT_LAN = 0x02, + RF_SF_PASSWORD = 0x04, }; struct RF_GameInfoPacket @@ -179,13 +179,13 @@ struct RF_GameInfoPacket struct RF_GamePacketHeader header; // RF_GPT_GAME_INFO uint8_t version; // Supported version of protocol #ifdef PSEUDOCODE - char name[]; // Server name - uint8_t game_type; // Game type (RF_DM, RF_TEAMDM, RF_CTF) - uint8_t players_count; // Players count on the server - uint8_t max_players_count; // Maximal players count on the server - char level[]; // Map name - char mod[]; // MOD activated on the server - uint8_t flags; // Bitfield (RF_SF_*) * + char name[]; // Server name + uint8_t game_type; // Game type (RF_DM, RF_TEAMDM, RF_CTF) + uint8_t players_count; // Players count on the server + uint8_t max_players_count; // Maximal players count on the server + char level[]; // Map name + char mod[]; // MOD activated on the server + uint8_t flags; // Bitfield (RF_SF_*) * #else char rest[]; #endif @@ -193,23 +193,23 @@ struct RF_GameInfoPacket struct RF_JoinRequestPacket { - struct RF_GamePacketHeader header; // RF_GPT_JOIN_REQUEST - uint8_t version; // Supported version of protocol + struct RF_GamePacketHeader header; // RF_GPT_JOIN_REQUEST + uint8_t version; // Supported version of protocol #ifdef PSEUDOCODE char name[]; - uint32_t entity_type; // 0x5 + uint32_t entity_type; // 0x5 char password[]; - uint32_t rate; // connection speed in bytes/second - if (version==RF_VER_10_11) { + uint32_t rate; // connection speed in bytes/second + if (version == RF_VER_10_11) { uint32_t meshes_vpp_checksum; uint32_t meshes_vpp_size; uint32_t motions_vpp_checksum; uint32_t motions_vpp_size; } - uint32_t tables_vpp_checksum; // not a public algorithm, for 1.2 it's 7e 40 c2 1a - uint32_t tables_vpp_size; // Size of tables.vpp - uint32_t mod_vpp_checksum; // Checksum of mod VPP if exists (modname.vpp) - uint32_t mod_vpp_size; // Size of mod VPP if exists (modname.vpp) + uint32_t tables_vpp_checksum; // not a public algorithm, for 1.2 it's 7e 40 c2 1a + uint32_t tables_vpp_size; // Size of tables.vpp + uint32_t mod_vpp_checksum; // Checksum of mod VPP if exists (modname.vpp) + uint32_t mod_vpp_size; // Size of mod VPP if exists (modname.vpp) /*struct RF_JoinEx joinEx;*/ #else char rest[]; @@ -220,7 +220,7 @@ struct RF_JoinAcceptPacket { struct RF_GamePacketHeader header; // RF_GPT_JOIN_ACCEPT #ifdef PSEUDOCODE - char level[]; // Name of current map RFL file + char level[]; // Name of current map RFL file struct RF_JoinAcceptRest rest; #else char rest[]; @@ -230,17 +230,17 @@ struct RF_JoinAcceptPacket enum RF_GameOptions { - RF_GO_DEFAULT = 0x0402, - RF_GO_TEAM_DAMAGE = 0x0240, - RF_GO_FALL_DAMAGE = 0x0080, - RF_GO_WEAPONS_STAY = 0x0010, + RF_GO_DEFAULT = 0x0402, + RF_GO_TEAM_DAMAGE = 0x0240, + RF_GO_FALL_DAMAGE = 0x0080, + RF_GO_WEAPONS_STAY = 0x0010, RF_GO_FORCE_RESPAWN = 0x0020, RF_GO_BALANCE_TEAMS = 0x2000, }; enum RF_PlayerFlags { - RF_PF_UNKNOWN = 0x00000004, + RF_PF_UNKNOWN = 0x00000004, RF_PF_BLUE_TEAM = 0x00000080, }; @@ -257,16 +257,16 @@ struct RF_JoinAcceptRest enum RF_JoinDenyReason { - RF_JDR_SERVER_IS_FULL = 0x01, + RF_JDR_SERVER_IS_FULL = 0x01, RF_JDR_NO_ADDITIONAL_PLAYERS = 0x02, - RF_JDR_INVALID_PASSWORD = 0x03, - RF_JDR_THE_SAME_IP = 0x04, - RF_JDR_LEVEL_CHANGING = 0x05, - RF_JDR_SERVER_ERROR = 0x06, - RF_JDR_DATA_DOESNT_MATCH = 0x07, - RF_JDR_UNSUPPOROTED_VERSION = 0x08, - RF_JDR_UNKNOWN = 0x09, - RF_JDR_BANNED = 0x0A, + RF_JDR_INVALID_PASSWORD = 0x03, + RF_JDR_THE_SAME_IP = 0x04, + RF_JDR_LEVEL_CHANGING = 0x05, + RF_JDR_SERVER_ERROR = 0x06, + RF_JDR_DATA_DOESNT_MATCH = 0x07, + RF_JDR_UNSUPPOROTED_VERSION = 0x08, + RF_JDR_UNKNOWN = 0x09, + RF_JDR_BANNED = 0x0A, // Note: reasons > 0x0A shows the same message as RF_JDR_UNKNOWN (tested in PF) }; @@ -318,13 +318,13 @@ struct RF_PlayersPacket enum RF_LeftReason { - RF_LR_UNKNOWN = 0x00, - RF_LR_NORMAL = 0x01, - RF_LR_KICKED = 0x02, + RF_LR_UNKNOWN = 0x00, + RF_LR_NORMAL = 0x01, + RF_LR_KICKED = 0x02, RF_LR_DATA_INCOMPATIBLE = 0x04, // Note: received when PF wants to download map (?) - RF_LR_BETWEEN_LEVELS = 0x05, - RF_LR_EMPTY = 0x06, // TODO: check if it's polish translation bug - RF_LR_NO_LEVEL_FILE = 0x07, + RF_LR_BETWEEN_LEVELS = 0x05, + RF_LR_EMPTY = 0x06, // TODO: check if it's polish translation bug + RF_LR_NO_LEVEL_FILE = 0x07, // Note: other reasons shows the same message as RF_LR_UNKNOWN }; @@ -351,7 +351,7 @@ struct RF_TriggerActivatePacket struct RF_PregameGlassPacket { struct RF_GamePacketHeader header; // RF_GPT_PREGAME_GLASS - uint8_t rooms_bitmap[]; // Bitmap of killable level rooms (only rooms with life >= 0): 1 - not broken, 0 - broken + uint8_t rooms_bitmap[]; // Bitmap of killable level rooms (only rooms with life >= 0): 1 - not broken, 0 - broken }; #define RF_SERVER 0xFF // Player ID of server when sending a chat message @@ -383,8 +383,8 @@ struct RF_LeaveLimboPacket { struct RF_GamePacketHeader header; // RF_GPT_LEAVE_LIMBO #ifdef PSEUDOCODE - char level[]; // Level name - uint32_t level_checksum; // not a public algorithm + char level[]; // Level name + uint32_t level_checksum; // not a public algorithm #else char rest[]; #endif @@ -414,8 +414,8 @@ struct RF_NetgameUpdatePacket uint8_t player_count; // Player count #ifdef PSEUDOCODE struct RF_PlayerStats players[]; - float level_time; // Time since level start - float time_limit; // Level time limit + float level_time; // Time since level start + float time_limit; // Level time limit #else char rest[]; #endif @@ -461,19 +461,19 @@ struct RF_CtfFlagCapturedPacket struct RF_CtfFlagUpdatePacket { - struct RF_GamePacketHeader header; // RF_GPT_CTF_FLAG_UPDATE + struct RF_GamePacketHeader header; // RF_GPT_CTF_FLAG_UPDATE #ifdef PSEUDOCODE - uint8_t red_flag_player; // Player ID or 0xFF + uint8_t red_flag_player; // Player ID or 0xFF if (red_flag_player == 0xFF) { - uint8_t red_flag_in_base; // Ie. 01 + uint8_t red_flag_in_base; // Ie. 01 if (!red_flag_in_base) { - struct RF_Vector red_flag_pos; // Red flag position - struct RF_Matrix red_flag_orient; // Rotation matrix + struct RF_Vector red_flag_pos; // Red flag position + struct RF_Matrix red_flag_orient; // Rotation matrix } } - uint8_t blue_flag_player; // Player ID or 0xFF + uint8_t blue_flag_player; // Player ID or 0xFF if (blue_flag_player == 0xFF) { - uint8_t blue_flag_in_base; // Ie. 01 + uint8_t blue_flag_in_base; // Ie. 01 if (!red_flag_in_base) { struct RF_Vector blue_flag_pos; // Blue flag position struct RF_Matrix blue_flag_orient; // Rotation matrix @@ -525,97 +525,98 @@ struct RF_RemoteChargeKillPacket struct RF_ItemUpdatePacket { struct RF_GamePacketHeader header; // RF_GPT_ITEM_UPDATE - uint8_t level_items_bitmap[25]; // Bitmap of visible static items (loaded from RFL). Maximal number of visible items is 25*8=200 + uint8_t level_items_bitmap[25]; // Bitmap of visible static items (loaded from RFL). Maximal number of visible items + // is 25*8=200 }; enum RF_Weapon { - RF_REMOTE_CHARGE = 0x00, - RF_REMOTE_CHARGE_DETONATOR = 0x01, - RF_CONTROL_BATON = 0x02, - RF_PISTOL = 0x03, - RF_SILENCED_PISTOL = 0x04, // not supported in RF multiplayer - RF_SHOTGUN = 0x05, - RF_SNIPER_RIFLE = 0x06, - RF_ROCKET_LAUNCHER = 0x07, - RF_ASSOULT_RIFLE = 0x08, - RF_SUBMACHINE_GUN = 0x09, - RF_SUBMACHINE_GUN_SPECIAL = 0x0A, // not supported in RF multiplayer - RF_GRENADE = 0x0B, - RF_FLAMETHROWER = 0x0C, - RF_RIOT_SHIELD = 0x0D, - RF_RAIL_GUN = 0x0E, - RF_HEAVY_MACHINE_GUN = 0x0F, - RF_PRECISION_RIFLE = 0x10, - RF_FUSION_ROCKET_LAUNCHER = 0x11, - - RF_VAUSS = 0x12, - RF_TANKBOT_CHAINGUN = 0x13, - RF_TRIBEAM_LASER = 0x14, - RF_LASER = 0x15, - RF_CAPEK_CANE = 0x16, - RF_REEPER_CLAW = 0x17, - RF_BABY_REEPER_CLAW = 0x18, - RF_ROCK_SNAKE_SMASH = 0x19, - RF_ROCK_SNAKE_SPIT = 0x1A, - RF_BIG_ROCK_SNAKE_SMASH = 0x1B, - RF_BIG_ROCK_SNAKE_SPIT = 0x1C, + RF_REMOTE_CHARGE = 0x00, + RF_REMOTE_CHARGE_DETONATOR = 0x01, + RF_CONTROL_BATON = 0x02, + RF_PISTOL = 0x03, + RF_SILENCED_PISTOL = 0x04, // not supported in RF multiplayer + RF_SHOTGUN = 0x05, + RF_SNIPER_RIFLE = 0x06, + RF_ROCKET_LAUNCHER = 0x07, + RF_ASSOULT_RIFLE = 0x08, + RF_SUBMACHINE_GUN = 0x09, + RF_SUBMACHINE_GUN_SPECIAL = 0x0A, // not supported in RF multiplayer + RF_GRENADE = 0x0B, + RF_FLAMETHROWER = 0x0C, + RF_RIOT_SHIELD = 0x0D, + RF_RAIL_GUN = 0x0E, + RF_HEAVY_MACHINE_GUN = 0x0F, + RF_PRECISION_RIFLE = 0x10, + RF_FUSION_ROCKET_LAUNCHER = 0x11, + + RF_VAUSS = 0x12, + RF_TANKBOT_CHAINGUN = 0x13, + RF_TRIBEAM_LASER = 0x14, + RF_LASER = 0x15, + RF_CAPEK_CANE = 0x16, + RF_REEPER_CLAW = 0x17, + RF_BABY_REEPER_CLAW = 0x18, + RF_ROCK_SNAKE_SMASH = 0x19, + RF_ROCK_SNAKE_SPIT = 0x1A, + RF_BIG_ROCK_SNAKE_SMASH = 0x1B, + RF_BIG_ROCK_SNAKE_SPIT = 0x1C, RF_SEA_CREATURE_SONAR_ATTACK = 0x1D, - RF_DRONE_SMASH = 0x1E, - RF_TANKBOT_SMASH = 0x1F, - RF_MUTANT_ATTACK_1 = 0x20, - RF_MUTANT_ATTACK_2 = 0x21, - RF_HEAP = 0x22, - RF_TORPEDO = 0x23, - RF_APC_MINIGUN = 0x24, - RF_JEEP_GUN = 0x25, - RF_FIGHTER_MINIGUN = 0x26, - RF_DRILL = 0x27, - RF_DRONE_MISSILE = 0x28, - RF_TANKBOT_MISSILE = 0x29, - RF_FIGHTER_ROCKET = 0x2A, - RF_APC_ROCKET = 0x2B, - - RF_UNKNOWN_WEAPON = 0xFF, + RF_DRONE_SMASH = 0x1E, + RF_TANKBOT_SMASH = 0x1F, + RF_MUTANT_ATTACK_1 = 0x20, + RF_MUTANT_ATTACK_2 = 0x21, + RF_HEAP = 0x22, + RF_TORPEDO = 0x23, + RF_APC_MINIGUN = 0x24, + RF_JEEP_GUN = 0x25, + RF_FIGHTER_MINIGUN = 0x26, + RF_DRILL = 0x27, + RF_DRONE_MISSILE = 0x28, + RF_TANKBOT_MISSILE = 0x29, + RF_FIGHTER_ROCKET = 0x2A, + RF_APC_ROCKET = 0x2B, + + RF_UNKNOWN_WEAPON = 0xFF, }; enum RF_ObjectUpdateFlags { RF_OUF_POS_ROT_ANIM = 0x01, - RF_OUF_UNKNOWN4 = 0x02, // Usually used with RF_ODF_POS_ROT - RF_OUF_WEAPON_TYPE = 0x04, - RF_OUF_UNKNOWN3 = 0x08, // Usually used with RF_ODF_FIRE - RF_OUF_ALT_FIRE = 0x10, - RF_OUF_HEATH_ARMOR = 0x20, - RF_OUF_FIRE = 0x40, - RF_OUF_AMP_FLAGS = 0x80, + RF_OUF_UNKNOWN4 = 0x02, // Usually used with RF_ODF_POS_ROT + RF_OUF_WEAPON_TYPE = 0x04, + RF_OUF_UNKNOWN3 = 0x08, // Usually used with RF_ODF_FIRE + RF_OUF_ALT_FIRE = 0x10, + RF_OUF_HEATH_ARMOR = 0x20, + RF_OUF_FIRE = 0x40, + RF_OUF_AMP_FLAGS = 0x80, }; // Animation first byte - needs more work -#define RF_OAF_NO_WEAPON 0x01 -#define RF_OAF_CROUCH 0x04 -#define RF_OAF_RELOAD 0x10 +#define RF_OAF_NO_WEAPON 0x01 +#define RF_OAF_CROUCH 0x04 +#define RF_OAF_RELOAD 0x10 #define RF_OAF_FAST_RELOAD 0x20 enum RF_EntityAmpFlags { RF_EAF_DAMAGE_AMPLIFIER = 0x01, - RF_EAF_INVULNERABILITY = 0x02, + RF_EAF_INVULNERABILITY = 0x02, }; enum RF_EntityStateFlags { RF_AF_HIDDEN_WEAPON = 0x01, // not used in multi - RF_AF_CROUCH = 0x04, - RF_AF_ZOOM = 0x08, - RF_AF_WEAPON_FIRE = 0x10, // used only for remote charges and granades - RF_AF_WEAPON_FIRE2 = 0x20, // unknown + RF_AF_CROUCH = 0x04, + RF_AF_ZOOM = 0x08, + RF_AF_WEAPON_FIRE = 0x10, // used only for remote charges and granades + RF_AF_WEAPON_FIRE2 = 0x20, // unknown }; struct RF_ObjectUpdate { - uint32_t handle; // Object object handle - uint8_t flags; // Bitfield (RF_ObjectUpdateFlags) + uint32_t handle; // Object object handle + uint8_t flags; // Bitfield (RF_ObjectUpdateFlags) #ifdef PSEUDOCODE if (flags & RF_OUF_POS_ROT) { uint16_t ticks; // Milliseconds since app. start @@ -629,22 +630,22 @@ struct RF_ObjectUpdate // Note: you can calculate move_dir_z from move_dir_x, move_dir_y and move_speed } if (flags & RF_OUF_AMP_FLAGS) { - uint8_t amp_flags; // Bitfield (RF_EntityAmpFlags) + uint8_t amp_flags; // Bitfield (RF_EntityAmpFlags) } if (flags & RF_OUF_WEAPON_TYPE) { - uint8_t weapon; // Weapon type + uint8_t weapon; // Weapon type } if (flags & RF_OUF_HEATH_ARMOR) { - uint8_t health; // Entity health points - uint8_t armor; // Entity armor - uint8_t unknown2; // Ie. 00 + uint8_t health; // Entity health points + uint8_t armor; // Entity armor + uint8_t unknown2; // Ie. 00 } if (flags & RF_OUF_UNKNOWN3) { - uint8_t unknown3; // Ie. 00 - uint8_t _unknown3[unknown3*3]; + uint8_t unknown3; // Ie. 00 + uint8_t _unknown3[unknown3 * 3]; } if (flags & RF_OUF_UNKNOWN4) { - uint16_t unknown4; // Ie. 00 00 + uint16_t unknown4; // Ie. 00 00 } #else @@ -656,7 +657,7 @@ struct RF_ObjectUpdatePacket { struct RF_GamePacketHeader header; // RF_GPT_OBJECT_UPDATE #ifdef PSEUDOCODE - RF_ObjectUpdate objects[]; // Objects data + RF_ObjectUpdate objects[]; // Objects data uint32_t terminator = 0xFFFFFFFF; #else char rest[]; @@ -666,7 +667,7 @@ struct RF_ObjectUpdatePacket enum RF_ObjectKillFlags { RF_OKF_ITEM_UNKNOWN = 0x01, // Note: it's usually not used by game - RF_OKF_ITEM = 0x02, // Creates item in place of death + RF_OKF_ITEM = 0x02, // Creates item in place of death }; struct RF_ObjectKillPacket @@ -680,12 +681,12 @@ struct RF_ObjectKillPacket uint8_t flags; // Bitfield (RF_ObjectKillFlags) #ifdef PSEUDOCODE if (flags & (RF_OKF_ITEM | RF_OKF_ITEM_UNKNOWN)) { - uint16_t unknown2; // Ie. 0x0000, (its char unknown2[]; char unknown3;) - uint32_t item_type; // Type of item in place of killed player, Note: it must not be weapon - char unknown4[8]; // Ie. FF FF FF FF 80 00 00 00, - uint32_t item_handle; // Item handle, - struct RF_Vector item_pos; // X coordinate of item, - struct RF_Matrix rot_matrix; // Rotation matrix, + uint16_t unknown2; // Ie. 0x0000, (its char unknown2[]; char unknown3;) + uint32_t item_type; // Type of item in place of killed player, Note: it must not be weapon + char unknown4[8]; // Ie. FF FF FF FF 80 00 00 00, + uint32_t item_handle; // Item handle, + struct RF_Vector item_pos; // X coordinate of item, + struct RF_Matrix rot_matrix; // Rotation matrix, } #else char rest[]; @@ -706,14 +707,15 @@ struct RF_EntityCreatePacket { struct RF_GamePacketHeader header; // RF_GPT_ENTITY_CREATE #ifdef PSEUDOCODE - char name[]; // Entity name + char name[]; // Entity name struct RF_EntityCreatePacketRest rest; #else char rest[]; #endif }; -// Note: Only loword of handles (first 2 bytes) are known to work for example in kill packet. Hiword seems to have no effect. +// Note: Only loword of handles (first 2 bytes) are known to work for example in kill packet. Hiword seems to have no +// effect. struct RF_EntityCreatePacketRest { @@ -733,14 +735,14 @@ struct RF_ItemCreatePacket { struct RF_GamePacketHeader header; // RF_GPT_ITEM_CREATE #ifdef PSEUDOCODE - char script_name[]; // Zero-terminated string - uint8_t unknown; // Ie. 00 - uint32_t item_type; // Item type ID (entry number in items.tbl) - uint32_t respawn_time; // Item respawn time in ms (0xFFFFFFFF if item is temporary) - uint32_t count; // $Count or $Count Multi from items.tbl (not value from RFL) - uint32_t item_handle; // Item object ID - uint16_t item_bit; // Item index in RF_ItemUpdatePacket, 0xFFFF if item is temporary (created after death) - uint8_t unknown2; // 0x75 - enabled, 0x68 - not enabled + char script_name[]; // Zero-terminated string + uint8_t unknown; // Ie. 00 + uint32_t item_type; // Item type ID (entry number in items.tbl) + uint32_t respawn_time; // Item respawn time in ms (0xFFFFFFFF if item is temporary) + uint32_t count; // $Count or $Count Multi from items.tbl (not value from RFL) + uint32_t item_handle; // Item object ID + uint16_t item_bit; // Item index in RF_ItemUpdatePacket, 0xFFFF if item is temporary (created after death) + uint8_t unknown2; // 0x75 - enabled, 0x68 - not enabled struct RF_Vector pos; struct RF_Matrix rot_matrix; #else @@ -765,8 +767,8 @@ struct RF_ReloadRequestPacket enum RF_WeaponFireFlags { - RF_WFF_ALT_FIRE = 0x01, - RF_WFF_UNKNOWN = 0x02, + RF_WFF_ALT_FIRE = 0x01, + RF_WFF_UNKNOWN = 0x02, RF_WFF_NO_POS_ROT = 0x04, }; @@ -776,15 +778,15 @@ struct RF_WeaponFirePacket uint8_t weapon; // Weapon type (see RF_Weapon) uint8_t flags; // Bitfield (RF_WeaponFireFlags) #ifdef PSEUDOCODE - if (is_client) { // exists only in packets sent by server - uint8_t player_id; // Player ID + if (is_client) { // exists only in packets sent by server + uint8_t player_id; // Player ID } if ((flags & RF_WFF_NO_POS_ROT) == 0) { - struct RF_Vector pos; // Position coordinate of weapon + struct RF_Vector pos; // Position coordinate of weapon // unsigned? - int16_t direction_x; // X coordinate of direction vector - int16_t direction_y; // Y coordinate of direction vector - int16_t direction_z; // Z coordinate of direction vector + int16_t direction_x; // X coordinate of direction vector + int16_t direction_y; // Y coordinate of direction vector + int16_t direction_z; // Z coordinate of direction vector } if (flags & RF_WFF_UNKNOWN) { uint8_t unknown; @@ -823,7 +825,6 @@ struct RF_GlassKillPacket float unknown[3]; // 0.0f if explosion == 1 }; - /** * Packet union * Represents each normal game packet @@ -863,17 +864,17 @@ union RF_Packet enum RF_TrackerPacketType { - RF_TPT_REPLY = 0x01, - RF_TPT_SERVER_STOPPED = 0x03, - RF_TPT_SERVER_PING = 0x04, + RF_TPT_REPLY = 0x01, + RF_TPT_SERVER_STOPPED = 0x03, + RF_TPT_SERVER_PING = 0x04, RF_TPT_SERVER_LIST_REQUEST = 0x05, - RF_TPT_SERVER_LIST = 0x06, - RF_TPT_SERVER_LIST_END = 0x07, + RF_TPT_SERVER_LIST = 0x06, + RF_TPT_SERVER_LIST_END = 0x07, }; struct RF_TrackerHeader { - uint8_t unknown; // 0x06 + uint8_t unknown; // 0x06 uint16_t type; uint32_t seq; uint16_t packet_len; // Length of whole packet (with packet class) diff --git a/common/include/common/utils/enum-bitwise-operators.h b/common/include/common/utils/enum-bitwise-operators.h index ef469b0e1..95e61184a 100644 --- a/common/include/common/utils/enum-bitwise-operators.h +++ b/common/include/common/utils/enum-bitwise-operators.h @@ -7,51 +7,36 @@ #include template -struct EnableEnumBitwiseOperators : std::false_type {}; +struct EnableEnumBitwiseOperators : std::false_type +{}; template -typename std::enable_if::value, Enum>::type -operator |(Enum lhs, Enum rhs) +typename std::enable_if::value, Enum>::type operator|(Enum lhs, Enum rhs) { using underlying = typename std::underlying_type::type; - return static_cast ( - static_cast(lhs) | - static_cast(rhs) - ); + return static_cast(static_cast(lhs) | static_cast(rhs)); } template -typename std::enable_if::value, Enum>::type -operator &(Enum lhs, Enum rhs) +typename std::enable_if::value, Enum>::type operator&(Enum lhs, Enum rhs) { using underlying = typename std::underlying_type::type; - return static_cast ( - static_cast(lhs) & - static_cast(rhs) - ); + return static_cast(static_cast(lhs) & static_cast(rhs)); } template -typename std::enable_if::value, Enum>::type& -operator |=(Enum& lhs, Enum rhs) +typename std::enable_if::value, Enum>::type& operator|=(Enum& lhs, Enum rhs) { using underlying = typename std::underlying_type::type; - lhs = static_cast ( - static_cast(lhs) | - static_cast(rhs) - ); + lhs = static_cast(static_cast(lhs) | static_cast(rhs)); return lhs; } template -typename std::enable_if::value, Enum>::type& -operator &=(Enum& lhs, Enum rhs) +typename std::enable_if::value, Enum>::type& operator&=(Enum& lhs, Enum rhs) { using underlying = typename std::underlying_type::type; - lhs = static_cast ( - static_cast(lhs) & - static_cast(rhs) - ); + lhs = static_cast(static_cast(lhs) & static_cast(rhs)); return lhs; } diff --git a/common/include/common/utils/list-utils.h b/common/include/common/utils/list-utils.h index d82f696af..9e71108bf 100644 --- a/common/include/common/utils/list-utils.h +++ b/common/include/common/utils/list-utils.h @@ -21,9 +21,7 @@ class SinglyLinkedList using iterator_category = std::forward_iterator_tag; using difference_type = int; - Iterator(pointer first) : - current(first), first(first) - {} + Iterator(pointer first) : current(first), first(first) {} self_type operator++() { @@ -57,8 +55,7 @@ class SinglyLinkedList } }; - SinglyLinkedList(T*& list) : m_list(list) - {} + SinglyLinkedList(T*& list) : m_list(list) {} Iterator begin() { @@ -89,9 +86,7 @@ class DoublyLinkedList using iterator_category = std::forward_iterator_tag; using difference_type = int; - Iterator(pointer current) : - current(current) - {} + Iterator(pointer current) : current(current) {} self_type operator++() { @@ -125,8 +120,7 @@ class DoublyLinkedList } }; - DoublyLinkedList(T& list) : m_list(list) - {} + DoublyLinkedList(T& list) : m_list(list) {} Iterator begin() { diff --git a/common/include/common/utils/mem-pool.h b/common/include/common/utils/mem-pool.h index 22a5f56c7..58c0803f3 100644 --- a/common/include/common/utils/mem-pool.h +++ b/common/include/common/utils/mem-pool.h @@ -3,7 +3,7 @@ #include #include -template +template class MemPool { using Slot = typename std::aligned_storage::type; diff --git a/common/include/common/utils/perf-utils.h b/common/include/common/utils/perf-utils.h index 927c1f197..0a5d3b275 100644 --- a/common/include/common/utils/perf-utils.h +++ b/common/include/common/utils/perf-utils.h @@ -11,8 +11,7 @@ struct PerfAggregator unsigned total_duration_us_ = 0; static std::vector> instances_; - PerfAggregator(std::string&& name) : name_(name) - {} + PerfAggregator(std::string&& name) : name_(name) {} public: static PerfAggregator& create(std::string&& name) diff --git a/common/include/common/utils/string-utils.h b/common/include/common/utils/string-utils.h index bb013c1ea..5157006aa 100644 --- a/common/include/common/utils/string-utils.h +++ b/common/include/common/utils/string-utils.h @@ -8,7 +8,7 @@ #include #ifdef __GNUC__ -#define PRINTF_FMT_ATTRIBUTE(fmt_idx, va_idx) __attribute__ ((format (printf, fmt_idx, va_idx))) +#define PRINTF_FMT_ATTRIBUTE(fmt_idx, va_idx) __attribute__((format(printf, fmt_idx, va_idx))) #else #define PRINTF_FMT_ATTRIBUTE(fmt_idx, va_idx) #endif @@ -45,9 +45,10 @@ inline std::string string_to_lower(std::string_view str) inline bool string_equals_ignore_case(std::string_view left, std::string_view right) { - return left.size() == right.size() && std::equal(left.begin(), left.end(), right.begin(), [](unsigned char a, unsigned char b) { - return std::tolower(a) == std::tolower(b); - }); + return left.size() == right.size() && + std::equal(left.begin(), left.end(), right.begin(), [](unsigned char a, unsigned char b) { + return std::tolower(a) == std::tolower(b); + }); } inline bool string_starts_with(std::string_view str, std::string_view prefix) @@ -82,14 +83,15 @@ inline bool string_contains(std::string_view str, std::string_view infix) inline bool string_contains_ignore_case(std::string_view str, std::string_view infix) { - std::string_view::iterator it = std::search(str.begin(), str.end(), - infix.begin(), infix.end(), [](unsigned char a, unsigned char b) { - return std::tolower(a) == std::tolower(b); - }); + std::string_view::iterator it = + std::search(str.begin(), str.end(), infix.begin(), infix.end(), [](unsigned char a, unsigned char b) { + return std::tolower(a) == std::tolower(b); + }); return it != str.end(); } -inline std::string string_replace(const std::string_view& str, const std::string_view& search, const std::string_view& replacement) +inline std::string +string_replace(const std::string_view& str, const std::string_view& search, const std::string_view& replacement) { std::size_t pos = 0; std::string result{str}; @@ -180,4 +182,3 @@ inline std::string_view get_ext_from_filename(std::string_view filename) } return filename.substr(dot_pos + 1); } - diff --git a/common/include/common/version/version.h b/common/include/common/version/version.h index 8c520adcd..ad5804afb 100644 --- a/common/include/common/version/version.h +++ b/common/include/common/version/version.h @@ -24,15 +24,15 @@ // clang-format on #if VERSION_TYPE == VERSION_TYPE_DEV -#define VERSION_SUFFIX "-dev" +#define VERSION_SUFFIX "-dev" #elif VERSION_TYPE == VERSION_TYPE_ALPHA -#define VERSION_SUFFIX "-alpha" TOSTRING(VERSION_TYPE_REVISION) +#define VERSION_SUFFIX "-alpha" TOSTRING(VERSION_TYPE_REVISION) #elif VERSION_TYPE == VERSION_TYPE_BETA -#define VERSION_SUFFIX "-beta" TOSTRING(VERSION_TYPE_REVISION) +#define VERSION_SUFFIX "-beta" TOSTRING(VERSION_TYPE_REVISION) #elif VERSION_TYPE == VERSION_TYPE_RC -#define VERSION_SUFFIX "-rc" TOSTRING(VERSION_TYPE_REVISION) +#define VERSION_SUFFIX "-rc" TOSTRING(VERSION_TYPE_REVISION) #elif VERSION_TYPE == VERSION_TYPE_RELEASE -#define VERSION_SUFFIX "" +#define VERSION_SUFFIX "" #else #error Unknown version type #endif diff --git a/common/src/HttpRequest.cpp b/common/src/HttpRequest.cpp index 18dfb49c5..c0b4c82e2 100644 --- a/common/src/HttpRequest.cpp +++ b/common/src/HttpRequest.cpp @@ -53,22 +53,25 @@ HttpSession::HttpSession(const char* user_agent) void HttpSession::set_connect_timeout(unsigned long timeout_ms) { - if (!InternetSetOptionA(m_inet, INTERNET_OPTION_CONNECT_TIMEOUT, const_cast(&timeout_ms), - sizeof(timeout_ms))) + if (!InternetSetOptionA( + m_inet, INTERNET_OPTION_CONNECT_TIMEOUT, const_cast(&timeout_ms), sizeof(timeout_ms) + )) THROW_WIN32_ERROR(); } void HttpSession::set_send_timeout(unsigned long timeout_ms) { - if (!InternetSetOptionA(m_inet, INTERNET_OPTION_SEND_TIMEOUT, const_cast(&timeout_ms), - sizeof(timeout_ms))) + if (!InternetSetOptionA( + m_inet, INTERNET_OPTION_SEND_TIMEOUT, const_cast(&timeout_ms), sizeof(timeout_ms) + )) THROW_WIN32_ERROR(); } void HttpSession::set_receive_timeout(unsigned long timeout_ms) { - if (!InternetSetOptionA(m_inet, INTERNET_OPTION_RECEIVE_TIMEOUT, const_cast(&timeout_ms), - sizeof(timeout_ms))) + if (!InternetSetOptionA( + m_inet, INTERNET_OPTION_RECEIVE_TIMEOUT, const_cast(&timeout_ms), sizeof(timeout_ms) + )) THROW_WIN32_ERROR(); } @@ -142,8 +145,7 @@ void HttpRequest::send(std::string_view body) DWORD dw_size = sizeof(DWORD); DWORD status_code; - if (!HttpQueryInfoA(m_req, HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER, &status_code, &dw_size, - nullptr)) { + if (!HttpQueryInfoA(m_req, HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER, &status_code, &dw_size, nullptr)) { THROW_WIN32_ERROR(); } @@ -203,7 +205,8 @@ std::string encode_uri_component(std::string_view value) for (char c : value) { if (is_uri_reserved_char(c)) { std::format_to(std::back_inserter(result), "%{:02X}", static_cast(c)); - } else { + } + else { result += c; } } diff --git a/common/src/config/GameConfig.cpp b/common/src/config/GameConfig.cpp index abaceaeb4..3972597a8 100644 --- a/common/src/config/GameConfig.cpp +++ b/common/src/config/GameConfig.cpp @@ -19,14 +19,17 @@ unsigned GameConfig::max_fps_limit = 240u; const char fallback_executable_path[] = R"(C:\games\RedFaction\rf.exe)"; -bool GameConfig::load() try -{ - bool result = visit_vars([](RegKey& reg_key, const char* name, auto& var) { - auto value_temp = var.value(); - bool read_success = reg_key.read_value(name, &value_temp); - var = value_temp; - return read_success; - }, false); +bool GameConfig::load() +try { + bool result = visit_vars( + [](RegKey& reg_key, const char* name, auto& var) { + auto value_temp = var.value(); + bool read_success = reg_key.read_value(name, &value_temp); + var = value_temp; + return read_success; + }, + false + ); if (game_executable_path.value().empty() && !detect_game_path()) { game_executable_path = fallback_executable_path; @@ -44,15 +47,18 @@ catch (...) { std::throw_with_nested(std::runtime_error("failed to load config")); } -void GameConfig::save() try -{ - visit_vars([](RegKey& reg_key, const char* name, auto& var) { - if (var.is_dirty()) { - reg_key.write_value(name, var.value()); - var.set_dirty(false); - } - return true; - }, true); +void GameConfig::save() +try { + visit_vars( + [](RegKey& reg_key, const char* name, auto& var) { + if (var.is_dirty()) { + reg_key.write_value(name, var.value()); + var.set_dirty(false); + } + return true; + }, + true + ); } catch (...) { std::throw_with_nested(std::runtime_error("failed to save config")); @@ -63,61 +69,53 @@ bool GameConfig::detect_game_path() std::string install_path; // Standard RF installer - try - { + try { RegKey reg_key(HKEY_LOCAL_MACHINE, rf_key_name, KEY_READ); - if (reg_key.read_value("InstallPath", &install_path)) - { + if (reg_key.read_value("InstallPath", &install_path)) { game_executable_path = install_path + "\\RF.exe"; return true; } } - catch (...) - { + catch (...) { // ignore } // Steam - try - { + try { BOOL Wow64Process = FALSE; IsWow64Process(GetCurrentProcess(), &Wow64Process); REGSAM reg_sam = KEY_READ; if (Wow64Process) { reg_sam |= KEY_WOW64_64KEY; } - RegKey reg_key(HKEY_LOCAL_MACHINE, R"(SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Steam App 20530)", reg_sam); - if (reg_key.read_value("InstallLocation", &install_path)) - { + RegKey reg_key( + HKEY_LOCAL_MACHINE, R"(SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Steam App 20530)", reg_sam + ); + if (reg_key.read_value("InstallLocation", &install_path)) { game_executable_path = install_path + "\\RF.exe"; return true; } } - catch (...) - { + catch (...) { // ignore } // GOG - try - { + try { RegKey reg_key(HKEY_LOCAL_MACHINE, "SOFTWARE\\Nordic Games\\Red Faction", KEY_READ); - if (reg_key.read_value("INSTALL_DIR", &install_path)) - { + if (reg_key.read_value("INSTALL_DIR", &install_path)) { game_executable_path = install_path + "\\RF.exe"; return true; } } - catch (...) - { + catch (...) { // ignore } char current_dir[MAX_PATH]; GetCurrentDirectoryA(sizeof(current_dir), current_dir); std::string full_path = std::string(current_dir) + "\\RF.exe"; - if (PathFileExistsA(full_path.c_str())) - { + if (PathFileExistsA(full_path.c_str())) { game_executable_path = full_path; return true; } @@ -190,15 +188,13 @@ bool GameConfig::visit_vars(T&& visitor, bool is_save) template<> bool is_valid_enum_value(int value) { - return value == GameConfig::FULLSCREEN - || value == GameConfig::WINDOWED - || value == GameConfig::STRETCHED; + return value == GameConfig::FULLSCREEN || value == GameConfig::WINDOWED || value == GameConfig::STRETCHED; } template<> bool is_valid_enum_value(int value) { - return value == static_cast(GameConfig::Renderer::d3d8) - || value == static_cast(GameConfig::Renderer::d3d9) - || value == static_cast(GameConfig::Renderer::d3d11); + return value == static_cast(GameConfig::Renderer::d3d8) || + value == static_cast(GameConfig::Renderer::d3d9) || + value == static_cast(GameConfig::Renderer::d3d11); } diff --git a/common/src/error/d3d-error.cpp b/common/src/error/d3d-error.cpp index 4b5631eaa..6436d9215 100644 --- a/common/src/error/d3d-error.cpp +++ b/common/src/error/d3d-error.cpp @@ -2,7 +2,10 @@ #include #include -#define DEFINE_HRESULT_ERROR(hr) {hr, #hr} +#define DEFINE_HRESULT_ERROR(hr) \ + { \ + hr, #hr \ + } // clang-format off const static std::map DX_ERRORS = { diff --git a/common/src/utils/os-utils.cpp b/common/src/utils/os-utils.cpp index 9f42f77a2..fa26ed242 100644 --- a/common/src/utils/os-utils.cpp +++ b/common/src/utils/os-utils.cpp @@ -49,18 +49,19 @@ std::string get_real_os_version() THROW_WIN32_ERROR("VerQueryValueA returned unknown block"); auto* file_info = static_cast(block); - return std::format("{}.{}.{}", - HIWORD(file_info->dwProductVersionMS), - LOWORD(file_info->dwProductVersionMS), - HIWORD(file_info->dwProductVersionLS)); + return std::format( + "{}.{}.{}", HIWORD(file_info->dwProductVersionMS), LOWORD(file_info->dwProductVersionMS), + HIWORD(file_info->dwProductVersionLS) + ); } std::optional get_wine_version() { HMODULE ntdll_handle = GetModuleHandleA("ntdll.dll"); // Note: double cast is needed to fix cast-function-type GCC warning - auto* wine_get_version = reinterpret_cast(reinterpret_cast( - GetProcAddress(ntdll_handle, "wine_get_version"))); + auto* wine_get_version = reinterpret_cast( + reinterpret_cast(GetProcAddress(ntdll_handle, "wine_get_version")) + ); if (!wine_get_version) return {}; const char* ver = wine_get_version(); @@ -71,8 +72,9 @@ bool is_current_user_admin() { SID_IDENTIFIER_AUTHORITY nt_authority = SECURITY_NT_AUTHORITY; PSID administrators_group; - BOOL ret = AllocateAndInitializeSid(&nt_authority, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, - 0, 0, 0, &administrators_group); + BOOL ret = AllocateAndInitializeSid( + &nt_authority, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &administrators_group + ); if (!ret) { xlog::error("AllocateAndInitializeSid failed"); return false; @@ -104,14 +106,14 @@ const char* get_process_elevation_type() CloseHandle(token_handle); switch (elevation_type) { - case TokenElevationTypeDefault: - return "default"; - case TokenElevationTypeFull: - return "full"; - case TokenElevationTypeLimited: - return "limited"; - default: - return "unknown"; + case TokenElevationTypeDefault: + return "default"; + case TokenElevationTypeFull: + return "full"; + case TokenElevationTypeLimited: + return "limited"; + default: + return "unknown"; } } @@ -123,11 +125,10 @@ std::string get_cpu_id() #else __cpuid(1, cpu_info[0], cpu_info[1], cpu_info[2], cpu_info[3]); #endif - return std::format("{:08X} {:08X} {:08X} {:08X}", - static_cast(cpu_info[0]), - static_cast(cpu_info[1]), - static_cast(cpu_info[2]), - static_cast(cpu_info[3])); + return std::format( + "{:08X} {:08X} {:08X} {:08X}", static_cast(cpu_info[0]), static_cast(cpu_info[1]), + static_cast(cpu_info[2]), static_cast(cpu_info[3]) + ); } std::string get_cpu_brand() diff --git a/crash_handler/AdditionalInfoDlg.h b/crash_handler/AdditionalInfoDlg.h index 02c2ddb8b..684d1767f 100644 --- a/crash_handler/AdditionalInfoDlg.h +++ b/crash_handler/AdditionalInfoDlg.h @@ -10,11 +10,7 @@ class AdditionalInfoDlg : public CDialog std::optional m_info; public: - AdditionalInfoDlg(std::optional info) : - CDialog(IDD_ADDITIONAL_INFO), - m_info(info) - { - } + AdditionalInfoDlg(std::optional info) : CDialog(IDD_ADDITIONAL_INFO), m_info(info) {} std::optional GetInfo() const { diff --git a/crash_handler/CrashReportApp.cpp b/crash_handler/CrashReportApp.cpp index 2a33a92cb..5b86c6a13 100644 --- a/crash_handler/CrashReportApp.cpp +++ b/crash_handler/CrashReportApp.cpp @@ -24,7 +24,9 @@ int CrashReportApp::Run() Win32xx::LoadCommonControls(); // Create the report - ProgressDlg prepare_report_dlg("Preparing crash report... Please wait.", [&, this]() { PrepareReport(cmd_line_info); }); + ProgressDlg prepare_report_dlg("Preparing crash report... Please wait.", [&, this]() { + PrepareReport(cmd_line_info); + }); prepare_report_dlg.DoModal(); prepare_report_dlg.ThrowIfError(); @@ -44,15 +46,17 @@ int CrashReportApp::Run() ProgressDlg send_report_dlg("Sending crash report... Please wait.", [this]() { SendReport(); }); send_report_dlg.DoModal(); send_report_dlg.ThrowIfError(); - Message(nullptr, "Crash report has been sent. Thank you!", nullptr, - MB_ICONINFORMATION | MB_OK | MB_SETFOREGROUND | MB_TASKMODAL); + Message( + nullptr, "Crash report has been sent. Thank you!", nullptr, + MB_ICONINFORMATION | MB_OK | MB_SETFOREGROUND | MB_TASKMODAL + ); } return 0; } -void CrashReportApp::ArchiveReport(const char* crash_dump_filename, const char* exc_info_filename) try -{ +void CrashReportApp::ArchiveReport(const char* crash_dump_filename, const char* exc_info_filename) +try { std::string output_dir = m_config.output_dir; CreateDirectoryA(output_dir.c_str(), nullptr); @@ -61,16 +65,14 @@ void CrashReportApp::ArchiveReport(const char* crash_dump_filename, const char* zip.add_file(crash_dump_filename, "minidump.dmp"); zip.add_file(exc_info_filename, "exception.txt"); const char* log_file_name = "app.log"; - const char* last_slash_ptr = std::max( - std::strrchr(m_config.log_file, '\\'), - std::strrchr(m_config.log_file, '/') - ); + const char* last_slash_ptr = std::max(std::strrchr(m_config.log_file, '\\'), std::strrchr(m_config.log_file, '/')); if (last_slash_ptr) { log_file_name = last_slash_ptr + 1; } try { zip.add_file(m_config.log_file, log_file_name); - } catch (...) { + } + catch (...) { // log file may not exist yet - ignore exception } zip.close(); @@ -100,8 +102,8 @@ std::string CrashReportApp::GetArchivedReportFilePath() const return archive_path_name; } -void CrashReportApp::PrepareReport(const CommandLineInfo& cmd_line_info) try -{ +void CrashReportApp::PrepareReport(const CommandLineInfo& cmd_line_info) +try { auto* exception_ptrs = cmd_line_info.GetExceptionPtrs(); HANDLE process_handle = cmd_line_info.GetProcessHandle(); auto thread_id = cmd_line_info.GetThreadId(); @@ -141,8 +143,8 @@ catch (...) { std::throw_with_nested(std::runtime_error("failed to prepare crash report")); } -void CrashReportApp::SendReport() const try -{ +void CrashReportApp::SendReport() const +try { auto file_path = GetArchivedReportFilePath(); std::ifstream file(file_path, std::ios_base::in | std::ios_base::binary); if (!file) @@ -168,7 +170,7 @@ catch (...) { std::throw_with_nested(std::runtime_error("failed to send crash report")); } -int CrashReportApp::Message(HWND hwnd, const char *text, const char *title, int flags) +int CrashReportApp::Message(HWND hwnd, const char* text, const char* title, int flags) { if (GetSystemMetrics(SM_CMONITORS) > 0) { return MessageBoxA(hwnd, text, title, flags); diff --git a/crash_handler/CrashReportApp.h b/crash_handler/CrashReportApp.h index f51413143..116d364da 100644 --- a/crash_handler/CrashReportApp.h +++ b/crash_handler/CrashReportApp.h @@ -15,7 +15,7 @@ class CrashReportApp : public CWinApp void PrepareReport(const CommandLineInfo& cmd_line_info); void ArchiveReport(const char* crash_dump_filename, const char* exc_info_filename); void SendReport() const; - static int Message(HWND hwnd, const char *pszText, const char *pszTitle, int Flags); + static int Message(HWND hwnd, const char* pszText, const char* pszTitle, int Flags); CrashHandlerConfig m_config; }; diff --git a/crash_handler/MainDlg.cpp b/crash_handler/MainDlg.cpp index 9c7e0f07b..384b7c07d 100644 --- a/crash_handler/MainDlg.cpp +++ b/crash_handler/MainDlg.cpp @@ -7,9 +7,7 @@ #include #include "res/resource.h" -MainDlg::MainDlg() : CDialog(IDD_MAIN) -{ -} +MainDlg::MainDlg() : CDialog(IDD_MAIN) {} BOOL MainDlg::OnInitDialog() { @@ -52,21 +50,20 @@ INT_PTR MainDlg::DialogProc(UINT msg, WPARAM wparam, LPARAM lparam) return CDialog::DialogProc(msg, wparam, lparam); } -LRESULT MainDlg::OnNotify([[ maybe_unused ]] WPARAM wparam, LPARAM lparam) +LRESULT MainDlg::OnNotify([[maybe_unused]] WPARAM wparam, LPARAM lparam) { auto& nmhdr = *reinterpret_cast(lparam); - switch (nmhdr.code) - { - case NM_CLICK: - // Fall through to the next case. - case NM_RETURN: - if (nmhdr.idFrom == IDC_OPEN_REPORT) { - OpenArchivedReport(); - } - else if (nmhdr.idFrom == IDC_ADDITIONAL_INFO) { - OpenAdditionalInfoDlg(); - } - break; + switch (nmhdr.code) { + case NM_CLICK: + // Fall through to the next case. + case NM_RETURN: + if (nmhdr.idFrom == IDC_OPEN_REPORT) { + OpenArchivedReport(); + } + else if (nmhdr.idFrom == IDC_ADDITIONAL_INFO) { + OpenAdditionalInfoDlg(); + } + break; } return 0; } diff --git a/crash_handler/MiniDumpHelper.cpp b/crash_handler/MiniDumpHelper.cpp index c33a08aa7..8cf393b2d 100644 --- a/crash_handler/MiniDumpHelper.cpp +++ b/crash_handler/MiniDumpHelper.cpp @@ -23,8 +23,8 @@ bool MiniDumpHelper::is_data_section_needed(const WCHAR* module_name) return false; } -BOOL CALLBACK MiniDumpHelper::mini_dump_callback(PVOID param, const PMINIDUMP_CALLBACK_INPUT input, - PMINIDUMP_CALLBACK_OUTPUT output) +BOOL CALLBACK +MiniDumpHelper::mini_dump_callback(PVOID param, const PMINIDUMP_CALLBACK_INPUT input, PMINIDUMP_CALLBACK_OUTPUT output) { auto* that = reinterpret_cast(param); @@ -34,46 +34,48 @@ BOOL CALLBACK MiniDumpHelper::mini_dump_callback(PVOID param, const PMINIDUMP_CA // Process the callbacks switch (input->CallbackType) { - case IncludeModuleCallback: - case IncludeThreadCallback: - case ThreadCallback: - case ThreadExCallback: - // Include the module into the dump - // Include the thread into the dump - // Include all thread information into the minidump - return TRUE; - - case ModuleCallback: - // Are data sections available for this module ? - if (output->ModuleWriteFlags & ModuleWriteDataSeg) { - // Yes, they are, but do we need them? - if (!that->is_data_section_needed(input->Module.FullPath)) { - // wprintf(L"Excluding module data sections: %s \n", Input->Module.FullPath); - output->ModuleWriteFlags &= (~ModuleWriteDataSeg); + case IncludeModuleCallback: + case IncludeThreadCallback: + case ThreadCallback: + case ThreadExCallback: + // Include the module into the dump + // Include the thread into the dump + // Include all thread information into the minidump + return TRUE; + + case ModuleCallback: + // Are data sections available for this module ? + if (output->ModuleWriteFlags & ModuleWriteDataSeg) { + // Yes, they are, but do we need them? + if (!that->is_data_section_needed(input->Module.FullPath)) { + // wprintf(L"Excluding module data sections: %s \n", Input->Module.FullPath); + output->ModuleWriteFlags &= (~ModuleWriteDataSeg); + } } - } - return TRUE; + return TRUE; - case MemoryCallback: - // We do not include any information here -> return FALSE - return FALSE; + case MemoryCallback: + // We do not include any information here -> return FALSE + return FALSE; - case CancelCallback: - break; + case CancelCallback: + break; } return FALSE; } -bool MiniDumpHelper::write_dump(const char* path, PEXCEPTION_POINTERS exception_pointers, HANDLE process, - DWORD thread_id) +bool MiniDumpHelper::write_dump( + const char* path, PEXCEPTION_POINTERS exception_pointers, HANDLE process, DWORD thread_id +) { if (!m_MiniDumpWriteDump) return false; HANDLE file = nullptr; - file = CreateFileA(path, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, nullptr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, - nullptr); + file = CreateFileA( + path, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, nullptr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr + ); if (INVALID_HANDLE_VALUE == file) { std::string s = std::format("Error {}! CreateFile failed when writing a Minidump.", GetLastError()); @@ -98,9 +100,9 @@ bool MiniDumpHelper::write_dump(const char* path, PEXCEPTION_POINTERS exception_ else if (m_info_level == 1) // medium information { dump_type = static_cast( - MiniDumpWithPrivateReadWriteMemory | MiniDumpIgnoreInaccessibleMemory | - MiniDumpWithDataSegs | MiniDumpWithHandleData | MiniDumpWithFullMemoryInfo | - MiniDumpWithThreadInfo | MiniDumpWithUnloadedModules); + MiniDumpWithPrivateReadWriteMemory | MiniDumpIgnoreInaccessibleMemory | MiniDumpWithDataSegs | + MiniDumpWithHandleData | MiniDumpWithFullMemoryInfo | MiniDumpWithThreadInfo | MiniDumpWithUnloadedModules + ); callback_info.CallbackRoutine = (MINIDUMP_CALLBACK_ROUTINE)mini_dump_callback; callback_info.CallbackParam = this; @@ -109,9 +111,9 @@ bool MiniDumpHelper::write_dump(const char* path, PEXCEPTION_POINTERS exception_ else if (m_info_level == 2) // Maximal information { dump_type = static_cast( - MiniDumpWithFullMemory | MiniDumpWithFullMemoryInfo | MiniDumpWithHandleData | - MiniDumpWithThreadInfo | MiniDumpWithUnloadedModules | - MiniDumpWithIndirectlyReferencedMemory); + MiniDumpWithFullMemory | MiniDumpWithFullMemoryInfo | MiniDumpWithHandleData | MiniDumpWithThreadInfo | + MiniDumpWithUnloadedModules | MiniDumpWithIndirectlyReferencedMemory + ); callback_info_ptr = nullptr; } @@ -119,7 +121,8 @@ bool MiniDumpHelper::write_dump(const char* path, PEXCEPTION_POINTERS exception_ auto process_id = GetProcessId(process); BOOL result = m_MiniDumpWriteDump(process, process_id, file, dump_type, &exc_info, nullptr, callback_info_ptr); if (!result) { - std::string s = std::format("MiniDumpWriteDump {} {} {} failed with error {}", process_id, thread_id, file, GetLastError()); + std::string s = + std::format("MiniDumpWriteDump {} {} {} failed with error {}", process_id, thread_id, file, GetLastError()); CRASHHANDLER_ERR(s.c_str()); // ERROR_INVALID_PARAMETER? } @@ -127,8 +130,7 @@ bool MiniDumpHelper::write_dump(const char* path, PEXCEPTION_POINTERS exception_ return result != FALSE; } -MiniDumpHelper::MiniDumpHelper() : - m_dbghelp_lib{L"Dbghelp.dll"} +MiniDumpHelper::MiniDumpHelper() : m_dbghelp_lib{L"Dbghelp.dll"} { if (m_dbghelp_lib) { m_MiniDumpWriteDump = m_dbghelp_lib.get_proc_address("MiniDumpWriteDump"); diff --git a/crash_handler/MiniDumpHelper.h b/crash_handler/MiniDumpHelper.h index b9cb01ca4..778092d9f 100644 --- a/crash_handler/MiniDumpHelper.h +++ b/crash_handler/MiniDumpHelper.h @@ -42,6 +42,6 @@ class MiniDumpHelper private: bool is_data_section_needed(const WCHAR* module_name); - static BOOL CALLBACK mini_dump_callback(PVOID param, const PMINIDUMP_CALLBACK_INPUT input, - PMINIDUMP_CALLBACK_OUTPUT output); + static BOOL CALLBACK + mini_dump_callback(PVOID param, const PMINIDUMP_CALLBACK_INPUT input, PMINIDUMP_CALLBACK_OUTPUT output); }; diff --git a/crash_handler/ProcessMemoryCache.h b/crash_handler/ProcessMemoryCache.h index 82ed60d45..482ef63e9 100644 --- a/crash_handler/ProcessMemoryCache.h +++ b/crash_handler/ProcessMemoryCache.h @@ -45,8 +45,9 @@ class ProcessMemoryCache if (it == m_page_cache.end()) { SIZE_T bytes_read; auto page_buf = std::make_unique(m_page_size / sizeof(uint32_t)); - bool read_success = ReadProcessMemory(m_process, reinterpret_cast(page_addr), page_buf.get(), - m_page_size, &bytes_read); + bool read_success = ReadProcessMemory( + m_process, reinterpret_cast(page_addr), page_buf.get(), m_page_size, &bytes_read + ); if (!read_success || !bytes_read) { return nullptr; } diff --git a/crash_handler/ProgressDlg.h b/crash_handler/ProgressDlg.h index 5baff717e..4dab1fca0 100644 --- a/crash_handler/ProgressDlg.h +++ b/crash_handler/ProgressDlg.h @@ -19,8 +19,7 @@ class ProgressDlg : public CDialog public: ProgressDlg(const std::string title, std::function callback) : CDialog(IDD_PROGRESS), m_title(title), m_callback(callback) - { - } + {} std::optional GetError() const { @@ -56,13 +55,12 @@ class ProgressDlg : public CDialog m_thread = std::thread{&ProgressDlg::ThreadProc, this}; } - void ThreadProc() try - { + void ThreadProc() + try { m_callback(); PostMessage(WM_CLOSE, 0, 0); } - catch (std::exception& e) - { + catch (std::exception& e) { m_error = generate_message_for_exception(e); PostMessage(WM_CLOSE, 0, 0); } diff --git a/crash_handler/TextDumpHelper.h b/crash_handler/TextDumpHelper.h index 4d014173a..6b9a5885d 100644 --- a/crash_handler/TextDumpHelper.h +++ b/crash_handler/TextDumpHelper.h @@ -12,7 +12,8 @@ #include #include "ProcessMemoryCache.h" -class TextDumpHelper { +class TextDumpHelper +{ private: SYSTEM_INFO m_sys_info; std::vector m_memory_map; @@ -28,7 +29,8 @@ class TextDumpHelper { std::vector m_modules; public: - TextDumpHelper(HANDLE process) : m_mem_cache(process) { + TextDumpHelper(HANDLE process) : m_mem_cache(process) + { GetSystemInfo(&m_sys_info); } @@ -116,7 +118,8 @@ class TextDumpHelper { out << " ExceptionFlags = " << std::format("{:08X}", exc_rec.ExceptionFlags) << "\n"; out << " ExceptionAddress = " << std::format("{}", exc_rec.ExceptionAddress) << "\n"; for (unsigned i = 0; i < exc_rec.NumberParameters; ++i) - out << " ExceptionInformation[" << i << "] = " << std::format("{:08X}", exc_rec.ExceptionInformation[i]) << "\n"; + out << " ExceptionInformation[" << i << "] = " << std::format("{:08X}", exc_rec.ExceptionInformation[i]) + << "\n"; out << std::endl; } @@ -144,10 +147,12 @@ class TextDumpHelper { void write_memory_map(std::ostream& out) { out << "Memory map:\n"; - for (auto& mbi: m_memory_map) { - out << std::format("{}: State {:08X} Protect {:08X} Type {:08X} RegionSize {:08X}\n", - mbi.BaseAddress, mbi.State, mbi.Protect, mbi.Type, mbi.RegionSize); - //out << std::format(" AllocBase {:x} AllocProtect {:x}\n", mbi.AllocationBase, mbi.AllocationProtect); + for (auto& mbi : m_memory_map) { + out << std::format( + "{}: State {:08X} Protect {:08X} Type {:08X} RegionSize {:08X}\n", mbi.BaseAddress, mbi.State, + mbi.Protect, mbi.Type, mbi.RegionSize + ); + // out << std::format(" AllocBase {:x} AllocProtect {:x}\n", mbi.AllocationBase, mbi.AllocationProtect); } out << std::endl; } @@ -162,10 +167,8 @@ class TextDumpHelper { return false; } auto protect = mem_map_it->Protect; - return protect == PAGE_EXECUTE - || protect == PAGE_EXECUTE_READ - || protect == PAGE_EXECUTE_READWRITE - || protect == PAGE_EXECUTE_WRITECOPY; + return protect == PAGE_EXECUTE || protect == PAGE_EXECUTE_READ || protect == PAGE_EXECUTE_READWRITE || + protect == PAGE_EXECUTE_WRITECOPY; } void write_ebp_based_backtrace(std::ostream& out, const CONTEXT& ctx) @@ -220,7 +223,8 @@ class TextDumpHelper { size_t stack_size = stack_max_addr - addr; auto stack_buf = std::make_unique(stack_size / sizeof(uint32_t)); - bool read_success = ReadProcessMemory(process, reinterpret_cast(addr), stack_buf.get(), stack_size, &bytes_read); + bool read_success = + ReadProcessMemory(process, reinterpret_cast(addr), stack_buf.get(), stack_size, &bytes_read); if (!read_success || !bytes_read) { out << "(error " << GetLastError() << ")\n\n"; return; @@ -330,7 +334,8 @@ class TextDumpHelper { out << "Stack dump:\n"; auto buf = std::make_unique(stack_size / sizeof(uint32_t)); - bool read_success = ReadProcessMemory(process, reinterpret_cast(addr), buf.get(), stack_size, &bytes_read); + bool read_success = + ReadProcessMemory(process, reinterpret_cast(addr), buf.get(), stack_size, &bytes_read); if (!read_success || !bytes_read) { out << "(error " << GetLastError() << ")\n\n"; return; diff --git a/crash_handler/ZipHelper.h b/crash_handler/ZipHelper.h index d88681dfa..e286dc74f 100644 --- a/crash_handler/ZipHelper.h +++ b/crash_handler/ZipHelper.h @@ -33,7 +33,8 @@ class ZipHelper zip_fileinfo zfi{}; get_file_time(path, &zfi.tmz_date, &zfi.dosDate); - int err = zipOpenNewFileInZip(m_zf, name_in_zip, &zfi, NULL, 0, NULL, 0, NULL, Z_DEFLATED, Z_DEFAULT_COMPRESSION); + int err = + zipOpenNewFileInZip(m_zf, name_in_zip, &zfi, NULL, 0, NULL, 0, NULL, Z_DEFLATED, Z_DEFAULT_COMPRESSION); if (err != ZIP_OK) throw std::runtime_error("zipOpenNewFileInZip failed"); @@ -57,7 +58,8 @@ class ZipHelper { zip_fileinfo zfi{}; - int err = zipOpenNewFileInZip(m_zf, name_in_zip, &zfi, NULL, 0, NULL, 0, NULL, Z_DEFLATED, Z_DEFAULT_COMPRESSION); + int err = + zipOpenNewFileInZip(m_zf, name_in_zip, &zfi, NULL, 0, NULL, 0, NULL, Z_DEFLATED, Z_DEFAULT_COMPRESSION); if (err != ZIP_OK) throw std::runtime_error("zipOpenNewFileInZip failed"); diff --git a/crash_handler/main.cpp b/crash_handler/main.cpp index 9eac9a2d7..fc7471419 100644 --- a/crash_handler/main.cpp +++ b/crash_handler/main.cpp @@ -2,8 +2,8 @@ #include #include -int APIENTRY WinMain(HINSTANCE, HINSTANCE, LPSTR, int) try -{ +int APIENTRY WinMain(HINSTANCE, HINSTANCE, LPSTR, int) +try { // Start Win32++ CrashReportApp app; @@ -11,8 +11,7 @@ int APIENTRY WinMain(HINSTANCE, HINSTANCE, LPSTR, int) try return app.Run(); // NOLINT(clang-analyzer-core.StackAddressEscape) } // catch all unhandled CException types -catch (const Win32xx::CException &e) -{ +catch (const Win32xx::CException& e) { // Display the exception and quit std::string msg = std::format("{}\nerror {}: {}", e.GetText(), e.GetError(), e.GetErrorString()); MessageBox(nullptr, msg.c_str(), nullptr, MB_ICONERROR | MB_OK); diff --git a/crash_handler/res/resource.h b/crash_handler/res/resource.h index 2fbf62795..7d79517d4 100644 --- a/crash_handler/res/resource.h +++ b/crash_handler/res/resource.h @@ -2,15 +2,15 @@ #define IDC_STATIC (-1) #endif -#define IDD_MAIN 101 -#define IDD_PROGRESS 109 -#define IDD_ADDITIONAL_INFO 111 -#define IDB_HDR_PIC 113 -#define IDC_ADDITIONAL_INFO_EDIT 40000 -#define IDC_OPEN_REPORT 40000 -#define IDC_PROGRESS_BAR 40000 -#define IDC_ADDITIONAL_INFO 40001 -#define IDC_TITLE 40002 -#define IDC_HEADER_BACKGROUND 40003 -#define IDC_HEADER_TEXT 40004 -#define IDC_HEADER_PIC 40006 +#define IDD_MAIN 101 +#define IDD_PROGRESS 109 +#define IDD_ADDITIONAL_INFO 111 +#define IDB_HDR_PIC 113 +#define IDC_ADDITIONAL_INFO_EDIT 40000 +#define IDC_OPEN_REPORT 40000 +#define IDC_PROGRESS_BAR 40000 +#define IDC_ADDITIONAL_INFO 40001 +#define IDC_TITLE 40002 +#define IDC_HEADER_BACKGROUND 40003 +#define IDC_HEADER_TEXT 40004 +#define IDC_HEADER_PIC 40006 diff --git a/crash_handler_stub/WatchDogTimer.cpp b/crash_handler_stub/WatchDogTimer.cpp index b680cc5d8..b0ccc415d 100644 --- a/crash_handler_stub/WatchDogTimer.cpp +++ b/crash_handler_stub/WatchDogTimer.cpp @@ -23,8 +23,7 @@ class WatchDogTimer::Impl bool m_running = false; public: - Impl(std::chrono::milliseconds timeout) : m_timeout(timeout) - {} + Impl(std::chrono::milliseconds timeout) : m_timeout(timeout) {} void start() { @@ -33,8 +32,10 @@ class WatchDogTimer::Impl return; } - if (!DuplicateHandle(GetCurrentProcess(), GetCurrentThread(), GetCurrentProcess(), &m_observed_thread_handle, 0, - FALSE, DUPLICATE_SAME_ACCESS)) { + if (!DuplicateHandle( + GetCurrentProcess(), GetCurrentThread(), GetCurrentProcess(), &m_observed_thread_handle, 0, FALSE, + DUPLICATE_SAME_ACCESS + )) { xlog::warn("DuplicateHandle failed"); } m_observed_thread_id = GetCurrentThreadId(); @@ -96,7 +97,8 @@ class WatchDogTimer::Impl crash_observed_thread(); } else { - xlog::info("Process is not responding! Hold the Alt key for a few seconds to kill the process and generate a crash report that will allow to debug the problem..."); + xlog::info("Process is not responding! Hold the Alt key for a few seconds to kill the process and generate " + "a crash report that will allow to debug the problem..."); } } @@ -125,11 +127,11 @@ class WatchDogTimer::Impl } }; -WatchDogTimer::WatchDogTimer(unsigned timeout_ms) : m_impl(new WatchDogTimer::Impl(std::chrono::milliseconds{timeout_ms})) -{ -} +WatchDogTimer::WatchDogTimer(unsigned timeout_ms) : + m_impl(new WatchDogTimer::Impl(std::chrono::milliseconds{timeout_ms})) +{} -WatchDogTimer::~WatchDogTimer() +WatchDogTimer::~WatchDogTimer() { if (is_running()) { stop(); diff --git a/crash_handler_stub/crash_handler_stub.cpp b/crash_handler_stub/crash_handler_stub.cpp index 6d9493424..8274603ba 100644 --- a/crash_handler_stub/crash_handler_stub.cpp +++ b/crash_handler_stub/crash_handler_stub.cpp @@ -13,8 +13,10 @@ static CrashHandlerConfig g_config; void CrashHandlerStubProcessException(PEXCEPTION_POINTERS exception_ptrs, DWORD thread_id) { - xlog::error("Unhandled exception: ExceptionAddress=0x{} ExceptionCode=0x{:x}", - exception_ptrs->ExceptionRecord->ExceptionAddress, exception_ptrs->ExceptionRecord->ExceptionCode); + xlog::error( + "Unhandled exception: ExceptionAddress=0x{} ExceptionCode=0x{:x}", + exception_ptrs->ExceptionRecord->ExceptionAddress, exception_ptrs->ExceptionRecord->ExceptionCode + ); for (unsigned i = 0; i < exception_ptrs->ExceptionRecord->NumberParameters; ++i) xlog::error("ExceptionInformation[{}]=0x{:x}", i, exception_ptrs->ExceptionRecord->ExceptionInformation[i]); xlog::flush(); @@ -22,8 +24,10 @@ void CrashHandlerStubProcessException(PEXCEPTION_POINTERS exception_ptrs, DWORD HANDLE process_handle = nullptr; HANDLE event_handle = nullptr; do { - if (!DuplicateHandle(GetCurrentProcess(), GetCurrentProcess(), GetCurrentProcess(), &process_handle, 0, TRUE, - DUPLICATE_SAME_ACCESS)) + if (!DuplicateHandle( + GetCurrentProcess(), GetCurrentProcess(), GetCurrentProcess(), &process_handle, 0, TRUE, + DUPLICATE_SAME_ACCESS + )) break; SECURITY_ATTRIBUTES sec_attribs = {sizeof(sec_attribs), nullptr, TRUE}; @@ -36,13 +40,20 @@ void CrashHandlerStubProcessException(PEXCEPTION_POINTERS exception_ptrs, DWORD startup_info.cb = sizeof(startup_info); WCHAR cmd_line[256]; - std::swprintf(cmd_line, std::size(cmd_line), L"%ls\\CrashHandler.exe 0x%p 0x%p %lu 0x%p 0x%p", g_module_path, - exception_ptrs, process_handle, thread_id, event_handle, &g_config); + std::swprintf( + cmd_line, std::size(cmd_line), L"%ls\\CrashHandler.exe 0x%p 0x%p %lu 0x%p 0x%p", g_module_path, + exception_ptrs, process_handle, thread_id, event_handle, &g_config + ); xlog::infof("Running crash handler: %ls", cmd_line); PROCESS_INFORMATION proc_info; - if (!CreateProcessW(nullptr, cmd_line, nullptr, nullptr, TRUE, 0, nullptr, nullptr, &startup_info, &proc_info)) { - xlog::errorf("Failed to start CrashHandler process - CreateProcessW %ls failed with error %lu", cmd_line, GetLastError()); + if (!CreateProcessW( + nullptr, cmd_line, nullptr, nullptr, TRUE, 0, nullptr, nullptr, &startup_info, &proc_info + )) { + xlog::errorf( + "Failed to start CrashHandler process - CreateProcessW %ls failed with error %lu", cmd_line, + GetLastError() + ); break; } @@ -64,8 +75,10 @@ static LONG WINAPI CrashHandlerExceptionFilter(PEXCEPTION_POINTERS exception_ptr return g_old_exception_filter ? g_old_exception_filter(exception_ptrs) : EXCEPTION_EXECUTE_HANDLER; } -static void InvalidParameterHandler(const wchar_t* expression, const wchar_t* function, const wchar_t* file, - unsigned line, [[maybe_unused]] uintptr_t reserved) +static void InvalidParameterHandler( + const wchar_t* expression, const wchar_t* function, const wchar_t* file, unsigned line, + [[maybe_unused]] uintptr_t reserved +) { xlog::errorf("Invalid parameter detected in function %ls. File: %ls Line: %d", function, file, line); xlog::errorf("Expression: %ls", expression); diff --git a/crash_handler_stub/include/crash_handler_stub/custom_exceptions.h b/crash_handler_stub/include/crash_handler_stub/custom_exceptions.h index 4a6cecc39..1a318cabc 100644 --- a/crash_handler_stub/include/crash_handler_stub/custom_exceptions.h +++ b/crash_handler_stub/include/crash_handler_stub/custom_exceptions.h @@ -3,7 +3,7 @@ // Custom exception codes namespace custom_exceptions { - constexpr DWORD abort = 0xE0000001; + constexpr DWORD abort = 0xE0000001; constexpr DWORD invalid_parameter = 0xE0000002; - constexpr DWORD unresponsive = 0xE0000003; + constexpr DWORD unresponsive = 0xE0000003; } diff --git a/editor_patch/exports.h b/editor_patch/exports.h index 8dc2e82b6..10ac8bc12 100644 --- a/editor_patch/exports.h +++ b/editor_patch/exports.h @@ -8,14 +8,13 @@ // Note: DLL_EXPORT macro is used by pthread.h header in MinGW... #ifdef BUILD_DLL - #define DF_DLL_EXPORT __declspec(dllexport) +#define DF_DLL_EXPORT __declspec(dllexport) #else - #define DF_DLL_EXPORT __declspec(dllimport) +#define DF_DLL_EXPORT __declspec(dllimport) #endif #ifdef __cplusplus -extern "C" -{ +extern "C" { #endif DWORD DF_DLL_EXPORT Init(void* unused); @@ -23,4 +22,3 @@ DWORD DF_DLL_EXPORT Init(void* unused); #ifdef __cplusplus } #endif - diff --git a/editor_patch/graphics.cpp b/editor_patch/graphics.cpp index 694565918..a447e91a7 100644 --- a/editor_patch/graphics.cpp +++ b/editor_patch/graphics.cpp @@ -100,53 +100,51 @@ CodeInjection after_gr_init_hook{ CodeInjection gr_d3d_line_3d_patch_1{ 0x004E133E, [](auto& regs) { - bool flush_needed = !red::gr_d3d_buffers_locked - || red::gr_d3d_primitive_type != D3DPT_LINELIST - || red::gr_d3d_max_hw_vertex + 2 > 6000 - || red::gr_d3d_max_hw_index + red::gr_d3d_num_indices + 2 > 10000; + bool flush_needed = !red::gr_d3d_buffers_locked || red::gr_d3d_primitive_type != D3DPT_LINELIST || + red::gr_d3d_max_hw_vertex + 2 > 6000 || + red::gr_d3d_max_hw_index + red::gr_d3d_num_indices + 2 > 10000; if (!flush_needed) { xlog::trace("Skipping gr_d3d_prepare_buffers"); regs.eip = 0x004E1343; } else { - xlog::trace("Line drawing requires gr_d3d_prepare_buffers {} {} {} {}", - red::gr_d3d_buffers_locked, red::gr_d3d_primitive_type, red::gr_d3d_max_hw_vertex, - red::gr_d3d_max_hw_index + red::gr_d3d_num_indices); + xlog::trace( + "Line drawing requires gr_d3d_prepare_buffers {} {} {} {}", red::gr_d3d_buffers_locked, + red::gr_d3d_primitive_type, red::gr_d3d_max_hw_vertex, + red::gr_d3d_max_hw_index + red::gr_d3d_num_indices + ); } }, }; CallHook gr_d3d_line_3d_patch_2{ 0x004E1528, - []() { - red::gr_d3d_num_vertices += 2; - }, + []() { red::gr_d3d_num_vertices += 2; }, }; CodeInjection gr_d3d_line_2d_patch_1{ 0x004E10BD, [](auto& regs) { - bool flush_needed = !red::gr_d3d_buffers_locked - || red::gr_d3d_primitive_type != D3DPT_LINELIST - || red::gr_d3d_max_hw_vertex + 2 > 6000 - || red::gr_d3d_max_hw_index + red::gr_d3d_num_indices + 2 > 10000; + bool flush_needed = !red::gr_d3d_buffers_locked || red::gr_d3d_primitive_type != D3DPT_LINELIST || + red::gr_d3d_max_hw_vertex + 2 > 6000 || + red::gr_d3d_max_hw_index + red::gr_d3d_num_indices + 2 > 10000; if (!flush_needed) { xlog::trace("Skipping gr_d3d_prepare_buffers"); regs.eip = 0x004E10C2; } else { - xlog::trace("Line drawing requires gr_d3d_prepare_buffers {} {} {} {}", - red::gr_d3d_buffers_locked, red::gr_d3d_primitive_type, red::gr_d3d_max_hw_vertex, - red::gr_d3d_max_hw_index + red::gr_d3d_num_indices); + xlog::trace( + "Line drawing requires gr_d3d_prepare_buffers {} {} {} {}", red::gr_d3d_buffers_locked, + red::gr_d3d_primitive_type, red::gr_d3d_max_hw_vertex, + red::gr_d3d_max_hw_index + red::gr_d3d_num_indices + ); } }, }; CallHook gr_d3d_line_2d_patch_2{ 0x004E11F2, - []() { - red::gr_d3d_num_vertices += 2; - }, + []() { red::gr_d3d_num_vertices += 2; }, }; CodeInjection gr_d3d_poly_patch{ @@ -196,18 +194,19 @@ CodeInjection gr_d3d_render_geometry_face_patch_2{ CallHook gr_init_hook{ 0x00482B78, - [](int max_w, int max_h, int bit_depth, int mode, int window_mode, HWND hwnd, float far_zvalue, bool sync_blit, int video_card, D3DFORMAT backbuffer_format) { + [](int max_w, int max_h, int bit_depth, int mode, int window_mode, HWND hwnd, float far_zvalue, bool sync_blit, + int video_card, D3DFORMAT backbuffer_format) { max_w = GetSystemMetrics(SM_CXSCREEN); max_h = GetSystemMetrics(SM_CYSCREEN); - gr_init_hook.call_target(max_w, max_h, bit_depth, mode, window_mode, hwnd, far_zvalue, sync_blit, video_card, backbuffer_format); + gr_init_hook.call_target( + max_w, max_h, bit_depth, mode, window_mode, hwnd, far_zvalue, sync_blit, video_card, backbuffer_format + ); }, }; CodeInjection gr_init_widescreen_patch{ 0x004B8CD1, - []() { - red::gr_screen.aspect = 1.0f; - }, + []() { red::gr_screen.aspect = 1.0f; }, }; FunHook gr_setup_3d_hook{ @@ -227,7 +226,7 @@ FunHook gr_setup_3d_hook{ horizontal_fov = h_fov_rad / pi * 180.0f; // Clamp the value to avoid artifacts when view is very stretched horizontal_fov = std::clamp(horizontal_fov, 60.0f, 120.0f); - //xlog::info("fov {}", horizontal_fov); + // xlog::info("fov {}", horizontal_fov); } gr_setup_3d_hook.call_target(viewer_orient, viewer_pos, horizontal_fov, zbuffer_flag, z_scale); }, @@ -271,8 +270,8 @@ void ApplyGraphicsPatches() #if D3D_HW_VERTEX_PROCESSING // Use hardware vertex processing instead of software processing write_mem(0x004EC73E + 1, D3DCREATE_HARDWARE_VERTEXPROCESSING); - write_mem(0x004EBC3D + 1, D3DUSAGE_DYNAMIC|D3DUSAGE_DONOTCLIP|D3DUSAGE_WRITEONLY); - write_mem(0x004EBC77 + 1, D3DUSAGE_DYNAMIC|D3DUSAGE_DONOTCLIP|D3DUSAGE_WRITEONLY); + write_mem(0x004EBC3D + 1, D3DUSAGE_DYNAMIC | D3DUSAGE_DONOTCLIP | D3DUSAGE_WRITEONLY); + write_mem(0x004EBC77 + 1, D3DUSAGE_DYNAMIC | D3DUSAGE_DONOTCLIP | D3DUSAGE_WRITEONLY); #endif // Avoid flushing D3D buffers in GrSetColorRgba diff --git a/editor_patch/main.cpp b/editor_patch/main.cpp index df36add39..107baf2c4 100644 --- a/editor_patch/main.cpp +++ b/editor_patch/main.cpp @@ -34,13 +34,12 @@ static auto& g_main_frame = addr_as_ref(0x006F9E68); static auto& LogDlg_Append = addr_as_ref(0x00444980); - -void *GetMainFrame() +void* GetMainFrame() { return struct_field_ref(g_editor_app, 0xC8); } -void *GetLogDlg() +void* GetLogDlg() { return struct_field_ref(GetMainFrame(), 692); } @@ -64,7 +63,7 @@ CodeInjection CMainFrame_PreCreateWindow_injection{ 0x0044713C, [](auto& regs) { auto& cs = addr_as_ref(regs.eax); - cs.style |= WS_MAXIMIZEBOX|WS_THICKFRAME; + cs.style |= WS_MAXIMIZEBOX | WS_THICKFRAME; cs.dwExStyle |= WS_EX_ACCEPTFILES; }, }; @@ -73,7 +72,7 @@ CodeInjection CEditorApp_InitInstance_additional_file_paths_injection{ 0x0048290D, []() { // Load v3m files from more localizations instead of only VPP packfiles - auto file_add_path = addr_as_ref(0x004C3950); + auto file_add_path = addr_as_ref(0x004C3950); file_add_path("red\\meshes", ".v3m .vfx", false); file_add_path("user_maps\\meshes", ".v3m .vfx", false); }, @@ -127,7 +126,8 @@ CodeInjection CDialog_DoModal_injection{ }, }; -HMENU WINAPI LoadMenuA_new(HINSTANCE hInstance, LPCSTR lpMenuName) { +HMENU WINAPI LoadMenuA_new(HINSTANCE hInstance, LPCSTR lpMenuName) +{ HMENU result = LoadMenuA(g_module, lpMenuName); if (!result) { result = LoadMenuA(hInstance, lpMenuName); @@ -135,7 +135,8 @@ HMENU WINAPI LoadMenuA_new(HINSTANCE hInstance, LPCSTR lpMenuName) { return result; } -HICON WINAPI LoadIconA_new(HINSTANCE hInstance, LPCSTR lpIconName) { +HICON WINAPI LoadIconA_new(HINSTANCE hInstance, LPCSTR lpIconName) +{ HICON result = LoadIconA(g_module, lpIconName); if (!result) { result = LoadIconA(hInstance, lpIconName); @@ -143,7 +144,8 @@ HICON WINAPI LoadIconA_new(HINSTANCE hInstance, LPCSTR lpIconName) { return result; } -HACCEL WINAPI LoadAcceleratorsA_new(HINSTANCE hInstance, LPCSTR lpTableName) { +HACCEL WINAPI LoadAcceleratorsA_new(HINSTANCE hInstance, LPCSTR lpTableName) +{ HACCEL result = LoadAcceleratorsA(g_module, lpTableName); if (!result) { result = LoadAcceleratorsA(hInstance, lpTableName); @@ -191,16 +193,15 @@ void __fastcall brush_mode_handle_selection_new(void* self) g_skip_wnd_set_text = false; // TODO: print LogDlg_Append(GetLogDlg(), ""); - } FunHook brush_mode_handle_selection_hook{0x0043F430, brush_mode_handle_selection_new}; -void __fastcall DedLight_UpdateLevelLight(void *this_); +void __fastcall DedLight_UpdateLevelLight(void* this_); FunHook DedLight_UpdateLevelLight_hook{ 0x00453200, DedLight_UpdateLevelLight, }; -void __fastcall DedLight_UpdateLevelLight(void *this_) +void __fastcall DedLight_UpdateLevelLight(void* this_) { auto& this_is_enabled = struct_field_ref(this_, 0xD5); auto& level_light = struct_field_ref(this_, 0xD8); @@ -210,12 +211,16 @@ void __fastcall DedLight_UpdateLevelLight(void *this_) } struct CTextureBrowserDialog; -rf::String * __fastcall CTextureBrowserDialog_GetFolderName(CTextureBrowserDialog *this_, int edx, rf::String *folder_name); +rf::String* __fastcall CTextureBrowserDialog_GetFolderName( + CTextureBrowserDialog* this_, int edx, rf::String* folder_name +); FunHook CTextureBrowserDialog_GetFolderName_hook{ 0x00471260, CTextureBrowserDialog_GetFolderName, }; -rf::String * __fastcall CTextureBrowserDialog_GetFolderName(CTextureBrowserDialog *this_, int edx, rf::String *folder_name) +rf::String* __fastcall CTextureBrowserDialog_GetFolderName( + CTextureBrowserDialog* this_, int edx, rf::String* folder_name +) { auto& texture_browser_folder_index = addr_as_ref(0x006CA404); if (texture_browser_folder_index > 0) { @@ -247,12 +252,16 @@ void* GetLevelFromMainFrame(CWnd* main_frame) void CMainFrame_OpenHelp(CWnd* this_) { - ShellExecuteA(WndToHandle(this_), "open", "https://redfactionwiki.com/wiki/RF1_Editing_Main_Page", nullptr, nullptr, SW_SHOW); + ShellExecuteA( + WndToHandle(this_), "open", "https://redfactionwiki.com/wiki/RF1_Editing_Main_Page", nullptr, nullptr, SW_SHOW + ); } void CMainFrame_OpenHotkeysHelp(CWnd* this_) { - ShellExecuteA(WndToHandle(this_), "open", "https://redfactionwiki.com/wiki/RED_Hotkey_Reference", nullptr, nullptr, SW_SHOW); + ShellExecuteA( + WndToHandle(this_), "open", "https://redfactionwiki.com/wiki/RED_Hotkey_Reference", nullptr, nullptr, SW_SHOW + ); } void CMainFrame_HideAllObjects(CWnd* this_) @@ -362,7 +371,7 @@ void ApplyTriggerPatches(); void LoadDashEditorPackfile() { - static auto& vpackfile_add = addr_as_ref(0x004CA930); + static auto& vpackfile_add = addr_as_ref(0x004CA930); static auto& root_path = addr_as_ref(0x0158CA10); auto df_dir = get_module_dir(g_module); @@ -376,9 +385,7 @@ void LoadDashEditorPackfile() CodeInjection vpackfile_init_injection{ 0x004CA533, - []() { - LoadDashEditorPackfile(); - }, + []() { LoadDashEditorPackfile(); }, }; CodeInjection CMainFrame_OnPlayLevelCmd_skip_level_dir_injection{ @@ -423,8 +430,8 @@ CodeInjection CDedEvent_Copy_injection{ CodeInjection texture_name_buffer_overflow_injection1{ 0x00445297, - [](auto ®s) { - const char *filename = regs.esi; + [](auto& regs) { + const char* filename = regs.esi; if (std::strlen(filename) > max_texture_name_len) { LogDlg_Append(GetLogDlg(), "Texture name too long: %s\n", filename); regs.eip = 0x00445273; @@ -434,8 +441,8 @@ CodeInjection texture_name_buffer_overflow_injection1{ CodeInjection texture_name_buffer_overflow_injection2{ 0x004703EC, - [](auto ®s) { - const char *filename = regs.ebp; + [](auto& regs) { + const char* filename = regs.ebp; if (std::strlen(filename) > max_texture_name_len) { LogDlg_Append(GetLogDlg(), "Texture name too long: %s\n", filename); regs.eip = 0x0047047F; @@ -521,13 +528,7 @@ extern "C" DWORD DF_DLL_EXPORT Init([[maybe_unused]] void* unused) // Especially add Rck_DefaultP.tga to default textures to fix error when packing a level containing a particle // emitter with default properties static const char* maps_files_names[] = { - "maps.txt", - "maps1.txt", - "maps2.txt", - "maps3.txt", - "maps4.txt", - "maps_df.txt", - nullptr, + "maps.txt", "maps1.txt", "maps2.txt", "maps3.txt", "maps4.txt", "maps_df.txt", nullptr, }; write_mem_ptr(0x0041B813 + 1, maps_files_names); write_mem_ptr(0x0041B824 + 1, maps_files_names); @@ -558,7 +559,9 @@ extern "C" DWORD DF_DLL_EXPORT Init([[maybe_unused]] void* unused) // Allow more decals before displaying a warning message about too many decals in the level write_mem(0x0041E2A9 + 2, 127); write_mem(0x0041E2BA + 2, 127); - write_mem_ptr(0x0041E2C6 + 1, "There are more than 127 decals in the level! It can result in a crash for older game clients."); + write_mem_ptr( + 0x0041E2C6 + 1, "There are more than 127 decals in the level! It can result in a crash for older game clients." + ); // Fix copying cutscene path node CDedLevel_CloneObject_injection.install(); @@ -574,15 +577,15 @@ extern "C" DWORD DF_DLL_EXPORT Init([[maybe_unused]] void* unused) texture_name_buffer_overflow_injection2.install(); // Increase face limit in g_boolean_find_all_pairs - static void *found_faces_a[0x10000]; - static void *found_faces_b[0x10000]; - write_mem_ptr(0x004A7290+3, found_faces_a); - write_mem_ptr(0x004A7158+1, found_faces_a); - write_mem_ptr(0x004A72E5+4, found_faces_a); - write_mem_ptr(0x004A717D+1, found_faces_b); - write_mem_ptr(0x004A71A6+1, found_faces_b); - write_mem_ptr(0x004A72A2+3, found_faces_b); - write_mem_ptr(0x004A72F9+1, found_faces_b); + static void* found_faces_a[0x10000]; + static void* found_faces_b[0x10000]; + write_mem_ptr(0x004A7290 + 3, found_faces_a); + write_mem_ptr(0x004A7158 + 1, found_faces_a); + write_mem_ptr(0x004A72E5 + 4, found_faces_a); + write_mem_ptr(0x004A717D + 1, found_faces_b); + write_mem_ptr(0x004A71A6 + 1, found_faces_b); + write_mem_ptr(0x004A72A2 + 3, found_faces_b); + write_mem_ptr(0x004A72F9 + 1, found_faces_b); return 1; // success } diff --git a/editor_patch/mfc_types.h b/editor_patch/mfc_types.h index 30bedd110..ca50445a9 100644 --- a/editor_patch/mfc_types.h +++ b/editor_patch/mfc_types.h @@ -7,10 +7,10 @@ struct CWnd; struct CDataExchange { - BOOL m_bSaveAndValidate; - CWnd* m_pDlgWnd; - HWND m_hWndLastControl; - BOOL m_bEditLastControl; + BOOL m_bSaveAndValidate; + CWnd* m_pDlgWnd; + HWND m_hWndLastControl; + BOOL m_bEditLastControl; }; struct CString diff --git a/editor_patch/resources.h b/editor_patch/resources.h index 8904b1e44..a9061f10c 100644 --- a/editor_patch/resources.h +++ b/editor_patch/resources.h @@ -10,32 +10,30 @@ #define IDC_TRIGGER_CLIENTSIDE 2001 #define IDC_TRIGGER_TELEPORT 2002 -#define ID_WIKI_EDITING_MAIN_PAGE 0x9000 -#define ID_WIKI_HOTKEYS 0x9001 -#define ID_SHOW_ALL_OBJECTS 0x9002 -#define ID_HIDE_ALL_OBJECTS 0x9003 -#define ID_HIDE_SELECTED 0x9004 -#define ID_SELECT_OBJECT_BY_UID 0x9005 -#define ID_INVERT_SELECTION 0x9006 - -#define ID_CREATE_LEVEL_PACKFILE 0x8083 +#define ID_WIKI_EDITING_MAIN_PAGE 0x9000 +#define ID_WIKI_HOTKEYS 0x9001 +#define ID_SHOW_ALL_OBJECTS 0x9002 +#define ID_HIDE_ALL_OBJECTS 0x9003 +#define ID_HIDE_SELECTED 0x9004 +#define ID_SELECT_OBJECT_BY_UID 0x9005 +#define ID_INVERT_SELECTION 0x9006 + +#define ID_CREATE_LEVEL_PACKFILE 0x8083 #define ID_CALCULATE_MAPS_AND_LIGHT 0x807A // MFC -#define ID_FILE_NEW 0xE100 -#define ID_FILE_OPEN 0xE101 -#define ID_FILE_CLOSE 0xE102 -#define ID_FILE_SAVE 0xE103 -#define ID_FILE_SAVE_AS 0xE104 -#define ID_FILE_MRU_FIRST 0xE110 -#define ID_EDIT_COPY 0xE122 -#define ID_EDIT_CUT 0xE123 -#define ID_EDIT_PASTE 0xE125 -#define ID_EDIT_UNDO 0xE12B -#define ID_EDIT_REDO 0xE12C -#define ID_APP_ABOUT 0xE140 -#define ID_APP_EXIT 0xE141 -#define ID_NEXT_PANE 0xE150 -#define ID_PREV_PANE 0xE151 - - +#define ID_FILE_NEW 0xE100 +#define ID_FILE_OPEN 0xE101 +#define ID_FILE_CLOSE 0xE102 +#define ID_FILE_SAVE 0xE103 +#define ID_FILE_SAVE_AS 0xE104 +#define ID_FILE_MRU_FIRST 0xE110 +#define ID_EDIT_COPY 0xE122 +#define ID_EDIT_CUT 0xE123 +#define ID_EDIT_PASTE 0xE125 +#define ID_EDIT_UNDO 0xE12B +#define ID_EDIT_REDO 0xE12C +#define ID_APP_ABOUT 0xE140 +#define ID_APP_EXIT 0xE141 +#define ID_NEXT_PANE 0xE150 +#define ID_PREV_PANE 0xE151 diff --git a/editor_patch/trigger.cpp b/editor_patch/trigger.cpp index d4e56db74..db438aa8f 100644 --- a/editor_patch/trigger.cpp +++ b/editor_patch/trigger.cpp @@ -14,7 +14,8 @@ constexpr uint8_t TRIGGER_CLIENT_SIDE = 0x2; constexpr uint8_t TRIGGER_SOLO = 0x4; constexpr uint8_t TRIGGER_TELEPORT = 0x8; -class TriggerCustomFlagsHelper { +class TriggerCustomFlagsHelper +{ HWND hwnd_; bool is_solo_ = false; bool is_clientside_ = false; @@ -71,7 +72,6 @@ class TriggerCustomFlagsHelper { new_script_name += script_name; SetDlgItemTextA(hwnd_, IDC_TRIGGER_SCRIPT_NAME, new_script_name.c_str()); } - } }; @@ -97,15 +97,8 @@ void __fastcall CTriggerPropsDialog_DoDataExchange_new(CWnd* this_, int, CDataEx } } - const char* activated_by_names[] = { - "Players Only", - "All Objects", - "Linked Objects", - "AI Only", - "Player Vehicle Only", - "Geomods", - "Undefined", + "Players Only", "All Objects", "Linked Objects", "AI Only", "Player Vehicle Only", "Geomods", "Undefined", }; CodeInjection CDedLevel_OpenTriggerProperties_injection{ @@ -130,7 +123,7 @@ CodeInjection CDedLevel_OpenTriggerProperties_injection{ } // Set Activated By to empty string if selected triggers have different configs - auto& activate_by_names = addr_as_ref(0x0057A910); + auto& activate_by_names = addr_as_ref(0x0057A910); auto& trigger_activated_by = struct_field_ref(current_trigger, 0xB8); auto& dialog_activated_by = struct_field_ref(trigger_dialog, 0x340); if (dialog_activated_by != activate_by_names[trigger_activated_by]) { diff --git a/game_patch/bmpman/bmpman.cpp b/game_patch/bmpman/bmpman.cpp index bffa2163c..189d747e7 100644 --- a/game_patch/bmpman/bmpman.cpp +++ b/game_patch/bmpman/bmpman.cpp @@ -72,49 +72,53 @@ bool bm_is_compressed_format(rf::bm::Format format) } FunHook -bm_read_header_hook{ - 0x0050FCB0, - [](const char* filename, int* width_out, int* height_out, rf::bm::Format *pixel_fmt_out, int *num_levels_out, - int *num_levels_external_mips_out, int *num_frames_out, int *fps_out, int *total_bytes_m2v_out, - int *vbm_ver_out, int a11) { - - *num_levels_external_mips_out = 1; - *num_levels_out = 1; - *fps_out = 0; - *num_frames_out = 1; - *total_bytes_m2v_out = -1; - *vbm_ver_out = 1; - - rf::File dds_file; - std::string filename_without_ext{get_filename_without_ext(filename)}; - auto dds_filename = filename_without_ext + ".dds"; - if (dds_file.open(dds_filename.c_str()) == 0) { - xlog::trace("Loading {}", dds_filename); - auto bm_type = read_dds_header(dds_file, width_out, height_out, pixel_fmt_out, num_levels_out); - if (bm_type != rf::bm::TYPE_NONE) { - return bm_type; + bm_read_header_hook{ + 0x0050FCB0, + [](const char* filename, int* width_out, int* height_out, rf::bm::Format* pixel_fmt_out, int* num_levels_out, + int* num_levels_external_mips_out, int* num_frames_out, int* fps_out, int* total_bytes_m2v_out, + int* vbm_ver_out, int a11) { + *num_levels_external_mips_out = 1; + *num_levels_out = 1; + *fps_out = 0; + *num_frames_out = 1; + *total_bytes_m2v_out = -1; + *vbm_ver_out = 1; + + rf::File dds_file; + std::string filename_without_ext{get_filename_without_ext(filename)}; + auto dds_filename = filename_without_ext + ".dds"; + if (dds_file.open(dds_filename.c_str()) == 0) { + xlog::trace("Loading {}", dds_filename); + auto bm_type = read_dds_header(dds_file, width_out, height_out, pixel_fmt_out, num_levels_out); + if (bm_type != rf::bm::TYPE_NONE) { + return bm_type; + } } - } - - xlog::trace("Loading bitmap header for '{}'", filename); - auto bm_type = bm_read_header_hook.call_target(filename, width_out, height_out, pixel_fmt_out, num_levels_out, - num_levels_external_mips_out, num_frames_out, fps_out, total_bytes_m2v_out, vbm_ver_out, a11); - xlog::trace("Bitmap header for '{}': type {} size {}x{} pixel_fmt {} levels {} frames {}", - filename, bm_type, *width_out, *height_out, *pixel_fmt_out, *num_levels_out, *num_frames_out); - // Sanity checks - // Prevents heap corruption when width = 0 or height = 0 - if (*width_out <= 0 || *height_out <= 0 || *pixel_fmt_out == rf::bm::FORMAT_NONE || *num_levels_out < 1 || *num_frames_out < 1) { - bm_type = rf::bm::TYPE_NONE; - } + xlog::trace("Loading bitmap header for '{}'", filename); + auto bm_type = bm_read_header_hook.call_target( + filename, width_out, height_out, pixel_fmt_out, num_levels_out, num_levels_external_mips_out, + num_frames_out, fps_out, total_bytes_m2v_out, vbm_ver_out, a11 + ); + xlog::trace( + "Bitmap header for '{}': type {} size {}x{} pixel_fmt {} levels {} frames {}", filename, bm_type, + *width_out, *height_out, *pixel_fmt_out, *num_levels_out, *num_frames_out + ); + + // Sanity checks + // Prevents heap corruption when width = 0 or height = 0 + if (*width_out <= 0 || *height_out <= 0 || *pixel_fmt_out == rf::bm::FORMAT_NONE || *num_levels_out < 1 || + *num_frames_out < 1) { + bm_type = rf::bm::TYPE_NONE; + } - if (bm_type == rf::bm::TYPE_NONE) { - xlog::warn("Failed load bitmap header for '{}'", filename); - } + if (bm_type == rf::bm::TYPE_NONE) { + xlog::warn("Failed load bitmap header for '{}'", filename); + } - return bm_type; - }, -}; + return bm_type; + }, + }; FunHook bm_lock_hook{ 0x00510780, diff --git a/game_patch/bmpman/bmpman.h b/game_patch/bmpman/bmpman.h index 6a248065c..cd7981ef9 100644 --- a/game_patch/bmpman/bmpman.h +++ b/game_patch/bmpman/bmpman.h @@ -9,9 +9,10 @@ bool bm_is_dynamic(int bm_handle); void bm_change_format(int bm_handle, rf::bm::Format format); void bm_apply_patch(); bool bm_is_compressed_format(rf::bm::Format format); -bool bm_convert_format(void* dst_bits_ptr, rf::bm::Format dst_fmt, const void* src_bits_ptr, - rf::bm::Format src_fmt, int width, int height, int dst_pitch, int src_pitch, - const uint8_t* palette = nullptr); +bool bm_convert_format( + void* dst_bits_ptr, rf::bm::Format dst_fmt, const void* src_bits_ptr, rf::bm::Format src_fmt, int width, int height, + int dst_pitch, int src_pitch, const uint8_t* palette = nullptr +); rf::Color bm_get_pixel(uint8_t* data, rf::bm::Format format, int stride_in_bytes, int x, int y); size_t bm_calculate_total_bytes(int w, int h, rf::bm::Format format); int bm_calculate_pitch(int w, rf::bm::Format format); @@ -20,20 +21,20 @@ int bm_calculate_rows(int h, rf::bm::Format format); inline int bm_bytes_per_pixel(rf::bm::Format format) { switch (format) { - case rf::bm::FORMAT_8_PALETTED: - case rf::bm::FORMAT_8_ALPHA: - return 1; - case rf::bm::FORMAT_565_RGB: - case rf::bm::FORMAT_4444_ARGB: - case rf::bm::FORMAT_1555_ARGB: - return 2; - case rf::bm::FORMAT_888_RGB: - return 3; - case rf::bm::FORMAT_8888_ARGB: - return 4; - default: - xlog::warn("Unknown format in bm_bytes_per_pixel: {}", static_cast(format)); - return 2; + case rf::bm::FORMAT_8_PALETTED: + case rf::bm::FORMAT_8_ALPHA: + return 1; + case rf::bm::FORMAT_565_RGB: + case rf::bm::FORMAT_4444_ARGB: + case rf::bm::FORMAT_1555_ARGB: + return 2; + case rf::bm::FORMAT_888_RGB: + return 3; + case rf::bm::FORMAT_8888_ARGB: + return 4; + default: + xlog::warn("Unknown format in bm_bytes_per_pixel: {}", static_cast(format)); + return 2; } } diff --git a/game_patch/bmpman/dds.cpp b/game_patch/bmpman/dds.cpp index f4970e87b..1e16c012a 100644 --- a/game_patch/bmpman/dds.cpp +++ b/game_patch/bmpman/dds.cpp @@ -45,8 +45,8 @@ rf::bm::Format get_bm_format_from_dds_pixel_format(DDS_PIXELFORMAT& ddspf) return rf::bm::FORMAT_NONE; } -rf::bm::Type read_dds_header(rf::File& file, int *width_out, int *height_out, rf::bm::Format *format_out, - int *num_levels_out) +rf::bm::Type +read_dds_header(rf::File& file, int* width_out, int* height_out, rf::bm::Format* format_out, int* num_levels_out) { auto magic = file.read(); if (magic != DDS_MAGIC) { diff --git a/game_patch/bmpman/dds.h b/game_patch/bmpman/dds.h index 83f56b8ae..821c088b7 100644 --- a/game_patch/bmpman/dds.h +++ b/game_patch/bmpman/dds.h @@ -2,6 +2,6 @@ #include "../rf/bmpman.h" -rf::bm::Type read_dds_header(rf::File& file, int *width_out, int *height_out, rf::bm::Format *format_out, - int *num_levels_out); +rf::bm::Type +read_dds_header(rf::File& file, int* width_out, int* height_out, rf::bm::Format* format_out, int* num_levels_out); int lock_dds_bitmap(rf::bm::BitmapEntry& bm_entry); diff --git a/game_patch/bmpman/fmt_conv.cpp b/game_patch/bmpman/fmt_conv.cpp index d9ec3aed0..99c7ee8d2 100644 --- a/game_patch/bmpman/fmt_conv.cpp +++ b/game_patch/bmpman/fmt_conv.cpp @@ -11,9 +11,10 @@ #include "../bmpman/bmpman.h" #include "../bmpman/fmt_conv_templates.h" -bool bm_convert_format(void* dst_bits_ptr, rf::bm::Format dst_fmt, const void* src_bits_ptr, - rf::bm::Format src_fmt, int width, int height, int dst_pitch, int src_pitch, - const uint8_t* palette) +bool bm_convert_format( + void* dst_bits_ptr, rf::bm::Format dst_fmt, const void* src_bits_ptr, rf::bm::Format src_fmt, int width, int height, + int dst_pitch, int src_pitch, const uint8_t* palette +) { #if DEBUG_PERF static auto& color_conv_perf = PerfAggregator::create("bm_convert_format"); @@ -23,9 +24,12 @@ bool bm_convert_format(void* dst_bits_ptr, rf::bm::Format dst_fmt, const void* s call_with_format(src_fmt, [=](auto s) { call_with_format(dst_fmt, [=](auto d) { SurfacePixelFormatConverter conv{ - src_bits_ptr, dst_bits_ptr, - static_cast(src_pitch), static_cast(dst_pitch), - static_cast(width), static_cast(height), + src_bits_ptr, + dst_bits_ptr, + static_cast(src_pitch), + static_cast(dst_pitch), + static_cast(width), + static_cast(height), palette, }; conv(); @@ -34,7 +38,10 @@ bool bm_convert_format(void* dst_bits_ptr, rf::bm::Format dst_fmt, const void* s return true; } catch (const std::exception& e) { - xlog::error("Pixel format conversion failed ({} -> {}): {}", static_cast(src_fmt), static_cast(dst_fmt), e.what()); + xlog::error( + "Pixel format conversion failed ({} -> {}): {}", static_cast(src_fmt), static_cast(dst_fmt), + e.what() + ); return false; } } @@ -58,10 +65,8 @@ rf::Color bm_get_pixel(uint8_t* data, rf::bm::Format format, int stride_in_bytes PixelsReader rdr{ptr}; PixelColor color = rdr.read(); result.set( - static_cast(color.r.value), - static_cast(color.g.value), - static_cast(color.b.value), - static_cast(color.a.value) + static_cast(color.r.value), static_cast(color.g.value), + static_cast(color.b.value), static_cast(color.a.value) ); }); return result; diff --git a/game_patch/bmpman/fmt_conv_templates.h b/game_patch/bmpman/fmt_conv_templates.h index 451579584..dc57d6ea1 100644 --- a/game_patch/bmpman/fmt_conv_templates.h +++ b/game_patch/bmpman/fmt_conv_templates.h @@ -49,8 +49,9 @@ struct ColorChannelConverter { constexpr ColorChannel operator()(ColorChannel src) { - return {(src.value * ColorChannel::max + ColorChannel::max / 2) - / ColorChannel::max}; + return { + (src.value * ColorChannel::max + ColorChannel::max / 2) / ColorChannel::max + }; } }; @@ -109,9 +110,9 @@ struct PixelFormatTrait using PaletteEntry = void; using Alpha = ChannelBitOffsetTrait<8, 24>; - using Red = ChannelBitOffsetTrait<8, 16>; + using Red = ChannelBitOffsetTrait<8, 16>; using Green = ChannelBitOffsetTrait<8, 8>; - using Blue = ChannelBitOffsetTrait<8, 0>; + using Blue = ChannelBitOffsetTrait<8, 0>; }; template<> @@ -121,9 +122,9 @@ struct PixelFormatTrait using PaletteEntry = void; using Alpha = ChannelIndexTrait<0, 0>; - using Red = ChannelIndexTrait<8, 2>; + using Red = ChannelIndexTrait<8, 2>; using Green = ChannelIndexTrait<8, 1>; - using Blue = ChannelIndexTrait<8, 0>; + using Blue = ChannelIndexTrait<8, 0>; }; template<> @@ -133,9 +134,9 @@ struct PixelFormatTrait using PaletteEntry = void; using Alpha = ChannelBitOffsetTrait<1, 15>; - using Red = ChannelBitOffsetTrait<5, 10>; + using Red = ChannelBitOffsetTrait<5, 10>; using Green = ChannelBitOffsetTrait<5, 5>; - using Blue = ChannelBitOffsetTrait<5, 0>; + using Blue = ChannelBitOffsetTrait<5, 0>; }; template<> @@ -145,9 +146,9 @@ struct PixelFormatTrait using PaletteEntry = void; using Alpha = ChannelBitOffsetTrait<0, 0>; - using Red = ChannelBitOffsetTrait<5, 11>; + using Red = ChannelBitOffsetTrait<5, 11>; using Green = ChannelBitOffsetTrait<6, 5>; - using Blue = ChannelBitOffsetTrait<5, 0>; + using Blue = ChannelBitOffsetTrait<5, 0>; }; template<> @@ -157,9 +158,9 @@ struct PixelFormatTrait using PaletteEntry = void; using Alpha = ChannelBitOffsetTrait<4, 12>; - using Red = ChannelBitOffsetTrait<4, 8>; + using Red = ChannelBitOffsetTrait<4, 8>; using Green = ChannelBitOffsetTrait<4, 4>; - using Blue = ChannelBitOffsetTrait<4, 0>; + using Blue = ChannelBitOffsetTrait<4, 0>; }; template<> @@ -169,9 +170,9 @@ struct PixelFormatTrait using PaletteEntry = void; using Alpha = ChannelBitOffsetTrait<8, 0>; - using Red = ChannelBitOffsetTrait<0, 0>; + using Red = ChannelBitOffsetTrait<0, 0>; using Green = ChannelBitOffsetTrait<0, 0>; - using Blue = ChannelBitOffsetTrait<0, 0>; + using Blue = ChannelBitOffsetTrait<0, 0>; }; template<> @@ -193,9 +194,9 @@ struct PixelFormatTrait using PaletteEntry = void; using Alpha = ChannelIndexTrait<0, 0>; - using Red = ChannelIndexTrait<8, 0>; + using Red = ChannelIndexTrait<8, 0>; using Green = ChannelIndexTrait<8, 1>; - using Blue = ChannelIndexTrait<8, 2>; + using Blue = ChannelIndexTrait<8, 2>; }; template<> @@ -205,9 +206,9 @@ struct PixelFormatTrait using PaletteEntry = void; using Alpha = ChannelTrait<1>; - using Red = ChannelBitOffsetTrait<5, 11>; + using Red = ChannelBitOffsetTrait<5, 11>; using Green = ChannelBitOffsetTrait<6, 5>; - using Blue = ChannelBitOffsetTrait<5, 0>; + using Blue = ChannelBitOffsetTrait<5, 0>; struct Block { @@ -223,9 +224,9 @@ struct PixelFormatTrait using PaletteEntry = void; using Alpha = ChannelTrait<4>; - using Red = ChannelBitOffsetTrait<5, 11>; + using Red = ChannelBitOffsetTrait<5, 11>; using Green = ChannelBitOffsetTrait<6, 5>; - using Blue = ChannelBitOffsetTrait<5, 0>; + using Blue = ChannelBitOffsetTrait<5, 0>; struct Block { @@ -242,9 +243,9 @@ struct PixelFormatTrait using PaletteEntry = void; using Alpha = ChannelTrait<8>; - using Red = ChannelBitOffsetTrait<5, 11>; + using Red = ChannelBitOffsetTrait<5, 11>; using Green = ChannelBitOffsetTrait<6, 5>; - using Blue = ChannelBitOffsetTrait<5, 0>; + using Blue = ChannelBitOffsetTrait<5, 0>; struct Block { @@ -294,7 +295,7 @@ template ColorChannel unpack_color_channel(T val) { if constexpr (CH::bits == 0) { - (void) val; // unused + (void)val; // unused return {0}; } else if constexpr (std::is_array_v) { @@ -341,18 +342,26 @@ class BlockDecoder auto lut_val = (block_->lut >> (index * 2)) & 3; if (c0_u16 > c1_u16) { switch (lut_val) { - case 0: return c0; - case 1: return c1; - case 2: return (c0 * 2 + c1) / 3; - case 3: return (c0 + c1 * 2) / 3; + case 0: + return c0; + case 1: + return c1; + case 2: + return (c0 * 2 + c1) / 3; + case 3: + return (c0 + c1 * 2) / 3; } } else { switch (lut_val) { - case 0: return c0; - case 1: return c1; - case 2: return (c0 + c1) / 2; - case 3: return {}; // transparent + case 0: + return c0; + case 1: + return c1; + case 2: + return (c0 + c1) / 2; + case 3: + return {}; // transparent } } // unreachable... @@ -385,10 +394,14 @@ class BlockDecoder auto c1 = unpack_color(block_->color[1]); auto lut_val = (block_->lut >> (index * 2)) & 3; switch (lut_val) { - case 0: return c0; - case 1: return c1; - case 2: return (c0 * 2 + c1) / 3; - case 3: return (c0 + c1 * 2) / 3; + case 0: + return c0; + case 1: + return c1; + case 2: + return (c0 * 2 + c1) / 3; + case 3: + return (c0 + c1 * 2) / 3; } // unreachable... return {}; @@ -418,32 +431,48 @@ class BlockDecoder { auto a0 = block_->alpha[0]; auto a1 = block_->alpha[1]; - auto alpha_lut_64 = static_cast(block_->alpha_lut[2]) << 32 - | (static_cast(block_->alpha_lut[1]) << 16) - | static_cast(block_->alpha_lut[0]); + auto alpha_lut_64 = static_cast(block_->alpha_lut[2]) << 32 | + (static_cast(block_->alpha_lut[1]) << 16) | + static_cast(block_->alpha_lut[0]); auto lut_val = (alpha_lut_64 >> (index * 3)) & 7; if (a0 > a1) { switch (lut_val) { - case 0: return {a0}; - case 1: return {a1}; - case 2: return {(6 * a0 + 1 * a1) / 7}; - case 3: return {(5 * a0 + 2 * a1) / 7}; - case 4: return {(4 * a0 + 3 * a1) / 7}; - case 5: return {(3 * a0 + 4 * a1) / 7}; - case 6: return {(2 * a0 + 5 * a1) / 7}; - case 7: return {(1 * a0 + 6 * a1) / 7}; + case 0: + return {a0}; + case 1: + return {a1}; + case 2: + return {(6 * a0 + 1 * a1) / 7}; + case 3: + return {(5 * a0 + 2 * a1) / 7}; + case 4: + return {(4 * a0 + 3 * a1) / 7}; + case 5: + return {(3 * a0 + 4 * a1) / 7}; + case 6: + return {(2 * a0 + 5 * a1) / 7}; + case 7: + return {(1 * a0 + 6 * a1) / 7}; } } else { switch (lut_val) { - case 0: return {a0}; - case 1: return {a1}; - case 2: return {(4 * a0 + 1 * a1) / 5}; - case 3: return {(3 * a0 + 2 * a1) / 5}; - case 4: return {(2 * a0 + 3 * a1) / 5}; - case 5: return {(1 * a0 + 4 * a1) / 5}; - case 6: return {0}; - case 7: return {255}; + case 0: + return {a0}; + case 1: + return {a1}; + case 2: + return {(4 * a0 + 1 * a1) / 5}; + case 3: + return {(3 * a0 + 2 * a1) / 5}; + case 4: + return {(2 * a0 + 3 * a1) / 5}; + case 5: + return {(1 * a0 + 4 * a1) / 5}; + case 6: + return {0}; + case 7: + return {255}; } } // unreachable... @@ -456,10 +485,14 @@ class BlockDecoder auto c1 = unpack_color(block_->color[1]); auto lut_val = (block_->lut >> (index * 2)) & 3; switch (lut_val) { - case 0: return c0; - case 1: return c1; - case 2: return (c0 * 2 + c1) / 3; - case 3: return (c0 + c1 * 2) / 3; + case 0: + return c0; + case 1: + return c1; + case 2: + return (c0 * 2 + c1) / 3; + case 3: + return (c0 + c1 * 2) / 3; } // unreachable... return {}; @@ -523,10 +556,8 @@ class PixelsReader PixelColor get_color(const T& val) { return { - get_channel(val), - get_channel(val), - get_channel(val), - get_channel(val) + get_channel(val), get_channel(val), + get_channel(val), get_channel(val) }; } @@ -549,7 +580,7 @@ class PixelsReader }; // Silence bogus stringop-overflow warnings in GCC 10 (they seem to be fixed in GCC 11) -#if defined(__GNUC__) && __GNUC__ == 10 +#if defined(__GNUC__) && __GNUC__ == 10 #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wstringop-overflow" #endif @@ -561,7 +592,7 @@ class PixelsWriter typename PixelFormatTrait::Pixel* ptr_; template - void set_channel([[ maybe_unused ]] ColorChannel val) + void set_channel([[maybe_unused]] ColorChannel val) { if constexpr (CH::bits == 0) { // nothing to do @@ -572,19 +603,14 @@ class PixelsWriter } public: - PixelsWriter(void* ptr) : - ptr_(reinterpret_cast::Pixel*>(ptr)) - {} + PixelsWriter(void* ptr) : ptr_(reinterpret_cast::Pixel*>(ptr)) {} - void write([[ maybe_unused ]] PixelColor color) + void write([[maybe_unused]] PixelColor color) { if constexpr (std::is_void_v) { if constexpr (!std::is_array_v) { - *ptr_ = - (color.a.value << PFT::Alpha::offset) | - (color.r.value << PFT::Red::offset) | - (color.g.value << PFT::Green::offset) | - (color.b.value << PFT::Blue::offset); + *ptr_ = (color.a.value << PFT::Alpha::offset) | (color.r.value << PFT::Red::offset) | + (color.g.value << PFT::Green::offset) | (color.b.value << PFT::Blue::offset); } else { set_channel(color.a); @@ -600,7 +626,7 @@ class PixelsWriter } }; -#if defined(__GNUC__) && __GNUC__ == 10 +#if defined(__GNUC__) && __GNUC__ == 10 #pragma GCC diagnostic pop #endif @@ -616,7 +642,10 @@ class SurfacePixelFormatConverter const void* src_palette_; public: - SurfacePixelFormatConverter(const void* src_ptr, void* dst_ptr, size_t src_pitch, size_t dst_pitch, size_t w, size_t h, const void* src_palette) : + SurfacePixelFormatConverter( + const void* src_ptr, void* dst_ptr, size_t src_pitch, size_t dst_pitch, size_t w, size_t h, + const void* src_palette + ) : src_ptr_(reinterpret_cast(src_ptr)), dst_ptr_(reinterpret_cast(dst_ptr)), src_pitch_(src_pitch), dst_pitch_(dst_pitch), w_(w), h_(h), src_palette_(src_palette) {} @@ -631,11 +660,8 @@ class SurfacePixelFormatConverter PixelsWriter wrt{dst_ptr_}; PixelColor delta; for (size_t x = 0; x < w_; ++x) { - PixelColor old_clr = rdr.read() - + delta * 7 / 16 - + prev_row_deltas[x] * 3 / 16 - + prev_row_deltas[x + 1] * 5 / 16 - + prev_row_deltas[x + 2] * 1 / 16; + PixelColor old_clr = rdr.read() + delta * 7 / 16 + prev_row_deltas[x] * 3 / 16 + + prev_row_deltas[x + 1] * 5 / 16 + prev_row_deltas[x + 2] * 1 / 16; // TODO: make sure values are in range? PixelColor new_clr = old_clr; delta = old_clr - static_cast>(new_clr); @@ -662,7 +688,6 @@ class SurfacePixelFormatConverter } }; - template struct PixelFormatHolder { @@ -694,7 +719,8 @@ void call_with_format(rf::bm::Format format, F handler) case rf::bm::FORMAT_8_PALETTED: if constexpr (HandlePaletted) { handler(PixelFormatHolder()); - } else { + } + else { throw std::runtime_error{"Unexpected paletted pixel format"}; } return; diff --git a/game_patch/debug/debug.cpp b/game_patch/debug/debug.cpp index caff77b3f..be70e519c 100644 --- a/game_patch/debug/debug.cpp +++ b/game_patch/debug/debug.cpp @@ -14,7 +14,7 @@ #define VARRAY_OOB_CHECK 0 #define EMULATE_PACKET_LOSS 0 #define PACKET_LOSS_RATE 10 // every n packet is lost -#endif // NDEBUG +#endif // NDEBUG #if MEMORY_TRACKING constexpr uint32_t BOUND_MARKER = 0xDEADBEEF; diff --git a/game_patch/debug/debug_cmd.cpp b/game_patch/debug/debug_cmd.cpp index f923d10fc..e29ce56d8 100644 --- a/game_patch/debug/debug_cmd.cpp +++ b/game_patch/debug/debug_cmd.cpp @@ -42,10 +42,10 @@ DebugFlagDesc g_debug_flags[] = { {addr_as_ref(0x009BB5AC), "objrender"}, {g_dbg_geometry_rendering_stats, "roomstats"}, // geometry rendering - {addr_as_ref(0x009BB594), "trans", true}, // transparent_faces - {addr_as_ref(0x009BB598), "room", true}, // show_rooms - {addr_as_ref(0x009BB59C), "portal", true}, // show_portals - {addr_as_ref(0x009BB5A4), "lightmap", true}, // show_lightmaps + {addr_as_ref(0x009BB594), "trans", true}, // transparent_faces + {addr_as_ref(0x009BB598), "room", true}, // show_rooms + {addr_as_ref(0x009BB59C), "portal", true}, // show_portals + {addr_as_ref(0x009BB5A4), "lightmap", true}, // show_lightmaps {addr_as_ref(0x009BB5A8), "nolightmap", true}, // fullbright {addr_as_ref(0x009BB5B0), "show_invisible_faces", true}, }; diff --git a/game_patch/debug/debug_internal.h b/game_patch/debug/debug_internal.h index fd4b30606..1aa490585 100644 --- a/game_patch/debug/debug_internal.h +++ b/game_patch/debug/debug_internal.h @@ -47,9 +47,7 @@ class StringBuffer class DebugNameValueBox { public: - DebugNameValueBox(int x, int y) : - x_(x), y_(y) - {} + DebugNameValueBox(int x, int y) : x_(x), y_(y) {} void section(const char* name) { diff --git a/game_patch/debug/debugwinmsg.cpp b/game_patch/debug/debugwinmsg.cpp index 40048f334..e37368d74 100644 --- a/game_patch/debug/debugwinmsg.cpp +++ b/game_patch/debug/debugwinmsg.cpp @@ -4,12 +4,14 @@ struct WinMsgNameMapping { - UINT msg_id; - LPCSTR msg_name; + UINT msg_id; + LPCSTR msg_name; }; -#define DEFINE_MESSAGE(wm) { wm, #wm } -static const WinMsgNameMapping g_all_messages[] = -{ +#define DEFINE_MESSAGE(wm) \ + { \ + wm, #wm \ + } +static const WinMsgNameMapping g_all_messages[] = { DEFINE_MESSAGE(WM_CREATE), DEFINE_MESSAGE(WM_DESTROY), DEFINE_MESSAGE(WM_MOVE), @@ -157,7 +159,7 @@ static const WinMsgNameMapping g_all_messages[] = DEFINE_MESSAGE(WM_POWER), DEFINE_MESSAGE(WM_WINDOWPOSCHANGED), DEFINE_MESSAGE(WM_WINDOWPOSCHANGING), -// MFC specific messages + // MFC specific messages /*DEFINE_MESSAGE(WM_SIZEPARENT), DEFINE_MESSAGE(WM_SETMESSAGESTRING), DEFINE_MESSAGE(WM_IDLEUPDATECMDUI), @@ -193,10 +195,13 @@ static const WinMsgNameMapping g_all_messages[] = DEFINE_MESSAGE(WM_DEVICECHANGE), DEFINE_MESSAGE(WM_PRINT), DEFINE_MESSAGE(WM_PRINTCLIENT), - { 0, nullptr, } // end of message list + { + 0, + nullptr, + } // end of message list }; -const char *get_win_msg_name(UINT msg) +const char* get_win_msg_name(UINT msg) { for (auto& mapping : g_all_messages) { if (mapping.msg_id == msg) { diff --git a/game_patch/debug/obj_debug.cpp b/game_patch/debug/obj_debug.cpp index 2a54c0c2e..f047ff88b 100644 --- a/game_patch/debug/obj_debug.cpp +++ b/game_patch/debug/obj_debug.cpp @@ -10,14 +10,13 @@ std::optional g_target_rotate_speed; - namespace rf { -auto& entity_state_names = addr_as_ref(0x0062F208); -auto& entity_action_names = addr_as_ref(0x005CAEE0); -auto& move_mode_names = addr_as_ref(0x00596384); -auto& target_obj_handle = addr_as_ref(0x007C7190); + auto& entity_state_names = addr_as_ref(0x0062F208); + auto& entity_action_names = addr_as_ref(0x005CAEE0); + auto& move_mode_names = addr_as_ref(0x00596384); + auto& target_obj_handle = addr_as_ref(0x007C7190); } @@ -118,13 +117,15 @@ ConsoleCommand2 dbg_entity_state_cmd{ } int num_states = std::size(rf::entity_state_names); if (!state_opt) { - entity->force_state_anim_index = (entity->force_state_anim_index + 1) % num_states; + entity->force_state_anim_index = (entity->force_state_anim_index + 1) % num_states; } else if (state_opt.value() >= 0 && state_opt.value() < num_states) { entity->force_state_anim_index = state_opt.value(); } - rf::console::print("Entity state: {} ({})", rf::entity_action_names[entity->force_state_anim_index], - entity->force_state_anim_index); + rf::console::print( + "Entity state: {} ({})", rf::entity_action_names[entity->force_state_anim_index], + entity->force_state_anim_index + ); }, }; @@ -152,9 +153,7 @@ ConsoleCommand2 dbg_entity_action_cmd{ ConsoleCommand2 dbg_spin_cmd{ "d_spin", - [](float speed) { - g_target_rotate_speed = {speed}; - }, + [](float speed) { g_target_rotate_speed = {speed}; }, }; ConsoleCommand2 dbg_ai_pause_cmd{ @@ -168,18 +167,30 @@ ConsoleCommand2 dbg_ai_pause_cmd{ const char* get_obj_type_name(rf::Object& obj) { switch (obj.type) { - case rf::OT_ENTITY: return "entity"; - case rf::OT_ITEM: return "item"; - case rf::OT_WEAPON: return "weapon"; - case rf::OT_DEBRIS: return "debris"; - case rf::OT_CLUTTER: return "clutter"; - case rf::OT_TRIGGER: return "trigger"; - case rf::OT_EVENT: return "event"; - case rf::OT_CORPSE: return "corpse"; - case rf::OT_MOVER: return "mover"; - case rf::OT_MOVER_BRUSH: return "mover_brash"; - case rf::OT_GLARE: return "glare"; - default: return "-"; + case rf::OT_ENTITY: + return "entity"; + case rf::OT_ITEM: + return "item"; + case rf::OT_WEAPON: + return "weapon"; + case rf::OT_DEBRIS: + return "debris"; + case rf::OT_CLUTTER: + return "clutter"; + case rf::OT_TRIGGER: + return "trigger"; + case rf::OT_EVENT: + return "event"; + case rf::OT_CORPSE: + return "corpse"; + case rf::OT_MOVER: + return "mover"; + case rf::OT_MOVER_BRUSH: + return "mover_brash"; + case rf::OT_GLARE: + return "glare"; + default: + return "-"; } } @@ -193,47 +204,76 @@ const char* get_obj_class_name(rf::Object& obj) const char* get_ai_mode_name(rf::AiMode ai_mode) { switch (ai_mode) { - case rf::AI_MODE_NONE: return "NONE"; - case rf::AI_MODE_CATATONIC: return "CATATONIC"; - case rf::AI_MODE_WAITING: return "WAITING"; - case rf::AI_MODE_CHASE: return "CHASE"; - case rf::AI_MODE_WAYPOINTS: return "WAYPOINTS"; - case rf::AI_MODE_COLLECTING: return "COLLECTING"; - case rf::AI_MODE_INVESTIGATE_SOUND: return "INVESTIGATE_SOUND"; - case rf::AI_MODE_FLEE: return "FLEE"; - case rf::AI_MODE_EVENT_LOOK_AT: return "EVENT_LOOK_AT"; - case rf::AI_MODE_EVENT_SHOOT_AT: return "EVENT_SHOOT_AT"; - case rf::AI_MODE_FIND_PLAYER: return "FIND_PLAYER"; - case rf::AI_MODE_MOTION_DETECT: return "MOTION_DETECT"; - case rf::AI_MODE_FIND_COVER: return "FIND_COVER"; - case rf::AI_MODE_ON_TURRET: return "ON_TURRET"; - case rf::AI_MODE_HEALING: return "HEALING"; - case rf::AI_MODE_SECURITY_CAM: return "SECURITY_CAM"; - case rf::AI_MODE_SET_ALARM: return "SET_ALARM"; - case rf::AI_MODE_BERSERK: return "BERSERK"; - default: return "?"; + case rf::AI_MODE_NONE: + return "NONE"; + case rf::AI_MODE_CATATONIC: + return "CATATONIC"; + case rf::AI_MODE_WAITING: + return "WAITING"; + case rf::AI_MODE_CHASE: + return "CHASE"; + case rf::AI_MODE_WAYPOINTS: + return "WAYPOINTS"; + case rf::AI_MODE_COLLECTING: + return "COLLECTING"; + case rf::AI_MODE_INVESTIGATE_SOUND: + return "INVESTIGATE_SOUND"; + case rf::AI_MODE_FLEE: + return "FLEE"; + case rf::AI_MODE_EVENT_LOOK_AT: + return "EVENT_LOOK_AT"; + case rf::AI_MODE_EVENT_SHOOT_AT: + return "EVENT_SHOOT_AT"; + case rf::AI_MODE_FIND_PLAYER: + return "FIND_PLAYER"; + case rf::AI_MODE_MOTION_DETECT: + return "MOTION_DETECT"; + case rf::AI_MODE_FIND_COVER: + return "FIND_COVER"; + case rf::AI_MODE_ON_TURRET: + return "ON_TURRET"; + case rf::AI_MODE_HEALING: + return "HEALING"; + case rf::AI_MODE_SECURITY_CAM: + return "SECURITY_CAM"; + case rf::AI_MODE_SET_ALARM: + return "SET_ALARM"; + case rf::AI_MODE_BERSERK: + return "BERSERK"; + default: + return "?"; } } const char* get_ai_attack_style_name(rf::AiAttackStyle attack_style) { switch (attack_style) { - case rf::AI_ATTACK_STYLE_DEFAULT: return "DEFAULT"; - case rf::AI_ATTACK_STYLE_EVASIVE: return "EVASIVE"; - case rf::AI_ATTACK_STYLE_STAND_GROUND: return "STAND_GROUND"; - case rf::AI_ATTACK_STYLE_DIRECT: return "DIRECT"; - default: return "?"; + case rf::AI_ATTACK_STYLE_DEFAULT: + return "DEFAULT"; + case rf::AI_ATTACK_STYLE_EVASIVE: + return "EVASIVE"; + case rf::AI_ATTACK_STYLE_STAND_GROUND: + return "STAND_GROUND"; + case rf::AI_ATTACK_STYLE_DIRECT: + return "DIRECT"; + default: + return "?"; } } const char* get_friendliness_name(rf::ObjFriendliness friendliness) { switch (friendliness) { - case rf::OBJ_UNFRIENDLY: return "UNFRIENDLY"; - case rf::OBJ_NEUTRAL: return "NEUTRAL"; - case rf::OBJ_FRIENDLY: return "FRIENDLY"; - case rf::OBJ_OUTCAST: return "OUTCAST"; - default: return "?"; + case rf::OBJ_UNFRIENDLY: + return "UNFRIENDLY"; + case rf::OBJ_NEUTRAL: + return "NEUTRAL"; + case rf::OBJ_FRIENDLY: + return "FRIENDLY"; + case rf::OBJ_OUTCAST: + return "OUTCAST"; + default: + return "?"; } } @@ -302,7 +342,9 @@ void render_obj_debug_ui() } } dbg_hud.print("action", action_name); - dbg_hud.printf("persona", entity->info->persona >= 0 ? rf::persona_info[entity->info->persona].name.c_str() : "none"); + dbg_hud.printf( + "persona", entity->info->persona >= 0 ? rf::persona_info[entity->info->persona].name.c_str() : "none" + ); } if (g_target_rotate_speed) { diff --git a/game_patch/debug/profiler.cpp b/game_patch/debug/profiler.cpp index ed518cfd3..831145046 100644 --- a/game_patch/debug/profiler.cpp +++ b/game_patch/debug/profiler.cpp @@ -161,9 +161,7 @@ class ProfilerStats class BaseProfiler { public: - BaseProfiler(const char* name) : - m_name(name) - {} + BaseProfiler(const char* name) : m_name(name) {} virtual ~BaseProfiler() = default; [[nodiscard]] const char* get_name() const @@ -207,7 +205,7 @@ class BaseProfiler void leave() { if (!m_is_cpu_in_range) { - //xlog::warn("Leaving without entering in CallProfiler"); + // xlog::warn("Leaving without entering in CallProfiler"); return; } m_is_cpu_in_range = false; @@ -220,12 +218,9 @@ class AddrRangeProfiler : public BaseProfiler { public: AddrRangeProfiler(uintptr_t enter_addr, uintptr_t leave_addr, const char* name) : - BaseProfiler(name), - m_enter_inject(new CodeInjection{enter_addr, [this]() { enter(); }}), - m_leave_inject(new CodeInjection{leave_addr, [this]() { leave(); }}), - m_addr(enter_addr) - { - } + BaseProfiler(name), m_enter_inject(new CodeInjection{enter_addr, [this]() { enter(); }}), + m_leave_inject(new CodeInjection{leave_addr, [this]() { leave(); }}), m_addr(enter_addr) + {} [[nodiscard]] uintptr_t get_addr() const { @@ -249,8 +244,7 @@ class CallProfiler : public BaseProfiler public: CallProfiler(uintptr_t addr, const char* name) : BaseProfiler(name), m_call_hook(new CallPrePostHook{addr, [this]() { enter(); }, [this]() { leave(); }}) - { - } + {} void install() override { @@ -265,10 +259,8 @@ class FunProfiler : public BaseProfiler { public: FunProfiler(uintptr_t fun_addr, const char* name) : - BaseProfiler(name), - m_fun_hook(new FunPrePostHook{fun_addr, [this]() { enter(); }, [this]() { leave(); }}) - { - } + BaseProfiler(name), m_fun_hook(new FunPrePostHook{fun_addr, [this]() { enter(); }, [this]() { leave(); }}) + {} void install() override { @@ -283,7 +275,8 @@ std::vector> g_profilers; bool g_profiler_visible = false; std::ofstream g_profiler_log; -void install_profiler_patches() { +void install_profiler_patches() +{ static bool installed = false; if (!installed) { for (auto& p : g_profilers) { @@ -301,13 +294,8 @@ void profiler_log_init() } g_profiler_log << "frametime;"; for (auto& p : g_profilers) { - g_profiler_log - << p->get_name() << " avg frame time;" - << p->get_name() << " num calls;" - << p->get_name() << " avg time;" - << p->get_name() << " min time;" - << p->get_name() << " max time;" - ; + g_profiler_log << p->get_name() << " avg frame time;" << p->get_name() << " num calls;" << p->get_name() + << " avg time;" << p->get_name() << " min time;" << p->get_name() << " max time;"; } g_profiler_log << '\n'; } @@ -320,13 +308,9 @@ void profiler_log_dump() g_profiler_log << rf::frametime << ';'; for (auto& p : g_profilers) { const auto& stats = p->stats(); - g_profiler_log - << stats.last_frames_summed_times().avg() << ';' - << stats.current_frame_times().count() << ';' - << stats.last_times().avg() << ';' - << stats.current_frame_times().min().value_or(-1) << ';' - << stats.current_frame_times().max().value_or(-1) << ';' - ; + g_profiler_log << stats.last_frames_summed_times().avg() << ';' << stats.current_frame_times().count() << ';' + << stats.last_times().avg() << ';' << stats.current_frame_times().min().value_or(-1) << ';' + << stats.current_frame_times().max().value_or(-1) << ';'; } g_profiler_log << '\n'; } @@ -374,8 +358,10 @@ ConsoleCommand2 profiler_print_cmd{ []() { for (const auto& p : g_profilers) { const auto& stats = p->stats(); - rf::console::print("{}: avg {} avg_frame {}", p->get_name(), - stats.last_times().avg(), stats.last_frames_summed_times().avg()); + rf::console::print( + "{}: avg {} avg_frame {}", p->get_name(), stats.last_times().avg(), + stats.last_frames_summed_times().avg() + ); } }, }; @@ -385,8 +371,10 @@ ConsoleCommand2 perf_dump_cmd{ []() { rf::console::print("Number of performance aggregators: {}", PerfAggregator::get_instances().size()); for (const auto& ptr : PerfAggregator::get_instances()) { - rf::console::print("{}: calls {}, duration {} us, avg {} us", ptr->get_name(), - ptr->get_calls(), ptr->get_total_duration_us(), ptr->get_avg_duration_us()); + rf::console::print( + "{}: calls {}, duration {} us, avg {} us", ptr->get_name(), ptr->get_calls(), + ptr->get_total_duration_us(), ptr->get_avg_duration_us() + ); } }, }; @@ -463,8 +451,8 @@ void profiler_init() add_profiler(0x004D33D0, " details"); add_profiler(0x00494B90, 0x00494D3A, " particles"); // CRASH - //add_profiler(0x004D34AB, 0x004D34B1, " any render handler"); - //add_profiler(0x004D3499, " prepare lights"); + // add_profiler(0x004D34AB, 0x004D34B1, " any render handler"); + // add_profiler(0x004D3499, " prepare lights"); add_profiler(0x00431FFD, 0x00432F55, " after portal renderer"); add_profiler(0x0043233E, " glare flares"); @@ -477,7 +465,6 @@ void profiler_init() add_profiler(0x004D3350, "set_currently_rendered_room"); add_profiler(0x004E6780, "g_proctex_update_water_1"); - profiler_cmd.register_cmd(); profiler_log_cmd.register_cmd(); profiler_print_cmd.register_cmd(); @@ -502,8 +489,10 @@ void profiler_draw_ui() for (auto& p : g_profilers) { const auto& stats = p->stats(); if (stats.current_frame_times().count() > 1) { - dbg_box.printf(p->get_name(), "%d us (%d calls, single %d us)", stats.last_frames_summed_times().avg(), - stats.current_frame_times().count(), stats.last_times().avg()); + dbg_box.printf( + p->get_name(), "%d us (%d calls, single %d us)", stats.last_frames_summed_times().avg(), + stats.current_frame_times().count(), stats.last_times().avg() + ); } else { dbg_box.printf(p->get_name(), "%d us", stats.last_frames_summed_times().avg()); diff --git a/game_patch/debug/unresponsive.cpp b/game_patch/debug/unresponsive.cpp index 3ba8dd3eb..4fed6e212 100644 --- a/game_patch/debug/unresponsive.cpp +++ b/game_patch/debug/unresponsive.cpp @@ -20,7 +20,8 @@ ConsoleCommand2 hang_cmd{ "d_hang", []() { int start = rf::timer_get(1000); - while (rf::timer_get(1000) - start < 6000) {} + while (rf::timer_get(1000) - start < 6000) { + } }, }; #endif diff --git a/game_patch/graphics/bink.cpp b/game_patch/graphics/bink.cpp index b4ab2acbc..3e7b58525 100644 --- a/game_patch/graphics/bink.cpp +++ b/game_patch/graphics/bink.cpp @@ -36,9 +36,7 @@ FunHook bink_init_device_info_hook{ CodeInjection bink_set_sound_system_injection{ 0x00520BBC, - [](auto& regs) { - *reinterpret_cast(regs.esp + 4) = rf::direct_sound; - }, + [](auto& regs) { *reinterpret_cast(regs.esp + 4) = rf::direct_sound; }, }; CallHook play_bik_file_vram_leak_fix{ diff --git a/game_patch/graphics/d3d11/gr_d3d11.cpp b/game_patch/graphics/d3d11/gr_d3d11.cpp index dfa58e2d5..2c8d02df8 100644 --- a/game_patch/graphics/d3d11/gr_d3d11.cpp +++ b/game_patch/graphics/d3d11/gr_d3d11.cpp @@ -36,9 +36,12 @@ namespace df::gr::d3d11 state_manager_ = std::make_unique(device_); shader_manager_ = std::make_unique(device_); texture_manager_ = std::make_unique(device_, context_); - render_context_ = std::make_unique(device_, context_, *state_manager_, *shader_manager_, *texture_manager_); + render_context_ = + std::make_unique(device_, context_, *state_manager_, *shader_manager_, *texture_manager_); dyn_geo_renderer_ = std::make_unique(device_, *shader_manager_, *render_context_); - solid_renderer_ = std::make_unique(device_, *shader_manager_, *state_manager_, *dyn_geo_renderer_, *render_context_); + solid_renderer_ = std::make_unique( + device_, *shader_manager_, *state_manager_, *dyn_geo_renderer_, *render_context_ + ); mesh_renderer_ = std::make_unique(device_, *shader_manager_, *state_manager_, *render_context_); render_context_->set_render_target(default_render_target_view_, depth_stencil_view_); @@ -81,9 +84,7 @@ namespace df::gr::d3d11 void Renderer::set_fullscreen_state(bool fullscreen) { - DF_GR_D3D11_CHECK_HR( - swap_chain_->SetFullscreenState(fullscreen, nullptr) - ); + DF_GR_D3D11_CHECK_HR(swap_chain_->SetFullscreenState(fullscreen, nullptr)); // unref swapchain resources before calling ResizeBuffers context_->OMSetRenderTargets(0, nullptr, nullptr); back_buffer_.release(); @@ -115,27 +116,17 @@ namespace df::gr::d3d11 // }; DWORD flags = 0; - //#ifndef NDEBUG - // Requires Windows 10 SDK - //flags |= D3D11_CREATE_DEVICE_DEBUG; - //#endif + // #ifndef NDEBUG + // Requires Windows 10 SDK + // flags |= D3D11_CREATE_DEVICE_DEBUG; + // #endif D3D_FEATURE_LEVEL feature_level_supported; - DF_GR_D3D11_CHECK_HR( - pD3D11CreateDevice( - nullptr, - D3D_DRIVER_TYPE_HARDWARE, - nullptr, - flags, - // feature_levels, - // std::size(feature_levels), - nullptr, - 0, - D3D11_SDK_VERSION, - &device_, - &feature_level_supported, - &context_ - ) - ); + DF_GR_D3D11_CHECK_HR(pD3D11CreateDevice( + nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, flags, + // feature_levels, + // std::size(feature_levels), + nullptr, 0, D3D11_SDK_VERSION, &device_, &feature_level_supported, &context_ + )); init_error(device_); @@ -145,19 +136,13 @@ namespace df::gr::d3d11 void Renderer::init_swap_chain(HWND hwnd) { ComPtr dxgi_device; - DF_GR_D3D11_CHECK_HR( - device_->QueryInterface(&dxgi_device) - ); + DF_GR_D3D11_CHECK_HR(device_->QueryInterface(&dxgi_device)); ComPtr dxgi_adapter; - DF_GR_D3D11_CHECK_HR( - dxgi_device->GetAdapter(&dxgi_adapter) - ); + DF_GR_D3D11_CHECK_HR(dxgi_device->GetAdapter(&dxgi_adapter)); ComPtr dxgi_factory; - DF_GR_D3D11_CHECK_HR( - dxgi_adapter->GetParent(__uuidof(IDXGIFactory), reinterpret_cast(&dxgi_factory)) - ); + DF_GR_D3D11_CHECK_HR(dxgi_adapter->GetParent(__uuidof(IDXGIFactory), reinterpret_cast(&dxgi_factory))); ComPtr dxgi_factory2; ComPtr dxgi_factory3; @@ -215,9 +200,7 @@ namespace df::gr::d3d11 sd.Windowed = rf::gr::screen.window_mode == rf::gr::WINDOWED; sd.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH; - DF_GR_D3D11_CHECK_HR( - dxgi_factory->CreateSwapChain(device_, &sd, &swap_chain_) - ); + DF_GR_D3D11_CHECK_HR(dxgi_factory->CreateSwapChain(device_, &sd, &swap_chain_)); } } @@ -233,9 +216,7 @@ namespace df::gr::d3d11 D3D11_TEXTURE2D_DESC desc; back_buffer_->GetDesc(&desc); desc.SampleDesc.Count = g_game_config.msaa; - DF_GR_D3D11_CHECK_HR( - device_->CreateTexture2D(&desc, nullptr, &msaa_render_target_) - ); + DF_GR_D3D11_CHECK_HR(device_->CreateTexture2D(&desc, nullptr, &msaa_render_target_)); default_render_target_ = msaa_render_target_; CD3D11_RENDER_TARGET_VIEW_DESC view_desc{D3D11_RTV_DIMENSION_TEXTURE2DMS}; @@ -266,28 +247,31 @@ namespace df::gr::d3d11 depth_stencil_desc.BindFlags = D3D11_BIND_DEPTH_STENCIL; ComPtr depth_stencil; - DF_GR_D3D11_CHECK_HR( - device_->CreateTexture2D(&depth_stencil_desc, nullptr, &depth_stencil) - ); + DF_GR_D3D11_CHECK_HR(device_->CreateTexture2D(&depth_stencil_desc, nullptr, &depth_stencil)); D3D11_DEPTH_STENCIL_VIEW_DESC view_desc; ZeroMemory(&view_desc, sizeof(view_desc)); view_desc.ViewDimension = g_game_config.msaa ? D3D11_DSV_DIMENSION_TEXTURE2DMS : D3D11_DSV_DIMENSION_TEXTURE2D; - DF_GR_D3D11_CHECK_HR( - device_->CreateDepthStencilView(depth_stencil, &view_desc, &depth_stencil_view_) - ); + DF_GR_D3D11_CHECK_HR(device_->CreateDepthStencilView(depth_stencil, &view_desc, &depth_stencil_view_)); } - void Renderer::bitmap(int bm_handle, int x, int y, int w, int h, int sx, int sy, int sw, int sh, bool flip_x, bool flip_y, gr::Mode mode) + void Renderer::bitmap( + int bm_handle, int x, int y, int w, int h, int sx, int sy, int sw, int sh, bool flip_x, bool flip_y, + gr::Mode mode + ) { - dyn_geo_renderer_->bitmap(bm_handle, - static_cast(x), static_cast(y), static_cast(w), static_cast(h), - static_cast(sx), static_cast(sy), static_cast(sw), static_cast(sh), - flip_x, flip_y, mode); + dyn_geo_renderer_->bitmap( + bm_handle, static_cast(x), static_cast(y), static_cast(w), static_cast(h), + static_cast(sx), static_cast(sy), static_cast(sw), static_cast(sh), flip_x, + flip_y, mode + ); } - void Renderer::bitmap(int bm_handle, float x, float y, float w, float h, float sx, float sy, float sw, float sh, bool flip_x, bool flip_y, rf::gr::Mode mode) + void Renderer::bitmap( + int bm_handle, float x, float y, float w, float h, float sx, float sy, float sw, float sh, bool flip_x, + bool flip_y, rf::gr::Mode mode + ) { dyn_geo_renderer_->bitmap(bm_handle, x, y, w, h, sx, sy, sw, sh, flip_x, flip_y, mode); } @@ -323,9 +307,7 @@ namespace df::gr::d3d11 } xlog::trace("Presenting frame {}", rf::frame_count); UINT sync_interval = g_game_config.vsync ? 1 : 0; - DF_GR_D3D11_CHECK_HR( - swap_chain_->Present(sync_interval, 0) - ); + DF_GR_D3D11_CHECK_HR(swap_chain_->Present(sync_interval, 0)); // Flip swap effect clears render target after Present call render_context_->set_render_target(default_render_target_view_, depth_stencil_view_); // Note: it would be better to call update_per_frame_constants after frametime_calculate @@ -357,22 +339,22 @@ namespace df::gr::d3d11 texture_manager_->remove_ref(bm_handle); } - bool Renderer::lock(int bm_handle, int section, rf::gr::LockInfo *lock) + bool Renderer::lock(int bm_handle, int section, rf::gr::LockInfo* lock) { return texture_manager_->lock(bm_handle, section, lock); } - void Renderer::unlock(rf::gr::LockInfo *lock) + void Renderer::unlock(rf::gr::LockInfo* lock) { texture_manager_->unlock(lock); } - void Renderer::get_texel(int bm_handle, float u, float v, rf::gr::Color *clr) + void Renderer::get_texel(int bm_handle, float u, float v, rf::gr::Color* clr) { texture_manager_->get_texel(bm_handle, u, v, clr); } - void Renderer::tmapper(int nv, const rf::gr::Vertex **vertices, int vertex_attributes, rf::gr::Mode mode) + void Renderer::tmapper(int nv, const rf::gr::Vertex** vertices, int vertex_attributes, rf::gr::Mode mode) { std::array tex_handles{gr::screen.current_texture_1, gr::screen.current_texture_2}; dyn_geo_renderer_->add_poly(nv, vertices, vertex_attributes, tex_handles, mode); @@ -388,7 +370,9 @@ namespace df::gr::d3d11 dyn_geo_renderer_->line_2d(x1, y1, x2, y2, mode); } - bool Renderer::poly(int nv, rf::gr::Vertex** vertices, int vertex_attributes, rf::gr::Mode mode, bool constant_sw, float sw) + bool Renderer::poly( + int nv, rf::gr::Vertex** vertices, int vertex_attributes, rf::gr::Mode mode, bool constant_sw, float sw + ) { rf::ubyte and_code = 0xFF; for (int i = 0; i < nv; ++i) { @@ -447,7 +431,7 @@ namespace df::gr::d3d11 return true; } - bm::Format Renderer::read_back_buffer([[maybe_unused]] int x, [[maybe_unused]] int y, int w, int h, rf::ubyte *data) + bm::Format Renderer::read_back_buffer([[maybe_unused]] int x, [[maybe_unused]] int y, int w, int h, rf::ubyte* data) { dyn_geo_renderer_->flush(); if (msaa_render_target_) { @@ -478,13 +462,13 @@ namespace df::gr::d3d11 solid_renderer_->render_movable_solid(solid, pos, orient); } - void Renderer::render_alpha_detail_room(rf::GRoom *room, rf::GSolid *solid) + void Renderer::render_alpha_detail_room(rf::GRoom* room, rf::GSolid* solid) { dyn_geo_renderer_->flush(); solid_renderer_->render_alpha_detail(room, solid); } - void Renderer::render_sky_room(rf::GRoom *room) + void Renderer::render_sky_room(rf::GRoom* room) { dyn_geo_renderer_->flush(); solid_renderer_->render_sky_room(room); @@ -501,19 +485,25 @@ namespace df::gr::d3d11 solid_renderer_->clear_cache(); } - void Renderer::render_v3d_vif(rf::VifLodMesh *lod_mesh, int lod_index, const rf::Vector3& pos, const rf::Matrix3& orient, const rf::MeshRenderParams& params) + void Renderer::render_v3d_vif( + rf::VifLodMesh* lod_mesh, int lod_index, const rf::Vector3& pos, const rf::Matrix3& orient, + const rf::MeshRenderParams& params + ) { dyn_geo_renderer_->flush(); mesh_renderer_->render_v3d_vif(lod_mesh, lod_index, pos, orient, params); } - void Renderer::render_character_vif(rf::VifLodMesh *lod_mesh, int lod_index, const rf::Vector3& pos, const rf::Matrix3& orient, const rf::CharacterInstance *ci, const rf::MeshRenderParams& params) + void Renderer::render_character_vif( + rf::VifLodMesh* lod_mesh, int lod_index, const rf::Vector3& pos, const rf::Matrix3& orient, + const rf::CharacterInstance* ci, const rf::MeshRenderParams& params + ) { dyn_geo_renderer_->flush(); mesh_renderer_->render_character_vif(lod_mesh, lod_index, pos, orient, ci, params); } - void Renderer::clear_vif_cache(rf::VifLodMesh *lod_mesh) + void Renderer::clear_vif_cache(rf::VifLodMesh* lod_mesh) { mesh_renderer_->clear_vif_cache(lod_mesh); } diff --git a/game_patch/graphics/d3d11/gr_d3d11.h b/game_patch/graphics/d3d11/gr_d3d11.h index c1e8c2a4f..5f592b567 100644 --- a/game_patch/graphics/d3d11/gr_d3d11.h +++ b/game_patch/graphics/d3d11/gr_d3d11.h @@ -40,8 +40,14 @@ namespace df::gr::d3d11 void window_active(); void window_inactive(); void set_fullscreen_state(bool fullscreen); - void bitmap(int bm_handle, int x, int y, int w, int h, int sx, int sy, int sw, int sh, bool flip_x, bool flip_y, rf::gr::Mode mode); - void bitmap(int bm_handle, float x, float y, float w, float h, float sx, float sy, float sw, float sh, bool flip_x, bool flip_y, rf::gr::Mode mode); + void bitmap( + int bm_handle, int x, int y, int w, int h, int sx, int sy, int sw, int sh, bool flip_x, bool flip_y, + rf::gr::Mode mode + ); + void bitmap( + int bm_handle, float x, float y, float w, float h, float sx, float sy, float sw, float sh, bool flip_x, + bool flip_y, rf::gr::Mode mode + ); void page_in(int bm_handle); void clear(); void zbuffer_clear(); @@ -53,26 +59,33 @@ namespace df::gr::d3d11 void texture_mark_dirty(int bm_handle); void texture_add_ref(int bm_handle); void texture_remove_ref(int bm_handle); - bool lock(int bm_handle, int section, rf::gr::LockInfo *lock); - void unlock(rf::gr::LockInfo *lock); - void get_texel(int bm_handle, float u, float v, rf::gr::Color *clr); + bool lock(int bm_handle, int section, rf::gr::LockInfo* lock); + void unlock(rf::gr::LockInfo* lock); + void get_texel(int bm_handle, float u, float v, rf::gr::Color* clr); bool set_render_target(int bm_handle); - rf::bm::Format read_back_buffer(int x, int y, int w, int h, rf::ubyte *data); - void tmapper(int nv, const rf::gr::Vertex **vertices, int vertex_attributes, rf::gr::Mode mode); + rf::bm::Format read_back_buffer(int x, int y, int w, int h, rf::ubyte* data); + void tmapper(int nv, const rf::gr::Vertex** vertices, int vertex_attributes, rf::gr::Mode mode); void line_3d(const rf::gr::Vertex& v0, const rf::gr::Vertex& v1, rf::gr::Mode mode); void line_2d(float x1, float y1, float x2, float y2, rf::gr::Mode mode); - bool poly(int nv, rf::gr::Vertex** vertices, int vertex_attributes, rf::gr::Mode mode, bool constant_sw, float sw); + bool + poly(int nv, rf::gr::Vertex** vertices, int vertex_attributes, rf::gr::Mode mode, bool constant_sw, float sw); void project_vertex(rf::gr::Vertex* v); void setup_3d(Projection proj); void render_solid(rf::GSolid* solid, rf::GRoom** rooms, int num_rooms); void render_movable_solid(rf::GSolid* solid, const rf::Vector3& pos, const rf::Matrix3& orient); - void render_alpha_detail_room(rf::GRoom *room, rf::GSolid *solid); - void render_sky_room(rf::GRoom *room); + void render_alpha_detail_room(rf::GRoom* room, rf::GSolid* solid); + void render_sky_room(rf::GRoom* room); void render_room_liquid_surface(rf::GSolid* solid, rf::GRoom* room); void clear_solid_cache(); - void render_v3d_vif(rf::VifLodMesh *lod_mesh, int lod_index, const rf::Vector3& pos, const rf::Matrix3& orient, const rf::MeshRenderParams& params); - void render_character_vif(rf::VifLodMesh *lod_mesh, int lod_index, const rf::Vector3& pos, const rf::Matrix3& orient, const rf::CharacterInstance *ci, const rf::MeshRenderParams& params); - void clear_vif_cache(rf::VifLodMesh *lod_mesh); + void render_v3d_vif( + rf::VifLodMesh* lod_mesh, int lod_index, const rf::Vector3& pos, const rf::Matrix3& orient, + const rf::MeshRenderParams& params + ); + void render_character_vif( + rf::VifLodMesh* lod_mesh, int lod_index, const rf::Vector3& pos, const rf::Matrix3& orient, + const rf::CharacterInstance* ci, const rf::MeshRenderParams& params + ); + void clear_vif_cache(rf::VifLodMesh* lod_mesh); void fog_set(); void page_in_v3d_mesh(rf::VifLodMesh* lod_mesh); void page_in_character_mesh(rf::VifLodMesh* lod_mesh); @@ -124,7 +137,13 @@ namespace df::gr::d3d11 } } - #define DF_GR_D3D11_CHECK_HR(code) { auto func_name = __func__; check_hr(code, [=]() { xlog::error("D3D11 call failed: {} (function {} in line {})", #code, func_name, __LINE__); }); } +#define DF_GR_D3D11_CHECK_HR(code) \ + { \ + auto func_name = __func__; \ + check_hr(code, [=]() { \ + xlog::error("D3D11 call failed: {} (function {} in line {})", #code, func_name, __LINE__); \ + }); \ + } static inline int pack_color(const rf::Color& color) { @@ -132,7 +151,8 @@ namespace df::gr::d3d11 return (color.alpha << 24) | (color.blue << 16) | (color.green << 8) | color.red; } - static inline std::array normalize_texture_handles_for_mode(rf::gr::Mode mode, const std::array& textures) + static inline std::array + normalize_texture_handles_for_mode(rf::gr::Mode mode, const std::array& textures) { switch (mode.get_texture_source()) { case rf::gr::TEXTURE_SOURCE_NONE: diff --git a/game_patch/graphics/d3d11/gr_d3d11_buffer.h b/game_patch/graphics/d3d11/gr_d3d11_buffer.h index d044bb5b7..4a3e0b63d 100644 --- a/game_patch/graphics/d3d11/gr_d3d11_buffer.h +++ b/game_patch/graphics/d3d11/gr_d3d11_buffer.h @@ -10,19 +10,18 @@ namespace df::gr::d3d11 class RingBuffer { public: - RingBuffer(int buffer_size, UINT bind_flags, ComPtr device, ComPtr device_context) : - buffer_size_{buffer_size}, device_{device}, device_context_{device_context} + RingBuffer( + int buffer_size, UINT bind_flags, ComPtr device, ComPtr device_context + ) : buffer_size_{buffer_size}, device_{device}, device_context_{device_context} { D3D11_BUFFER_DESC buffer_desc; ZeroMemory(&buffer_desc, sizeof(buffer_desc)); - buffer_desc.Usage = D3D11_USAGE_DYNAMIC; - buffer_desc.ByteWidth = buffer_size * sizeof(T); - buffer_desc.BindFlags = bind_flags; - buffer_desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + buffer_desc.Usage = D3D11_USAGE_DYNAMIC; + buffer_desc.ByteWidth = buffer_size * sizeof(T); + buffer_desc.BindFlags = bind_flags; + buffer_desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - DF_GR_D3D11_CHECK_HR( - device_->CreateBuffer(&buffer_desc, nullptr, &buffer_) - ); + DF_GR_D3D11_CHECK_HR(device_->CreateBuffer(&buffer_desc, nullptr, &buffer_)); } ~RingBuffer() @@ -37,9 +36,7 @@ namespace df::gr::d3d11 if (!mapped_data_) { D3D11_MAP map_type = buffer_full ? D3D11_MAP_WRITE_DISCARD : D3D11_MAP_WRITE_NO_OVERWRITE; D3D11_MAPPED_SUBRESOURCE mapped_subres; - DF_GR_D3D11_CHECK_HR( - device_context_->Map(buffer_, 0, map_type, 0, &mapped_subres) - ); + DF_GR_D3D11_CHECK_HR(device_context_->Map(buffer_, 0, map_type, 0, &mapped_subres)); mapped_data_ = reinterpret_cast(mapped_subres.pData); if (buffer_full) { start_pos_ = current_pos_ = 0; diff --git a/game_patch/graphics/d3d11/gr_d3d11_context.cpp b/game_patch/graphics/d3d11/gr_d3d11_context.cpp index f7b41b0cb..6c13b4d2e 100644 --- a/game_patch/graphics/d3d11/gr_d3d11_context.cpp +++ b/game_patch/graphics/d3d11/gr_d3d11_context.cpp @@ -13,16 +13,12 @@ using namespace rf; namespace df::gr::d3d11 { RenderContext::RenderContext( - ComPtr device, ComPtr device_context, - StateManager& state_manager, ShaderManager& shader_manager, - TextureManager& texture_manager + ComPtr device, ComPtr device_context, StateManager& state_manager, + ShaderManager& shader_manager, TextureManager& texture_manager ) : - device_{std::move(device)}, device_context_{std::move(device_context)}, - state_manager_{state_manager}, shader_manager_{shader_manager}, texture_manager_{texture_manager}, - model_transform_cbuffer_{device_}, - view_proj_transform_cbuffer_{device_}, - lights_buffer_{device_}, - render_mode_cbuffer_{device_}, + device_{std::move(device)}, device_context_{std::move(device_context)}, state_manager_{state_manager}, + shader_manager_{shader_manager}, texture_manager_{texture_manager}, model_transform_cbuffer_{device_}, + view_proj_transform_cbuffer_{device_}, lights_buffer_{device_}, render_mode_cbuffer_{device_}, per_frame_buffer_{device_} { bind_cbuffers(); @@ -88,8 +84,7 @@ namespace df::gr::d3d11 static_assert(sizeof(ModelTransformBufferData) % 16 == 0); ModelTransformBuffer::ModelTransformBuffer(ID3D11Device* device) : - current_model_pos_{NAN, NAN, NAN}, - current_model_orient_{{NAN, NAN, NAN}, {NAN, NAN, NAN}, {NAN, NAN, NAN}} + current_model_pos_{NAN, NAN, NAN}, current_model_orient_{{NAN, NAN, NAN}, {NAN, NAN, NAN}, {NAN, NAN, NAN}} { CD3D11_BUFFER_DESC desc{ sizeof(ModelTransformBufferData), @@ -106,9 +101,7 @@ namespace df::gr::d3d11 data.world_mat = build_world_matrix(current_model_pos_, current_model_orient_); D3D11_MAPPED_SUBRESOURCE mapped_subres; - DF_GR_D3D11_CHECK_HR( - device_context->Map(buffer_, 0, D3D11_MAP_WRITE_DISCARD, 0, &mapped_subres) - ); + DF_GR_D3D11_CHECK_HR(device_context->Map(buffer_, 0, D3D11_MAP_WRITE_DISCARD, 0, &mapped_subres)); std::memcpy(mapped_subres.pData, &data, sizeof(data)); device_context->Unmap(buffer_, 0); } @@ -138,9 +131,7 @@ namespace df::gr::d3d11 data.proj_mat = proj.matrix(); D3D11_MAPPED_SUBRESOURCE mapped_subres; - DF_GR_D3D11_CHECK_HR( - device_context->Map(buffer_, 0, D3D11_MAP_WRITE_DISCARD, 0, &mapped_subres) - ); + DF_GR_D3D11_CHECK_HR(device_context->Map(buffer_, 0, D3D11_MAP_WRITE_DISCARD, 0, &mapped_subres)); std::memcpy(mapped_subres.pData, &data, sizeof(data)); device_context->Unmap(buffer_, 0); } @@ -168,9 +159,7 @@ namespace df::gr::d3d11 data.time = rf::frametime_total_milliseconds / 1000.0f; D3D11_MAPPED_SUBRESOURCE mapped_subres; - DF_GR_D3D11_CHECK_HR( - device_context->Map(buffer_, 0, D3D11_MAP_WRITE_DISCARD, 0, &mapped_subres) - ); + DF_GR_D3D11_CHECK_HR(device_context->Map(buffer_, 0, D3D11_MAP_WRITE_DISCARD, 0, &mapped_subres)); std::memcpy(mapped_subres.pData, &data, sizeof(data)); device_context->Unmap(buffer_, 0); } @@ -205,9 +194,7 @@ namespace df::gr::d3d11 void LightsBuffer::update(ID3D11DeviceContext* device_context) { D3D11_MAPPED_SUBRESOURCE mapped_subres; - DF_GR_D3D11_CHECK_HR( - device_context->Map(buffer_, 0, D3D11_MAP_WRITE_DISCARD, 0, &mapped_subres) - ); + DF_GR_D3D11_CHECK_HR(device_context->Map(buffer_, 0, D3D11_MAP_WRITE_DISCARD, 0, &mapped_subres)); LightsBufferData data{}; for (int i = 0; i < std::min(rf::gr::num_relevant_lights, LightsBufferData::max_point_lights); ++i) { @@ -280,9 +267,7 @@ namespace df::gr::d3d11 } D3D11_MAPPED_SUBRESOURCE mapped_subres; - DF_GR_D3D11_CHECK_HR( - device_context->Map(buffer_, 0, D3D11_MAP_WRITE_DISCARD, 0, &mapped_subres) - ); + DF_GR_D3D11_CHECK_HR(device_context->Map(buffer_, 0, D3D11_MAP_WRITE_DISCARD, 0, &mapped_subres)); std::memcpy(mapped_subres.pData, &data, sizeof(data)); device_context->Unmap(buffer_, 0); } diff --git a/game_patch/graphics/d3d11/gr_d3d11_context.h b/game_patch/graphics/d3d11/gr_d3d11_context.h index b8fe5f904..0d63cf1b7 100644 --- a/game_patch/graphics/d3d11/gr_d3d11_context.h +++ b/game_patch/graphics/d3d11/gr_d3d11_context.h @@ -83,7 +83,8 @@ namespace df::gr::d3d11 { bool alpha_test = mode.get_zbuffer_type() == gr::ZBUFFER_TYPE_FULL_ALPHA_TEST; bool fog_allowed = mode.get_fog_type() != gr::FOG_NOT_ALLOWED; - if (force_update_ || current_alpha_test_ != alpha_test || current_fog_allowed_ != fog_allowed || current_color_ != color) { + if (force_update_ || current_alpha_test_ != alpha_test || current_fog_allowed_ != fog_allowed || + current_color_ != color) { current_alpha_test_ = alpha_test; current_fog_allowed_ = fog_allowed; current_color_ = color; @@ -133,11 +134,8 @@ namespace df::gr::d3d11 { public: RenderContext( - ComPtr device, - ComPtr device_context, - StateManager& state_manager, - ShaderManager& shader_manager, - TextureManager& texture_manager + ComPtr device, ComPtr device_context, StateManager& state_manager, + ShaderManager& shader_manager, TextureManager& texture_manager ); ID3D11Device* device() const @@ -175,8 +173,7 @@ namespace df::gr::d3d11 set_sampler_states(sampler_states); } if (!current_mode_ || current_mode_.value().get_alpha_blend() != mode.get_alpha_blend()) { - ID3D11BlendState* blend_state = - state_manager_.lookup_blend_state(mode.get_alpha_blend()); + ID3D11BlendState* blend_state = state_manager_.lookup_blend_state(mode.get_alpha_blend()); set_blend_state(blend_state); } if (!current_mode_ || current_mode_.value().get_zbuffer_type() != mode.get_zbuffer_type()) { @@ -224,13 +221,13 @@ namespace df::gr::d3d11 { render_target_view_ = render_target_view; depth_stencil_view_ = depth_stencil_view; - ID3D11RenderTargetView* render_targets[] = { render_target_view }; + ID3D11RenderTargetView* render_targets[] = {render_target_view}; device_context_->OMSetRenderTargets(std::size(render_targets), render_targets, depth_stencil_view); } void bind_vs_cbuffer(int index, ID3D11Buffer* cbuffer) { - ID3D11Buffer* vs_cbuffers[] = { cbuffer }; + ID3D11Buffer* vs_cbuffers[] = {cbuffer}; device_context_->VSSetConstantBuffers(index, std::size(vs_cbuffers), vs_cbuffers); } @@ -259,8 +256,8 @@ namespace df::gr::d3d11 assert(slot < vertex_buffer_slots); if (current_vertex_buffers_[slot] != vertex_buffer) { current_vertex_buffers_[slot] = vertex_buffer; - UINT offsets[] = { 0 }; - ID3D11Buffer* vertex_buffers[] = { vertex_buffer }; + UINT offsets[] = {0}; + ID3D11Buffer* vertex_buffers[] = {vertex_buffer}; device_context_->IASetVertexBuffers(slot, std::size(vertex_buffers), vertex_buffers, &stride, offsets); } } @@ -317,7 +314,9 @@ namespace df::gr::d3d11 current_cull_mode_ = cull_mode; zbias_changed_ = false; depth_clip_enabled_changed_ = false; - set_rasterizer_state(state_manager_.lookup_rasterizer_state(current_cull_mode_, zbias_, depth_clip_enabled_)); + set_rasterizer_state( + state_manager_.lookup_rasterizer_state(current_cull_mode_, zbias_, depth_clip_enabled_) + ); } } diff --git a/game_patch/graphics/d3d11/gr_d3d11_dynamic_geometry.cpp b/game_patch/graphics/d3d11/gr_d3d11_dynamic_geometry.cpp index 08ff5c834..085526933 100644 --- a/game_patch/graphics/d3d11/gr_d3d11_dynamic_geometry.cpp +++ b/game_patch/graphics/d3d11/gr_d3d11_dynamic_geometry.cpp @@ -11,7 +11,9 @@ namespace df::gr::d3d11 constexpr int batch_max_vertex = 6000; constexpr int batch_max_index = 10000; - DynamicGeometryRenderer::DynamicGeometryRenderer(ComPtr device, ShaderManager& shader_manager, RenderContext& render_context) : + DynamicGeometryRenderer::DynamicGeometryRenderer( + ComPtr device, ShaderManager& shader_manager, RenderContext& render_context + ) : device_{device}, render_context_(render_context), vertex_ring_buffer_{batch_max_vertex, D3D11_BIND_VERTEX_BUFFER, device_, render_context.device_context()}, index_ring_buffer_{batch_max_index, D3D11_BIND_INDEX_BUFFER, device_, render_context.device_context()} @@ -29,8 +31,10 @@ namespace df::gr::d3d11 } auto [start_index, num_index] = index_ring_buffer_.submit(); - xlog::trace("Drawing dynamic geometry num_vertex {} num_index {} texture {}", - num_vertex, num_index, rf::bm::get_filename(state_.textures[0])); + xlog::trace( + "Drawing dynamic geometry num_vertex {} num_index {} texture {}", num_vertex, num_index, + rf::bm::get_filename(state_.textures[0]) + ); render_context_.set_vertex_buffer(vertex_ring_buffer_.get_buffer(), sizeof(GpuTransformedVertex)); render_context_.set_index_buffer(index_ring_buffer_.get_buffer()); @@ -91,7 +95,9 @@ namespace df::gr::d3d11 }; } - void DynamicGeometryRenderer::add_poly(int nv, const gr::Vertex **vertices, int vertex_attributes, const std::array& tex_handles, gr::Mode mode) + void DynamicGeometryRenderer::add_poly( + int nv, const gr::Vertex** vertices, int vertex_attributes, const std::array& tex_handles, gr::Mode mode + ) { int num_index = (nv - 2) * 3; if (nv > batch_max_vertex || num_index > batch_max_index) { @@ -140,7 +146,8 @@ namespace df::gr::d3d11 out_vert.diffuse = pack_color(color); out_vert.u0 = in_vert.u1; out_vert.v0 = in_vert.v1; - //xlog::info("vert[{}]: pos <{:.2f} {:.2f} {:.2f}> uv <{:.2f} {:.2f}>", i, out_vert.x, out_vert.y, in_vert.sw, out_vert.u0, out_vert.v0); + // xlog::info("vert[{}]: pos <{:.2f} {:.2f} {:.2f}> uv <{:.2f} {:.2f}>", i, out_vert.x, out_vert.y, + // in_vert.sw, out_vert.u0, out_vert.v0); if (i >= 2) { *(gpu_ind_ptr++) = base_vertex; @@ -150,7 +157,7 @@ namespace df::gr::d3d11 } } - void DynamicGeometryRenderer::line(const gr::Vertex **vertices, rf::gr::Mode mode, bool is_3d) + void DynamicGeometryRenderer::line(const gr::Vertex** vertices, rf::gr::Mode mode, bool is_3d) { constexpr int num_verts = 2; constexpr int num_inds = 2; @@ -198,7 +205,10 @@ namespace df::gr::d3d11 line(verts_ptrs, mode, false); } - void DynamicGeometryRenderer::bitmap(int bm_handle, float x, float y, float w, float h, float sx, float sy, float sw, float sh, bool flip_x, bool flip_y, gr::Mode mode) + void DynamicGeometryRenderer::bitmap( + int bm_handle, float x, float y, float w, float h, float sx, float sy, float sw, float sh, bool flip_x, + bool flip_y, gr::Mode mode + ) { xlog::trace("Drawing bitmap"); int bm_w, bm_h; diff --git a/game_patch/graphics/d3d11/gr_d3d11_dynamic_geometry.h b/game_patch/graphics/d3d11/gr_d3d11_dynamic_geometry.h index 3e40f345d..5ca6833dc 100644 --- a/game_patch/graphics/d3d11/gr_d3d11_dynamic_geometry.h +++ b/game_patch/graphics/d3d11/gr_d3d11_dynamic_geometry.h @@ -15,26 +15,30 @@ namespace df::gr::d3d11 class DynamicGeometryRenderer { public: - DynamicGeometryRenderer(ComPtr device, ShaderManager& shader_manager, RenderContext& render_context); - void add_poly(int nv, const rf::gr::Vertex **vertices, int vertex_attributes, const std::array& tex_handles, rf::gr::Mode mode); - void line(const gr::Vertex **vertices, rf::gr::Mode mode, bool is_3d); + DynamicGeometryRenderer( + ComPtr device, ShaderManager& shader_manager, RenderContext& render_context + ); + void add_poly( + int nv, const rf::gr::Vertex** vertices, int vertex_attributes, const std::array& tex_handles, + rf::gr::Mode mode + ); + void line(const gr::Vertex** vertices, rf::gr::Mode mode, bool is_3d); void line_3d(const rf::gr::Vertex& v0, const rf::gr::Vertex& v1, rf::gr::Mode mode); void line_2d(float x1, float y1, float x2, float y2, rf::gr::Mode mode); - void bitmap(int bm_handle, float x, float y, float w, float h, float sx, float sy, float sw, float sh, bool flip_x, bool flip_y, gr::Mode mode); + void bitmap( + int bm_handle, float x, float y, float w, float h, float sx, float sy, float sw, float sh, bool flip_x, + bool flip_y, gr::Mode mode + ); void flush(); private: struct State { D3D11_PRIMITIVE_TOPOLOGY primitive_topology = D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST; - std::array textures = { -1, -1 }; + std::array textures = {-1, -1}; rf::gr::Mode mode{ - rf::gr::TEXTURE_SOURCE_NONE, - rf::gr::COLOR_SOURCE_VERTEX, - rf::gr::ALPHA_SOURCE_VERTEX, - rf::gr::ALPHA_BLEND_NONE, - rf::gr::ZBUFFER_TYPE_NONE, - rf::gr::FOG_ALLOWED, + rf::gr::TEXTURE_SOURCE_NONE, rf::gr::COLOR_SOURCE_VERTEX, rf::gr::ALPHA_SOURCE_VERTEX, + rf::gr::ALPHA_BLEND_NONE, rf::gr::ZBUFFER_TYPE_NONE, rf::gr::FOG_ALLOWED, }; ID3D11PixelShader* pixel_shader = nullptr; diff --git a/game_patch/graphics/d3d11/gr_d3d11_error.cpp b/game_patch/graphics/d3d11/gr_d3d11_error.cpp index 9d7c4a43b..680ff6d5d 100644 --- a/game_patch/graphics/d3d11/gr_d3d11_error.cpp +++ b/game_patch/graphics/d3d11/gr_d3d11_error.cpp @@ -4,7 +4,9 @@ namespace df::gr::d3d11 { - #define GR_D3D11_ERROR_CASE(hr) case hr: return #hr; +#define GR_D3D11_ERROR_CASE(hr) \ + case hr: \ + return #hr; static ID3D11Device* g_device; @@ -19,7 +21,7 @@ namespace df::gr::d3d11 GR_D3D11_ERROR_CASE(S_FALSE) GR_D3D11_ERROR_CASE(DXGI_ERROR_ACCESS_DENIED) GR_D3D11_ERROR_CASE(DXGI_ERROR_ACCESS_LOST) - //GR_D3D11_ERROR_CASE(DXGI_ERROR_ALREADY_EXISTS) + // GR_D3D11_ERROR_CASE(DXGI_ERROR_ALREADY_EXISTS) GR_D3D11_ERROR_CASE(DXGI_ERROR_CANNOT_PROTECT_CONTENT) GR_D3D11_ERROR_CASE(DXGI_ERROR_DEVICE_HUNG) GR_D3D11_ERROR_CASE(DXGI_ERROR_DEVICE_REMOVED) @@ -47,7 +49,8 @@ namespace df::gr::d3d11 // GR_D3D11_ERROR_CASE(D3D11_ERROR_DEFERRED_CONTEXT_MAP_WITHOUT_INITIAL_DISCARD) // GR_D3D11_ERROR_CASE(D3DERR_INVALIDCALL) // GR_D3D11_ERROR_CASE(D3DERR_WASSTILLDRAWING) - default: return "-"; + default: + return "-"; } } @@ -59,10 +62,10 @@ namespace df::gr::d3d11 ComPtr info_queue; if (SUCCEEDED(debug->QueryInterface(__uuidof(ID3D11InfoQueue), (void**)&info_queue))) { - #ifndef NDEBUG +#ifndef NDEBUG info_queue->SetBreakOnSeverity(D3D11_MESSAGE_SEVERITY_CORRUPTION, true); info_queue->SetBreakOnSeverity(D3D11_MESSAGE_SEVERITY_ERROR, true); - #endif +#endif } } } diff --git a/game_patch/graphics/d3d11/gr_d3d11_hooks.cpp b/game_patch/graphics/d3d11/gr_d3d11_hooks.cpp index d7707a397..991e37884 100644 --- a/game_patch/graphics/d3d11/gr_d3d11_hooks.cpp +++ b/game_patch/graphics/d3d11/gr_d3d11_hooks.cpp @@ -20,15 +20,15 @@ namespace df::gr::d3d11 void msg_handler(UINT msg, WPARAM w_param, LPARAM l_param) { switch (msg) { - case WM_ACTIVATEAPP: - if (w_param) { - xlog::trace("active {:x} {:x}", w_param, l_param); - renderer->window_active(); - } - else { - xlog::trace("inactive {:x} {:x}", w_param, l_param); - renderer->window_inactive(); - } + case WM_ACTIVATEAPP: + if (w_param) { + xlog::trace("active {:x} {:x}", w_param, l_param); + renderer->window_active(); + } + else { + xlog::trace("inactive {:x} {:x}", w_param, l_param); + renderer->window_inactive(); + } } } @@ -56,7 +56,7 @@ namespace df::gr::d3d11 _controlfp(_PC_24, _MCW_PC); } - rf::bm::Format read_back_buffer(int x, int y, int w, int h, rf::ubyte *data) + rf::bm::Format read_back_buffer(int x, int y, int w, int h, rf::ubyte* data) { return renderer->read_back_buffer(x, y, w, h, data); } @@ -71,12 +71,18 @@ namespace df::gr::d3d11 renderer->clear(); } - void bitmap(int bitmap_handle, int x, int y, int w, int h, int sx, int sy, int sw, int sh, bool flip_x, bool flip_y, rf::gr::Mode mode) + void bitmap( + int bitmap_handle, int x, int y, int w, int h, int sx, int sy, int sw, int sh, bool flip_x, bool flip_y, + rf::gr::Mode mode + ) { renderer->bitmap(bitmap_handle, x, y, w, h, sx, sy, sw, sh, flip_x, flip_y, mode); } - void bitmap_float(int bitmap_handle, float x, float y, float w, float h, float sx, float sy, float sw, float sh, bool flip_x, bool flip_y, rf::gr::Mode mode) + void bitmap_float( + int bitmap_handle, float x, float y, float w, float h, float sx, float sy, float sw, float sh, bool flip_x, + bool flip_y, rf::gr::Mode mode + ) { renderer->bitmap(bitmap_handle, x, y, w, h, sx, sy, sw, sh, flip_x, flip_y, mode); } @@ -91,7 +97,7 @@ namespace df::gr::d3d11 renderer->zbuffer_clear(); } - void tmapper(int nv, const rf::gr::Vertex **vertices, int vertex_attributes, rf::gr::Mode mode) + void tmapper(int nv, const rf::gr::Vertex** vertices, int vertex_attributes, rf::gr::Mode mode) { renderer->tmapper(nv, vertices, vertex_attributes, mode); } @@ -121,17 +127,17 @@ namespace df::gr::d3d11 renderer->texture_mark_dirty(bm_handle); } - bool lock(int bm_handle, int section, rf::gr::LockInfo *lock) + bool lock(int bm_handle, int section, rf::gr::LockInfo* lock) { return renderer->lock(bm_handle, section, lock); } - void unlock(rf::gr::LockInfo *lock) + void unlock(rf::gr::LockInfo* lock) { renderer->unlock(lock); } - void get_texel(int bm_handle, float u, float v, rf::gr::Color *clr) + void get_texel(int bm_handle, float u, float v, rf::gr::Color* clr) { renderer->get_texel(bm_handle, u, v, clr); } @@ -156,24 +162,30 @@ namespace df::gr::d3d11 renderer->render_movable_solid(solid, pos, orient); } - void render_alpha_detail_room(rf::GRoom *room, rf::GSolid *solid) + void render_alpha_detail_room(rf::GRoom* room, rf::GSolid* solid) { if (renderer) { renderer->render_alpha_detail_room(room, solid); } } - void render_sky_room(rf::GRoom *room) + void render_sky_room(rf::GRoom* room) { renderer->render_sky_room(room); } - void render_v3d_vif(rf::VifLodMesh *lod_mesh, [[maybe_unused]] rf::VifMesh *mesh, const rf::Vector3& pos, const rf::Matrix3& orient, int lod_index, const rf::MeshRenderParams& params) + void render_v3d_vif( + rf::VifLodMesh* lod_mesh, [[maybe_unused]] rf::VifMesh* mesh, const rf::Vector3& pos, const rf::Matrix3& orient, + int lod_index, const rf::MeshRenderParams& params + ) { renderer->render_v3d_vif(lod_mesh, lod_index, pos, orient, params); } - void render_character_vif(rf::VifLodMesh *lod_mesh, [[maybe_unused]] rf::VifMesh *mesh, const rf::Vector3& pos, const rf::Matrix3& orient, const rf::CharacterInstance *ci, int lod_index, const rf::MeshRenderParams& params) + void render_character_vif( + rf::VifLodMesh* lod_mesh, [[maybe_unused]] rf::VifMesh* mesh, const rf::Vector3& pos, const rf::Matrix3& orient, + const rf::CharacterInstance* ci, int lod_index, const rf::MeshRenderParams& params + ) { renderer->render_character_vif(lod_mesh, lod_index, pos, orient, ci, params); } @@ -233,7 +245,7 @@ namespace df::gr::d3d11 float sy = matrix_scale.y / matrix_scale.z; static auto& zm = addr_as_ref(0x005A7DD8); float zn = 0.1f; // static near plane (RF uses: zm / matrix_scale.z) - zm = 1.0f; // let's not use zm at all to simplify software projections + zm = 1.0f; // let's not use zm at all to simplify software projections float zf = rf::level.distance_fog_far_clip > 0.0f ? rf::level.distance_fog_far_clip : 1700.0f; renderer->setup_3d(Projection{sx, sy, zn, zf}); }, @@ -329,81 +341,81 @@ void gr_d3d11_apply_patch() // Do not use built-in render cache AsmWriter{0x004F0B90}.jmp(clear_solid_render_cache); // g_render_cache_clear - AsmWriter{0x004F0B20}.ret(); // g_render_cache_init + AsmWriter{0x004F0B20}.ret(); // g_render_cache_init using namespace asm_regs; - AsmWriter{0x00544FC0}.jmp(flip); // gr_d3d_flip - AsmWriter{0x00545230}.jmp(close); // gr_d3d_close - AsmWriter{0x00545960}.jmp(init); // gr_d3d_init + AsmWriter{0x00544FC0}.jmp(flip); // gr_d3d_flip + AsmWriter{0x00545230}.jmp(close); // gr_d3d_close + AsmWriter{0x00545960}.jmp(init); // gr_d3d_init AsmWriter{0x00546730}.jmp(read_back_buffer); // gr_d3d_read_backbuffer - AsmWriter{0x005468C0}.jmp(fog_set); // gr_d3d_fog_set - AsmWriter{0x00546A00}.mov(al, 1).ret(); // gr_d3d_is_mode_supported - //AsmWriter{0x00546A40}.ret(); // gr_d3d_setup_frustum - //AsmWriter{0x00546F60}.ret(); // gr_d3d_change_frustum - //AsmWriter{0x00547150}.ret(); // gr_d3d_setup_3d - //AsmWriter{0x005473F0}.ret(); // gr_d3d_start_instance - //AsmWriter{0x00547540}.ret(); // gr_d3d_stop_instance + AsmWriter{0x005468C0}.jmp(fog_set); // gr_d3d_fog_set + AsmWriter{0x00546A00}.mov(al, 1).ret(); // gr_d3d_is_mode_supported + // AsmWriter{0x00546A40}.ret(); // gr_d3d_setup_frustum + // AsmWriter{0x00546F60}.ret(); // gr_d3d_change_frustum + // AsmWriter{0x00547150}.ret(); // gr_d3d_setup_3d + // AsmWriter{0x005473F0}.ret(); // gr_d3d_start_instance + // AsmWriter{0x00547540}.ret(); // gr_d3d_stop_instance AsmWriter{0x005477A0}.jmp(project_vertex_new); // gr_d3d_project_vertex - //AsmWriter{0x005478F0}.ret(); // gr_d3d_is_normal_facing - //AsmWriter{0x00547960}.ret(); // gr_d3d_is_normal_facing_plane - //AsmWriter{0x005479B0}.ret(); // gr_d3d_get_apparent_distance_from_camera - //AsmWriter{0x005479D0}.ret(); // gr_d3d_screen_coords_from_world_coords - AsmWriter{0x00547A60}.ret(); // gr_d3d_update_gamma_ramp - AsmWriter{0x00547AC0}.ret(); // gr_d3d_set_texture_mip_filter - AsmWriter{0x00550820}.jmp(page_in); // gr_d3d_page_in - AsmWriter{0x005508C0}.jmp(clear); // gr_d3d_clear + // AsmWriter{0x005478F0}.ret(); // gr_d3d_is_normal_facing + // AsmWriter{0x00547960}.ret(); // gr_d3d_is_normal_facing_plane + // AsmWriter{0x005479B0}.ret(); // gr_d3d_get_apparent_distance_from_camera + // AsmWriter{0x005479D0}.ret(); // gr_d3d_screen_coords_from_world_coords + AsmWriter{0x00547A60}.ret(); // gr_d3d_update_gamma_ramp + AsmWriter{0x00547AC0}.ret(); // gr_d3d_set_texture_mip_filter + AsmWriter{0x00550820}.jmp(page_in); // gr_d3d_page_in + AsmWriter{0x005508C0}.jmp(clear); // gr_d3d_clear AsmWriter{0x00550980}.jmp(zbuffer_clear); // gr_d3d_zbuffer_clear - AsmWriter{0x00550A30}.jmp(set_clip); // gr_d3d_set_clip - AsmWriter{0x00550AA0}.jmp(bitmap); // gr_d3d_bitmap - AsmWriter{0x00551450}.ret(); // gr_d3d_flush_after_color_change - AsmWriter{0x00551460}.jmp(line); // gr_d3d_line - AsmWriter{0x00551900}.jmp(tmapper); // gr_d3d_tmapper + AsmWriter{0x00550A30}.jmp(set_clip); // gr_d3d_set_clip + AsmWriter{0x00550AA0}.jmp(bitmap); // gr_d3d_bitmap + AsmWriter{0x00551450}.ret(); // gr_d3d_flush_after_color_change + AsmWriter{0x00551460}.jmp(line); // gr_d3d_line + AsmWriter{0x00551900}.jmp(tmapper); // gr_d3d_tmapper AsmWriter{0x005536C0}.jmp(render_sky_room); AsmWriter{0x00553C60}.jmp(render_movable_solid); // gr_d3d_render_movable_solid - uses gr_d3d_render_face_list - //AsmWriter{0x00553EE0}.ret(); // gr_d3d_vfx - uses gr_poly - //AsmWriter{0x00554BF0}.ret(); // gr_d3d_vfx_facing - uses gr_d3d_3d_bitmap_angle, gr_d3d_render_volumetric_light - //AsmWriter{0x00555080}.ret(); // gr_d3d_vfx_glow - uses gr_d3d_3d_bitmap_angle - //AsmWriter{0x00555100}.ret(); // gr_d3d_line_vertex + // AsmWriter{0x00553EE0}.ret(); // gr_d3d_vfx - uses gr_poly + // AsmWriter{0x00554BF0}.ret(); // gr_d3d_vfx_facing - uses gr_d3d_3d_bitmap_angle, gr_d3d_render_volumetric_light + // AsmWriter{0x00555080}.ret(); // gr_d3d_vfx_glow - uses gr_d3d_3d_bitmap_angle + // AsmWriter{0x00555100}.ret(); // gr_d3d_line_vertex AsmWriter{0x005516E0}.jmp(line_3d); // gr_d3d_line_vertex_internal - //AsmWriter{0x005551E0}.ret(); // gr_d3d_line_vec - uses gr_d3d_line_vertex - //AsmWriter{0x00555790}.ret(); // gr_d3d_3d_bitmap - uses gr_poly - //AsmWriter{0x00555AC0}.ret(); // gr_d3d_3d_bitmap_angle - uses gr_poly - //AsmWriter{0x00555B20}.ret(); // gr_d3d_3d_bitmap_angle_wh - uses gr_poly - //AsmWriter{0x00555B80}.ret(); // gr_d3d_render_volumetric_light - uses gr_poly - //AsmWriter{0x00555DC0}.ret(); // gr_d3d_laser - uses gr_tmapper - //AsmWriter{0x005563F0}.ret(); // gr_d3d_cylinder - uses gr_line - //AsmWriter{0x005565D0}.ret(); // gr_d3d_cone - uses gr_line - //AsmWriter{0x005566E0}.ret(); // gr_d3d_sphere - uses gr_line - //AsmWriter{0x00556AB0}.ret(); // gr_d3d_chain - uses gr_poly - //AsmWriter{0x00556F50}.ret(); // gr_d3d_line_directed - uses gr_line_vertex - //AsmWriter{0x005571F0}.ret(); // gr_d3d_line_arrow - uses gr_line_vertex - //AsmWriter{0x00557460}.ret(); // gr_d3d_render_particle_sys_particle - uses gr_poly, gr_3d_bitmap_angle - //AsmWriter{0x00557D40}.ret(); // gr_d3d_render_bolts - uses gr_poly, gr_line - //AsmWriter{0x00558320}.ret(); // gr_d3d_render_geomod_debris - uses gr_poly - //AsmWriter{0x00558450}.ret(); // gr_d3d_render_glass_shard - uses gr_poly + // AsmWriter{0x005551E0}.ret(); // gr_d3d_line_vec - uses gr_d3d_line_vertex + // AsmWriter{0x00555790}.ret(); // gr_d3d_3d_bitmap - uses gr_poly + // AsmWriter{0x00555AC0}.ret(); // gr_d3d_3d_bitmap_angle - uses gr_poly + // AsmWriter{0x00555B20}.ret(); // gr_d3d_3d_bitmap_angle_wh - uses gr_poly + // AsmWriter{0x00555B80}.ret(); // gr_d3d_render_volumetric_light - uses gr_poly + // AsmWriter{0x00555DC0}.ret(); // gr_d3d_laser - uses gr_tmapper + // AsmWriter{0x005563F0}.ret(); // gr_d3d_cylinder - uses gr_line + // AsmWriter{0x005565D0}.ret(); // gr_d3d_cone - uses gr_line + // AsmWriter{0x005566E0}.ret(); // gr_d3d_sphere - uses gr_line + // AsmWriter{0x00556AB0}.ret(); // gr_d3d_chain - uses gr_poly + // AsmWriter{0x00556F50}.ret(); // gr_d3d_line_directed - uses gr_line_vertex + // AsmWriter{0x005571F0}.ret(); // gr_d3d_line_arrow - uses gr_line_vertex + // AsmWriter{0x00557460}.ret(); // gr_d3d_render_particle_sys_particle - uses gr_poly, gr_3d_bitmap_angle + // AsmWriter{0x00557D40}.ret(); // gr_d3d_render_bolts - uses gr_poly, gr_line + // AsmWriter{0x00558320}.ret(); // gr_d3d_render_geomod_debris - uses gr_poly + // AsmWriter{0x00558450}.ret(); // gr_d3d_render_glass_shard - uses gr_poly AsmWriter{0x00558550}.ret(); // gr_d3d_render_face_wireframe - //AsmWriter{0x005585F0}.ret(); // gr_d3d_render_weapon_tracer - uses gr_poly + // AsmWriter{0x005585F0}.ret(); // gr_d3d_render_weapon_tracer - uses gr_poly AsmWriter{0x005587C0}.jmp(poly); // gr_d3d_poly - AsmWriter{0x00558920}.ret(); // gr_d3d_render_geometry_wireframe - AsmWriter{0x00558960}.ret(); // gr_d3d_render_geometry_in_editor - AsmWriter{0x00558C40}.ret(); // gr_d3d_render_sel_face_in_editor - //AsmWriter{0x00558D40}.ret(); // gr_d3d_world_poly - uses gr_d3d_poly - //AsmWriter{0x00558E30}.ret(); // gr_d3d_3d_bitmap_stretched_square - uses gr_d3d_world_poly - //AsmWriter{0x005590F0}.ret(); // gr_d3d_rod - uses gr_d3d_world_poly - AsmWriter{0x005596C0}.ret(); // gr_d3d_render_face_list_colored - AsmWriter{0x0055B520}.jmp(texture_save_cache); // gr_d3d_texture_save_cache + AsmWriter{0x00558920}.ret(); // gr_d3d_render_geometry_wireframe + AsmWriter{0x00558960}.ret(); // gr_d3d_render_geometry_in_editor + AsmWriter{0x00558C40}.ret(); // gr_d3d_render_sel_face_in_editor + // AsmWriter{0x00558D40}.ret(); // gr_d3d_world_poly - uses gr_d3d_poly + // AsmWriter{0x00558E30}.ret(); // gr_d3d_3d_bitmap_stretched_square - uses gr_d3d_world_poly + // AsmWriter{0x005590F0}.ret(); // gr_d3d_rod - uses gr_d3d_world_poly + AsmWriter{0x005596C0}.ret(); // gr_d3d_render_face_list_colored + AsmWriter{0x0055B520}.jmp(texture_save_cache); // gr_d3d_texture_save_cache AsmWriter{0x0055B550}.jmp(texture_flush_cache); // gr_d3d_texture_flush_cache - AsmWriter{0x0055CDC0}.jmp(texture_mark_dirty); // gr_d3d_texture_mark_dirty - AsmWriter{0x0055CE00}.jmp(lock); // gr_d3d_lock - AsmWriter{0x0055CF60}.jmp(unlock); // gr_d3d_unlock - AsmWriter{0x0055CFA0}.jmp(get_texel); // gr_d3d_get_texel - AsmWriter{0x0055D160}.jmp(texture_add_ref); // gr_d3d_texture_add_ref - AsmWriter{0x0055D190}.jmp(texture_remove_ref); // gr_d3d_texture_remove_ref - AsmWriter{0x0055F5E0}.jmp(render_solid); // gr_d3d_render_static_solid - AsmWriter{0x00561650}.ret(); // gr_d3d_render_face_list - //AsmWriter{0x0052FA40}.jmp(render_lod_vif); // gr_d3d_render_vif_mesh - AsmWriter{0x0052DE10}.jmp(render_v3d_vif); // gr_d3d_render_v3d_vif - AsmWriter{0x0052E9E0}.jmp(render_character_vif); // gr_d3d_render_character_vif + AsmWriter{0x0055CDC0}.jmp(texture_mark_dirty); // gr_d3d_texture_mark_dirty + AsmWriter{0x0055CE00}.jmp(lock); // gr_d3d_lock + AsmWriter{0x0055CF60}.jmp(unlock); // gr_d3d_unlock + AsmWriter{0x0055CFA0}.jmp(get_texel); // gr_d3d_get_texel + AsmWriter{0x0055D160}.jmp(texture_add_ref); // gr_d3d_texture_add_ref + AsmWriter{0x0055D190}.jmp(texture_remove_ref); // gr_d3d_texture_remove_ref + AsmWriter{0x0055F5E0}.jmp(render_solid); // gr_d3d_render_static_solid + AsmWriter{0x00561650}.ret(); // gr_d3d_render_face_list + // AsmWriter{0x0052FA40}.jmp(render_lod_vif); // gr_d3d_render_vif_mesh + AsmWriter{0x0052DE10}.jmp(render_v3d_vif); // gr_d3d_render_v3d_vif + AsmWriter{0x0052E9E0}.jmp(render_character_vif); // gr_d3d_render_character_vif AsmWriter{0x004D34D0}.jmp(render_alpha_detail_room); // room_render_alpha_detail // Change size of standard structures diff --git a/game_patch/graphics/d3d11/gr_d3d11_mesh.cpp b/game_patch/graphics/d3d11/gr_d3d11_mesh.cpp index 7695172f3..5bd97e21a 100644 --- a/game_patch/graphics/d3d11/gr_d3d11_mesh.cpp +++ b/game_patch/graphics/d3d11/gr_d3d11_mesh.cpp @@ -37,11 +37,15 @@ namespace df::gr::d3d11 class MeshRenderCache : public BaseMeshRenderCache { public: - MeshRenderCache(VifLodMesh* lod_mesh, BufferWrapper& vertex_buffer, BufferWrapper& index_buffer, RenderContext& render_context); + MeshRenderCache( + VifLodMesh* lod_mesh, BufferWrapper& vertex_buffer, BufferWrapper& index_buffer, + RenderContext& render_context + ); }; - MeshRenderCache::MeshRenderCache(VifLodMesh* lod_mesh, BufferWrapper& vertex_buffer, BufferWrapper& index_buffer, RenderContext& render_context) : - BaseMeshRenderCache(lod_mesh) + MeshRenderCache::MeshRenderCache( + VifLodMesh* lod_mesh, BufferWrapper& vertex_buffer, BufferWrapper& index_buffer, RenderContext& render_context + ) : BaseMeshRenderCache(lod_mesh) { std::size_t num_verts = 0; std::size_t num_inds = 0; @@ -102,8 +106,9 @@ namespace df::gr::d3d11 int num_indices = gpu_inds.size() - start_index; meshes_[lod_index].batches.emplace_back( - index_buffer.size() + start_index, num_indices, base_vertex, - chunk.texture_idx, chunk.mode, double_sided); + index_buffer.size() + start_index, num_indices, base_vertex, chunk.texture_idx, chunk.mode, + double_sided + ); } } xlog::debug("Creating mesh geometry buffers: verts {} inds {}", gpu_verts.size(), gpu_inds.size()); @@ -140,9 +145,7 @@ namespace df::gr::d3d11 D3D11_USAGE_DYNAMIC, D3D11_CPU_ACCESS_WRITE, }; - DF_GR_D3D11_CHECK_HR( - device->CreateBuffer(&buffer_desc, nullptr, &buffer_) - ); + DF_GR_D3D11_CHECK_HR(device->CreateBuffer(&buffer_desc, nullptr, &buffer_)); } static inline GpuMatrix4x3 convert_bone_matrix(const Matrix43& mat) @@ -166,14 +169,11 @@ namespace df::gr::d3d11 } D3D11_MAPPED_SUBRESOURCE mapped_subres; - DF_GR_D3D11_CHECK_HR( - device_context->Map(buffer_, 0, D3D11_MAP_WRITE_DISCARD, 0, &mapped_subres) - ); + DF_GR_D3D11_CHECK_HR(device_context->Map(buffer_, 0, D3D11_MAP_WRITE_DISCARD, 0, &mapped_subres)); std::memcpy(mapped_subres.pData, &data, sizeof(data)); device_context->Unmap(buffer_, 0); } - class CharacterMeshRenderCache : public BaseMeshRenderCache { public: @@ -281,8 +281,8 @@ namespace df::gr::d3d11 int num_indices = gpu_inds.size() - start_index; meshes_[lod_index].batches.emplace_back( - start_index, num_indices, base_vertex, - chunk.texture_idx, chunk.mode, double_sided); + start_index, num_indices, base_vertex, chunk.texture_idx, chunk.mode, double_sided + ); } } xlog::debug("Creating mesh render buffer - verts {} inds {}", gpu_verts_0.size(), gpu_inds.size()); @@ -293,9 +293,7 @@ namespace df::gr::d3d11 D3D11_USAGE_IMMUTABLE, }; D3D11_SUBRESOURCE_DATA vb_0_subres_data{gpu_verts_0.data(), 0, 0}; - DF_GR_D3D11_CHECK_HR( - device->CreateBuffer(&vb_0_desc, &vb_0_subres_data, &vertex_buffer_0_) - ); + DF_GR_D3D11_CHECK_HR(device->CreateBuffer(&vb_0_desc, &vb_0_subres_data, &vertex_buffer_0_)); CD3D11_BUFFER_DESC vb_1_desc{ sizeof(gpu_verts_1[1]) * gpu_verts_1.size(), @@ -303,9 +301,7 @@ namespace df::gr::d3d11 D3D11_USAGE_IMMUTABLE, }; D3D11_SUBRESOURCE_DATA vb_1_subres_data{gpu_verts_1.data(), 0, 0}; - DF_GR_D3D11_CHECK_HR( - device->CreateBuffer(&vb_1_desc, &vb_1_subres_data, &vertex_buffer_1_) - ); + DF_GR_D3D11_CHECK_HR(device->CreateBuffer(&vb_1_desc, &vb_1_subres_data, &vertex_buffer_1_)); CD3D11_BUFFER_DESC ib_desc{ sizeof(gpu_inds[0]) * gpu_inds.size(), @@ -313,12 +309,12 @@ namespace df::gr::d3d11 D3D11_USAGE_IMMUTABLE, }; D3D11_SUBRESOURCE_DATA ib_subres_data{gpu_inds.data(), 0, 0}; - DF_GR_D3D11_CHECK_HR( - device->CreateBuffer(&ib_desc, &ib_subres_data, &index_buffer_) - ); + DF_GR_D3D11_CHECK_HR(device->CreateBuffer(&ib_desc, &ib_subres_data, &index_buffer_)); } - void CharacterMeshRenderCache::update_morphed_vertices_buffer(rf::Skeleton* skeleton, int time, RenderContext& render_context) + void CharacterMeshRenderCache::update_morphed_vertices_buffer( + rf::Skeleton* skeleton, int time, RenderContext& render_context + ) { rf::VifMesh* mesh = lod_mesh_->meshes[0]; if (!morphed_vertex_buffer_0_) { @@ -361,8 +357,10 @@ namespace df::gr::d3d11 render_context.device_context()->Unmap(morphed_vertex_buffer_0_, 0); } - MeshRenderer::MeshRenderer(ComPtr device, ShaderManager& shader_manager, - [[maybe_unused]] StateManager& state_manager, RenderContext& render_context) : + MeshRenderer::MeshRenderer( + ComPtr device, ShaderManager& shader_manager, [[maybe_unused]] StateManager& state_manager, + RenderContext& render_context + ) : device_{std::move(device)}, render_context_{render_context}, v3d_vb_{initial_vb_size, sizeof(GpuVertex), D3D11_BIND_VERTEX_BUFFER, device_}, v3d_ib_{initial_ib_size, sizeof(rf::ushort), D3D11_BIND_INDEX_BUFFER, device_} @@ -378,7 +376,10 @@ namespace df::gr::d3d11 render_caches_.clear(); } - void MeshRenderer::render_v3d_vif(rf::VifLodMesh *lod_mesh, int lod_index, const rf::Vector3& pos, const rf::Matrix3& orient, const rf::MeshRenderParams& params) + void MeshRenderer::render_v3d_vif( + rf::VifLodMesh* lod_mesh, int lod_index, const rf::Vector3& pos, const rf::Matrix3& orient, + const rf::MeshRenderParams& params + ) { page_in_v3d_mesh(lod_mesh); @@ -392,7 +393,10 @@ namespace df::gr::d3d11 draw_cached_mesh(lod_mesh, *render_cache, params, lod_index); } - void MeshRenderer::render_character_vif(rf::VifLodMesh *lod_mesh, int lod_index, const rf::Vector3& pos, const rf::Matrix3& orient, const rf::CharacterInstance *ci, const rf::MeshRenderParams& params) + void MeshRenderer::render_character_vif( + rf::VifLodMesh* lod_mesh, int lod_index, const rf::Vector3& pos, const rf::Matrix3& orient, + const rf::CharacterInstance* ci, const rf::MeshRenderParams& params + ) { page_in_character_mesh(lod_mesh); auto render_cache = reinterpret_cast(lod_mesh->render_cache); @@ -419,7 +423,7 @@ namespace df::gr::d3d11 draw_cached_mesh(lod_mesh, *render_cache, params, lod_index); } - void MeshRenderer::clear_vif_cache(rf::VifLodMesh *lod_mesh) + void MeshRenderer::clear_vif_cache(rf::VifLodMesh* lod_mesh) { render_caches_.erase(lod_mesh); } @@ -432,7 +436,9 @@ namespace df::gr::d3d11 return lod_mesh->meshes[lod_index]->tex_handles; } - void MeshRenderer::draw_cached_mesh(rf::VifLodMesh *lod_mesh, const BaseMeshRenderCache& cache, const MeshRenderParams& params, int lod_index) + void MeshRenderer::draw_cached_mesh( + rf::VifLodMesh* lod_mesh, const BaseMeshRenderCache& cache, const MeshRenderParams& params, int lod_index + ) { const int* tex_handles = get_tex_handles(lod_mesh, params, lod_index); render_context_.set_primitive_topology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); @@ -442,11 +448,7 @@ namespace df::gr::d3d11 if (ir_scanner) { // used by rail gun scanner for heat overlays forced_mode.emplace( - TEXTURE_SOURCE_NONE, - COLOR_SOURCE_VERTEX, - ALPHA_SOURCE_VERTEX, - ALPHA_BLEND_ALPHA, - ZBUFFER_TYPE_FULL, + TEXTURE_SOURCE_NONE, COLOR_SOURCE_VERTEX, ALPHA_SOURCE_VERTEX, ALPHA_BLEND_ALPHA, ZBUFFER_TYPE_FULL, FOG_ALLOWED ); static int null_tex_handles[7] = {-1, -1, -1, -1, -1, -1, -1}; @@ -463,16 +465,15 @@ namespace df::gr::d3d11 float ambient_r, ambient_g, ambient_b; light_get_ambient(&ambient_r, &ambient_g, &ambient_b); color.set( - static_cast(ambient_r * 255.0f), - static_cast(ambient_g * 255.0f), - static_cast(ambient_b * 255.0f), - 255 + static_cast(ambient_r * 255.0f), static_cast(ambient_g * 255.0f), + static_cast(ambient_b * 255.0f), 255 ); // RF uses some hard-coded lights here but for now let's keep it simple color.red += 40; color.green += 40; color.blue += 40; - } else { + } + else { color = params.self_illum; } color.alpha = static_cast(params.alpha); @@ -504,12 +505,8 @@ namespace df::gr::d3d11 } if (params.powerup_bitmaps[0] != -1 && !ir_scanner) { gr::Mode powerup_mode{ - gr::TEXTURE_SOURCE_CLAMP, - gr::COLOR_SOURCE_TEXTURE, - gr::ALPHA_SOURCE_TEXTURE, - gr::ALPHA_BLEND_ALPHA_ADDITIVE, - gr::ZBUFFER_TYPE_READ, - gr::FOG_NOT_ALLOWED, + gr::TEXTURE_SOURCE_CLAMP, gr::COLOR_SOURCE_TEXTURE, gr::ALPHA_SOURCE_TEXTURE, + gr::ALPHA_BLEND_ALPHA_ADDITIVE, gr::ZBUFFER_TYPE_READ, gr::FOG_NOT_ALLOWED, }; render_context_.set_mode(powerup_mode); render_context_.set_textures(params.powerup_bitmaps[0], -1); @@ -530,7 +527,9 @@ namespace df::gr::d3d11 void MeshRenderer::page_in_v3d_mesh(rf::VifLodMesh* lod_mesh) { if (!lod_mesh->render_cache) { - auto p = render_caches_.insert_or_assign(lod_mesh, std::make_unique(lod_mesh, v3d_vb_, v3d_ib_, render_context_)); + auto p = render_caches_.insert_or_assign( + lod_mesh, std::make_unique(lod_mesh, v3d_vb_, v3d_ib_, render_context_) + ); lod_mesh->render_cache = p.first->second.get(); } } @@ -538,7 +537,9 @@ namespace df::gr::d3d11 void MeshRenderer::page_in_character_mesh(rf::VifLodMesh* lod_mesh) { if (!lod_mesh->render_cache) { - auto p = render_caches_.insert_or_assign(lod_mesh, std::make_unique(lod_mesh, device_)); + auto p = render_caches_.insert_or_assign( + lod_mesh, std::make_unique(lod_mesh, device_) + ); lod_mesh->render_cache = p.first->second.get(); } } @@ -567,9 +568,7 @@ namespace df::gr::d3d11 bind_flag_, D3D11_USAGE_DEFAULT, }; - DF_GR_D3D11_CHECK_HR( - device->CreateBuffer(&desc, nullptr, &buffer_) - ); + DF_GR_D3D11_CHECK_HR(device->CreateBuffer(&desc, nullptr, &buffer_)); } void BufferWrapper::write(void* data, unsigned n, RenderContext& render_context) diff --git a/game_patch/graphics/d3d11/gr_d3d11_mesh.h b/game_patch/graphics/d3d11/gr_d3d11_mesh.h index 84e913b67..4fc2179e2 100644 --- a/game_patch/graphics/d3d11/gr_d3d11_mesh.h +++ b/game_patch/graphics/d3d11/gr_d3d11_mesh.h @@ -23,7 +23,10 @@ namespace df::gr::d3d11 public: struct Batch { - Batch(int start_index, int num_indices, int base_vertex, int texture_index, rf::gr::Mode mode, bool double_sided) : + Batch( + int start_index, int num_indices, int base_vertex, int texture_index, rf::gr::Mode mode, + bool double_sided + ) : start_index{start_index}, num_indices{num_indices}, base_vertex{base_vertex}, texture_index{texture_index}, mode{mode}, double_sided{double_sided} {} @@ -37,9 +40,7 @@ namespace df::gr::d3d11 }; virtual ~BaseMeshRenderCache() {} - BaseMeshRenderCache(rf::VifLodMesh* lod_mesh) : - lod_mesh_(lod_mesh) - {} + BaseMeshRenderCache(rf::VifLodMesh* lod_mesh) : lod_mesh_(lod_mesh) {} const std::vector& get_batches(int lod_level) const { @@ -56,7 +57,6 @@ namespace df::gr::d3d11 std::vector meshes_; }; - class BufferWrapper { public: @@ -92,17 +92,29 @@ namespace df::gr::d3d11 class MeshRenderer { public: - MeshRenderer(ComPtr device, ShaderManager& shader_manager, StateManager& state_manager, RenderContext& render_context); + MeshRenderer( + ComPtr device, ShaderManager& shader_manager, StateManager& state_manager, + RenderContext& render_context + ); ~MeshRenderer(); - void render_v3d_vif(rf::VifLodMesh *lod_mesh, int lod_index, const rf::Vector3& pos, const rf::Matrix3& orient, const rf::MeshRenderParams& params); - void render_character_vif(rf::VifLodMesh *lod_mesh, int lod_index, const rf::Vector3& pos, const rf::Matrix3& orient, const rf::CharacterInstance *ci, const rf::MeshRenderParams& params); - void clear_vif_cache(rf::VifLodMesh *lod_mesh); + void render_v3d_vif( + rf::VifLodMesh* lod_mesh, int lod_index, const rf::Vector3& pos, const rf::Matrix3& orient, + const rf::MeshRenderParams& params + ); + void render_character_vif( + rf::VifLodMesh* lod_mesh, int lod_index, const rf::Vector3& pos, const rf::Matrix3& orient, + const rf::CharacterInstance* ci, const rf::MeshRenderParams& params + ); + void clear_vif_cache(rf::VifLodMesh* lod_mesh); void page_in_v3d_mesh(rf::VifLodMesh* lod_mesh); void page_in_character_mesh(rf::VifLodMesh* lod_mesh); void flush_caches(); private: - void draw_cached_mesh(rf::VifLodMesh *lod_mesh, const BaseMeshRenderCache& render_cache, const rf::MeshRenderParams& params, int lod_index); + void draw_cached_mesh( + rf::VifLodMesh* lod_mesh, const BaseMeshRenderCache& render_cache, const rf::MeshRenderParams& params, + int lod_index + ); ComPtr device_; RenderContext& render_context_; diff --git a/game_patch/graphics/d3d11/gr_d3d11_shader.cpp b/game_patch/graphics/d3d11/gr_d3d11_shader.cpp index 6b8e274b0..d2119b91b 100644 --- a/game_patch/graphics/d3d11/gr_d3d11_shader.cpp +++ b/game_patch/graphics/d3d11/gr_d3d11_shader.cpp @@ -6,19 +6,17 @@ namespace df::gr::d3d11 { - ShaderManager::ShaderManager(ComPtr device) : device_{device} - { - } + ShaderManager::ShaderManager(ComPtr device) : device_{device} {} - VertexShaderAndLayout - ShaderManager::load_vertex_shader(const char* filename, VertexLayout vertex_layout) + VertexShaderAndLayout ShaderManager::load_vertex_shader(const char* filename, VertexLayout vertex_layout) { std::vector desc = get_vertex_layout_desc(vertex_layout); return load_vertex_shader(filename, desc.data(), desc.size()); } - VertexShaderAndLayout - ShaderManager::load_vertex_shader(const char* filename, const D3D11_INPUT_ELEMENT_DESC input_elements[], std::size_t num_input_elements) + VertexShaderAndLayout ShaderManager::load_vertex_shader( + const char* filename, const D3D11_INPUT_ELEMENT_DESC input_elements[], std::size_t num_input_elements + ) { rf::File file; if (file.open(filename) != 0) { @@ -32,19 +30,11 @@ namespace df::gr::d3d11 xlog::debug("Loading vertex shader {} size {}", filename, size); ComPtr vertex_shader; - DF_GR_D3D11_CHECK_HR( - device_->CreateVertexShader(shader_data.get(), size, nullptr, &vertex_shader) - ); + DF_GR_D3D11_CHECK_HR(device_->CreateVertexShader(shader_data.get(), size, nullptr, &vertex_shader)); ComPtr input_layout; DF_GR_D3D11_CHECK_HR( - device_->CreateInputLayout( - input_elements, - num_input_elements, - shader_data.get(), - size, - &input_layout - ) + device_->CreateInputLayout(input_elements, num_input_elements, shader_data.get(), size, &input_layout) ); return {std::move(vertex_shader), std::move(input_layout)}; @@ -64,9 +54,7 @@ namespace df::gr::d3d11 xlog::debug("Loading pixel shader {} size {}", filename, size); ComPtr pixel_shader; - DF_GR_D3D11_CHECK_HR( - device_->CreatePixelShader(shader_data.get(), size, nullptr, &pixel_shader) - ); + DF_GR_D3D11_CHECK_HR(device_->CreatePixelShader(shader_data.get(), size, nullptr, &pixel_shader)); return pixel_shader; } } diff --git a/game_patch/graphics/d3d11/gr_d3d11_shader.h b/game_patch/graphics/d3d11/gr_d3d11_shader.h index 6bf9d68a3..c43544807 100644 --- a/game_patch/graphics/d3d11/gr_d3d11_shader.h +++ b/game_patch/graphics/d3d11/gr_d3d11_shader.h @@ -95,8 +95,7 @@ namespace df::gr::d3d11 const VertexShaderAndLayout& get_vertex_shader(VertexShaderId vertex_shader_id) { return get_vertex_shader( - get_vertex_shader_filename(vertex_shader_id), - get_vertex_shader_layout(vertex_shader_id) + get_vertex_shader_filename(vertex_shader_id), get_vertex_shader_layout(vertex_shader_id) ); } @@ -107,7 +106,9 @@ namespace df::gr::d3d11 private: VertexShaderAndLayout load_vertex_shader(const char* filename, VertexLayout vertex_layout); - VertexShaderAndLayout load_vertex_shader(const char* filename, const D3D11_INPUT_ELEMENT_DESC input_elements[], std::size_t num_input_elements); + VertexShaderAndLayout load_vertex_shader( + const char* filename, const D3D11_INPUT_ELEMENT_DESC input_elements[], std::size_t num_input_elements + ); ComPtr load_pixel_shader(const char* filename); ComPtr device_; diff --git a/game_patch/graphics/d3d11/gr_d3d11_solid.cpp b/game_patch/graphics/d3d11/gr_d3d11_solid.cpp index 441acdcb3..bac5eca30 100644 --- a/game_patch/graphics/d3d11/gr_d3d11_solid.cpp +++ b/game_patch/graphics/d3d11/gr_d3d11_solid.cpp @@ -33,45 +33,31 @@ namespace df::gr::d3d11 static auto& gr_decal_mode = addr_as_ref(0x01808318); static auto& gr_solid_mode = addr_as_ref(0x01808328); static auto& gr_solid_alpha_mode = addr_as_ref(0x0180832C); - static auto& geo_cache_rooms = addr_as_ref(0x01375DB4); + static auto& geo_cache_rooms = addr_as_ref(0x01375DB4); static auto& geo_cache_num_rooms = addr_as_ref(0x013761B8); static auto& sky_room_center = addr_as_ref(0x0088FB10); static auto& sky_room_offset = addr_as_ref(0x0087BB00); - static auto& set_currently_rendered_room = addr_as_ref(0x004D3350); + static auto& set_currently_rendered_room = addr_as_ref(0x004D3350); static gr::Mode sky_room_opaque_mode{ - gr::TEXTURE_SOURCE_WRAP, - gr::COLOR_SOURCE_TEXTURE, - gr::ALPHA_SOURCE_TEXTURE, - gr::ALPHA_BLEND_NONE, - gr::ZBUFFER_TYPE_FULL, - gr::FOG_NOT_ALLOWED, + gr::TEXTURE_SOURCE_WRAP, gr::COLOR_SOURCE_TEXTURE, gr::ALPHA_SOURCE_TEXTURE, + gr::ALPHA_BLEND_NONE, gr::ZBUFFER_TYPE_FULL, gr::FOG_NOT_ALLOWED, }; static gr::Mode sky_room_alpha_mode{ - gr::TEXTURE_SOURCE_WRAP, - gr::COLOR_SOURCE_TEXTURE, - gr::ALPHA_SOURCE_TEXTURE, - gr::ALPHA_BLEND_ALPHA, - gr::ZBUFFER_TYPE_READ, - gr::FOG_NOT_ALLOWED, + gr::TEXTURE_SOURCE_WRAP, gr::COLOR_SOURCE_TEXTURE, gr::ALPHA_SOURCE_TEXTURE, + gr::ALPHA_BLEND_ALPHA, gr::ZBUFFER_TYPE_READ, gr::FOG_NOT_ALLOWED, }; static gr::Mode alpha_detail_fullbright_mode{ - gr::TEXTURE_SOURCE_WRAP, - gr::COLOR_SOURCE_TEXTURE, - gr::ALPHA_SOURCE_TEXTURE, - gr::ALPHA_BLEND_ALPHA, - gr::ZBUFFER_TYPE_FULL_ALPHA_TEST, - gr::FOG_ALLOWED, + gr::TEXTURE_SOURCE_WRAP, gr::COLOR_SOURCE_TEXTURE, gr::ALPHA_SOURCE_TEXTURE, + gr::ALPHA_BLEND_ALPHA, gr::ZBUFFER_TYPE_FULL_ALPHA_TEST, gr::FOG_ALLOWED, }; static inline bool should_render_face(GFace* face) { - return !face->attributes.is_portal() && - !face->attributes.is_invisible() && - !face->attributes.is_show_sky(); + return !face->attributes.is_portal() && !face->attributes.is_invisible() && !face->attributes.is_show_sky(); } static inline gr::Mode determine_decal_mode(GDecal* decal) @@ -122,7 +108,9 @@ namespace df::gr::d3d11 class SolidGeometryBuffers { public: - SolidGeometryBuffers(const std::vector& vb_data, const std::vector& ib_data, ID3D11Device* device); + SolidGeometryBuffers( + const std::vector& vb_data, const std::vector& ib_data, ID3D11Device* device + ); void bind_buffers(RenderContext& render_context) { @@ -135,7 +123,9 @@ namespace df::gr::d3d11 ComPtr index_buffer_; }; - SolidGeometryBuffers::SolidGeometryBuffers(const std::vector& vb_data, const std::vector& ib_data, ID3D11Device* device) + SolidGeometryBuffers::SolidGeometryBuffers( + const std::vector& vb_data, const std::vector& ib_data, ID3D11Device* device + ) { if (vb_data.empty() || ib_data.empty()) { return; @@ -147,9 +137,7 @@ namespace df::gr::d3d11 D3D11_USAGE_IMMUTABLE, }; D3D11_SUBRESOURCE_DATA vb_subres_data{vb_data.data(), 0, 0}; - DF_GR_D3D11_CHECK_HR( - device->CreateBuffer(&vb_desc, &vb_subres_data, &vertex_buffer_) - ); + DF_GR_D3D11_CHECK_HR(device->CreateBuffer(&vb_desc, &vb_subres_data, &vertex_buffer_)); CD3D11_BUFFER_DESC ib_desc{ sizeof(ib_data[0]) * ib_data.size(), @@ -157,9 +145,7 @@ namespace df::gr::d3d11 D3D11_USAGE_IMMUTABLE, }; D3D11_SUBRESOURCE_DATA ib_subres_data{ib_data.data(), 0, 0}; - DF_GR_D3D11_CHECK_HR( - device->CreateBuffer(&ib_desc, &ib_subres_data, &index_buffer_) - ); + DF_GR_D3D11_CHECK_HR(device->CreateBuffer(&ib_desc, &ib_subres_data, &index_buffer_)); } struct SolidBatch @@ -223,7 +209,7 @@ namespace df::gr::d3d11 for (SolidBatch& b : batches) { render_context.set_mode(b.mode); render_context.set_textures(b.textures[0], b.textures[1]); - //xlog::warn("DrawIndexed {} {}", b.num_indices, b.start_index); + // xlog::warn("DrawIndexed {} {}", b.num_indices, b.start_index); render_context.draw_indexed(b.num_indices, b.start_index, b.base_vertex); } } @@ -346,7 +332,8 @@ namespace df::gr::d3d11 while (dp) { if (dp->my_decal->flags & DF_LEVEL_DECAL) { rf::gr::Mode mode = determine_decal_mode(dp->my_decal); - std::array textures = normalize_texture_handles_for_mode(mode, {dp->my_decal->bitmap_id, lightmap_tex}); + std::array textures = + normalize_texture_handles_for_mode(mode, {dp->my_decal->bitmap_id, lightmap_tex}); DecalPolyBatchKey dp_key = std::make_tuple(render_type, textures[0], textures[1], mode); batched_decal_polys_[dp_key].push_back(dp); ++num_dp; @@ -410,9 +397,7 @@ namespace df::gr::d3d11 std::size_t num_indices = ib_data.size() - start_index; std::array textures = {texture_1, texture_2}; gr::Mode mode = determine_face_mode(render_type, texture_2 != -1, is_sky_); - batches.get_batches(render_type).emplace_back( - start_index, num_indices, base_vertex, textures, mode - ); + batches.get_batches(render_type).emplace_back(start_index, num_indices, base_vertex, textures, mode); } for (auto& e : batched_decal_polys_) { const GRenderCacheBuilder::DecalPolyBatchKey& key = e.first; @@ -455,9 +440,7 @@ namespace df::gr::d3d11 } int num_indices = ib_data.size() - start_index; std::array textures = {texture_1, texture_2}; - batches.get_batches(render_type).emplace_back( - start_index, num_indices, base_vertex, textures, mode - ); + batches.get_batches(render_type).emplace_back(start_index, num_indices, base_vertex, textures, mode); } SolidGeometryBuffers geometry_buffers{vb_data, ib_data, device}; @@ -496,8 +479,7 @@ namespace df::gr::d3d11 return state_ == 2; } - RoomRenderCache::RoomRenderCache(GSolid* solid, GRoom* room, ID3D11Device* device) : - room_(room), solid_(solid) + RoomRenderCache::RoomRenderCache(GSolid* solid, GRoom* room, ID3D11Device* device) : room_(room), solid_(solid) { update(device); } @@ -513,8 +495,10 @@ namespace df::gr::d3d11 return; } - xlog::debug("Creating render cache for room {} - verts {} inds {} batches {}", room_->room_index, - builder.get_num_verts(), builder.get_num_inds(), builder.get_num_batches()); + xlog::debug( + "Creating render cache for room {} - verts {} inds {} batches {}", room_->room_index, + builder.get_num_verts(), builder.get_num_inds(), builder.get_num_batches() + ); cache_ = std::optional{builder.build(device)}; @@ -534,25 +518,22 @@ namespace df::gr::d3d11 } } - SolidRenderer::SolidRenderer(ComPtr device, ShaderManager& shader_manager, - [[maybe_unused]] StateManager& state_manager, DynamicGeometryRenderer& dyn_geo_renderer, - RenderContext& render_context) : - device_{std::move(device)}, context_{render_context.device_context()}, dyn_geo_renderer_{dyn_geo_renderer}, render_context_(render_context) + SolidRenderer::SolidRenderer( + ComPtr device, ShaderManager& shader_manager, [[maybe_unused]] StateManager& state_manager, + DynamicGeometryRenderer& dyn_geo_renderer, RenderContext& render_context + ) : + device_{std::move(device)}, context_{render_context.device_context()}, dyn_geo_renderer_{dyn_geo_renderer}, + render_context_(render_context) { vertex_shader_ = shader_manager.get_vertex_shader(VertexShaderId::standard); pixel_shader_ = shader_manager.get_pixel_shader(PixelShaderId::standard); } - SolidRenderer::~SolidRenderer() - {} + SolidRenderer::~SolidRenderer() {} static gr::Mode dynamic_decal_mode{ - gr::TEXTURE_SOURCE_CLAMP, - gr::COLOR_SOURCE_VERTEX, - gr::ALPHA_SOURCE_VERTEX_TIMES_TEXTURE, - gr::ALPHA_BLEND_ALPHA, - gr::ZBUFFER_TYPE_READ, - gr::FOG_ALLOWED, + gr::TEXTURE_SOURCE_CLAMP, gr::COLOR_SOURCE_VERTEX, gr::ALPHA_SOURCE_VERTEX_TIMES_TEXTURE, + gr::ALPHA_BLEND_ALPHA, gr::ZBUFFER_TYPE_READ, gr::FOG_ALLOWED, }; static void render_face_dynamic_decals(GFace* face) @@ -584,14 +565,14 @@ namespace df::gr::d3d11 for (int i = 0; i < num_rooms; ++i) { GRoom* room = rooms[i]; - for (GFace& face: room->face_list) { + for (GFace& face : room->face_list) { if (should_render_face(&face) && !face.attributes.is_see_thru()) { render_face_dynamic_decals(&face); } } for (GRoom* detail_room : room->detail_rooms) { if (detail_room->room_to_render_with == room) { - for (GFace& face: detail_room->face_list) { + for (GFace& face : detail_room->face_list) { if (should_render_face(&face) && !face.attributes.is_see_thru()) { render_face_dynamic_decals(&face); } @@ -605,7 +586,7 @@ namespace df::gr::d3d11 void SolidRenderer::render_alpha_detail_dynamic_decals(rf::GRoom* detail_room) { before_render_decals(); - for (GFace& face: detail_room->face_list) { + for (GFace& face : detail_room->face_list) { if (should_render_face(&face) && face.attributes.is_see_thru()) { render_face_dynamic_decals(&face); } @@ -613,11 +594,13 @@ namespace df::gr::d3d11 after_render_decals(); } - void SolidRenderer::render_movable_solid_dynamic_decals(rf::GSolid* solid, const rf::Vector3& pos, const rf::Matrix3& orient) + void SolidRenderer::render_movable_solid_dynamic_decals( + rf::GSolid* solid, const rf::Vector3& pos, const rf::Matrix3& orient + ) { gr::start_instance(pos, orient); before_render_decals(); - for (GFace& face: solid->face_list) { + for (GFace& face : solid->face_list) { if (should_render_face(&face)) { render_face_dynamic_decals(&face); } @@ -683,7 +666,7 @@ namespace df::gr::d3d11 xlog::debug("Room render cache clear"); if (rf::level.geometry) { - for (rf::GRoom* room: rf::level.geometry->all_rooms) { + for (rf::GRoom* room : rf::level.geometry->all_rooms) { room->geo_cache = nullptr; } } @@ -694,7 +677,7 @@ namespace df::gr::d3d11 geo_cache_num_rooms = 0; } - void SolidRenderer::render_sky_room(GRoom *room) + void SolidRenderer::render_sky_room(GRoom* room) { xlog::trace("Rendering sky room {} cache {}", room->room_index, room->geo_cache); before_render(sky_room_offset, rf::identity_matrix); @@ -728,7 +711,7 @@ namespace df::gr::d3d11 return it->second.get(); } - void SolidRenderer::render_alpha_detail(GRoom *room, GSolid *solid) + void SolidRenderer::render_alpha_detail(GRoom* room, GSolid* solid) { xlog::trace("Rendering alpha detail room {}", room->room_index); if (room->face_list.empty()) { @@ -764,7 +747,8 @@ namespace df::gr::d3d11 // Note: calling set_currently_rendered_room could improve culling here but it breaks some levels // if a detail brush is contained in multiple normal rooms for (GRoom* detail_room : room->detail_rooms) { - if (detail_room->room_to_render_with == room && !gr::cull_bounding_box(detail_room->bbox_min, detail_room->bbox_max)) { + if (detail_room->room_to_render_with == room && + !gr::cull_bounding_box(detail_room->bbox_min, detail_room->bbox_max)) { render_detail(solid, detail_room, false); } } @@ -789,10 +773,10 @@ namespace df::gr::d3d11 void SolidRenderer::page_in_solid(rf::GSolid* solid) { - for (rf::GRoom* room: solid->cached_normal_room_list) { + for (rf::GRoom* room : solid->cached_normal_room_list) { get_or_create_normal_room_cache(solid, room); } - for (rf::GRoom* room: solid->cached_detail_room_list) { + for (rf::GRoom* room : solid->cached_detail_room_list) { get_or_create_detail_room_cache(solid, room); } } diff --git a/game_patch/graphics/d3d11/gr_d3d11_solid.h b/game_patch/graphics/d3d11/gr_d3d11_solid.h index 185ca4d06..df2b93a95 100644 --- a/game_patch/graphics/d3d11/gr_d3d11_solid.h +++ b/game_patch/graphics/d3d11/gr_d3d11_solid.h @@ -23,17 +23,25 @@ namespace df::gr::d3d11 class RoomRenderCache; class GRenderCache; - enum class FaceRenderType { opaque, alpha, liquid }; + enum class FaceRenderType + { + opaque, + alpha, + liquid + }; class SolidRenderer { public: - SolidRenderer(ComPtr device, ShaderManager& shader_manager, StateManager& state_manager, DynamicGeometryRenderer& dyn_geo_renderer, RenderContext& render_context); + SolidRenderer( + ComPtr device, ShaderManager& shader_manager, StateManager& state_manager, + DynamicGeometryRenderer& dyn_geo_renderer, RenderContext& render_context + ); ~SolidRenderer(); void render_solid(rf::GSolid* solid, rf::GRoom** rooms, int num_rooms); void render_movable_solid(rf::GSolid* solid, const rf::Vector3& pos, const rf::Matrix3& orient); - void render_sky_room(rf::GRoom *room); - void render_alpha_detail(rf::GRoom *room, rf::GSolid *solid); + void render_sky_room(rf::GRoom* room); + void render_alpha_detail(rf::GRoom* room, rf::GSolid* solid); void render_room_liquid_surface(rf::GSolid* solid, rf::GRoom* room); void clear_cache(); void page_in_solid(rf::GSolid* solid); diff --git a/game_patch/graphics/d3d11/gr_d3d11_state.cpp b/game_patch/graphics/d3d11/gr_d3d11_state.cpp index d69fd80c6..b127aeb0b 100644 --- a/game_patch/graphics/d3d11/gr_d3d11_state.cpp +++ b/game_patch/graphics/d3d11/gr_d3d11_state.cpp @@ -6,12 +6,10 @@ using namespace rf; namespace df::gr::d3d11 { - StateManager::StateManager(ComPtr device) : - device_{std::move(device)} - { - } + StateManager::StateManager(ComPtr device) : device_{std::move(device)} {} - ComPtr StateManager::create_rasterizer_state(D3D11_CULL_MODE cull_mode, int depth_bias, bool depth_clip_enable) + ComPtr + StateManager::create_rasterizer_state(D3D11_CULL_MODE cull_mode, int depth_bias, bool depth_clip_enable) { CD3D11_RASTERIZER_DESC desc{CD3D11_DEFAULT{}}; desc.CullMode = cull_mode; @@ -22,10 +20,9 @@ namespace df::gr::d3d11 desc.DepthClipEnable = depth_clip_enable; ComPtr rasterizer_state; - check_hr( - device_->CreateRasterizerState(&desc, &rasterizer_state), - [=]() { xlog::error("Failed to create rasterizer state {} {}", static_cast(cull_mode), depth_bias); } - ); + check_hr(device_->CreateRasterizerState(&desc, &rasterizer_state), [=]() { + xlog::error("Failed to create rasterizer state {} {}", static_cast(cull_mode), depth_bias); + }); return rasterizer_state; } @@ -72,10 +69,9 @@ namespace df::gr::d3d11 } ComPtr sampler_state; - check_hr( - device_->CreateSamplerState(&desc, &sampler_state), - [=]() { xlog::error("Failed to create sampler state {}", static_cast(ts)); } - ); + check_hr(device_->CreateSamplerState(&desc, &sampler_state), [=]() { + xlog::error("Failed to create sampler state {}", static_cast(ts)); + }); return sampler_state; } @@ -84,59 +80,58 @@ namespace df::gr::d3d11 CD3D11_BLEND_DESC desc{CD3D11_DEFAULT()}; switch (ab) { - case gr::ALPHA_BLEND_NONE: - desc.RenderTarget[0].BlendEnable = FALSE; - break; - case gr::ALPHA_BLEND_ADDITIVE: - desc.RenderTarget[0].BlendEnable = TRUE; - desc.RenderTarget[0].SrcBlend = D3D11_BLEND_ONE; - desc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ONE; - desc.RenderTarget[0].DestBlend = D3D11_BLEND_ONE; - desc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_ONE; - break; - case gr::ALPHA_BLEND_ALPHA_ADDITIVE: - case gr::ALPHA_BLEND_SRC_COLOR: - desc.RenderTarget[0].BlendEnable = TRUE; - desc.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA; - desc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_SRC_ALPHA; - desc.RenderTarget[0].DestBlend = D3D11_BLEND_ONE; - desc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_ONE; - break; - case gr::ALPHA_BLEND_ALPHA: - desc.RenderTarget[0].BlendEnable = TRUE; - desc.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA; - desc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_SRC_ALPHA; - desc.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA; - desc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_INV_SRC_ALPHA; - break; - case gr::ALPHA_BLEND_LIGHTMAP: - desc.RenderTarget[0].BlendEnable = TRUE; - desc.RenderTarget[0].SrcBlend = D3D11_BLEND_DEST_COLOR; - desc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_DEST_COLOR; - desc.RenderTarget[0].DestBlend = D3D11_BLEND_ZERO; - desc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_ZERO; - break; - case gr::ALPHA_BLEND_SUBTRACTIVE: - desc.RenderTarget[0].BlendEnable = TRUE; - desc.RenderTarget[0].SrcBlend = D3D11_BLEND_INV_DEST_COLOR; - desc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_INV_DEST_COLOR; - desc.RenderTarget[0].DestBlend = D3D11_BLEND_ZERO; - desc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_ZERO; - break; - case gr::ALPHA_BLEND_SWAPPED_SRC_DEST_COLOR: - desc.RenderTarget[0].BlendEnable = TRUE; - desc.RenderTarget[0].SrcBlend = D3D11_BLEND_DEST_COLOR; - desc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_DEST_COLOR; - desc.RenderTarget[0].DestBlend = D3D11_BLEND_SRC_COLOR; - desc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_SRC_COLOR; - break; + case gr::ALPHA_BLEND_NONE: + desc.RenderTarget[0].BlendEnable = FALSE; + break; + case gr::ALPHA_BLEND_ADDITIVE: + desc.RenderTarget[0].BlendEnable = TRUE; + desc.RenderTarget[0].SrcBlend = D3D11_BLEND_ONE; + desc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ONE; + desc.RenderTarget[0].DestBlend = D3D11_BLEND_ONE; + desc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_ONE; + break; + case gr::ALPHA_BLEND_ALPHA_ADDITIVE: + case gr::ALPHA_BLEND_SRC_COLOR: + desc.RenderTarget[0].BlendEnable = TRUE; + desc.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA; + desc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_SRC_ALPHA; + desc.RenderTarget[0].DestBlend = D3D11_BLEND_ONE; + desc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_ONE; + break; + case gr::ALPHA_BLEND_ALPHA: + desc.RenderTarget[0].BlendEnable = TRUE; + desc.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA; + desc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_SRC_ALPHA; + desc.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA; + desc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_INV_SRC_ALPHA; + break; + case gr::ALPHA_BLEND_LIGHTMAP: + desc.RenderTarget[0].BlendEnable = TRUE; + desc.RenderTarget[0].SrcBlend = D3D11_BLEND_DEST_COLOR; + desc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_DEST_COLOR; + desc.RenderTarget[0].DestBlend = D3D11_BLEND_ZERO; + desc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_ZERO; + break; + case gr::ALPHA_BLEND_SUBTRACTIVE: + desc.RenderTarget[0].BlendEnable = TRUE; + desc.RenderTarget[0].SrcBlend = D3D11_BLEND_INV_DEST_COLOR; + desc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_INV_DEST_COLOR; + desc.RenderTarget[0].DestBlend = D3D11_BLEND_ZERO; + desc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_ZERO; + break; + case gr::ALPHA_BLEND_SWAPPED_SRC_DEST_COLOR: + desc.RenderTarget[0].BlendEnable = TRUE; + desc.RenderTarget[0].SrcBlend = D3D11_BLEND_DEST_COLOR; + desc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_DEST_COLOR; + desc.RenderTarget[0].DestBlend = D3D11_BLEND_SRC_COLOR; + desc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_SRC_COLOR; + break; } ComPtr blend_state; - check_hr( - device_->CreateBlendState(&desc, &blend_state), - [=]() { xlog::error("Failed to create blend state {}", static_cast(ab)); } - ); + check_hr(device_->CreateBlendState(&desc, &blend_state), [=]() { + xlog::error("Failed to create blend state {}", static_cast(ab)); + }); return blend_state; } @@ -151,37 +146,36 @@ namespace df::gr::d3d11 desc.DepthFunc = D3D11_COMPARISON_LESS_EQUAL; } switch (zbt) { - case gr::ZBUFFER_TYPE_NONE: - desc.DepthEnable = FALSE; - desc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ZERO; - break; - case gr::ZBUFFER_TYPE_READ: - desc.DepthEnable = TRUE; - desc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ZERO; - break; - case gr::ZBUFFER_TYPE_READ_EQUAL: - desc.DepthEnable = TRUE; - desc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ZERO; - desc.DepthFunc = D3D11_COMPARISON_EQUAL; - break; - case gr::ZBUFFER_TYPE_WRITE: - desc.DepthEnable = TRUE; - desc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL; - desc.DepthFunc = D3D11_COMPARISON_ALWAYS; - break; - case gr::ZBUFFER_TYPE_FULL: - case gr::ZBUFFER_TYPE_FULL_ALPHA_TEST: - desc.DepthEnable = TRUE; - desc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL; - break; + case gr::ZBUFFER_TYPE_NONE: + desc.DepthEnable = FALSE; + desc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ZERO; + break; + case gr::ZBUFFER_TYPE_READ: + desc.DepthEnable = TRUE; + desc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ZERO; + break; + case gr::ZBUFFER_TYPE_READ_EQUAL: + desc.DepthEnable = TRUE; + desc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ZERO; + desc.DepthFunc = D3D11_COMPARISON_EQUAL; + break; + case gr::ZBUFFER_TYPE_WRITE: + desc.DepthEnable = TRUE; + desc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL; + desc.DepthFunc = D3D11_COMPARISON_ALWAYS; + break; + case gr::ZBUFFER_TYPE_FULL: + case gr::ZBUFFER_TYPE_FULL_ALPHA_TEST: + desc.DepthEnable = TRUE; + desc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL; + break; } ComPtr depth_stencil_state; - check_hr( - device_->CreateDepthStencilState(&desc, &depth_stencil_state), - [=]() { xlog::warn("Failed to create depth stencil state {}", static_cast(zbt)); } - ); + check_hr(device_->CreateDepthStencilState(&desc, &depth_stencil_state), [=]() { + xlog::warn("Failed to create depth stencil state {}", static_cast(zbt)); + }); return depth_stencil_state; } } diff --git a/game_patch/graphics/d3d11/gr_d3d11_state.h b/game_patch/graphics/d3d11/gr_d3d11_state.h index ec5ba7e47..0bba42026 100644 --- a/game_patch/graphics/d3d11/gr_d3d11_state.h +++ b/game_patch/graphics/d3d11/gr_d3d11_state.h @@ -12,7 +12,8 @@ namespace df::gr::d3d11 public: StateManager(ComPtr device); - ID3D11RasterizerState* lookup_rasterizer_state(D3D11_CULL_MODE cull_mode, int depth_bias = 0, bool depth_clip_enable = true) + ID3D11RasterizerState* + lookup_rasterizer_state(D3D11_CULL_MODE cull_mode, int depth_bias = 0, bool depth_clip_enable = true) { auto key = std::make_tuple(cull_mode, depth_bias, depth_clip_enable); auto it = rasterizer_state_cache_.find(key); @@ -20,7 +21,8 @@ namespace df::gr::d3d11 return it->second; } auto rasterizer_state = create_rasterizer_state(cull_mode, depth_bias, depth_clip_enable); - auto p = rasterizer_state_cache_.emplace(key, create_rasterizer_state(cull_mode, depth_bias, depth_clip_enable)); + auto p = + rasterizer_state_cache_.emplace(key, create_rasterizer_state(cull_mode, depth_bias, depth_clip_enable)); return p.first->second; } @@ -70,7 +72,8 @@ namespace df::gr::d3d11 } private: - ComPtr create_rasterizer_state(D3D11_CULL_MODE cull_mode, int depth_bias, bool depth_clip_enable); + ComPtr + create_rasterizer_state(D3D11_CULL_MODE cull_mode, int depth_bias, bool depth_clip_enable); ComPtr create_sampler_state(rf::gr::TextureSource ts); ComPtr create_blend_state(rf::gr::AlphaBlend ab); ComPtr create_depth_stencil_state(gr::ZbufferType zbt); diff --git a/game_patch/graphics/d3d11/gr_d3d11_texture.cpp b/game_patch/graphics/d3d11/gr_d3d11_texture.cpp index 32406d5c3..05a6a450f 100644 --- a/game_patch/graphics/d3d11/gr_d3d11_texture.cpp +++ b/game_patch/graphics/d3d11/gr_d3d11_texture.cpp @@ -18,7 +18,9 @@ namespace df::gr::d3d11 black_texture_view_ = create_solid_color_texture(0.0f, 0.0f, 0.0f, 1.0f); } - TextureManager::Texture TextureManager::create_texture(int bm_handle, bm::Format fmt, int w, int h, ubyte* bits, ubyte* pal, int mip_levels, bool staging) + TextureManager::Texture TextureManager::create_texture( + int bm_handle, bm::Format fmt, int w, int h, ubyte* bits, ubyte* pal, int mip_levels, bool staging + ) { auto [dxgi_format, supported_fmt] = get_supported_texture_format(fmt); CD3D11_TEXTURE2D_DESC desc{ @@ -29,7 +31,7 @@ namespace df::gr::d3d11 static_cast(mip_levels), staging ? 0u : static_cast(D3D11_BIND_SHADER_RESOURCE), staging ? D3D11_USAGE_STAGING : D3D11_USAGE_DEFAULT, - staging ? D3D11_CPU_ACCESS_READ|D3D11_CPU_ACCESS_WRITE : 0u, + staging ? D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE : 0u, }; std::vector> converted_bits_vec; @@ -45,8 +47,7 @@ namespace df::gr::d3d11 int converted_pitch = bm_calculate_pitch(w, supported_fmt); converted_bits_vec.push_back(std::make_unique(converted_pitch * h)); ubyte* converted_bits = converted_bits_vec.back().get(); - ::bm_convert_format(converted_bits, supported_fmt, bits, fmt, w, h, - converted_pitch, pitch, pal); + ::bm_convert_format(converted_bits, supported_fmt, bits, fmt, w, h, converted_pitch, pitch, pal); subres_data.pSysMem = converted_bits; subres_data.SysMemPitch = converted_pitch; } @@ -66,10 +67,12 @@ namespace df::gr::d3d11 ComPtr d3d_texture; D3D11_SUBRESOURCE_DATA* subres_data_ptr = subres_data_vec.empty() ? nullptr : subres_data_vec.data(); - check_hr( - device_->CreateTexture2D(&desc, subres_data_ptr, &d3d_texture), - [&]() { xlog::error("Failed to create texture: format {} dimensions {}x{}, mip levels {}", static_cast(desc.Format), desc.Width, desc.Height, desc.MipLevels); } - ); + check_hr(device_->CreateTexture2D(&desc, subres_data_ptr, &d3d_texture), [&]() { + xlog::error( + "Failed to create texture: format {} dimensions {}x{}, mip levels {}", static_cast(desc.Format), + desc.Width, desc.Height, desc.MipLevels + ); + }); if (staging) { return {bm_handle, desc.Format, d3d_texture}; @@ -97,29 +100,19 @@ namespace df::gr::d3d11 if (g_game_config.msaa) { tex_desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; - DF_GR_D3D11_CHECK_HR( - device_->CreateTexture2D(&tex_desc, nullptr, &gpu_ss_texture) - ); + DF_GR_D3D11_CHECK_HR(device_->CreateTexture2D(&tex_desc, nullptr, &gpu_ss_texture)); tex_desc.BindFlags = D3D11_BIND_RENDER_TARGET; tex_desc.SampleDesc.Count = g_game_config.msaa.value(); - DF_GR_D3D11_CHECK_HR( - device_->CreateTexture2D(&tex_desc, nullptr, &gpu_ms_texture) - ); + DF_GR_D3D11_CHECK_HR(device_->CreateTexture2D(&tex_desc, nullptr, &gpu_ms_texture)); - DF_GR_D3D11_CHECK_HR( - device_->CreateRenderTargetView(gpu_ms_texture, nullptr, &render_target_view) - ); + DF_GR_D3D11_CHECK_HR(device_->CreateRenderTargetView(gpu_ms_texture, nullptr, &render_target_view)); } else { - tex_desc.BindFlags = D3D11_BIND_RENDER_TARGET|D3D11_BIND_SHADER_RESOURCE; - DF_GR_D3D11_CHECK_HR( - device_->CreateTexture2D(&tex_desc, nullptr, &gpu_ss_texture) - ); + tex_desc.BindFlags = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE; + DF_GR_D3D11_CHECK_HR(device_->CreateTexture2D(&tex_desc, nullptr, &gpu_ss_texture)); - DF_GR_D3D11_CHECK_HR( - device_->CreateRenderTargetView(gpu_ss_texture, nullptr, &render_target_view) - ); + DF_GR_D3D11_CHECK_HR(device_->CreateRenderTargetView(gpu_ss_texture, nullptr, &render_target_view)); } Texture texture{bm_handle, tex_desc.Format, std::move(gpu_ss_texture), std::move(render_target_view)}; @@ -129,12 +122,18 @@ namespace df::gr::d3d11 TextureManager::Texture TextureManager::load_texture(int bm_handle, bool staging) { - xlog::trace("Creating texture for bitmap {} handle {} format {}", bm::get_filename(bm_handle), bm_handle, bm::get_format(bm_handle)); + xlog::trace( + "Creating texture for bitmap {} handle {} format {}", bm::get_filename(bm_handle), bm_handle, + bm::get_format(bm_handle) + ); int w, h, num_pixels, mip_levels; bm::get_mipmap_info(bm_handle, &w, &h, &num_pixels, &mip_levels); if (w <= 0 || h <= 0) { - xlog::warn("Bad bitmap dimensions: handle {} filename {} dimensions {}x{}", bm_handle, bm::get_filename(bm_handle), w, h); + xlog::warn( + "Bad bitmap dimensions: handle {} filename {} dimensions {}x{}", bm_handle, bm::get_filename(bm_handle), + w, h + ); return {}; } @@ -142,7 +141,9 @@ namespace df::gr::d3d11 // in case of non-squere textures there is a conflict int max_mip_levels = 1 + static_cast(std::floor(std::log2(std::min(w, h)))); if (mip_levels > max_mip_levels) { - xlog::trace("Bad number of mip levels for {}x{} texture: expected {} but got {}", w, h, max_mip_levels, mip_levels); + xlog::trace( + "Bad number of mip levels for {}x{} texture: expected {} but got {}", w, h, max_mip_levels, mip_levels + ); mip_levels = max_mip_levels; } @@ -255,7 +256,8 @@ namespace df::gr::d3d11 { std::vector> candidates; switch (fmt) { - case bm::FORMAT_8_PALETTED: return {DXGI_FORMAT_B8G8R8X8_UNORM, bm::FORMAT_8888_ARGB}; + case bm::FORMAT_8_PALETTED: + return {DXGI_FORMAT_B8G8R8X8_UNORM, bm::FORMAT_8888_ARGB}; case bm::FORMAT_565_RGB: candidates.emplace_back(DXGI_FORMAT_B5G6R5_UNORM, bm::FORMAT_565_RGB); candidates.emplace_back(DXGI_FORMAT_B8G8R8X8_UNORM, bm::FORMAT_8888_ARGB); @@ -269,20 +271,24 @@ namespace df::gr::d3d11 candidates.emplace_back(DXGI_FORMAT_B8G8R8A8_UNORM, bm::FORMAT_8888_ARGB); break; // Formats below should always be supported - case bm::FORMAT_888_RGB: return {DXGI_FORMAT_B8G8R8X8_UNORM, bm::FORMAT_8888_ARGB}; - case bm::FORMAT_8888_ARGB: return {DXGI_FORMAT_B8G8R8A8_UNORM, fmt}; - case bm::FORMAT_DXT1: return {DXGI_FORMAT_BC1_UNORM, fmt}; - case bm::FORMAT_DXT3: return {DXGI_FORMAT_BC2_UNORM, fmt}; - case bm::FORMAT_DXT5: return {DXGI_FORMAT_BC3_UNORM, fmt}; + case bm::FORMAT_888_RGB: + return {DXGI_FORMAT_B8G8R8X8_UNORM, bm::FORMAT_8888_ARGB}; + case bm::FORMAT_8888_ARGB: + return {DXGI_FORMAT_B8G8R8A8_UNORM, fmt}; + case bm::FORMAT_DXT1: + return {DXGI_FORMAT_BC1_UNORM, fmt}; + case bm::FORMAT_DXT3: + return {DXGI_FORMAT_BC2_UNORM, fmt}; + case bm::FORMAT_DXT5: + return {DXGI_FORMAT_BC3_UNORM, fmt}; // Other formats - default: return {DXGI_FORMAT_B8G8R8A8_UNORM, bm::FORMAT_8888_ARGB}; + default: + return {DXGI_FORMAT_B8G8R8A8_UNORM, bm::FORMAT_8888_ARGB}; } unsigned format_support = 0; - for (auto& p: candidates) { - DF_GR_D3D11_CHECK_HR( - device_->CheckFormatSupport(p.first, &format_support) - ); + for (auto& p : candidates) { + DF_GR_D3D11_CHECK_HR(device_->CheckFormatSupport(p.first, &format_support)); if (format_support & D3D11_FORMAT_SUPPORT_TEXTURE2D) { return p; } @@ -306,15 +312,24 @@ namespace df::gr::d3d11 rf::bm::Format TextureManager::get_bm_format(DXGI_FORMAT dxgi_fmt) { switch (dxgi_fmt) { - case DXGI_FORMAT_B5G6R5_UNORM: return bm::FORMAT_565_RGB; - case DXGI_FORMAT_B5G5R5A1_UNORM: return bm::FORMAT_1555_ARGB; - case DXGI_FORMAT_B4G4R4A4_UNORM: return bm::FORMAT_4444_ARGB; - case DXGI_FORMAT_B8G8R8A8_UNORM: return bm::FORMAT_8888_ARGB; - case DXGI_FORMAT_B8G8R8X8_UNORM: return bm::FORMAT_8888_ARGB; - case DXGI_FORMAT_BC1_UNORM: return bm::FORMAT_DXT1; - case DXGI_FORMAT_BC2_UNORM: return bm::FORMAT_DXT3; - case DXGI_FORMAT_BC3_UNORM: return bm::FORMAT_DXT5; - default: return bm::FORMAT_NONE; + case DXGI_FORMAT_B5G6R5_UNORM: + return bm::FORMAT_565_RGB; + case DXGI_FORMAT_B5G5R5A1_UNORM: + return bm::FORMAT_1555_ARGB; + case DXGI_FORMAT_B4G4R4A4_UNORM: + return bm::FORMAT_4444_ARGB; + case DXGI_FORMAT_B8G8R8A8_UNORM: + return bm::FORMAT_8888_ARGB; + case DXGI_FORMAT_B8G8R8X8_UNORM: + return bm::FORMAT_8888_ARGB; + case DXGI_FORMAT_BC1_UNORM: + return bm::FORMAT_DXT1; + case DXGI_FORMAT_BC2_UNORM: + return bm::FORMAT_DXT3; + case DXGI_FORMAT_BC3_UNORM: + return bm::FORMAT_DXT5; + default: + return bm::FORMAT_NONE; } } @@ -334,7 +349,7 @@ namespace df::gr::d3d11 } } - bool TextureManager::lock(int bm_handle, int section, gr::LockInfo *lock) + bool TextureManager::lock(int bm_handle, int section, gr::LockInfo* lock) { if (section != 0) { return false; @@ -347,8 +362,8 @@ namespace df::gr::d3d11 } Texture& texture = get_or_load_texture(bm_handle, true); - ID3D11Texture2D* staging_texture = texture.get_or_create_staging_texture(device_, device_context_, - lock->mode != gr::LOCK_WRITE_ONLY); + ID3D11Texture2D* staging_texture = + texture.get_or_create_staging_texture(device_, device_context_, lock->mode != gr::LOCK_WRITE_ONLY); if (!staging_texture) { xlog::warn("Attempted to lock texture without staging resource {}", texture.bm_handle); return false; @@ -359,9 +374,7 @@ namespace df::gr::d3d11 D3D11_MAPPED_SUBRESOURCE mapped_texture; D3D11_MAP map_type = convert_lock_mode_to_map_type(lock->mode); - DF_GR_D3D11_CHECK_HR( - device_context_->Map(staging_texture, 0, map_type, 0, &mapped_texture) - ); + DF_GR_D3D11_CHECK_HR(device_context_->Map(staging_texture, 0, map_type, 0, &mapped_texture)); lock->bm_handle = bm_handle; lock->section = section; @@ -371,27 +384,33 @@ namespace df::gr::d3d11 lock->h = h; lock->stride_in_bytes = mapped_texture.RowPitch; // Note: lock->mode is set by gr_lock - xlog::trace("locked texture: handle {} format {} size {}x{} data {}", lock->bm_handle, lock->format, lock->w, lock->h, lock->data); + xlog::trace( + "locked texture: handle {} format {} size {}x{} data {}", lock->bm_handle, lock->format, lock->w, lock->h, + lock->data + ); return true; } - void TextureManager::unlock(gr::LockInfo *lock) + void TextureManager::unlock(gr::LockInfo* lock) { - xlog::trace("unlocking texture: handle {} format {} size {}x{} data {}", lock->bm_handle, lock->format, lock->w, lock->h, lock->data); + xlog::trace( + "unlocking texture: handle {} format {} size {}x{} data {}", lock->bm_handle, lock->format, lock->w, + lock->h, lock->data + ); Texture& texture = get_or_load_texture(lock->bm_handle, true); if (texture.cpu_texture) { device_context_->Unmap(texture.cpu_texture, 0); if (lock->mode != rf::gr::LOCK_READ_ONLY && texture.gpu_texture) { - device_context_->CopySubresourceRegion(texture.gpu_texture, 0, 0, 0, 0, texture.cpu_texture, 0, nullptr); + device_context_->CopySubresourceRegion( + texture.gpu_texture, 0, 0, 0, 0, texture.cpu_texture, 0, nullptr + ); } } } void TextureManager::get_texel( - [[maybe_unused]] int bm_handle, - [[maybe_unused]] float u, - [[maybe_unused]] float v, - rf::gr::Color *clr) + [[maybe_unused]] int bm_handle, [[maybe_unused]] float u, [[maybe_unused]] float v, rf::gr::Color* clr + ) { // This function is only used when shooting at a texture with alpha // Note: original function has out of bounds error - it reads color for 16bpp and 32bpp (two addresses) @@ -430,13 +449,9 @@ namespace df::gr::d3d11 float data[] = {r, g, b, a}; D3D11_SUBRESOURCE_DATA subres_data{&data, sizeof(data), 0}; ComPtr gpu_texture; - DF_GR_D3D11_CHECK_HR( - device_->CreateTexture2D(&desc, &subres_data, &gpu_texture) - ); + DF_GR_D3D11_CHECK_HR(device_->CreateTexture2D(&desc, &subres_data, &gpu_texture)); ComPtr shader_resource_view; - DF_GR_D3D11_CHECK_HR( - device_->CreateShaderResourceView(gpu_texture, nullptr, &shader_resource_view) - ); + DF_GR_D3D11_CHECK_HR(device_->CreateShaderResourceView(gpu_texture, nullptr, &shader_resource_view)); return shader_resource_view; } @@ -447,9 +462,7 @@ namespace df::gr::d3d11 } if (gpu_texture) { - DF_GR_D3D11_CHECK_HR( - device->CreateShaderResourceView(gpu_texture, nullptr, &shader_resource_view) - ); + DF_GR_D3D11_CHECK_HR(device->CreateShaderResourceView(gpu_texture, nullptr, &shader_resource_view)); } } @@ -466,15 +479,9 @@ namespace df::gr::d3d11 cpu_texture->GetDesc(&cpu_desc); CD3D11_TEXTURE2D_DESC desc{ - cpu_desc.Format, - cpu_desc.Width, - cpu_desc.Height, - cpu_desc.ArraySize, - cpu_desc.MipLevels, + cpu_desc.Format, cpu_desc.Width, cpu_desc.Height, cpu_desc.ArraySize, cpu_desc.MipLevels, }; - DF_GR_D3D11_CHECK_HR( - device->CreateTexture2D(&desc, nullptr, &gpu_texture) - ); + DF_GR_D3D11_CHECK_HR(device->CreateTexture2D(&desc, nullptr, &gpu_texture)); // Copy only first level // TODO: mapmaps? @@ -482,7 +489,9 @@ namespace df::gr::d3d11 xlog::trace("Created GPU texture"); } - void TextureManager::Texture::init_cpu_texture(ID3D11Device* device, ID3D11DeviceContext* device_context, bool copy_from_gpu) + void TextureManager::Texture::init_cpu_texture( + ID3D11Device* device, ID3D11DeviceContext* device_context, bool copy_from_gpu + ) { if (!gpu_texture) { xlog::warn("Both GPU and CPU textures are missing"); @@ -493,25 +502,20 @@ namespace df::gr::d3d11 gpu_texture->GetDesc(&gpu_desc); CD3D11_TEXTURE2D_DESC desc{ - gpu_desc.Format, - gpu_desc.Width, - gpu_desc.Height, - gpu_desc.ArraySize, - gpu_desc.MipLevels, - 0u, - D3D11_USAGE_STAGING, - D3D11_CPU_ACCESS_READ|D3D11_CPU_ACCESS_WRITE, + gpu_desc.Format, gpu_desc.Width, + gpu_desc.Height, gpu_desc.ArraySize, + gpu_desc.MipLevels, 0u, + D3D11_USAGE_STAGING, D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE, }; - DF_GR_D3D11_CHECK_HR( - device->CreateTexture2D(&desc, nullptr, &cpu_texture) - ); + DF_GR_D3D11_CHECK_HR(device->CreateTexture2D(&desc, nullptr, &cpu_texture)); if (copy_from_gpu) { device_context->CopyResource(cpu_texture, gpu_texture); } } - rf::bm::Format TextureManager::read_back_buffer(ID3D11Texture2D* back_buffer, int x, int y, int w, int h, rf::ubyte* data) + rf::bm::Format + TextureManager::read_back_buffer(ID3D11Texture2D* back_buffer, int x, int y, int w, int h, rf::ubyte* data) { D3D11_TEXTURE2D_DESC gpu_desc; back_buffer->GetDesc(&gpu_desc); @@ -529,15 +533,11 @@ namespace df::gr::d3d11 D3D11_USAGE_STAGING, D3D11_CPU_ACCESS_READ, }; - DF_GR_D3D11_CHECK_HR( - device_->CreateTexture2D(&cpu_desc, nullptr, &back_buffer_staging_texture_) - ); + DF_GR_D3D11_CHECK_HR(device_->CreateTexture2D(&cpu_desc, nullptr, &back_buffer_staging_texture_)); } device_context_->CopySubresourceRegion(back_buffer_staging_texture_, 0, 0, 0, 0, back_buffer, 0, nullptr); D3D11_MAPPED_SUBRESOURCE mapped_res; - DF_GR_D3D11_CHECK_HR( - device_context_->Map(back_buffer_staging_texture_, 0, D3D11_MAP_READ, 0, &mapped_res) - ); + DF_GR_D3D11_CHECK_HR(device_context_->Map(back_buffer_staging_texture_, 0, D3D11_MAP_READ, 0, &mapped_res)); ubyte* src_ptr = reinterpret_cast(mapped_res.pData); ubyte* dst_ptr = data; diff --git a/game_patch/graphics/d3d11/gr_d3d11_texture.h b/game_patch/graphics/d3d11/gr_d3d11_texture.h index bcddd8501..cc2d03171 100644 --- a/game_patch/graphics/d3d11/gr_d3d11_texture.h +++ b/game_patch/graphics/d3d11/gr_d3d11_texture.h @@ -35,9 +35,9 @@ namespace df::gr::d3d11 void add_ref(int bm_handle); void remove_ref(int bm_handle); void mark_dirty(int bm_handle); - bool lock(int bm_handle, int section, rf::gr::LockInfo *lock); - void unlock(rf::gr::LockInfo *lock); - void get_texel(int bm_handle, float u, float v, rf::gr::Color *clr); + bool lock(int bm_handle, int section, rf::gr::LockInfo* lock); + void unlock(rf::gr::LockInfo* lock); + void get_texel(int bm_handle, float u, float v, rf::gr::Color* clr); rf::bm::Format read_back_buffer(ID3D11Texture2D* back_buffer, int x, int y, int w, int h, rf::ubyte* data); ComPtr create_solid_color_texture(float r, float g, float b, float a); @@ -68,11 +68,14 @@ namespace df::gr::d3d11 Texture(int bm_handle, DXGI_FORMAT format, ComPtr cpu_texture) : bm_handle{bm_handle}, format{format}, cpu_texture{cpu_texture} {} - Texture(int bm_handle, DXGI_FORMAT format, ComPtr gpu_texture, ComPtr render_target_view) : - bm_handle{bm_handle}, format{format}, gpu_texture{gpu_texture}, render_target_view{render_target_view} + Texture( + int bm_handle, DXGI_FORMAT format, ComPtr gpu_texture, + ComPtr render_target_view + ) : bm_handle{bm_handle}, format{format}, gpu_texture{gpu_texture}, render_target_view{render_target_view} {} - ID3D11ShaderResourceView* get_or_create_texture_view(ID3D11Device* device, ID3D11DeviceContext* device_context) + ID3D11ShaderResourceView* + get_or_create_texture_view(ID3D11Device* device, ID3D11DeviceContext* device_context) { if (!shader_resource_view) { init_shader_resource_view(device, device_context); @@ -80,7 +83,8 @@ namespace df::gr::d3d11 return shader_resource_view; } - ID3D11Texture2D* get_or_create_staging_texture(ID3D11Device* device, ID3D11DeviceContext* device_context, bool copy_from_gpu) + ID3D11Texture2D* + get_or_create_staging_texture(ID3D11Device* device, ID3D11DeviceContext* device_context, bool copy_from_gpu) { if (!cpu_texture) { init_cpu_texture(device, device_context, copy_from_gpu); @@ -116,7 +120,10 @@ namespace df::gr::d3d11 return insert_result.first->second; } - Texture create_texture(int bm_handle, rf::bm::Format fmt, int w, int h, rf::ubyte* bits, rf::ubyte* pal, int mip_levels, bool staging); + Texture create_texture( + int bm_handle, rf::bm::Format fmt, int w, int h, rf::ubyte* bits, rf::ubyte* pal, int mip_levels, + bool staging + ); Texture create_render_target(int bm_handle, int w, int h); Texture load_texture(int bm_handle, bool staging); std::pair determine_supported_texture_format(rf::bm::Format fmt); @@ -131,6 +138,5 @@ namespace df::gr::d3d11 ComPtr white_texture_view_; ComPtr gray_texture_view_; ComPtr black_texture_view_; - }; } diff --git a/game_patch/graphics/d3d11/gr_d3d11_transform.h b/game_patch/graphics/d3d11/gr_d3d11_transform.h index 453d44b1a..b7dc69c78 100644 --- a/game_patch/graphics/d3d11/gr_d3d11_transform.h +++ b/game_patch/graphics/d3d11/gr_d3d11_transform.h @@ -22,10 +22,7 @@ namespace df::gr::d3d11 public: Projection() = default; Projection(float sx, float sy, float zn, float zf) : - sx_{sx}, sy_{sy}, - sz_{-zn / (zf - zn)}, - tz_{zf * zn / (zf - zn)}, - zf_{zf} + sx_{sx}, sy_{sy}, sz_{-zn / (zf - zn)}, tz_{zf * zn / (zf - zn)}, zf_{zf} {} float project_z(float z) const @@ -42,7 +39,8 @@ namespace df::gr::d3d11 }; } - float unproject_z(float pz) const { + float unproject_z(float pz) const + { // (z * sz_ + tz_) / z == pz // pz * z = z * sz_ + tz_ // pz * z - sz_ * z = tz_ @@ -54,9 +52,10 @@ namespace df::gr::d3d11 GpuMatrix4x4 matrix() const { // RF projection (1/z) uses reversed-Z trick, maps near plane to 1 and infinity to 0 - // It has some benefits, see "reversed-Z trick" in https://developer.nvidia.com/content/depth-precision-visualized - // To support far plane clipping change it a bit and map far plane to 0 instead of infinity - // Matrix construction: https://iolite-engine.com/blog_posts/reverse_z_cheatsheet + // It has some benefits, see "reversed-Z trick" in + // https://developer.nvidia.com/content/depth-precision-visualized To support far plane clipping change it a + // bit and map far plane to 0 instead of infinity Matrix construction: + // https://iolite-engine.com/blog_posts/reverse_z_cheatsheet return {{ {sx_, 0.0f, 0.0f, 0.0f}, {0.0f, sy_, 0.0f, 0.0f}, diff --git a/game_patch/graphics/d3d11/gr_d3d11_vertex.h b/game_patch/graphics/d3d11/gr_d3d11_vertex.h index 24a718236..b4f686e5f 100644 --- a/game_patch/graphics/d3d11/gr_d3d11_vertex.h +++ b/game_patch/graphics/d3d11/gr_d3d11_vertex.h @@ -38,16 +38,16 @@ namespace df::gr::d3d11 }; template<> - inline - std::vector - VertexLayoutTrait::get_desc() + inline std::vector VertexLayoutTrait::get_desc() { return { - { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, - { "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, - { "COLOR", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, - { "TEXCOORD", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, - { "TEXCOORD", 1, DXGI_FORMAT_R32G32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, + {"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 + }, + {"NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0}, + {"COLOR", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0}, + {"TEXCOORD", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, + D3D11_INPUT_PER_VERTEX_DATA, 0}, + {"TEXCOORD", 1, DXGI_FORMAT_R32G32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0}, }; } @@ -71,17 +71,16 @@ namespace df::gr::d3d11 static_assert(sizeof(GpuCharacterVertex1) == 32); template<> - inline - std::vector - VertexLayoutTrait::get_desc() + inline std::vector VertexLayoutTrait::get_desc() { return { - { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, - { "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 1, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, - { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 1, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, - { "COLOR", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 1, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, - { "COLOR", 1, DXGI_FORMAT_R8G8B8A8_UNORM, 1, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, - { "COLOR", 2, DXGI_FORMAT_R8G8B8A8_UNORM, 1, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, + {"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 + }, + {"NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 1, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0}, + {"TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 1, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0}, + {"COLOR", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 1, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0}, + {"COLOR", 1, DXGI_FORMAT_R8G8B8A8_UNORM, 1, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0}, + {"COLOR", 2, DXGI_FORMAT_R8G8B8A8_UNORM, 1, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0}, }; } @@ -97,14 +96,13 @@ namespace df::gr::d3d11 }; template<> - inline - std::vector - VertexLayoutTrait::get_desc() + inline std::vector VertexLayoutTrait::get_desc() { return { - { "POSITIONT", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, - { "COLOR", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, - { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, + {"POSITIONT", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, + D3D11_INPUT_PER_VERTEX_DATA, 0}, + {"COLOR", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0}, + {"TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0}, }; } diff --git a/game_patch/graphics/gr.cpp b/game_patch/graphics/gr.cpp index 49c49067e..cf931fa9d 100644 --- a/game_patch/graphics/gr.cpp +++ b/game_patch/graphics/gr.cpp @@ -26,7 +26,10 @@ namespace df::gr::d3d11 { bool set_render_target(int bm_handle); void update_window_mode(); - void bitmap_float(int bitmap_handle, float x, float y, float w, float h, float sx, float sy, float sw, float sh, bool flip_x, bool flip_y, rf::gr::Mode mode); + void bitmap_float( + int bitmap_handle, float x, float y, float w, float h, float sx, float sy, float sw, float sh, bool flip_x, + bool flip_y, rf::gr::Mode mode + ); } float gr_lod_dist_scale = 1.0f; @@ -177,8 +180,10 @@ bool gr_set_render_target(int bm_handle) return false; } -void gr_bitmap_scaled_float(int bitmap_handle, float x, float y, float w, float h, - float sx, float sy, float sw, float sh, bool flip_x, bool flip_y, rf::gr::Mode mode) +void gr_bitmap_scaled_float( + int bitmap_handle, float x, float y, float w, float h, float sx, float sy, float sw, float sh, bool flip_x, + bool flip_y, rf::gr::Mode mode +) { if (rf::gr::screen.mode == rf::gr::DIRECT3D) { if (g_game_config.renderer == GameConfig::Renderer::d3d11) { @@ -214,16 +219,12 @@ void gr_update_texture_filtering() ConsoleCommand2 fullscreen_cmd{ "fullscreen", - []() { - gr_set_window_mode(rf::gr::FULLSCREEN); - }, + []() { gr_set_window_mode(rf::gr::FULLSCREEN); }, }; ConsoleCommand2 windowed_cmd{ "windowed", - []() { - gr_set_window_mode(rf::gr::WINDOWED); - }, + []() { gr_set_window_mode(rf::gr::WINDOWED); }, }; ConsoleCommand2 nearest_texture_filtering_cmd{ @@ -232,7 +233,9 @@ ConsoleCommand2 nearest_texture_filtering_cmd{ g_game_config.nearest_texture_filtering = !g_game_config.nearest_texture_filtering; g_game_config.save(); gr_update_texture_filtering(); - rf::console::print("Nearest texture filtering is {}", g_game_config.nearest_texture_filtering ? "enabled" : "disabled"); + rf::console::print( + "Nearest texture filtering is {}", g_game_config.nearest_texture_filtering ? "enabled" : "disabled" + ); }, "Toggle nearest texture filtering", }; diff --git a/game_patch/graphics/gr.h b/game_patch/graphics/gr.h index b26c04f23..cf1ec4400 100644 --- a/game_patch/graphics/gr.h +++ b/game_patch/graphics/gr.h @@ -8,7 +8,10 @@ int gr_font_get_default(); void gr_font_set_default(int font_id); bool gr_set_render_target(int bm_handle); bool gr_is_texture_format_supported(rf::bm::Format format); -void gr_bitmap_scaled_float(int bitmap_handle, float x, float y, float w, float h, float sx, float sy, float sw, float sh, bool flip_x, bool flip_y, rf::gr::Mode mode); +void gr_bitmap_scaled_float( + int bitmap_handle, float x, float y, float w, float h, float sx, float sy, float sw, float sh, bool flip_x, + bool flip_y, rf::gr::Mode mode +); float gr_scale_fov_hor_plus(float horizontal_fov); template diff --git a/game_patch/graphics/gr_font.cpp b/game_patch/graphics/gr_font.cpp index 57614e7ae..64e62bfb4 100644 --- a/game_patch/graphics/gr_font.cpp +++ b/game_patch/graphics/gr_font.cpp @@ -27,7 +27,8 @@ struct ParsedFontName }; template -class TextureAtlasPacker { +class TextureAtlasPacker +{ public: void add(int w, int h, T userdata); void pack(); @@ -149,9 +150,7 @@ inline void TextureAtlasPacker::pack() update_size(); xlog::trace("Texture atlas usage: {:.2f}", total_pixels_ * 100.0f / (atlas_size_.first * atlas_size_.second)); // Sort by area (from largest to smallest) - std::sort(items_.begin(), items_.end(), [](Item& a, Item& b) { - return a.area > b.area; - }); + std::sort(items_.begin(), items_.end(), [](Item& a, Item& b) { return a.area > b.area; }); // Set positions if (!try_pack()) { atlas_size_ = {2 * atlas_size_.first, 2 * atlas_size_.second}; @@ -213,8 +212,7 @@ inline void TextureAtlasPacker::update_size() atlas_size_ = std::pair{size, size}; } -GrNewFont::GrNewFont(std::string_view name) : - name_{name} +GrNewFont::GrNewFont(std::string_view name) : name_{name} { auto [filename, size_x, size_y, digits_only] = parse_font_name(name); std::vector buffer; @@ -238,8 +236,10 @@ GrNewFont::GrNewFont(std::string_view name) : } xlog::trace("raw height {} ascender {} descender {}", face->height, face->ascender, face->descender); - xlog::trace("scaled height {} ascender {} descender {}", face->size->metrics.height / 64, - face->size->metrics.ascender / 64, face->size->metrics.descender / 64); + xlog::trace( + "scaled height {} ascender {} descender {}", face->size->metrics.height / 64, face->size->metrics.ascender / 64, + face->size->metrics.descender / 64 + ); line_spacing_ = face->size->metrics.height / 64; height_ = line_spacing_; //(face->size->metrics.ascender - face->size->metrics.descender) / 64; baseline_y_ = face->size->metrics.ascender / 64; @@ -248,27 +248,9 @@ GrNewFont::GrNewFont(std::string_view name) : // Prepare lookup table for translating Windows 1252 characters (encoding used by RF) into Unicode codepoints static std::pair win_1252_char_ranges[]{ - {0x20, 0x7E}, - {0x8C, 0x8C}, - {0x99, 0x99}, - {0x9C, 0x9C}, - {0x9F, 0x9F}, - {0xA6, 0xA7}, - {0xA9, 0xAB}, - {0xAE, 0xAE}, - {0xB0, 0xB0}, - {0xC0, 0xC2}, - {0xC4, 0xCB}, - {0xCE, 0xCF}, - {0xD2, 0xD4}, - {0xD6, 0xD6}, - {0xD9, 0xDC}, - {0xDF, 0xE2}, - {0xE4, 0xEB}, - {0xEE, 0xEF}, - {0xF2, 0xF4}, - {0xF6, 0xF6}, - {0xF9, 0xFC}, + {0x20, 0x7E}, {0x8C, 0x8C}, {0x99, 0x99}, {0x9C, 0x9C}, {0x9F, 0x9F}, {0xA6, 0xA7}, {0xA9, 0xAB}, + {0xAE, 0xAE}, {0xB0, 0xB0}, {0xC0, 0xC2}, {0xC4, 0xCB}, {0xCE, 0xCF}, {0xD2, 0xD4}, {0xD6, 0xD6}, + {0xD9, 0xDC}, {0xDF, 0xE2}, {0xE4, 0xEB}, {0xEE, 0xEF}, {0xF2, 0xF4}, {0xF6, 0xF6}, {0xF9, 0xFC}, }; // Prepare character mapping and array of unicode code points @@ -331,8 +313,10 @@ GrNewFont::GrNewFont(std::string_view name) : auto [glyph_bm_x, glyph_bm_y] = atlas_packer.get_pos(codepoint); - xlog::trace("glyph {:x} bitmap x {} y {} w {} h {} left {} top {} advance {}", codepoint, glyph_bm_x, glyph_bm_y, - glyph_bm_w, glyph_bm_h, slot->bitmap_left, slot->bitmap_top, slot->advance.x >> 6); + xlog::trace( + "glyph {:x} bitmap x {} y {} w {} h {} left {} top {} advance {}", codepoint, glyph_bm_x, glyph_bm_y, + glyph_bm_w, glyph_bm_h, slot->bitmap_left, slot->bitmap_top, slot->advance.x >> 6 + ); GlyphInfo glyph_info; glyph_info.advance_x = slot->advance.x >> 6; @@ -345,7 +329,10 @@ GrNewFont::GrNewFont(std::string_view name) : int pixel_size = bm_bytes_per_pixel(lock.format); auto* dst_ptr = bitmap_bits + glyph_bm_y * lock.stride_in_bytes + glyph_bm_x * pixel_size; - bm_convert_format(dst_ptr, lock.format, bitmap.buffer, rf::bm::FORMAT_8_ALPHA, bitmap.width, bitmap.rows, lock.stride_in_bytes, bitmap.pitch); + bm_convert_format( + dst_ptr, lock.format, bitmap.buffer, rf::bm::FORMAT_8_ALPHA, bitmap.width, bitmap.rows, + lock.stride_in_bytes, bitmap.pitch + ); glyphs_.push_back(glyph_info); } @@ -372,8 +359,11 @@ void GrNewFont::draw(int x, int y, std::string_view text, rf::gr::Mode state) co if (glyph_idx != -1) { const auto& glyph_info = glyphs_[glyph_idx]; if (glyph_info.bm_w) { - //rf::gr::rect(pen_x + glyph_info.x, pen_y + glyph_info.y, glyph_info.bm_w, glyph_info.bm_h); - rf::gr::bitmap_ex(bitmap_, pen_x + glyph_info.x, pen_y + glyph_info.y, glyph_info.bm_w, glyph_info.bm_h, glyph_info.bm_x, glyph_info.bm_y, state); + // rf::gr::rect(pen_x + glyph_info.x, pen_y + glyph_info.y, glyph_info.bm_w, glyph_info.bm_h); + rf::gr::bitmap_ex( + bitmap_, pen_x + glyph_info.x, pen_y + glyph_info.y, glyph_info.bm_w, glyph_info.bm_h, + glyph_info.bm_x, glyph_info.bm_y, state + ); } pen_x += glyph_info.advance_x; } @@ -385,7 +375,8 @@ void GrNewFont::draw(int x, int y, std::string_view text, rf::gr::Mode state) co current_string_y = y; } -void GrNewFont::draw_aligned(rf::gr::TextAlignment alignment, int x, int y, std::string_view text, rf::gr::Mode state) const +void GrNewFont::draw_aligned(rf::gr::TextAlignment alignment, int x, int y, std::string_view text, rf::gr::Mode state) + const { size_t cur_pos = 0; while (cur_pos < text.size()) { @@ -462,9 +453,9 @@ void gr_font_set_default(int font_id) FunHook gr_init_font_hook{ 0x0051F6E0, - [](const char *name, int reserved) { + [](const char* name, int reserved) { if (rf::is_dedicated_server) { - return -1; + return -1; } if (string_ends_with(name, ".vf")) { return gr_init_font_hook.call_target(name, reserved); @@ -515,7 +506,7 @@ FunHook gr_get_font_height_hook{ FunHook gr_string_hook{ 0x0051FEB0, - [](int x, int y, const char *text, int font_num, rf::gr::Mode mode) { + [](int x, int y, const char* text, int font_num, rf::gr::Mode mode) { if (font_num == -1) { font_num = g_default_font_id; } @@ -531,7 +522,7 @@ FunHook gr_string_hook{ FunHook gr_get_string_size_hook{ 0x0051F530, - [](int *out_width, int *out_height, const char *text, int text_len, int font_num) { + [](int* out_width, int* out_height, const char* text, int text_len, int font_num) { if (font_num == -1) { font_num = g_default_font_id; } @@ -554,16 +545,14 @@ FunHook gr_get_string_size_hook{ CodeInjection gr_create_font_increment_number_injection{ 0x0051F800, - []() { - rf::gr::num_fonts++; - }, + []() { rf::gr::num_fonts++; }, }; void gr_font_apply_patch() { // Fix font texture leak - // Original code sets bitmap handle in all fonts to -1 on level unload. On next font usage the font bitmap is reloaded. - // Note: font bitmaps are dynamic (USERBMAP) so they cannot be found by name unlike normal bitmaps. + // Original code sets bitmap handle in all fonts to -1 on level unload. On next font usage the font bitmap is + // reloaded. Note: font bitmaps are dynamic (USERBMAP) so they cannot be found by name unlike normal bitmaps. AsmWriter(0x0051F3E0).ret(); gr_load_font_internal_fix_texture_ref.install(); diff --git a/game_patch/graphics/gr_light.cpp b/game_patch/graphics/gr_light.cpp index df481d545..f0f00aacb 100644 --- a/game_patch/graphics/gr_light.cpp +++ b/game_patch/graphics/gr_light.cpp @@ -5,9 +5,9 @@ bool is_find_static_lights = false; void gr_light_use_static(bool use_static) { // Enable some experimental flag that causes static lights to be included in computations - //auto& experimental_alloc_and_lighting = addr_as_ref(0x00879AF8); + // auto& experimental_alloc_and_lighting = addr_as_ref(0x00879AF8); auto& gr_light_state = addr_as_ref(0x00C96874); - //experimental_alloc_and_lighting = use_static; + // experimental_alloc_and_lighting = use_static; is_find_static_lights = use_static; // Increment light cache key to trigger cache invalidation gr_light_state++; diff --git a/game_patch/graphics/legacy/gr_d3d.cpp b/game_patch/graphics/legacy/gr_d3d.cpp index 748040c01..fa02652e5 100644 --- a/game_patch/graphics/legacy/gr_d3d.cpp +++ b/game_patch/graphics/legacy/gr_d3d.cpp @@ -113,21 +113,33 @@ CodeInjection gr_d3d_init_error_patch{ auto hr = static_cast(regs.eax); xlog::error("D3D CreateDevice failed (hr 0x{:x} - {})", hr, get_d3d_error_str(hr)); - auto text = std::format("Failed to create Direct3D device object - error 0x{:X} ({}).\n" - "A critical error has occurred and the program cannot continue.\n" - "Press OK to exit the program", - hr, get_d3d_error_str(hr)); - - hr = rf::gr::d3d::d3d->CheckDeviceType(rf::gr::d3d::adapter_idx, D3DDEVTYPE_HAL, rf::gr::d3d::pp.BackBufferFormat, - rf::gr::d3d::pp.BackBufferFormat, rf::gr::d3d::pp.Windowed); + auto text = std::format( + "Failed to create Direct3D device object - error 0x{:X} ({}).\n" + "A critical error has occurred and the program cannot continue.\n" + "Press OK to exit the program", + hr, get_d3d_error_str(hr) + ); + + hr = rf::gr::d3d::d3d->CheckDeviceType( + rf::gr::d3d::adapter_idx, D3DDEVTYPE_HAL, rf::gr::d3d::pp.BackBufferFormat, + rf::gr::d3d::pp.BackBufferFormat, rf::gr::d3d::pp.Windowed + ); if (FAILED(hr)) { - xlog::error("CheckDeviceType for format {} failed: {:x}", static_cast(rf::gr::d3d::pp.BackBufferFormat), hr); + xlog::error( + "CheckDeviceType for format {} failed: {:x}", static_cast(rf::gr::d3d::pp.BackBufferFormat), + hr + ); } - hr = rf::gr::d3d::d3d->CheckDeviceFormat(rf::gr::d3d::adapter_idx, D3DDEVTYPE_HAL, rf::gr::d3d::pp.BackBufferFormat, - D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE, rf::gr::d3d::pp.AutoDepthStencilFormat); + hr = rf::gr::d3d::d3d->CheckDeviceFormat( + rf::gr::d3d::adapter_idx, D3DDEVTYPE_HAL, rf::gr::d3d::pp.BackBufferFormat, D3DUSAGE_DEPTHSTENCIL, + D3DRTYPE_SURFACE, rf::gr::d3d::pp.AutoDepthStencilFormat + ); if (FAILED(hr)) { - xlog::error("CheckDeviceFormat for depth-stencil format {} failed: {:x}", static_cast(rf::gr::d3d::pp.AutoDepthStencilFormat), hr); + xlog::error( + "CheckDeviceFormat for depth-stencil format {} failed: {:x}", + static_cast(rf::gr::d3d::pp.AutoDepthStencilFormat), hr + ); } if (!(rf::gr::d3d::device_caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT)) { @@ -139,7 +151,10 @@ CodeInjection gr_d3d_init_error_patch{ D3DDISPLAYMODE mode; for (unsigned i = 0; i < num_modes; ++i) { rf::gr::d3d::d3d->EnumAdapterModes(rf::gr::d3d::adapter_idx, i, &mode); - xlog::info("- {}x{} (format {} refresh rate {})", mode.Width, mode.Height, static_cast(mode.Format), mode.RefreshRate); + xlog::info( + "- {}x{} (format {} refresh rate {})", mode.Width, mode.Height, static_cast(mode.Format), + mode.RefreshRate + ); } ShowWindow(rf::main_wnd, SW_HIDE); @@ -162,10 +177,13 @@ D3DFORMAT determine_depth_buffer_format(D3DFORMAT adapter_format) D3DFORMAT formats_to_check[] = {D3DFMT_D24X8, D3DFMT_D24S8, D3DFMT_D24X4S4, D3DFMT_D32, D3DFMT_D16, D3DFMT_D15S1}; for (auto depth_fmt : formats_to_check) { - if (SUCCEEDED(rf::gr::d3d::d3d->CheckDeviceFormat(rf::gr::d3d::adapter_idx, D3DDEVTYPE_HAL, adapter_format, D3DUSAGE_DEPTHSTENCIL, - D3DRTYPE_SURFACE, depth_fmt)) && - SUCCEEDED(rf::gr::d3d::d3d->CheckDepthStencilMatch(rf::gr::d3d::adapter_idx, D3DDEVTYPE_HAL, adapter_format, adapter_format, - depth_fmt))) { + if (SUCCEEDED(rf::gr::d3d::d3d->CheckDeviceFormat( + rf::gr::d3d::adapter_idx, D3DDEVTYPE_HAL, adapter_format, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE, + depth_fmt + )) && + SUCCEEDED(rf::gr::d3d::d3d->CheckDepthStencilMatch( + rf::gr::d3d::adapter_idx, D3DDEVTYPE_HAL, adapter_format, adapter_format, depth_fmt + ))) { xlog::info("Selected D3D depth format: {}", static_cast(depth_fmt)); return depth_fmt; } @@ -185,13 +203,18 @@ CodeInjection update_pp_hook{ xlog::info("Back Buffer dimensions: {}x{}", rf::gr::d3d::pp.BackBufferWidth, rf::gr::d3d::pp.BackBufferHeight); xlog::info("D3D Device Caps: {:x}", rf::gr::d3d::device_caps.DevCaps); xlog::info("D3D Raster Caps: {:x}", rf::gr::d3d::device_caps.RasterCaps); - xlog::info("Max texture size: {}x{}", rf::gr::d3d::device_caps.MaxTextureWidth, rf::gr::d3d::device_caps.MaxTextureHeight); + xlog::info( + "Max texture size: {}x{}", rf::gr::d3d::device_caps.MaxTextureWidth, + rf::gr::d3d::device_caps.MaxTextureHeight + ); if (g_game_config.msaa) { // Make sure selected MSAA mode is available auto multi_sample_type = static_cast(g_game_config.msaa.value()); - HRESULT hr = rf::gr::d3d::d3d->CheckDeviceMultiSampleType(rf::gr::d3d::adapter_idx, D3DDEVTYPE_HAL, rf::gr::d3d::pp.BackBufferFormat, - rf::gr::d3d::pp.Windowed, multi_sample_type); + HRESULT hr = rf::gr::d3d::d3d->CheckDeviceMultiSampleType( + rf::gr::d3d::adapter_idx, D3DDEVTYPE_HAL, rf::gr::d3d::pp.BackBufferFormat, rf::gr::d3d::pp.Windowed, + multi_sample_type + ); if (SUCCEEDED(hr)) { xlog::info("Enabling Anti-Aliasing ({}x MSAA)...", g_game_config.msaa.value()); rf::gr::d3d::pp.MultiSampleType = multi_sample_type; @@ -265,10 +288,12 @@ void gr_d3d_update_texture_filtering() // use linear filtering for lightmaps because otherwise it looks bad set_texture_min_mag_filter_in_code(D3DTEXF_POINT, D3DTEXF_LINEAR); } - else if (rf::gr::d3d::device_caps.MaxAnisotropy > 0 && g_game_config.anisotropic_filtering && !rf::is_dedicated_server) { + else if (rf::gr::d3d::device_caps.MaxAnisotropy > 0 && g_game_config.anisotropic_filtering && + !rf::is_dedicated_server) { // Anisotropic texture filtering set_texture_min_mag_filter_in_code(D3DTEXF_ANISOTROPIC, D3DTEXF_ANISOTROPIC); - } else { + } + else { set_texture_min_mag_filter_in_code(D3DTEXF_LINEAR, D3DTEXF_LINEAR); } } @@ -392,7 +417,9 @@ CodeInjection D3D_DrawIndexedPrimitive_profile_patch{ auto num_vertices = addr_as_ref(regs.esp + 16); auto start_index = addr_as_ref(regs.esp + 20); auto prim_count = addr_as_ref(regs.esp + 24); - xlog::info("DrawIndexedPrimitive {} {} {} {} {}", prim_type, min_index, num_vertices, start_index, prim_count); + xlog::info( + "DrawIndexedPrimitive {} {} {} {} {}", prim_type, min_index, num_vertices, start_index, prim_count + ); ++g_num_draw_calls; } }, @@ -436,7 +463,8 @@ CodeInjection gr_d3d_init_device_injection{ 0x00546368, []() { gr_d3d_update_texture_filtering(); - if (rf::gr::d3d::device_caps.MaxAnisotropy > 0 && g_game_config.anisotropic_filtering && !rf::is_dedicated_server) { + if (rf::gr::d3d::device_caps.MaxAnisotropy > 0 && g_game_config.anisotropic_filtering && + !rf::is_dedicated_server) { DWORD anisotropy_level = setup_max_anisotropy(); xlog::info("Anisotropic Filtering enabled (level: {})", anisotropy_level); } @@ -493,53 +521,51 @@ CodeInjection gr_d3d_bitmap_patch_2{ CodeInjection gr_d3d_line_patch_1{ 0x0055147D, [](auto& regs) { - bool flush_needed = !rf::gr::d3d::buffers_locked - || rf::gr::d3d::primitive_type != D3DPT_LINELIST - || rf::gr::d3d::max_hw_vertex + 2 > 6000 - || rf::gr::d3d::max_hw_index + rf::gr::d3d::num_indices + 2 > 10000; + bool flush_needed = !rf::gr::d3d::buffers_locked || rf::gr::d3d::primitive_type != D3DPT_LINELIST || + rf::gr::d3d::max_hw_vertex + 2 > 6000 || + rf::gr::d3d::max_hw_index + rf::gr::d3d::num_indices + 2 > 10000; if (!flush_needed) { xlog::trace("Skipping gr_d3d_prepare_buffers"); regs.eip = 0x00551482; } else { - xlog::trace("Line drawing requires gr_d3d_prepare_buffers {} {} {} {}", - rf::gr::d3d::buffers_locked, rf::gr::d3d::primitive_type, rf::gr::d3d::max_hw_vertex, - rf::gr::d3d::max_hw_index + rf::gr::d3d::num_indices); + xlog::trace( + "Line drawing requires gr_d3d_prepare_buffers {} {} {} {}", rf::gr::d3d::buffers_locked, + rf::gr::d3d::primitive_type, rf::gr::d3d::max_hw_vertex, + rf::gr::d3d::max_hw_index + rf::gr::d3d::num_indices + ); } }, }; CallHook gr_d3d_line_patch_2{ 0x005515B2, - []() { - rf::gr::d3d::num_vertices += 2; - }, + []() { rf::gr::d3d::num_vertices += 2; }, }; CodeInjection gr_d3d_line_vertex_internal_patch_1{ 0x005516FE, [](auto& regs) { - bool flush_needed = !rf::gr::d3d::buffers_locked - || rf::gr::d3d::primitive_type != D3DPT_LINELIST - || rf::gr::d3d::max_hw_vertex + 2 > 6000 - || rf::gr::d3d::max_hw_index + rf::gr::d3d::num_indices + 2 > 10000; + bool flush_needed = !rf::gr::d3d::buffers_locked || rf::gr::d3d::primitive_type != D3DPT_LINELIST || + rf::gr::d3d::max_hw_vertex + 2 > 6000 || + rf::gr::d3d::max_hw_index + rf::gr::d3d::num_indices + 2 > 10000; if (!flush_needed) { xlog::trace("Skipping gr_d3d_prepare_buffers"); regs.eip = 0x00551703; } else { - xlog::trace("Line drawing requires gr_d3d_prepare_buffers {} {} {} {}", - rf::gr::d3d::buffers_locked, rf::gr::d3d::primitive_type, rf::gr::d3d::max_hw_vertex, - rf::gr::d3d::max_hw_index + rf::gr::d3d::num_indices); + xlog::trace( + "Line drawing requires gr_d3d_prepare_buffers {} {} {} {}", rf::gr::d3d::buffers_locked, + rf::gr::d3d::primitive_type, rf::gr::d3d::max_hw_vertex, + rf::gr::d3d::max_hw_index + rf::gr::d3d::num_indices + ); } }, }; CallHook gr_d3d_line_vertex_internal_patch_2{ 0x005518E8, - []() { - rf::gr::d3d::num_vertices += 2; - }, + []() { rf::gr::d3d::num_vertices += 2; }, }; CodeInjection gr_d3d_tmapper_patch{ @@ -571,14 +597,15 @@ CodeInjection gr_d3d_draw_geometry_face_patch_2{ FunHook gr_d3d_queue_triangles_hook{ 0x005614B0, - [](int *list_idx, void *vertices, int num_vertices, int bm0, int bm1, rf::gr::Mode mode, int pass_id) { + [](int* list_idx, void* vertices, int num_vertices, int bm0, int bm1, rf::gr::Mode mode, int pass_id) { // Fix glass_house level having faces that use MT state but don't have any lightmap if (bm1 == -1) { INFO_ONCE("Prevented rendering of an unlit face with multi-texturing render state"); rf::gr::TextureSource ts = mode.get_texture_source(); if (ts == rf::gr::TEXTURE_SOURCE_CLAMP_1_WRAP_0 || ts == rf::gr::TEXTURE_SOURCE_CLAMP_1_WRAP_0_MOD2X) { ts = rf::gr::TEXTURE_SOURCE_WRAP; - } else if (ts == rf::gr::TEXTURE_SOURCE_CLAMP_1_CLAMP_0) { + } + else if (ts == rf::gr::TEXTURE_SOURCE_CLAMP_1_CLAMP_0) { ts = rf::gr::TEXTURE_SOURCE_CLAMP; } mode.set_texture_source(ts); @@ -598,7 +625,8 @@ CodeInjection gr_d3d_init_load_library_injection{ if (d3d8to9_module) { regs.eax = d3d8to9_module; regs.eip = 0x005459B9; - } else { + } + else { xlog::warn("Failed to load d3d8to9.dll (error {})", GetLastError()); g_game_config.renderer = GameConfig::Renderer::d3d8; } @@ -632,7 +660,8 @@ ConsoleCommand2 pow2_tex_cmd{ rf::gr::d3d::p2t = !rf::gr::d3d::p2t; rf::console::print("Power of 2 textures: {}", rf::gr::d3d::p2t ? "on" : "off"); }, - "Forces usage of power of two textures. It may fix UV mappings in old levels. Onyl levels loaded after usage of this command are affected.", + "Forces usage of power of two textures. It may fix UV mappings in old levels. Onyl levels loaded after usage of " + "this command are affected.", }; bool gr_d3d_is_d3d8to9() @@ -643,7 +672,9 @@ bool gr_d3d_is_d3d8to9() static bool is_d3d9 = false; static bool is_d3d9_inited = false; if (!is_d3d9_inited) { - static const GUID IID_IDirect3D9 = {0x81BDCBCA, 0x64D4, 0x426D, {0xAE, 0x8D, 0xAD, 0x01, 0x47, 0xF4, 0x27, 0x5C}}; + static const GUID IID_IDirect3D9 = { + 0x81BDCBCA, 0x64D4, 0x426D, {0xAE, 0x8D, 0xAD, 0x01, 0x47, 0xF4, 0x27, 0x5C} + }; ComPtr d3d9; is_d3d9 = SUCCEEDED(rf::gr::d3d::d3d->QueryInterface(IID_IDirect3D9, reinterpret_cast(&d3d9))); is_d3d9_inited = true; @@ -651,16 +682,18 @@ bool gr_d3d_is_d3d8to9() return is_d3d9; } -void gr_d3d_bitmap_float(int bitmap_handle, float x, float y, float w, float h, - float sx, float sy, float sw, float sh, bool flip_x, bool flip_y, rf::gr::Mode mode) +void gr_d3d_bitmap_float( + int bitmap_handle, float x, float y, float w, float h, float sx, float sy, float sw, float sh, bool flip_x, + bool flip_y, rf::gr::Mode mode +) { auto& gr_d3d_get_num_texture_sections = addr_as_ref(0x0055CA60); if (gr_d3d_get_num_texture_sections(bitmap_handle) != 1) { // If bitmap is sectioned fall back to the old implementation... - rf::gr::bitmap_scaled(bitmap_handle, - static_cast(x), static_cast(y), static_cast(w), static_cast(h), - static_cast(sx), static_cast(sy), static_cast(sw), static_cast(sh), - flip_x, flip_y, mode); + rf::gr::bitmap_scaled( + bitmap_handle, static_cast(x), static_cast(y), static_cast(w), static_cast(h), + static_cast(sx), static_cast(sy), static_cast(sw), static_cast(sh), flip_x, flip_y, mode + ); return; } @@ -759,11 +792,11 @@ void gr_d3d_apply_patch() // Fix decal fade out in gr_d3d_render_static_solid write_mem(0x00560994 + 1, 3); - // Flush instead of preparing D3D drawing buffers in gr_d3d_set_state, gr_d3d_set_state_and_texture, gr_d3d_tcache_set - // Note: By default RF calls gr_d3d_tcache_set for many textures during level load process. It causes D3D buffers - // to be locked and unlocked multiple times with discard flag. For some driver implementations (e.g. DXVK) such - // behaviour leads to allocation of new vertex/index buffers during each lock and in the end it can cause end of - // memory error. + // Flush instead of preparing D3D drawing buffers in gr_d3d_set_state, gr_d3d_set_state_and_texture, + // gr_d3d_tcache_set Note: By default RF calls gr_d3d_tcache_set for many textures during level load process. It + // causes D3D buffers to be locked and unlocked multiple times with discard flag. For some driver implementations + // (e.g. DXVK) such behaviour leads to allocation of new vertex/index buffers during each lock and in the end it can + // cause end of memory error. AsmWriter(0x0054F1A9).call(rf::gr::d3d::flush_buffers); AsmWriter(0x0055088A).call(rf::gr::d3d::flush_buffers); AsmWriter(0x0055CAE9).call(rf::gr::d3d::flush_buffers); @@ -804,7 +837,8 @@ void gr_d3d_apply_patch() // Crash-fix in case texture has not been created (this happens if gr_read_back_buffer fails) gr_d3d_lock_crash_fix.install(); - // Fix undefined behavior in D3D state handling: alpha operations cannot be disabled when color operations are enabled + // Fix undefined behavior in D3D state handling: alpha operations cannot be disabled when color operations are + // enabled write_mem(0x0054F785 + 1, D3DTOP_SELECTARG2); write_mem(0x0054FF18 + 1, D3DTOP_SELECTARG2); @@ -816,9 +850,9 @@ void gr_d3d_apply_patch() write_mem(0x00547257, asm_opcodes::jmp_rel_short); // Fix flamethrower "stroboscopic effect" on high FPS - // gr_3d_bitmap_angle interprets parameters differently than gr_3d_bitmap_stretched_square expects - zero angle does not use - // diamond shape and size is not divided by 2. Instead of calling it when p0 to p1 distance is small get rid of this - // special case. gr_3d_bitmap_stretched_square should handle it properly even if distance is 0 because it + // gr_3d_bitmap_angle interprets parameters differently than gr_3d_bitmap_stretched_square expects - zero angle does + // not use diamond shape and size is not divided by 2. Instead of calling it when p0 to p1 distance is small get rid + // of this special case. gr_3d_bitmap_stretched_square should handle it properly even if distance is 0 because it // uses Vector3::normalize_safe() API. write_mem(0x00558E61, asm_opcodes::jmp_rel_short); diff --git a/game_patch/graphics/legacy/gr_d3d.h b/game_patch/graphics/legacy/gr_d3d.h index de72f8824..58e828bc9 100644 --- a/game_patch/graphics/legacy/gr_d3d.h +++ b/game_patch/graphics/legacy/gr_d3d.h @@ -10,4 +10,7 @@ void gr_d3d_apply_patch(); void gr_d3d_texture_apply_patch(); void gr_d3d_capture_apply_patch(); void gr_d3d_gamma_apply_patch(); -void gr_d3d_bitmap_float(int bitmap_handle, float x, float y, float w, float h, float sx, float sy, float sw, float sh, bool flip_x, bool flip_y, rf::gr::Mode mode); +void gr_d3d_bitmap_float( + int bitmap_handle, float x, float y, float w, float h, float sx, float sy, float sw, float sh, bool flip_x, + bool flip_y, rf::gr::Mode mode +); diff --git a/game_patch/graphics/legacy/gr_d3d_capture.cpp b/game_patch/graphics/legacy/gr_d3d_capture.cpp index fae06435f..c5eb7206b 100644 --- a/game_patch/graphics/legacy/gr_d3d_capture.cpp +++ b/game_patch/graphics/legacy/gr_d3d_capture.cpp @@ -27,7 +27,8 @@ IDirect3DSurface8* get_cached_depth_stencil_surface() if (!g_depth_stencil_surface) { auto hr = rf::gr::d3d::device->CreateDepthStencilSurface( rf::gr::d3d::pp.BackBufferWidth, rf::gr::d3d::pp.BackBufferHeight, rf::gr::d3d::pp.AutoDepthStencilFormat, - D3DMULTISAMPLE_NONE, &g_depth_stencil_surface); + D3DMULTISAMPLE_NONE, &g_depth_stencil_surface + ); if (FAILED(hr)) { ERR_ONCE("IDirect3DDevice8::CreateDepthStencilSurface failed 0x{:X}", hr); return nullptr; @@ -158,8 +159,7 @@ CallHook gr_d3d_read_back_buffer } int bytes_per_pixel = bm_bytes_per_pixel(pixel_fmt); - std::byte* src_ptr = - static_cast(locked_rect.pBits) + y * locked_rect.Pitch + x * bytes_per_pixel; + std::byte* src_ptr = static_cast(locked_rect.pBits) + y * locked_rect.Pitch + x * bytes_per_pixel; std::byte* dst_ptr = buffer; for (int i = 0; i < height; ++i) { diff --git a/game_patch/graphics/legacy/gr_d3d_gamma.cpp b/game_patch/graphics/legacy/gr_d3d_gamma.cpp index c1d1efef6..2bb4526b1 100644 --- a/game_patch/graphics/legacy/gr_d3d_gamma.cpp +++ b/game_patch/graphics/legacy/gr_d3d_gamma.cpp @@ -34,7 +34,7 @@ static bool set_gamma_ramp_via_d3d(D3DGAMMARAMP* gamma_ramp) static bool set_gamma_ramp_via_gdi(D3DGAMMARAMP* gamma_ramp) { - //HDC hdc = GetDC(rf::main_wnd); + // HDC hdc = GetDC(rf::main_wnd); HDC hdc = CreateDCA("DISPLAY", nullptr, nullptr, nullptr); if (!hdc) { xlog::warn("CreateDCA failed, error {}", GetLastError()); @@ -51,7 +51,7 @@ static bool set_gamma_ramp_via_gdi(D3DGAMMARAMP* gamma_ramp) } SetLastError(0); bool result = SetDeviceGammaRamp(hdc, gamma_ramp); - //ReleaseDC(rf::main_wnd, hdc); + // ReleaseDC(rf::main_wnd, hdc); DeleteDC(hdc); if (!result) { @@ -101,15 +101,15 @@ void gr_d3d_gamma_reset() static void gamma_msg_handler(UINT msg, WPARAM w_param, [[maybe_unused]] LPARAM l_param) { switch (msg) { - case WM_ACTIVATE: - case WM_ACTIVATEAPP: - xlog::trace("WM_ACTIVATE {:x}", w_param); - if (g_gamma_ramp_initialized) { - if (w_param) - set_gamma_ramp(&g_gamma_ramp); - else - gr_d3d_gamma_reset(); - } + case WM_ACTIVATE: + case WM_ACTIVATEAPP: + xlog::trace("WM_ACTIVATE {:x}", w_param); + if (g_gamma_ramp_initialized) { + if (w_param) + set_gamma_ramp(&g_gamma_ramp); + else + gr_d3d_gamma_reset(); + } } } @@ -122,5 +122,4 @@ void gr_d3d_gamma_apply_patch() { // Add gamma support for windowed mode AsmWriter(0x00547A60).jmp(gr_d3d_update_gamma_ramp_hook); - } diff --git a/game_patch/graphics/legacy/gr_d3d_internal.h b/game_patch/graphics/legacy/gr_d3d_internal.h index 3b09c5c2a..8e00c9435 100644 --- a/game_patch/graphics/legacy/gr_d3d_internal.h +++ b/game_patch/graphics/legacy/gr_d3d_internal.h @@ -15,67 +15,67 @@ void gr_d3d_capture_close(); inline D3DFORMAT get_d3d_format_from_bm_format(rf::bm::Format format) { switch (format) { - case rf::bm::FORMAT_8_PALETTED: - // Note: this indexed format is not really A8 but because there is no corresponding D3D format A8 format - // is returned instead (it is used only for pixel size related calculations) - case rf::bm::FORMAT_8_ALPHA: - return D3DFMT_A8; - case rf::bm::FORMAT_8888_ARGB: - return D3DFMT_A8R8G8B8; - case rf::bm::FORMAT_888_RGB: - return D3DFMT_R8G8B8; - case rf::bm::FORMAT_565_RGB: - return D3DFMT_R5G6B5; - case rf::bm::FORMAT_1555_ARGB: - return D3DFMT_A1R5G5B5; - case rf::bm::FORMAT_4444_ARGB: - return D3DFMT_A4R4G4B4; - case rf::bm::FORMAT_DXT1: - return D3DFMT_DXT1; - // case rf::bm::FORMAT_DXT2: - // return D3DFMT_DXT2; - case rf::bm::FORMAT_DXT3: - return D3DFMT_DXT3; - // case rf::bm::FORMAT_DXT4: - // return D3DFMT_DXT4; - case rf::bm::FORMAT_DXT5: - return D3DFMT_DXT5; - default: - xlog::warn("unknown BM format {}", static_cast(format)); - return D3DFMT_UNKNOWN; + case rf::bm::FORMAT_8_PALETTED: + // Note: this indexed format is not really A8 but because there is no corresponding D3D format A8 format + // is returned instead (it is used only for pixel size related calculations) + case rf::bm::FORMAT_8_ALPHA: + return D3DFMT_A8; + case rf::bm::FORMAT_8888_ARGB: + return D3DFMT_A8R8G8B8; + case rf::bm::FORMAT_888_RGB: + return D3DFMT_R8G8B8; + case rf::bm::FORMAT_565_RGB: + return D3DFMT_R5G6B5; + case rf::bm::FORMAT_1555_ARGB: + return D3DFMT_A1R5G5B5; + case rf::bm::FORMAT_4444_ARGB: + return D3DFMT_A4R4G4B4; + case rf::bm::FORMAT_DXT1: + return D3DFMT_DXT1; + // case rf::bm::FORMAT_DXT2: + // return D3DFMT_DXT2; + case rf::bm::FORMAT_DXT3: + return D3DFMT_DXT3; + // case rf::bm::FORMAT_DXT4: + // return D3DFMT_DXT4; + case rf::bm::FORMAT_DXT5: + return D3DFMT_DXT5; + default: + xlog::warn("unknown BM format {}", static_cast(format)); + return D3DFMT_UNKNOWN; } } inline rf::bm::Format get_bm_format_from_d3d_format(D3DFORMAT d3d_fmt) { switch (d3d_fmt) { - case D3DFMT_R5G6B5: - return rf::bm::FORMAT_565_RGB; - case D3DFMT_X1R5G5B5: - case D3DFMT_A1R5G5B5: - return rf::bm::FORMAT_1555_ARGB; - case D3DFMT_A4R4G4B4: - case D3DFMT_X4R4G4B4: - return rf::bm::FORMAT_4444_ARGB; - case D3DFMT_R8G8B8: - return rf::bm::FORMAT_888_RGB; - case D3DFMT_A8R8G8B8: - case D3DFMT_X8R8G8B8: - return rf::bm::FORMAT_8888_ARGB; - case D3DFMT_A8: - return rf::bm::FORMAT_8_ALPHA; - case D3DFMT_DXT1: - return rf::bm::FORMAT_DXT1; - // case D3DFMT_DXT2: - // return rf::bm::FORMAT_DXT2; - case D3DFMT_DXT3: - return rf::bm::FORMAT_DXT3; - // case D3DFMT_DXT4: - // return rf::bm::FORMAT_DXT4; - case D3DFMT_DXT5: - return rf::bm::FORMAT_DXT5; - default: - xlog::error("unknown D3D format 0x{:x}", static_cast(d3d_fmt)); - return rf::bm::FORMAT_NONE; + case D3DFMT_R5G6B5: + return rf::bm::FORMAT_565_RGB; + case D3DFMT_X1R5G5B5: + case D3DFMT_A1R5G5B5: + return rf::bm::FORMAT_1555_ARGB; + case D3DFMT_A4R4G4B4: + case D3DFMT_X4R4G4B4: + return rf::bm::FORMAT_4444_ARGB; + case D3DFMT_R8G8B8: + return rf::bm::FORMAT_888_RGB; + case D3DFMT_A8R8G8B8: + case D3DFMT_X8R8G8B8: + return rf::bm::FORMAT_8888_ARGB; + case D3DFMT_A8: + return rf::bm::FORMAT_8_ALPHA; + case D3DFMT_DXT1: + return rf::bm::FORMAT_DXT1; + // case D3DFMT_DXT2: + // return rf::bm::FORMAT_DXT2; + case D3DFMT_DXT3: + return rf::bm::FORMAT_DXT3; + // case D3DFMT_DXT4: + // return rf::bm::FORMAT_DXT4; + case D3DFMT_DXT5: + return rf::bm::FORMAT_DXT5; + default: + xlog::error("unknown D3D format 0x{:x}", static_cast(d3d_fmt)); + return rf::bm::FORMAT_NONE; } } diff --git a/game_patch/graphics/legacy/gr_d3d_texture.cpp b/game_patch/graphics/legacy/gr_d3d_texture.cpp index f664584bf..bfe3009e2 100644 --- a/game_patch/graphics/legacy/gr_d3d_texture.cpp +++ b/game_patch/graphics/legacy/gr_d3d_texture.cpp @@ -33,8 +33,9 @@ class D3DTextureFormatSelector D3DFORMAT find_best_format(D3DFORMAT (&&allowed)[N]) { for (auto d3d_fmt : allowed) { - auto hr = rf::gr::d3d::d3d->CheckDeviceFormat(rf::gr::d3d::adapter_idx, D3DDEVTYPE_HAL, rf::gr::d3d::pp.BackBufferFormat, 0, - D3DRTYPE_TEXTURE, d3d_fmt); + auto hr = rf::gr::d3d::d3d->CheckDeviceFormat( + rf::gr::d3d::adapter_idx, D3DDEVTYPE_HAL, rf::gr::d3d::pp.BackBufferFormat, 0, D3DRTYPE_TEXTURE, d3d_fmt + ); if (SUCCEEDED(hr)) { return d3d_fmt; } @@ -95,11 +96,12 @@ class D3DTextureFormatSelector D3DTextureFormatSelector g_texture_format_selector; using GrD3DSetTextureData_Type = - int(int, const std::byte*, const uint8_t*, int, int, rf::bm::Format, rf::gr::d3d::TextureSection*, int, int, IDirect3DTexture8*); + int(int, const std::byte*, const uint8_t*, int, int, rf::bm::Format, rf::gr::d3d::TextureSection*, int, int, + IDirect3DTexture8*); FunHook gr_d3d_set_texture_data_hook{ 0x0055BA10, - [](int level, const std::byte* src_bits_ptr, const uint8_t* palette, int bm_w, int bm_h, - rf::bm::Format format, rf::gr::d3d::TextureSection* section, int tex_w, int tex_h, IDirect3DTexture8* texture) { + [](int level, const std::byte* src_bits_ptr, const uint8_t* palette, int bm_w, int bm_h, rf::bm::Format format, + rf::gr::d3d::TextureSection* section, int tex_w, int tex_h, IDirect3DTexture8* texture) { xlog::trace("gr_d3d_set_texture_data_hook"); D3DSURFACE_DESC desc; @@ -112,8 +114,9 @@ FunHook gr_d3d_set_texture_data_hook{ auto tex_pixel_fmt = get_bm_format_from_d3d_format(desc.Format); if (!bm_is_compressed_format(tex_pixel_fmt) && bm_bytes_per_pixel(tex_pixel_fmt) == 2) { // original code can handle only 16 bit surfaces - return gr_d3d_set_texture_data_hook.call_target(level, src_bits_ptr, palette, bm_w, bm_h, format, section, - tex_w, tex_h, texture); + return gr_d3d_set_texture_data_hook.call_target( + level, src_bits_ptr, palette, bm_w, bm_h, format, section, tex_w, tex_h, texture + ); } D3DLOCKED_RECT locked_rect; @@ -125,8 +128,10 @@ FunHook gr_d3d_set_texture_data_hook{ bool success = true; if (bm_is_compressed_format(format)) { - xlog::trace("Writing texture in compressed format level {} src {} bm {}x{} tex {}x{} section {} {}", - level, src_bits_ptr, bm_w, bm_h, tex_w, tex_h, section->x, section->y); + xlog::trace( + "Writing texture in compressed format level {} src {} bm {}x{} tex {}x{} section {} {}", level, + src_bits_ptr, bm_w, bm_h, tex_w, tex_h, section->x, section->y + ); auto src_pitch = bm_calculate_pitch(bm_w, format); auto num_src_rows = bm_calculate_rows(bm_h, format); @@ -147,11 +152,14 @@ FunHook gr_d3d_set_texture_data_hook{ } else { auto bm_pitch = bm_bytes_per_pixel(format) * bm_w; - success = bm_convert_format(locked_rect.pBits, tex_pixel_fmt, - src_bits_ptr, format, bm_w, bm_h, locked_rect.Pitch, - bm_pitch, palette); + success = bm_convert_format( + locked_rect.pBits, tex_pixel_fmt, src_bits_ptr, format, bm_w, bm_h, locked_rect.Pitch, bm_pitch, palette + ); if (!success) - xlog::warn("Color conversion failed (format {} -> {})", static_cast(format), static_cast(tex_pixel_fmt)); + xlog::warn( + "Color conversion failed (format {} -> {})", static_cast(format), + static_cast(tex_pixel_fmt) + ); } texture->UnlockRect(level); @@ -187,7 +195,10 @@ FunHook gr_d3d_create_v } } - xlog::trace("Creating texture bm_format 0x{:x} d3d_format 0x{:x}", static_cast(format), static_cast(d3d_format)); + xlog::trace( + "Creating texture bm_format 0x{:x} d3d_format 0x{:x}", static_cast(format), + static_cast(d3d_format) + ); auto hr = rf::gr::d3d::device->CreateTexture(width, height, levels, usage, d3d_format, d3d_pool, texture_out); if (FAILED(hr)) { xlog::error("Failed to create texture {}x{} in format {}", width, height, static_cast(d3d_format)); @@ -237,7 +248,6 @@ FunHook gr_d3d_get_texel_hook{ int y = std::lround(v * lock.h); *out_color = bm_get_pixel(lock.data, lock.format, lock.stride_in_bytes, x, y); - rf::gr::unlock(&lock); } else { @@ -248,7 +258,8 @@ FunHook gr_d3d_get_texel_hook{ extern FunHook gr_d3d_create_texture_hook; -int gr_d3d_create_texture(int bm_handle, rf::gr::d3d::Texture& tslot) { +int gr_d3d_create_texture(int bm_handle, rf::gr::d3d::Texture& tslot) +{ g_currently_creating_texture_for_bitmap = bm_handle; auto result = gr_d3d_create_texture_hook.call_target(bm_handle, tslot); g_currently_creating_texture_for_bitmap = -1; @@ -282,7 +293,8 @@ FunHook gr_d3d_free_texture_hook{ }, }; -bool gr_d3d_lock(int bm_handle, int section, rf::gr::LockInfo *lock) { +bool gr_d3d_lock(int bm_handle, int section, rf::gr::LockInfo* lock) +{ xlog::trace("gr_d3d_lock"); auto& tslot = rf::gr::d3d::textures[rf::bm::get_cache_slot(bm_handle)]; if (tslot.num_sections < 1 || tslot.bm_handle != bm_handle) { @@ -324,7 +336,7 @@ bool gr_d3d_lock(int bm_handle, int section, rf::gr::LockInfo *lock) { return true; } -static FunHook gr_d3d_lock_hook{0x0055CE00, gr_d3d_lock}; +static FunHook gr_d3d_lock_hook{0x0055CE00, gr_d3d_lock}; // FunHook gr_d3d_set_state_and_texture_hook{ // 0x00550850, @@ -349,8 +361,9 @@ bool gr_d3d_is_texture_format_supported(rf::bm::Format format) return false; } - HRESULT hr = rf::gr::d3d::d3d->CheckDeviceFormat(rf::gr::d3d::adapter_idx, D3DDEVTYPE_HAL, - rf::gr::d3d::pp.BackBufferFormat, 0, D3DRTYPE_TEXTURE, d3d_fmt); + HRESULT hr = rf::gr::d3d::d3d->CheckDeviceFormat( + rf::gr::d3d::adapter_idx, D3DDEVTYPE_HAL, rf::gr::d3d::pp.BackBufferFormat, 0, D3DRTYPE_TEXTURE, d3d_fmt + ); return SUCCEEDED(hr); } @@ -373,7 +386,7 @@ void gr_d3d_texture_apply_patch() gr_d3d_get_texel_hook.install(); gr_d3d_create_texture_hook.install(); gr_d3d_free_texture_hook.install(); - //gr_d3d_set_state_and_texture_hook.install(); + // gr_d3d_set_state_and_texture_hook.install(); gr_d3d_lock_hook.install(); gr_d3d_mark_texture_dirty_hook.install(); diff --git a/game_patch/hud/hud.cpp b/game_patch/hud/hud.cpp index 68dfef8c7..a258ad710 100644 --- a/game_patch/hud/hud.cpp +++ b/game_patch/hud/hud.cpp @@ -62,7 +62,6 @@ FunHook hud_render_for_multi_hook{ ConsoleCommand2 hud_cmd{ "hud", [](std::optional hud_opt) { - // toggle if no parameter passed bool hud_visible = hud_opt.value_or(rf::hud_disabled); rf::hud_disabled = !hud_visible; @@ -78,22 +77,22 @@ void hud_setup_positions(int width) xlog::trace("hud_setup_positionsHook({})", width); switch (width) { - case 640: - if (height == 480) - pos_data = rf::hud_coords_640; - break; - case 800: - if (height == 600) - pos_data = rf::hud_coords_800; - break; - case 1024: - if (height == 768) - pos_data = rf::hud_coords_1024; - break; - case 1280: - if (height == 1024) - pos_data = rf::hud_coords_1280; - break; + case 640: + if (height == 480) + pos_data = rf::hud_coords_640; + break; + case 800: + if (height == 600) + pos_data = rf::hud_coords_800; + break; + case 1024: + if (height == 768) + pos_data = rf::hud_coords_1024; + break; + case 1280: + if (height == 1024) + pos_data = rf::hud_coords_1280; + break; } if (pos_data) { std::copy(pos_data, pos_data + rf::num_hud_coords, rf::hud_coords); @@ -149,7 +148,7 @@ void set_big_hud(bool is_big) set_big_countdown_counter(is_big); // TODO: Message Log - Note: it remembers text height in save files so method of recalculation is needed - //write_mem(0x004553DB + 1, is_big ? 127 : 70); + // write_mem(0x004553DB + 1, is_big ? 127 : 70); } ConsoleCommand2 bighud_cmd{ @@ -181,7 +180,8 @@ ConsoleCommand2 hud_coords_cmd{ }; #endif -struct ScaledBitmapInfo { +struct ScaledBitmapInfo +{ int bmh = -1; float scale = 2.0f; }; @@ -220,7 +220,6 @@ const ScaledBitmapInfo& hud_get_scaled_bitmap_info(int bmh) int scaled_bm_w, scaled_bm_h; rf::bm::get_dimensions(scaled_bm_info.bmh, &scaled_bm_w, &scaled_bm_h); scaled_bm_info.scale = static_cast(scaled_bm_w) / static_cast(bm_w); - } it = scaled_bm_cache.insert({bmh, scaled_bm_info}).first; @@ -375,7 +374,7 @@ FunHook hud_init_hook{ CallHook hud_msg_render_gr_get_font_height_hook{ 0x004382DB, - []([[ maybe_unused ]] int font_no) { + []([[maybe_unused]] int font_no) { // Fix wrong font number being used causing line spacing to be invalid return rf::gr::get_font_height(rf::hud_text_font_num); }, diff --git a/game_patch/hud/hud_personas.cpp b/game_patch/hud/hud_personas.cpp index 5cf301836..45706e1c3 100644 --- a/game_patch/hud/hud_personas.cpp +++ b/game_patch/hud/hud_personas.cpp @@ -21,10 +21,8 @@ static bool hud_personas_is_bottom(rf::Entity* ep) if (!parent) { return false; } - return rf::entity_is_sub(parent) || - rf::entity_is_driller(parent) || - rf::entity_is_jeep(parent) || - rf::entity_is_fighter(parent); + return rf::entity_is_sub(parent) || rf::entity_is_driller(parent) || rf::entity_is_jeep(parent) || + rf::entity_is_fighter(parent); } void hud_personas_render(rf::Player* player) @@ -34,14 +32,20 @@ void hud_personas_render(rf::Player* player) rf::hud_persona_current_idx = 0; rf::hud_personas_info[rf::hud_persona_current_idx].image_bmh = rf::bm::load(rf::hud_personas_info[rf::hud_persona_current_idx].image.c_str(), -1, false); - std::strcpy(rf::hud_personas_info[rf::hud_persona_current_idx].message, "Test message! Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat."); + std::strcpy( + rf::hud_personas_info[rf::hud_persona_current_idx].message, + "Test message! Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut " + "labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut " + "aliquip ex ea commodo consequat." + ); #endif if (rf::hud_persona_alpha <= rf::hud_persona_target_alpha) { rf::hud_persona_alpha = rf::hud_persona_target_alpha; } else { - rf::hud_persona_alpha = std::max(rf::hud_persona_alpha - rf::frametime * 1.3333334f, rf::hud_persona_target_alpha); + rf::hud_persona_alpha = + std::max(rf::hud_persona_alpha - rf::frametime * 1.3333334f, rf::hud_persona_target_alpha); } if (rf::hud_persona_alpha <= 0.0) { rf::hud_persona_current_idx = -1; @@ -82,9 +86,9 @@ void hud_personas_render(rf::Player* player) // border rf::gr::set_color(255, 255, 255, static_cast(rf::hud_persona_alpha * 77.0f)); - rf::gr::rect(box_x, box_y, box_border, box_h); // left - rf::gr::rect(box_x + box_w - box_border, box_y, box_border, box_h); // right - rf::gr::rect(box_x + box_border, box_y, content_w, box_border); // top + rf::gr::rect(box_x, box_y, box_border, box_h); // left + rf::gr::rect(box_x + box_w - box_border, box_y, box_border, box_h); // right + rf::gr::rect(box_x + box_border, box_y, content_w, box_border); // top rf::gr::rect(box_x + box_border, box_y + box_h - box_border, content_w, box_border); // bottom // background @@ -103,12 +107,12 @@ void hud_personas_render(rf::Player* player) rf::gr::rect(img_box_x, img_box_y, img_w + 2 * img_border, img_h + 2 * img_border); // persona image (64x64) - //rf::gr::set_color(hud_default_color); - //rf::gr::set_alpha(static_cast(hud_default_color.alpha * hud_persona_alpha)); + // rf::gr::set_color(hud_default_color); + // rf::gr::set_alpha(static_cast(hud_default_color.alpha * hud_persona_alpha)); rf::gr::set_color(255, 255, 255, static_cast(rf::hud_default_color.alpha * rf::hud_persona_alpha)); - int img_x = img_box_x + img_border; // 161 - int img_y = img_box_y + img_border; // 14 - hud_scaled_bitmap(hud_persona.image_handle, img_x, img_y, img_scale);// hud_persona_image_gr_mode + int img_x = img_box_x + img_border; // 161 + int img_y = img_box_y + img_border; // 14 + hud_scaled_bitmap(hud_persona.image_handle, img_x, img_y, img_scale); // hud_persona_image_gr_mode // persona name rf::gr::set_color(rf::hud_msg_color); @@ -133,8 +137,8 @@ void hud_personas_render(rf::Player* player) constexpr int max_lines = 8; int len_array[max_lines]; int offset_array[max_lines]; - int num_lines = rf::gr::split_str(len_array, offset_array, hud_persona.message, - max_text_w, max_lines, 0, hud_persona_font); + int num_lines = + rf::gr::split_str(len_array, offset_array, hud_persona.message, max_text_w, max_lines, 0, hud_persona_font); rf::gr::set_color(rf::hud_default_color); rf::gr::set_alpha(static_cast(rf::hud_default_color.alpha * rf::hud_persona_alpha)); for (int i = 0; i < num_lines; ++i) { diff --git a/game_patch/hud/hud_status.cpp b/game_patch/hud/hud_status.cpp index 7e9e85340..b154c0e38 100644 --- a/game_patch/hud/hud_status.cpp +++ b/game_patch/hud/hud_status.cpp @@ -14,7 +14,7 @@ bool g_big_health_armor_hud = false; FunHook hud_status_render_hook{ 0x00439D80, - [](rf::Player *player) { + [](rf::Player* player) { if (!g_big_health_armor_hud) { hud_status_render_hook.call_target(player); return; @@ -52,12 +52,14 @@ FunHook hud_status_render_hook{ rf::gr::set_color(255, 255, 255, 120); auto [driller_x, driller_y] = hud_scale_coords(rf::hud_coords[rf::hud_driller], scale); hud_scaled_bitmap(rf::hud_health_driller_bmh, driller_x, driller_y, scale); - auto [driller_frame_x, driller_frame_y] = hud_scale_coords(rf::hud_coords[rf::hud_driller_frame], scale); + auto [driller_frame_x, driller_frame_y] = + hud_scale_coords(rf::hud_coords[rf::hud_driller_frame], scale); hud_scaled_bitmap(rf::hud_health_veh_frame_bmh, driller_frame_x, driller_frame_y, scale); auto veh_life = std::max(static_cast(vehicle->life), 1); auto veh_life_str = std::to_string(veh_life); rf::gr::set_color(rf::hud_full_color); - auto [driller_value_x, driller_value_y] = hud_scale_coords(rf::hud_coords[rf::hud_driller_value], scale); + auto [driller_value_x, driller_value_y] = + hud_scale_coords(rf::hud_coords[rf::hud_driller_value], scale); rf::gr::string(driller_value_x, driller_value_y, veh_life_str.c_str(), font_id); } } @@ -78,15 +80,20 @@ FunHook hud_status_render_hook{ auto health_str = std::to_string(health); int text_w, text_h; rf::gr::get_string_size(&text_w, &text_h, health_str.c_str(), -1, font_id); - auto [health_value_x, health_value_y] = hud_scale_coords(rf::hud_coords[rf::hud_health_value_ul_corner], scale); + auto [health_value_x, health_value_y] = + hud_scale_coords(rf::hud_coords[rf::hud_health_value_ul_corner], scale); auto health_value_w = hud_scale_coords(rf::hud_coords[rf::hud_health_value_width_and_height], scale).x; rf::gr::string(health_value_x + (health_value_w - text_w) / 2, health_value_y, health_str.c_str(), font_id); rf::gr::set_color(rf::hud_mid_color); auto armor_str = std::to_string(static_cast(entity->armor)); rf::gr::get_string_size(&text_w, &text_h, armor_str.c_str(), -1, font_id); - auto [envirosuit_value_x, envirosuit_value_y] = hud_scale_coords(rf::hud_coords[rf::hud_envirosuit_value_ul_corner], scale); - auto envirosuit_value_w = hud_scale_coords(rf::hud_coords[rf::hud_envirosuit_value_width_and_height], scale).x; - rf::gr::string(envirosuit_value_x + (envirosuit_value_w - text_w) / 2, envirosuit_value_y, armor_str.c_str(), font_id); + auto [envirosuit_value_x, envirosuit_value_y] = + hud_scale_coords(rf::hud_coords[rf::hud_envirosuit_value_ul_corner], scale); + auto envirosuit_value_w = + hud_scale_coords(rf::hud_coords[rf::hud_envirosuit_value_width_and_height], scale).x; + rf::gr::string( + envirosuit_value_x + (envirosuit_value_w - text_w) / 2, envirosuit_value_y, armor_str.c_str(), font_id + ); rf::hud_draw_damage_indicators(player); diff --git a/game_patch/hud/hud_weapons.cpp b/game_patch/hud/hud_weapons.cpp index 45029967c..0485a94a0 100644 --- a/game_patch/hud/hud_weapons.cpp +++ b/game_patch/hud/hud_weapons.cpp @@ -28,9 +28,7 @@ CallHook hud_render_ammo_gr_bitmap_hook{ 0x0043AEC3u, 0x0043AF0Au, }, - [](int bm_handle, int x, int y, rf::gr::Mode mode) { - hud_scaled_bitmap(bm_handle, x, y, g_hud_ammo_scale, mode); - }, + [](int bm_handle, int x, int y, rf::gr::Mode mode) { hud_scaled_bitmap(bm_handle, x, y, g_hud_ammo_scale, mode); }, }; CallHook render_reticle_gr_bitmap_hook{ @@ -53,7 +51,7 @@ CallHook render_reticle_gr_bitmap_hook{ FunHook hud_render_ammo_hook{ 0x0043A510, - [](rf::Entity *entity, int weapon_type, int offset_y, bool is_inactive) { + [](rf::Entity* entity, int weapon_type, int offset_y, bool is_inactive) { offset_y = static_cast(offset_y * g_hud_ammo_scale); hud_render_ammo_hook.call_target(entity, weapon_type, offset_y, is_inactive); }, diff --git a/game_patch/hud/message_log.cpp b/game_patch/hud/message_log.cpp index 4540b2776..113f2d852 100644 --- a/game_patch/hud/message_log.cpp +++ b/game_patch/hud/message_log.cpp @@ -34,14 +34,18 @@ CodeInjection message_log_init_injection{ }, }; -CallHook message_log_render_gr_bitmap_stretched_hook{ - 0x004551F0, - [](int bm_handle, int x, int y, int w, int h, int sx, int sy, int sw, int sh, bool flip_x, bool flip_y, rf::gr::Mode mode) { - w = static_cast(sw * message_log_scale_x); - h = static_cast(sh * message_log_scale_y); - message_log_render_gr_bitmap_stretched_hook.call_target(bm_handle, x, y, w, h, sx, sy, sw, sh, flip_x, flip_y, mode); - }, -}; +CallHook + message_log_render_gr_bitmap_stretched_hook{ + 0x004551F0, + [](int bm_handle, int x, int y, int w, int h, int sx, int sy, int sw, int sh, bool flip_x, bool flip_y, + rf::gr::Mode mode) { + w = static_cast(sw * message_log_scale_x); + h = static_cast(sh * message_log_scale_y); + message_log_render_gr_bitmap_stretched_hook.call_target( + bm_handle, x, y, w, h, sx, sy, sw, sh, flip_x, flip_y, mode + ); + }, + }; void message_log_apply_patch() { diff --git a/game_patch/hud/multi_hud.cpp b/game_patch/hud/multi_hud.cpp index 27fc9e833..576c21902 100644 --- a/game_patch/hud/multi_hud.cpp +++ b/game_patch/hud/multi_hud.cpp @@ -32,14 +32,14 @@ void hud_render_team_scores() int box_w = g_big_team_scores_hud ? 370 : 185; int box_h = g_big_team_scores_hud ? 80 : 55; int box_x = 10; - int box_y = clip_h - box_h - 10; // clip_h - 65 - int miniflag_x = box_x + 7; // 17 + int box_y = clip_h - box_h - 10; // clip_h - 65 + int miniflag_x = box_x + 7; // 17 int miniflag_label_x = box_x + (g_big_team_scores_hud ? 45 : 33); // 43 int max_miniflag_label_w = box_w - (g_big_team_scores_hud ? 80 : 55); - int red_miniflag_y = box_y + 4; // clip_h - 61 + int red_miniflag_y = box_y + 4; // clip_h - 61 int blue_miniflag_y = box_y + (g_big_team_scores_hud ? 42 : 30); // clip_h - 35 - int red_miniflag_label_y = red_miniflag_y + 4; // clip_h - 57 - int blue_miniflag_label_y = blue_miniflag_y + 4; // clip_h - 31 + int red_miniflag_label_y = red_miniflag_y + 4; // clip_h - 57 + int blue_miniflag_label_y = blue_miniflag_y + 4; // clip_h - 31 int flag_x = g_big_team_scores_hud ? 410 : 205; float flag_scale = g_big_team_scores_hud ? 1.5f : 1.0f; @@ -114,7 +114,9 @@ void hud_render_team_scores() else { miniflag_hilight_y = blue_miniflag_y; } - hud_scaled_bitmap(rf::hud_miniflag_hilight_bmh, miniflag_x, miniflag_hilight_y, miniflag_scale, rf::hud_flag_gr_mode); + hud_scaled_bitmap( + rf::hud_miniflag_hilight_bmh, miniflag_x, miniflag_hilight_y, miniflag_scale, rf::hud_flag_gr_mode + ); } hud_scaled_bitmap(rf::hud_miniflag_red_bmh, miniflag_x, red_miniflag_y, miniflag_scale, rf::hud_flag_gr_mode); hud_scaled_bitmap(rf::hud_miniflag_blue_bmh, miniflag_x, blue_miniflag_y, miniflag_scale, rf::hud_flag_gr_mode); @@ -164,11 +166,7 @@ CallHook hud_render_power_ups_gr_bitmap_hook{ FunHook render_level_info_hook{ 0x00477180, - []() { - gr_font_run_with_default(hud_get_default_font(), [&]() { - render_level_info_hook.call_target(); - }); - }, + []() { gr_font_run_with_default(hud_get_default_font(), [&]() { render_level_info_hook.call_target(); }); }, }; FunHook multi_hud_init_hook{ diff --git a/game_patch/hud/multi_hud_chat.cpp b/game_patch/hud/multi_hud_chat.cpp index 91736b7cd..7494b2a85 100644 --- a/game_patch/hud/multi_hud_chat.cpp +++ b/game_patch/hud/multi_hud_chat.cpp @@ -17,7 +17,7 @@ bool g_all_players_muted = false; constexpr int chat_msg_max_len = 224; constexpr int chatbox_border_alpha = 0x30; // default is 77 -constexpr int chatbox_bg_alpha = 0x40; // default is 128 +constexpr int chatbox_bg_alpha = 0x40; // default is 128 FunHook multi_chat_say_add_char_hook{ 0x00444740, @@ -116,9 +116,7 @@ FunHook multi_hud_render_chat_hook{0x004773D0, multi_hud_render_chat}; CodeInjection multi_hud_add_chat_line_max_width_injection{ 0x004788E3, - [](auto& regs) { - regs.esi = rf::gr::screen_width() - (g_big_chatbox ? 620 : 320); - }, + [](auto& regs) { regs.esi = rf::gr::screen_width() - (g_big_chatbox ? 620 : 320); }, }; void multi_hud_render_chat_inputbox(rf::String::Pod label_pod, rf::String::Pod msg_pod) @@ -141,7 +139,7 @@ void multi_hud_render_chat_inputbox(rf::String::Pod label_pod, rf::String::Pod m int input_box_content_h = font_h + 3; int input_box_h = input_box_content_h + 2 * border; int input_box_y = hist_box_y + hist_box_h; // 116 - int input_box_x = (clip_w - box_w) / 2; // 157 + int input_box_x = (clip_w - box_w) / 2; // 157 rf::String msg_shortened{msg}; int msg_w, msg_h; @@ -187,9 +185,11 @@ void multi_hud_render_chat_inputbox(rf::String::Pod label_pod, rf::String::Pod m } } -FunHook multi_hud_render_chat_inputbox_hook{0x00478CA0, multi_hud_render_chat_inputbox}; +FunHook multi_hud_render_chat_inputbox_hook{ + 0x00478CA0, multi_hud_render_chat_inputbox +}; -static bool is_muted_player(rf::Player *pp) +static bool is_muted_player(rf::Player* pp) { if (g_all_players_muted) { return true; @@ -206,7 +206,7 @@ CodeInjection process_chat_line_packet_injection{ int mode = regs.edx; if (is_muted_player(pp)) { // Messages from muted players only show up in the console - const char *team_str = mode == 1 ? rf::strings::team : ""; + const char* team_str = mode == 1 ? rf::strings::team : ""; rf::console::print("{}{} (MUTED): {}", pp->name, team_str, message); regs.eip = 0x00444958; } diff --git a/game_patch/hud/multi_scoreboard.cpp b/game_patch/hud/multi_scoreboard.cpp index 86cff2a01..e87a05bea 100644 --- a/game_patch/hud/multi_scoreboard.cpp +++ b/game_patch/hud/multi_scoreboard.cpp @@ -20,8 +20,8 @@ namespace rf { -static auto& draw_scoreboard = addr_as_ref(0x00470860); -static auto& fit_scoreboard_string = addr_as_ref(0x00471EC0); + static auto& draw_scoreboard = addr_as_ref(0x00470860); + static auto& fit_scoreboard_string = addr_as_ref(0x00471EC0); } constexpr float ENTER_ANIM_MS = 100.0f; @@ -107,10 +107,14 @@ int draw_scoreboard_header(int x, int y, int w, rf::NetGameType game_type, bool rf::gr::set_color(0xD0, 0x20, 0x20, 0xFF); int team_scores_font = rf::scoreboard_big_font; auto red_score_str = std::to_string(red_score); - rf::gr::string_aligned(rf::gr::ALIGN_CENTER, x + w * 1 / 6, cur_y + 10, red_score_str.c_str(), team_scores_font); + rf::gr::string_aligned( + rf::gr::ALIGN_CENTER, x + w * 1 / 6, cur_y + 10, red_score_str.c_str(), team_scores_font + ); rf::gr::set_color(0x20, 0x20, 0xD0, 0xFF); auto blue_score_str = std::to_string(blue_score); - rf::gr::string_aligned(rf::gr::ALIGN_CENTER, x + w * 5 / 6, cur_y + 10, blue_score_str.c_str(), team_scores_font); + rf::gr::string_aligned( + rf::gr::ALIGN_CENTER, x + w * 5 / 6, cur_y + 10, blue_score_str.c_str(), team_scores_font + ); } cur_y += 60; @@ -119,8 +123,10 @@ int draw_scoreboard_header(int x, int y, int w, rf::NetGameType game_type, bool return cur_y - y; } -int draw_scoreboard_players(const std::vector& players, int x, int y, int w, float scale, - rf::NetGameType game_type, bool dry_run = false) +int draw_scoreboard_players( + const std::vector& players, int x, int y, int w, float scale, rf::NetGameType game_type, + bool dry_run = false +) { int initial_y = y; int font_h = rf::gr::get_font_height(-1); @@ -179,7 +185,9 @@ int draw_scoreboard_players(const std::vector& players, int x, int hud_scaled_bitmap(status_bm, status_x, static_cast(y + 2 * scale), scale); rf::String player_name_stripped; - rf::fit_scoreboard_string(&player_name_stripped, player->name, name_w - static_cast(12 * scale)); // Note: this destroys Name + rf::fit_scoreboard_string( + &player_name_stripped, player->name, name_w - static_cast(12 * scale) + ); // Note: this destroys Name rf::gr::string(name_x, y, player_name_stripped); #if DEBUG_SCOREBOARD @@ -328,7 +336,9 @@ void draw_scoreboard_internal_new(bool draw) if (group_by_team) { int table_w = (w - left_padding - middle_padding - right_padding) / 2; draw_scoreboard_players(left_players, x + left_padding, y, table_w, scale, game_type); - draw_scoreboard_players(right_players, x + left_padding + table_w + middle_padding, y, table_w, scale, game_type); + draw_scoreboard_players( + right_players, x + left_padding + table_w + middle_padding, y, table_w, scale, game_type + ); } else { int table_w = w - left_padding - right_padding; diff --git a/game_patch/hud/multi_spectate.cpp b/game_patch/hud/multi_spectate.cpp index e5699547e..44d354721 100644 --- a/game_patch/hud/multi_spectate.cpp +++ b/game_patch/hud/multi_spectate.cpp @@ -442,7 +442,10 @@ void multi_spectate_render() rf::gr::set_color(0xFF, 0xFF, 0xFF, 0xFF); rf::gr::string_aligned(rf::gr::ALIGN_CENTER, bar_x + bar_w / 2, bar_y + padding_y, "Spectating:", small_font); rf::gr::set_color(0xFF, 0x88, 0x22, 0xFF); - rf::gr::string_aligned(rf::gr::ALIGN_CENTER, bar_x + bar_w / 2, bar_y + padding_y + small_font_h, g_spectate_mode_target->name, large_font); + rf::gr::string_aligned( + rf::gr::ALIGN_CENTER, bar_x + bar_w / 2, bar_y + padding_y + small_font_h, g_spectate_mode_target->name, + large_font + ); rf::Entity* entity = rf::entity_from_handle(g_spectate_mode_target->entity_handle); if (!entity) { @@ -450,8 +453,10 @@ void multi_spectate_render() static int blood_bm = rf::bm::load("bloodsmear07_A.tga", -1, true); int blood_w, blood_h; rf::bm::get_dimensions(blood_bm, &blood_w, &blood_h); - rf::gr::bitmap_scaled(blood_bm, (scr_w - blood_w * 2) / 2, (scr_h - blood_h * 2) / 2, blood_w * 2, - blood_h * 2, 0, 0, blood_w, blood_h, false, false, rf::gr::bitmap_clamp_mode); + rf::gr::bitmap_scaled( + blood_bm, (scr_w - blood_w * 2) / 2, (scr_h - blood_h * 2) / 2, blood_w * 2, blood_h * 2, 0, 0, blood_w, + blood_h, false, false, rf::gr::bitmap_clamp_mode + ); rf::Color dead_clr{0xF0, 0x20, 0x10, 0xC0}; draw_with_shadow(scr_w / 2, scr_h / 2, 2, 2, dead_clr, shadow_clr, [=](int x, int y) { diff --git a/game_patch/hud/weapon_select.cpp b/game_patch/hud/weapon_select.cpp index fdf5bf8ac..7aa53b0ad 100644 --- a/game_patch/hud/weapon_select.cpp +++ b/game_patch/hud/weapon_select.cpp @@ -31,20 +31,20 @@ void weapon_select_render() auto& selected_cycle_entry = rf::hud_weapon_cycle[rf::hud_weapon_cycle_current_idx]; const char* weapon_type_name = nullptr; switch (selected_cycle_entry.category) { - case 0: - weapon_type_name = rf::strings::close_combat; - break; - case 1: - weapon_type_name = rf::strings::semi_auto; - break; - case 2: - weapon_type_name = rf::strings::heavy; - break; - case 3: - weapon_type_name = rf::strings::explosive; - break; - default: - break; + case 0: + weapon_type_name = rf::strings::close_combat; + break; + case 1: + weapon_type_name = rf::strings::semi_auto; + break; + case 2: + weapon_type_name = rf::strings::heavy; + break; + case 3: + weapon_type_name = rf::strings::explosive; + break; + default: + break; } int weapon_type_y = weapon_select_big_mode ? 210 : 113; int center_x = clip_w - (weapon_select_big_mode ? 148 : 74); @@ -55,9 +55,9 @@ void weapon_select_render() int sq_bg_size = weapon_select_big_mode ? 30 : 20; int border = 1; int sq_spacing = 1; - int sq_x_delta = sq_bg_size + 2 * border + sq_spacing; // 23 + int sq_x_delta = sq_bg_size + 2 * border + sq_spacing; // 23 int type_sq_y = weapon_type_y + (weapon_select_big_mode ? 24 : 14); // 127 - int type_sq_start_x = center_x - 2 * sq_x_delta; // w - 120 + int type_sq_start_x = center_x - 2 * sq_x_delta; // w - 120 int text_offset_x = sq_bg_size / 2; int text_offset_y = 5; @@ -82,12 +82,12 @@ void weapon_select_render() hud_rect_border(active_sq_x, type_sq_y, sq_with_border_size, sq_with_border_size, border); int num_ind_start_y = type_sq_y + sq_bg_size + 2 * border + sq_spacing + 1; // 150 - int weapon_icons_start_y = num_ind_start_y + 26; // 176 + int weapon_icons_start_y = num_ind_start_y + 26; // 176 float weapon_icon_scale = weapon_select_big_mode ? 1.5f : 1.0f; int weapon_icon_w = static_cast(128 * weapon_icon_scale); int weapon_icon_h = static_cast(34 * weapon_icon_scale); int weapon_icons_x = center_x - weapon_icon_w / 2; // clip_w - 139 - int weapon_icon_delta_y = weapon_icon_h + 1; // 35 + int weapon_icon_delta_y = weapon_icon_h + 1; // 35 int num_drawn_weapons_per_category[4] = {0}; rf::AiInfo* ai_info = rf::player_get_ai(rf::local_player); @@ -98,7 +98,7 @@ void weapon_select_render() cycle_entry = &entry; } } - if (!cycle_entry || cycle_entry->weapon_type == -1 || cycle_entry->category == -1) { + if (!cycle_entry || cycle_entry->weapon_type == -1 || cycle_entry->category == -1) { continue; } if (!rf::ai_has_weapon(ai_info, cycle_entry->weapon_type)) { diff --git a/game_patch/input/key.cpp b/game_patch/input/key.cpp index 87075a6c7..90e4de236 100644 --- a/game_patch/input/key.cpp +++ b/game_patch/input/key.cpp @@ -17,25 +17,40 @@ FunHook key_to_ascii_hook{ // special handling for Num Lock (because ToAscii API does not support it) switch (key & KEY_MASK) { // Numpad keys that always work - case KEY_PADMULTIPLY: return static_cast('*'); - case KEY_PADMINUS: return static_cast('-'); - case KEY_PADPLUS: return static_cast('+'); + case KEY_PADMULTIPLY: + return static_cast('*'); + case KEY_PADMINUS: + return static_cast('-'); + case KEY_PADPLUS: + return static_cast('+'); // Disable Numpad Enter key because game is not prepared for getting new line character from this function - case KEY_PADENTER: return empty_result; + case KEY_PADENTER: + return empty_result; } if (GetKeyState(VK_NUMLOCK) & 1) { switch (key & KEY_MASK) { - case KEY_PAD7: return static_cast('7'); - case KEY_PAD8: return static_cast('8'); - case KEY_PAD9: return static_cast('9'); - case KEY_PAD4: return static_cast('4'); - case KEY_PAD5: return static_cast('5'); - case KEY_PAD6: return static_cast('6'); - case KEY_PAD1: return static_cast('1'); - case KEY_PAD2: return static_cast('2'); - case KEY_PAD3: return static_cast('3'); - case KEY_PAD0: return static_cast('0'); - case KEY_PADPERIOD: return static_cast('.'); + case KEY_PAD7: + return static_cast('7'); + case KEY_PAD8: + return static_cast('8'); + case KEY_PAD9: + return static_cast('9'); + case KEY_PAD4: + return static_cast('4'); + case KEY_PAD5: + return static_cast('5'); + case KEY_PAD6: + return static_cast('6'); + case KEY_PAD1: + return static_cast('1'); + case KEY_PAD2: + return static_cast('2'); + case KEY_PAD3: + return static_cast('3'); + case KEY_PAD0: + return static_cast('0'); + case KEY_PADPERIOD: + return static_cast('.'); } } BYTE key_state[256] = {0}; @@ -75,7 +90,7 @@ FunHook key_to_ascii_hook{ int get_key_name(int key, char* buf, size_t buf_len) { - LONG lparam = (key & 0x7F) << 16; + LONG lparam = (key & 0x7F) << 16; if (key & 0x80) { lparam |= 1 << 24; } diff --git a/game_patch/input/mouse.cpp b/game_patch/input/mouse.cpp index 7e337f738..18b9c42f9 100644 --- a/game_patch/input/mouse.cpp +++ b/game_patch/input/mouse.cpp @@ -220,8 +220,9 @@ CodeInjection linear_pitch_patch{ float new_pitch_non_lin = non_linear_pitch_from_fw_vector(fvec_new); // Update non-linear pitch delta float new_pitch_delta = new_pitch_non_lin - current_pitch_non_lin; - xlog::trace("non-lin {} lin {} delta {} new {}", current_pitch_non_lin, current_pitch_lin, pitch_delta, - new_pitch_delta); + xlog::trace( + "non-lin {} lin {} delta {} new {}", current_pitch_non_lin, current_pitch_lin, pitch_delta, new_pitch_delta + ); pitch_delta = new_pitch_delta; }, }; @@ -254,7 +255,7 @@ void mouse_apply_patch() AsmWriter(0x0051DD7C).jmp(0x0051DD8E); // Use exclusive DirectInput mode so cursor cannot exit game window - //write_mem(0x0051E14B + 1, 5); // DISCL_EXCLUSIVE|DISCL_FOREGROUND + // write_mem(0x0051E14B + 1, 5); // DISCL_EXCLUSIVE|DISCL_FOREGROUND // Linear vertical rotation (pitch) linear_pitch_patch.install(); diff --git a/game_patch/main/main.cpp b/game_patch/main/main.cpp index a164944c7..05d2a6b26 100644 --- a/game_patch/main/main.cpp +++ b/game_patch/main/main.cpp @@ -73,9 +73,7 @@ CodeInjection after_full_game_init_hook{ CodeInjection cleanup_game_hook{ 0x004B2821, - []() { - debug_cleanup(); - }, + []() { debug_cleanup(); }, }; static void maybe_autosave() @@ -278,7 +276,10 @@ void log_system_info() if (wine_ver) xlog::info("Running on Wine: {}", wine_ver.value()); - xlog::info("Running as {} (elevation type: {})", is_current_user_admin() ? "admin" : "user", get_process_elevation_type()); + xlog::info( + "Running as {} (elevation type: {})", is_current_user_admin() ? "admin" : "user", + get_process_elevation_type() + ); xlog::info("CPU Brand: {}", get_cpu_brand()); xlog::info("CPU ID: {}", get_cpu_id()); LARGE_INTEGER qpc_freq; @@ -302,7 +303,10 @@ void load_config() } // Log information from config - xlog::info("Resolution: {}x{}x{}", g_game_config.res_width.value(), g_game_config.res_height.value(), g_game_config.res_bpp.value()); + xlog::info( + "Resolution: {}x{}x{}", g_game_config.res_width.value(), g_game_config.res_height.value(), + g_game_config.res_bpp.value() + ); xlog::info("Window Mode: {}", static_cast(g_game_config.wnd_mode.value())); xlog::info("Max FPS: {}", g_game_config.max_fps.value()); xlog::info("Allow Overwriting Game Files: {}", g_game_config.allow_overwrite_game_files.value()); diff --git a/game_patch/misc/camera.cpp b/game_patch/misc/camera.cpp index eb22810a5..350351a66 100644 --- a/game_patch/misc/camera.cpp +++ b/game_patch/misc/camera.cpp @@ -9,7 +9,7 @@ static float g_camera_shake_factor = 0.6f; FunHook camera_update_shake_hook{ 0x0040DB70, - [](rf::Camera *camera) { + [](rf::Camera* camera) { float frame_time = rf::frametime; if (frame_time > 0.0001f) { // < 1000FPS // Fix screen shake caused by some weapons (eg. Assault Rifle) diff --git a/game_patch/misc/character.cpp b/game_patch/misc/character.cpp index 2b699271d..c6d4ed04a 100644 --- a/game_patch/misc/character.cpp +++ b/game_patch/misc/character.cpp @@ -24,7 +24,7 @@ static void skeleton_cleanup_one(rf::Skeleton* sp) static FunHook skeleton_find_hook{ 0x00539BE0, - [](const char *filename) { + [](const char* filename) { std::string key = string_to_lower(get_filename_without_ext(filename)); auto it = skeletons.find(key); if (it == skeletons.end()) { @@ -45,7 +45,9 @@ static FunHook skeleton_unlink_base_hook{ sp->base_usage_count = std::max(sp->base_usage_count - 1, 0); if (sp->base_usage_count == 0 || force_unload) { if (sp->base_usage_count != 0) { - xlog::warn("Expected 0 base usages for skeleton '{}' but got {}", sp->mvf_filename, sp->base_usage_count); + xlog::warn( + "Expected 0 base usages for skeleton '{}' but got {}", sp->mvf_filename, sp->base_usage_count + ); } xlog::trace("Unloading skeleton: {} (total {})", sp->mvf_filename, skeletons.size()); skeleton_cleanup_one(sp); @@ -58,9 +60,7 @@ static FunHook skeleton_unlink_base_hook{ static FunHook skeleton_init_hook{ 0x00539D90, - []() { - skeletons.reserve(800); - }, + []() { skeletons.reserve(800); }, }; static FunHook skeleton_close_hook{ @@ -69,12 +69,16 @@ static FunHook skeleton_close_hook{ for (auto& p : skeletons) { auto& skeleton = p.second; if (skeleton->base_usage_count > 0) { - xlog::warn("Expected 0 base usages for skeleton '{}' but got {}", - skeleton->mvf_filename, skeleton->base_usage_count); + xlog::warn( + "Expected 0 base usages for skeleton '{}' but got {}", skeleton->mvf_filename, + skeleton->base_usage_count + ); } if (skeleton->instance_usage_count > 0) { - xlog::warn("Expected 0 instance usages for skeleton '{}' but got {}", - skeleton->mvf_filename, skeleton->instance_usage_count); + xlog::warn( + "Expected 0 instance usages for skeleton '{}' but got {}", skeleton->mvf_filename, + skeleton->instance_usage_count + ); } skeleton_cleanup_one(skeleton.get()); } @@ -98,7 +102,9 @@ static void skeleton_flush() } } -static int __fastcall character_load_animation(rf::Character *this_, int, const char *anim_filename, bool is_state, [[maybe_unused]] bool unused) +static int __fastcall character_load_animation( + rf::Character* this_, int, const char* anim_filename, bool is_state, [[maybe_unused]] bool unused +) { rf::Skeleton* sp = rf::skeleton_link_base(anim_filename); if (!sp) { @@ -109,14 +115,19 @@ static int __fastcall character_load_animation(rf::Character *this_, int, const if (this_->animations[i] == sp && this_->anim_is_state[i] == is_state) { // Unlink call is missing in oryginal code (RF bug) rf::skeleton_unlink_base(sp, false); - xlog::trace("Animation '{}' already used by character '{}' ({} base usages)", anim_filename, this_->name, sp->base_usage_count); + xlog::trace( + "Animation '{}' already used by character '{}' ({} base usages)", anim_filename, this_->name, + sp->base_usage_count + ); return i; } } // Animation not found - check if we can add it if (this_->num_anims >= static_cast(std::size(this_->animations))) { // Protect from buffer overflow - xlog::error("Cannot add animation '{}' to character '{}' because there is no free slot!", anim_filename, this_->name); + xlog::error( + "Cannot add animation '{}' to character '{}' because there is no free slot!", anim_filename, this_->name + ); rf::skeleton_unlink_base(sp, false); return 0; } @@ -125,8 +136,10 @@ static int __fastcall character_load_animation(rf::Character *this_, int, const this_->animations[anim_index] = sp; this_->anim_is_state[anim_index] = is_state; rf::skeleton_page_in(anim_filename, 0); - xlog::trace("Animation '{}' loaded for character '{}' ({} base usages) this {} sp {} anim_index {} is_state {}", - anim_filename, this_->name, sp->base_usage_count, this_, sp, anim_index, is_state); + xlog::trace( + "Animation '{}' loaded for character '{}' ({} base usages) this {} sp {} anim_index {} is_state {}", + anim_filename, this_->name, sp->base_usage_count, this_, sp, anim_index, is_state + ); return anim_index; } diff --git a/game_patch/misc/g_solid.cpp b/game_patch/misc/g_solid.cpp index 6df235477..57271aade 100644 --- a/game_patch/misc/g_solid.cpp +++ b/game_patch/misc/g_solid.cpp @@ -56,8 +56,9 @@ CodeInjection GSurface_calculate_lightmap_color_conv_patch{ uint8_t* dst_data = &lock.data[dst_pixel_size * offset_x + offset_y * lock.stride_in_bytes]; int height = surface->height; int src_pitch = 3 * src_width; - bool success = bm_convert_format(dst_data, lock.format, src_data, rf::bm::FORMAT_888_BGR, - src_width, height, lock.stride_in_bytes, src_pitch); + bool success = bm_convert_format( + dst_data, lock.format, src_data, rf::bm::FORMAT_888_BGR, src_width, height, lock.stride_in_bytes, src_pitch + ); if (!success) xlog::error("bm_convert_format failed for geomod (fmt {})", static_cast(lock.format)); rf::gr::unlock(&lock); @@ -87,8 +88,10 @@ CodeInjection GSurface_alloc_lightmap_color_conv_patch{ int dst_pixel_size = bm_bytes_per_pixel(lock.format); uint8_t* dst_row_ptr = &lock.data[dst_pixel_size * offset_x + offset_y * lock.stride_in_bytes]; int src_pitch = 3 * src_width; - bool success = bm_convert_format(dst_row_ptr, lock.format, src_data, rf::bm::FORMAT_888_BGR, - src_width, height, lock.stride_in_bytes, src_pitch); + bool success = bm_convert_format( + dst_row_ptr, lock.format, src_data, rf::bm::FORMAT_888_BGR, src_width, height, lock.stride_in_bytes, + src_pitch + ); if (!success) xlog::error("ConvertBitmapFormat failed for geomod2 (fmt {})", static_cast(lock.format)); rf::gr::unlock(&lock); @@ -120,8 +123,8 @@ void gr_copy_water_bitmap(rf::gr::LockInfo& src_lock, rf::gr::LockInfo& dst_lock try { call_with_format(src_lock.format, [=](auto s) { call_with_format(dst_lock.format, [=](auto d) { - if constexpr (decltype(s)::value == rf::bm::FORMAT_8_PALETTED - || decltype(d)::value == rf::bm::FORMAT_8_PALETTED) { + if constexpr (decltype(s)::value == rf::bm::FORMAT_8_PALETTED || + decltype(d)::value == rf::bm::FORMAT_8_PALETTED) { assert(false); return; } @@ -139,7 +142,8 @@ void gr_copy_water_bitmap(rf::gr::LockInfo& src_lock, rf::gr::LockInfo& dst_lock int src_y = t2 + off_arr[t1]; int src_x_limited = src_x & (dst_lock.w - 1); int src_y_limited = src_y & (dst_lock.h - 1); - const uint8_t* src_ptr = src_lock.data + src_x_limited * src_pixel_size + src_y_limited * src_lock.stride_in_bytes; + const uint8_t* src_ptr = + src_lock.data + src_x_limited * src_pixel_size + src_y_limited * src_lock.stride_in_bytes; PixelsReader rdr{src_ptr}; wrt.write(rdr.read()); ++t1; @@ -231,13 +235,15 @@ CodeInjection level_load_lightmaps_color_conv_patch{ if (!rf::gr::lock(lightmap->bm_handle, 0, &lock, rf::gr::LOCK_WRITE_ONLY)) return; - #if 1 // cap minimal color channel value as RF does +#if 1 // cap minimal color channel value as RF does for (int i = 0; i < lightmap->w * lightmap->h * 3; ++i) lightmap->buf[i] = std::max(lightmap->buf[i], (uint8_t)(4 << 3)); // 32 - #endif +#endif - bool success = bm_convert_format(lock.data, lock.format, lightmap->buf, - rf::bm::FORMAT_888_BGR, lightmap->w, lightmap->h, lock.stride_in_bytes, 3 * lightmap->w, nullptr); + bool success = bm_convert_format( + lock.data, lock.format, lightmap->buf, rf::bm::FORMAT_888_BGR, lightmap->w, lightmap->h, + lock.stride_in_bytes, 3 * lightmap->w, nullptr + ); if (!success) xlog::error("ConvertBitmapFormat failed for lightmap (dest format {})", static_cast(lock.format)); @@ -251,7 +257,7 @@ CodeInjection shadow_render_one_injection{ void* svol = regs.eax; auto& bbox_min = struct_field_ref(svol, 0xE4); auto& bbox_max = struct_field_ref(svol, 0xF0); - rf::MoverBrush *mb = regs.esi; + rf::MoverBrush* mb = regs.esi; if (!rf::bbox_intersect(bbox_min, bbox_max, mb->p_data.bbox_min, mb->p_data.bbox_max)) { regs.eip = 0x004CB1DA; } @@ -279,27 +285,10 @@ CodeInjection g_decal_add_internal_cmp_global_weak_limit_injection{ void decal_patch_limit(int max_decals) { unsigned decal_farray_get_addresses[] = { - 0x00492298, - 0x004BBEC9, - - 0x004D5515, - 0x004D5525, - 0x004D5545, - 0x004D5579, - 0x004D5589, - 0x004D55AD, - 0x004D55D9, - 0x004D55E9, - 0x004D5609, - 0x004D5635, - 0x004D5645, - 0x004D5666, - 0x004D569E, - 0x004D56AE, - 0x004D56CE, - 0x004D56FA, - 0x004D570A, - 0x004D572B, + 0x00492298, 0x004BBEC9, + + 0x004D5515, 0x004D5525, 0x004D5545, 0x004D5579, 0x004D5589, 0x004D55AD, 0x004D55D9, 0x004D55E9, 0x004D5609, + 0x004D5635, 0x004D5645, 0x004D5666, 0x004D569E, 0x004D56AE, 0x004D56CE, 0x004D56FA, 0x004D570A, 0x004D572B, }; unsigned decal_farray_add_addresses[] = { 0x004D58AE, @@ -310,11 +299,7 @@ void decal_patch_limit(int max_decals) 0x004D67B1, }; unsigned decal_farray_remove_matching_addresses[] = { - 0x004D6C68, - 0x004D6C93, - 0x004D6CB6, - 0x004D6CE1, - 0x004D6D10, + 0x004D6C68, 0x004D6C93, 0x004D6CB6, 0x004D6CE1, 0x004D6D10, }; unsigned decal_farray_ctor_addresses[] = { 0x004CCC51, @@ -352,19 +337,19 @@ void decal_patch_limit(int max_decals) write_mem(0x004D5456 + 2, max_decals); // total hard limit, 128 by default // Note: total soft level is handled in g_decal_add_internal_cmp_global_weak_limit_injection int max_decals_in_room = std::min(max_decals / 3, i8_max); - write_mem(0x004D55C4 + 2, max_decals_in_room); // room hard limit, 48 by default + write_mem(0x004D55C4 + 2, max_decals_in_room); // room hard limit, 48 by default write_mem(0x004D5620 + 2, max_decals_in_room * 5 / 6); // room soft limit, 40 by default - write_mem(0x004D5689 + 2, max_decals_in_room); // room hard limit, 48 by default + write_mem(0x004D5689 + 2, max_decals_in_room); // room hard limit, 48 by default write_mem(0x004D56E5 + 2, max_decals_in_room * 5 / 6); // room soft limit, 40 by default - write_mem(0x004D5500 + 2, max_decals_in_room); // solid hard limit, 48 by default + write_mem(0x004D5500 + 2, max_decals_in_room); // solid hard limit, 48 by default write_mem(0x004D555C + 2, max_decals_in_room * 5 / 6); // solid soft limit, 40 by default int max_weapon_decals = std::min(max_decals / 8, i8_max); - write_mem(0x004D5752 + 2, max_weapon_decals); // weapon hard limit, 16 by default - write_mem(0x004D579F + 2, max_weapon_decals); // weapon hard limit, 16 by default - write_mem(0x004D57AA + 2, max_weapon_decals * 7 / 8); // weapon soft limit, 14 by default + write_mem(0x004D5752 + 2, max_weapon_decals); // weapon hard limit, 16 by default + write_mem(0x004D579F + 2, max_weapon_decals); // weapon hard limit, 16 by default + write_mem(0x004D57AA + 2, max_weapon_decals * 7 / 8); // weapon soft limit, 14 by default int max_geomod_decals = std::min(max_decals / 4, i8_max); - write_mem(0x004D584D + 2, max_geomod_decals); // geomod hard limit, 32 by default - write_mem(0x004D5852 + 2, max_geomod_decals * 7 / 8); // geomod soft limit, 30 by default + write_mem(0x004D584D + 2, max_geomod_decals); // geomod hard limit, 32 by default + write_mem(0x004D5852 + 2, max_geomod_decals * 7 / 8); // geomod soft limit, 30 by default } ConsoleCommand2 max_decals_cmd{ @@ -389,8 +374,10 @@ static void render_rooms_clip_wnds() char buf[256]; std::snprintf(buf, sizeof(buf), "room %d", room->room_index); rf::gr::string(room->clip_wnd.left, room->clip_wnd.top, buf); - rf::gr::rect_border(room->clip_wnd.left, room->clip_wnd.top, - room->clip_wnd.right - room->clip_wnd.left, room->clip_wnd.bot - room->clip_wnd.top); + rf::gr::rect_border( + room->clip_wnd.left, room->clip_wnd.top, room->clip_wnd.right - room->clip_wnd.left, + room->clip_wnd.bot - room->clip_wnd.top + ); } } diff --git a/game_patch/misc/game.cpp b/game_patch/misc/game.cpp index fc549c9cb..e3d8a4c38 100644 --- a/game_patch/misc/game.cpp +++ b/game_patch/misc/game.cpp @@ -16,7 +16,7 @@ #include "../rf/cutscene.h" #include "../multi/multi.h" -static std::unique_ptr g_screenshot_scanlines_buf; +static std::unique_ptr g_screenshot_scanlines_buf; static std::optional get_screenshots_dir() { @@ -36,7 +36,7 @@ static std::optional get_screenshots_dir() FunHook game_print_screen_hook{ 0x004366E0, - [](char *filename_used) { + [](char* filename_used) { static auto& pending_screenshot_filename = addr_as_ref(0x00636F14); static auto& dump_tga = addr_as_ref(0x0063708C); static auto& screenshot_pending = addr_as_ref(0x00637085); @@ -57,12 +57,17 @@ FunHook game_print_screen_hook{ while (true) { if (counter == 1) { // Don't include the counter here - std::snprintf(pending_screenshot_filename, sizeof(pending_screenshot_filename) - 4, - "%s\\%s_%s", screenshots_dir.value().c_str(), time_str, level_filename.c_str()); - } else { + std::snprintf( + pending_screenshot_filename, sizeof(pending_screenshot_filename) - 4, "%s\\%s_%s", + screenshots_dir.value().c_str(), time_str, level_filename.c_str() + ); + } + else { // Filename conflict - include a counter - std::snprintf(pending_screenshot_filename, sizeof(pending_screenshot_filename) - 4, - "%s\\%s_%d_%s", screenshots_dir.value().c_str(), time_str, counter, level_filename.c_str()); + std::snprintf( + pending_screenshot_filename, sizeof(pending_screenshot_filename) - 4, "%s\\%s_%d_%s", + screenshots_dir.value().c_str(), time_str, counter, level_filename.c_str() + ); } auto filename_with_ext = std::string{pending_screenshot_filename} + dot_ext; bool exists = file.find(filename_with_ext.c_str()); @@ -87,7 +92,7 @@ FunHook game_print_screen_hook{ CodeInjection jpeg_write_bitmap_overflow_fix1{ 0x0055A066, [](auto& regs) { - g_screenshot_scanlines_buf = std::make_unique(rf::gr::screen.max_h); + g_screenshot_scanlines_buf = std::make_unique(rf::gr::screen.max_h); regs.ecx = g_screenshot_scanlines_buf.get(); regs.eip = 0x0055A06D; }, @@ -139,12 +144,8 @@ CodeInjection gameplay_render_frame_display_full_screen_image_injection{ // Change gr mode to one that uses alpha blending for Display_Fullscreen_Image event handling in // gameplay_render_frame function. Also ignore current alpha (vertex color). static rf::gr::Mode mode{ - rf::gr::TEXTURE_SOURCE_WRAP, - rf::gr::COLOR_SOURCE_TEXTURE, - rf::gr::ALPHA_SOURCE_TEXTURE, - rf::gr::ALPHA_BLEND_ALPHA, - rf::gr::ZBUFFER_TYPE_NONE, - rf::gr::FOG_NOT_ALLOWED, + rf::gr::TEXTURE_SOURCE_WRAP, rf::gr::COLOR_SOURCE_TEXTURE, rf::gr::ALPHA_SOURCE_TEXTURE, + rf::gr::ALPHA_BLEND_ALPHA, rf::gr::ZBUFFER_TYPE_NONE, rf::gr::FOG_NOT_ALLOWED, }; regs.edx = mode; }, @@ -174,16 +175,12 @@ int letterbox_clip_height() CodeInjection gameplay_render_frame_cutscene_letterbox_injection{ 0x00431B30, - [](auto& regs) { - regs.esi = letterbox_clip_height(); - }, + [](auto& regs) { regs.esi = letterbox_clip_height(); }, }; CodeInjection gameplay_render_frame_death_letterbox_injection{ 0x00432A82, - [](auto& regs) { - regs.edi = letterbox_clip_height(); - }, + [](auto& regs) { regs.edi = letterbox_clip_height(); }, }; void game_apply_patch() diff --git a/game_patch/misc/high_fps.cpp b/game_patch/misc/high_fps.cpp index 31d8df459..049b3f4f4 100644 --- a/game_patch/misc/high_fps.cpp +++ b/game_patch/misc/high_fps.cpp @@ -152,8 +152,10 @@ void ftol_issues_detection_do_frame() if (is_fps_dependent && is_significant) { bool is_new = g_ftol_issues.insert(p.first).second; if (is_new) - rf::console::print("ftol issue detected: address {:08X} ratio {:.2f} estimated value {:.4f}", - p.first - 5, ratio, avg_high_fps); + rf::console::print( + "ftol issue detected: address {:08X} ratio {:.2f} estimated value {:.4f}", p.first - 5, ratio, + avg_high_fps + ); } } diff --git a/game_patch/misc/main_menu.cpp b/game_patch/misc/main_menu.cpp index 5935180bb..2e9966d8d 100644 --- a/game_patch/misc/main_menu.cpp +++ b/game_patch/misc/main_menu.cpp @@ -32,10 +32,12 @@ namespace rf } // Note: fastcall is used because MSVC does not allow free thiscall functions -using UiLabel_Create2_Type = void __fastcall(rf::ui::Gadget*, int, rf::ui::Gadget*, int, int, int, int, const char*, int); +using UiLabel_Create2_Type = + void __fastcall(rf::ui::Gadget*, int, rf::ui::Gadget*, int, int, int, int, const char*, int); extern CallHook UiLabel_create2_version_label_hook; -void __fastcall UiLabel_create2_version_label(rf::ui::Gadget* self, int edx, rf::ui::Gadget* parent, int x, int y, int w, - int h, const char* text, int font_id) +void __fastcall UiLabel_create2_version_label( + rf::ui::Gadget* self, int edx, rf::ui::Gadget* parent, int x, int y, int w, int h, const char* text, int font_id +) { text = PRODUCT_NAME_VERSION; ui_get_string_size(&w, &h, text, -1, font_id); @@ -91,8 +93,9 @@ int load_easter_egg_image() if (!rf::gr::lock(hbm, 0, &lock, rf::gr::LOCK_WRITE_ONLY)) return -1; - rf::bm::convert_format(lock.data, lock.format, res_data, rf::bm::FORMAT_8888_ARGB, - easter_egg_size * easter_egg_size); + rf::bm::convert_format( + lock.data, lock.format, res_data, rf::bm::FORMAT_8888_ARGB, easter_egg_size * easter_egg_size + ); rf::gr::unlock(&lock); return hbm; @@ -164,10 +167,12 @@ CodeInjection menu_draw_background_injection{ rf::gr::set_color(255, 255, 255, 255); // Use function that accepts float sx - //for (int i = 0; i < 100; ++i) - gr_bitmap_scaled_float(menu_background_bitmap, 0.0f, 0.0f, - static_cast(rf::gr::screen.max_w), static_cast(rf::gr::screen.max_h), - menu_background_x, 0.0f, 640.0f, 480.0f, false, false, rf::gr::bitmap_clamp_mode); + // for (int i = 0; i < 100; ++i) + gr_bitmap_scaled_float( + menu_background_bitmap, 0.0f, 0.0f, static_cast(rf::gr::screen.max_w), + static_cast(rf::gr::screen.max_h), menu_background_x, 0.0f, 640.0f, 480.0f, false, false, + rf::gr::bitmap_clamp_mode + ); regs.eip = 0x00442D94; }, }; @@ -188,9 +193,7 @@ CodeInjection multi_servers_on_list_click_injection{ CodeInjection main_menu_set_music_injection{ 0x0044323C, - []() { - g_game_music_sig_to_restore = rf::snd_music_sig; - }, + []() { g_game_music_sig_to_restore = rf::snd_music_sig; }, }; FunHook main_menu_stop_music_hook{ @@ -204,8 +207,8 @@ FunHook main_menu_stop_music_hook{ else if (g_game_music_sig_to_restore != -1) { // Music changed when the menu was open - stop the old music // Note: In Single Player RF pauses the world when entering the menu so it should not happen - // In Multi Player on the other hand level scripts are still executing in the background and nothing stops - // them from playing new sounds/music. Would be cool to fix it one day... + // In Multi Player on the other hand level scripts are still executing in the background and nothing + // stops them from playing new sounds/music. Would be cool to fix it one day... rf::snd_pc_stop(g_game_music_sig_to_restore); g_game_music_sig_to_restore = -1; } diff --git a/game_patch/misc/misc.cpp b/game_patch/misc/misc.cpp index 8fb5f446f..66fa9c8a7 100644 --- a/game_patch/misc/misc.cpp +++ b/game_patch/misc/misc.cpp @@ -95,7 +95,10 @@ void start_join_multi_game_sequence(const rf::NetAddr& addr, const std::string& bool multi_join_game(const rf::NetAddr& addr, const std::string& password) { auto multi_set_current_server_addr = addr_as_ref(0x0044B380); - auto send_join_req_packet = addr_as_ref(0x0047AA40); + auto send_join_req_packet = + addr_as_ref( + 0x0047AA40 + ); if (rf::gameseq_get_state() != rf::GS_MULTI_SERVER_LIST) { return false; @@ -112,10 +115,12 @@ FunHook rf_init_state_hook{ 0x004B1AC0, [](int state, int old_state) { rf_init_state_hook.call_target(state, old_state); - xlog::trace("state {} old_state {} g_jump_to_multi_server_list {}", state, old_state, g_jump_to_multi_server_list); + xlog::trace( + "state {} old_state {} g_jump_to_multi_server_list {}", state, old_state, g_jump_to_multi_server_list + ); - bool exiting_game = state == rf::GS_MAIN_MENU && - (old_state == rf::GS_END_GAME || old_state == rf::GS_NEW_LEVEL); + bool exiting_game = + state == rf::GS_MAIN_MENU && (old_state == rf::GS_END_GAME || old_state == rf::GS_NEW_LEVEL); if (exiting_game && g_in_mp_game) { g_in_mp_game = false; g_jump_to_multi_server_list = true; @@ -166,24 +171,18 @@ FunHook multi_after_players_packet_hook{ }, }; -CodeInjection mover_rotating_keyframe_oob_crashfix{ - 0x0046A559, - [](auto& regs) { - float& unk_time = *reinterpret_cast(regs.esi + 0x308); - unk_time = 0; - regs.eip = 0x0046A89D; - } -}; +CodeInjection mover_rotating_keyframe_oob_crashfix{0x0046A559, [](auto& regs) { + float& unk_time = *reinterpret_cast(regs.esi + 0x308); + unk_time = 0; + regs.eip = 0x0046A89D; + }}; -CodeInjection parser_xstr_oob_fix{ - 0x0051212E, - [](auto& regs) { - if (regs.edi >= 1000) { - xlog::warn("XSTR index is out of bounds: {}!", static_cast(regs.edi)); - regs.edi = -1; - } - } -}; +CodeInjection parser_xstr_oob_fix{0x0051212E, [](auto& regs) { + if (regs.edi >= 1000) { + xlog::warn("XSTR index is out of bounds: {}!", static_cast(regs.edi)); + regs.edi = -1; + } + }}; CodeInjection ammo_tbl_buffer_overflow_fix{ 0x004C218E, @@ -313,7 +312,8 @@ CodeInjection glass_shard_level_init_fix{ }, }; -int debug_print_hook(char* buf, const char *fmt, ...) { +int debug_print_hook(char* buf, const char* fmt, ...) +{ va_list vl; va_start(vl, fmt); int ret = std::vsprintf(buf, fmt, vl); @@ -324,7 +324,7 @@ int debug_print_hook(char* buf, const char *fmt, ...) { CallHook skeleton_pagein_debug_print_patch{ 0x0053AA73, - reinterpret_cast(debug_print_hook), + reinterpret_cast(debug_print_hook), }; CodeInjection level_load_items_crash_fix{ @@ -362,20 +362,22 @@ CodeInjection explosion_crash_fix{ }, }; -CallHook level_read_geometry_header_light_add_directional_hook{ - 0x004619E1, - [](rf::Vector3 *dir, float intensity, float r, float g, float b, bool is_dynamic, int casts_shadow, int dropoff_type) { - if (rf::gr::lighting_enabled()) { - level_read_geometry_header_light_add_directional_hook.call_target(dir, intensity, r, g, b, is_dynamic, casts_shadow, dropoff_type); - } - }, -}; +CallHook + level_read_geometry_header_light_add_directional_hook{ + 0x004619E1, + [](rf::Vector3* dir, float intensity, float r, float g, float b, bool is_dynamic, int casts_shadow, + int dropoff_type) { + if (rf::gr::lighting_enabled()) { + level_read_geometry_header_light_add_directional_hook.call_target( + dir, intensity, r, g, b, is_dynamic, casts_shadow, dropoff_type + ); + } + }, + }; CodeInjection vfile_read_stack_corruption_fix{ 0x0052D0E0, - [](auto& regs) { - regs.esi = regs.eax; - }, + [](auto& regs) { regs.esi = regs.eax; }, }; CodeInjection game_set_file_paths_injection{ @@ -391,9 +393,7 @@ CodeInjection game_set_file_paths_injection{ CallHook level_init_pre_console_output_hook{ 0x00435ABB, - []() { - rf::console::print("-- Level Initializing: {} --", rf::level_filename_to_load); - }, + []() { rf::console::print("-- Level Initializing: {} --", rf::level_filename_to_load); }, }; void misc_init() diff --git a/game_patch/misc/player.cpp b/game_patch/misc/player.cpp index 79fd396dd..01f3441f0 100644 --- a/game_patch/misc/player.cpp +++ b/game_patch/misc/player.cpp @@ -92,7 +92,8 @@ bool should_swap_weapon_alt_fire(rf::Player* player) return false; } -bool is_player_weapon_on(rf::Player* player, bool alt_fire) { +bool is_player_weapon_on(rf::Player* player, bool alt_fire) +{ if (!player) { player = rf::local_player; } @@ -115,39 +116,34 @@ FunHook player_fire_primary_weapon_hook{ }, }; -CodeInjection stop_continous_primary_fire_patch{ - 0x00430EC5, - [](auto& regs) { - rf::Entity* entity = regs.esi; - if (is_player_weapon_on(entity->local_player, false)) { - regs.eip = 0x00430EDF; - } - else { - regs.eip = 0x00430EF2; - } - } -}; - -CodeInjection stop_continous_alternate_fire_patch{ - 0x00430F09, - [](auto& regs) { - rf::Entity* entity = regs.esi; - if (is_player_weapon_on(entity->local_player, true)) { - regs.eip = 0x00430F23; - } - else { - regs.eip = 0x00430F36; - } - } -}; +CodeInjection stop_continous_primary_fire_patch{0x00430EC5, [](auto& regs) { + rf::Entity* entity = regs.esi; + if (is_player_weapon_on(entity->local_player, false)) { + regs.eip = 0x00430EDF; + } + else { + regs.eip = 0x00430EF2; + } + }}; + +CodeInjection stop_continous_alternate_fire_patch{0x00430F09, [](auto& regs) { + rf::Entity* entity = regs.esi; + if (is_player_weapon_on(entity->local_player, true)) { + regs.eip = 0x00430F23; + } + else { + regs.eip = 0x00430F36; + } + }}; ConsoleCommand2 swap_assault_rifle_controls_cmd{ "swap_assault_rifle_controls", []() { g_game_config.swap_assault_rifle_controls = !g_game_config.swap_assault_rifle_controls; g_game_config.save(); - rf::console::print("Swap assault rifle controls: {}", - g_game_config.swap_assault_rifle_controls ? "enabled" : "disabled"); + rf::console::print( + "Swap assault rifle controls: {}", g_game_config.swap_assault_rifle_controls ? "enabled" : "disabled" + ); }, "Swap Assault Rifle controls", }; @@ -157,8 +153,7 @@ ConsoleCommand2 swap_grenade_controls_cmd{ []() { g_game_config.swap_grenade_controls = !g_game_config.swap_grenade_controls; g_game_config.save(); - rf::console::print("Swap grenade controls: {}", - g_game_config.swap_grenade_controls ? "enabled" : "disabled"); + rf::console::print("Swap grenade controls: {}", g_game_config.swap_grenade_controls ? "enabled" : "disabled"); }, "Swap grenade controls", }; @@ -202,15 +197,12 @@ FunHook player_execute_action_ }, }; -FunHook player_is_local_hook{ - 0x004A68D0, - [](rf::Player* player) { - if (multi_spectate_is_spectating()) { - return false; - } - return player_is_local_hook.call_target(player); - } -}; +FunHook player_is_local_hook{0x004A68D0, [](rf::Player* player) { + if (multi_spectate_is_spectating()) { + return false; + } + return player_is_local_hook.call_target(player); + }}; bool player_is_dead_and_not_spectating(rf::Player* player) { @@ -260,18 +252,21 @@ ConsoleCommand2 damage_screen_flash_cmd{ []() { g_game_config.damage_screen_flash = !g_game_config.damage_screen_flash; g_game_config.save(); - rf::console::print("Damage screen flash effect is {}", g_game_config.damage_screen_flash ? "enabled" : "disabled"); + rf::console::print( + "Damage screen flash effect is {}", g_game_config.damage_screen_flash ? "enabled" : "disabled" + ); }, "Toggle damage screen flash effect", }; CallHook player_cockpit_vmesh_render_hook{ 0x004A7907, - [](rf::VMesh *vmesh, rf::Vector3 *pos, rf::Matrix3 *orient, void *params) { + [](rf::VMesh* vmesh, rf::Vector3* pos, rf::Matrix3* orient, void* params) { rf::Matrix3 new_orient = *orient; if (string_equals_ignore_case(rf::vmesh_get_name(vmesh), "driller01.vfx")) { - float m = static_cast(rf::gr::screen_width()) / static_cast(rf::gr::screen_height()) / (4.0 / 3.0); + float m = + static_cast(rf::gr::screen_width()) / static_cast(rf::gr::screen_height()) / (4.0 / 3.0); new_orient.rvec *= m; } @@ -282,7 +277,7 @@ CallHook player_cockpit_vme CodeInjection sr_load_player_weapon_anims_injection{ 0x004B4F9E, [](auto& regs) { - rf::Entity *ep = regs.ebp; + rf::Entity* ep = regs.ebp; static auto& entity_update_weapon_animations = addr_as_ref(0x0042AB20); entity_update_weapon_animations(ep, ep->ai.current_primary_weapon); }, diff --git a/game_patch/misc/player_fpgun.cpp b/game_patch/misc/player_fpgun.cpp index 3f83d2ebd..6e7e1dded 100644 --- a/game_patch/misc/player_fpgun.cpp +++ b/game_patch/misc/player_fpgun.cpp @@ -24,8 +24,8 @@ static FunHook player_fpgun_update_state_anim_hook{ if (player != rf::local_player) { rf::Entity* entity = rf::entity_from_handle(player->entity_handle); if (entity) { - float horz_speed_pow2 = entity->p_data.vel.x * entity->p_data.vel.x + - entity->p_data.vel.z * entity->p_data.vel.z; + float horz_speed_pow2 = + entity->p_data.vel.x * entity->p_data.vel.x + entity->p_data.vel.z * entity->p_data.vel.z; int state = rf::WS_IDLE; if (rf::entity_weapon_is_on(entity->handle, entity->ai.current_primary_weapon)) state = rf::WS_LOOP_FIRE; @@ -83,7 +83,8 @@ void player_fpgun_reload_meshes(bool force) } auto& fpgun_meshes_current_mp_character = addr_as_ref(0x005A0AEC); auto& fpgun_meshes_current_team = addr_as_ref(0x005A0AF0); - if (g_fpgun_main_player->settings.multi_character != fpgun_meshes_current_mp_character || fpgun_team != fpgun_meshes_current_team || force) { + if (g_fpgun_main_player->settings.multi_character != fpgun_meshes_current_mp_character || + fpgun_team != fpgun_meshes_current_team || force) { rf::player_fpgun_delete_meshes(); rf::player_fpgun_load_meshes(); auto* entity = rf::entity_from_handle(g_fpgun_main_player->entity_handle); @@ -99,9 +100,7 @@ void player_fpgun_reload_meshes(bool force) ConsoleCommand2 reload_fpgun_cmd{ "d_reload_fpgun", - []() { - player_fpgun_reload_meshes(true); - }, + []() { player_fpgun_reload_meshes(true); }, }; #endif // NDEBUG @@ -151,8 +150,9 @@ CallHook player_fpgun_rende [](rf::Matrix3& viewer_orient, rf::Vector3& viewer_pos, float horizontal_fov, bool zbuffer_flag, bool z_scale) { horizontal_fov *= g_game_config.fpgun_fov_scale; horizontal_fov = gr_scale_fov_hor_plus(horizontal_fov); - player_fpgun_render_gr_setup_3d_hook - .call_target(viewer_orient, viewer_pos, horizontal_fov, zbuffer_flag, z_scale); + player_fpgun_render_gr_setup_3d_hook.call_target( + viewer_orient, viewer_pos, horizontal_fov, zbuffer_flag, z_scale + ); }, }; @@ -183,11 +183,11 @@ void player_fpgun_do_patch() AsmWriter(0x004AA23E).nop(6); // player_fpgun_set_state AsmWriter(0x004AE0DF).nop(2); // player_fpgun_get_vmesh_handle - AsmWriter(0x004A938F).nop(6); // player_fpgun_play_anim + AsmWriter(0x004A938F).nop(6); // player_fpgun_play_anim write_mem(0x004A952C, asm_opcodes::jmp_rel_short); // player_fpgun_is_in_state_anim - AsmWriter(0x004AA56D).nop(6); // player_fpgun_set_next_state_anim - AsmWriter(0x004AA6E7).nop(6); // player_fpgun_process - AsmWriter(0x004AE384).nop(6); // player_fpgun_page_in + AsmWriter(0x004AA56D).nop(6); // player_fpgun_set_next_state_anim + AsmWriter(0x004AA6E7).nop(6); // player_fpgun_process + AsmWriter(0x004AE384).nop(6); // player_fpgun_page_in write_mem(0x004ACE2C, asm_opcodes::jmp_rel_short); // player_fpgun_get_zoom write_mem_ptr(0x004AE569 + 2, &g_fpgun_main_player); // player_fpgun_load_meshes @@ -219,7 +219,7 @@ void player_fpgun_do_patch() if (g_game_config.high_scanner_res) { // Improved Railgun Scanner resolution - constexpr int8_t scanner_resolution = 120; // default is 64, max is 127 (signed byte) + constexpr int8_t scanner_resolution = 120; // default is 64, max is 127 (signed byte) write_mem(0x004325E6 + 1, scanner_resolution); // gameplay_render_frame write_mem(0x004325E8 + 1, scanner_resolution); write_mem(0x004A34BB + 1, scanner_resolution); // player_allocate diff --git a/game_patch/misc/save_restore.cpp b/game_patch/misc/save_restore.cpp index 8b5dd7a00..350d292d1 100644 --- a/game_patch/misc/save_restore.cpp +++ b/game_patch/misc/save_restore.cpp @@ -44,8 +44,12 @@ void validate_level_save_data(rf::sr::LevelData* data) validate_save_file_num(data->num_goal_create_events, rf::sr::MAX_GOAL_CREATE_EVENTS, "goal_create events"); validate_save_file_num(data->num_alarm_siren_events, rf::sr::MAX_ALARM_SIREN_EVENTS, "alarm_siren events"); validate_save_file_num(data->num_when_dead_events, rf::sr::MAX_WHEN_DEAD_EVENTS, "when_dead events"); - validate_save_file_num(data->num_cyclic_timer_events, rf::sr::MAX_CYCLIC_TIMER_EVENTS, "cyclic_timer events"); - validate_save_file_num(data->num_make_invulnerable_events, rf::sr::MAX_MAKE_INVULNERABLE_EVENTS, "make_invulnerable events"); + validate_save_file_num( + data->num_cyclic_timer_events, rf::sr::MAX_CYCLIC_TIMER_EVENTS, "cyclic_timer events" + ); + validate_save_file_num( + data->num_make_invulnerable_events, rf::sr::MAX_MAKE_INVULNERABLE_EVENTS, "make_invulnerable events" + ); validate_save_file_num(data->num_other_events, rf::sr::MAX_OTHER_EVENTS, "other events"); validate_save_file_num(data->num_emitters, rf::sr::MAX_EMITTERS, "emitters"); validate_save_file_num(data->num_decals, rf::sr::MAX_DECALS, "decals"); @@ -67,7 +71,7 @@ void validate_level_save_data(rf::sr::LevelData* data) FunHook sr_deserialize_all_objects_hook{ 0x004B4FB0, - [](rf::sr::LevelData *data) { + [](rf::sr::LevelData* data) { validate_level_save_data(data); sr_deserialize_all_objects_hook.call_target(data); }, @@ -75,7 +79,7 @@ FunHook sr_deserialize_all_objects_hook{ FunHook sr_serialize_all_objects_hook{ 0x004B4450, - [](rf::sr::LevelData *data) { + [](rf::sr::LevelData* data) { sr_serialize_all_objects_hook.call_target(data); validate_level_save_data(data); }, @@ -172,7 +176,7 @@ CodeInjection weapon_serialize_all_state_oob_fix{ FunHook sr_add_handle_for_delayed_resolution_hook{ 0x004B5630, - [](int uid, int *obj_handle_ptr) { + [](int uid, int* obj_handle_ptr) { auto& sr_num_delayed_handle_resolution = addr_as_ref(0x007DE5A0); if (sr_num_delayed_handle_resolution < 1500) { sr_add_handle_for_delayed_resolution_hook.call_target(uid, obj_handle_ptr); @@ -185,7 +189,7 @@ FunHook sr_add_handle_for_delayed_resolution_hook{ FunHook sr_store_level_transition_object_mesh_hook{ 0x004B5660, - [](rf::Object *obj) { + [](rf::Object* obj) { if (obj->vmesh) { g_level_transition_objects.emplace_back(LevelTransitionObject{ obj->handle, @@ -205,8 +209,7 @@ FunHook sr_restore_level_transition_objects_meshes_hook{ xlog::warn("Cannot restore level transition object mesh: {}", mesh_name); continue; } - switch (obj->type) - { + switch (obj->type) { case rf::OT_ENTITY: rf::entity_restore_mesh(static_cast(obj), mesh_name); break; @@ -257,8 +260,8 @@ FunHook quick_save_hook{ 0x004B6160, []() { quick_save_hook.call_target(); - bool server_side_saving_enabled = rf::is_multi && !rf::is_server && get_df_server_info() - && get_df_server_info().value().saving_enabled; + bool server_side_saving_enabled = + rf::is_multi && !rf::is_server && get_df_server_info() && get_df_server_info().value().saving_enabled; if (server_side_saving_enabled) { send_chat_line_packet("/save", nullptr); } @@ -269,8 +272,8 @@ FunHook quick_load_hook{ 0x004B6180, []() { quick_load_hook.call_target(); - bool server_side_saving_enabled = rf::is_multi && !rf::is_server && get_df_server_info() - && get_df_server_info().value().saving_enabled; + bool server_side_saving_enabled = + rf::is_multi && !rf::is_server && get_df_server_info() && get_df_server_info().value().saving_enabled; if (server_side_saving_enabled) { send_chat_line_packet("/load", nullptr); } @@ -283,7 +286,7 @@ CodeInjection sr_load_player_inj{ // Restore blackout // Note: if blackout had no checkboxes active (both flags clear) it is imposible to restore it // because of save format limitation - if (rf::local_player->flags & (rf::PF_KILL_AFTER_BLACKOUT|rf::PF_END_LEVEL_AFTER_BLACKOUT)) { + if (rf::local_player->flags & (rf::PF_KILL_AFTER_BLACKOUT | rf::PF_END_LEVEL_AFTER_BLACKOUT)) { rf::player_start_death_fade(rf::local_player, 1.5f, [](rf::Player*) {}); } }, @@ -335,8 +338,8 @@ void apply_save_restore_patches() quick_load_hook.install(); // Fix memory corruption when transitioning to 5th level in a sequence and the level has no entry in ponr.tbl - AsmWriter{0x004B3CAF, 0x004B3CB2}.xor_(asm_regs::ebx, asm_regs::ebx); // save - AsmWriter{0x004B5374, 0x004B5377}.xor_(asm_regs::edx, asm_regs::edx); // transition + AsmWriter{0x004B3CAF, 0x004B3CB2}.xor_(asm_regs::ebx, asm_regs::ebx); // save + AsmWriter{0x004B5374, 0x004B5377}.xor_(asm_regs::edx, asm_regs::edx); // transition // Restore blackout when loading a save file sr_load_player_inj.install(); diff --git a/game_patch/misc/ui.cpp b/game_patch/misc/ui.cpp index 3ee99ddd1..e49170306 100644 --- a/game_patch/misc/ui.cpp +++ b/game_patch/misc/ui.cpp @@ -12,7 +12,7 @@ #define DEBUG_UI_LAYOUT 0 #define SHARP_UI_TEXT 1 -static inline void debug_ui_layout([[ maybe_unused ]] rf::ui::Gadget& gadget) +static inline void debug_ui_layout([[maybe_unused]] rf::ui::Gadget& gadget) { #if DEBUG_UI_LAYOUT int x = gadget.GetAbsoluteX() * ui_scale_x; @@ -24,7 +24,10 @@ static inline void debug_ui_layout([[ maybe_unused ]] rf::ui::Gadget& gadget) #endif } -void __fastcall UiButton_create(rf::ui::Button& this_, int, const char *normal_bm, const char *selected_bm, int x, int y, int id, const char *text, int font) +void __fastcall UiButton_create( + rf::ui::Button& this_, int, const char* normal_bm, const char* selected_bm, int x, int y, int id, const char* text, + int font +) { this_.key = id; this_.x = x; @@ -46,7 +49,7 @@ void __fastcall UiButton_create(rf::ui::Button& this_, int, const char *normal_b } FunHook UiButton_create_hook{0x004574D0, UiButton_create}; -void __fastcall UiButton_set_text(rf::ui::Button& this_, int, const char *text, int font) +void __fastcall UiButton_set_text(rf::ui::Button& this_, int, const char* text, int font) { delete[] this_.text; this_.text = strdup(text); @@ -63,7 +66,9 @@ void __fastcall UiButton_render(rf::ui::Button& this_) if (this_.bg_bitmap >= 0) { rf::gr::set_color(255, 255, 255, 255); - rf::gr::bitmap_scaled(this_.bg_bitmap, x, y, w, h, 0, 0, this_.w, this_.h, false, false, rf::gr::bitmap_clamp_mode); + rf::gr::bitmap_scaled( + this_.bg_bitmap, x, y, w, h, 0, 0, this_.w, this_.h, false, false, rf::gr::bitmap_clamp_mode + ); } if (!this_.enabled) { @@ -99,7 +104,9 @@ void __fastcall UiButton_render(rf::ui::Button& this_) } FunHook UiButton_render_hook{0x004577A0, UiButton_render}; -void __fastcall UiLabel_create(rf::ui::Label& this_, int, rf::ui::Gadget *parent, int x, int y, const char *text, int font) +void __fastcall UiLabel_create( + rf::ui::Label& this_, int, rf::ui::Gadget* parent, int x, int y, const char* text, int font +) { this_.parent = parent; this_.x = x; @@ -115,7 +122,9 @@ void __fastcall UiLabel_create(rf::ui::Label& this_, int, rf::ui::Gadget *parent } FunHook UiLabel_create_hook{0x00456B60, UiLabel_create}; -void __fastcall UiLabel_create2(rf::ui::Label& this_, int, rf::ui::Gadget *parent, int x, int y, int w, int h, const char *text, int font) +void __fastcall UiLabel_create2( + rf::ui::Label& this_, int, rf::ui::Gadget* parent, int x, int y, int w, int h, const char* text, int font +) { this_.parent = parent; this_.x = x; @@ -137,7 +146,7 @@ void __fastcall UiLabel_create2(rf::ui::Label& this_, int, rf::ui::Gadget *paren } FunHook UiLabel_create2_hook{0x00456C20, UiLabel_create2}; -void __fastcall UiLabel_set_text(rf::ui::Label& this_, int, const char *text, int font) +void __fastcall UiLabel_set_text(rf::ui::Label& this_, int, const char* text, int font) { delete[] this_.text; this_.text = strdup(text); @@ -175,7 +184,9 @@ void __fastcall UiLabel_render(rf::ui::Label& this_) } FunHook UiLabel_render_hook{0x00456ED0, UiLabel_render}; -void __fastcall UiInputBox_create(rf::ui::InputBox& this_, int, rf::ui::Gadget *parent, int x, int y, const char *text, int font, int w) +void __fastcall UiInputBox_create( + rf::ui::InputBox& this_, int, rf::ui::Gadget* parent, int x, int y, const char* text, int font, int w +) { this_.parent = parent; this_.x = x; @@ -202,7 +213,9 @@ void __fastcall UiInputBox_render(rf::ui::InputBox& this_, void*) int y = static_cast(this_.get_absolute_y() * rf::ui::scale_y); int clip_x, clip_y, clip_w, clip_h; rf::gr::get_clip(&clip_x, &clip_y, &clip_w, &clip_h); - rf::gr::set_clip(x, y, this_.max_text_width, static_cast(this_.h * rf::ui::scale_y + 5)); // for some reason input fields are too thin + rf::gr::set_clip( + x, y, this_.max_text_width, static_cast(this_.h * rf::ui::scale_y + 5) + ); // for some reason input fields are too thin int text_offset_x = static_cast(1 * rf::ui::scale_x); rf::gr::string(text_offset_x, 0, this_.text, this_.font); @@ -220,7 +233,7 @@ void __fastcall UiInputBox_render(rf::ui::InputBox& this_, void*) } FunHook UiInputBox_render_hook{0x004570E0, UiInputBox_render}; -void __fastcall UiCycler_add_item(rf::ui::Cycler& this_, int, const char *text, int font) +void __fastcall UiCycler_add_item(rf::ui::Cycler& this_, int, const char* text, int font) { if (this_.num_items < rf::ui::Cycler::max_items) { this_.items_text[this_.num_items] = strdup(text); @@ -258,9 +271,11 @@ FunHook UiCycler_render_hook{0x00457F40, UiCycler_render}; CallHook popup_set_text_gr_split_str_hook{ 0x00455A7D, - [](int *n_chars, int *start_indices, const char *str, int max_pixel_w, int max_lines, char ignore_char, int font) { + [](int* n_chars, int* start_indices, const char* str, int max_pixel_w, int max_lines, char ignore_char, int font) { max_pixel_w = static_cast(max_pixel_w * rf::ui::scale_x); - popup_set_text_gr_split_str_hook.call_target(n_chars, start_indices, str, max_pixel_w, max_lines, ignore_char, font); + popup_set_text_gr_split_str_hook.call_target( + n_chars, start_indices, str, max_pixel_w, max_lines, ignore_char, font + ); }, }; @@ -275,10 +290,10 @@ static bool is_any_font_modded() bool rfpc_small_modded = rfpc_small_checksum != 0xAABA52E6u; bool any_font_modded = rfpc_large_modded || rfpc_medium_modded || rfpc_small_modded; if (any_font_modded) { - xlog::info("Detected modded fonts: rfpc-large {} ({:08X}) rfpc-medium {} ({:08X}) rfpc-small {} ({:08X})", - rfpc_large_modded, rfpc_large_checksum, - rfpc_medium_modded, rfpc_medium_checksum, - rfpc_small_modded, rfpc_small_checksum + xlog::info( + "Detected modded fonts: rfpc-large {} ({:08X}) rfpc-medium {} ({:08X}) rfpc-small {} ({:08X})", + rfpc_large_modded, rfpc_large_checksum, rfpc_medium_modded, rfpc_medium_checksum, rfpc_small_modded, + rfpc_small_checksum ); } return any_font_modded; @@ -293,7 +308,7 @@ FunHook menu_init_hook{ if (rf::ui::scale_y > 1.0f && !is_any_font_modded()) { int large_font_size = std::min(128, static_cast(std::round(rf::ui::scale_y * 14.5f))); // 32 int medium_font_size = std::min(128, static_cast(std::round(rf::ui::scale_y * 9.0f))); // 20 - int small_font_size = std::min(128, static_cast(std::round(rf::ui::scale_y * 7.5f))); // 16 + int small_font_size = std::min(128, static_cast(std::round(rf::ui::scale_y * 7.5f))); // 16 xlog::info("UI font sizes: {} {} {}", large_font_size, medium_font_size, small_font_size); rf::ui::large_font = rf::gr::load_font(std::format("boldfont.ttf:{}", large_font_size).c_str()); @@ -305,10 +320,10 @@ FunHook menu_init_hook{ }, }; -auto UiInputBox_add_char = reinterpret_cast(0x00457260); +auto UiInputBox_add_char = reinterpret_cast(0x00457260); extern FunHook UiInputBox_process_key_hook; -bool __fastcall UiInputBox_process_key_new(void *this_, int edx, rf::Key key) +bool __fastcall UiInputBox_process_key_new(void* this_, int edx, rf::Key key) { if (key == (rf::KEY_V | rf::KEY_CTRLED)) { char buf[256]; @@ -320,7 +335,7 @@ bool __fastcall UiInputBox_process_key_new(void *this_, int edx, rf::Key key) } return UiInputBox_process_key_hook.call_target(this_, edx, key); } -FunHook UiInputBox_process_key_hook{ +FunHook UiInputBox_process_key_hook{ 0x00457300, UiInputBox_process_key_new, }; diff --git a/game_patch/misc/vpackfile.cpp b/game_patch/misc/vpackfile.cpp index 48fcae9d8..0479ec844 100644 --- a/game_patch/misc/vpackfile.cpp +++ b/game_patch/misc/vpackfile.cpp @@ -261,8 +261,9 @@ static void for_each_packfile_entry(const std::vector& ext_fil } } -static int vpackfile_build_file_list_new(const char* ext_filter, char*& filenames, unsigned& num_files, - const char* packfile_filter) +static int vpackfile_build_file_list_new( + const char* ext_filter, char*& filenames, unsigned& num_files, const char* packfile_filter +) { xlog::trace("PackfileBuildFileList begin"); auto ext_filter_splitted = string_split(ext_filter, ','); @@ -323,19 +324,23 @@ static void vpackfile_add_to_lookup_table(rf::VPackfileEntry* entry) if (!inserted) { ++g_num_name_collisions; if (is_lookup_table_entry_override_allowed(it->second, entry)) { - xlog::trace("Allowed overriding packfile file {} (old packfile {}, new packfile {})", entry->name, - it->second->parent->filename, entry->parent->filename); + xlog::trace( + "Allowed overriding packfile file {} (old packfile {}, new packfile {})", entry->name, + it->second->parent->filename, entry->parent->filename + ); it->second = entry; } else { - xlog::trace("Denied overriding packfile file {} (old packfile {}, new packfile {})", entry->name, - it->second->parent->filename, entry->parent->filename); + xlog::trace( + "Denied overriding packfile file {} (old packfile {}, new packfile {})", entry->name, + it->second->parent->filename, entry->parent->filename + ); } } } -static int vpackfile_add_entries_new(rf::VPackfile* packfile, const void* block, unsigned num_files, - unsigned& num_added_files) +static int +vpackfile_add_entries_new(rf::VPackfile* packfile, const void* block, unsigned num_files, unsigned& num_added_files) { struct VppFileInfo { diff --git a/game_patch/multi/faction_files.cpp b/game_patch/multi/faction_files.cpp index b870c381e..b1499775e 100644 --- a/game_patch/multi/faction_files.cpp +++ b/game_patch/multi/faction_files.cpp @@ -72,8 +72,10 @@ std::optional FactionFilesClient::find_map(const return parse_level_info(buf); } -void FactionFilesClient::download_map(const char* tmp_filename, int ticket_id, - std::function callback) +void FactionFilesClient::download_map( + const char* tmp_filename, int ticket_id, + std::function callback +) { auto url = std::format("{}/downloadmap.php?ticketid={}", level_download_base_url, ticket_id); HttpRequest req{url, "GET", session_}; diff --git a/game_patch/multi/faction_files.h b/game_patch/multi/faction_files.h index 351a90938..9f768cebc 100644 --- a/game_patch/multi/faction_files.h +++ b/game_patch/multi/faction_files.h @@ -17,12 +17,13 @@ class FactionFilesClient FactionFilesClient(); std::optional find_map(const char* file_name); - void download_map(const char* tmp_filename, int ticket_id, - std::function callback); + void download_map( + const char* tmp_filename, int ticket_id, + std::function callback + ); private: HttpSession session_; static std::optional parse_level_info(const char* buf); }; - diff --git a/game_patch/multi/kill.cpp b/game_patch/multi/kill.cpp index de7db94a5..de5982965 100644 --- a/game_patch/multi/kill.cpp +++ b/game_patch/multi/kill.cpp @@ -155,7 +155,8 @@ FunHook entity_on_death_hook{ 0x0041FDC0, [](rf::Entity* entity) { // Reset fpgun animation when player dies - if (rf::local_player && entity->handle == rf::local_player->entity_handle && rf::local_player->weapon_mesh_handle) { + if (rf::local_player && entity->handle == rf::local_player->entity_handle && + rf::local_player->weapon_mesh_handle) { player_fpgun_on_player_death(rf::local_player); } entity_on_death_hook.call_target(entity); @@ -164,9 +165,7 @@ FunHook entity_on_death_hook{ ConsoleCommand2 kill_messages_cmd{ "kill_messages", - []() { - kill_messages = !kill_messages; - }, + []() { kill_messages = !kill_messages; }, "Toggles printing of kill messages in the chatbox and the game console", }; @@ -174,12 +173,7 @@ void multi_kill_do_patch() { // Player kill handling using namespace asm_regs; - AsmWriter(0x00420703) - .push(ebx) - .push(edi) - .call(on_player_kill) - .add(esp, 8) - .jmp(0x00420B03); + AsmWriter(0x00420703).push(ebx).push(edi).call(on_player_kill).add(esp, 8).jmp(0x00420B03); // Change player stats structure write_mem(0x004A33B5 + 1, sizeof(PlayerStatsNew)); diff --git a/game_patch/multi/level_download.cpp b/game_patch/multi/level_download.cpp index 269724bf8..ce940e1b6 100644 --- a/game_patch/multi/level_download.cpp +++ b/game_patch/multi/level_download.cpp @@ -34,8 +34,8 @@ static bool is_vpp_filename(const char* filename) return string_ends_with_ignore_case(filename, ".vpp"); } -static std::vector unzip(const char* path, const char* output_dir, - std::function filename_filter) +static std::vector +unzip(const char* path, const char* output_dir, std::function filename_filter) { unzFile archive = unzOpen(path); if (!archive) { @@ -78,7 +78,8 @@ static std::vector unzip(const char* path, const char* output_dir, break; } - while ((code = unzReadCurrentFile(archive, buf, sizeof(buf))) > 0) file.write(buf, code); + while ((code = unzReadCurrentFile(archive, buf, sizeof(buf))) > 0) + file.write(buf, code); if (code < 0) { xlog::error("unzReadCurrentFile failed - error {}, path {}", code, path); @@ -105,8 +106,8 @@ static std::vector unzip(const char* path, const char* output_dir, return extracted_files; } -static std::vector unrar(const char* path, const char* output_dir, - std::function filename_filter) +static std::vector +unrar(const char* path, const char* output_dir, std::function filename_filter) { char cmt_buf[16384]; @@ -124,7 +125,8 @@ static std::vector unrar(const char* path, const char* output_dir, } std::vector extracted_files; - struct RARHeaderData header_data{}; + struct RARHeaderData header_data + {}; header_data.CmtBuf = nullptr; while (true) { @@ -182,8 +184,7 @@ class LevelDownloadWorker }; LevelDownloadWorker(std::string level_filename, std::shared_ptr shared_data) : - level_filename_{std::move(level_filename)}, - shared_data_{std::move(shared_data)} + level_filename_{std::move(level_filename)}, shared_data_{std::move(shared_data)} {} std::vector operator()(); @@ -268,8 +269,8 @@ class LevelDownloadOperation struct Listener { virtual ~Listener() = default; - virtual void on_progress([[ maybe_unused ]] LevelDownloadOperation& operation) {} - virtual void on_finish([[ maybe_unused ]] LevelDownloadOperation& operation, [[ maybe_unused ]] bool success) {} + virtual void on_progress([[maybe_unused]] LevelDownloadOperation& operation) {} + virtual void on_finish([[maybe_unused]] LevelDownloadOperation& operation, [[maybe_unused]] bool success) {} }; private: @@ -389,7 +390,8 @@ class LevelDownloadManager } } - LevelDownloadOperation& start(std::string level_filename, std::unique_ptr&& listener) + LevelDownloadOperation& + start(std::string level_filename, std::unique_ptr&& listener) { xlog::info("Starting level download: {}", level_filename); return operation_.emplace(std::move(level_filename), std::move(listener)); @@ -424,9 +426,10 @@ class ConsoleReportingDownloadListener : public LevelDownloadOperation::Listener if (operation.get_state() == LevelDownloadState::fetching_data) { auto now = std::chrono::system_clock::now(); if (now - last_progress_print_ >= std::chrono::seconds{2}) { - rf::console::print("Download progress: {:.2f} MB / {:.2f} MB", - operation.get_bytes_received() / 1000000.0f, - operation.get_level_info().size_in_bytes / 1000000.0f); + rf::console::print( + "Download progress: {:.2f} MB / {:.2f} MB", operation.get_bytes_received() / 1000000.0f, + operation.get_level_info().size_in_bytes / 1000000.0f + ); last_progress_print_ = now; } } @@ -489,7 +492,7 @@ void multi_level_download_handle_input(int key) rf::multi_chat_say_handle_key(key); } else if (key == rf::KEY_ESC) { - rf::gameseq_push_state(rf::GS_MAIN_MENU, false, false); + rf::gameseq_push_state(rf::GS_MAIN_MENU, false, false); } } @@ -559,10 +562,15 @@ void multi_level_download_do_frame() rf::gr::string(info_x, y, created_by_str.c_str(), medium_font); y += info_spacing; - rf::gr::string(info_x, y, std::format("{:.2f} MB / {:.2f} MB ({:.2f} MB/s)", - bytes_received / 1000.0f / 1000.0f, - info.size_in_bytes / 1000.0f / 1000.0f, - bytes_per_sec / 1000.0f / 1000.0f).c_str(), medium_font); + rf::gr::string( + info_x, y, + std::format( + "{:.2f} MB / {:.2f} MB ({:.2f} MB/s)", bytes_received / 1000.0f / 1000.0f, + info.size_in_bytes / 1000.0f / 1000.0f, bytes_per_sec / 1000.0f / 1000.0f + ) + .c_str(), + medium_font + ); y += info_spacing; if (bytes_per_sec > 0) { @@ -599,7 +607,8 @@ CallHook process_enter_limbo_packet_gameseq_set_next_ if (rf::gameseq_get_state() == rf::GS_MULTI_LEVEL_DOWNLOAD) { // Level changes before we finish downloading the previous one // Do not enter the limbo game state because it would crash the game if there is currently no level loaded - // Instead stay in the level download state until we get the leave limbo packet and download the correct level + // Instead stay in the level download state until we get the leave limbo packet and download the correct + // level LevelDownloadManager::instance().abort(); } else { @@ -614,8 +623,9 @@ CallHook process_leave_limbo_packet_gameseq_set_next_ xlog::trace("Leave limbo - next level: {}", rf::level.next_level_filename); if (!next_level_exists()) { rf::gameseq_set_state(rf::GS_MULTI_LEVEL_DOWNLOAD, false); - LevelDownloadManager::instance().start(rf::level.next_level_filename, - std::make_unique()); + LevelDownloadManager::instance().start( + rf::level.next_level_filename, std::make_unique() + ); } else { process_leave_limbo_packet_gameseq_set_next_state_hook.call_target(state, force); @@ -628,8 +638,9 @@ CallHook game_new_game_gameseq_set_next_state_hook{ [](rf::GameState state, bool force) { if (rf::is_multi && !rf::is_server && !next_level_exists()) { rf::gameseq_set_state(rf::GS_MULTI_LEVEL_DOWNLOAD, false); - LevelDownloadManager::instance().start(rf::level.next_level_filename, - std::make_unique()); + LevelDownloadManager::instance().start( + rf::level.next_level_filename, std::make_unique() + ); } else { game_new_game_gameseq_set_next_state_hook.call_target(state, force); @@ -639,9 +650,7 @@ CallHook game_new_game_gameseq_set_next_state_hook{ CodeInjection join_failed_injection{ 0x0047C4EC, - []() { - set_jump_to_multi_server_list(true); - }, + []() { set_jump_to_multi_server_list(true); }, }; static void do_download_level(std::string filename, bool force) @@ -657,25 +666,20 @@ static void do_download_level(std::string filename, bool force) xlog::error("Level already exists on disk! Use download_level_force to download anyway."); return; } - LevelDownloadManager::instance().start(filename, - std::make_unique()); + LevelDownloadManager::instance().start(filename, std::make_unique()); } } ConsoleCommand2 download_level_cmd{ "download_level", - [](std::string filename) { - do_download_level(filename, false); - }, + [](std::string filename) { do_download_level(filename, false); }, "Downloads level from FactionFiles.com", "download_level ", }; ConsoleCommand2 download_level_force_cmd{ "download_level_force", - [](std::string filename) { - do_download_level(filename, true); - }, + [](std::string filename) { do_download_level(filename, true); }, }; void level_download_do_patch() diff --git a/game_patch/multi/multi.cpp b/game_patch/multi/multi.cpp index 1d6bd4447..0861879c3 100644 --- a/game_patch/multi/multi.cpp +++ b/game_patch/multi/multi.cpp @@ -18,7 +18,8 @@ #include "../rf/item.h" // Note: this must be called from DLL init function -// Note: we can't use global variable because that would lead to crash when launcher loads this DLL to check dependencies +// Note: we can't use global variable because that would lead to crash when launcher loads this DLL to check +// dependencies static rf::CmdLineParam& get_url_cmd_line_param() { static rf::CmdLineParam url_param{"-url", "", true}; @@ -55,7 +56,7 @@ void handle_url_param() } rf::console::print("Connecting to {}:{}...", host_name, port); - auto host = ntohl(reinterpret_cast(hp->h_addr_list[0])->S_un.S_addr); + auto host = ntohl(reinterpret_cast(hp->h_addr_list[0])->S_un.S_addr); rf::NetAddr addr{host, port}; start_join_multi_game_sequence(addr, password); @@ -119,7 +120,7 @@ bool multi_is_selecting_weapon(rf::Player* pp) FunHook multi_select_weapon_server_side_hook{ 0x004858D0, - [](rf::Player *pp, rf::Entity *ep, int weapon_type) { + [](rf::Player* pp, rf::Entity* ep, int weapon_type) { if (weapon_type == -1 || ep->ai.current_primary_weapon == weapon_type) { // Nothing to do return; @@ -135,12 +136,16 @@ FunHook multi_select_weapon_server_side_hoo xlog::debug("Player {} attempted to select an unpossesed weapon {}", pp->name, weapon_type); } else if (multi_is_selecting_weapon(pp)) { - xlog::debug("Player {} attempted to select weapon {} while selecting weapon {}", - pp->name, weapon_type, ep->ai.current_primary_weapon); + xlog::debug( + "Player {} attempted to select weapon {} while selecting weapon {}", pp->name, weapon_type, + ep->ai.current_primary_weapon + ); } else if (rf::entity_is_reloading(ep)) { - xlog::debug("Player {} attempted to select weapon {} while reloading weapon {}", - pp->name, weapon_type, ep->ai.current_primary_weapon); + xlog::debug( + "Player {} attempted to select weapon {} while reloading weapon {}", pp->name, weapon_type, + ep->ai.current_primary_weapon + ); } else { rf::player_make_weapon_current_selection(pp, weapon_type); @@ -215,8 +220,8 @@ void multi_turn_weapon_on(rf::Entity* ep, rf::Player* pp, bool alt_fire) void multi_turn_weapon_off(rf::Entity* ep) { auto current_primary_weapon = ep->ai.current_primary_weapon; - if (rf::weapon_is_on_off_weapon(current_primary_weapon, false) - || rf::weapon_is_on_off_weapon(current_primary_weapon, true)) { + if (rf::weapon_is_on_off_weapon(current_primary_weapon, false) || + rf::weapon_is_on_off_weapon(current_primary_weapon, true)) { rf::entity_turn_weapon_off(ep->handle, current_primary_weapon); } @@ -225,7 +230,7 @@ void multi_turn_weapon_off(rf::Entity* ep) bool weapon_uses_ammo(int weapon_type, bool alt_fire) { if (rf::weapon_is_detonator(weapon_type)) { - return false; + return false; } if (rf::weapon_is_riot_stick(weapon_type) && alt_fire) { return true; @@ -234,7 +239,7 @@ bool weapon_uses_ammo(int weapon_type, bool alt_fire) return !(winfo->flags & rf::WTF_MELEE); } -bool is_entity_out_of_ammo(rf::Entity *entity, int weapon_type, bool alt_fire) +bool is_entity_out_of_ammo(rf::Entity* entity, int weapon_type, bool alt_fire) { if (!weapon_uses_ammo(weapon_type, alt_fire)) { return false; @@ -284,13 +289,12 @@ bool multi_check_cps(rf::Player* pp, int weapon_type, bool alt_fire) float max_cps = multi_get_max_cps(weapon_type, alt_fire); auto [above_limit, cps] = multi_is_cps_above_limit(pp, max_cps); if (above_limit) { - xlog::info("Player {} is shooting too fast: cps {:.2f} is greater than allowed {:.2f}", - pp->name, cps, max_cps); + xlog::info("Player {} is shooting too fast: cps {:.2f} is greater than allowed {:.2f}", pp->name, cps, max_cps); } return above_limit; } -bool multi_is_weapon_fire_allowed_server_side(rf::Entity *ep, int weapon_type, bool alt_fire) +bool multi_is_weapon_fire_allowed_server_side(rf::Entity* ep, int weapon_type, bool alt_fire) { rf::Player* pp = rf::player_from_entity_handle(ep->handle); if (ep->ai.current_primary_weapon != weapon_type) { @@ -316,7 +320,7 @@ bool multi_is_weapon_fire_allowed_server_side(rf::Entity *ep, int weapon_type, b FunHook multi_process_remote_weapon_fire_hook{ 0x0047D220, - [](rf::Entity *ep, int weapon_type, rf::Vector3& pos, rf::Matrix3& orient, bool alt_fire) { + [](rf::Entity* ep, int weapon_type, rf::Vector3& pos, rf::Matrix3& orient, bool alt_fire) { if (rf::is_server) { // Do some checks server-side to prevent cheating if (!multi_is_weapon_fire_allowed_server_side(ep, weapon_type, alt_fire)) { diff --git a/game_patch/multi/multi_ban.cpp b/game_patch/multi/multi_ban.cpp index 460f28b3c..d657dcf5b 100644 --- a/game_patch/multi/multi_ban.cpp +++ b/game_patch/multi/multi_ban.cpp @@ -17,10 +17,7 @@ class IpRange unsigned mask_; public: - IpRange(unsigned ip, unsigned mask = FULL_MASK) : - ip_{ip}, - mask_{mask} - {} + IpRange(unsigned ip, unsigned mask = FULL_MASK) : ip_{ip}, mask_{mask} {} bool operator==(const IpRange& other) const = default; @@ -48,7 +45,8 @@ class IpRange unsigned shift = (3 - i) * 8; if (is_cidr || (mask_ & (0xFF << shift))) { ss << ((ip_ >> shift) & 0xFF); - } else { + } + else { ss << '*'; } if (i < 3) { @@ -77,7 +75,8 @@ IpRange IpRange::parse(const std::string& s) } if (*cur_ptr == '*' && i > 0) { break; - } else { + } + else { int n = 0; auto result = std::from_chars(cur_ptr, end_ptr, n); if (result.ec != std::errc{} || n < 0 || n > 255) { @@ -92,7 +91,8 @@ IpRange IpRange::parse(const std::string& s) throw std::runtime_error("invalid ip"); } ++cur_ptr; - } else { + } + else { break; } } @@ -154,7 +154,8 @@ class Banlist IpRange r = IpRange::parse(s); ip_ranges_.push_back(r); return true; - } catch (const std::exception& e) { + } + catch (const std::exception& e) { xlog::error("Failed to parse banlist entry: {}", s); return false; } @@ -184,21 +185,14 @@ class Banlist FunHook multi_ban_init_hook{ 0x0046D2C0, - []() { - Banlist::instance().load(); - }, + []() { Banlist::instance().load(); }, }; -FunHook multi_ban_shutdown_hook{ - 0x0046D3B0, - []() {} -}; +FunHook multi_ban_shutdown_hook{0x0046D3B0, []() {}}; FunHook multi_ban_is_banned_hook{ 0x0046D010, - [](const rf::NetAddr& addr) -> int { - return Banlist::instance().is_banned(addr.ip_addr) ? 1 : 0; - }, + [](const rf::NetAddr& addr) -> int { return Banlist::instance().is_banned(addr.ip_addr) ? 1 : 0; }, }; FunHook multi_ban_validate_ip_hook{ @@ -206,7 +200,8 @@ FunHook multi_ban_validate_ip_hook{ [](const char* s) { try { IpRange::parse(s); - } catch (const std::exception& e) { + } + catch (const std::exception& e) { xlog::error("Invalid IP range: {}", s); return 0; } @@ -243,7 +238,9 @@ std::optional multi_ban_unban_last() #ifndef NDEBUG -#define ok(expr) if (!(expr)) xlog::error("Test failed: {}", #expr) +#define ok(expr) \ + if (!(expr)) \ + xlog::error("Test failed: {}", #expr) static void test_parsing() { @@ -257,7 +254,8 @@ static void test_parsing() ok(IpRange::parse("192.168.17.*").to_string() == "192.168.17.*"); ok(IpRange::parse("192.168.*.*").to_string() == "192.168.*.*"); ok(IpRange::parse("192.168.17.17/28").to_string() == "192.168.17.16/28"); // normalized - } catch (const std::exception& e) { + } + catch (const std::exception& e) { xlog::error("banlist test failed: {}", e.what()); } } diff --git a/game_patch/multi/multi_tdm.cpp b/game_patch/multi/multi_tdm.cpp index 1843a4d07..1f173950a 100644 --- a/game_patch/multi/multi_tdm.cpp +++ b/game_patch/multi/multi_tdm.cpp @@ -16,44 +16,32 @@ static FunHook multi_tdm_level_init_hook{ static FunHook multi_tdm_set_red_score_hook{ 0x00482890, - [](unsigned short score) { - multi_tdm_red_score = score; - }, + [](unsigned short score) { multi_tdm_red_score = score; }, }; static FunHook multi_tdm_set_blue_score_hook{ 0x004828C0, - [](unsigned short score) { - multi_tdm_blue_score = score; - }, + [](unsigned short score) { multi_tdm_blue_score = score; }, }; static FunHook multi_tdm_get_red_team_score_hook{ 0x004828F0, - []() { - return multi_tdm_red_score; - }, + []() { return multi_tdm_red_score; }, }; static FunHook multi_tdm_get_blue_team_score_hook{ 0x00482900, - []() { - return multi_tdm_blue_score; - }, + []() { return multi_tdm_blue_score; }, }; static FunHook multi_tdm_increase_red_score_hook{ 0x00482910, - []() { - ++multi_tdm_red_score; - }, + []() { ++multi_tdm_red_score; }, }; static FunHook multi_tdm_increase_blue_score_hook{ 0x00482920, - []() { - ++multi_tdm_blue_score; - }, + []() { ++multi_tdm_blue_score; }, }; static FunHook multi_ctf_get_red_team_score_hook{ @@ -74,9 +62,7 @@ static FunHook multi_ctf_get_blue_team_score_hook{ static CallHook multi_load_dedicated_server_config_max_kills_cap_int_hook{ 0x0046DECF, - [](int *v, int, int) { - *v = std::clamp(*v, 1, 999); - }, + [](int* v, int, int) { *v = std::clamp(*v, 1, 999); }, }; void multi_tdm_apply_patch() @@ -105,7 +91,7 @@ void multi_tdm_apply_patch() AsmWriter{0x00470B66}.nop(5); // and eax, 0xFF // send_team_scores_packet AsmWriter{0x00472169, 0x0047216D}.mov(si, ax); // movzx si, al - AsmWriter{0x00472172, 0x00472176}.nop(); // movzx ax, al + AsmWriter{0x00472172, 0x00472176}.nop(); // movzx ax, al // multi_hud_render_team_scores AsmWriter{0x00477BCD}.nop(5); // and eax, 0xFF AsmWriter{0x00477BD9}.nop(5); // and eax, 0xFF diff --git a/game_patch/multi/network.cpp b/game_patch/multi/network.cpp index 73bfe00a2..ea49e3381 100644 --- a/game_patch/multi/network.cpp +++ b/game_patch/multi/network.cpp @@ -338,8 +338,10 @@ static void verify_player_id_in_packet(char* player_id_ptr, const rf::NetAddr& a rf::ubyte received_player_id = static_cast(*player_id_ptr); rf::ubyte real_player_id = src_player->net_data->player_id; if (received_player_id != real_player_id) { - xlog::warn("Wrong player ID in {} packet from {} (expected {:02X} but got {:02X})", - packet_name, src_player->name.c_str(), real_player_id, received_player_id); + xlog::warn( + "Wrong player ID in {} packet from {} (expected {:02X} but got {:02X})", packet_name, + src_player->name.c_str(), real_player_id, received_player_id + ); *player_id_ptr = real_player_id; // fix player ID } } @@ -457,37 +459,36 @@ FunHook process_reload_request_packet_hook{ int weapon_type; std::memcpy(&weapon_type, data, sizeof(weapon_type)); if (pp) { - void multi_reload_weapon_server_side(rf::Player* pp, int weapon_type); + void multi_reload_weapon_server_side(rf::Player * pp, int weapon_type); multi_reload_weapon_server_side(pp, weapon_type); } }, }; CodeInjection process_obj_update_check_flags_injection{ - 0x0047E058, - [](auto& regs) { - auto stack_frame = regs.esp + 0x9C; - rf::Player* pp = addr_as_ref(stack_frame - 0x6C); - int flags = regs.ebx; - rf::Entity* ep = regs.edi; - bool valid = true; - if (rf::is_server) { - // server-side - if (ep && ep->handle != pp->entity_handle) { - xlog::trace("Invalid obj_update entity {:x} {:x} {}", ep->handle, pp->entity_handle, - pp->name.c_str()); - valid = false; - } - else if (flags & (0x4 | 0x20 | 0x80)) { // OUF_WEAPON_TYPE | OUF_HEALTH_ARMOR | OUF_ARMOR_STATE - xlog::info("Invalid obj_update flags {:x}", flags); - valid = false; - } + 0x0047E058, + [](auto& regs) { + auto stack_frame = regs.esp + 0x9C; + rf::Player* pp = addr_as_ref(stack_frame - 0x6C); + int flags = regs.ebx; + rf::Entity* ep = regs.edi; + bool valid = true; + if (rf::is_server) { + // server-side + if (ep && ep->handle != pp->entity_handle) { + xlog::trace("Invalid obj_update entity {:x} {:x} {}", ep->handle, pp->entity_handle, pp->name.c_str()); + valid = false; } - if (!valid) { - regs.edi = 0; + else if (flags & (0x4 | 0x20 | 0x80)) { // OUF_WEAPON_TYPE | OUF_HEALTH_ARMOR | OUF_ARMOR_STATE + xlog::info("Invalid obj_update flags {:x}", flags); + valid = false; } - }, - }; + } + if (!valid) { + regs.edi = 0; + } + }, +}; CodeInjection process_obj_update_weapon_fire_injection{ 0x0047E2FF, @@ -502,8 +503,8 @@ CodeInjection process_obj_update_weapon_fire_injection{ bool is_on = flags & ouf_fire; bool alt_fire = flags & ouf_alt_fire; - void multi_turn_weapon_on(rf::Entity* ep, rf::Player* pp, bool alt_fire); - void multi_turn_weapon_off(rf::Entity* ep); + void multi_turn_weapon_on(rf::Entity * ep, rf::Player * pp, bool alt_fire); + void multi_turn_weapon_off(rf::Entity * ep); if (is_on) { multi_turn_weapon_on(entity, pp, alt_fire); } @@ -663,17 +664,18 @@ struct DashFactionJoinAcceptPacketExt uint8_t version_major = VERSION_MAJOR; uint8_t version_minor = VERSION_MINOR; - enum class Flags : uint32_t { - none = 0, + enum class Flags : uint32_t + { + none = 0, saving_enabled = 1, - max_fov = 2, + max_fov = 2, } flags = Flags::none; float max_fov; - }; template<> -struct EnableEnumBitwiseOperators : std::true_type {}; +struct EnableEnumBitwiseOperators : std::true_type +{}; CallHook send_join_req_packet_hook{ 0x0047ABFB, @@ -707,19 +709,24 @@ CodeInjection process_join_accept_injection{ std::byte* packet = regs.ebp; auto ext_offset = regs.esi + 5; DashFactionJoinAcceptPacketExt ext_data; - std::copy(packet + ext_offset, packet + ext_offset + sizeof(DashFactionJoinAcceptPacketExt), - reinterpret_cast(&ext_data)); + std::copy( + packet + ext_offset, packet + ext_offset + sizeof(DashFactionJoinAcceptPacketExt), + reinterpret_cast(&ext_data) + ); xlog::debug("Checking for join_accept DF extension: {:08X}", ext_data.df_signature); if (ext_data.df_signature == DASH_FACTION_SIGNATURE) { DashFactionServerInfo server_info; server_info.version_major = ext_data.version_major; server_info.version_minor = ext_data.version_minor; - xlog::debug("Got DF server info: {} {} {}", ext_data.version_major, ext_data.version_minor, - static_cast(ext_data.flags)); + xlog::debug( + "Got DF server info: {} {} {}", ext_data.version_major, ext_data.version_minor, + static_cast(ext_data.flags) + ); server_info.saving_enabled = !!(ext_data.flags & DashFactionJoinAcceptPacketExt::Flags::saving_enabled); constexpr float default_fov = 90.0f; - if (!!(ext_data.flags & DashFactionJoinAcceptPacketExt::Flags::max_fov) && ext_data.max_fov >= default_fov) { + if (!!(ext_data.flags & DashFactionJoinAcceptPacketExt::Flags::max_fov) && + ext_data.max_fov >= default_fov) { server_info.max_fov = ext_data.max_fov; } g_df_server_info = std::optional{server_info}; @@ -749,7 +756,9 @@ std::optional determine_local_ip_address() return {}; } - std::unique_ptr forward_table{ reinterpret_cast(operator new(forward_table_size)) }; + std::unique_ptr forward_table{ + reinterpret_cast(operator new(forward_table_size)) + }; if (GetIpForwardTable(forward_table.get(), &forward_table_size, TRUE) != NO_ERROR) { xlog::error("GetIpForwardTable failed"); return {}; @@ -774,7 +783,7 @@ std::optional determine_local_ip_address() xlog::error("GetIpAddrTable failed"); return {}; } - std::unique_ptr ip_table{ reinterpret_cast(operator new(ip_table_size)) }; + std::unique_ptr ip_table{reinterpret_cast(operator new(ip_table_size))}; if (GetIpAddrTable(ip_table.get(), &ip_table_size, FALSE) != NO_ERROR) { xlog::error("GetIpAddrTable failed"); return {}; @@ -832,7 +841,10 @@ bool try_to_auto_forward_port(int port) // get_StaticPortMappingCollection sometimes sets collection to nullptr and returns success // It may return a proper collecion pointer after few seconds. See UltraVNC code: // https://github.com/veyon/ultravnc/blob/master/uvnc_settings2/uvnc_settings/upnp.cpp - log.info("IUPnPNAT::get_StaticPortMappingCollection returned hr {:x}, collection {}", hr, static_cast(&*collection)); + log.info( + "IUPnPNAT::get_StaticPortMappingCollection returned hr {:x}, collection {}", hr, + static_cast(&*collection) + ); ++attempt_num; if (attempt_num == 10) { return false; @@ -861,7 +873,7 @@ bool try_to_auto_forward_port(int port) FunHook multi_start_hook{ 0x0046D5B0, - [](int is_client, rf::NetAddr *serv_addr) { + [](int is_client, rf::NetAddr* serv_addr) { if (!rf::net_port && !is_client) { // If no port was specified and this is a server recreate the socket and bind it to port 7755 xlog::info("Recreating socket using TCP port 7755"); @@ -950,7 +962,9 @@ ConsoleCommand2 update_rate_cmd{ static rf::Color yellow{255, 255, 0, 255}; rf::console::output( "Server update rate greater than 30 is not recommended. It can cause jitter for clients with " - "default update rate and break hit registration for clients with high ping.", &yellow); + "default update rate and break hit registration for clients with high ping.", + &yellow + ); } } else { @@ -998,7 +1012,7 @@ CodeInjection send_state_info_injection{ FunHook send_players_packet_hook{ 0x00481C70, - [](rf::Player *player) { + [](rf::Player* player) { send_players_packet_hook.call_target(player); pf_player_init(player); if (rf::is_server) { @@ -1009,7 +1023,7 @@ FunHook send_players_packet_hook{ extern FunHook multi_io_stats_add_hook; -void __fastcall multi_io_stats_add_new(void *this_, int edx, int size, bool is_send, int packet_type) +void __fastcall multi_io_stats_add_new(void* this_, int edx, int size, bool is_send, int packet_type) { // Fix memory corruption when sending/processing packets with non-standard type if (packet_type < 56) { @@ -1019,8 +1033,10 @@ void __fastcall multi_io_stats_add_new(void *this_, int edx, int size, bool is_s FunHook multi_io_stats_add_hook{0x0047CAC0, multi_io_stats_add_new}; -static void process_custom_packet([[maybe_unused]] void* data, [[maybe_unused]] int len, - [[maybe_unused]] const rf::NetAddr& addr, [[maybe_unused]] rf::Player* player) +static void process_custom_packet( + [[maybe_unused]] void* data, [[maybe_unused]] int len, [[maybe_unused]] const rf::NetAddr& addr, + [[maybe_unused]] rf::Player* player +) { pf_process_packet(data, len, addr, player); } @@ -1066,7 +1082,8 @@ CallHook game_info_num_players_hook{ int player_count = 0; auto player_list = SinglyLinkedList{rf::player_list}; for (auto& current_player : player_list) { - if (get_player_additional_data(¤t_player).is_browser) continue; + if (get_player_additional_data(¤t_player).is_browser) + continue; player_count++; } return player_count; @@ -1201,8 +1218,8 @@ void network_init() send_players_packet_hook.install(); // Use spawnpoint team property in TeamDM game (PF compatible) - write_mem(0x00470395 + 4, 0); // change cmp argument: CTF -> DM - write_mem(0x0047039A, asm_opcodes::jz_rel_short); // invert jump condition: jnz -> jz + write_mem(0x00470395 + 4, 0); // change cmp argument: CTF -> DM + write_mem(0x0047039A, asm_opcodes::jz_rel_short); // invert jump condition: jnz -> jz // Preserve password case when processing rcon_request command write_mem(0x0046C85A + 1, 1); diff --git a/game_patch/multi/server.cpp b/game_patch/multi/server.cpp index 56ce6ca58..ab1398dee 100644 --- a/game_patch/multi/server.cpp +++ b/game_patch/multi/server.cpp @@ -31,16 +31,7 @@ #include "../purefaction/pf.h" const char* g_rcon_cmd_whitelist[] = { - "kick", - "level", - "server_password", - "map", - "ban", - "ban_ip", - "map_ext", - "map_rest", - "map_next", - "map_prev", + "kick", "level", "server_password", "map", "ban", "ban_ip", "map_ext", "map_rest", "map_next", "map_prev", }; ServerAdditionalConfig g_additional_server_config; @@ -304,9 +295,9 @@ static void send_private_message_with_stats(rf::Player* player) "PLAYER STATS\n" "Kills: {} - Deaths: {} - Max Streak: {}\n" "Accuracy: {}% ({:.0f}/{:.0f}) - Damage Given: {:.0f} - Damage Taken: {:.0f}", - stats->num_kills, stats->num_deaths, stats->max_streak, - accuracy, stats->num_shots_hit, stats->num_shots_fired, - stats->damage_given, stats->damage_received); + stats->num_kills, stats->num_deaths, stats->max_streak, accuracy, stats->num_shots_hit, stats->num_shots_fired, + stats->damage_given, stats->damage_received + ); send_chat_line_packet(str.c_str(), player); } @@ -315,7 +306,11 @@ bool handle_server_chat_command(std::string_view server_command, rf::Player* sen auto [cmd_name, cmd_arg] = strip_by_space(server_command); if (cmd_name == "info") { - send_chat_line_packet(std::format("Server powered by Dash Faction {} (build date: {} {})", VERSION_STR, __DATE__, __TIME__).c_str(), sender); + send_chat_line_packet( + std::format("Server powered by Dash Faction {} (build date: {} {})", VERSION_STR, __DATE__, __TIME__) + .c_str(), + sender + ); } else if (cmd_name == "vote") { auto [vote_name, vote_arg] = strip_by_space(cmd_arg); @@ -357,9 +352,7 @@ bool check_server_chat_command(const char* msg, rf::Player* sender) CodeInjection spawn_protection_duration_patch{ 0x0048089A, - [](auto& regs) { - *static_cast(regs.esp) = g_additional_server_config.spawn_protection_duration_ms; - }, + [](auto& regs) { *static_cast(regs.esp) = g_additional_server_config.spawn_protection_duration_ms; }, }; CodeInjection detect_browser_player_patch{ @@ -459,9 +452,9 @@ CallHook give_default_weapon_ammo_hook{ }, }; -FunHook multi_is_level_matching_game_type_hook{ +FunHook multi_is_level_matching_game_type_hook{ 0x00445050, - [](const char *filename, int ng_type) { + [](const char* filename, int ng_type) { if (ng_type == RF_GT_CTF) { return string_starts_with_ignore_case(filename, "ctf") || string_starts_with_ignore_case(filename, "pctf"); } @@ -526,7 +519,7 @@ CodeInjection multi_on_new_player_injection{ rf::Player* player = regs.esi; in_addr addr; addr.S_un.S_addr = ntohl(player->net_data->addr.ip_addr); - rf::console::print("{}{} ({})", player->name, rf::strings::has_joined, inet_ntoa(addr)); + rf::console::print("{}{} ({})", player->name, rf::strings::has_joined, inet_ntoa(addr)); regs.eip = 0x0047B051; }, }; @@ -539,15 +532,18 @@ static bool check_player_ac_status([[maybe_unused]] rf::Player* player) if (!verified) { send_chat_line_packet( "Sorry! Your spawn request was rejected because verification of your client software failed. " - "Please use the latest officially released version of Dash Faction. You can get it from dashfaction.com.", - player); + "Please use the latest officially released version of Dash Faction. You can get it from " + "dashfaction.com.", + player + ); return false; } int ac_level = pf_get_player_ac_level(player); if (ac_level < g_additional_server_config.anticheat_level) { auto msg = std::format( - "Sorry! Your spawn request was rejected because your client did not pass anti-cheat verification (your level {}, required {}). " + "Sorry! Your spawn request was rejected because your client did not pass anti-cheat verification (your " + "level {}, required {}). " "Please make sure you do not have any mods installed and that your client software is up to date.", ac_level, g_additional_server_config.anticheat_level ); @@ -598,7 +594,7 @@ static bool multi_is_team_game_type() return rf::multi_get_game_type() != rf::NG_TYPE_DM; } -static void maybe_increment_weapon_hits_stat(int hit_obj_handle, rf::Weapon *wp) +static void maybe_increment_weapon_hits_stat(int hit_obj_handle, rf::Weapon* wp) { rf::Entity* attacker_ep = rf::entity_from_handle(wp->parent_handle); if (!attacker_ep) { @@ -625,7 +621,7 @@ static void maybe_increment_weapon_hits_stat(int hit_obj_handle, rf::Weapon *wp) FunHook multi_lag_comp_handle_hit_hook{ 0x0046F380, - [](rf::LevelCollisionOut *col_info, rf::Weapon *wp) { + [](rf::LevelCollisionOut* col_info, rf::Weapon* wp) { if (rf::is_server) { maybe_increment_weapon_hits_stat(col_info->obj_handle, wp); } @@ -635,7 +631,7 @@ FunHook multi_lag_comp_handle_hit_hook FunHook multi_lag_comp_weapon_fire_hook{ 0x0046F7E0, - [](rf::Entity *ep, rf::Weapon *wp) { + [](rf::Entity* ep, rf::Weapon* wp) { multi_lag_comp_weapon_fire_hook.call_target(ep, wp); rf::Player* pp = rf::player_from_entity_handle(ep->handle); if (pp && pp->stats) { diff --git a/game_patch/multi/votes.cpp b/game_patch/multi/votes.cpp index 469c11d1d..fbda8dac8 100644 --- a/game_patch/multi/votes.cpp +++ b/game_patch/multi/votes.cpp @@ -85,7 +85,9 @@ struct Vote num_votes_no++; remaining_players.erase(source); players_who_voted.insert({source, is_yes_vote}); - auto msg = std::format("\xA6 Vote status: Yes: {} No: {} Waiting: {}", num_votes_yes, num_votes_no, remaining_players.size()); + auto msg = std::format( + "\xA6 Vote status: Yes: {} No: {} Waiting: {}", num_votes_yes, num_votes_no, remaining_players.size() + ); send_chat_line_packet(msg.c_str(), nullptr); return check_for_early_vote_finish(); } @@ -121,8 +123,6 @@ struct Vote return true; } - - protected: [[nodiscard]] virtual std::string get_title() const = 0; [[nodiscard]] virtual const VoteConfig& get_config() const = 0; @@ -149,7 +149,8 @@ struct Vote "\n=============== VOTE STARTING ===============\n" "{} vote started by {}.\n" "Send message \"/vote yes\" or \"/vote no\" to participate.", - title.c_str(), source->name.c_str()); + title.c_str(), source->name.c_str() + ); send_chat_line_packet(msg.c_str(), nullptr); } @@ -181,7 +182,7 @@ struct VoteKick : public Vote { rf::Player* m_target_player; - bool process_vote_arg(std::string_view arg, [[ maybe_unused ]] rf::Player* source) override + bool process_vote_arg(std::string_view arg, [[maybe_unused]] rf::Player* source) override { std::string player_name{arg}; m_target_player = find_best_matching_player(player_name.c_str()); diff --git a/game_patch/object/cutscene.cpp b/game_patch/object/cutscene.cpp index 25dda112b..885be5c0f 100644 --- a/game_patch/object/cutscene.cpp +++ b/game_patch/object/cutscene.cpp @@ -52,8 +52,8 @@ FunHook cutscene_do_frame_hook{ [](bool dlg_open) { bool skip_cutscene = false; auto skip_cutscene_ctrl = g_game_config.skip_cutscene_ctrl.value() != -1 - ? static_cast(g_game_config.skip_cutscene_ctrl.value()) - : default_skip_cutscene_ctrl; + ? static_cast(g_game_config.skip_cutscene_ctrl.value()) + : default_skip_cutscene_ctrl; rf::control_config_check_pressed(&rf::local_player->settings.controls, skip_cutscene_ctrl, &skip_cutscene); if (!skip_cutscene) { diff --git a/game_patch/object/entity.cpp b/game_patch/object/entity.cpp index c7862762a..acf552be5 100644 --- a/game_patch/object/entity.cpp +++ b/game_patch/object/entity.cpp @@ -98,22 +98,21 @@ CallHook entity_update_liquid_status_obj_is_player_hook{ 0x0042932A, 0x004293F4, }, - [](rf::Object* obj) { - return obj == rf::local_player_entity; - }, + [](rf::Object* obj) { return obj == rf::local_player_entity; }, }; -CallHook entity_maybe_stop_crouching_collide_spheres_world_hook{ - 0x00428AB9, - [](const rf::Vector3& p1, const rf::Vector3& p2, rf::PhysicsData* pd, rf::PCollisionOut* collision) { - // Temporarly disable collisions with liquid faces - auto collision_flags = pd->collision_flags; - pd->collision_flags &= ~0x1000; - bool result = entity_maybe_stop_crouching_collide_spheres_world_hook.call_target(p1, p2, pd, collision); - pd->collision_flags = collision_flags; - return result; - }, -}; +CallHook + entity_maybe_stop_crouching_collide_spheres_world_hook{ + 0x00428AB9, + [](const rf::Vector3& p1, const rf::Vector3& p2, rf::PhysicsData* pd, rf::PCollisionOut* collision) { + // Temporarly disable collisions with liquid faces + auto collision_flags = pd->collision_flags; + pd->collision_flags &= ~0x1000; + bool result = entity_maybe_stop_crouching_collide_spheres_world_hook.call_target(p1, p2, pd, collision); + pd->collision_flags = collision_flags; + return result; + }, + }; CodeInjection entity_process_post_hidden_injection{ 0x0041E4C8, @@ -161,7 +160,9 @@ CodeInjection waypoints_read_nodes_oob_fix{ int node_index = regs.eax + 1; int& num_nodes = *static_cast(regs.ebp); if (node_index >= max_waypoint_list_nodes && node_index < num_nodes) { - xlog::error("Too many waypoint list nodes (limit is {})! Overwritting the last endpoint.", max_waypoint_list_nodes); + xlog::error( + "Too many waypoint list nodes (limit is {})! Overwritting the last endpoint.", max_waypoint_list_nodes + ); // reduce count by one and keep node index unchanged --num_nodes; // Set EAX and ECX based on skipped instructions but do not update EBX to fix OOB write @@ -180,7 +181,8 @@ CodeInjection entity_fire_update_all_freeze_fix{ if (fire == next_fire) { // only one object was on the list and it got deleted so exit the loop regs.eip = 0x0042F2AF; - } else { + } + else { // go to the next object regs.esi = next_fire; } diff --git a/game_patch/object/event.cpp b/game_patch/object/event.cpp index 675b0a8e4..9717f87c9 100644 --- a/game_patch/object/event.cpp +++ b/game_patch/object/event.cpp @@ -72,7 +72,10 @@ struct EventSetLiquidDepthHook : rf::Event void __fastcall EventSetLiquidDepth_turn_on_new(EventSetLiquidDepthHook* this_) { - xlog::info("Processing Set_Liquid_Depth event: uid {} depth {:.2f} duration {:.2f}", this_->uid, this_->depth, this_->duration); + xlog::info( + "Processing Set_Liquid_Depth event: uid {} depth {:.2f} duration {:.2f}", this_->uid, this_->depth, + this_->duration + ); if (this_->links.size() == 0) { xlog::trace("no links"); rf::add_liquid_depth_update(this_->room, this_->depth, this_->duration); @@ -88,9 +91,10 @@ void __fastcall EventSetLiquidDepth_turn_on_new(EventSetLiquidDepthHook* this_) } } -extern CallHook liquid_depth_update_apply_all_GRoom_reset_liquid_hook; +extern CallHook liquid_depth_update_apply_all_GRoom_reset_liquid_hook; -void __fastcall liquid_depth_update_apply_all_GRoom_reset_liquid(rf::GRoom* room, int edx, rf::GSolid* solid) { +void __fastcall liquid_depth_update_apply_all_GRoom_reset_liquid(rf::GRoom* room, int edx, rf::GSolid* solid) +{ liquid_depth_update_apply_all_GRoom_reset_liquid_hook.call_target(room, edx, solid); // check objects in room if they are in water @@ -115,10 +119,11 @@ void __fastcall liquid_depth_update_apply_all_GRoom_reset_liquid(rf::GRoom* room } } -CallHook liquid_depth_update_apply_all_GRoom_reset_liquid_hook{ - 0x0045E4AC, - liquid_depth_update_apply_all_GRoom_reset_liquid, -}; +CallHook + liquid_depth_update_apply_all_GRoom_reset_liquid_hook{ + 0x0045E4AC, + liquid_depth_update_apply_all_GRoom_reset_liquid, + }; CallHook ai_path_release_on_load_level_event_crash_fix{ 0x004BBD99, @@ -158,12 +163,13 @@ FunHook event_level_init_post_hook{ }, }; -extern FunHook EventMessage__turn_on_hook; -void __fastcall EventMessage__turn_on_new(rf::Event *this_) +extern FunHook EventMessage__turn_on_hook; +void __fastcall EventMessage__turn_on_new(rf::Event* this_) { - if (!rf::is_dedicated_server) EventMessage__turn_on_hook.call_target(this_); + if (!rf::is_dedicated_server) + EventMessage__turn_on_hook.call_target(this_); } -FunHook EventMessage__turn_on_hook{ +FunHook EventMessage__turn_on_hook{ 0x004BB210, EventMessage__turn_on_new, }; @@ -174,8 +180,7 @@ CodeInjection event_activate_injection{ if (event_debug_enabled) { rf::Event* event = regs.esi; bool on = addr_as_ref(regs.esp + 0xC + 0xC); - rf::console::print("Processing {} message in event {} ({})", - on ? "ON" : "OFF", event->name, event->uid); + rf::console::print("Processing {} message in event {} ({})", on ? "ON" : "OFF", event->name, event->uid); } }, }; @@ -186,8 +191,7 @@ CodeInjection event_activate_injection2{ if (event_debug_enabled) { rf::Event* event = regs.esi; bool on = regs.cl; - rf::console::print("Delaying {} message in event {} ({})", - on ? "ON" : "OFF", event->name, event->uid); + rf::console::print("Delaying {} message in event {} ({})", on ? "ON" : "OFF", event->name, event->uid); } }, }; @@ -197,28 +201,24 @@ CodeInjection event_process_injection{ [](auto& regs) { if (event_debug_enabled) { rf::Event* event = regs.esi; - rf::console::print("Processing {} message in event {} ({}) (delayed)", - event->delayed_msg ? "ON" : "OFF", event->name, event->uid); + rf::console::print( + "Processing {} message in event {} ({}) (delayed)", event->delayed_msg ? "ON" : "OFF", event->name, + event->uid + ); } }, }; -CodeInjection event_load_level_turn_on_injection{ - 0x004BB9C9, - [](auto& regs) { - if (rf::local_player->flags & (rf::PF_KILL_AFTER_BLACKOUT|rf::PF_END_LEVEL_AFTER_BLACKOUT)) { - // Ignore level transition if the player was going to die or game was going to end after a blackout effect - regs.eip = 0x004BBA71; - } - } -}; +CodeInjection event_load_level_turn_on_injection{0x004BB9C9, [](auto& regs) { + if (rf::local_player->flags & (rf::PF_KILL_AFTER_BLACKOUT | + rf::PF_END_LEVEL_AFTER_BLACKOUT)) { + // Ignore level transition if the player was going to die or + // game was going to end after a blackout effect + regs.eip = 0x004BBA71; + } + }}; -ConsoleCommand2 debug_event_msg_cmd{ - "debug_event_msg", - []() { - event_debug_enabled = !event_debug_enabled; - } -}; +ConsoleCommand2 debug_event_msg_cmd{"debug_event_msg", []() { event_debug_enabled = !event_debug_enabled; }}; void apply_event_patches() { @@ -230,8 +230,8 @@ void apply_event_patches() AsmWriter(0x004BCBE0).jmp(&EventSetLiquidDepth_turn_on_new); liquid_depth_update_apply_all_GRoom_reset_liquid_hook.install(); - // Fix crash after level change (Load_Level event) caused by GNavNode pointers in AiPathInfo not being cleared for entities - // being taken from the previous level + // Fix crash after level change (Load_Level event) caused by GNavNode pointers in AiPathInfo not being cleared for + // entities being taken from the previous level ai_path_release_on_load_level_event_crash_fix.install(); // Fix Message event crash on dedicated server diff --git a/game_patch/object/glare.cpp b/game_patch/object/glare.cpp index ddc6fc72a..fb2fe3f8f 100644 --- a/game_patch/object/glare.cpp +++ b/game_patch/object/glare.cpp @@ -22,10 +22,10 @@ static std::vector g_mover_brushes_to_check; static bool glare_collide_object(rf::Glare* glare, rf::Object* obj, const rf::Vector3& eye_pos) { - if (!(obj->obj_flags & rf::OF_WAS_RENDERED) - || !obj->vmesh - || (obj == rf::local_player_entity && rf::local_player->cam && rf::local_player->cam->mode == rf::CAMERA_FIRST_PERSON) - || glare->parent_handle == obj->handle) { + if (!(obj->obj_flags & rf::OF_WAS_RENDERED) || !obj->vmesh || + (obj == rf::local_player_entity && rf::local_player->cam && + rf::local_player->cam->mode == rf::CAMERA_FIRST_PERSON) || + glare->parent_handle == obj->handle) { return false; } @@ -93,32 +93,32 @@ FunHook glare_render_all_flares_hook{ } g_objects_to_check.clear(); - for (auto& entity: DoublyLinkedList{rf::entity_list}) { + for (auto& entity : DoublyLinkedList{rf::entity_list}) { if (entity.obj_flags & rf::OF_WAS_RENDERED) { g_objects_to_check.push_back(&entity); } } - for (auto& corpse: DoublyLinkedList{rf::corpse_list}) { + for (auto& corpse : DoublyLinkedList{rf::corpse_list}) { if (corpse.obj_flags & rf::OF_WAS_RENDERED) { g_objects_to_check.push_back(&corpse); } } - for (auto& clutter: DoublyLinkedList{rf::clutter_list}) { + for (auto& clutter : DoublyLinkedList{rf::clutter_list}) { if (clutter.obj_flags & rf::OF_WAS_RENDERED) { g_objects_to_check.push_back(&clutter); } } - for (auto& item: DoublyLinkedList{rf::item_list}) { + for (auto& item : DoublyLinkedList{rf::item_list}) { if (item.obj_flags & rf::OF_WAS_RENDERED) { g_objects_to_check.push_back(&item); } } g_mover_brushes_to_check.clear(); - for (auto& mb: DoublyLinkedList{rf::mover_brush_list}) { + for (auto& mb : DoublyLinkedList{rf::mover_brush_list}) { if (mb.obj_flags & rf::OF_WAS_RENDERED) { g_mover_brushes_to_check.push_back(&mb); } @@ -188,7 +188,7 @@ FunHook glare_is_in_view_hoo FunHook glare_render_corona_hook{ 0x00414860, - [](rf::Glare *glare, int player_idx) { + [](rf::Glare* glare, int player_idx) { // check if corona is in view using dynamic radius dedicated for this effect // Note: object radius matches volumetric effect size and can be very large so this check helps // to speed up rendering diff --git a/game_patch/object/monitor.cpp b/game_patch/object/monitor.cpp index 4bd95281d..6b95d90f9 100644 --- a/game_patch/object/monitor.cpp +++ b/game_patch/object/monitor.cpp @@ -37,7 +37,7 @@ void monitor_refresh_all() CallHook bm_create_user_bitmap_monitor_hook{ 0x00412547, - []([[ maybe_unused ]] rf::bm::Format pixel_fmt, int w, int h) { + []([[maybe_unused]] rf::bm::Format pixel_fmt, int w, int h) { return bm_create_user_bitmap_monitor_hook.call_target(rf::bm::FORMAT_RENDER_TARGET, w, h); }, }; @@ -97,7 +97,7 @@ void replace_monitor_screen_bitmap(rf::Monitor& mon, int hbm) auto clutter = rf::obj_from_handle(mon.clutter_handle); auto vmesh = clutter->vmesh; int num_materials; - rf::MeshMaterial *materials; + rf::MeshMaterial* materials; rf::vmesh_get_materials_array(vmesh, &num_materials, &materials); for (int i = 0; i < num_materials; ++i) { auto& mat = materials[i]; @@ -113,14 +113,14 @@ FunHook monitor_update_static_hook{ [](rf::Monitor& mon) { // monitor is no longer displaying view from camera so its texture usage must be changed // from render target to dynamic texture - //ensure_monitor_bitmap_is_dynamic(mon); + // ensure_monitor_bitmap_is_dynamic(mon); if (!(mon.flags & rf::MF_BM_RENDERED)) { // very good idea but needs more work on UVs... auto hbm = rf::bm::load("gls_noise01.tga", -1, true); replace_monitor_screen_bitmap(mon, hbm); mon.flags |= rf::MF_BM_RENDERED; } - //monitor_update_static_hook.call_target(mon); + // monitor_update_static_hook.call_target(mon); }, }; #endif @@ -153,9 +153,7 @@ FunHook monitor_update_off_hook{ CodeInjection render_corpse_in_monitor_patch{ 0x00412905, - []() { - rf::player_render_held_corpse(rf::local_player); - }, + []() { rf::player_render_held_corpse(rf::local_player); }, }; void monitor_do_patch() diff --git a/game_patch/object/obj_light.cpp b/game_patch/object/obj_light.cpp index ea29363f4..ac29296eb 100644 --- a/game_patch/object/obj_light.cpp +++ b/game_patch/object/obj_light.cpp @@ -13,7 +13,7 @@ void gr_light_use_static(bool use_static); -void obj_mesh_lighting_alloc_one(rf::Object *objp) +void obj_mesh_lighting_alloc_one(rf::Object* objp) { // Note: ObjDeleteMesh frees mesh_lighting_data assert(objp->mesh_lighting_data == nullptr); @@ -21,7 +21,7 @@ void obj_mesh_lighting_alloc_one(rf::Object *objp) objp->mesh_lighting_data = rf::rf_malloc(size); } -void obj_mesh_lighting_free_one(rf::Object *objp) +void obj_mesh_lighting_free_one(rf::Object* objp) { if (objp->mesh_lighting_data) { rf::rf_free(objp->mesh_lighting_data); @@ -29,14 +29,14 @@ void obj_mesh_lighting_free_one(rf::Object *objp) } } -void obj_mesh_lighting_update_one(rf::Object *objp) +void obj_mesh_lighting_update_one(rf::Object* objp) { gr_light_use_static(true); rf::vmesh_update_lighting_data(objp->vmesh, objp->room, objp->pos, objp->orient, objp->mesh_lighting_data); gr_light_use_static(false); } -static bool obj_should_be_lit(rf::Object *objp) +static bool obj_should_be_lit(rf::Object* objp) { if (!g_game_config.mesh_static_lighting) { return false; @@ -49,7 +49,7 @@ static bool obj_should_be_lit(rf::Object *objp) return objp->type == rf::OT_CLUTTER || (objp->type == rf::OT_ITEM && !rf::is_multi); } -void obj_mesh_lighting_maybe_update(rf::Object *objp) +void obj_mesh_lighting_maybe_update(rf::Object* objp) { if (!objp->mesh_lighting_data && obj_should_be_lit(objp)) { obj_mesh_lighting_alloc_one(objp); @@ -84,16 +84,16 @@ FunHook obj_light_calculate_hook{ FunHook obj_light_alloc_hook{ 0x0048B1D0, []() { - for (auto& item: DoublyLinkedList{rf::item_list}) { - if (item.vmesh && !(item.obj_flags & rf::OF_DELAYED_DELETE) - && rf::vmesh_get_type(item.vmesh) == rf::MESH_TYPE_STATIC) { + for (auto& item : DoublyLinkedList{rf::item_list}) { + if (item.vmesh && !(item.obj_flags & rf::OF_DELAYED_DELETE) && + rf::vmesh_get_type(item.vmesh) == rf::MESH_TYPE_STATIC) { auto size = rf::vmesh_calc_lighting_data_size(item.vmesh); item.mesh_lighting_data = rf::rf_malloc(size); } } - for (auto& clutter: DoublyLinkedList{rf::clutter_list}) { - if (clutter.vmesh && !(clutter.obj_flags & rf::OF_DELAYED_DELETE) - && rf::vmesh_get_type(clutter.vmesh) == rf::MESH_TYPE_STATIC) { + for (auto& clutter : DoublyLinkedList{rf::clutter_list}) { + if (clutter.vmesh && !(clutter.obj_flags & rf::OF_DELAYED_DELETE) && + rf::vmesh_get_type(clutter.vmesh) == rf::MESH_TYPE_STATIC) { auto size = rf::vmesh_calc_lighting_data_size(clutter.vmesh); clutter.mesh_lighting_data = rf::rf_malloc(size); } @@ -104,11 +104,11 @@ FunHook obj_light_alloc_hook{ FunHook obj_light_free_hook{ 0x0048B370, []() { - for (auto& item: DoublyLinkedList{rf::item_list}) { + for (auto& item : DoublyLinkedList{rf::item_list}) { rf::rf_free(item.mesh_lighting_data); item.mesh_lighting_data = nullptr; } - for (auto& clutter: DoublyLinkedList{rf::clutter_list}) { + for (auto& clutter : DoublyLinkedList{rf::clutter_list}) { rf::rf_free(clutter.mesh_lighting_data); clutter.mesh_lighting_data = nullptr; } diff --git a/game_patch/object/object.cpp b/game_patch/object/object.cpp index 3b3bee705..ec5057abd 100644 --- a/game_patch/object/object.cpp +++ b/game_patch/object/object.cpp @@ -29,17 +29,17 @@ StaticBufferResizePatch obj_ptr_array_resize_patch{ old_obj_limit, obj_limit, { - {0x0040A0F7}, - {0x004867B5}, - {0x00486854}, - {0x00486D51}, - {0x00486E38}, - {0x00487572}, - {0x0048759E}, - {0x004875B4}, - {0x0048A78A}, - {0x00486D70, true}, - {0x0048A7A1, true}, + {0x0040A0F7}, + {0x004867B5}, + {0x00486854}, + {0x00486D51}, + {0x00486E38}, + {0x00487572}, + {0x0048759E}, + {0x004875B4}, + {0x0048A78A}, + {0x00486D70, true}, + {0x0048A7A1, true}, }, }; @@ -56,7 +56,8 @@ StaticBufferResizePatch obj_multi_handle_mapping_resize_patch{ }, }; -static struct { +static struct +{ int count; rf::Object* objects[obj_limit]; } g_sim_obj_array; @@ -180,7 +181,7 @@ CodeInjection sort_clutter_patch{ clutter->prev->next = clutter; // Set up needed registers regs.eax = addr_as_ref(regs.esp + 0xD0 + 0x18); // killable - regs.ecx = addr_as_ref(0x005C9358) + 1; // num_clutter_objs + regs.ecx = addr_as_ref(0x005C9358) + 1; // num_clutter_objs regs.eip = 0x00410A03; }, }; @@ -211,7 +212,7 @@ CodeInjection object_find_room_optimization{ // Check if object is in room bounding box to handle leaving room by a hole if (obj->room && rf::ix_point_in_box(obj->pos, obj->room->bbox_min, obj->room->bbox_max)) { // Pass original room to GSolid::find_new_room so it can execute a faster code path - addr_as_ref(regs.esp) = obj->room; // orig_room + addr_as_ref(regs.esp) = obj->room; // orig_room addr_as_ref(regs.esp + 4) = &obj->correct_pos; // orig_pos } }, @@ -223,7 +224,7 @@ void object_do_patch() obj_create_hook.install(); // Change object limit - //obj_free_slot_buffer_resize_patch.install(); + // obj_free_slot_buffer_resize_patch.install(); obj_ptr_array_resize_patch.install(); obj_multi_handle_mapping_resize_patch.install(); write_mem(0x0040A0F0 + 1, obj_limit); diff --git a/game_patch/object/object.h b/game_patch/object/object.h index ea028a72b..c50b2341a 100644 --- a/game_patch/object/object.h +++ b/game_patch/object/object.h @@ -7,10 +7,10 @@ namespace rf } void object_do_patch(); -void obj_mesh_lighting_alloc_one(rf::Object *objp); -void obj_mesh_lighting_free_one(rf::Object *objp); -void obj_mesh_lighting_update_one(rf::Object *objp); -void obj_mesh_lighting_maybe_update(rf::Object *objp); +void obj_mesh_lighting_alloc_one(rf::Object* objp); +void obj_mesh_lighting_free_one(rf::Object* objp); +void obj_mesh_lighting_update_one(rf::Object* objp); +void obj_mesh_lighting_maybe_update(rf::Object* objp); void trigger_send_state_info(rf::Player* player); constexpr size_t old_obj_limit = 1024; diff --git a/game_patch/object/particle.cpp b/game_patch/object/particle.cpp index 58a7c33bc..c220e22d2 100644 --- a/game_patch/object/particle.cpp +++ b/game_patch/object/particle.cpp @@ -8,21 +8,25 @@ #include "../rf/geometry.h" #include "../rf/multi.h" -FunHook particle_emitter_create_hook{ - 0x00497CA0, - [](int objh, rf::ParticleEmitterType& type, rf::GRoom* room, rf::Vector3& pos, bool is_on) { - float min_spawn_delay = 1.0f / 60.0f; - if ((type.flags & rf::PEF_CONTINOUS) || type.min_spawn_delay < min_spawn_delay) { - xlog::debug("Particle emitter spawn delay is too small: {:.2f}. Increasing to {:.2f}...", type.min_spawn_delay, min_spawn_delay); - rf::ParticleEmitterType new_type = type; - new_type.flags &= ~rf::PEF_CONTINOUS; - new_type.min_spawn_delay = std::max(new_type.min_spawn_delay, min_spawn_delay); - new_type.max_spawn_delay = std::max(new_type.max_spawn_delay, min_spawn_delay); - return particle_emitter_create_hook.call_target(objh, new_type, room, pos, is_on); - } - return particle_emitter_create_hook.call_target(objh, type, room, pos, is_on); - }, -}; +FunHook + particle_emitter_create_hook{ + 0x00497CA0, + [](int objh, rf::ParticleEmitterType& type, rf::GRoom* room, rf::Vector3& pos, bool is_on) { + float min_spawn_delay = 1.0f / 60.0f; + if ((type.flags & rf::PEF_CONTINOUS) || type.min_spawn_delay < min_spawn_delay) { + xlog::debug( + "Particle emitter spawn delay is too small: {:.2f}. Increasing to {:.2f}...", type.min_spawn_delay, + min_spawn_delay + ); + rf::ParticleEmitterType new_type = type; + new_type.flags &= ~rf::PEF_CONTINOUS; + new_type.min_spawn_delay = std::max(new_type.min_spawn_delay, min_spawn_delay); + new_type.max_spawn_delay = std::max(new_type.max_spawn_delay, min_spawn_delay); + return particle_emitter_create_hook.call_target(objh, new_type, room, pos, is_on); + } + return particle_emitter_create_hook.call_target(objh, type, room, pos, is_on); + }, + }; CodeInjection particle_update_accel_patch{ 0x00495282, @@ -34,25 +38,24 @@ CodeInjection particle_update_accel_patch{ }, }; -FunHook particle_create_hook{ - 0x00496840, - [](int pool_id, rf::ParticleCreateInfo& pci, rf::GRoom* room, rf::Vector3 *a4, int parent_obj, rf::Particle** result, rf::ParticleEmitter* emitter) { - bool damages_flag = pci.flags2 & 1; - // Do not create not damaging particles on a dedicated server - if (damages_flag || !rf::is_dedicated_server) { - particle_create_hook.call_target(pool_id, pci, room, a4, parent_obj, result, emitter); - } - }, -}; - -CodeInjection particle_should_take_damage_injection{ - 0x00494DE9, - [] (auto& regs) { - if (rf::is_dedicated_server) { - regs.eip = 0x00494DF8; - } - } -}; +FunHook + particle_create_hook{ + 0x00496840, + [](int pool_id, rf::ParticleCreateInfo& pci, rf::GRoom* room, rf::Vector3* a4, int parent_obj, + rf::Particle** result, rf::ParticleEmitter* emitter) { + bool damages_flag = pci.flags2 & 1; + // Do not create not damaging particles on a dedicated server + if (damages_flag || !rf::is_dedicated_server) { + particle_create_hook.call_target(pool_id, pci, room, a4, parent_obj, result, emitter); + } + }, + }; + +CodeInjection particle_should_take_damage_injection{0x00494DE9, [](auto& regs) { + if (rf::is_dedicated_server) { + regs.eip = 0x00494DF8; + } + }}; CodeInjection particle_emitter_update_cull_radius_injection{ 0x00497E08, @@ -61,7 +64,7 @@ CodeInjection particle_emitter_update_cull_radius_injection{ rf::Vector3 pos, dir; emitter->get_pos_and_dir(&pos, &dir); - rf::Particle *p = emitter->particle_list.next; + rf::Particle* p = emitter->particle_list.next; float max_dist_sq = 0.0f; float max_pradius = 0.0; @@ -77,26 +80,36 @@ CodeInjection particle_emitter_update_cull_radius_injection{ }, }; -CallHook particle_emitter_g_portal_object_add_hook{ - 0x00497C82, - [](rf::ParticleEmitter* emitter, const rf::Vector3 *pos, const rf::Vector3 *cull_pos, float radius, void (*render_function)(int, rf::GSolid*), bool has_alpha, const rf::Plane*, const rf::Vector3*, const rf::Vector3*, bool lights_enabled, bool use_static_lights) { - // Use world_pos field to hold the pos because pos points to a local variable and g_portal_object_add saves the pointer - // for a later use. Note that world_pos is not used anywhere else except for a code after 0x00495216 that is skipped in DF. - emitter->world_pos = *pos; - // Use world_pos as bbox_min and bbox_max. Those fields are not used for culling, but for - // sorting objects in respect to the liquid surface. - // If the player is above liquid surface the engine renders first objects that are partially or fully under the liquid surface, - // then the surface itself and ends with rendering objects that are fully above the surface. - // If the player is below the surface the engine first renders objects partially above the surface, then the surface and ends - // with objects fully below the surface. - // To determine if object is fully or partially above/below the surface the engine estimates max and min Y for the object. - // Normally pos.y +/- radius are used for that estimation, but for particle emitters this method if faulty, - // because they are often far from a ball shape (e.g. flamethrower). Because of that flame coming from a flamethrower - // can be rendered as underwater, when the player is close to the water surface, even if particles don't touch the water. - // To mitigate this issue use particle emitter center point for sorting. - particle_emitter_g_portal_object_add_hook.call_target(emitter, pos, cull_pos, radius, render_function, has_alpha, nullptr, &emitter->world_pos, &emitter->world_pos, lights_enabled, use_static_lights); - }, -}; +CallHook + particle_emitter_g_portal_object_add_hook{ + 0x00497C82, + [](rf::ParticleEmitter* emitter, const rf::Vector3* pos, const rf::Vector3* cull_pos, float radius, + void (*render_function)(int, rf::GSolid*), bool has_alpha, const rf::Plane*, const rf::Vector3*, + const rf::Vector3*, bool lights_enabled, bool use_static_lights) { + // Use world_pos field to hold the pos because pos points to a local variable and g_portal_object_add saves + // the pointer for a later use. Note that world_pos is not used anywhere else except for a code after + // 0x00495216 that is skipped in DF. + emitter->world_pos = *pos; + // Use world_pos as bbox_min and bbox_max. Those fields are not used for culling, but for + // sorting objects in respect to the liquid surface. + // If the player is above liquid surface the engine renders first objects that are partially or fully under + // the liquid surface, then the surface itself and ends with rendering objects that are fully above the + // surface. If the player is below the surface the engine first renders objects partially above the surface, + // then the surface and ends with objects fully below the surface. To determine if object is fully or + // partially above/below the surface the engine estimates max and min Y for the object. Normally pos.y +/- + // radius are used for that estimation, but for particle emitters this method if faulty, because they are + // often far from a ball shape (e.g. flamethrower). Because of that flame coming from a flamethrower can be + // rendered as underwater, when the player is close to the water surface, even if particles don't touch the + // water. To mitigate this issue use particle emitter center point for sorting. + particle_emitter_g_portal_object_add_hook.call_target( + emitter, pos, cull_pos, radius, render_function, has_alpha, nullptr, &emitter->world_pos, + &emitter->world_pos, lights_enabled, use_static_lights + ); + }, + }; void particle_do_patch() { diff --git a/game_patch/object/weapon.cpp b/game_patch/object/weapon.cpp index 55d89ed5d..98ded21ac 100644 --- a/game_patch/object/weapon.cpp +++ b/game_patch/object/weapon.cpp @@ -56,9 +56,9 @@ FunHook weapon_move_one_hook{ bool has_gravity_flag = weapon->p_data.flags & 1; bool check_y_axis = !(has_gravity_flag || weapon->info->thrust_lifetime_seconds > 0.0f); auto& pos = weapon->pos; - if (pos.x < level_aabb_min.x - margin || pos.x > level_aabb_max.x + margin - || pos.z < level_aabb_min.z - margin || pos.z > level_aabb_max.z + margin - || (check_y_axis && (pos.y < level_aabb_min.y - margin || pos.y > level_aabb_max.y + margin))) { + if (pos.x < level_aabb_min.x - margin || pos.x > level_aabb_max.x + margin || + pos.z < level_aabb_min.z - margin || pos.z > level_aabb_max.z + margin || + (check_y_axis && (pos.y < level_aabb_min.y - margin || pos.y > level_aabb_max.y + margin))) { // Weapon is outside the level - delete it rf::obj_flag_dead(weapon); } @@ -122,7 +122,9 @@ CallHook weapon_hit_wall_obj_apply_r [](rf::Vector3& epicenter, float damage, float radius, int killer_handle, int damage_type) { auto& collide_out = *reinterpret_cast(&epicenter); auto new_epicenter = epicenter + collide_out.hit_normal * 0.0001f; - weapon_hit_wall_obj_apply_radius_damage_hook.call_target(new_epicenter, damage, radius, killer_handle, damage_type); + weapon_hit_wall_obj_apply_radius_damage_hook.call_target( + new_epicenter, damage, radius, killer_handle, damage_type + ); }, }; diff --git a/game_patch/os/autocomplete.cpp b/game_patch/os/autocomplete.cpp index f1b6c002c..b7f7b0b94 100644 --- a/game_patch/os/autocomplete.cpp +++ b/game_patch/os/autocomplete.cpp @@ -17,9 +17,9 @@ void console_show_cmd_help(rf::console::Command* cmd) int console_auto_complete_get_component(int offset, std::string& result) { - const char *begin = rf::console::cmd_line + offset; - const char *end = nullptr; - const char *next; + const char* begin = rf::console::cmd_line + offset; + const char* end = nullptr; + const char* next; if (begin[0] == '"') { ++begin; @@ -51,7 +51,8 @@ void console_auto_complete_put_component(int offset, const std::string& componen } rf::console::cmd_line_len = offset + len; if (finished) - rf::console::cmd_line_len += snprintf(rf::console::cmd_line + rf::console::cmd_line_len, max_len - rf::console::cmd_line_len, " "); + rf::console::cmd_line_len += + snprintf(rf::console::cmd_line + rf::console::cmd_line_len, max_len - rf::console::cmd_line_len, " "); } template @@ -62,8 +63,9 @@ void console_auto_complete_print_suggestions(T& suggestions, F mapping_fun) } } -void console_auto_complete_update_common_prefix(std::string& common_prefix, const std::string& value, bool& first, - bool case_sensitive = false) +void console_auto_complete_update_common_prefix( + std::string& common_prefix, const std::string& value, bool& first, bool case_sensitive = false +) { if (first) { first = false; diff --git a/game_patch/os/commands.cpp b/game_patch/os/commands.cpp index 267fa9481..506e2361e 100644 --- a/game_patch/os/commands.cpp +++ b/game_patch/os/commands.cpp @@ -14,14 +14,15 @@ ConsoleCommand2 dot_cmd{ ".", - [] (const std::string pattern) { + [](const std::string pattern) { for (i32 i = 0; i < rf::console::num_commands; ++i) { const rf::console::Command* cmd = g_commands_buffer[i]; - if (string_contains_ignore_case(cmd->name, pattern) - || (cmd->help && string_contains_ignore_case(cmd->help, pattern))) { - if (cmd->help) { - rf::console::print("{} - {}", cmd->name, cmd->help); - } else { + if (string_contains_ignore_case(cmd->name, pattern) || + (cmd->help && string_contains_ignore_case(cmd->help, pattern))) { + if (cmd->help) { + rf::console::print("{} - {}", cmd->name, cmd->help); + } + else { rf::console::print("{}", cmd->name); } } @@ -85,7 +86,8 @@ ConsoleCommand2 level_info_cmd{ rf::console::print("Name: {}", rf::level.name); rf::console::print("Author: {}", rf::level.author); rf::console::print("Date: {}", rf::level.level_date); - } else { + } + else { rf::console::print("No level loaded!"); } }, @@ -103,7 +105,7 @@ ConsoleCommand2 server_password_cmd{ if (!rf::is_multi || !rf::is_server) { rf::console::print("This command can only be run as a server!"); return; - } + } if (new_password) { rf::netgame.password = new_password.value().c_str(); @@ -119,16 +121,14 @@ ConsoleCommand2 server_password_cmd{ }; // only allow verify_level if a level is loaded (avoid a crash if command is run in menu) -FunHook verify_level_cmd_hook{ - 0x0045E1F0, - []() { - if (rf::level.flags & rf::LEVEL_LOADED) { - verify_level_cmd_hook.call_target(); - } else { - rf::console::print("No level loaded!"); - } - } -}; +FunHook verify_level_cmd_hook{0x0045E1F0, []() { + if (rf::level.flags & rf::LEVEL_LOADED) { + verify_level_cmd_hook.call_target(); + } + else { + rf::console::print("No level loaded!"); + } + }}; static void register_builtin_command(const char* name, const char* description, uintptr_t addr) { diff --git a/game_patch/os/console.cpp b/game_patch/os/console.cpp index cf98848d2..07c768bec 100644 --- a/game_patch/os/console.cpp +++ b/game_patch/os/console.cpp @@ -51,7 +51,8 @@ FunHook gameseq_process_hook{ 0x00434230, []() { int menu_id = gameseq_process_hook.call_target(); - if (menu_id == rf::GS_MULTI_LIMBO) // hide cursor when changing level - hackfixed in RF by changing rendering logic + if (menu_id == + rf::GS_MULTI_LIMBO) // hide cursor when changing level - hackfixed in RF by changing rendering logic rf::mouse_set_visible(false); else if (menu_id == rf::GS_MAIN_MENU) rf::mouse_set_visible(true); @@ -78,7 +79,7 @@ CodeInjection console_run_cmd_call_handler_patch{ CallHook console_process_kbd_get_text_from_clipboard_hook{ 0x0050A2FD, - [](char *buf, int max_len) { + [](char* buf, int max_len) { max_len = std::min(max_len, max_cmd_line_len - rf::console::cmd_line_len); console_process_kbd_get_text_from_clipboard_hook.call_target(buf, max_len); }, @@ -127,7 +128,6 @@ static FunHook console_draw_client_hook{ }, }; - static CallHook console_put_char_new_line_hook{ 0x0050A081, [](char c) { @@ -160,7 +160,6 @@ static CodeInjection console_handle_input_injection{ static CodeInjection console_handle_input_history_injection{ 0x0050A09B, [](auto& regs) { - if (rf::console::history_max_index >= 0 && std::strcmp(rf::console::history[rf::console::history_max_index], rf::console::cmd_line) == 0) { // Command was repeated - do not add it to the history diff --git a/game_patch/os/console.h b/game_patch/os/console.h index fcf5cff59..4f30b34f9 100644 --- a/game_patch/os/console.h +++ b/game_patch/os/console.h @@ -114,8 +114,7 @@ class ConsoleCommand2 : public BaseCommand T m_handler; public: - HandlerWrapper(T handler) : m_handler(handler) - {} + HandlerWrapper(T handler) : m_handler(handler) {} void operator()() { @@ -129,10 +128,8 @@ class ConsoleCommand2 : public BaseCommand const char* m_usage_text; public: - ConsoleCommand2(const char* name, T handler, const char* description = nullptr, - const char* usage_text = nullptr) : - BaseCommand(name, description), - m_handler_wrapper(handler), m_usage_text(usage_text) + ConsoleCommand2(const char* name, T handler, const char* description = nullptr, const char* usage_text = nullptr) : + BaseCommand(name, description), m_handler_wrapper(handler), m_usage_text(usage_text) {} private: @@ -177,7 +174,7 @@ class DcCommandAlias : public BaseCommand private: void handler() override { - auto handler_fun = reinterpret_cast(m_target_cmd.func); + auto handler_fun = reinterpret_cast(m_target_cmd.func); handler_fun(&m_target_cmd); } }; diff --git a/game_patch/os/frametime.cpp b/game_patch/os/frametime.cpp index 5b4373e91..6af6f25f1 100644 --- a/game_patch/os/frametime.cpp +++ b/game_patch/os/frametime.cpp @@ -91,7 +91,8 @@ FunHook frametime_reset_hook{ frametime_reset_hook.call_target(); // Set initial FPS limit - unsigned max_fps = rf::is_dedicated_server ? g_game_config.server_max_fps.value() : g_game_config.max_fps.value(); + unsigned max_fps = + rf::is_dedicated_server ? g_game_config.server_max_fps.value() : g_game_config.max_fps.value(); rf::frametime_min = 1.0f / static_cast(max_fps); }, }; @@ -119,9 +120,7 @@ ConsoleCommand2 max_fps_cmd{ ConsoleCommand2 frametime_graph_cmd{ "frametime_graph", - []() { - g_show_frametime_graph = !g_show_frametime_graph; - }, + []() { g_show_frametime_graph = !g_show_frametime_graph; }, }; void frametime_apply_patch() diff --git a/game_patch/os/os.cpp b/game_patch/os/os.cpp index e35060c6e..db451d88f 100644 --- a/game_patch/os/os.cpp +++ b/game_patch/os/os.cpp @@ -36,8 +36,7 @@ LRESULT WINAPI wnd_proc(HWND wnd_handle, UINT msg, WPARAM w_param, LPARAM l_para { // xlog::trace("{:08x}: msg {} {:x} {:x}", GetTickCount(), get_win_msg_name(msg), w_param, l_param); if (rf::main_wnd && wnd_handle != rf::main_wnd) { - xlog::warn("Got unknown window in the window procedure: hwnd {} msg {}", - static_cast(wnd_handle), msg); + xlog::warn("Got unknown window in the window procedure: hwnd {} msg {}", static_cast(wnd_handle), msg); } for (int i = 0; i < rf::num_msg_handlers; ++i) { @@ -45,45 +44,45 @@ LRESULT WINAPI wnd_proc(HWND wnd_handle, UINT msg, WPARAM w_param, LPARAM l_para } switch (msg) { - case WM_ACTIVATE: - if (!rf::is_dedicated_server) { - // Show cursor if window is not active - if (w_param) { - ShowCursor(FALSE); - while (ShowCursor(FALSE) >= 0) - ; - } - else { - ShowCursor(TRUE); - while (ShowCursor(TRUE) < 0) - ; + case WM_ACTIVATE: + if (!rf::is_dedicated_server) { + // Show cursor if window is not active + if (w_param) { + ShowCursor(FALSE); + while (ShowCursor(FALSE) >= 0) + ; + } + else { + ShowCursor(TRUE); + while (ShowCursor(TRUE) < 0) + ; + } } - } - rf::is_main_wnd_active = w_param; - return 0; //DefWindowProcA(wnd_handle, msg, w_param, l_param); + rf::is_main_wnd_active = w_param; + return 0; // DefWindowProcA(wnd_handle, msg, w_param, l_param); - case WM_QUIT: - case WM_CLOSE: - case WM_DESTROY: - rf::close_app_req = 1; - break; + case WM_QUIT: + case WM_CLOSE: + case WM_DESTROY: + rf::close_app_req = 1; + break; - case WM_PAINT: - if (rf::is_dedicated_server) - ++rf::console_redraw_counter; - return DefWindowProcA(wnd_handle, msg, w_param, l_param); + case WM_PAINT: + if (rf::is_dedicated_server) + ++rf::console_redraw_counter; + return DefWindowProcA(wnd_handle, msg, w_param, l_param); - default: - return DefWindowProcA(wnd_handle, msg, w_param, l_param); + default: + return DefWindowProcA(wnd_handle, msg, w_param, l_param); } return 0; } -static FunHook os_init_window_server_hook{ +static FunHook os_init_window_server_hook{ 0x00524B70, - [](const char *wclass, const char *title, bool hooks, bool server_console) { + [](const char* wclass, const char* title, bool hooks, bool server_console) { if (server_console) { win32_console_init(); } @@ -103,7 +102,7 @@ static FunHook os_close_hook{ static FunHook os_parse_params_hook{ 0x00523320, - [](char *cmdline, bool skip_first) { + [](char* cmdline, bool skip_first) { std::string buf; bool quote = false; while (true) { @@ -113,8 +112,9 @@ static FunHook os_parse_params_hook{ if ((!quote && c == ' ') || c == '\0') { if (skip_first) { skip_first = false; - } else { - rf::CmdArg &cmd_arg = rf::cmdline_args[rf::cmdline_num_args++]; + } + else { + rf::CmdArg& cmd_arg = rf::cmdline_args[rf::cmdline_num_args++]; cmd_arg.arg = static_cast(rf::operator_new(buf.size() + 1)); std::strcpy(cmd_arg.arg, buf.c_str()); cmd_arg.is_done = false; @@ -123,9 +123,11 @@ static FunHook os_parse_params_hook{ if (!c) { break; } - } else if (c == '"') { + } + else if (c == '"') { quote = !quote; - } else { + } + else { buf += c; } } diff --git a/game_patch/os/win32_console.cpp b/game_patch/os/win32_console.cpp index b68ab0173..cb351a8c0 100644 --- a/game_patch/os/win32_console.cpp +++ b/game_patch/os/win32_console.cpp @@ -55,7 +55,10 @@ static void print_cmd_input_line() GetConsoleScreenBufferInfo(win32_console_output_handle, &scr_buf_info); WriteConsoleA(win32_console_output_handle, "] ", 2, nullptr, nullptr); unsigned offset = std::max(0, rf::console::cmd_line_len - scr_buf_info.dwSize.X + 3); - WriteConsoleA(win32_console_output_handle, rf::console::cmd_line + offset, rf::console::cmd_line_len - offset, nullptr, nullptr); + WriteConsoleA( + win32_console_output_handle, rf::console::cmd_line + offset, rf::console::cmd_line_len - offset, nullptr, + nullptr + ); win32_console_input_line_printed = true; } @@ -102,8 +105,10 @@ void win32_console_init() char* ptr = std::format_to(buf, "(error {})", GetLastError()); *ptr = '\0'; } - xlog::info("Standard output info: path_name {}, file_type: {}, handle {}", - buf, GetFileType(win32_console_output_handle), win32_console_output_handle); + xlog::info( + "Standard output info: path_name {}, file_type: {}, handle {}", buf, GetFileType(win32_console_output_handle), + win32_console_output_handle + ); if (!GetFileType(win32_console_output_handle)) { if (!AllocConsole()) { @@ -115,8 +120,10 @@ void win32_console_init() std::freopen("CONOUT$", "w", stdout); std::freopen("CONOUT$", "w", stderr); std::freopen("CONIN$", "r", stdin); - xlog::info("Allocated new console, standard output: file_type {}, handle {}", - GetFileType(win32_console_output_handle), win32_console_output_handle); + xlog::info( + "Allocated new console, standard output: file_type {}, handle {}", GetFileType(win32_console_output_handle), + win32_console_output_handle + ); } SetConsoleCtrlHandler(console_ctrl_handler, TRUE); @@ -125,7 +132,7 @@ void win32_console_init() win32_console_is_output_redirected = !GetConsoleMode(win32_console_output_handle, &mode); win32_console_is_input_redirected = !GetConsoleMode(win32_console_input_handle, &mode); if (!win32_console_is_input_redirected) { - SetConsoleMode(win32_console_input_handle, mode & ~ ENABLE_ECHO_INPUT); + SetConsoleMode(win32_console_input_handle, mode & ~ENABLE_ECHO_INPUT); } // std::thread input_thread(input_thread_proc); @@ -236,7 +243,8 @@ void win32_console_new_line() void win32_console_update() { static char prev_cmd_line[sizeof(rf::console::cmd_line)]; - if (std::strncmp(rf::console::cmd_line, prev_cmd_line, std::size(prev_cmd_line)) != 0 || !win32_console_input_line_printed) { + if (std::strncmp(rf::console::cmd_line, prev_cmd_line, std::size(prev_cmd_line)) != 0 || + !win32_console_input_line_printed) { reset_console_cursor_column(true); print_cmd_input_line(); std::strcpy(prev_cmd_line, rf::console::cmd_line); @@ -257,7 +265,9 @@ void win32_console_poll_input() if (!ReadConsoleInput(input_handle, &input_record, 1, &num_read) || num_read == 0) break; if (input_record.EventType == KEY_EVENT) { - rf::key_process_event(input_record.Event.KeyEvent.wVirtualScanCode, input_record.Event.KeyEvent.bKeyDown, 0); + rf::key_process_event( + input_record.Event.KeyEvent.wVirtualScanCode, input_record.Event.KeyEvent.bKeyDown, 0 + ); } } } diff --git a/game_patch/purefaction/pf.cpp b/game_patch/purefaction/pf.cpp index 143e2b9c3..181d5631f 100644 --- a/game_patch/purefaction/pf.cpp +++ b/game_patch/purefaction/pf.cpp @@ -43,7 +43,7 @@ static void send_pf_announce_player_packet(rf::Player* player, pf_pure_status pu } } -static void process_pf_player_announce_packet(const void* data, size_t len, [[ maybe_unused ]] const rf::NetAddr& addr) +static void process_pf_player_announce_packet(const void* data, size_t len, [[maybe_unused]] const rf::NetAddr& addr) { // Receive: client <- server if (rf::is_server) { @@ -66,10 +66,10 @@ static void process_pf_player_announce_packet(const void* data, size_t len, [[ m xlog::trace("PF player_announce packet: player {} is_pure {}", announce_packet.player_id, announce_packet.is_pure); if (announce_packet.player_id == rf::local_player->net_data->player_id) { - static const char* pf_verification_status_names[] = { "none", "blue", "gold", "red" }; - const auto* pf_verification_status = - announce_packet.is_pure < std::size(pf_verification_status_names) - ? pf_verification_status_names[announce_packet.is_pure] : "unknown"; + static const char* pf_verification_status_names[] = {"none", "blue", "gold", "red"}; + const auto* pf_verification_status = announce_packet.is_pure < std::size(pf_verification_status_names) + ? pf_verification_status_names[announce_packet.is_pure] + : "unknown"; xlog::info("PF Verification Status: {} ({})", pf_verification_status, announce_packet.is_pure); } } @@ -122,7 +122,7 @@ static void send_pf_player_stats_packet(rf::Player* player) pf_send_reliable_packet(player, packet_buf, packet_len); } -static void process_pf_player_stats_packet(const void* data, size_t len, [[ maybe_unused ]] const rf::NetAddr& addr) +static void process_pf_player_stats_packet(const void* data, size_t len, [[maybe_unused]] const rf::NetAddr& addr) { // Receive: client <- server if (rf::is_server) { @@ -166,7 +166,9 @@ static void process_pf_player_stats_packet(const void* data, size_t len, [[ mayb } } -static void process_pf_players_request_packet([[ maybe_unused ]] const void* data, [[ maybe_unused ]] size_t len, const rf::NetAddr& addr) +static void process_pf_players_request_packet( + [[maybe_unused]] const void* data, [[maybe_unused]] size_t len, const rf::NetAddr& addr +) { xlog::trace("PF players_request packet"); @@ -212,8 +214,7 @@ bool pf_process_packet(const void* data, int len, const rf::NetAddr& addr, rf::P std::memcpy(&header, data, sizeof(header)); auto packet_type = static_cast(header.type); - switch (packet_type) - { + switch (packet_type) { case pf_packet_type::announce_player: process_pf_player_announce_packet(data, len, addr); break; @@ -248,7 +249,7 @@ bool pf_process_raw_unreliable_packet(const void* data, int len, const rf::NetAd return false; } -void pf_player_init([[ maybe_unused ]] rf::Player* player) +void pf_player_init([[maybe_unused]] rf::Player* player) { assert(rf::is_server); pf_ac_init_player(player); @@ -277,9 +278,13 @@ int pf_get_player_ac_level(rf::Player* player) { pf_pure_status status = pf_ac_get_pure_status(player); switch (status) { - case pf_pure_status::blue: return 2; - case pf_pure_status::gold: return 3; - case pf_pure_status::fail: return 1; - default: return 0; + case pf_pure_status::blue: + return 2; + case pf_pure_status::gold: + return 3; + case pf_pure_status::fail: + return 1; + default: + return 0; } } diff --git a/game_patch/purefaction/pf_ac.h b/game_patch/purefaction/pf_ac.h index 943e2f683..280365f4b 100644 --- a/game_patch/purefaction/pf_ac.h +++ b/game_patch/purefaction/pf_ac.h @@ -4,7 +4,8 @@ #include "pf_packets.h" // Forward declarations -namespace rf { +namespace rf +{ struct NetAddr; struct Player; } diff --git a/game_patch/purefaction/pf_ac_stubs.cpp b/game_patch/purefaction/pf_ac_stubs.cpp index 6b03b32c7..b441ecb69 100644 --- a/game_patch/purefaction/pf_ac_stubs.cpp +++ b/game_patch/purefaction/pf_ac_stubs.cpp @@ -8,13 +8,9 @@ bool pf_ac_process_packet(const void*, size_t, const rf::NetAddr&, rf::Player*) return false; } -void pf_ac_init_player(rf::Player*) -{ -} +void pf_ac_init_player(rf::Player*) {} -void pf_ac_verify_player(rf::Player*) -{ -} +void pf_ac_verify_player(rf::Player*) {} pf_pure_status pf_ac_get_pure_status(rf::Player*) { diff --git a/game_patch/purefaction/pf_packets.h b/game_patch/purefaction/pf_packets.h old mode 100755 new mode 100644 index 2da2f5f75..17ad04ffd --- a/game_patch/purefaction/pf_packets.h +++ b/game_patch/purefaction/pf_packets.h @@ -28,14 +28,14 @@ enum class pf_pure_status : uint8_t struct rf_packet_header { - uint8_t type; // see pf_packet_type + uint8_t type; // see pf_packet_type uint16_t size; // size of data without header (PF usually includes header size here) }; struct pf_player_stats_packet { rf_packet_header hdr; // player_stats - uint8_t version; // current version is 2 + uint8_t version; // current version is 2 uint8_t player_count; struct player_stats @@ -60,9 +60,9 @@ constexpr uint8_t pf_player_stats_packet_version = 2; struct pf_player_announce_packet { rf_packet_header hdr; // announce_player - uint8_t version; // current version is 2 + uint8_t version; // current version is 2 uint8_t player_id; - uint8_t is_pure; // 0 non-pure, 1 pure (public), 2 pure (match), 3 check failed, 4 unused, 5 rfsb + uint8_t is_pure; // 0 non-pure, 1 pure (public), 2 pure (match), 3 check failed, 4 unused, 5 rfsb uint8_t reserved[3]; // PF bug workaround (PF expects size field to include header size) }; @@ -71,7 +71,7 @@ constexpr uint8_t pf_announce_player_packet_version = 2; struct pf_players_packet { rf_packet_header hdr; // players - uint8_t version; // current version is 1 + uint8_t version; // current version is 1 uint8_t show_ip; #ifdef PSEUDOCODE struct player_info @@ -92,8 +92,9 @@ constexpr uint32_t pf_game_info_signature = 0xEFBEADDE; constexpr uint16_t pf_game_info_version = 0x030DF; // payload added to game_info packet to allow detection of Pure Faction servers -struct pf_game_info_packet_suffix { - uint32_t signature; // 0xEFBEADDE +struct pf_game_info_packet_suffix +{ + uint32_t signature; // 0xEFBEADDE uint16_t pf_version; // current is 0x030DF }; diff --git a/game_patch/purefaction/todo.marker b/game_patch/purefaction/todo.marker new file mode 100644 index 000000000..e69de29bb diff --git a/game_patch/rf/ai.h b/game_patch/rf/ai.h index 3de9a6976..657ba2f8f 100644 --- a/game_patch/rf/ai.h +++ b/game_patch/rf/ai.h @@ -21,13 +21,13 @@ namespace rf struct AiPathInfo { int num_nodes; - GPathNode *nodes[4]; + GPathNode* nodes[4]; int previous_goal; int current_goal; GPathNode start_node; GPathNode end_node; - GPathNode *adjacent_node1; - GPathNode *adjacent_node2; + GPathNode* adjacent_node1; + GPathNode* adjacent_node2; Timestamp shortcut_next_check; int waypoint_list_index; int goal_waypoint_index; @@ -108,7 +108,6 @@ namespace rf AI_COVER_STYLE_STAND = 0x2, }; - enum AiCooperation { AI_UNCOOPERATIVE = 0x0, @@ -116,10 +115,9 @@ namespace rf AI_COOPERATIVE = 0x2, }; - struct AiInfo { - Entity *ep; + Entity* ep; int current_primary_weapon; int current_secondary_weapon; int ammo[32]; @@ -218,7 +216,7 @@ namespace rf static_assert(sizeof(AiInfo) == 0x534); static auto& ai_get_attack_range = addr_as_ref(0x004077A0); - static auto& ai_has_weapon = addr_as_ref(0x00403250); + static auto& ai_has_weapon = addr_as_ref(0x00403250); static auto& ai_pause = addr_as_ref(0x005AF46D); } diff --git a/game_patch/rf/bmpman.h b/game_patch/rf/bmpman.h index 6b1c8f663..cf1e8dfe9 100644 --- a/game_patch/rf/bmpman.h +++ b/game_patch/rf/bmpman.h @@ -18,7 +18,7 @@ namespace rf::bm FORMAT_8888_ARGB = 0x7, FORMAT_88_BUMPDUDV = 0x8, // not supported by D3D routines #ifdef DASH_FACTION - // custom Dash Faction formats + // custom Dash Faction formats FORMAT_888_BGR = 0x9, // used by lightmaps FORMAT_RENDER_TARGET = 0x10, // texture is used as render target FORMAT_DXT1 = 0x11, @@ -78,16 +78,20 @@ namespace rf::bm }; static_assert(sizeof(BitmapEntry) == 0x6C); - static auto& load = addr_as_ref(0x0050F6A0); + static auto& load = addr_as_ref(0x0050F6A0); static auto& create = addr_as_ref(0x005119C0); - static auto& convert_format = addr_as_ref(0x0055DD20); - static auto& get_dimensions = addr_as_ref(0x00510630); + static auto& convert_format = + addr_as_ref( + 0x0055DD20 + ); + static auto& get_dimensions = addr_as_ref(0x00510630); static auto& get_filename = addr_as_ref(0x00511710); static auto& get_format = addr_as_ref(0x005106F0); static auto& get_type = addr_as_ref(0x0050F350); static auto& get_cache_slot = addr_as_ref(0x0050F440); - static auto& get_mipmap_info = addr_as_ref(0x00510680); - static auto& lock = addr_as_ref(0x00510780); + static auto& get_mipmap_info = + addr_as_ref(0x00510680); + static auto& lock = addr_as_ref(0x00510780); static auto& unlock = addr_as_ref(0x00511700); static auto& bitmaps = addr_as_ref(0x017C80C4); diff --git a/game_patch/rf/character.h b/game_patch/rf/character.h index 5cc8b5e4f..7b4ac8f84 100644 --- a/game_patch/rf/character.h +++ b/game_patch/rf/character.h @@ -21,14 +21,14 @@ namespace rf bool internally_allocated = 0; int base_usage_count = 0; int instance_usage_count = 0; - void *animation_data = nullptr; + void* animation_data = nullptr; bool has_morph_vertices() const { return AddrCaller{0x0053A820}.this_call(this); } - void morph(rf::Vector3 *morphed_vecs, int num_vecs, int time, short *orig_vecs_map, int num_orig_vecs) const + void morph(rf::Vector3* morphed_vecs, int num_vecs, int time, short* orig_vecs_map, int num_orig_vecs) const { AddrCaller{0x0053A370}.this_call(this, morphed_vecs, num_vecs, time, orig_vecs_map, num_orig_vecs); } @@ -53,7 +53,7 @@ namespace rf struct CharacterTag { - const char *name; + const char* name; Matrix43 trans; int parent_index; }; @@ -68,7 +68,7 @@ namespace rf struct CharacterMesh { V3d v3d_file; - V3dMesh *mesh; + V3dMesh* mesh; }; struct Character @@ -79,7 +79,7 @@ namespace rf Bone bones[50]; ubyte bone_order_list[50]; int num_anims; - Skeleton *animations[172]; + Skeleton* animations[172]; bool anim_is_state[172]; int num_tags; CharacterTag tags[32]; @@ -113,12 +113,12 @@ namespace rf bool state_trigger_elapsed[2]; int dominant_state_index; bool holding_last_action_frame; - Character *base_character; - CharacterInstance *next; - CharacterInstance *prev; + Character* base_character; + CharacterInstance* next; + CharacterInstance* prev; }; - static auto& skeleton_link_base = addr_as_ref(0x00539D00); - static auto& skeleton_unlink_base = addr_as_ref(0x00539D20); - static auto& skeleton_page_in = addr_as_ref(0x0053A980); + static auto& skeleton_link_base = addr_as_ref(0x00539D00); + static auto& skeleton_unlink_base = addr_as_ref(0x00539D20); + static auto& skeleton_page_in = addr_as_ref(0x0053A980); } diff --git a/game_patch/rf/clutter.h b/game_patch/rf/clutter.h index fec5b3beb..a748bf4f4 100644 --- a/game_patch/rf/clutter.h +++ b/game_patch/rf/clutter.h @@ -9,8 +9,8 @@ namespace rf struct Clutter : Object { - struct Clutter *next; - struct Clutter *prev; + struct Clutter* next; + struct Clutter* prev; ClutterInfo* info; int info_index; int corpse_index; @@ -20,7 +20,7 @@ namespace rf int dmg_type_that_killed_me; Timestamp emitter_kill_timestamp; Timestamp corpse_create_timestamp; - VMesh *corpse_vmesh_handle; + VMesh* corpse_vmesh_handle; int current_skin_index; VArray links; bool already_spawned_glass; @@ -36,11 +36,10 @@ namespace rf MONITOR_STATE_STATIC = 0x2, }; - struct Monitor { - Monitor *next; - Monitor *prev; + Monitor* next; + Monitor* prev; int state; int clutter_handle; int camera_handle; @@ -66,5 +65,5 @@ namespace rf static auto& clutter_list = addr_as_ref(0x005C9360); static auto& monitor_list = addr_as_ref(0x005C98A8); - static auto& clutter_restore_mesh = addr_as_ref(0x00410ED0); + static auto& clutter_restore_mesh = addr_as_ref(0x00410ED0); } diff --git a/game_patch/rf/collide.h b/game_patch/rf/collide.h index 980a00359..36d664edc 100644 --- a/game_patch/rf/collide.h +++ b/game_patch/rf/collide.h @@ -13,7 +13,8 @@ namespace rf void* face; }; - static auto& collide_linesegment_level_for_multi = - addr_as_ref(0x0049C690); + static auto& collide_linesegment_level_for_multi = addr_as_ref(0x0049C690); } diff --git a/game_patch/rf/corpse.h b/game_patch/rf/corpse.h index f58d09a79..3d5335a93 100644 --- a/game_patch/rf/corpse.h +++ b/game_patch/rf/corpse.h @@ -7,8 +7,8 @@ namespace rf { struct Corpse : Object { - Corpse *next; - Corpse *prev; + Corpse* next; + Corpse* prev; float create_time; float lifetime_seconds; int corpse_flags; @@ -21,9 +21,9 @@ namespace rf int corpse_drop_vmesh_anim_index; int corpse_carry_vmesh_anim_index; int corpse_pose; - VMesh *helmet_v3d_handle; + VMesh* helmet_v3d_handle; int item_handle; - EntityFireInfo *fire_info; + EntityFireInfo* fire_info; int body_drop_sound_handle; Color ambient_color; ShadowInfo shadow_info; @@ -31,7 +31,7 @@ namespace rf static_assert(sizeof(Corpse) == 0x318); static auto& corpse_from_handle = addr_as_ref(0x004174C0); - static auto& corpse_restore_mesh = addr_as_ref(0x00417530); + static auto& corpse_restore_mesh = addr_as_ref(0x00417530); static auto& corpse_list = addr_as_ref(0x005CABB8); } diff --git a/game_patch/rf/crt.h b/game_patch/rf/crt.h index 874101992..20cda0dd1 100644 --- a/game_patch/rf/crt.h +++ b/game_patch/rf/crt.h @@ -5,7 +5,7 @@ namespace rf { // RF stdlib functions are not compatible with GCC - static auto& rf_free = addr_as_ref(0x00573C71); + static auto& rf_free = addr_as_ref(0x00573C71); static auto& rf_malloc = addr_as_ref(0x00573B37); static auto& operator_new = addr_as_ref(0x00573619); static auto& operator_delete = addr_as_ref(0x0057360E); diff --git a/game_patch/rf/cutscene.h b/game_patch/rf/cutscene.h index 5730abb42..413bf66e2 100644 --- a/game_patch/rf/cutscene.h +++ b/game_patch/rf/cutscene.h @@ -31,8 +31,8 @@ namespace rf Timestamp next_stage_timestamp; Timestamp start_path_timestamp; Timestamp stop_path_timestamp; - CutsceneScript *current_script; - CutscenePath *current_path; + CutsceneScript* current_script; + CutscenePath* current_path; Vector3 current_cam_pos; Matrix3 current_cam_orient; float path_travel_time; diff --git a/game_patch/rf/entity.h b/game_patch/rf/entity.h index a52609392..186ef6c3d 100644 --- a/game_patch/rf/entity.h +++ b/game_patch/rf/entity.h @@ -166,13 +166,13 @@ namespace rf int force_launch_sound; int num_state_anims; int num_action_anims; - EntityAnimInfo *state_anims; - EntityAnimInfo *action_anims; + EntityAnimInfo* state_anims; + EntityAnimInfo* action_anims; float fov_dot; int num_state_weapon_anims[64]; int num_action_weapon_anims[64]; - EntityAnimInfo *state_weapon_anims[64]; - EntityAnimInfo *action_weapon_anims[64]; + EntityAnimInfo* state_weapon_anims[64]; + EntityAnimInfo* action_weapon_anims[64]; FArray csphere_overrides; FArray collision_spheres; FArray crouch_collision_spheres; @@ -244,11 +244,11 @@ namespace rf struct Entity : Object { - Entity *next; - Entity *prev; - EntityInfo *info; + Entity* next; + Entity* prev; + EntityInfo* info; int info_index; - EntityInfo *info2; + EntityInfo* info2; AiInfo ai; Vector3 eye_pos; Matrix3 eye_orient; @@ -269,12 +269,12 @@ namespace rf int custom_death_anim_index; float fov_cos; int engine_rev_sound_handle; - VMesh *primary_warmup_vfx_handle; - VMesh *cockpit_vfx_handle; + VMesh* primary_warmup_vfx_handle; + VMesh* cockpit_vfx_handle; int nano_shield; int damage_sound_instance; - MoveMode *move_mode; - Matrix3 *move_parent_orient; + MoveMode* move_mode; + Matrix3* move_parent_orient; EntityControlData control_data; float max_vel; EntitySpeed current_speed; @@ -285,8 +285,8 @@ namespace rf EntityAnim action_anims[45]; EntityAnim default_state_anims[23]; EntityAnim default_action_anims[45]; - EntityAnim *state_weapon_anims[64]; - EntityAnim *action_weapon_anims[64]; + EntityAnim* state_weapon_anims[64]; + EntityAnim* action_weapon_anims[64]; int last_idle_anim_index_maybe_unused; int last_cust_anim_index_maybe_unused; Timestamp primary_muzzle_timestamp; @@ -315,24 +315,24 @@ namespace rf int driller_sound_handle; int flame_handle; EntityFireInfo* entity_fire_handle; - Vector3 *collision_sphere_current_pos; + Vector3* collision_sphere_current_pos; Vector3 board_vehicle_local_pos; - ClimbRegion *ignored_climb_region; - ClimbRegion *current_climb_region; + ClimbRegion* ignored_climb_region; + ClimbRegion* current_climb_region; int mouth_tag; - ParticleEmitter *breath_emitter; + ParticleEmitter* breath_emitter; Timestamp last_fired_timestamp; int voice_handle; int last_voice_anim_index; float speech_duration; Timestamp play_next_speech_anim; - VMesh *helmet_v3d_handle; + VMesh* helmet_v3d_handle; Timestamp next_splash_allowed; VArray glares; int tracer_countdown; int weapon_custom_mode_bitmap; int weapon_silencer_bitfield; - Player *local_player; + Player* local_player; Vector3 min_rel_eye_phb; Vector3 max_rel_eye_phb; int killer_handle; @@ -350,14 +350,14 @@ namespace rf int mp_character_id; int powerup_light_handle; int field_1488; - VMesh *respawn_vfx_handle; + VMesh* respawn_vfx_handle; Timestamp field_1490; }; static_assert(sizeof(Entity) == 0x1494); struct EntityFireInfo { - ParticleEmitter *emitters[4]; + ParticleEmitter* emitters[4]; int parent_hobj; int lower_leg_l_bone; int lower_leg_r_bone; @@ -368,14 +368,14 @@ namespace rf bool time_limited; float time; int field_34; - EntityFireInfo *next; - EntityFireInfo *prev; + EntityFireInfo* next; + EntityFireInfo* prev; }; struct ShadowInfo { float radius; - VMesh *vmesh_handle; + VMesh* vmesh_handle; int root_bone_index; Vector3 pos; Matrix3 orient; @@ -399,32 +399,39 @@ namespace rf }; static auto& entity_from_handle = addr_as_ref(0x00426FC0); - static auto& entity_create = - addr_as_ref(0x00422360); - static auto& entity_is_dying = addr_as_ref(0x00427020); - static auto& entity_in_vehicle = addr_as_ref(0x004290D0); - static auto& entity_is_jeep_driver = addr_as_ref(0x0042AC80); - static auto& entity_is_jeep_gunner = addr_as_ref(0x0042ACD0); - static auto& entity_is_driller = addr_as_ref(0x0042D780); - static auto& entity_is_sub = addr_as_ref(0x0040A270); - static auto& entity_is_jeep = addr_as_ref(0x0040A2F0); - static auto& entity_is_fighter = addr_as_ref(0x0040A210); - static auto& entity_is_carrying_corpse = addr_as_ref(0x00429D20); - static auto& entity_fire_init_bones = addr_as_ref(0x0042EB20); + static auto& entity_create = addr_as_ref(0x00422360); + static auto& entity_is_dying = addr_as_ref(0x00427020); + static auto& entity_in_vehicle = addr_as_ref(0x004290D0); + static auto& entity_is_jeep_driver = addr_as_ref(0x0042AC80); + static auto& entity_is_jeep_gunner = addr_as_ref(0x0042ACD0); + static auto& entity_is_driller = addr_as_ref(0x0042D780); + static auto& entity_is_sub = addr_as_ref(0x0040A270); + static auto& entity_is_jeep = addr_as_ref(0x0040A2F0); + static auto& entity_is_fighter = addr_as_ref(0x0040A210); + static auto& entity_is_carrying_corpse = addr_as_ref(0x00429D20); + static auto& entity_fire_init_bones = addr_as_ref(0x0042EB20); static auto& entity_is_swimming = addr_as_ref(0x0042A0A0); static auto& entity_is_falling = addr_as_ref(0x0042A020); static auto& entity_can_swim = addr_as_ref(0x00427FF0); static auto& entity_update_liquid_status = addr_as_ref(0x00429100); static auto& entity_is_playing_action_animation = addr_as_ref(0x00428D10); - static auto& entity_set_next_state_anim = addr_as_ref(0x0042A580); - static auto& entity_play_action_animation = addr_as_ref(0x00428C90); + static auto& entity_set_next_state_anim = + addr_as_ref(0x0042A580); + static auto& entity_play_action_animation = + addr_as_ref( + 0x00428C90 + ); static auto& entity_is_reloading = addr_as_ref(0x00425250); static auto& entity_weapon_is_on = addr_as_ref(0x0041A830); - static auto& entity_reload_current_primary = addr_as_ref(0x00425280); - static auto& entity_turn_weapon_on = addr_as_ref(0x0041A870); + static auto& entity_reload_current_primary = + addr_as_ref(0x00425280); + static auto& entity_turn_weapon_on = + addr_as_ref(0x0041A870); static auto& entity_turn_weapon_off = addr_as_ref(0x0041AE70); - static auto& entity_restore_mesh = addr_as_ref(0x0042C570); + static auto& entity_restore_mesh = addr_as_ref(0x0042C570); static auto& entity_list = addr_as_ref(0x005CB060); static auto& local_player_entity = addr_as_ref(0x005CB054); diff --git a/game_patch/rf/event.h b/game_patch/rf/event.h index 87f4da685..736a64cd6 100644 --- a/game_patch/rf/event.h +++ b/game_patch/rf/event.h @@ -20,7 +20,6 @@ namespace rf virtual void turn_on() = 0; virtual void turn_off() = 0; virtual void process() = 0; - }; static_assert(sizeof(Event) == 0x2B8); diff --git a/game_patch/rf/file/file.h b/game_patch/rf/file/file.h index 7bf11a7f0..9db31ae8e 100644 --- a/game_patch/rf/file/file.h +++ b/game_patch/rf/file/file.h @@ -14,7 +14,8 @@ namespace rf char m_internal_data[0x114]; public: - enum SeekOrigin { + enum SeekOrigin + { seek_set = 0, seek_cur = 1, seek_end = 2, @@ -26,7 +27,6 @@ namespace rf static constexpr uint default_path_id = 9999999; - File() { AddrCaller{0x00523940}.this_call(this); @@ -72,12 +72,12 @@ namespace rf return AddrCaller{0x005244E0}.this_call(this); } - [[nodiscard]] int size(const char *filename = nullptr, int a3 = default_path_id) const + [[nodiscard]] int size(const char* filename = nullptr, int a3 = default_path_id) const { return AddrCaller{0x00524370}.this_call(this, filename, a3); } - int read(void *buf, int buf_len, int min_ver = 0, int unused = 0) + int read(void* buf, int buf_len, int min_ver = 0, int unused = 0) { return AddrCaller{0x0052CF60}.this_call(this, buf, buf_len, min_ver, unused); } @@ -96,8 +96,8 @@ namespace rf } }; - static auto& file_get_ext = addr_as_ref(0x005143F0); - static auto& file_add_path = addr_as_ref(0x00514070); + static auto& file_get_ext = addr_as_ref(0x005143F0); + static auto& file_add_path = addr_as_ref(0x00514070); static auto& root_path = addr_as_ref(0x018060E8); } diff --git a/game_patch/rf/file/packfile.h b/game_patch/rf/file/packfile.h index 6ecc89a76..560c7f938 100644 --- a/game_patch/rf/file/packfile.h +++ b/game_patch/rf/file/packfile.h @@ -16,7 +16,7 @@ namespace rf #ifdef DASH_FACTION std::vector files; #else - VPackfileEntry *files; + VPackfileEntry* files; #endif uint32_t file_size; #ifdef DASH_FACTION @@ -39,12 +39,12 @@ namespace rf }; static_assert(sizeof(VPackfileEntry) == 0x18); - static auto& vpackfile_add = addr_as_ref(0x0052C070); + static auto& vpackfile_add = addr_as_ref(0x0052C070); static auto& vpackfile_set_loading_user_maps = addr_as_ref(0x0052BB50); static auto& vpackfile_calc_file_name_checksum = addr_as_ref(0x0052BE70); - using VPackfileAddEntries_Type = uint32_t(VPackfile* packfile, const void* buf, unsigned num_files_in_block, - unsigned* num_added); + using VPackfileAddEntries_Type = + uint32_t(VPackfile* packfile, const void* buf, unsigned num_files_in_block, unsigned* num_added); static auto& vpackfile_add_entries = addr_as_ref(0x0052BD40); static auto& vpackfile_loading_user_maps = addr_as_ref(0x01BDB21C); diff --git a/game_patch/rf/gameseq.h b/game_patch/rf/gameseq.h index a0f31b424..e51aaeb30 100644 --- a/game_patch/rf/gameseq.h +++ b/game_patch/rf/gameseq.h @@ -13,7 +13,7 @@ namespace rf GS_NEW_LEVEL = 0x5, GS_SAVE_GAME_MENU = 0x6, GS_LOAD_GAME_MENU = 0x7, - GS_QUICK_SAVE = 0x8, // unused + GS_QUICK_SAVE = 0x8, // unused GS_QUICK_RESTORE = 0x9, // unused GS_LEVEL_TRANSITION = 0xA, GS_GAMEPLAY = 0xB, @@ -31,10 +31,10 @@ namespace rf GS_CREDITS = 0x17, GS_BOMB_DEFUSE = 0x18, GS_MULTI_LEVEL_DOWNLOAD = 0x19, // unused by the base game - GS_1A = 0x1A, // unused - GS_1B = 0x1B, // unused - GS_1C = 0x1C, // unused - GS_1D = 0x1D, // unused + GS_1A = 0x1A, // unused + GS_1B = 0x1B, // unused + GS_1C = 0x1C, // unused + GS_1D = 0x1D, // unused GS_MULTI_SERVER_LIST = 0x1E, GS_MULTI_SPLITSCREEN = 0x1F, GS_MULTI_CREATE_GAME = 0x20, @@ -48,6 +48,7 @@ namespace rf static auto& gameseq_get_state = addr_as_ref(0x00434200); static auto& gameseq_get_pending_state = addr_as_ref(0x00434220); static auto& gameseq_in_gameplay = addr_as_ref(0x00434460); - static auto& gameseq_push_state = addr_as_ref(0x00434410); + static auto& gameseq_push_state = + addr_as_ref(0x00434410); static auto& gameseq_process_deferred_change = addr_as_ref(0x00434310); } diff --git a/game_patch/rf/geometry.h b/game_patch/rf/geometry.h index e3685ec2f..54bf798c3 100644 --- a/game_patch/rf/geometry.h +++ b/game_patch/rf/geometry.h @@ -76,7 +76,7 @@ namespace rf struct GSolid { - GBBox *bbox; + GBBox* bbox; char name[64]; int modifiability; Vector3 bbox_min; @@ -111,7 +111,7 @@ namespace rf int field_370; int field_374; - void collide(GCollisionInput *in, GCollisionOutput *out, bool clear_fraction) + void collide(GCollisionInput* in, GCollisionOutput* out, bool clear_fraction) { AddrCaller{0x004DF1C0}.this_call(this, in, out, clear_fraction); } @@ -123,14 +123,14 @@ namespace rf bool is_detail; bool is_sky; bool is_invisible; - GCache *geo_cache; + GCache* geo_cache; Vector3 bbox_min; Vector3 bbox_max; int room_index; int uid; VList face_list; VArray portals; - GBBox *bbox; + GBBox* bbox; bool is_blocked; bool is_cold; bool is_outside; @@ -141,7 +141,7 @@ namespace rf char eax_effect[32]; bool has_alpha; VArray detail_rooms; - GRoom *room_to_render_with; + GRoom* room_to_render_with; Plane room_plane; int last_frame_rendered_normal; int last_frame_rendered_alpha; @@ -182,8 +182,9 @@ namespace rf struct GFaceAttributes { uint flags; - union { - int group_id; // temporarily used for face grouping/sorting + union + { + int group_id; // temporarily used for face grouping/sorting GTextureMover* texture_mover; // temporarily used by room render cache code }; int bitmap_id; @@ -225,10 +226,10 @@ namespace rf Vector3 bounding_box_min; Vector3 bounding_box_max; GFaceAttributes attributes; - GFaceVertex *edge_loop; - GRoom *which_room; - GBBox *which_bbox; - DecalPoly *decal_list; + GFaceVertex* edge_loop; + GRoom* which_room; + GBBox* which_bbox; + DecalPoly* decal_list; short unk_cache_index; GFace* next[FACE_LIST_NUM]; }; @@ -246,13 +247,13 @@ namespace rf struct GFaceVertex { - GVertex *vertex; + GVertex* vertex; float texture_u; float texture_v; float lightmap_u; float lightmap_v; - GFaceVertex *next; - GFaceVertex *prev; + GFaceVertex* next; + GFaceVertex* prev; }; static_assert(sizeof(GFaceVertex) == 0x1C); @@ -263,7 +264,7 @@ namespace rf ubyte flags; bool should_smooth; bool fullbright; - GLightmap *lightmap; + GLightmap* lightmap; int xstart; int ystart; int width; @@ -310,7 +311,7 @@ namespace rf bool unusable; short adjacent; float distance; - GPathNode *backptr; + GPathNode* backptr; GPathNodeType type; bool directional; Matrix3 orient; @@ -325,9 +326,9 @@ namespace rf Matrix3 orient; Vector3 width; int bitmap_id; - GRoom *room; - GRoom *room2; - GSolid *solid; + GRoom* room; + GRoom* room2; + GSolid* solid; ubyte alpha; int flags; int object_handle; @@ -335,12 +336,12 @@ namespace rf Plane decal_poly_planes[6]; Vector3 bb_min; Vector3 bb_max; - DecalPoly *poly_list; + DecalPoly* poly_list; int num_decal_polys; float lifetime_sec; - GDecal *next; - GDecal *prev; - GSolid *editor_geometry; + GDecal* next; + GDecal* prev; + GSolid* editor_geometry; }; static_assert(sizeof(GDecal) == 0xEC); @@ -361,17 +362,17 @@ namespace rf int lightmap_bm_handle; int nv; DecalVertex verts[25]; - GFace *face; - GDecal *my_decal; - DecalPoly *next; - DecalPoly *prev; - DecalPoly *next_for_face; + GFace* face; + GDecal* my_decal; + DecalPoly* next; + DecalPoly* prev; + DecalPoly* next_for_face; }; static_assert(sizeof(DecalPoly) == 0x534); struct GCollisionInput { - GFace *face; + GFace* face; Vector3 geometry_pos; Matrix3 geometry_orient; Vector3 start_pos; @@ -395,7 +396,7 @@ namespace rf Vector3 hit_point; Vector3 normal; int field_20; - GFace *face; + GFace* face; GCollisionOutput() { @@ -406,10 +407,10 @@ namespace rf struct GLightmap { - ubyte *unk; + ubyte* unk; int w; int h; - ubyte *buf; + ubyte* buf; int bm_handle; int index; }; @@ -420,13 +421,13 @@ namespace rf { int last_frame_updated; int last_frame_needs_updating; - GProceduralTexture *next; - GProceduralTexture *prev; + GProceduralTexture* next; + GProceduralTexture* prev; int width; int height; int user_bm_handle; ProcTexType type; - void (*update_function)(GProceduralTexture *pt); + void (*update_function)(GProceduralTexture* pt); int base_bm_handle; float slide_pos_xc; // unused? float slide_pos_xt; @@ -445,16 +446,19 @@ namespace rf bool is_behind_brush; bool lights_enabled; bool use_static_lights; - Plane *object_plane; - Vector3 *bbox_min; - Vector3 *bbox_max; + Plane* object_plane; + Vector3* bbox_min; + Vector3* bbox_max; float z_value; - void (*render_function)(int, GSolid *); + void (*render_function)(int, GSolid*); }; static_assert(sizeof(GPortalObject) == 0x30); static auto& g_cache_clear = addr_as_ref(0x004F0B90); - static auto& g_get_room_render_list = addr_as_ref(0x004D3330); + static auto& g_get_room_render_list = addr_as_ref(0x004D3330); - static auto& bbox_intersect = addr_as_ref(0x0046C340); + static auto& bbox_intersect = addr_as_ref< + bool(const Vector3& bbox1_min, const Vector3& bbox1_max, const Vector3& bbox2_min, const Vector3& bbox2_max)>( + 0x0046C340 + ); } diff --git a/game_patch/rf/glare.h b/game_patch/rf/glare.h index 463a3749d..e2df27af1 100644 --- a/game_patch/rf/glare.h +++ b/game_patch/rf/glare.h @@ -2,7 +2,8 @@ #include "object.h" -namespace rf { +namespace rf +{ struct GlareInfo; struct GFace; struct MoverBrush; @@ -13,22 +14,22 @@ namespace rf { bool enabled; bool visible; int last_covering_objh; - MoverBrush *last_covering_mover_brush; - GFace *last_covering_face; + MoverBrush* last_covering_mover_brush; + GFace* last_covering_face; float last_rendered_intensity[2]; float last_rendered_radius[2]; - GlareInfo *info; + GlareInfo* info; int info_index; int flags; - Glare *next; - Glare *prev; + Glare* next; + Glare* prev; Vector3 field_2C0; - Player *parent_player; + Player* parent_player; bool is_rod; Vector3 rod_pos1; Vector3 rod_pos2; }; static_assert(sizeof(Glare) == 0x2EC); - static auto& glare_collide_entity = addr_as_ref(0x00415280); + static auto& glare_collide_entity = addr_as_ref(0x00415280); } diff --git a/game_patch/rf/gr/gr.h b/game_patch/rf/gr/gr.h index 76dbd3d93..f6b933e01 100644 --- a/game_patch/rf/gr/gr.h +++ b/game_patch/rf/gr/gr.h @@ -15,8 +15,7 @@ namespace rf::gr ubyte blue; ubyte alpha; - constexpr Color(ubyte r, ubyte g, ubyte b, ubyte a = 255) : - red(r), green(g), blue(b), alpha(a) {} + constexpr Color(ubyte r, ubyte g, ubyte b, ubyte a = 255) : red(r), green(g), blue(b), alpha(a) {} void set(ubyte r, ubyte g, ubyte b, ubyte a) { @@ -32,7 +31,7 @@ namespace rf::gr struct BaseVertex { Vector3 world_pos; // world or clip space - float sx; // screen space + float sx; // screen space float sy; float sw; ubyte codes; @@ -130,7 +129,10 @@ namespace rf::gr public: constexpr Mode() = default; constexpr Mode(TextureSource ts, ColorSource cs, AlphaSource as, AlphaBlend ab, ZbufferType zbt, FogType ft) : - value((ts << ts_shift) | (cs << cs_shift) | (as << as_shift) | (ab << ab_shift) | (zbt << zbt_shift) | (ft << ft_shift)) + value( + (ts << ts_shift) | (cs << cs_shift) | (as << as_shift) | (ab << ab_shift) | (zbt << zbt_shift) | + (ft << ft_shift) + ) {} [[nodiscard]] bool operator==(const Mode& other) const = default; @@ -274,7 +276,7 @@ namespace rf::gr int bm_handle; int section; bm::Format format; - uint8_t *data; + uint8_t* data; int w; int h; int stride_in_bytes; @@ -338,16 +340,23 @@ namespace rf::gr static auto& tcache_remove_ref = addr_as_ref(0x0050E870); static auto& close = addr_as_ref(0x0050CBE0); static auto& set_gamma = addr_as_ref(0x0050CE70); - static auto& set_texture = addr_as_ref(0x0050D060); - static auto& tmapper = addr_as_ref(0x0050DF80); + static auto& set_texture = addr_as_ref(0x0050D060); + static auto& tmapper = + addr_as_ref(0x0050DF80); static auto& lighting_enabled = addr_as_ref(0x004DB8B0); - static auto& cull_bounding_box = addr_as_ref(0x00518750); - static auto& poly = addr_as_ref(0x005159A0); - static auto& rotate_vertex = addr_as_ref(0x00518360); - static auto& world_poly = addr_as_ref(0x00517110); + static auto& cull_bounding_box = addr_as_ref(0x00518750); + static auto& poly = addr_as_ref< + bool(int num, Vertex** vertices, TMapperFlags vertex_attributes, Mode mode, bool constant_sw, float sw)>( + 0x005159A0 + ); + static auto& rotate_vertex = addr_as_ref(0x00518360); + static auto& world_poly = addr_as_ref< + bool(int bm_handle, int n_verts, const Vector3* verts, const Vector2* uvs, Mode mode, const Color& color)>( + 0x00517110 + ); static auto& start_instance = addr_as_ref(0x00517F00); static auto& stop_instance = addr_as_ref(0x00517F20); - static auto& project_vertex = addr_as_ref(0x00518440); + static auto& project_vertex = addr_as_ref(0x00518440); inline void set_color(ubyte r, ubyte g, ubyte b, ubyte a = screen.current_color.alpha) { @@ -384,7 +393,10 @@ namespace rf::gr AddrCaller{0x0050D0A0}.c_call(bm_handle, x, y, w, h, sx, sy, mode); } - inline void bitmap_scaled(int bm_handle, int x, int y, int w, int h, int sx, int sy, int sw, int sh, bool flip_x = false, bool flip_y = false, Mode mode = bitmap_wrap_mode) + inline void bitmap_scaled( + int bm_handle, int x, int y, int w, int h, int sx, int sy, int sw, int sh, bool flip_x = false, + bool flip_y = false, Mode mode = bitmap_wrap_mode + ) { AddrCaller{0x0050D250}.c_call(bm_handle, x, y, w, h, sx, sy, sw, sh, flip_x, flip_y, mode); } diff --git a/game_patch/rf/gr/gr_direct3d.h b/game_patch/rf/gr/gr_direct3d.h index 5e7295d6b..afac44456 100644 --- a/game_patch/rf/gr/gr_direct3d.h +++ b/game_patch/rf/gr/gr_direct3d.h @@ -5,13 +5,16 @@ #ifdef NO_D3D8 using IDirect3DTexture8 = IUnknown; +#else +#include +#include #endif namespace rf::gr::d3d { struct TextureSection { - IDirect3DTexture8 *d3d_texture; + IDirect3DTexture8* d3d_texture; int num_vram_bytes; float u_scale; float v_scale; @@ -29,7 +32,7 @@ namespace rf::gr::d3d short lock_count; uint8_t ref_count; bool reset; - TextureSection *sections; + TextureSection* sections; }; static auto& flush_buffers = addr_as_ref(0x00559D90); diff --git a/game_patch/rf/gr/gr_font.h b/game_patch/rf/gr/gr_font.h index 52b2d7f5e..ef4ffdab8 100644 --- a/game_patch/rf/gr/gr_font.h +++ b/game_patch/rf/gr/gr_font.h @@ -39,16 +39,16 @@ namespace rf::gr int height2; int num_kern_pairs; int pixel_data_size; - FontKernEntry *kern_data; - FontCharInfo *chars; - unsigned char *pixel_data; - int *palette; + FontKernEntry* kern_data; + FontCharInfo* chars; + unsigned char* pixel_data; + int* palette; int bm_handle; int bm_width; int bm_height; - int *char_x_coords; - int *char_y_coords; - unsigned char *bm_bits; + int* char_x_coords; + int* char_y_coords; + unsigned char* bm_bits; }; static constexpr int center_x = 0x8000; // supported by gr_string @@ -58,17 +58,18 @@ namespace rf::gr static auto& fonts = addr_as_ref(0x01886C90); static auto& num_fonts = addr_as_ref(0x018871A0); - inline void string(int x, int y, const char *s, int font_num = -1, Mode mode = string_mode) + inline void string(int x, int y, const char* s, int font_num = -1, Mode mode = string_mode) { AddrCaller{0x0051FEB0}.c_call(x, y, s, font_num, mode); } - inline void string_aligned(TextAlignment align, int x, int y, const char *s, int font_num = -1, Mode state = string_mode) + inline void + string_aligned(TextAlignment align, int x, int y, const char* s, int font_num = -1, Mode state = string_mode) { AddrCaller{0x0051FE50}.c_call(align, x, y, s, font_num, state); } - inline int load_font(const char *file_name, int a2 = -1) + inline int load_font(const char* file_name, int a2 = -1) { return AddrCaller{0x0051F6E0}.c_call(file_name, a2); } @@ -78,7 +79,11 @@ namespace rf::gr return AddrCaller{0x0051F4D0}.c_call(font_num); } - static auto& split_str = addr_as_ref(0x00520810); - static auto& get_string_size = addr_as_ref(0x0051F530); - static auto& set_default_font = addr_as_ref(0x0051FE20); + static auto& split_str = addr_as_ref< + int(int* len_array, int* offset_array, char* s, int max_w, int max_lines, char unk_char, int font_num)>( + 0x00520810 + ); + static auto& get_string_size = + addr_as_ref(0x0051F530); + static auto& set_default_font = addr_as_ref(0x0051FE20); } diff --git a/game_patch/rf/gr/gr_light.h b/game_patch/rf/gr/gr_light.h index 6b198167e..971625350 100644 --- a/game_patch/rf/gr/gr_light.h +++ b/game_patch/rf/gr/gr_light.h @@ -28,8 +28,8 @@ namespace rf::gr struct Light { - struct GrLight *next; - struct GrLight *prev; + struct GrLight* next; + struct GrLight* prev; LightType type; Vector3 vec; Vector3 vec2; @@ -60,10 +60,11 @@ namespace rf::gr }; static_assert(sizeof(Light) == 0x10C); - static auto& light_filter_set_solid = addr_as_ref(0x004D9DD0); + static auto& light_filter_set_solid = + addr_as_ref(0x004D9DD0); static auto& light_filter_reset = addr_as_ref(0x004D9FA0); - static auto& light_get_ambient = addr_as_ref(0x004D8D10); + static auto& light_get_ambient = addr_as_ref(0x004D8D10); static auto& num_relevant_lights = addr_as_ref(0x00C9687C); - static auto& relevant_lights = addr_as_ref(0x00C4D588); + static auto& relevant_lights = addr_as_ref(0x00C4D588); } diff --git a/game_patch/rf/hud.h b/game_patch/rf/hud.h index 217be1dd3..603d2cb9f 100644 --- a/game_patch/rf/hud.h +++ b/game_patch/rf/hud.h @@ -34,54 +34,54 @@ namespace rf enum HudItem { - hud_health = 0, - hud_health_value_ul_corner = 1, - hud_health_value_width_and_height = 2, - hud_envirosuit = 3, - hud_envirosuit_value_ul_corner = 4, - hud_envirosuit_value_width_and_height = 5, - hud_ammo_bar = 6, - hud_ammo_signal = 7, // behind_icon - hud_ammo_icon = 8, - hud_ammo_in_clip_text_ul_region_coord = 9, - hud_ammo_in_clip_text_width_and_height = 10, - hud_ammo_in_inv_text_ul_region_coord = 11, - hud_ammo_in_inv_text_width_and_height = 12, - hud_reticle = 13, - hud_ammo_bar_position_no_clip = 14, // with no clip, i.e. when using rockets - hud_ammo_signal_position_no_clip = 15, // with no clip - hud_ammo_icon_position_no_clip = 16, // with no clip - hud_ammo_in_inv_ul_region_coord_no_clip = 17, // with no clip + hud_health = 0, + hud_health_value_ul_corner = 1, + hud_health_value_width_and_height = 2, + hud_envirosuit = 3, + hud_envirosuit_value_ul_corner = 4, + hud_envirosuit_value_width_and_height = 5, + hud_ammo_bar = 6, + hud_ammo_signal = 7, // behind_icon + hud_ammo_icon = 8, + hud_ammo_in_clip_text_ul_region_coord = 9, + hud_ammo_in_clip_text_width_and_height = 10, + hud_ammo_in_inv_text_ul_region_coord = 11, + hud_ammo_in_inv_text_width_and_height = 12, + hud_reticle = 13, + hud_ammo_bar_position_no_clip = 14, // with no clip, i.e. when using rockets + hud_ammo_signal_position_no_clip = 15, // with no clip + hud_ammo_icon_position_no_clip = 16, // with no clip + hud_ammo_in_inv_ul_region_coord_no_clip = 17, // with no clip hud_ammo_in_inv_text_width_and_height_no_clip = 18, // with no clip - hud_scope_center_circle_radius = 19, // along x and y axes - hud_front_damage_indicator_center = 20, - hud_left_damage_indicator_center = 21, - hud_back_damage_indicator_center = 22, - hud_right_damage_indicator_center = 23, - hud_ammo_in_clip_ul_coord = 24, - hud_ammo_in_clip_width_and_height = 25, + hud_scope_center_circle_radius = 19, // along x and y axes + hud_front_damage_indicator_center = 20, + hud_left_damage_indicator_center = 21, + hud_back_damage_indicator_center = 22, + hud_right_damage_indicator_center = 23, + hud_ammo_in_clip_ul_coord = 24, + hud_ammo_in_clip_width_and_height = 25, hud_front_damage_indicator_center_splitscreen = 26, // relative to clip region - hud_left_damage_indicator_center_splitscreen = 27, // relative to clip region - hud_back_damage_indicator_center_splitscreen = 28, // relative to clip region + hud_left_damage_indicator_center_splitscreen = 27, // relative to clip region + hud_back_damage_indicator_center_splitscreen = 28, // relative to clip region hud_right_damage_indicator_center_splitscreen = 29, // relative to clip region - hud_persona_message_box_background_ul = 30, - hud_persona_message_box_background_w_h = 31, - hud_persona_message_box_text_area_upper_left = 32, - hud_persona_message_box_text_area_width = 33, // height ignored - hud_persona_head_image = 34, - hud_persona_head_image_name = 35, - hud_persona_sub_offset = 36, - hud_message_width_and_upper_y_value = 37, // they render centered - hud_message_log_text_area_width = 38, // height ignored - hud_countdown_timer = 39, - hud_corpse_icon = 40, - hud_corpse_text = 41, - hud_jeep = 42, - hud_jeep_frame = 43, - hud_jeep_value = 44, - hud_driller = 45, - hud_driller_frame = 46, - hud_driller_value = 47, + hud_persona_message_box_background_ul = 30, + hud_persona_message_box_background_w_h = 31, + hud_persona_message_box_text_area_upper_left = 32, + hud_persona_message_box_text_area_width = 33, // height ignored + hud_persona_head_image = 34, + hud_persona_head_image_name = 35, + hud_persona_sub_offset = 36, + hud_message_width_and_upper_y_value = 37, // they render centered + hud_message_log_text_area_width = 38, // height ignored + hud_countdown_timer = 39, + hud_corpse_icon = 40, + hud_corpse_text = 41, + hud_jeep = 42, + hud_jeep_frame = 43, + hud_jeep_value = 44, + hud_driller = 45, + hud_driller_frame = 46, + hud_driller_value = 47, }; static auto& hud_draw_damage_indicators = addr_as_ref(0x00439CA0); @@ -132,8 +132,8 @@ namespace rf struct WeaponCycle { int weapon_type; - VMesh *mesh; - VMesh *fpgun_mesh; + VMesh* mesh; + VMesh* fpgun_mesh; int category; }; diff --git a/game_patch/rf/input.h b/game_patch/rf/input.h index 171e88170..abe837f65 100644 --- a/game_patch/rf/input.h +++ b/game_patch/rf/input.h @@ -1,7 +1,7 @@ #pragma once // RF uses DirectInput 8 -#define DIRECTINPUT_VERSION 0x0800 +#define DIRECTINPUT_VERSION 0x0800 #include #include @@ -117,7 +117,7 @@ namespace rf KEY_CTRLED = 0x4000, }; - static auto& mouse_get_pos = addr_as_ref(0x0051E450); + static auto& mouse_get_pos = addr_as_ref(0x0051E450); static auto& mouse_was_button_pressed = addr_as_ref(0x0051E5D0); static auto& mouse_set_visible = addr_as_ref(0x0051E680); static auto& key_process_event = addr_as_ref(0x0051E6C0); diff --git a/game_patch/rf/item.h b/game_patch/rf/item.h index a09106e33..88e1148a4 100644 --- a/game_patch/rf/item.h +++ b/game_patch/rf/item.h @@ -9,7 +9,7 @@ namespace rf { String cls_name; String v3d_filename; - const char *hud_msg_name; + const char* hud_msg_name; int pickup_msg_single; int pickup_msg_multi; int pickup_msg_wa_single; @@ -23,7 +23,7 @@ namespace rf int ammo_for_weapon_id; int gives_weapon_id; int flags; // see ItemInfoFlags - int (__cdecl *touch_callback)(int entity_handle, int item_handle, int count); + int(__cdecl* touch_callback)(int entity_handle, int item_handle, int count); int use_callback_not_sure; }; static_assert(sizeof(ItemInfo) == 0x50); @@ -36,9 +36,9 @@ namespace rf struct Item : Object { - struct Item *next; - struct Item *prev; - ItemInfo *info; + struct Item* next; + struct Item* prev; + ItemInfo* info; int info_index; String name; int count; @@ -56,6 +56,6 @@ namespace rf static auto& item_info = addr_as_ref(0x006430A0); static auto& num_item_types = addr_as_ref(0x00644EA0); - static auto& item_lookup_type = addr_as_ref(0x00459430); - static auto& item_restore_mesh = addr_as_ref(0x00459BB0); + static auto& item_lookup_type = addr_as_ref(0x00459430); + static auto& item_restore_mesh = addr_as_ref(0x00459BB0); } diff --git a/game_patch/rf/level.h b/game_patch/rf/level.h index da9e53e1f..c78626d16 100644 --- a/game_patch/rf/level.h +++ b/game_patch/rf/level.h @@ -19,12 +19,12 @@ namespace rf struct EmitterPair { - ParticleEmitter *pemitter; + ParticleEmitter* pemitter; int sound_emitter_handle; Vector3 emitting_pos; - EmitterPair *next; - EmitterPair *prev; - GRoom *room; + EmitterPair* next; + EmitterPair* prev; + GRoom* room; }; static_assert(sizeof(EmitterPair) == 0x20); @@ -66,7 +66,7 @@ namespace rf VArray ladders; VArray pushers; EmitterPairSet ep_set; - GSolid *geometry; + GSolid* geometry; int flags; float time; float global_time; @@ -76,7 +76,8 @@ namespace rf }; static_assert(sizeof(LevelInfo) == 0x154); - enum LevelFlags { + enum LevelFlags + { LEVEL_LOADED = 1, }; diff --git a/game_patch/rf/localize.h b/game_patch/rf/localize.h index 2f00a0b58..0cb4f30c8 100644 --- a/game_patch/rf/localize.h +++ b/game_patch/rf/localize.h @@ -4,35 +4,36 @@ namespace rf { - namespace strings { - static const auto &array = addr_as_ref(0x007CBBF0); - static const auto &player = array[675]; - static const auto &frags = array[676]; - static const auto &ping = array[677]; - static const auto &caps = array[681]; - static const auto &was_killed_by_her_own_hand = array[692]; - static const auto &was_killed_by_his_own_hand = array[693]; - static const auto &was_killed_by = array[694]; - static const auto &was_killed_mysteriously = array[695]; - static const auto &has_joined = array[708]; - static const auto &score = array[720]; - static const auto &close_combat = array[779]; - static const auto &semi_auto = array[780]; - static const auto &heavy = array[781]; - static const auto &explosive = array[782]; - static const auto &team = array[833]; - static const auto &player_name = array[835]; - static const auto &exiting_game = array[884]; - static const auto &usage = array[886]; - static const auto &you_killed_yourself = array[942]; - static const auto &you_just_got_beat_down_by = array[943]; - static const auto &you_were_killed_by = array[944]; - static const auto &you_killed = array[945]; - static const auto &got_beat_down_by = array[946]; - static const auto &kicking_player = array[958]; - static const auto &banning_player = array[959]; - static const auto &deathmatch = array[974]; - static const auto &capture_the_flag = array[975]; - static const auto &team_deathmatch = array[976]; + namespace strings + { + static const auto& array = addr_as_ref(0x007CBBF0); + static const auto& player = array[675]; + static const auto& frags = array[676]; + static const auto& ping = array[677]; + static const auto& caps = array[681]; + static const auto& was_killed_by_her_own_hand = array[692]; + static const auto& was_killed_by_his_own_hand = array[693]; + static const auto& was_killed_by = array[694]; + static const auto& was_killed_mysteriously = array[695]; + static const auto& has_joined = array[708]; + static const auto& score = array[720]; + static const auto& close_combat = array[779]; + static const auto& semi_auto = array[780]; + static const auto& heavy = array[781]; + static const auto& explosive = array[782]; + static const auto& team = array[833]; + static const auto& player_name = array[835]; + static const auto& exiting_game = array[884]; + static const auto& usage = array[886]; + static const auto& you_killed_yourself = array[942]; + static const auto& you_just_got_beat_down_by = array[943]; + static const auto& you_were_killed_by = array[944]; + static const auto& you_killed = array[945]; + static const auto& got_beat_down_by = array[946]; + static const auto& kicking_player = array[958]; + static const auto& banning_player = array[959]; + static const auto& deathmatch = array[974]; + static const auto& capture_the_flag = array[975]; + static const auto& team_deathmatch = array[976]; } } diff --git a/game_patch/rf/math/ix.h b/game_patch/rf/math/ix.h index cbb373118..d37b3312d 100644 --- a/game_patch/rf/math/ix.h +++ b/game_patch/rf/math/ix.h @@ -5,8 +5,9 @@ namespace rf { // Intersection helpers - using IxLineSegmentBoundingBoxType = bool(const Vector3& box_min, const Vector3& box_max, const Vector3& p0, - const Vector3& p1, Vector3 *hit_pt); + using IxLineSegmentBoundingBoxType = + bool(const Vector3& box_min, const Vector3& box_max, const Vector3& p0, const Vector3& p1, Vector3* hit_pt); static auto& ix_linesegment_boundingbox = addr_as_ref(0x00508B70); - static auto& ix_point_in_box = addr_as_ref(0x005079F0); + static auto& ix_point_in_box = + addr_as_ref(0x005079F0); } diff --git a/game_patch/rf/mover.h b/game_patch/rf/mover.h index 95b8574c8..39f18322a 100644 --- a/game_patch/rf/mover.h +++ b/game_patch/rf/mover.h @@ -8,11 +8,10 @@ namespace rf struct MoverBrush : Object { - MoverBrush *next; - MoverBrush *prev; - GSolid *geometry; + MoverBrush* next; + MoverBrush* prev; + GSolid* geometry; }; static auto& mover_brush_list = addr_as_ref(0x0064E6E0); } - diff --git a/game_patch/rf/multi.h b/game_patch/rf/multi.h index 92bb5b990..9f652496b 100644 --- a/game_patch/rf/multi.h +++ b/game_patch/rf/multi.h @@ -19,14 +19,14 @@ namespace rf uint32_t ip_addr; uint16_t port; - bool operator==(const NetAddr &other) const = default; + bool operator==(const NetAddr& other) const = default; }; static_assert(sizeof(NetAddr) == 0x8); static auto& net_init_socket = addr_as_ref(0x00528F10); - static auto& net_addr_to_string = addr_as_ref(0x00529FE0); - static auto& net_send = addr_as_ref(0x0052A080); - static auto& net_same = addr_as_ref(0x0052A930); + static auto& net_addr_to_string = addr_as_ref(0x00529FE0); + static auto& net_send = addr_as_ref(0x0052A080); + static auto& net_same = addr_as_ref(0x0052A930); static auto& net_udp_socket = addr_as_ref(0x005A660C); static auto& net_port = addr_as_ref(0x01B587D4); @@ -82,7 +82,8 @@ namespace rf }; static_assert(sizeof(PlayerNetData) == 0x9C8); - enum NetGameType { + enum NetGameType + { NG_TYPE_DM = 0, NG_TYPE_CTF = 1, NG_TYPE_TEAMDM = 2, @@ -134,12 +135,11 @@ namespace rf constexpr size_t max_packet_size = 512; static auto& multi_get_game_type = addr_as_ref(0x00470770); - static auto& multi_io_send = addr_as_ref(0x00479370); + static auto& multi_io_send = addr_as_ref(0x00479370); static auto& multi_io_send_reliable = - addr_as_ref(0x00479480); - static auto& multi_io_send_reliable_to_all = - addr_as_ref(0x004795A0); - static auto& multi_io_send_buffered_reliable_packets = addr_as_ref(0x004796C0); + addr_as_ref(0x00479480); + static auto& multi_io_send_reliable_to_all = addr_as_ref(0x004795A0); + static auto& multi_io_send_buffered_reliable_packets = addr_as_ref(0x004796C0); static auto& multi_find_player_by_addr = addr_as_ref(0x00484850); static auto& multi_find_player_by_id = addr_as_ref(0x00484890); static auto& multi_ctf_get_red_team_score = addr_as_ref(0x00475020); @@ -148,19 +148,20 @@ namespace rf static auto& multi_ctf_get_blue_flag_player = addr_as_ref(0x00474E70); static auto& multi_ctf_is_red_flag_in_base = addr_as_ref(0x00474E80); static auto& multi_ctf_is_blue_flag_in_base = addr_as_ref(0x00474EA0); - static auto& multi_tdm_get_red_team_score = addr_as_ref(0x004828F0); // returns ubyte in vanilla game + static auto& multi_tdm_get_red_team_score = addr_as_ref(0x004828F0); // returns ubyte in vanilla game static auto& multi_tdm_get_blue_team_score = addr_as_ref(0x00482900); // returns ubyte in vanilla game static auto& multi_num_players = addr_as_ref(0x00484830); - static auto& multi_kick_player = addr_as_ref(0x0047BF00); + static auto& multi_kick_player = addr_as_ref(0x0047BF00); static auto& multi_ban_ip = addr_as_ref(0x0046D0F0); static auto& multi_set_next_weapon = addr_as_ref(0x0047FCA0); static auto& multi_change_level = addr_as_ref(0x0047BF50); static auto& multi_ping_player = addr_as_ref(0x00484D00); - static auto& send_entity_create_packet = addr_as_ref(0x00475160); - static auto& send_entity_create_packet_to_all = addr_as_ref(0x00475110); - static auto& multi_find_character = addr_as_ref(0x00476270); - static auto& multi_chat_print = addr_as_ref(0x004785A0); - static auto& multi_chat_say = addr_as_ref(0x00444150); + static auto& send_entity_create_packet = addr_as_ref(0x00475160); + static auto& send_entity_create_packet_to_all = addr_as_ref(0x00475110); + static auto& multi_find_character = addr_as_ref(0x00476270); + static auto& multi_chat_print = + addr_as_ref(0x004785A0); + static auto& multi_chat_say = addr_as_ref(0x00444150); static auto& multi_is_connecting_to_server = addr_as_ref(0x0044AD80); using MultiIoProcessPackets_Type = void(const void* data, size_t len, const NetAddr& addr, Player* player); static auto& multi_io_process_packets = addr_as_ref(0x004790D0); @@ -175,7 +176,8 @@ namespace rf static auto& simultaneous_ping = addr_as_ref(0x00599CD8); static auto& tracker_addr = addr_as_ref(0x006FC550); - enum ChatSayType { + enum ChatSayType + { CHAT_SAY_GLOBAL = 0, CHAT_SAY_TEAM = 1, }; @@ -185,7 +187,7 @@ namespace rf static auto& multi_chat_say_render = addr_as_ref(0x00444790); static auto& multi_chat_say_show = addr_as_ref(0x00444A80); static auto& multi_hud_render_chat = addr_as_ref(0x004773D0); - static auto& game_poll = addr_as_ref(0x004353C0); + static auto& game_poll = addr_as_ref(0x004353C0); static auto& scoreboard_render_internal = addr_as_ref(0x00470880); constexpr int multi_max_player_id = 256; diff --git a/game_patch/rf/object.h b/game_patch/rf/object.h index 7e9bd771a..3f479f93d 100644 --- a/game_patch/rf/object.h +++ b/game_patch/rf/object.h @@ -64,10 +64,10 @@ namespace rf struct Object { - GRoom *room; + GRoom* room; Vector3 correct_pos; - Object *next_obj; - Object *prev_obj; + Object* next_obj; + Object* prev_obj; String name; int uid; ObjectType type; @@ -81,7 +81,7 @@ namespace rf Vector3 last_pos; float radius; ObjectFlags obj_flags; - VMesh *vmesh; + VMesh* vmesh; int vmesh_submesh; PhysicsData p_data; ObjFriendliness friendliness; @@ -92,7 +92,7 @@ namespace rf Matrix3 host_orient; Vector3 start_pos; Matrix3 start_orient; - int *emitter_list_head; + int* emitter_list_head; int root_bone_index; char killer_netid; int server_handle; @@ -137,4 +137,5 @@ namespace rf } template<> -struct EnableEnumBitwiseOperators : std::true_type {}; +struct EnableEnumBitwiseOperators : std::true_type +{}; diff --git a/game_patch/rf/os/array.h b/game_patch/rf/os/array.h index e7cceea70..4bf96d970 100644 --- a/game_patch/rf/os/array.h +++ b/game_patch/rf/os/array.h @@ -8,7 +8,7 @@ namespace rf private: int num = 0; int capacity = 0; - T *elements = nullptr; + T* elements = nullptr; public: [[nodiscard]] int size() const diff --git a/game_patch/rf/os/console.h b/game_patch/rf/os/console.h index 363c1d113..9e9a7afc1 100644 --- a/game_patch/rf/os/console.h +++ b/game_patch/rf/os/console.h @@ -10,17 +10,16 @@ namespace rf::console { - using CommandFuncPtr = void(*)(); + using CommandFuncPtr = void (*)(); struct Command { - const char *name; - const char *help; + const char* name; + const char* help; CommandFuncPtr func; - inline static const auto init = - reinterpret_cast( - 0x00509A70); + inline static const auto init = reinterpret_cast< + void(__thiscall*)(Command* this_, const char* name, const char* help, CommandFuncPtr func)>(0x00509A70); }; static_assert(sizeof(Command) == 0xC); @@ -65,7 +64,7 @@ namespace rf::console output(s.c_str(), nullptr); } - //static auto& commands = addr_as_ref(0x01775530); + // static auto& commands = addr_as_ref(0x01775530); static auto& num_commands = addr_as_ref(0x0177567C); static auto& run = addr_as_ref(0x01775110); diff --git a/game_patch/rf/os/os.h b/game_patch/rf/os/os.h index 8d815d83a..d7e819fd6 100644 --- a/game_patch/rf/os/os.h +++ b/game_patch/rf/os/os.h @@ -9,11 +9,11 @@ namespace rf { using SelfType = CmdLineParam; - SelfType *next; - SelfType *prev; - const char *name; - const char *help; - const char *arg; + SelfType* next; + SelfType* prev; + const char* name; + const char* help; + const char* arg; bool name_found; bool has_argument; @@ -36,15 +36,15 @@ namespace rf struct CmdArg { - char *arg; + char* arg; bool is_done; }; - using MsgHandlerPtr = void(*)(UINT, WPARAM, LPARAM); + using MsgHandlerPtr = void (*)(UINT, WPARAM, LPARAM); static auto& os_add_msg_handler = addr_as_ref(0x00524AE0); static auto& os_foreground = addr_as_ref(0x00524AD0); static auto& os_poll = addr_as_ref(0x00524B60); - static auto& os_get_clipboard_text = addr_as_ref(0x00525AFC); + static auto& os_get_clipboard_text = addr_as_ref(0x00525AFC); static auto& msg_handlers = addr_as_ref(0x01B0D5A0); static auto& num_msg_handlers = addr_as_ref(0x01B0D760); @@ -60,6 +60,6 @@ namespace rf static auto& cmdline_args = addr_as_ref(0x01AED368); static auto& cmdline_num_args = addr_as_ref(0x01AED514); - static auto& debug_error = addr_as_ref(0x0050BA90); - #define RF_DEBUG_ERROR(text) rf::debug_error(__FILE__, __LINE__, text) + static auto& debug_error = addr_as_ref(0x0050BA90); +#define RF_DEBUG_ERROR(text) rf::debug_error(__FILE__, __LINE__, text) } diff --git a/game_patch/rf/os/string.h b/game_patch/rf/os/string.h index cfd2299c9..2ab1f890b 100644 --- a/game_patch/rf/os/string.h +++ b/game_patch/rf/os/string.h @@ -3,6 +3,7 @@ #include #include #include +#include namespace rf { @@ -38,8 +39,7 @@ namespace rf AddrCaller{0x004FF410}.this_call(this, &str); } - String(Pod pod) : m_pod(pod) - {} + String(Pod pod) : m_pod(pod) {} ~String() { @@ -85,10 +85,7 @@ namespace rf [[nodiscard]] bool operator==(const String& other) const { - return std::strcmp( - m_pod.buf ? m_pod.buf : "", - other.m_pod.buf ? other.m_pod.buf : "" - ) == 0; + return std::strcmp(m_pod.buf ? m_pod.buf : "", other.m_pod.buf ? other.m_pod.buf : "") == 0; } [[nodiscard]] bool operator==(const char* other) const @@ -96,7 +93,7 @@ namespace rf return std::strcmp(m_pod.buf ? m_pod.buf : "", other) == 0; } - [[nodiscard]] const char *c_str() const + [[nodiscard]] const char* c_str() const { return AddrCaller{0x004FF480}.this_call(this); } @@ -141,14 +138,16 @@ namespace rf static_assert(sizeof(String) == 8); } -template <> -struct std::formatter { - constexpr auto parse(std::format_parse_context& ctx) { +template<> +struct std::formatter +{ + constexpr auto parse(std::format_parse_context& ctx) + { return ctx.begin(); } - auto format(const rf::String& s, std::format_context& ctx) const { + auto format(const rf::String& s, std::format_context& ctx) const + { return std::format_to(ctx.out(), "{}", s.c_str()); } }; - diff --git a/game_patch/rf/os/timer.h b/game_patch/rf/os/timer.h index cd70b3ba1..b3847b2c6 100644 --- a/game_patch/rf/os/timer.h +++ b/game_patch/rf/os/timer.h @@ -26,5 +26,4 @@ namespace rf return timer_get(1); } - } diff --git a/game_patch/rf/parse.h b/game_patch/rf/parse.h index a7db7861c..736d97f90 100644 --- a/game_patch/rf/parse.h +++ b/game_patch/rf/parse.h @@ -6,12 +6,12 @@ namespace rf { struct Parser { - [[nodiscard]] bool parse_optional(const char *str) + [[nodiscard]] bool parse_optional(const char* str) { return AddrCaller{0x005125C0}.this_call(this, str); } - void parse_required(const char *str) + void parse_required(const char* str) { AddrCaller{0x005126A0}.this_call(this, str); } @@ -36,7 +36,7 @@ namespace rf return AddrCaller{0x00512920}.this_call(this); } - int parse_string(String *out_str, char first_char = '"', char last_char = '"') + int parse_string(String* out_str, char first_char = '"', char last_char = '"') { return AddrCaller{0x00512BB0}.this_call(this, out_str, first_char, last_char); } diff --git a/game_patch/rf/particle_emitter.h b/game_patch/rf/particle_emitter.h index ae539ccc2..25129355b 100644 --- a/game_patch/rf/particle_emitter.h +++ b/game_patch/rf/particle_emitter.h @@ -7,146 +7,148 @@ namespace rf { -struct GRoom; -struct ParticleEmitter; -struct Object; + struct GRoom; + struct ParticleEmitter; + struct Object; -enum ParticleEmitterFlags -{ - PEF_IMMEDIATE = 0x2, - PEF_CONTINOUS = 0x4, - PEF_DIRDEPEND = 0x8, - PEF_INITIALLY_ON = 0x10, - PEF_ALTERNATE_STATES = 0x20, - PEF_DONT_MOVE_WITH_PARENT = 0x40, - PEF_ACCEL_WITH_PARENT = 0x80, -}; - -struct ParticleEmitterType -{ - int uid; - Vector3 pos; - Vector3 dir; - float dir_rand; - float min_vel; - float max_vel; - float min_spawn_delay; - float max_spawn_delay; - float spawn_radius; - int16_t flags; - float min_life_secs; - float max_life_secs; - float min_pradius; - float max_pradius; - float growth_rate; - float acceleration; - float gravity_scale; - float alt_stateon_time; - float alt_stateon_time_variance; - float alt_stateoff_time; - float alt_stateoff_time_variance; - int bitmap; - int num_frames; - Color particle_clr; - Color particle_clr_dest; - int particle_flags; - int particle_flags2; - float age_pct_to_finish_vbm; - float active_distance; -}; -static_assert(sizeof(ParticleEmitterType) == 0x84); + enum ParticleEmitterFlags + { + PEF_IMMEDIATE = 0x2, + PEF_CONTINOUS = 0x4, + PEF_DIRDEPEND = 0x8, + PEF_INITIALLY_ON = 0x10, + PEF_ALTERNATE_STATES = 0x20, + PEF_DONT_MOVE_WITH_PARENT = 0x40, + PEF_ACCEL_WITH_PARENT = 0x80, + }; -struct ParticleCreateInfo -{ - Vector3 pos; - Vector3 vel; - float radius; - float growth_rate; - float acceleration; - float gravity_scale; - float lifetime_seconds; - int bitmap_handle; - int num_frames; - Color clr; - Color clr_dest; - int flags; - int flags2; - int age_pct_to_finish_vbm; - int hit_callback; -}; -static_assert(sizeof(ParticleCreateInfo) == 0x4C); + struct ParticleEmitterType + { + int uid; + Vector3 pos; + Vector3 dir; + float dir_rand; + float min_vel; + float max_vel; + float min_spawn_delay; + float max_spawn_delay; + float spawn_radius; + int16_t flags; + float min_life_secs; + float max_life_secs; + float min_pradius; + float max_pradius; + float growth_rate; + float acceleration; + float gravity_scale; + float alt_stateon_time; + float alt_stateon_time_variance; + float alt_stateoff_time; + float alt_stateoff_time_variance; + int bitmap; + int num_frames; + Color particle_clr; + Color particle_clr_dest; + int particle_flags; + int particle_flags2; + float age_pct_to_finish_vbm; + float active_distance; + }; + static_assert(sizeof(ParticleEmitterType) == 0x84); -struct Particle -{ - Particle *next; - Particle *prev; - int parent_handle; - Vector3 pos; - Vector3 vel; - float age; - Color clr; - Color clr_dest; - Color clr_current; - float max_life_seconds; - float radius; - float growth_rate; - float acceleration; - float gravity; - int first_frame_bitmap; - short num_frames; - short flags2; - char pool_id; - float bitmap_orient; - int flags; - int age_pct_to_finish_vbm; - void (*hit_callback)(Vector3 *hit_pos, const Vector3 *vel, Vector3 *normal, float *, int *is_liquid, int *hit_obj_uid); - GRoom *room; - ParticleEmitter *emitter; - Vector3 last_pos; -}; -static_assert(sizeof(Particle) == 0x78); + struct ParticleCreateInfo + { + Vector3 pos; + Vector3 vel; + float radius; + float growth_rate; + float acceleration; + float gravity_scale; + float lifetime_seconds; + int bitmap_handle; + int num_frames; + Color clr; + Color clr_dest; + int flags; + int flags2; + int age_pct_to_finish_vbm; + int hit_callback; + }; + static_assert(sizeof(ParticleCreateInfo) == 0x4C); -struct ParticleEmitter -{ - int uid; - int parent_handle; - Vector3 pos; - Vector3 dir; - float dir_rand; - float min_vel; - float max_vel; - float spawn_radius; - float min_spawn_delay; - float max_spawn_delay; - int emitter_flags; - float min_life_secs; - float max_life_secs; - float min_pradius; - float max_pradius; - GRoom *room; - ParticleCreateInfo pci; - float cull_radius; - float max_particle_dist_sq; - Vector3 world_pos; - Particle particle_list; - float on_time; - float on_time_variance; - float off_time; - float off_time_variance; - float time_to_change; - float current_state_time; - bool active; - int field_144; - ParticleEmitter *next; - ParticleEmitter *prev; - ParticleEmitter *next_entity_emitter; - Timestamp spawn_timer; + struct Particle + { + Particle* next; + Particle* prev; + int parent_handle; + Vector3 pos; + Vector3 vel; + float age; + Color clr; + Color clr_dest; + Color clr_current; + float max_life_seconds; + float radius; + float growth_rate; + float acceleration; + float gravity; + int first_frame_bitmap; + short num_frames; + short flags2; + char pool_id; + float bitmap_orient; + int flags; + int age_pct_to_finish_vbm; + void (*hit_callback)( + Vector3* hit_pos, const Vector3* vel, Vector3* normal, float*, int* is_liquid, int* hit_obj_uid + ); + GRoom* room; + ParticleEmitter* emitter; + Vector3 last_pos; + }; + static_assert(sizeof(Particle) == 0x78); - Object* get_pos_and_dir(Vector3 *pos, Vector3 *dir) + struct ParticleEmitter { - return AddrCaller{0x00496BC0}.this_call(this, pos, dir); - } -}; -static_assert(sizeof(ParticleEmitter) == 0x158); + int uid; + int parent_handle; + Vector3 pos; + Vector3 dir; + float dir_rand; + float min_vel; + float max_vel; + float spawn_radius; + float min_spawn_delay; + float max_spawn_delay; + int emitter_flags; + float min_life_secs; + float max_life_secs; + float min_pradius; + float max_pradius; + GRoom* room; + ParticleCreateInfo pci; + float cull_radius; + float max_particle_dist_sq; + Vector3 world_pos; + Particle particle_list; + float on_time; + float on_time_variance; + float off_time; + float off_time_variance; + float time_to_change; + float current_state_time; + bool active; + int field_144; + ParticleEmitter* next; + ParticleEmitter* prev; + ParticleEmitter* next_entity_emitter; + Timestamp spawn_timer; + + Object* get_pos_and_dir(Vector3* pos, Vector3* dir) + { + return AddrCaller{0x00496BC0}.this_call(this, pos, dir); + } + }; + static_assert(sizeof(ParticleEmitter) == 0x158); } diff --git a/game_patch/rf/physics.h b/game_patch/rf/physics.h index 9e24d5634..0c8c85f72 100644 --- a/game_patch/rf/physics.h +++ b/game_patch/rf/physics.h @@ -20,8 +20,8 @@ namespace rf int obj_handle; int bitmap_handle; int is_liquid; - GFace *hit_face; - short *hit_face_v3d; + GFace* hit_face; + short* hit_face_v3d; }; static_assert(sizeof(PCollisionOut) == 0x44); @@ -63,8 +63,8 @@ namespace rf }; static_assert(sizeof(PhysicsData) == 0x170); - static auto& physics_create_object = addr_as_ref(0x0049EC90); - static auto& physics_delete_object = addr_as_ref(0x0049F1D0); + static auto& physics_create_object = addr_as_ref(0x0049EC90); + static auto& physics_delete_object = addr_as_ref(0x0049F1D0); template<> inline void VArray::add(PCollisionSphere element) diff --git a/game_patch/rf/player/camera.h b/game_patch/rf/player/camera.h index 53e0cb6d6..0f249257e 100644 --- a/game_patch/rf/player/camera.h +++ b/game_patch/rf/player/camera.h @@ -10,36 +10,36 @@ namespace rf enum CameraMode { - CAMERA_FIRST_PERSON = 0x0, - CAMERA_THIRD_PERSON = 0x1, - CAMERA_FREELOOK = 0x2, - CAMERA_DESCENT_FLY = 0x3, - CAMERA_DEAD_VIEW = 0x4, - CAMERA_CUTSCENE = 0x5, - CAMERA_FIXED_VIEW = 0x6, - CAMERA_ORBIT = 0x7, + CAMERA_FIRST_PERSON = 0x0, + CAMERA_THIRD_PERSON = 0x1, + CAMERA_FREELOOK = 0x2, + CAMERA_DESCENT_FLY = 0x3, + CAMERA_DEAD_VIEW = 0x4, + CAMERA_CUTSCENE = 0x5, + CAMERA_FIXED_VIEW = 0x6, + CAMERA_ORBIT = 0x7, }; struct Camera { - Entity *camera_entity; - Player *player; + Entity* camera_entity; + Player* player; CameraMode mode; }; static_assert(sizeof(Camera) == 0xC); - static auto& camera_enter_first_person = addr_as_ref(0x0040DDF0); - static auto& camera_enter_freelook = addr_as_ref(0x0040DCF0); - static auto& camera_enter_fixed = addr_as_ref(0x0040DF70); + static auto& camera_enter_first_person = addr_as_ref(0x0040DDF0); + static auto& camera_enter_freelook = addr_as_ref(0x0040DCF0); + static auto& camera_enter_fixed = addr_as_ref(0x0040DF70); - inline Vector3 camera_get_pos(Camera *camera) + inline Vector3 camera_get_pos(Camera* camera) { Vector3 result; AddrCaller{0x0040D760}.c_call(&result, camera); return result; } - inline Matrix3 camera_get_orient(Camera *camera) + inline Matrix3 camera_get_orient(Camera* camera) { Matrix3 result; AddrCaller{0x0040D780}.c_call(&result, camera); diff --git a/game_patch/rf/player/control_config.h b/game_patch/rf/player/control_config.h index 6e710fc1e..f51462573 100644 --- a/game_patch/rf/player/control_config.h +++ b/game_patch/rf/player/control_config.h @@ -70,8 +70,9 @@ namespace rf static_assert(sizeof(ControlConfig) == 0xE50); static auto& control_config_check_pressed = - addr_as_ref(0x0043D4F0); - static auto& control_config_get_key_name = addr_as_ref(0x0043D930); - static auto& control_config_get_mouse_button_name = addr_as_ref(0x0043D970); - static auto& control_config_find_action_by_name = addr_as_ref(0x0043D9F0); + addr_as_ref(0x0043D4F0); + static auto& control_config_get_key_name = addr_as_ref(0x0043D930); + static auto& control_config_get_mouse_button_name = addr_as_ref(0x0043D970); + static auto& control_config_find_action_by_name = + addr_as_ref(0x0043D9F0); } diff --git a/game_patch/rf/player/player.h b/game_patch/rf/player/player.h index 7cd581b41..11ad55505 100644 --- a/game_patch/rf/player/player.h +++ b/game_patch/rf/player/player.h @@ -105,19 +105,19 @@ namespace rf struct Player { - struct Player *next; - struct Player *prev; + struct Player* next; + struct Player* prev; String name; unsigned flags; int entity_handle; int entity_type; Vector3 spew_pos; ubyte spew_vector_index; - PlayerLevelStats *stats; + PlayerLevelStats* stats; ubyte team; bool collides_with_world; - VMesh *weapon_mesh_handle; - VMesh *last_weapon_mesh_handle; + VMesh* weapon_mesh_handle; + VMesh* last_weapon_mesh_handle; Timestamp next_idle; int muzzle_tag_index[2]; int ammo_digit1_tag_index; @@ -129,7 +129,7 @@ namespace rf Timestamp remote_charge_switch_timestamp; Timestamp use_key_timestamp; Timestamp spawn_protection_timestamp; - Camera *cam; + Camera* cam; PlayerViewport viewport; int viewport_mode; int flashlight_light; @@ -155,7 +155,7 @@ namespace rf float field_11F4; int field_11F8; ubyte last_damage_dir; - PlayerNetData *net_data; + PlayerNetData* net_data; }; static_assert(sizeof(Player) == 0x1204); @@ -163,14 +163,15 @@ namespace rf static auto& local_player = addr_as_ref(0x007C75D4); static auto& player_from_entity_handle = addr_as_ref(0x004A3740); - static auto& player_is_dead = addr_as_ref(0x004A4920); - static auto& player_is_dying = addr_as_ref(0x004A4940); - static auto& player_add_score = addr_as_ref(0x004A7460); - static auto& player_get_ai = addr_as_ref(0x004A3260); - static auto& player_get_weapon_total_ammo = addr_as_ref(0x004A3280); + static auto& player_is_dead = addr_as_ref(0x004A4920); + static auto& player_is_dying = addr_as_ref(0x004A4940); + static auto& player_add_score = addr_as_ref(0x004A7460); + static auto& player_get_ai = addr_as_ref(0x004A3260); + static auto& player_get_weapon_total_ammo = addr_as_ref(0x004A3280); static auto& player_render = addr_as_ref(0x004A2B30); static auto& player_render_held_corpse = addr_as_ref(0x004A2B90); static auto& player_do_frame = addr_as_ref(0x004A2700); - static auto& player_make_weapon_current_selection = addr_as_ref(0x004A4980); - static auto& player_start_death_fade = addr_as_ref(0x004A73E0); + static auto& player_make_weapon_current_selection = addr_as_ref(0x004A4980); + static auto& player_start_death_fade = + addr_as_ref(0x004A73E0); } diff --git a/game_patch/rf/player/player_fpgun.h b/game_patch/rf/player/player_fpgun.h index b7eab8052..cc8c677ea 100644 --- a/game_patch/rf/player/player_fpgun.h +++ b/game_patch/rf/player/player_fpgun.h @@ -55,7 +55,7 @@ namespace rf static auto& player_fpgun_set_state = addr_as_ref(0x004AA230); static auto& player_fpgun_process = addr_as_ref(0x004AA6D0); static auto& player_fpgun_render_ir = addr_as_ref(0x004AEEF0); - static auto& player_fpgun_set_next_state_anim = addr_as_ref(0x004AA560); + static auto& player_fpgun_set_next_state_anim = addr_as_ref(0x004AA560); static auto& player_fpgun_is_in_state_anim = addr_as_ref(0x004A9520); static auto& player_fpgun_clear_all_action_anim_sounds = addr_as_ref(0x004A9490); static auto& player_fpgun_load_meshes = addr_as_ref(0x004AE530); diff --git a/game_patch/rf/save_restore.h b/game_patch/rf/save_restore.h index 408653243..cb8a15d62 100644 --- a/game_patch/rf/save_restore.h +++ b/game_patch/rf/save_restore.h @@ -2,11 +2,13 @@ #include -namespace rf { +namespace rf +{ struct Player; } -namespace rf::sr { +namespace rf::sr +{ constexpr uint8_t MAX_GOAL_CREATE_EVENTS = 8; constexpr uint8_t MAX_ALARM_SIREN_EVENTS = 8; constexpr uint8_t MAX_WHEN_DEAD_EVENTS = 20; @@ -57,7 +59,7 @@ namespace rf::sr { }; static_assert(sizeof(LevelData) == 0x18720); - static auto& save_game = addr_as_ref(0x004B3B30); + static auto& save_game = addr_as_ref(0x004B3B30); static auto& can_save_now = addr_as_ref(0x004B61A0); static auto& savegame_path = addr_as_ref(0x007DB3EC); diff --git a/game_patch/rf/sound/sound.h b/game_patch/rf/sound/sound.h index 750a27320..924269269 100644 --- a/game_patch/rf/sound/sound.h +++ b/game_patch/rf/sound/sound.h @@ -80,27 +80,37 @@ namespace rf static auto snd_load_hint = addr_as_ref(0x005054D0); static auto snd_play = addr_as_ref(0x00505560); - static auto snd_play_3d = addr_as_ref(0x005056A0); + static auto snd_play_3d = + addr_as_ref(0x005056A0); static auto snd_init_instance = addr_as_ref(0x00505680); static auto snd_stop_all_paused = addr_as_ref(0x005059F0); static auto snd_is_playing = addr_as_ref(0x00505C00); static auto snd_pause = addr_as_ref(0x00505C70); - static auto snd_change_3d = addr_as_ref(0x005058C0); - static auto snd_calculate_2d_from_3d_info = addr_as_ref(0x00505740); - static auto snd_update_sounds = addr_as_ref(0x00505EC0); + static auto snd_change_3d = + addr_as_ref(0x005058C0); + static auto snd_calculate_2d_from_3d_info = + addr_as_ref(0x00505740); + static auto snd_update_sounds = + addr_as_ref(0x00505EC0 + ); - static auto snd_pc_play = addr_as_ref(0x005439D0); - static auto snd_pc_play_looping = addr_as_ref(0x00543A80); - static auto snd_pc_play_3d = addr_as_ref(0x00544180); + static auto snd_pc_play = + addr_as_ref(0x005439D0); + static auto snd_pc_play_looping = + addr_as_ref(0x00543A80); + static auto snd_pc_play_3d = + addr_as_ref(0x00544180); static auto snd_pc_stop = addr_as_ref(0x005442B0); static auto snd_pc_is_playing = addr_as_ref(0x00544360); static auto snd_pc_set_volume = addr_as_ref(0x00544390); static auto snd_pc_set_pan = addr_as_ref(0x00544450); static auto snd_pc_get_by_id = addr_as_ref(0x00544700); static auto snd_pc_get_duration = addr_as_ref(0x00544760); - static auto snd_pc_change_listener = addr_as_ref(0x00543480); + static auto snd_pc_change_listener = + addr_as_ref(0x00543480); static auto snd_pc_calc_volume_3d = addr_as_ref(0x00543C20); - static auto snd_pc_load_hint = addr_as_ref(0x00543760); + static auto snd_pc_load_hint = + addr_as_ref(0x00543760); static auto snd_pc_is_ds3d_enabled = addr_as_ref(0x00544750); static auto snd_pc_calculate_pan = addr_as_ref(0x00543EA0); } diff --git a/game_patch/rf/sound/sound_ds.h b/game_patch/rf/sound/sound_ds.h index a983294ed..56fc36f04 100644 --- a/game_patch/rf/sound/sound_ds.h +++ b/game_patch/rf/sound/sound_ds.h @@ -16,10 +16,10 @@ namespace rf int packfile_offset; int name_checksum; int field_208_ds_load_buffer_param; - IDirectSoundBuffer *ds_buffer; - IDirectSound3DBuffer *ds_3d_buffer; - WAVEFORMATEX *wave_format_orig; - WAVEFORMATEX *wave_format_fixed; + IDirectSoundBuffer* ds_buffer; + IDirectSound3DBuffer* ds_3d_buffer; + WAVEFORMATEX* wave_format_orig; + WAVEFORMATEX* wave_format_fixed; int field_21c; HMMIO hmmio; MMCKINFO data_chunk_info; @@ -66,7 +66,10 @@ namespace rf static auto snd_ds_channel_is_paused = addr_as_ref(0x00522500); static auto snd_ds_get_channel = addr_as_ref(0x00522F30); static auto snd_ds_estimate_duration = addr_as_ref(0x00523170); - static auto snd_ds_play_3d = addr_as_ref(0x005222B0); + static auto snd_ds_play_3d = addr_as_ref< + int(int sid, const Vector3& pos, const Vector3& vel, float min_dist, float max_dist, float volume, + bool is_looping, float unused)>(0x005222B0); - static auto snd_ds3d_update_buffer = addr_as_ref(0x00562DB0); + static auto snd_ds3d_update_buffer = + addr_as_ref(0x00562DB0); } diff --git a/game_patch/rf/trigger.h b/game_patch/rf/trigger.h index c3b6b7b0c..749b1ff5d 100644 --- a/game_patch/rf/trigger.h +++ b/game_patch/rf/trigger.h @@ -6,8 +6,8 @@ namespace rf { struct Trigger : Object { - Trigger *next; - Trigger *prev; + Trigger* next; + Trigger* prev; int type; Timestamp next_check; int reset_time_ms; diff --git a/game_patch/rf/ui.h b/game_patch/rf/ui.h index 655f88496..b281d7c81 100644 --- a/game_patch/rf/ui.h +++ b/game_patch/rf/ui.h @@ -7,8 +7,8 @@ namespace rf::ui { struct Gadget { - void **vtbl; - Gadget *parent; + void** vtbl; + Gadget* parent; bool highlighted; bool enabled; int x; @@ -16,8 +16,8 @@ namespace rf::ui int w; int h; int key; - void(*on_click)(); - void(*on_mouse_btn_down)(); + void (*on_click)(); + void (*on_mouse_btn_down)(); [[nodiscard]] int get_absolute_x() const { @@ -93,15 +93,18 @@ namespace rf::ui }; static_assert(sizeof(Cycler) == 0x170); - static auto& popup_message = addr_as_ref(0x004560B0); + static auto& popup_message = + addr_as_ref(0x004560B0); using PopupCallbackPtr = void (*)(); - static auto& popup_custom = - addr_as_ref(0x004562A0); + static auto& popup_custom = addr_as_ref(0x004562A0); static auto& popup_abort = addr_as_ref(0x004559C0); - static auto& popup_set_text = addr_as_ref(0x00455A50); + static auto& popup_set_text = addr_as_ref(0x00455A50); - static auto& get_gadget_from_pos = addr_as_ref(0x00442ED0); + static auto& get_gadget_from_pos = + addr_as_ref(0x00442ED0); static auto& update_input_box_cursor = addr_as_ref(0x00456960); static auto& scale_x = addr_as_ref(0x00598FB8); diff --git a/game_patch/rf/v3d.h b/game_patch/rf/v3d.h index 3d363d7ca..28d9c52be 100644 --- a/game_patch/rf/v3d.h +++ b/game_patch/rf/v3d.h @@ -17,19 +17,19 @@ namespace rf char v3d_filename[65]; int version; int num_meshes; - V3dMesh *meshes; + V3dMesh* meshes; int num_lod_meshes; - LodMesh *lod_meshes; + LodMesh* lod_meshes; int num_navpoints; - void *navpoints; + void* navpoints; int num_cspheres; - V3DCSphere *cspheres; + V3DCSphere* cspheres; int total_vertices_count_ccrunch_zeroed; int unk_vertices_array_ccrunch_zeroed; int total_triangles_count_ccrunch_zeroed; int unk_triangle_array_ccrunch_zeroed; int num_mesh_materials; - MaterialClass *mesh_materials; + MaterialClass* mesh_materials; int hdr_field_14_ccrunch_zeroed; int unk_array_hdr_field_14_ccrunch_zeroed; int field_88; @@ -42,8 +42,8 @@ namespace rf char name[65]; char parent_name[65]; int num_materials; - MaterialClass *materials; - VifLodMesh *vu; + MaterialClass* materials; + VifLodMesh* vu; }; static_assert(sizeof(V3dMesh) == 0x90); @@ -64,15 +64,15 @@ namespace rf struct VifChunk { gr::Mode mode; - Vector3 *vecs; - Vector3 *norms; - Vector2 *uvs; - Plane *face_planes; - VifFace *faces; - short *same_vertex_offsets; - WeightIndexArray *wi; + Vector3* vecs; + Vector3* norms; + Vector2* uvs; + Plane* face_planes; + VifFace* faces; + short* same_vertex_offsets; + WeightIndexArray* wi; int texture_idx; - short *orig_map; + short* orig_map; ushort num_vecs; ushort num_faces; ushort vecs_alloc; @@ -93,10 +93,10 @@ namespace rf struct VifMesh { int data_block_size; - void *data_block; - VifChunk *chunks; + void* data_block; + VifChunk* chunks; ushort num_chunks; - VifPropPoint *prop_points; + VifPropPoint* prop_points; int num_prop_points; ubyte tex_ids[7]; int tex_handles[7]; @@ -105,7 +105,7 @@ namespace rf int num_original_vecs; int unk_field_from_v3d_file; #ifdef DASH_FACTION - void *render_cache; + void* render_cache; #endif }; @@ -114,14 +114,14 @@ namespace rf struct VifLodMesh { int num_levels; - VifMesh *meshes[3]; + VifMesh* meshes[3]; float distances[3]; Vector3 center; float radius; Vector3 bbox_min; Vector3 bbox_max; #ifdef DASH_FACTION - void *render_cache; + void* render_cache; #endif }; @@ -131,10 +131,10 @@ namespace rf int lod_level; int alpha; gr::Color self_illum; // unused - int *alt_tex; + int* alt_tex; float field_14_unk_fire; gr::Color field_18; - ubyte *vertex_colors; + ubyte* vertex_colors; int powerup_bitmaps[2]; gr::Color ambient_color; Matrix3 orient; diff --git a/game_patch/rf/vmesh.h b/game_patch/rf/vmesh.h index ff3965816..78d742c30 100644 --- a/game_patch/rf/vmesh.h +++ b/game_patch/rf/vmesh.h @@ -31,7 +31,6 @@ namespace rf { AddrCaller{0x00416190}.this_call(this); } - }; static_assert(sizeof(VMeshCollisionInput) == 0x68); @@ -40,7 +39,7 @@ namespace rf float fraction; Vector3 hit_point; Vector3 hit_normal; - short *triangle_indices; + short* triangle_indices; VMeshCollisionOutput() { @@ -68,26 +67,31 @@ namespace rf TexMap texture_maps[2]; int framerate; int num_mix_frames; - int *mix; + int* mix; float specular_level; float glossiness; float reflection_amount; char refl_tex_name[36]; int refl_tex_handle; int num_self_illumination_frames; - float *self_illumination; + float* self_illumination; int num_opacity_frames; - int *opacity; + int* opacity; }; static_assert(sizeof(MeshMaterial) == 0xC8); - static auto& vmesh_get_type = addr_as_ref(0x00502B00); + static auto& vmesh_get_type = addr_as_ref(0x00502B00); static auto& vmesh_get_name = addr_as_ref(0x00503470); - static auto& vmesh_get_num_cspheres = addr_as_ref(0x00503250); - static auto& vmesh_get_csphere = addr_as_ref(0x00503270); - static auto& vmesh_collide = addr_as_ref(0x005031F0); - static auto& vmesh_calc_lighting_data_size = addr_as_ref(0x00503F50); - static auto& vmesh_update_lighting_data = addr_as_ref(0x00504000); + static auto& vmesh_get_num_cspheres = addr_as_ref(0x00503250); + static auto& vmesh_get_csphere = + addr_as_ref(0x00503270); + static auto& vmesh_collide = + addr_as_ref(0x005031F0); + static auto& vmesh_calc_lighting_data_size = addr_as_ref(0x00503F50); + static auto& vmesh_update_lighting_data = addr_as_ref< + int(VMesh* vmesh, GRoom* room, const Vector3& pos, const Matrix3& orient, void* mesh_lighting_data)>(0x00504000 + ); static auto& vmesh_stop_all_actions = addr_as_ref(0x00503400); - static auto& vmesh_get_materials_array = addr_as_ref(0x00503650); + static auto& vmesh_get_materials_array = + addr_as_ref(0x00503650); } diff --git a/game_patch/rf/weapon.h b/game_patch/rf/weapon.h index 16d7cddc3..29d6aa905 100644 --- a/game_patch/rf/weapon.h +++ b/game_patch/rf/weapon.h @@ -29,7 +29,8 @@ namespace rf }; static_assert(sizeof(ObjLight) == 0x18); - enum WeaponInfoType { + enum WeaponInfoType + { WEAPON_PRIMARY = 0, WEAPON_SECONDARY = 1, }; @@ -43,12 +44,12 @@ namespace rf String embedded_vmesh_filename; int ammo_type; String third_person_vmesh_filename; - VMesh *third_person_vmesh_handle; + VMesh* third_person_vmesh_handle; int third_person_muzzle_tag; int third_person_grip_tag; int third_person_muzzle_flash_glare_index; String first_person_vmesh_filename; - VMesh *mesh; + VMesh* mesh; Vector3 first_person_offset; Vector3 first_person_offset_ss; int first_person_muzzle_flash_bitmap; @@ -179,10 +180,10 @@ namespace rf float shake_camera_distance; float shake_camera_time; String silencer_v3d_name; - VMesh *silencer_v3d; + VMesh* silencer_v3d; int silencer_fp_tag; String spark_vfx_name; - VMesh *spark_vfx; + VMesh* spark_vfx; int spark_fp_tag; int spark_fp_flash_bitmap; float ai_max_range_single; @@ -198,7 +199,7 @@ namespace rf float fine_aim_region_factor; float fine_aim_region_factor_ss; String tracer_mesh_filename; - VMesh *tracer_mesh_handle; + VMesh* tracer_mesh_handle; float multi_bbox_size_factor; }; static_assert(sizeof(WeaponInfo) == 0x550); @@ -239,9 +240,9 @@ namespace rf }; struct Weapon : Object { - Weapon *next; - Weapon *prev; - WeaponInfo *info; + Weapon* next; + Weapon* prev; + WeaponInfo* info; int info_index; float lifeleft_seconds; int fly_sound_handle; @@ -290,5 +291,5 @@ namespace rf static auto& weapon_is_melee = addr_as_ref(0x004C91B0); static auto& weapon_uses_clip = addr_as_ref(0x004C86E0); static auto& weapon_get_fire_wait_ms = addr_as_ref(0x004C8710); - static auto& weapon_restore_mesh = addr_as_ref(0x004C8140); + static auto& weapon_restore_mesh = addr_as_ref(0x004C8140); } diff --git a/game_patch/sound/sound.cpp b/game_patch/sound/sound.cpp index 949fd7272..f0632d207 100644 --- a/game_patch/sound/sound.cpp +++ b/game_patch/sound/sound.cpp @@ -41,29 +41,11 @@ StaticBufferResizePatch sound_instances_resize_patch{ 30, rf::sound_instances, { - {0x005053F9}, - {0x00505599}, - {0x005055CB}, - {0x0050571F}, - {0x005058E7}, - {0x00505A04}, - {0x00505A65}, - {0x00505A6C}, - {0x005060BB}, - {0x005058EE}, - {0x00505995}, - {0x0050599C}, - {0x00505C28}, - {0x00506197}, - {0x00505866}, - {0x00505F35}, - {0x005055C1, true}, - {0x005055DB, true}, - {0x00505A12, true}, - {0x005060EB, true}, - {0x00505893, true}, - {0x00505F68, true}, - {0x005061C1, true}, + {0x005053F9}, {0x00505599}, {0x005055CB}, {0x0050571F}, {0x005058E7}, + {0x00505A04}, {0x00505A65}, {0x00505A6C}, {0x005060BB}, {0x005058EE}, + {0x00505995}, {0x0050599C}, {0x00505C28}, {0x00506197}, {0x00505866}, + {0x00505F35}, {0x005055C1, true}, {0x005055DB, true}, {0x00505A12, true}, {0x005060EB, true}, + {0x00505893, true}, {0x00505F68, true}, {0x005061C1, true}, }, }; @@ -93,7 +75,7 @@ CallHook cutscene_play_music_hook{ FunHook snd_music_play_cutscene_hook{ 0x00505D70, - [](const char *filename, float volume) { + [](const char* filename, float volume) { g_cutscene_bg_sound_sig = snd_music_play_cutscene_hook.call_target(filename, volume); return g_cutscene_bg_sound_sig; }, @@ -183,7 +165,9 @@ FunHook snd_play_hook{ }, }; -int snd_pc_play_3d_new(int handle, const rf::Vector3& pos, float vol_scale, bool looping, const rf::Vector3& vel = rf::zero_vector) +int snd_pc_play_3d_new( + int handle, const rf::Vector3& pos, float vol_scale, bool looping, const rf::Vector3& vel = rf::zero_vector +) { // Original function has some flaws: // * it does not have vol_scale and vel parameters @@ -203,12 +187,9 @@ int snd_pc_play_3d_new(int handle, const rf::Vector3& pos, float vol_scale, bool if (rf::snd_pc_is_ds3d_enabled()) { // use a calculated volume scale that takes distance into account because we do not use // Direct Sound 3D distance attenuation model - return rf::snd_ds_play_3d(sid, pos, vel, - rf::sounds[handle].min_range, - rf::sounds[handle].max_range, - volume_2d, - looping, - 0.0f); + return rf::snd_ds_play_3d( + sid, pos, vel, rf::sounds[handle].min_range, rf::sounds[handle].max_range, volume_2d, looping, 0.0f + ); } float pan = rf::snd_pc_calculate_pan(pos); if (looping) @@ -218,7 +199,6 @@ int snd_pc_play_3d_new(int handle, const rf::Vector3& pos, float vol_scale, bool return -1; } - FunHook snd_play_3d_hook{ 0x005056A0, [](int handle, const rf::Vector3& pos, float volume, const rf::Vector3&, int group) { @@ -232,7 +212,6 @@ FunHook snd_play_3 return -1; } - bool looping = rf::sounds[handle].is_looping; int instance_index = snd_get_free_instance(); if (instance_index < 0) { @@ -260,7 +239,10 @@ FunHook snd_play_3 sig = rf::snd_pc_play(handle, vol_scale, pan, 0.0f, true); } } - xlog::trace("snd_play_3d handle {} pos <{:.2f} {:.2f} {:.2f}> vol {:.2f} sig {}", handle, pos.x, pos.y, pos.z, volume, sig); + xlog::trace( + "snd_play_3d handle {} pos <{:.2f} {:.2f} {:.2f}> vol {:.2f} sig {}", handle, pos.x, pos.y, pos.z, volume, + sig + ); if (sig < 0) { return -1; } @@ -301,7 +283,9 @@ FunHook snd_change_3d_ if (volume != instance.base_volume_3d) { instance.base_volume_3d = volume; - rf::snd_calculate_2d_from_3d_info(instance.handle, instance.pos, &instance.pan, &instance.base_volume, instance.base_volume_3d); + rf::snd_calculate_2d_from_3d_info( + instance.handle, instance.pos, &instance.pan, &instance.base_volume, instance.base_volume_3d + ); float vol_scale = instance.base_volume * rf::snd_group_volume[instance.group]; rf::snd_pc_set_volume(instance.sig, vol_scale); } @@ -315,14 +299,17 @@ FunHook snd_change_3d_ }, }; -void snd_update_sound_instances([[ maybe_unused ]] const rf::Vector3& camera_pos) +void snd_update_sound_instances([[maybe_unused]] const rf::Vector3& camera_pos) { // Update sound volume of all instances because we do not use Direct Sound 3D distance attenuation model for (auto& instance : rf::sound_instances) { if (instance.handle >= 0 && instance.is_3d_sound) { - // Note: we should use snd_pc_calc_volume_3d because snd_calculate_2d_from_3d_info ignores volume from sounds.tbl + // Note: we should use snd_pc_calc_volume_3d because snd_calculate_2d_from_3d_info ignores volume from + // sounds.tbl // but that is how it works in RF and fixing it would change volume levels for many sounds in game... - rf::snd_calculate_2d_from_3d_info(instance.handle, instance.pos, &instance.pan, &instance.base_volume, instance.base_volume_3d); + rf::snd_calculate_2d_from_3d_info( + instance.handle, instance.pos, &instance.pan, &instance.base_volume, instance.base_volume_3d + ); float vol_scale = instance.base_volume * rf::snd_group_volume[instance.group]; rf::snd_pc_set_volume(instance.sig, vol_scale); if (!rf::ds3d_enabled) { @@ -343,7 +330,8 @@ void snd_update_ambient_sounds(const rf::Vector3& camera_pos) // Note: when ambient sound is muted its volume is set to 0 (events can mute/unmute ambient sounds) // When it's muted destroy it so it can be recreated when unmuted and start playing from the beggining if (in_range && ambient_snd.volume > 0.0f) { - float vol_scale = ambient_snd.volume * rf::snd_group_volume[rf::SOUND_GROUP_EFFECTS] * g_game_config.level_sound_volume; + float vol_scale = ambient_snd.volume * rf::snd_group_volume[rf::SOUND_GROUP_EFFECTS] * + g_game_config.level_sound_volume; if (ambient_snd.sig < 0) { bool is_looping = rf::sounds[ambient_snd.handle].is_looping; ambient_snd.sig = snd_pc_play_3d_new(ambient_snd.handle, ambient_snd.pos, vol_scale, is_looping); @@ -368,9 +356,7 @@ void snd_update_ambient_sounds(const rf::Vector3& camera_pos) ConsoleCommand2 sound_stress_test_cmd{ "sound_stress_test", - [](int num) { - g_sound_test = num; - }, + [](int num) { g_sound_test = num; }, }; void sound_test_do_frame() @@ -392,7 +378,7 @@ void sound_test_do_frame() #endif // DEBUG FunHook snd_update_sounds_hook{ - 0x00505EC0, + 0x00505EC0, [](const rf::Vector3& camera_pos, const rf::Vector3& camera_vel, const rf::Matrix3& camera_orient) { player_fpgun_move_sounds(camera_pos, camera_vel); @@ -411,24 +397,25 @@ FunHook snd_up }, }; -FunHook snd_pc_file_exists_hook{ - 0x00544680, - [](const char *filename) { - bool exists = snd_pc_file_exists_hook.call_target(filename); - - if (!exists) { - // For some reason built-in maps often use spaces in place of sound filename (their way to disable a sound?) - // To reduce spam ignore space-only filenames and avoid logging the same filename multiple times in a row - bool has_only_spaces = std::string_view{filename}.find_first_not_of(" ") == std::string_view::npos; - static std::string last_file_not_found; - if (!has_only_spaces && filename != last_file_not_found) { - xlog::warn("Sound file not found: {}", filename); - last_file_not_found = filename; - } - } - return exists; - } -}; +FunHook snd_pc_file_exists_hook{0x00544680, [](const char* filename) { + bool exists = snd_pc_file_exists_hook.call_target(filename); + + if (!exists) { + // For some reason built-in maps often use spaces in place of + // sound filename (their way to disable a sound?) To reduce + // spam ignore space-only filenames and avoid logging the + // same filename multiple times in a row + bool has_only_spaces = + std::string_view{filename}.find_first_not_of(" ") == + std::string_view::npos; + static std::string last_file_not_found; + if (!has_only_spaces && filename != last_file_not_found) { + xlog::warn("Sound file not found: {}", filename); + last_file_not_found = filename; + } + } + return exists; + }}; FunHook snd_get_handle_hook{ 0x005054B0, @@ -462,7 +449,7 @@ void apply_sound_patches() .push(asm_regs::eax); // Change number of sound channels - //write_mem(0x005055AB, asm_opcodes::jmp_rel_short); // never free sound instances, uncomment to test + // write_mem(0x005055AB, asm_opcodes::jmp_rel_short); // never free sound instances, uncomment to test sound_instances_resize_patch.install(); auto max_sound_instances = static_cast(std::size(rf::sound_instances)); write_mem(0x005053F5 + 1, max_sound_instances); // snd_init_sound_instances_array diff --git a/game_patch/sound/sound_ds.cpp b/game_patch/sound/sound_ds.cpp index bac876ce2..7a7a430f3 100644 --- a/game_patch/sound/sound_ds.cpp +++ b/game_patch/sound/sound_ds.cpp @@ -21,83 +21,22 @@ StaticBufferResizePatch ds_channels_resize_patch{ 30, rf::ds_channels, { - {0x00521149}, - {0x005211C3}, - {0x0052165D}, - {0x00522306}, - {0x005224DA}, - {0x0052250D}, - {0x005225A3}, - {0x005225B7}, - {0x005225F2}, - {0x00522608}, - {0x00522632}, - {0x0052265A}, - {0x00522734}, - {0x00522741}, - {0x00522763}, - {0x005227AD}, - {0x0052282F}, - {0x00522A61}, - {0x00522AAD}, - {0x00522B3A}, - {0x00522BDA}, - {0x00522C8E}, - {0x00522D4B}, - {0x00522D66}, - {0x00522D98}, - {0x00522DDF}, - {0x00522E1B}, - {0x00522F0B}, - {0x0052312B}, - {0x0054E8CC}, - {0x0054E956}, - {0x0054EAB5}, - {0x0054EB64}, - {0x0054EBB6}, - {0x0054EC93}, - {0x005211F5}, - {0x005225BD}, - {0x00562DC9}, - {0x0052264C}, - {0x00522781}, - {0x00522792}, - {0x00505E96}, - {0x00522688}, - {0x005226A0}, - {0x005227D8}, - {0x005227F0}, - {0x00522CFE}, - {0x00522F3A}, - {0x00522626}, - {0x0052275D}, - {0x00522D75}, - {0x0052262C}, - {0x0052271E}, - {0x00521945}, - {0x00522478}, - {0x0052251A}, - {0x005225E4}, - {0x005225EC}, - {0x00522724}, - {0x0052272E}, - {0x00522A57}, - {0x00522AA3}, - {0x00522AF4}, - {0x00522BE6}, - {0x00522BEE}, - {0x00522C04}, - {0x00522C57}, - {0x00522C80}, - {0x00522C9F}, - {0x00522CA7}, - {0x00522CB4}, - {0x0052194E}, - {0x00522F47, true}, - {0x005224A7, true}, - {0x00522B0B, true}, - {0x00522C29, true}, - {0x00522CCB, true}, + {0x00521149}, {0x005211C3}, {0x0052165D}, {0x00522306}, {0x005224DA}, + {0x0052250D}, {0x005225A3}, {0x005225B7}, {0x005225F2}, {0x00522608}, + {0x00522632}, {0x0052265A}, {0x00522734}, {0x00522741}, {0x00522763}, + {0x005227AD}, {0x0052282F}, {0x00522A61}, {0x00522AAD}, {0x00522B3A}, + {0x00522BDA}, {0x00522C8E}, {0x00522D4B}, {0x00522D66}, {0x00522D98}, + {0x00522DDF}, {0x00522E1B}, {0x00522F0B}, {0x0052312B}, {0x0054E8CC}, + {0x0054E956}, {0x0054EAB5}, {0x0054EB64}, {0x0054EBB6}, {0x0054EC93}, + {0x005211F5}, {0x005225BD}, {0x00562DC9}, {0x0052264C}, {0x00522781}, + {0x00522792}, {0x00505E96}, {0x00522688}, {0x005226A0}, {0x005227D8}, + {0x005227F0}, {0x00522CFE}, {0x00522F3A}, {0x00522626}, {0x0052275D}, + {0x00522D75}, {0x0052262C}, {0x0052271E}, {0x00521945}, {0x00522478}, + {0x0052251A}, {0x005225E4}, {0x005225EC}, {0x00522724}, {0x0052272E}, + {0x00522A57}, {0x00522AA3}, {0x00522AF4}, {0x00522BE6}, {0x00522BEE}, + {0x00522C04}, {0x00522C57}, {0x00522C80}, {0x00522C9F}, {0x00522CA7}, + {0x00522CB4}, {0x0052194E}, {0x00522F47, true}, {0x005224A7, true}, {0x00522B0B, true}, + {0x00522C29, true}, {0x00522CCB, true}, }, }; @@ -235,22 +174,26 @@ ConsoleCommand2 playing_sounds_cmd{ DWORD status; chnl.pdsb->GetStatus(&status); auto& buf = rf::ds_buffers[chnl.buf_id]; - rf::console::print("Channel {}: filename {} flags {:x} status {:x}", chnl_num, buf.filename, chnl.flags, status); + rf::console::print( + "Channel {}: filename {} flags {:x} status {:x}", chnl_num, buf.filename, chnl.flags, status + ); } } }, }; #endif -struct MmioWrapper { +struct MmioWrapper +{ HMMIO hmmio = nullptr; stb_vorbis* vorbis = nullptr; }; FunHook snd_mmio_open_hook{ 0x00563370, - [](LPSTR filename, LONG offset, HMMIO* hmmio, WAVEFORMATEX **wfmt_orig, WAVEFORMATEX **wfmt_ds, LPMMCKINFO chunk_info) { - char *sound_name = filename - 0x100; + [](LPSTR filename, LONG offset, HMMIO* hmmio, WAVEFORMATEX** wfmt_orig, WAVEFORMATEX** wfmt_ds, + LPMMCKINFO chunk_info) { + char* sound_name = filename - 0x100; xlog::trace("Loading sound: {}", sound_name); if (!strcmp(rf::file_get_ext(sound_name), ".ogg")) { xlog::info("Loading Ogg Vorbis: {}", sound_name); @@ -259,7 +202,7 @@ FunHook sn xlog::error("Cannot get file size: {}", filename); return -1; } - FILE *file = std::fopen(filename, "rb"); + FILE* file = std::fopen(filename, "rb"); if (!file) { xlog::error("Failed to open: {}", filename); return -1; @@ -307,7 +250,8 @@ FunHook snd_mmio_find_data_chunk_hook{ float length = stb_vorbis_stream_length_in_seconds(wrapper->vorbis); data_mmcki->cksize = info.sample_rate * info.channels * sizeof(short) * length; return 0; - } else { + } + else { return snd_mmio_find_data_chunk_hook.call_target(&wrapper->hmmio, data_mmcki, riff_mmcki); } }, @@ -315,11 +259,13 @@ FunHook snd_mmio_find_data_chunk_hook{ FunHook snd_mmio_read_chunk_hook{ 0x00563620, - [](HMMIO hmmio, unsigned buf_size, BYTE *buf, MMCKINFO *mmcki, int *bytes_read) { + [](HMMIO hmmio, unsigned buf_size, BYTE* buf, MMCKINFO* mmcki, int* bytes_read) { auto wrapper = reinterpret_cast(hmmio); if (wrapper->vorbis) { stb_vorbis_info info = stb_vorbis_get_info(wrapper->vorbis); - int samples_read = stb_vorbis_get_samples_short_interleaved(wrapper->vorbis, info.channels, reinterpret_cast(buf), buf_size / 2); + int samples_read = stb_vorbis_get_samples_short_interleaved( + wrapper->vorbis, info.channels, reinterpret_cast(buf), buf_size / 2 + ); *bytes_read = samples_read * info.channels * sizeof(short); xlog::info("Ogg Vorbis: read {} samples", samples_read); return 0; @@ -330,7 +276,7 @@ FunHook snd_mmio_read_chunk_hook{ FunHook snd_mmio_close_hook{ 0x005636E0, - [](HMMIO *hmmio) { + [](HMMIO* hmmio) { auto wrapper = reinterpret_cast(*hmmio); if (!wrapper) { return; @@ -338,7 +284,8 @@ FunHook snd_mmio_close_hook{ if (wrapper->vorbis) { xlog::info("Closing Ogg Vorbis stream"); stb_vorbis_close(wrapper->vorbis); - } else { + } + else { snd_mmio_close_hook.call_target(&wrapper->hmmio); } delete wrapper; diff --git a/launcher/AboutDlg.cpp b/launcher/AboutDlg.cpp index 99eaed431..327090ffe 100644 --- a/launcher/AboutDlg.cpp +++ b/launcher/AboutDlg.cpp @@ -5,10 +5,7 @@ #include #include -AboutDlg::AboutDlg() - : CDialog(IDD_ABOUT) -{ -} +AboutDlg::AboutDlg() : CDialog(IDD_ABOUT) {} BOOL AboutDlg::OnInitDialog() { @@ -32,21 +29,21 @@ BOOL AboutDlg::OnInitDialog() return TRUE; } -LRESULT AboutDlg::OnNotify([[ maybe_unused ]] WPARAM wparam, LPARAM lparam) +LRESULT AboutDlg::OnNotify([[maybe_unused]] WPARAM wparam, LPARAM lparam) { auto& nmhdr = *reinterpret_cast(lparam); switch (nmhdr.code) { - case NM_CLICK: - // Fall through to the next case. - case NM_RETURN: - if (nmhdr.idFrom == IDC_LICENSE_LINK) { - OpenLicensingInfo(); - } - else if (nmhdr.idFrom == IDC_SRC_LINK) { - auto& nmlink = *reinterpret_cast(lparam); - ShellExecuteW(nullptr, L"open", nmlink.item.szUrl, nullptr, nullptr, SW_SHOW); - } - break; + case NM_CLICK: + // Fall through to the next case. + case NM_RETURN: + if (nmhdr.idFrom == IDC_LICENSE_LINK) { + OpenLicensingInfo(); + } + else if (nmhdr.idFrom == IDC_SRC_LINK) { + auto& nmlink = *reinterpret_cast(lparam); + ShellExecuteW(nullptr, L"open", nmlink.item.szUrl, nullptr, nullptr, SW_SHOW); + } + break; } return 0; } diff --git a/launcher/AboutDlg.h b/launcher/AboutDlg.h index 6db1185d6..7ee3783d5 100644 --- a/launcher/AboutDlg.h +++ b/launcher/AboutDlg.h @@ -6,10 +6,10 @@ class AboutDlg : public CDialog { public: - AboutDlg(); + AboutDlg(); protected: BOOL OnInitDialog() override; - LRESULT OnNotify([[ maybe_unused ]] WPARAM wparam, LPARAM lparam) override; + LRESULT OnNotify([[maybe_unused]] WPARAM wparam, LPARAM lparam) override; void OpenLicensingInfo(); }; diff --git a/launcher/LauncherApp.cpp b/launcher/LauncherApp.cpp index ab62bb7ce..15afcb1eb 100644 --- a/launcher/LauncherApp.cpp +++ b/launcher/LauncherApp.cpp @@ -11,13 +11,12 @@ #define new DEBUG_NEW #endif - // LauncherApp initialization int LauncherApp::Run() { - // InitCommonControlsEx() is required on Windows XP if an application - // manifest specifies use of ComCtl32.dll version 6 or later to enable - // visual styles. Otherwise, any window creation will fail. + // InitCommonControlsEx() is required on Windows XP if an application + // manifest specifies use of ComCtl32.dll version 6 or later to enable + // visual styles. Otherwise, any window creation will fail. Win32xx::LoadCommonControls(); // Command line parsing @@ -26,14 +25,16 @@ int LauncherApp::Run() if (m_cmd_line_info.HasHelpFlag()) { // Note: we can't use stdio console API in win32 application - Message(nullptr, + Message( + nullptr, "Usage: DashFactionLauncher [-game] [-level name] [-editor] args...\n" "-game Starts game immediately\n" "-level name Starts game immediately and loads specified level\n" "-editor Starts level editor immediately\n" "-exepath Override patched executable file location\n" "args... Additional arguments passed to game or editor\n", - "Dash Faction Launcher Help", MB_OK | MB_ICONINFORMATION); + "Dash Faction Launcher Help", MB_OK | MB_ICONINFORMATION + ); return 0; } @@ -43,7 +44,6 @@ int LauncherApp::Run() // Disable elevation (UAC) SetEnvironmentVariableA("__COMPAT_LAYER", "RunAsInvoker"); - // Launch game or editor based on command line flag if (m_cmd_line_info.HasGameFlag()) { LaunchGame(nullptr, nullptr); @@ -57,11 +57,11 @@ int LauncherApp::Run() // Show main dialog xlog::info("Showing main dialog"); - MainDlg dlg; - dlg.DoModal(); + MainDlg dlg; + dlg.DoModal(); xlog::info("Closing the launcher"); - return 0; + return 0; } void LauncherApp::MigrateConfig() @@ -99,28 +99,32 @@ bool LauncherApp::LaunchGame(HWND hwnd, const char* mod_name) launcher.check_installation(); xlog::info("Installation is okay"); } - catch (FileNotFoundException &e) { + catch (FileNotFoundException& e) { std::stringstream ss; std::string download_url; - ss << "Game directory validation has failed! File is missing:\n" << e.get_file_name() << "\n" - << "Please make sure game executable specified in options is located inside a valid Red Faction installation " - << "root directory."; + ss << "Game directory validation has failed! File is missing:\n" + << e.get_file_name() << "\n" + << "Please make sure game executable specified in options is located inside a valid Red Faction " + "installation " + << "root directory."; std::string str = ss.str(); Message(hwnd, str.c_str(), nullptr, MB_OK | MB_ICONWARNING); return false; } - catch (FileHashVerificationException &e) { + catch (FileHashVerificationException& e) { std::stringstream ss; std::string download_url; ss << "Game directory validation has failed! File " << e.get_file_name() << " has unrecognized hash sum.\n\n" - << "SHA1:\n" << e.get_sha1(); + << "SHA1:\n" + << e.get_sha1(); if (e.get_file_name() == "tables.vpp") { ss << "\n\nIt can prevent multiplayer functionality or entire game from working properly.\n" - << "If your game has not been updated to 1.20 please do it first. If this warning still shows up " - << "replace your tables.vpp file with original 1.20 NA " << e.get_file_name() << " available on FactionFiles.com.\n" - << "Do you want to open download page?"; + << "If your game has not been updated to 1.20 please do it first. If this warning still shows up " + << "replace your tables.vpp file with original 1.20 NA " << e.get_file_name() + << " available on FactionFiles.com.\n" + << "Do you want to open download page?"; std::string str = ss.str(); download_url = "https://www.factionfiles.com/ff.php?action=file&id=517871"; int result = Message(hwnd, str.c_str(), nullptr, MB_YESNOCANCEL | MB_ICONWARNING); @@ -146,32 +150,38 @@ bool LauncherApp::LaunchGame(HWND hwnd, const char* mod_name) xlog::info("Game launched!"); return true; } - catch (PrivilegeElevationRequiredException&){ - Message(hwnd, + catch (PrivilegeElevationRequiredException&) { + Message( + hwnd, "Privilege elevation is required. Please change RF.exe file properties and disable all " "compatibility settings (Run as administrator, Compatibility mode for Windows XX, etc.) or run " "Dash Faction launcher as administrator.", - nullptr, MB_OK | MB_ICONERROR); + nullptr, MB_OK | MB_ICONERROR + ); } catch (FileNotFoundException&) { - Message(hwnd, "Game executable has not been found. Please set a proper path in Options.", - nullptr, MB_OK | MB_ICONERROR); + Message( + hwnd, "Game executable has not been found. Please set a proper path in Options.", nullptr, + MB_OK | MB_ICONERROR + ); } - catch (FileHashVerificationException &e) { + catch (FileHashVerificationException& e) { std::stringstream ss; ss << "Unsupported game executable has been detected!\n\n" - << "SHA1:\n" << e.get_sha1() << "\n\n" - << "Dash Faction supports only unmodified Red Faction 1.20 NA executable.\n" - << "If your game has not been updated to 1.20 please do it first. If the error still shows up " - << "replace your RF.exe file with original 1.20 NA RF.exe available on FactionFiles.com.\n" - << "Click OK to open download page."; + << "SHA1:\n" + << e.get_sha1() << "\n\n" + << "Dash Faction supports only unmodified Red Faction 1.20 NA executable.\n" + << "If your game has not been updated to 1.20 please do it first. If the error still shows up " + << "replace your RF.exe file with original 1.20 NA RF.exe available on FactionFiles.com.\n" + << "Click OK to open download page."; std::string str = ss.str(); if (Message(hwnd, str.c_str(), nullptr, MB_OKCANCEL | MB_ICONERROR) == IDOK) { - ShellExecuteA(hwnd, "open", "https://www.factionfiles.com/ff.php?action=file&id=517545", nullptr, nullptr, - SW_SHOW); + ShellExecuteA( + hwnd, "open", "https://www.factionfiles.com/ff.php?action=file&id=517545", nullptr, nullptr, SW_SHOW + ); } } - catch (std::exception &e) { + catch (std::exception& e) { std::string msg = generate_message_for_exception(e); Message(hwnd, msg.c_str(), nullptr, MB_ICONERROR | MB_OK); } @@ -197,14 +207,14 @@ bool LauncherApp::LaunchEditor(HWND hwnd, const char* mod_name) xlog::info("Editor launched!"); return true; } - catch (std::exception &e) { + catch (std::exception& e) { std::string msg = generate_message_for_exception(e); Message(hwnd, msg.c_str(), nullptr, MB_ICONERROR | MB_OK); return false; } } -int LauncherApp::Message(HWND hwnd, const char *text, const char *title, int flags) +int LauncherApp::Message(HWND hwnd, const char* text, const char* title, int flags) { WatchDogTimer::ScopedPause wdt_pause{m_watch_dog_timer}; xlog::info("{}: {}", title ? title : "Error", text); diff --git a/launcher/LauncherApp.h b/launcher/LauncherApp.h index 1bffb9dce..1f5762120 100644 --- a/launcher/LauncherApp.h +++ b/launcher/LauncherApp.h @@ -18,7 +18,7 @@ class LauncherApp : public CWinApp private: static void MigrateConfig(); - int Message(HWND hwnd, const char *text, const char *title, int flags); + int Message(HWND hwnd, const char* text, const char* title, int flags); }; inline LauncherApp* GetLauncherApp() diff --git a/launcher/MainDlg.cpp b/launcher/MainDlg.cpp index e09875671..d3ecad49b 100644 --- a/launcher/MainDlg.cpp +++ b/launcher/MainDlg.cpp @@ -15,9 +15,7 @@ #define WM_UPDATE_CHECK (WM_USER + 10) -MainDlg::MainDlg() : CDialog(IDD_MAIN) -{ -} +MainDlg::MainDlg() : CDialog(IDD_MAIN) {} BOOL MainDlg::OnInitDialog() { @@ -36,7 +34,6 @@ BOOL MainDlg::OnInitDialog() auto* hbm = static_cast(GetApp()->LoadImage(MAKEINTRESOURCE(IDB_HEADER), IMAGE_BITMAP, 0, 0, 0)); m_picture.SetBitmap(hbm); - // Fill mod selector RefreshModSelector(); @@ -62,31 +59,31 @@ BOOL MainDlg::OnCommand(WPARAM wparam, LPARAM lparam) UINT id = LOWORD(wparam); switch (id) { - case IDC_OPTIONS_BTN: - OnBnClickedOptionsBtn(); - return TRUE; - case IDC_EDITOR_BTN: - OnBnClickedEditorBtn(); - return TRUE; + case IDC_OPTIONS_BTN: + OnBnClickedOptionsBtn(); + return TRUE; + case IDC_EDITOR_BTN: + OnBnClickedEditorBtn(); + return TRUE; } return FALSE; } -LRESULT MainDlg::OnNotify([[ maybe_unused ]] WPARAM wparam, LPARAM lparam) +LRESULT MainDlg::OnNotify([[maybe_unused]] WPARAM wparam, LPARAM lparam) { auto& nmhdr = *reinterpret_cast(lparam); switch (nmhdr.code) { - case NM_CLICK: - // fall through - case NM_RETURN: - if (nmhdr.idFrom == IDC_ABOUT_LINK) { - OnAboutLinkClick(); - } - else if (nmhdr.idFrom == IDC_SUPPORT_LINK) { - OnSupportLinkClick(); - } - break; + case NM_CLICK: + // fall through + case NM_RETURN: + if (nmhdr.idFrom == IDC_ABOUT_LINK) { + OnAboutLinkClick(); + } + else if (nmhdr.idFrom == IDC_SUPPORT_LINK) { + OnSupportLinkClick(); + } + break; } return 0; } @@ -151,8 +148,9 @@ LRESULT MainDlg::OnUpdateCheck(WPARAM wparam, LPARAM lparam) m_update_status.SetWindowText("No update is available."); else { m_update_status.SetWindowText("New version available!"); - int result = MessageBoxA(chk_result.message.c_str(), "Dash Faction update is available!", - MB_OKCANCEL | MB_ICONEXCLAMATION); + int result = MessageBoxA( + chk_result.message.c_str(), "Dash Faction update is available!", MB_OKCANCEL | MB_ICONEXCLAMATION + ); if (result == IDOK) { HINSTANCE exec_res = ShellExecuteA(*this, "open", chk_result.url.c_str(), nullptr, nullptr, SW_SHOW); auto exec_res_int = reinterpret_cast(exec_res); diff --git a/launcher/OptionsAudioDlg.cpp b/launcher/OptionsAudioDlg.cpp index 5062e0e13..4b846183d 100644 --- a/launcher/OptionsAudioDlg.cpp +++ b/launcher/OptionsAudioDlg.cpp @@ -3,10 +3,7 @@ #include "LauncherApp.h" #include -OptionsAudioDlg::OptionsAudioDlg(GameConfig& conf) - : CDialog(IDD_OPTIONS_AUDIO), m_conf(conf) -{ -} +OptionsAudioDlg::OptionsAudioDlg(GameConfig& conf) : CDialog(IDD_OPTIONS_AUDIO), m_conf(conf) {} BOOL OptionsAudioDlg::OnInitDialog() { @@ -24,7 +21,10 @@ BOOL OptionsAudioDlg::OnInitDialog() void OptionsAudioDlg::InitToolTip() { m_tool_tip.Create(*this); - m_tool_tip.AddTool(GetDlgItem(IDC_LEVEL_SOUNDS_CHECK), "Enable/disable Play Sound and Ambient Sound objects in level. You can also specify volume multiplier by using levelsounds command in game."); + m_tool_tip.AddTool( + GetDlgItem(IDC_LEVEL_SOUNDS_CHECK), "Enable/disable Play Sound and Ambient Sound objects in level. You can " + "also specify volume multiplier by using levelsounds command in game." + ); m_tool_tip.AddTool(GetDlgItem(IDC_EAX_SOUND_CHECK), "Enable/disable 3D sound and EAX extension if supported"); } diff --git a/launcher/OptionsAudioDlg.h b/launcher/OptionsAudioDlg.h index e53f8d11f..e0aa5e5ae 100644 --- a/launcher/OptionsAudioDlg.h +++ b/launcher/OptionsAudioDlg.h @@ -8,7 +8,7 @@ class OptionsAudioDlg : public CDialog { public: - OptionsAudioDlg(GameConfig& conf); + OptionsAudioDlg(GameConfig& conf); void OnSave(); protected: diff --git a/launcher/OptionsDisplayDlg.cpp b/launcher/OptionsDisplayDlg.cpp index 38431ebf1..78c2c4f59 100644 --- a/launcher/OptionsDisplayDlg.cpp +++ b/launcher/OptionsDisplayDlg.cpp @@ -8,11 +8,8 @@ #include OptionsDisplayDlg::OptionsDisplayDlg(GameConfig& conf, OptionsGraphicsDlg& graphics_dlg) : - CDialog(IDD_OPTIONS_DISPLAY), - m_conf(conf), - m_graphics_dlg(graphics_dlg) -{ -} + CDialog(IDD_OPTIONS_DISPLAY), m_conf(conf), m_graphics_dlg(graphics_dlg) +{} BOOL OptionsDisplayDlg::OnInitDialog() { @@ -61,9 +58,17 @@ void OptionsDisplayDlg::InitToolTip() m_tool_tip.AddTool(GetDlgItem(IDC_RENDERER_COMBO), "Graphics API used for rendering"); m_tool_tip.AddTool(GetDlgItem(IDC_ADAPTER_COMBO), "Graphics card/adapter used for rendering"); m_tool_tip.AddTool(GetDlgItem(IDC_RENDERING_CACHE_EDIT), "RAM allocated for level geometry rendering, max 32 MB"); - m_tool_tip.AddTool(GetDlgItem(IDC_RESOLUTIONS_COMBO), "Please select resolution from provided dropdown list - custom resolution is supposed to work in Windowed/Borderless mode only"); - m_tool_tip.AddTool(GetDlgItem(IDC_VSYNC_CHECK), "Enable vertical synchronization (should limit FPS to monitor refresh rate - usually 60)"); - m_tool_tip.AddTool(GetDlgItem(IDC_MAX_FPS_EDIT), "FPS limit - maximal value is 240 - high FPS can trigger minor bugs in game"); + m_tool_tip.AddTool( + GetDlgItem(IDC_RESOLUTIONS_COMBO), "Please select resolution from provided dropdown list - custom resolution " + "is supposed to work in Windowed/Borderless mode only" + ); + m_tool_tip.AddTool( + GetDlgItem(IDC_VSYNC_CHECK), + "Enable vertical synchronization (should limit FPS to monitor refresh rate - usually 60)" + ); + m_tool_tip.AddTool( + GetDlgItem(IDC_MAX_FPS_EDIT), "FPS limit - maximal value is 240 - high FPS can trigger minor bugs in game" + ); } void OptionsDisplayDlg::UpdateAdapterCombo() @@ -75,7 +80,7 @@ void OptionsDisplayDlg::UpdateAdapterCombo() int selected_idx = -1; try { auto adapters = m_video_info->get_adapters(); - for (const auto &adapter : adapters) { + for (const auto& adapter : adapters) { int idx = m_adapter_combo.AddString(adapter.c_str()); if (idx < 0) throw std::runtime_error("failed to add string to combo box"); @@ -83,7 +88,7 @@ void OptionsDisplayDlg::UpdateAdapterCombo() selected_idx = idx; } } - catch (std::exception &e) { + catch (std::exception& e) { xlog::error("Cannot get video adapters: {}", e.what()); } if (selected_idx != -1) @@ -101,14 +106,14 @@ void OptionsDisplayDlg::UpdateResolutionCombo() try { auto format = m_video_info->get_format_from_bpp(m_conf.res_bpp); auto resolutions = m_video_info->get_resolutions(m_conf.selected_video_card, format); - for (const auto &res : resolutions) { + for (const auto& res : resolutions) { buf.Format("%dx%d", res.width, res.height); int pos = m_res_combo.AddString(buf); if (m_conf.res_width == res.width && m_conf.res_height == res.height) selected_res = pos; } } - catch (std::exception &e) { + catch (std::exception& e) { // Only 'Disabled' option available. Log error in console. xlog::error("Cannot get available screen resolutions: {}", e.what()); } @@ -150,7 +155,7 @@ void OptionsDisplayDlg::UpdateColorDepthCombo() m_color_depth_combo.SetCurSel(m_conf.res_bpp == 16 ? index_16 : index_32); } -BOOL OptionsDisplayDlg::OnCommand(WPARAM wparam, [[ maybe_unused ]] LPARAM lparam) +BOOL OptionsDisplayDlg::OnCommand(WPARAM wparam, [[maybe_unused]] LPARAM lparam) { if (HIWORD(wparam) == CBN_SELCHANGE) { switch (LOWORD(wparam)) { @@ -177,9 +182,9 @@ void OptionsDisplayDlg::OnSave() m_conf.selected_video_card = m_adapter_combo.GetCurSel(); CString resolution_str = GetDlgItemTextA(IDC_RESOLUTIONS_COMBO); - char *ptr = const_cast(resolution_str.c_str()); - const char *width_str = strtok(ptr, "x"); - const char *height_str = strtok(nullptr, "x"); + char* ptr = const_cast(resolution_str.c_str()); + const char* width_str = strtok(ptr, "x"); + const char* height_str = strtok(nullptr, "x"); if (width_str && height_str) { m_conf.res_width = atoi(width_str); m_conf.res_height = atoi(height_str); diff --git a/launcher/OptionsDisplayDlg.h b/launcher/OptionsDisplayDlg.h index a8d3b57a6..10a9cc064 100644 --- a/launcher/OptionsDisplayDlg.h +++ b/launcher/OptionsDisplayDlg.h @@ -11,7 +11,7 @@ class OptionsGraphicsDlg; class OptionsDisplayDlg : public CDialog { public: - OptionsDisplayDlg(GameConfig& conf, OptionsGraphicsDlg& graphics_dlg); + OptionsDisplayDlg(GameConfig& conf, OptionsGraphicsDlg& graphics_dlg); void OnSave(); protected: diff --git a/launcher/OptionsDlg.cpp b/launcher/OptionsDlg.cpp index e75e87f7d..63baa53de 100644 --- a/launcher/OptionsDlg.cpp +++ b/launcher/OptionsDlg.cpp @@ -6,23 +6,16 @@ #include OptionsDlg::OptionsDlg() : - CDialog(IDD_OPTIONS), - m_display_dlg(m_conf, m_graphics_dlg), - m_graphics_dlg(m_conf), - m_misc_dlg(m_conf), - m_audio_dlg(m_conf), - m_multiplayer_dlg(m_conf), - m_input_dlg(m_conf), - m_iface_dlg(m_conf) -{ -} + CDialog(IDD_OPTIONS), m_display_dlg(m_conf, m_graphics_dlg), m_graphics_dlg(m_conf), m_misc_dlg(m_conf), + m_audio_dlg(m_conf), m_multiplayer_dlg(m_conf), m_input_dlg(m_conf), m_iface_dlg(m_conf) +{} BOOL OptionsDlg::OnInitDialog() { try { m_conf.load(); } - catch (std::exception &e) { + catch (std::exception& e) { MessageBoxA(e.what(), nullptr, MB_ICONERROR | MB_OK); } @@ -60,9 +53,9 @@ BOOL OptionsDlg::OnCommand(WPARAM wparam, LPARAM lparam) UINT id = LOWORD(wparam); switch (id) { - case IDC_EXE_BROWSE: - OnBnClickedExeBrowse(); - return TRUE; + case IDC_EXE_BROWSE: + OnBnClickedExeBrowse(); + return TRUE; } return FALSE; @@ -84,7 +77,7 @@ void OptionsDlg::OnBnClickedOk() try { m_conf.save(); } - catch (std::exception &e) { + catch (std::exception& e) { MessageBoxA(e.what(), nullptr, MB_ICONERROR | MB_OK); } } @@ -105,7 +98,7 @@ void OptionsDlg::InitNestedDialog(CDialog& dlg, int placeholder_id) dlg.DoModeless(GetHwnd()); CWnd placeholder = GetDlgItem(placeholder_id); RECT rc = placeholder.GetClientRect(); - RECT border = { 6, 12, 6, 6 }; + RECT border = {6, 12, 6, 6}; MapDialogRect(border); rc.left += border.left; rc.top += border.top; diff --git a/launcher/OptionsDlg.h b/launcher/OptionsDlg.h index da347b30c..00b698e4c 100644 --- a/launcher/OptionsDlg.h +++ b/launcher/OptionsDlg.h @@ -15,7 +15,7 @@ class OptionsDlg : public CDialog { public: - OptionsDlg(); + OptionsDlg(); OptionsDlg(const OptionsDlg&) = delete; protected: diff --git a/launcher/OptionsGraphicsDlg.cpp b/launcher/OptionsGraphicsDlg.cpp index b69b3cdae..2b43d34aa 100644 --- a/launcher/OptionsGraphicsDlg.cpp +++ b/launcher/OptionsGraphicsDlg.cpp @@ -6,10 +6,9 @@ #include #include -OptionsGraphicsDlg::OptionsGraphicsDlg(GameConfig& conf) - : CDialog(IDD_OPTIONS_GRAPHICS), m_conf(conf), m_video_info(nullptr) -{ -} +OptionsGraphicsDlg::OptionsGraphicsDlg(GameConfig& conf) : + CDialog(IDD_OPTIONS_GRAPHICS), m_conf(conf), m_video_info(nullptr) +{} BOOL OptionsGraphicsDlg::OnInitDialog() { @@ -53,7 +52,8 @@ void OptionsGraphicsDlg::UpdateMsaaCombo() m_multi_sample_types.push_back(0); try { BOOL windowed = m_conf.wnd_mode != GameConfig::FULLSCREEN; - auto multi_sample_types = m_video_info->get_multisample_types(m_conf.selected_video_card, m_conf.res_backbuffer_format, windowed); + auto multi_sample_types = + m_video_info->get_multisample_types(m_conf.selected_video_card, m_conf.res_backbuffer_format, windowed); for (auto msaa : multi_sample_types) { auto s = std::format("MSAAx{}", msaa); int idx = m_msaa_combo.AddString(s.c_str()); @@ -62,7 +62,7 @@ void OptionsGraphicsDlg::UpdateMsaaCombo() m_multi_sample_types.push_back(msaa); } } - catch (std::exception &e) { + catch (std::exception& e) { xlog::error("Cannot check available MSAA modes: {}", e.what()); } m_msaa_combo.SetCurSel(selected_msaa); @@ -76,7 +76,7 @@ void OptionsGraphicsDlg::UpdateAnisotropyCheckbox() anisotropy_supported = m_video_info->has_anisotropy_support(m_conf.selected_video_card); } } - catch (std::exception &e) { + catch (std::exception& e) { xlog::error("Cannot check anisotropy support: {}", e.what()); } if (anisotropy_supported) { @@ -93,9 +93,15 @@ void OptionsGraphicsDlg::InitToolTip() m_tool_tip.AddTool(GetDlgItem(IDC_FAST_ANIMS_CHECK), "Reduce animation smoothness for far models"); m_tool_tip.AddTool(GetDlgItem(IDC_DISABLE_LOD_CHECK), "Use more detailed LOD models for objects in the distance"); m_tool_tip.AddTool(GetDlgItem(IDC_ANISOTROPIC_CHECK), "Improve far textures quality"); - m_tool_tip.AddTool(GetDlgItem(IDC_HIGH_SCANNER_RES_CHECK), "Increase scanner resolution (used by Rail Gun, Rocket Launcher and Fusion Launcher)"); + m_tool_tip.AddTool( + GetDlgItem(IDC_HIGH_SCANNER_RES_CHECK), + "Increase scanner resolution (used by Rail Gun, Rocket Launcher and Fusion Launcher)" + ); m_tool_tip.AddTool(GetDlgItem(IDC_HIGH_MON_RES_CHECK), "Increase monitors and mirrors resolution"); - m_tool_tip.AddTool(GetDlgItem(IDC_TRUE_COLOR_TEXTURES_CHECK), "Increase texture color depth - especially visible for lightmaps and shadows"); + m_tool_tip.AddTool( + GetDlgItem(IDC_TRUE_COLOR_TEXTURES_CHECK), + "Increase texture color depth - especially visible for lightmaps and shadows" + ); } void OptionsGraphicsDlg::OnSave() diff --git a/launcher/OptionsInputDlg.cpp b/launcher/OptionsInputDlg.cpp index dc29d2f40..8d4d6cb58 100644 --- a/launcher/OptionsInputDlg.cpp +++ b/launcher/OptionsInputDlg.cpp @@ -3,10 +3,7 @@ #include "LauncherApp.h" #include -OptionsInputDlg::OptionsInputDlg(GameConfig& conf) - : CDialog(IDD_OPTIONS_INPUT), m_conf(conf) -{ -} +OptionsInputDlg::OptionsInputDlg(GameConfig& conf) : CDialog(IDD_OPTIONS_INPUT), m_conf(conf) {} BOOL OptionsInputDlg::OnInitDialog() { @@ -24,7 +21,9 @@ void OptionsInputDlg::InitToolTip() { m_tool_tip.Create(*this); m_tool_tip.AddTool(GetDlgItem(IDC_DIRECT_INPUT_CHECK), "Use DirectInput for mouse input handling"); - m_tool_tip.AddTool(GetDlgItem(IDC_LINEAR_PITCH_CHECK), "Stop mouse movement from slowing down when looking up and down"); + m_tool_tip.AddTool( + GetDlgItem(IDC_LINEAR_PITCH_CHECK), "Stop mouse movement from slowing down when looking up and down" + ); } void OptionsInputDlg::OnSave() diff --git a/launcher/OptionsInputDlg.h b/launcher/OptionsInputDlg.h index 2cf68de2d..59b4f3272 100644 --- a/launcher/OptionsInputDlg.h +++ b/launcher/OptionsInputDlg.h @@ -8,7 +8,7 @@ class OptionsInputDlg : public CDialog { public: - OptionsInputDlg(GameConfig& conf); + OptionsInputDlg(GameConfig& conf); void OnSave(); protected: diff --git a/launcher/OptionsInterfaceDlg.cpp b/launcher/OptionsInterfaceDlg.cpp index 4f3c57a23..17e4f4b74 100644 --- a/launcher/OptionsInterfaceDlg.cpp +++ b/launcher/OptionsInterfaceDlg.cpp @@ -3,10 +3,7 @@ #include "LauncherApp.h" #include -OptionsInterfaceDlg::OptionsInterfaceDlg(GameConfig& conf) - : CDialog(IDD_OPTIONS_INTERFACE), m_conf(conf) -{ -} +OptionsInterfaceDlg::OptionsInterfaceDlg(GameConfig& conf) : CDialog(IDD_OPTIONS_INTERFACE), m_conf(conf) {} BOOL OptionsInterfaceDlg::OnInitDialog() { @@ -36,7 +33,9 @@ void OptionsInterfaceDlg::InitToolTip() m_tool_tip.AddTool(GetDlgItem(IDC_BIG_HUD_CHECK), "Make HUD bigger in the game"); m_tool_tip.AddTool(GetDlgItem(IDC_SCOREBOARD_ANIM_CHECK), "Scoreboard open/close animations"); m_tool_tip.AddTool(GetDlgItem(IDC_FPS_COUNTER_CHECK), "Enable FPS counter in right-top corner of the screen"); - m_tool_tip.AddTool(GetDlgItem(IDC_KEEP_LAUNCHER_OPEN_CHECK), "Keep launcher window open after game or editor launch"); + m_tool_tip.AddTool( + GetDlgItem(IDC_KEEP_LAUNCHER_OPEN_CHECK), "Keep launcher window open after game or editor launch" + ); } void OptionsInterfaceDlg::OnSave() diff --git a/launcher/OptionsInterfaceDlg.h b/launcher/OptionsInterfaceDlg.h index 40ec4fe21..cf12fcf12 100644 --- a/launcher/OptionsInterfaceDlg.h +++ b/launcher/OptionsInterfaceDlg.h @@ -8,7 +8,7 @@ class OptionsInterfaceDlg : public CDialog { public: - OptionsInterfaceDlg(GameConfig& conf); + OptionsInterfaceDlg(GameConfig& conf); void OnSave(); protected: diff --git a/launcher/OptionsMiscDlg.cpp b/launcher/OptionsMiscDlg.cpp index e6eb7840f..9ee601b61 100644 --- a/launcher/OptionsMiscDlg.cpp +++ b/launcher/OptionsMiscDlg.cpp @@ -3,10 +3,7 @@ #include "LauncherApp.h" #include -OptionsMiscDlg::OptionsMiscDlg(GameConfig& conf) - : CDialog(IDD_OPTIONS_MISC), m_conf(conf) -{ -} +OptionsMiscDlg::OptionsMiscDlg(GameConfig& conf) : CDialog(IDD_OPTIONS_MISC), m_conf(conf) {} BOOL OptionsMiscDlg::OnInitDialog() { @@ -25,7 +22,11 @@ void OptionsMiscDlg::InitToolTip() { m_tool_tip.Create(*this); m_tool_tip.AddTool(GetDlgItem(IDC_FAST_START_CHECK), "Skip game intro videos and go straight to Main Menu"); - m_tool_tip.AddTool(GetDlgItem(IDC_ALLOW_OVERWRITE_GAME_CHECK), "Enable this if you want to modify game content by putting mods into user_maps folder. Can have side effect of level packfiles modyfing common textures/sounds."); + m_tool_tip.AddTool( + GetDlgItem(IDC_ALLOW_OVERWRITE_GAME_CHECK), + "Enable this if you want to modify game content by putting mods into user_maps folder. Can have side effect of " + "level packfiles modyfing common textures/sounds." + ); m_tool_tip.AddTool(GetDlgItem(IDC_AUTOSAVE_CHECK), "Automatically save the game after a level transition"); } diff --git a/launcher/OptionsMiscDlg.h b/launcher/OptionsMiscDlg.h index 62c8dbd8f..bc0c18eed 100644 --- a/launcher/OptionsMiscDlg.h +++ b/launcher/OptionsMiscDlg.h @@ -8,7 +8,7 @@ class OptionsMiscDlg : public CDialog { public: - OptionsMiscDlg(GameConfig& conf); + OptionsMiscDlg(GameConfig& conf); void OnSave(); protected: diff --git a/launcher/OptionsMultiplayerDlg.cpp b/launcher/OptionsMultiplayerDlg.cpp index 821cde9ae..36388ae67 100644 --- a/launcher/OptionsMultiplayerDlg.cpp +++ b/launcher/OptionsMultiplayerDlg.cpp @@ -3,10 +3,7 @@ #include "LauncherApp.h" #include -OptionsMultiplayerDlg::OptionsMultiplayerDlg(GameConfig& conf) - : CDialog(IDD_OPTIONS_MULTIPLAYER), m_conf(conf) -{ -} +OptionsMultiplayerDlg::OptionsMultiplayerDlg(GameConfig& conf) : CDialog(IDD_OPTIONS_MULTIPLAYER), m_conf(conf) {} BOOL OptionsMultiplayerDlg::OnInitDialog() { @@ -27,7 +24,10 @@ void OptionsMultiplayerDlg::InitToolTip() { m_tool_tip.Create(*this); m_tool_tip.AddTool(GetDlgItem(IDC_TRACKER_EDIT), "Hostname of tracker used to find avaliable Multiplayer servers"); - m_tool_tip.AddTool(GetDlgItem(IDC_RATE_EDIT), "Internet connection speed in bytes/s (default value - 200000 - should work fine for all modern setups)"); + m_tool_tip.AddTool( + GetDlgItem(IDC_RATE_EDIT), + "Internet connection speed in bytes/s (default value - 200000 - should work fine for all modern setups)" + ); m_tool_tip.AddTool(GetDlgItem(IDC_FORCE_PORT_CHECK), "If not checked automatic port is used"); } @@ -45,12 +45,12 @@ BOOL OptionsMultiplayerDlg::OnCommand(WPARAM wparam, LPARAM lparam) UINT id = LOWORD(wparam); switch (id) { - case IDC_RESET_TRACKER_BTN: - OnBnClickedResetTrackerBtn(); - return TRUE; - case IDC_FORCE_PORT_CHECK: - OnForcePortClick(); - return TRUE; + case IDC_RESET_TRACKER_BTN: + OnBnClickedResetTrackerBtn(); + return TRUE; + case IDC_FORCE_PORT_CHECK: + OnForcePortClick(); + return TRUE; } return FALSE; diff --git a/launcher/OptionsMultiplayerDlg.h b/launcher/OptionsMultiplayerDlg.h index 70efb469d..024a24d8a 100644 --- a/launcher/OptionsMultiplayerDlg.h +++ b/launcher/OptionsMultiplayerDlg.h @@ -8,7 +8,7 @@ class OptionsMultiplayerDlg : public CDialog { public: - OptionsMultiplayerDlg(GameConfig& conf); + OptionsMultiplayerDlg(GameConfig& conf); void OnSave(); protected: diff --git a/launcher/main.cpp b/launcher/main.cpp index 4ed64acdc..41bd9a329 100644 --- a/launcher/main.cpp +++ b/launcher/main.cpp @@ -25,15 +25,17 @@ void InitCrashHandler() { auto app_data_dir = Win32xx::GetAppDataPath(); CrashHandlerConfig config; - std::snprintf(config.log_file, std::size(config.log_file), "%s\\Dash Faction\\DashFactionLauncher.log", app_data_dir.c_str()); + std::snprintf( + config.log_file, std::size(config.log_file), "%s\\Dash Faction\\DashFactionLauncher.log", app_data_dir.c_str() + ); std::snprintf(config.output_dir, std::size(config.output_dir), "%s\\Dash Faction", app_data_dir.c_str()); std::snprintf(config.app_name, std::size(config.app_name), "DashFactionLauncher"); config.add_known_module("DashFactionLauncher"); CrashHandlerStubInstall(config); } -int APIENTRY WinMain(HINSTANCE, HINSTANCE, LPSTR, int) try -{ +int APIENTRY WinMain(HINSTANCE, HINSTANCE, LPSTR, int) +try { InitLogging(); InitCrashHandler(); @@ -44,7 +46,7 @@ int APIENTRY WinMain(HINSTANCE, HINSTANCE, LPSTR, int) try return app.Run(); // NOLINT(clang-analyzer-core.StackAddressEscape) } // catch all unhandled CException types -catch (const Win32xx::CException &e) { +catch (const Win32xx::CException& e) { // Display the exception and quit std::string msg = std::format("{}\nerror {}: {}", e.GetText(), e.GetError(), e.GetErrorString()); MessageBox(nullptr, msg.c_str(), nullptr, MB_ICONERROR | MB_OK); diff --git a/launcher/resource.h b/launcher/resource.h index ea2150c94..e7e1fbd44 100644 --- a/launcher/resource.h +++ b/launcher/resource.h @@ -3,83 +3,83 @@ // Used by DashFactionLauncher.rc // #define IDC_STATIC -1 -#define IDC_SUPPORT_LINK 3 -#define IDR_ICON 100 -#define IDD_MAIN 101 -#define IDD_OPTIONS 102 -#define IDB_HEADER 103 -#define IDD_ABOUT 104 -#define IDD_OPTIONS_DISPLAY 105 -#define IDD_OPTIONS_GRAPHICS 106 -#define IDD_OPTIONS_MISC 107 -#define IDD_OPTIONS_AUDIO 108 -#define IDD_OPTIONS_MULTIPLAYER 109 -#define IDD_OPTIONS_INPUT 110 -#define IDD_OPTIONS_INTERFACE 111 -#define IDC_EDITOR_BTN 1000 -#define IDC_OPTIONS_BTN 1001 -#define IDC_RESOLUTIONS_COMBO 1002 -#define IDC_WND_MODE_COMBO 1003 -#define IDC_TRACKER_EDIT 1006 -#define IDC_VSYNC_CHECK 1007 -#define IDC_EAX_SOUND_CHECK 1008 -#define IDC_FAST_ANIMS_CHECK 1009 -#define IDC_RENDERING_CACHE_EDIT 1010 -#define IDC_DIRECT_INPUT_CHECK 1011 -#define IDC_ANISOTROPIC_CHECK 1012 -#define IDC_MSAA_COMBO 1013 -#define IDC_DISABLE_LOD_CHECK 1014 -#define IDC_HEADER_PIC 1015 -#define IDC_EXE_PATH_EDIT 1016 -#define IDC_EXE_BROWSE 1017 -#define IDC_RESET_TRACKER_BTN 1018 -#define IDC_COLOR_DEPTH_COMBO 1019 -#define IDC_UPDATE_STATUS 1021 -#define IDC_FAST_START_CHECK 1022 -#define IDC_FPS_COUNTER_CHECK 1023 -#define IDC_ALLOW_OVERWRITE_GAME_CHECK 1024 -#define IDC_MAX_FPS_EDIT 1025 -#define IDC_HIGH_SCANNER_RES_CHECK 1026 -#define IDC_TRUE_COLOR_TEXTURES_CHECK 1027 -#define IDC_SCOREBOARD_ANIM_CHECK 1028 -#define IDC_PORT_EDIT 1029 -#define IDC_FORCE_PORT_CHECK 1030 -#define IDC_LEVEL_SOUNDS_CHECK 1031 -#define IDC_MOD_COMBO 1032 -#define IDC_KEEP_LAUNCHER_OPEN_CHECK 1033 -#define IDC_HIGH_MON_RES_CHECK 1034 -#define IDC_LINEAR_PITCH_CHECK 1035 -#define IDC_LANG_COMBO 1036 -#define IDC_REDUCED_SPEED_IN_BG_CHECK 1037 -#define IDC_ABOUT_LINK 1038 -#define IDC_APP_NAME 1039 -#define IDC_APP_VERSION 1040 -#define IDC_LICENSE_LINK 1041 -#define IDC_SRC_LINK 1042 -#define IDC_RATE_EDIT 1043 -#define IDC_ADAPTER_COMBO 1044 -#define IDC_BIG_HUD_CHECK 1045 +#define IDC_SUPPORT_LINK 3 +#define IDR_ICON 100 +#define IDD_MAIN 101 +#define IDD_OPTIONS 102 +#define IDB_HEADER 103 +#define IDD_ABOUT 104 +#define IDD_OPTIONS_DISPLAY 105 +#define IDD_OPTIONS_GRAPHICS 106 +#define IDD_OPTIONS_MISC 107 +#define IDD_OPTIONS_AUDIO 108 +#define IDD_OPTIONS_MULTIPLAYER 109 +#define IDD_OPTIONS_INPUT 110 +#define IDD_OPTIONS_INTERFACE 111 +#define IDC_EDITOR_BTN 1000 +#define IDC_OPTIONS_BTN 1001 +#define IDC_RESOLUTIONS_COMBO 1002 +#define IDC_WND_MODE_COMBO 1003 +#define IDC_TRACKER_EDIT 1006 +#define IDC_VSYNC_CHECK 1007 +#define IDC_EAX_SOUND_CHECK 1008 +#define IDC_FAST_ANIMS_CHECK 1009 +#define IDC_RENDERING_CACHE_EDIT 1010 +#define IDC_DIRECT_INPUT_CHECK 1011 +#define IDC_ANISOTROPIC_CHECK 1012 +#define IDC_MSAA_COMBO 1013 +#define IDC_DISABLE_LOD_CHECK 1014 +#define IDC_HEADER_PIC 1015 +#define IDC_EXE_PATH_EDIT 1016 +#define IDC_EXE_BROWSE 1017 +#define IDC_RESET_TRACKER_BTN 1018 +#define IDC_COLOR_DEPTH_COMBO 1019 +#define IDC_UPDATE_STATUS 1021 +#define IDC_FAST_START_CHECK 1022 +#define IDC_FPS_COUNTER_CHECK 1023 +#define IDC_ALLOW_OVERWRITE_GAME_CHECK 1024 +#define IDC_MAX_FPS_EDIT 1025 +#define IDC_HIGH_SCANNER_RES_CHECK 1026 +#define IDC_TRUE_COLOR_TEXTURES_CHECK 1027 +#define IDC_SCOREBOARD_ANIM_CHECK 1028 +#define IDC_PORT_EDIT 1029 +#define IDC_FORCE_PORT_CHECK 1030 +#define IDC_LEVEL_SOUNDS_CHECK 1031 +#define IDC_MOD_COMBO 1032 +#define IDC_KEEP_LAUNCHER_OPEN_CHECK 1033 +#define IDC_HIGH_MON_RES_CHECK 1034 +#define IDC_LINEAR_PITCH_CHECK 1035 +#define IDC_LANG_COMBO 1036 +#define IDC_REDUCED_SPEED_IN_BG_CHECK 1037 +#define IDC_ABOUT_LINK 1038 +#define IDC_APP_NAME 1039 +#define IDC_APP_VERSION 1040 +#define IDC_LICENSE_LINK 1041 +#define IDC_SRC_LINK 1042 +#define IDC_RATE_EDIT 1043 +#define IDC_ADAPTER_COMBO 1044 +#define IDC_BIG_HUD_CHECK 1045 #define IDC_SWAP_ASSAULT_RIFLE_CONTROLS 1046 -#define IDC_SWAP_GRENADE_CONTROLS 1047 -#define IDC_PLAYER_JOIN_BEEP_CHECK 1048 -#define IDC_MESH_STATIC_LIGHTING_CHECK 1049 -#define IDC_AUTOSAVE_CHECK 1050 -#define IDC_GRAPHICS_OPTIONS_BOX 1051 -#define IDC_DISPLAY_OPTIONS_BOX 1052 -#define IDC_MISC_OPTIONS_BOX 1053 -#define IDC_AUDIO_OPTIONS_BOX 1054 -#define IDC_MULTIPLAYER_OPTIONS_BOX 1055 -#define IDC_INPUT_OPTIONS_BOX 1056 -#define IDC_INTERFACE_OPTIONS_BOX 1057 -#define IDC_RENDERER_COMBO 1058 +#define IDC_SWAP_GRENADE_CONTROLS 1047 +#define IDC_PLAYER_JOIN_BEEP_CHECK 1048 +#define IDC_MESH_STATIC_LIGHTING_CHECK 1049 +#define IDC_AUTOSAVE_CHECK 1050 +#define IDC_GRAPHICS_OPTIONS_BOX 1051 +#define IDC_DISPLAY_OPTIONS_BOX 1052 +#define IDC_MISC_OPTIONS_BOX 1053 +#define IDC_AUDIO_OPTIONS_BOX 1054 +#define IDC_MULTIPLAYER_OPTIONS_BOX 1055 +#define IDC_INPUT_OPTIONS_BOX 1056 +#define IDC_INTERFACE_OPTIONS_BOX 1057 +#define IDC_RENDERER_COMBO 1058 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 112 -#define _APS_NEXT_COMMAND_VALUE 32771 -#define _APS_NEXT_CONTROL_VALUE 1059 -#define _APS_NEXT_SYMED_VALUE 101 +#define _APS_NEXT_RESOURCE_VALUE 112 +#define _APS_NEXT_COMMAND_VALUE 32771 +#define _APS_NEXT_CONTROL_VALUE 1059 +#define _APS_NEXT_SYMED_VALUE 101 #endif #endif diff --git a/launcher/stdafx.cpp b/launcher/stdafx.cpp index e507a6871..498929958 100644 --- a/launcher/stdafx.cpp +++ b/launcher/stdafx.cpp @@ -4,5 +4,3 @@ // stdafx.obj will contain the pre-compiled type information #include "stdafx.h" - - diff --git a/launcher/stdafx.h b/launcher/stdafx.h index 5404833ea..1008330cc 100644 --- a/launcher/stdafx.h +++ b/launcher/stdafx.h @@ -6,7 +6,7 @@ #pragma once #ifndef VC_EXTRALEAN -#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers +#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers #endif #include diff --git a/launcher/targetver.h b/launcher/targetver.h index b8da604f4..1f0083dd2 100644 --- a/launcher/targetver.h +++ b/launcher/targetver.h @@ -5,4 +5,4 @@ // If you wish to build your application for a previous Windows platform, include WinSDKVer.h and // set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h. -//#include +// #include diff --git a/launcher_common/DllInjector.cpp b/launcher_common/DllInjector.cpp index 36cb3e847..bc3d3de0a 100644 --- a/launcher_common/DllInjector.cpp +++ b/launcher_common/DllInjector.cpp @@ -45,7 +45,7 @@ static intptr_t get_exported_fun_offset_from_module_base(const char* dll_filenam DWORD DllInjector::run_remote_fun(FARPROC fun_ptr, void* arg, int timeout) { // Note: double cast is needed to fix cast-function-type GCC warning - auto casted_fun_ptr = reinterpret_cast(reinterpret_cast(fun_ptr)); + auto casted_fun_ptr = reinterpret_cast(reinterpret_cast(fun_ptr)); Thread thread = m_process.create_remote_thread(casted_fun_ptr, arg); thread.wait(timeout); return thread.get_exit_code(); diff --git a/launcher_common/DllInjector.h b/launcher_common/DllInjector.h index c9f560dad..27f4d104a 100644 --- a/launcher_common/DllInjector.h +++ b/launcher_common/DllInjector.h @@ -8,9 +8,7 @@ class DllInjector Process& m_process; public: - DllInjector(Process& process) : - m_process(process) - {} + DllInjector(Process& process) : m_process(process) {} HMODULE inject_dll(const char* dll_filename, const char* init_fun_name, int timeout); diff --git a/launcher_common/InjectingProcessLauncher.cpp b/launcher_common/InjectingProcessLauncher.cpp index 0bdc6aa46..420d7aa11 100644 --- a/launcher_common/InjectingProcessLauncher.cpp +++ b/launcher_common/InjectingProcessLauncher.cpp @@ -62,14 +62,17 @@ void InjectingProcessLauncher::wait_for_process_initialization(uintptr_t entry_p } InjectingProcessLauncher::InjectingProcessLauncher( - const char* app_name, const char* work_dir, const char* command_line, STARTUPINFO& startup_info, int timeout) + const char* app_name, const char* work_dir, const char* command_line, STARTUPINFO& startup_info, int timeout +) { xlog::info("Creating suspended process"); PROCESS_INFORMATION process_info; ZeroMemory(&process_info, sizeof(process_info)); xlog::info("Calling CreateProcessA app_name {}, command_line {}, work_dir {}", app_name, command_line, work_dir); - BOOL result = CreateProcessA(app_name, const_cast(command_line), nullptr, nullptr, TRUE, CREATE_SUSPENDED, - nullptr, work_dir, &startup_info, &process_info); + BOOL result = CreateProcessA( + app_name, const_cast(command_line), nullptr, nullptr, TRUE, CREATE_SUSPENDED, nullptr, work_dir, + &startup_info, &process_info + ); xlog::info("CreateProcessA returned {}", result); if (!result) { THROW_WIN32_ERROR(); diff --git a/launcher_common/InjectingProcessLauncher.h b/launcher_common/InjectingProcessLauncher.h index 517cf84b7..5b498e730 100644 --- a/launcher_common/InjectingProcessLauncher.h +++ b/launcher_common/InjectingProcessLauncher.h @@ -20,8 +20,9 @@ class InjectingProcessLauncher bool m_resumed = false; public: - InjectingProcessLauncher(const char* app_name, const char* work_dir, const char* command_line, - STARTUPINFO& startup_info, int timeout); + InjectingProcessLauncher( + const char* app_name, const char* work_dir, const char* command_line, STARTUPINFO& startup_info, int timeout + ); ~InjectingProcessLauncher() { diff --git a/launcher_common/PatchedAppLauncher.cpp b/launcher_common/PatchedAppLauncher.cpp index b4870e864..df3082a39 100644 --- a/launcher_common/PatchedAppLauncher.cpp +++ b/launcher_common/PatchedAppLauncher.cpp @@ -20,8 +20,8 @@ #endif #define INIT_TIMEOUT 10000 -#define RF_120_NA_SHA1 "f94f2e3f565d18f75ab6066e77f73a62a593fe03" -#define RF_120_NA_4GB_SHA1 "4140f7619b6427c170542c66178b47bd48795a99" +#define RF_120_NA_SHA1 "f94f2e3f565d18f75ab6066e77f73a62a593fe03" +#define RF_120_NA_4GB_SHA1 "4140f7619b6427c170542c66178b47bd48795a99" #define RED_120_NA_SHA1 "b4f421bfa9343362d7cc565e9f7ab8c6cc36f3a2" #define TABLES_VPP_SHA1 "ded5e1b5932f47044ba760699d5931fda6bdc8ba" @@ -37,11 +37,13 @@ std::string PatchedAppLauncher::get_patch_dll_path() // Get GetFinalPathNameByHandleA function address dynamically in order to support Windows XP using GetFinalPathNameByHandleA_Type = decltype(GetFinalPathNameByHandleA); HMODULE kernel32_module = GetModuleHandleA("kernel32"); - auto* GetFinalPathNameByHandleA_ptr = reinterpret_cast(reinterpret_cast( - GetProcAddress(kernel32_module, "GetFinalPathNameByHandleA"))); + auto* GetFinalPathNameByHandleA_ptr = reinterpret_cast( + reinterpret_cast(GetProcAddress(kernel32_module, "GetFinalPathNameByHandleA")) + ); // Make sure path is pointing to an actual module and not a symlink if (GetFinalPathNameByHandleA_ptr) { - HANDLE file_handle = CreateFileA(buf.c_str(), GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, 0, nullptr); + HANDLE file_handle = + CreateFileA(buf.c_str(), GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, 0, nullptr); if (file_handle != INVALID_HANDLE_VALUE) { buf.resize(MAX_PATH); @@ -104,17 +106,14 @@ void PatchedAppLauncher::launch() proc_launcher.wait(INFINITE); } } - catch (const Win32Error& e) - { + catch (const Win32Error& e) { if (e.error() == ERROR_ELEVATION_REQUIRED) throw PrivilegeElevationRequiredException(); throw; } - catch (const ProcessTerminatedError&) - { - throw LauncherError( - "Game process has terminated before injection!\n" - "Check your Red Faction installation."); + catch (const ProcessTerminatedError&) { + throw LauncherError("Game process has terminated before injection!\n" + "Check your Red Faction installation."); } } @@ -142,7 +141,8 @@ void PatchedAppLauncher::verify_before_launch() if (!PathFileExistsA(tables_vpp_path.c_str())) { throw LauncherError( "Game directory validation has failed.\nPlease make sure game executable specified in options is located " - "inside a valid Red Faction installation root directory."); + "inside a valid Red Faction installation root directory." + ); } } @@ -243,7 +243,6 @@ bool GameLauncher::check_app_hash(const std::string& sha1) return sha1 == RF_120_NA_SHA1 || sha1 == RF_120_NA_4GB_SHA1; } - EditorLauncher::EditorLauncher() : PatchedAppLauncher("DashEditor.dll") { if (!m_conf.load()) { diff --git a/launcher_common/Process.h b/launcher_common/Process.h index eb2c8105c..a2c567133 100644 --- a/launcher_common/Process.h +++ b/launcher_common/Process.h @@ -12,9 +12,7 @@ class RemoteMemoryPtr HANDLE m_process; public: - RemoteMemoryPtr(void* ptr, HANDLE process) : - m_ptr(ptr), m_process(process) - {} + RemoteMemoryPtr(void* ptr, HANDLE process) : m_ptr(ptr), m_process(process) {} ~RemoteMemoryPtr() { @@ -22,12 +20,11 @@ class RemoteMemoryPtr VirtualFreeEx(m_process, m_ptr, 0, MEM_RELEASE); } - RemoteMemoryPtr(const RemoteMemoryPtr&) = delete; // copy constructor + RemoteMemoryPtr(const RemoteMemoryPtr&) = delete; // copy constructor RemoteMemoryPtr& operator=(const RemoteMemoryPtr&) = delete; // assignment operator RemoteMemoryPtr(RemoteMemoryPtr&& other) : // move constructor - m_ptr(std::exchange(other.m_ptr, nullptr)), - m_process(std::exchange(other.m_process, nullptr)) + m_ptr(std::exchange(other.m_ptr, nullptr)), m_process(std::exchange(other.m_process, nullptr)) {} RemoteMemoryPtr& operator=(RemoteMemoryPtr&& other) // move assignment operator @@ -85,8 +82,7 @@ class Process Thread create_remote_thread(LPTHREAD_START_ROUTINE fun_ptr, void* arg) { - Win32Handle thread_handle = - ::CreateRemoteThread(m_handle, nullptr, 0, fun_ptr, arg, 0, nullptr); + Win32Handle thread_handle = ::CreateRemoteThread(m_handle, nullptr, 0, fun_ptr, arg, 0, nullptr); if (!thread_handle) THROW_WIN32_ERROR(); @@ -132,6 +128,6 @@ class ProcessMemoryProtection std::fprintf(stderr, "VirtualProtectEx failed to unprotect memory: %ld\n", GetLastError()); } - ProcessMemoryProtection(const ProcessMemoryProtection&) = delete; // copy constructor + ProcessMemoryProtection(const ProcessMemoryProtection&) = delete; // copy constructor ProcessMemoryProtection& operator=(const ProcessMemoryProtection&) = delete; // assignment operator }; diff --git a/launcher_common/UpdateChecker.cpp b/launcher_common/UpdateChecker.cpp index 5ab61ff5e..f01afe266 100644 --- a/launcher_common/UpdateChecker.cpp +++ b/launcher_common/UpdateChecker.cpp @@ -17,17 +17,17 @@ static unsigned char signature_public_key[] = { 0x68, 0x3D, 0xC3, 0xE7, 0x29, 0x67, 0x17, 0xE3, 0x2F, 0xAD, 0xA1, 0x71, 0x33, 0x13, 0x4C, 0x7C, }; -static bool verify_signature(const std::optional& sig_hdr_opt, std::string_view response_body, const std::string& challenge) +static bool verify_signature( + const std::optional& sig_hdr_opt, std::string_view response_body, const std::string& challenge +) { std::string sig_hdr = sig_hdr_opt.value(); std::string sig = base64_decode(sig_hdr); std::string msg{response_body}; msg += challenge; int result = ed25519_verify( - reinterpret_cast(sig.data()), - reinterpret_cast(msg.data()), - msg.size(), - signature_public_key + reinterpret_cast(sig.data()), reinterpret_cast(msg.data()), + msg.size(), signature_public_key ); return result != 0; } diff --git a/launcher_common/VideoDeviceInfoProviderD3D11.cpp b/launcher_common/VideoDeviceInfoProviderD3D11.cpp index 128c3e400..d8ec90085 100644 --- a/launcher_common/VideoDeviceInfoProviderD3D11.cpp +++ b/launcher_common/VideoDeviceInfoProviderD3D11.cpp @@ -21,9 +21,12 @@ class VideoDeviceInfoProviderD3D11 : public VideoDeviceInfoProvider unsigned get_format_from_bpp(unsigned bpp) override { switch (bpp) { - case 16: return static_cast(DXGI_FORMAT_B5G6R5_UNORM); - case 32: return static_cast(DXGI_FORMAT_B8G8R8A8_UNORM); - default: return static_cast(DXGI_FORMAT_UNKNOWN); + case 16: + return static_cast(DXGI_FORMAT_B5G6R5_UNORM); + case 32: + return static_cast(DXGI_FORMAT_B8G8R8A8_UNORM); + default: + return static_cast(DXGI_FORMAT_UNKNOWN); } } @@ -34,8 +37,7 @@ class VideoDeviceInfoProviderD3D11 : public VideoDeviceInfoProvider decltype(D3D11CreateDevice)* m_D3D11CreateDevice; }; -VideoDeviceInfoProviderD3D11::VideoDeviceInfoProviderD3D11() : - m_dxgi_lib{L"dxgi.dll"}, m_d3d11_lib{L"d3d11.dll"} +VideoDeviceInfoProviderD3D11::VideoDeviceInfoProviderD3D11() : m_dxgi_lib{L"dxgi.dll"}, m_d3d11_lib{L"d3d11.dll"} { if (!m_dxgi_lib) THROW_WIN32_ERROR("Failed to load dxgi.dll"); @@ -83,10 +85,9 @@ std::vector VideoDeviceInfoProviderD3D11::get_adapters() return adapters; } -std::set VideoDeviceInfoProviderD3D11::get_resolutions( - unsigned adapter, - unsigned format -) { +std::set +VideoDeviceInfoProviderD3D11::get_resolutions(unsigned adapter, unsigned format) +{ ComPtr dxgi_adapter = nullptr; HRESULT hr = m_factory->EnumAdapters(adapter, &dxgi_adapter); if (FAILED(hr)) { @@ -123,9 +124,9 @@ std::set VideoDeviceInfoProviderD3D11::get_ return result; } -std::set VideoDeviceInfoProviderD3D11::get_multisample_types( - unsigned adapter, unsigned format, [[maybe_unused]] bool windowed -) { +std::set +VideoDeviceInfoProviderD3D11::get_multisample_types(unsigned adapter, unsigned format, [[maybe_unused]] bool windowed) +{ ComPtr dxgi_adapter; HRESULT hr = m_factory->EnumAdapters(adapter, &dxgi_adapter); @@ -135,7 +136,10 @@ std::set VideoDeviceInfoProviderD3D11::get_multisample_types( } ComPtr d3d11_device; - hr = m_D3D11CreateDevice(dxgi_adapter, D3D_DRIVER_TYPE_HARDWARE, nullptr, 0, nullptr, 0, D3D11_SDK_VERSION, &d3d11_device, nullptr, nullptr); + hr = m_D3D11CreateDevice( + dxgi_adapter, D3D_DRIVER_TYPE_HARDWARE, nullptr, 0, nullptr, 0, D3D11_SDK_VERSION, &d3d11_device, nullptr, + nullptr + ); if (FAILED(hr)) { xlog::error("D3D11CreateDevice failed: {:x}", hr); return {}; @@ -151,9 +155,8 @@ std::set VideoDeviceInfoProviderD3D11::get_multisample_types( return result; } -bool VideoDeviceInfoProviderD3D11::has_anisotropy_support( - [[maybe_unused]] unsigned adapter -) { +bool VideoDeviceInfoProviderD3D11::has_anisotropy_support([[maybe_unused]] unsigned adapter) +{ // 9_1 feature level already supports anistoropy level 2 return true; } diff --git a/launcher_common/VideoDeviceInfoProviderD3D8.cpp b/launcher_common/VideoDeviceInfoProviderD3D8.cpp index 370303671..ca6000ff0 100644 --- a/launcher_common/VideoDeviceInfoProviderD3D8.cpp +++ b/launcher_common/VideoDeviceInfoProviderD3D8.cpp @@ -20,8 +20,10 @@ class VideoDeviceInfoProviderD3D8 : public VideoDeviceInfoProvider unsigned get_format_from_bpp(unsigned bpp) override { switch (bpp) { - case 16: return static_cast(D3DFMT_R5G6B5); - default: return static_cast(D3DFMT_X8R8G8B8); + case 16: + return static_cast(D3DFMT_R5G6B5); + default: + return static_cast(D3DFMT_X8R8G8B8); } } @@ -30,8 +32,7 @@ class VideoDeviceInfoProviderD3D8 : public VideoDeviceInfoProvider ComPtr m_d3d; }; -VideoDeviceInfoProviderD3D8::VideoDeviceInfoProviderD3D8() : - m_lib{L"d3d8.dll"} +VideoDeviceInfoProviderD3D8::VideoDeviceInfoProviderD3D8() : m_lib{L"d3d8.dll"} { if (!m_lib) THROW_WIN32_ERROR("Failed to load d3d8.dll"); @@ -62,7 +63,8 @@ std::vector VideoDeviceInfoProviderD3D8::get_adapters() return adapters; } -std::set VideoDeviceInfoProviderD3D8::get_resolutions(unsigned adapter, unsigned format) +std::set +VideoDeviceInfoProviderD3D8::get_resolutions(unsigned adapter, unsigned format) { std::set result; unsigned mode_idx = 0; @@ -87,8 +89,9 @@ std::set VideoDeviceInfoProviderD3D8::get_multisample_types(unsigned a { std::set result; for (unsigned i = 2; i < 16; ++i) { - HRESULT hr = m_d3d->CheckDeviceMultiSampleType(adapter, D3DDEVTYPE_HAL, static_cast(format), windowed, - static_cast(i)); + HRESULT hr = m_d3d->CheckDeviceMultiSampleType( + adapter, D3DDEVTYPE_HAL, static_cast(format), windowed, static_cast(i) + ); if (SUCCEEDED(hr)) result.insert(i); } diff --git a/launcher_common/VideoDeviceInfoProviderD3D9.cpp b/launcher_common/VideoDeviceInfoProviderD3D9.cpp index 8ee22162a..1b9b3eacd 100644 --- a/launcher_common/VideoDeviceInfoProviderD3D9.cpp +++ b/launcher_common/VideoDeviceInfoProviderD3D9.cpp @@ -20,8 +20,10 @@ class VideoDeviceInfoProviderD3D9 : public VideoDeviceInfoProvider unsigned get_format_from_bpp(unsigned bpp) override { switch (bpp) { - case 16: return static_cast(D3DFMT_R5G6B5); - default: return static_cast(D3DFMT_X8R8G8B8); + case 16: + return static_cast(D3DFMT_R5G6B5); + default: + return static_cast(D3DFMT_X8R8G8B8); } } @@ -30,8 +32,7 @@ class VideoDeviceInfoProviderD3D9 : public VideoDeviceInfoProvider ComPtr m_d3d; }; -VideoDeviceInfoProviderD3D9::VideoDeviceInfoProviderD3D9() : - m_lib{L"d3d9.dll"} +VideoDeviceInfoProviderD3D9::VideoDeviceInfoProviderD3D9() : m_lib{L"d3d9.dll"} { if (!m_lib) THROW_WIN32_ERROR("Failed to load d3d9.dll"); @@ -62,7 +63,8 @@ std::vector VideoDeviceInfoProviderD3D9::get_adapters() return adapters; } -std::set VideoDeviceInfoProviderD3D9::get_resolutions(unsigned adapter, unsigned format) +std::set +VideoDeviceInfoProviderD3D9::get_resolutions(unsigned adapter, unsigned format) { std::set result; unsigned mode_idx = 0; @@ -87,8 +89,10 @@ std::set VideoDeviceInfoProviderD3D9::get_multisample_types(unsigned a { std::set result; for (unsigned i = 2; i <= 16; ++i) { - HRESULT hr = m_d3d->CheckDeviceMultiSampleType(adapter, D3DDEVTYPE_HAL, static_cast(format), windowed, - static_cast(i), nullptr); + HRESULT hr = m_d3d->CheckDeviceMultiSampleType( + adapter, D3DDEVTYPE_HAL, static_cast(format), windowed, static_cast(i), + nullptr + ); if (SUCCEEDED(hr)) result.insert(i); } diff --git a/launcher_common/Win32Handle.h b/launcher_common/Win32Handle.h index d932e5686..f060f5895 100644 --- a/launcher_common/Win32Handle.h +++ b/launcher_common/Win32Handle.h @@ -11,9 +11,7 @@ class Win32Handle public: Win32Handle() = default; - Win32Handle(HANDLE handle) : - m_handle(handle) - {} + Win32Handle(HANDLE handle) : m_handle(handle) {} ~Win32Handle() { @@ -21,7 +19,7 @@ class Win32Handle CloseHandle(m_handle); } - Win32Handle(const Win32Handle&) = delete; // copy constructor + Win32Handle(const Win32Handle&) = delete; // copy constructor Win32Handle& operator=(const Win32Handle&) = delete; // assignment operator Win32Handle(Win32Handle&& other) noexcept : // move constructor @@ -34,7 +32,7 @@ class Win32Handle return *this; } - Win32Handle &operator=(HANDLE handle) + Win32Handle& operator=(HANDLE handle) { if (m_handle) CloseHandle(m_handle); diff --git a/launcher_common/include/launcher_common/PatchedAppLauncher.h b/launcher_common/include/launcher_common/PatchedAppLauncher.h index c203a7218..068329880 100644 --- a/launcher_common/include/launcher_common/PatchedAppLauncher.h +++ b/launcher_common/include/launcher_common/PatchedAppLauncher.h @@ -28,7 +28,8 @@ class FileHashVerificationException : public std::runtime_error { public: FileHashVerificationException(std::string file_name, std::string sha1) : - std::runtime_error("file hash sum verification failed"), m_file_name(std::move(file_name)), m_sha1(std::move(sha1)) + std::runtime_error("file hash sum verification failed"), m_file_name(std::move(file_name)), + m_sha1(std::move(sha1)) {} [[nodiscard]] const std::string& get_file_name() const @@ -61,9 +62,7 @@ class LauncherError : public std::runtime_error class PatchedAppLauncher { public: - PatchedAppLauncher(const char* patch_dll_name) : - m_patch_dll_name(patch_dll_name) - {} + PatchedAppLauncher(const char* patch_dll_name) : m_patch_dll_name(patch_dll_name) {} void check_installation(); void launch(); @@ -121,7 +120,6 @@ class EditorLauncher : public PatchedAppLauncher GameConfig m_conf; }; - inline std::string get_dir_from_path(const std::string& path) { size_t pos = path.find_last_of("\\/"); diff --git a/patch_common/CallHook.cpp b/patch_common/CallHook.cpp index bbd8c78f3..1c7623fbb 100644 --- a/patch_common/CallHook.cpp +++ b/patch_common/CallHook.cpp @@ -6,26 +6,26 @@ #include void CallHookImpl::install() - { - m_target_fun_ptr = nullptr; - for (auto addr : m_call_op_addr_vec) { - uint8_t opcode = *reinterpret_cast(addr); - if (opcode != asm_opcodes::call_rel_long) { - xlog::error("not a call at 0x{:x}", addr); - return; - } - - intptr_t call_offset = *reinterpret_cast(addr + 1); - int call_op_size = 1 + sizeof(uintptr_t); - auto* call_addr = reinterpret_cast(addr + call_op_size + call_offset); - if (!m_target_fun_ptr) { - m_target_fun_ptr = call_addr; - } - else if (call_addr != m_target_fun_ptr) { - xlog::error("call target function differs at 0x{:x}", addr); - } +{ + m_target_fun_ptr = nullptr; + for (auto addr : m_call_op_addr_vec) { + uint8_t opcode = *reinterpret_cast(addr); + if (opcode != asm_opcodes::call_rel_long) { + xlog::error("not a call at 0x{:x}", addr); + return; + } - intptr_t new_offset = reinterpret_cast(m_hook_fun_ptr) - addr - call_op_size; - write_mem(addr + 1, new_offset); + intptr_t call_offset = *reinterpret_cast(addr + 1); + int call_op_size = 1 + sizeof(uintptr_t); + auto* call_addr = reinterpret_cast(addr + call_op_size + call_offset); + if (!m_target_fun_ptr) { + m_target_fun_ptr = call_addr; } + else if (call_addr != m_target_fun_ptr) { + xlog::error("call target function differs at 0x{:x}", addr); + } + + intptr_t new_offset = reinterpret_cast(m_hook_fun_ptr) - addr - call_op_size; + write_mem(addr + 1, new_offset); } +} diff --git a/patch_common/CodeBuffer.cpp b/patch_common/CodeBuffer.cpp index ab2278306..6dc60dc84 100644 --- a/patch_common/CodeBuffer.cpp +++ b/patch_common/CodeBuffer.cpp @@ -18,4 +18,3 @@ CodeBuffer::~CodeBuffer() HeapFree(get_code_heap(), 0, m_ptr); } } - diff --git a/patch_common/CodeInjection.cpp b/patch_common/CodeInjection.cpp index 07acd33d7..54b9f2035 100644 --- a/patch_common/CodeInjection.cpp +++ b/patch_common/CodeInjection.cpp @@ -19,37 +19,37 @@ void BaseCodeInjectionWithRegsAccess::emit_code(AsmWriter& asm_writter, void* tr constexpr int esp_offset = offsetof(Regs, esp); constexpr int eip_offset = offsetof(Regs, eip); asm_writter - .push(trampoline) // Push default EIP = trampoline - .push(esp) // push ESP before PUSHA so it can be popped manually after POPA - .pusha() // push general registers - .pushf() // push EFLAGS - .add(*(esp + esp_offset), 4) // restore ESP from before pushing the return address - .push(esp) // push address of Regs struct (handler param) - .mov(ecx, this) // save this pointer in ECX (thiscall) - .call(m_wrapper_ptr) // call handler (thiscall - calee cleans the stack) - .add(*(esp + esp_offset), -4) // make ESP value return address aware (again) - .mov(eax, *(esp + eip_offset)) // read EIP from Regs struct - .mov(ecx, *(esp + esp_offset)) // read ESP from Regs struct - .mov(*ecx, eax) // copy EIP to new address of the stack pointer - .popf() // pop EFLAGS - .popa() // pop general registers. Note: POPA discards ESP value - .pop(esp) // pop ESP pushed before PUSHA - .ret(); // return to address read from EIP field in Regs struct + .push(trampoline) // Push default EIP = trampoline + .push(esp) // push ESP before PUSHA so it can be popped manually after POPA + .pusha() // push general registers + .pushf() // push EFLAGS + .add(*(esp + esp_offset), 4) // restore ESP from before pushing the return address + .push(esp) // push address of Regs struct (handler param) + .mov(ecx, this) // save this pointer in ECX (thiscall) + .call(m_wrapper_ptr) // call handler (thiscall - calee cleans the stack) + .add(*(esp + esp_offset), -4) // make ESP value return address aware (again) + .mov(eax, *(esp + eip_offset)) // read EIP from Regs struct + .mov(ecx, *(esp + esp_offset)) // read ESP from Regs struct + .mov(*ecx, eax) // copy EIP to new address of the stack pointer + .popf() // pop EFLAGS + .popa() // pop general registers. Note: POPA discards ESP value + .pop(esp) // pop ESP pushed before PUSHA + .ret(); // return to address read from EIP field in Regs struct } void BaseCodeInjectionWithoutRegsAccess::emit_code(AsmWriter& asm_writter, void* trampoline) { using namespace asm_regs; asm_writter - .push(eax) // push caller-saved general purpose registers - .push(ecx) // push caller-saved general purpose registers - .push(edx) // push caller-saved general purpose registers - .pushf() // push EFLAGS - .mov(ecx, this) // save this pointer in ECX (thiscall) - .call(m_wrapper_ptr) // call handler (thiscall - calee cleans the stack) - .popf() // pop EFLAGS - .pop(edx) // pop caller-saved general purpose registers - .pop(ecx) // pop caller-saved general purpose registers - .pop(eax) // pop caller-saved general purpose registers - .jmp(trampoline); // jump to the trampoline + .push(eax) // push caller-saved general purpose registers + .push(ecx) // push caller-saved general purpose registers + .push(edx) // push caller-saved general purpose registers + .pushf() // push EFLAGS + .mov(ecx, this) // save this pointer in ECX (thiscall) + .call(m_wrapper_ptr) // call handler (thiscall - calee cleans the stack) + .popf() // pop EFLAGS + .pop(edx) // pop caller-saved general purpose registers + .pop(ecx) // pop caller-saved general purpose registers + .pop(eax) // pop caller-saved general purpose registers + .jmp(trampoline); // jump to the trampoline } diff --git a/patch_common/MemUtils.cpp b/patch_common/MemUtils.cpp index 042758963..369bb7efb 100644 --- a/patch_common/MemUtils.cpp +++ b/patch_common/MemUtils.cpp @@ -22,7 +22,7 @@ void unprotect_mem(void* ptr, unsigned len) } } -extern "C" size_t subhook_disasm(void *src, int32_t *reloc_op_offset); +extern "C" size_t subhook_disasm(void* src, int32_t* reloc_op_offset); size_t get_instruction_len(void* ptr) { diff --git a/patch_common/include/patch_common/AsmOpcodes.h b/patch_common/include/patch_common/AsmOpcodes.h index 2a330136e..01579139a 100644 --- a/patch_common/include/patch_common/AsmOpcodes.h +++ b/patch_common/include/patch_common/AsmOpcodes.h @@ -7,7 +7,7 @@ namespace asm_opcodes { -// clang-format off + // clang-format off constexpr std::uint8_t jae_rel_short = 0x73; constexpr std::uint8_t jz_rel_short = 0x74; constexpr std::uint8_t nop = 0x90; @@ -16,6 +16,6 @@ constexpr std::uint8_t fadd = 0xD8; constexpr std::uint8_t call_rel_long = 0xE8; constexpr std::uint8_t jmp_rel_long = 0xE9; constexpr std::uint8_t jmp_rel_short = 0xEB; -// clang-format on + // clang-format on } diff --git a/patch_common/include/patch_common/AsmWriter.h b/patch_common/include/patch_common/AsmWriter.h index 1f521fac0..5f9884b88 100644 --- a/patch_common/include/patch_common/AsmWriter.h +++ b/patch_common/include/patch_common/AsmWriter.h @@ -13,18 +13,14 @@ class AsmReg int reg_num; int size; - constexpr explicit AsmReg(int reg_num, int size) : - reg_num(reg_num), size(size) - {} + constexpr explicit AsmReg(int reg_num, int size) : reg_num(reg_num), size(size) {} constexpr bool operator==(const AsmReg& other) const = default; }; struct AsmReg32 : public AsmReg { - explicit constexpr AsmReg32(int num) : - AsmReg(num, 4) - {} + explicit constexpr AsmReg32(int num) : AsmReg(num, 4) {} std::pair operator+(int n) const { @@ -44,16 +40,12 @@ inline std::pair operator-(std::pair p, int n) struct AsmReg16 : public AsmReg { - explicit constexpr AsmReg16(int num) : - AsmReg(num, 2) - {} + explicit constexpr AsmReg16(int num) : AsmReg(num, 2) {} }; struct AsmReg8 : public AsmReg { - explicit constexpr AsmReg8(int num) : - AsmReg(num, 1) - {} + explicit constexpr AsmReg8(int num) : AsmReg(num, 1) {} }; struct AsmRegMem @@ -66,17 +58,12 @@ struct AsmRegMem memory(memory), reg_opt(reg_opt), displacement(displacement) {} - AsmRegMem(AsmReg reg) : - memory(false), reg_opt({reg}), displacement(0) - {} + AsmRegMem(AsmReg reg) : memory(false), reg_opt({reg}), displacement(0) {} - explicit AsmRegMem(uint32_t addr) : - memory(true), displacement(static_cast(addr)) - {} + explicit AsmRegMem(uint32_t addr) : memory(true), displacement(static_cast(addr)) {} template - AsmRegMem(T* ptr) : - memory(true), displacement(reinterpret_cast(ptr)) + AsmRegMem(T* ptr) : memory(true), displacement(reinterpret_cast(ptr)) {} }; @@ -93,29 +80,29 @@ inline AsmRegMem operator*(std::pair p) namespace asm_regs { -namespace asm_reg_num -{ + namespace asm_reg_num + { -enum -{ - AX, - CX, - DX, - BX, - SP, - BP, - SI, - DI, -}; + enum + { + AX, + CX, + DX, + BX, + SP, + BP, + SI, + DI, + }; -} + } -constexpr AsmReg32 eax(asm_reg_num::AX), ecx(asm_reg_num::CX), edx(asm_reg_num::DX), ebx(asm_reg_num::BX); -constexpr AsmReg32 esp(asm_reg_num::SP), ebp(asm_reg_num::BP), esi(asm_reg_num::SI), edi(asm_reg_num::DI); -constexpr AsmReg16 ax(asm_reg_num::AX), cx(asm_reg_num::CX), dx(asm_reg_num::DX), bx(asm_reg_num::BX); -constexpr AsmReg16 sp(asm_reg_num::SP), bp(asm_reg_num::BP), si(asm_reg_num::SI), di(asm_reg_num::DI); -constexpr AsmReg8 al(asm_reg_num::AX), cl(asm_reg_num::CX), dl(asm_reg_num::DX), bl(asm_reg_num::BX); -constexpr AsmReg8 ah(asm_reg_num::SP), ch(asm_reg_num::BP), dh(asm_reg_num::SI), bh(asm_reg_num::DI); + constexpr AsmReg32 eax(asm_reg_num::AX), ecx(asm_reg_num::CX), edx(asm_reg_num::DX), ebx(asm_reg_num::BX); + constexpr AsmReg32 esp(asm_reg_num::SP), ebp(asm_reg_num::BP), esi(asm_reg_num::SI), edi(asm_reg_num::DI); + constexpr AsmReg16 ax(asm_reg_num::AX), cx(asm_reg_num::CX), dx(asm_reg_num::DX), bx(asm_reg_num::BX); + constexpr AsmReg16 sp(asm_reg_num::SP), bp(asm_reg_num::BP), si(asm_reg_num::SI), di(asm_reg_num::DI); + constexpr AsmReg8 al(asm_reg_num::AX), cl(asm_reg_num::CX), dl(asm_reg_num::DX), bl(asm_reg_num::BX); + constexpr AsmReg8 ah(asm_reg_num::SP), ch(asm_reg_num::BP), dh(asm_reg_num::SI), bh(asm_reg_num::DI); } // namespace asm_regs class AsmWriter @@ -123,9 +110,7 @@ class AsmWriter public: static constexpr uintptr_t unk_end_addr = UINTPTR_MAX; - AsmWriter(uintptr_t begin_addr, uintptr_t end_addr = unk_end_addr) : - m_addr(begin_addr), m_end_addr(end_addr) - {} + AsmWriter(uintptr_t begin_addr, uintptr_t end_addr = unk_end_addr) : m_addr(begin_addr), m_end_addr(end_addr) {} AsmWriter(void* begin_ptr, void* end_ptr = reinterpret_cast(unk_end_addr)) : m_addr(reinterpret_cast(begin_ptr)), m_end_addr(reinterpret_cast(end_ptr)) @@ -135,7 +120,8 @@ class AsmWriter { if (m_end_addr != unk_end_addr) { assert(m_addr <= m_end_addr); - while (m_addr < m_end_addr) nop(); + while (m_addr < m_end_addr) + nop(); } } @@ -211,7 +197,7 @@ class AsmWriter AsmWriter& pop(const AsmReg16& reg) { write(operand_size_override_prefix); // Prefix - write(0x58 | reg.reg_num); // Opcode + write(0x58 | reg.reg_num); // Opcode return *this; } @@ -308,7 +294,7 @@ class AsmWriter AsmWriter& mov(const AsmRegMem& dst_rm, const AsmReg16& src_reg) { write(operand_size_override_prefix); // Prefix - write(0x89); // Opcode + write(0x89); // Opcode write_mod_rm(dst_rm, src_reg); return *this; } @@ -419,7 +405,7 @@ class AsmWriter AsmWriter& mov(const AsmReg16& dst_reg, int16_t imm) { write(operand_size_override_prefix); // Prefix - write(0xB8 | dst_reg.reg_num); // Opcode + write(0xB8 | dst_reg.reg_num); // Opcode write(imm); return *this; } diff --git a/patch_common/include/patch_common/CallHook.h b/patch_common/include/patch_common/CallHook.h index 9b012966e..0ce861df7 100644 --- a/patch_common/include/patch_common/CallHook.h +++ b/patch_common/include/patch_common/CallHook.h @@ -30,7 +30,7 @@ template class CallHook : public CallHookImpl { private: - using FunType = R __cdecl (A...); + using FunType = R __cdecl(A...); public: CallHook(uintptr_t call_op_addr, FunType* hook_fun_ptr) : @@ -52,7 +52,7 @@ template class CallHook : public CallHookImpl { private: - using FunType = R __fastcall (A...); + using FunType = R __fastcall(A...); public: CallHook(uintptr_t call_op_addr, FunType* hook_fun_ptr) : @@ -74,7 +74,7 @@ template class CallHook : public CallHookImpl { private: - using FunType = R __stdcall (A...); + using FunType = R __stdcall(A...); public: CallHook(uintptr_t call_op_addr, FunType* hook_fun_ptr) : @@ -95,5 +95,5 @@ class CallHook : public CallHookImpl #ifdef __cpp_deduction_guides // deduction guide for lambda functions template -CallHook(uintptr_t addr, T)->CallHook::f_type>; +CallHook(uintptr_t addr, T) -> CallHook::f_type>; #endif diff --git a/patch_common/include/patch_common/CallPrePostHook.h b/patch_common/include/patch_common/CallPrePostHook.h index 9681b0066..4ac8c8876 100644 --- a/patch_common/include/patch_common/CallPrePostHook.h +++ b/patch_common/include/patch_common/CallPrePostHook.h @@ -36,30 +36,29 @@ class CallPrePostHook : public Installable using namespace asm_regs; AsmWriter{m_enter_code} - .push(ecx) // save ecx - .push(edx) // save edx - .push(this) // push enter_handler argument - .call(&enter_handler) // call enter_handler - .add(esp, 4) // pop enter_handler argument - .pop(edx) // restore edx - .pop(ecx) // restore ecx - .mov(eax, m_leave_code.get()) // put leave code address into eax - .mov(*esp, eax) // replace return address by our leave code - .jmp(call_addr); // call oryginal function + .push(ecx) // save ecx + .push(edx) // save edx + .push(this) // push enter_handler argument + .call(&enter_handler) // call enter_handler + .add(esp, 4) // pop enter_handler argument + .pop(edx) // restore edx + .pop(ecx) // restore ecx + .mov(eax, m_leave_code.get()) // put leave code address into eax + .mov(*esp, eax) // replace return address by our leave code + .jmp(call_addr); // call oryginal function AsmWriter{m_leave_code} - .push(0) // make place for the return address - .push(eax) // save eax - .push(edx) // save edx - .push(this) // push enter_handler argument - .call(&leave_handler) // call leave_handler - .add(esp, 4) // pop leave_handler argument - .mov(*(esp + 8), eax) // copy return address returned by leave_handler to the stack - .pop(edx) // restore edx - .pop(eax) // restore eax - .ret(); // return to the address returned by leave_handler + .push(0) // make place for the return address + .push(eax) // save eax + .push(edx) // save edx + .push(this) // push enter_handler argument + .call(&leave_handler) // call leave_handler + .add(esp, 4) // pop leave_handler argument + .mov(*(esp + 8), eax) // copy return address returned by leave_handler to the stack + .pop(edx) // restore edx + .pop(eax) // restore eax + .ret(); // return to the address returned by leave_handler - AsmWriter{m_addr} - .call(m_enter_code.get()); + AsmWriter{m_addr}.call(m_enter_code.get()); } private: diff --git a/patch_common/include/patch_common/CodeInjection.h b/patch_common/include/patch_common/CodeInjection.h index f71043f35..3d15f428a 100644 --- a/patch_common/include/patch_common/CodeInjection.h +++ b/patch_common/include/patch_common/CodeInjection.h @@ -17,9 +17,9 @@ class BaseCodeInjection : public Installable CodeBuffer m_code_buf; public: - template - struct Reg { + struct Reg + { T value; template @@ -42,7 +42,7 @@ class BaseCodeInjection : public Installable } template - bool operator==([[ maybe_unused ]] U other) const + bool operator==([[maybe_unused]] U other) const { if constexpr (std::is_null_pointer_v) { return this->value == 0; @@ -53,7 +53,7 @@ class BaseCodeInjection : public Installable } template - bool operator!=([[ maybe_unused ]] U other) const + bool operator!=([[maybe_unused]] U other) const { if constexpr (std::is_null_pointer_v) { return this->value != 0; @@ -112,23 +112,23 @@ class BaseCodeInjection : public Installable } }; - #define X86_GP_REG_X_UNION(letter) \ - union \ - { \ - Reg e##letter##x; \ - Reg letter##x; \ - struct \ - { \ - Reg letter##l; \ - Reg letter##h; \ - }; \ - } - #define X86_GP_REG_UNION(name) \ +#define X86_GP_REG_X_UNION(letter) \ union \ { \ - Reg e##name; \ - Reg name; /* NOLINT(bugprone-macro-parentheses) */ \ - Reg name##l; \ + Reg e##letter##x; \ + Reg letter##x; \ + struct \ + { \ + Reg letter##l; \ + Reg letter##h; \ + }; \ + } +#define X86_GP_REG_UNION(name) \ + union \ + { \ + Reg e##name; \ + Reg name; /* NOLINT(bugprone-macro-parentheses) */ \ + Reg name##l; \ } struct FlagsReg @@ -146,13 +146,12 @@ class BaseCodeInjection : public Installable { int tmp = 0; #ifdef __GNUC__ - __asm__( - "cmp %2, %1\n\t" - "pushf\n\t" - "pop %0" - : "=r" (tmp) - : "r" (a), "r" (b) - : "cc"); + __asm__("cmp %2, %1\n\t" + "pushf\n\t" + "pop %0" + : "=r"(tmp) + : "r"(a), "r"(b) + : "cc"); #else __asm { mov eax, a @@ -184,8 +183,8 @@ class BaseCodeInjection : public Installable // return address uint32_t eip; }; - #undef X86_GP_REG_X_UNION - #undef X86_GP_REG_UNION +#undef X86_GP_REG_X_UNION +#undef X86_GP_REG_UNION BaseCodeInjection(uintptr_t addr) : m_addr(addr), m_code_buf(256) {} @@ -225,14 +224,13 @@ class BaseCodeInjectionWithRegsAccess : public BaseCodeInjection template class CodeInjection2()(std::declval()))> - : public BaseCodeInjectionWithRegsAccess + : public BaseCodeInjectionWithRegsAccess { T m_functor; public: CodeInjection2(uintptr_t addr, T handler) : - BaseCodeInjectionWithRegsAccess(addr, reinterpret_cast(&wrapper)), - m_functor(handler) + BaseCodeInjectionWithRegsAccess(addr, reinterpret_cast(&wrapper)), m_functor(handler) {} private: @@ -265,8 +263,7 @@ class CodeInjection2()())> : public BaseCodeInjectio public: CodeInjection2(uintptr_t addr, T handler) : - BaseCodeInjectionWithoutRegsAccess(addr, reinterpret_cast(&wrapper)), - m_functor(handler) + BaseCodeInjectionWithoutRegsAccess(addr, reinterpret_cast(&wrapper)), m_functor(handler) {} private: @@ -280,7 +277,5 @@ template class CodeInjection : public CodeInjection2 { public: - CodeInjection(uintptr_t addr, T handler) : - CodeInjection2(addr, handler) - {} + CodeInjection(uintptr_t addr, T handler) : CodeInjection2(addr, handler) {} }; diff --git a/patch_common/include/patch_common/FunHook.h b/patch_common/include/patch_common/FunHook.h index f1d5c117d..56ada28d0 100644 --- a/patch_common/include/patch_common/FunHook.h +++ b/patch_common/include/patch_common/FunHook.h @@ -100,5 +100,5 @@ class FunHook : public FunHookImpl #ifdef __cpp_deduction_guides // deduction guide for lambda functions template -FunHook(uintptr_t addr, T)->FunHook::f_type>; +FunHook(uintptr_t addr, T) -> FunHook::f_type>; #endif diff --git a/patch_common/include/patch_common/FunPrePostHook.h b/patch_common/include/patch_common/FunPrePostHook.h index c25df9bb1..f7db69449 100644 --- a/patch_common/include/patch_common/FunPrePostHook.h +++ b/patch_common/include/patch_common/FunPrePostHook.h @@ -21,8 +21,7 @@ class FunPrePostHook : public Installable public: FunPrePostHook(uintptr_t addr, PreCallback pre_cb, PostCallback post_cb) : - m_addr(addr), m_pre_cb(pre_cb), m_post_cb(post_cb), - m_enter_code(64), m_leave_code(64) + m_addr(addr), m_pre_cb(pre_cb), m_post_cb(post_cb), m_enter_code(64), m_leave_code(64) {} void install() override @@ -37,27 +36,27 @@ class FunPrePostHook : public Installable using namespace asm_regs; AsmWriter{m_enter_code} - .push(ecx) // save ecx - .push(edx) // save edx - .push(this) // push enter_handler argument - .call(&enter_handler) // call enter_handler - .add(esp, 4) // pop enter_handler argument - .pop(edx) // restore edx - .pop(ecx) // restore ecx - .mov(eax, m_leave_code.get()) // put leave code address into eax - .mov(*esp, eax) // replace return address by our leave code - .jmp(trampoline); // call oryginal function + .push(ecx) // save ecx + .push(edx) // save edx + .push(this) // push enter_handler argument + .call(&enter_handler) // call enter_handler + .add(esp, 4) // pop enter_handler argument + .pop(edx) // restore edx + .pop(ecx) // restore ecx + .mov(eax, m_leave_code.get()) // put leave code address into eax + .mov(*esp, eax) // replace return address by our leave code + .jmp(trampoline); // call oryginal function AsmWriter{m_leave_code} - .push(0) // make place for the return address - .push(eax) // save eax - .push(edx) // save edx - .push(this) // push first leave_handler argument - .call(&leave_handler) // call leave handler that returns the final return address - .add(esp, 4) // pop leave_handler argument - .mov(*(esp + 8), eax) // copy return address returned by leave_handler to the stack - .pop(edx) // restore edx - .pop(eax) // restore eax - .ret(); // return to the function caller + .push(0) // make place for the return address + .push(eax) // save eax + .push(edx) // save edx + .push(this) // push first leave_handler argument + .call(&leave_handler) // call leave handler that returns the final return address + .add(esp, 4) // pop leave_handler argument + .mov(*(esp + 8), eax) // copy return address returned by leave_handler to the stack + .pop(edx) // restore edx + .pop(eax) // restore eax + .ret(); // return to the function caller } private: @@ -75,4 +74,3 @@ class FunPrePostHook : public Installable return ret_addr; } }; - diff --git a/patch_common/include/patch_common/MemUtils.h b/patch_common/include/patch_common/MemUtils.h index 0a1ff5b54..3aef12495 100644 --- a/patch_common/include/patch_common/MemUtils.h +++ b/patch_common/include/patch_common/MemUtils.h @@ -53,8 +53,7 @@ class AddrCaller uintptr_t addr_; public: - constexpr AddrCaller(uintptr_t addr) : addr_(addr) - {} + constexpr AddrCaller(uintptr_t addr) : addr_(addr) {} template constexpr RetVal c_call(A... args) diff --git a/patch_common/include/patch_common/StaticBufferResizePatch.h b/patch_common/include/patch_common/StaticBufferResizePatch.h index 43f879b27..5281f9049 100644 --- a/patch_common/include/patch_common/StaticBufferResizePatch.h +++ b/patch_common/include/patch_common/StaticBufferResizePatch.h @@ -31,18 +31,16 @@ class StaticBufferResizePatch : public Installable T* new_buf_; public: - - StaticBufferResizePatch(uintptr_t buf_addr, size_t old_num_elements, size_t new_num_elements, - std::vector&& refs) : - buf_addr_(buf_addr), old_num_elements_(old_num_elements), - new_num_elements_(new_num_elements), refs_(refs), new_buf_(nullptr) + StaticBufferResizePatch( + uintptr_t buf_addr, size_t old_num_elements, size_t new_num_elements, std::vector&& refs + ) : + buf_addr_(buf_addr), old_num_elements_(old_num_elements), new_num_elements_(new_num_elements), refs_(refs), + new_buf_(nullptr) {} template - StaticBufferResizePatch(uintptr_t buf_addr, size_t old_num_elements, T (&new_buf)[N], - std::vector&& refs) : - buf_addr_(buf_addr), old_num_elements_(old_num_elements), - new_num_elements_(N), refs_(refs), new_buf_(new_buf) + StaticBufferResizePatch(uintptr_t buf_addr, size_t old_num_elements, T (&new_buf)[N], std::vector&& refs) : + buf_addr_(buf_addr), old_num_elements_(old_num_elements), new_num_elements_(N), refs_(refs), new_buf_(new_buf) {} void install() override @@ -53,7 +51,8 @@ class StaticBufferResizePatch : public Installable if (!new_buf_) { // Alloc owned buffer // Note: raw memory is used here because it is expected the patched program will call constructors - // Note: std::make_unique uses value-initialization so buffer is zero-initialized (just like global variables) + // Note: std::make_unique uses value-initialization so buffer is zero-initialized (just like global + // variables) new_buf_owned_ = std::make_unique(new_buf_size); new_buf_ = reinterpret_cast(new_buf_owned_.get()); } diff --git a/patch_common/include/patch_common/Traits.h b/patch_common/include/patch_common/Traits.h index 61272c491..f04f4326d 100644 --- a/patch_common/include/patch_common/Traits.h +++ b/patch_common/include/patch_common/Traits.h @@ -3,8 +3,7 @@ // For generic types that are functors, delegate to its 'operator()' template struct function_traits : public function_traits -{ -}; +{}; // for pointers to member function template @@ -23,14 +22,14 @@ struct function_traits // for cdecl function pointers template -struct function_traits +struct function_traits { using f_type = ReturnType __cdecl(Args...); }; // for fastcall function pointers template -struct function_traits +struct function_traits { using f_type = ReturnType __fastcall(Args...); }; diff --git a/tools/format.sh b/tools/format.sh new file mode 100755 index 000000000..5ce3328ae --- /dev/null +++ b/tools/format.sh @@ -0,0 +1,4 @@ +#!/bin/sh +CLANG_FORMAT_FLAGS="${CLANG_FORMAT_FLAGS:--i}" +find -regex './\(vendor\|build\|research\|\..*\)' -prune -o -regex '.*\.\(cpp\|h\|hpp\|cc\|cxx\)' \ + -exec clang-format $CLANG_FORMAT_FLAGS \{} \; diff --git a/tools/shader_compiler/main.cpp b/tools/shader_compiler/main.cpp index d268d665e..510f8d2c9 100644 --- a/tools/shader_compiler/main.cpp +++ b/tools/shader_compiler/main.cpp @@ -12,15 +12,13 @@ int main(int argc, char* argv[]) { if (argc <= 1) { - printf( - "Usage: shader_compiler [options...] hlsl_file\n\n" - "Available options:\n" - "-o output_file output file name\n" - "-e entrypoint sets shader main function\n" - "-t target sets shader target (e.g. vs_2_0)\n" - "-Dname=value adds macro-definition\n" - "-O[123] sets optimization level\n" - ); + printf("Usage: shader_compiler [options...] hlsl_file\n\n" + "Available options:\n" + "-o output_file output file name\n" + "-e entrypoint sets shader main function\n" + "-t target sets shader target (e.g. vs_2_0)\n" + "-Dname=value adds macro-definition\n" + "-O[123] sets optimization level\n"); return 1; } @@ -108,17 +106,8 @@ int main(int argc, char* argv[]) std::string hlsl_code((std::istreambuf_iterator(input_file)), std::istreambuf_iterator()); HRESULT hr = D3DCompile( - hlsl_code.data(), - hlsl_code.size(), - hlsl_filename.c_str(), - macros.data(), - D3D_COMPILE_STANDARD_FILE_INCLUDE, - entrypoint.c_str(), - target.c_str(), - flags1, - flags2, - &shader_bytecode, - &errors + hlsl_code.data(), hlsl_code.size(), hlsl_filename.c_str(), macros.data(), D3D_COMPILE_STANDARD_FILE_INCLUDE, + entrypoint.c_str(), target.c_str(), flags1, flags2, &shader_bytecode, &errors ); if (errors) { if (errors->GetBufferSize() > 0) { diff --git a/xlog/include/xlog/Appender.h b/xlog/include/xlog/Appender.h index 865146457..a0dd1ac38 100644 --- a/xlog/include/xlog/Appender.h +++ b/xlog/include/xlog/Appender.h @@ -9,53 +9,52 @@ namespace xlog { -class Logger; + class Logger; -class Appender -{ -public: - Appender() : formatter_(new SimpleFormatter()) - {} - - template - void append(Level level, const std::string& logger_name, std::format_string fmt, Args&&... args) + class Appender { - if (level <= level_) { - auto formatted = formatter_->format(level, logger_name, fmt, std::forward(args)...); - append(level, formatted); + public: + Appender() : formatter_(new SimpleFormatter()) {} + + template + void append(Level level, const std::string& logger_name, std::format_string fmt, Args&&... args) + { + if (level <= level_) { + auto formatted = formatter_->format(level, logger_name, fmt, std::forward(args)...); + append(level, formatted); + } } - } #ifdef XLOG_PRINTF - void vappendf(Level level, const std::string& logger_name, const char* fmt, std::va_list args) - { - if (level <= level_) { - auto formatted = formatter_->vformat(level, logger_name, fmt, args); - append(level, formatted); + void vappendf(Level level, const std::string& logger_name, const char* fmt, std::va_list args) + { + if (level <= level_) { + auto formatted = formatter_->vformat(level, logger_name, fmt, args); + append(level, formatted); + } } - } #endif - template - void set_formatter(A... args) - { - formatter_ = std::make_unique(args...); - } + template + void set_formatter(A... args) + { + formatter_ = std::make_unique(args...); + } - void set_level(Level level) - { - level_ = level; - } + void set_level(Level level) + { + level_ = level; + } - virtual void flush() {} - virtual ~Appender() = default; + virtual void flush() {} + virtual ~Appender() = default; -protected: - virtual void append(Level level, const std::string& formatted_message) = 0; + protected: + virtual void append(Level level, const std::string& formatted_message) = 0; -private: - std::unique_ptr formatter_; - Level level_ = Level::trace; -}; + private: + std::unique_ptr formatter_; + Level level_ = Level::trace; + }; } diff --git a/xlog/include/xlog/ConsoleAppender.h b/xlog/include/xlog/ConsoleAppender.h index eee09451c..8a023bd72 100644 --- a/xlog/include/xlog/ConsoleAppender.h +++ b/xlog/include/xlog/ConsoleAppender.h @@ -7,35 +7,34 @@ namespace xlog { -class ConsoleAppender : public Appender -{ -public: - ConsoleAppender(Level max_stderr_level = Level::warn) : - max_stderr_level_(max_stderr_level) {} - -protected: - void append(Level level, const std::string& formatted_message) override + class ConsoleAppender : public Appender { + public: + ConsoleAppender(Level max_stderr_level = Level::warn) : max_stderr_level_(max_stderr_level) {} + + protected: + void append(Level level, const std::string& formatted_message) override + { #ifndef XLOG_SINGLE_THREADED - std::lock_guard lock(mutex_); + std::lock_guard lock(mutex_); #endif - if (level <= max_stderr_level_) - std::cerr << formatted_message << '\n'; - else - std::cout << formatted_message << '\n'; - } + if (level <= max_stderr_level_) + std::cerr << formatted_message << '\n'; + else + std::cout << formatted_message << '\n'; + } - void flush() override - { - std::cerr.flush(); - std::cout.flush(); - } + void flush() override + { + std::cerr.flush(); + std::cout.flush(); + } -private: - Level max_stderr_level_; + private: + Level max_stderr_level_; #ifndef XLOG_SINGLE_THREADED - std::mutex mutex_; + std::mutex mutex_; #endif -}; + }; } diff --git a/xlog/include/xlog/FileAppender.h b/xlog/include/xlog/FileAppender.h index bab4ce3f2..208f85d2a 100644 --- a/xlog/include/xlog/FileAppender.h +++ b/xlog/include/xlog/FileAppender.h @@ -7,21 +7,21 @@ namespace xlog { -class FileAppender : public Appender -{ -public: - FileAppender(const std::string& filename, bool append = true, bool flush = true); + class FileAppender : public Appender + { + public: + FileAppender(const std::string& filename, bool append = true, bool flush = true); -protected: - void append(Level level, const std::string& formatted_message) override; - void flush() override; + protected: + void append(Level level, const std::string& formatted_message) override; + void flush() override; -private: - std::ofstream file_; - bool flush_; + private: + std::ofstream file_; + bool flush_; #ifndef XLOG_SINGLE_THREADED - std::mutex mutex_; + std::mutex mutex_; #endif -}; + }; } diff --git a/xlog/include/xlog/Formatter.h b/xlog/include/xlog/Formatter.h index 3abab7827..711765fa0 100644 --- a/xlog/include/xlog/Formatter.h +++ b/xlog/include/xlog/Formatter.h @@ -11,34 +11,35 @@ namespace xlog { -class Logger; + class Logger; -class Formatter -{ -public: - virtual ~Formatter() = default; - - template - std::string format(Level level, const std::string& logger_name, std::format_string fmt, Args&&... args) const + class Formatter { - std::string buf = prepare(level, logger_name); - std::format_to(std::back_inserter(buf), fmt, std::forward(args)...); - return buf; - } + public: + virtual ~Formatter() = default; + + template + std::string + format(Level level, const std::string& logger_name, std::format_string fmt, Args&&... args) const + { + std::string buf = prepare(level, logger_name); + std::format_to(std::back_inserter(buf), fmt, std::forward(args)...); + return buf; + } #ifdef XLOG_PRINTF - std::string vformat(Level level, const std::string& logger_name, const char* fmt, std::va_list args) const - { - std::string buf = prepare(level, logger_name); - char message[256]; - std::vsnprintf(message, sizeof(message), fmt, args); - buf += message; - return buf; - } + std::string vformat(Level level, const std::string& logger_name, const char* fmt, std::va_list args) const + { + std::string buf = prepare(level, logger_name); + char message[256]; + std::vsnprintf(message, sizeof(message), fmt, args); + buf += message; + return buf; + } #endif -protected: - virtual std::string prepare(Level level, const std::string& logger_name) const = 0; -}; + protected: + virtual std::string prepare(Level level, const std::string& logger_name) const = 0; + }; } diff --git a/xlog/include/xlog/LogStream.h b/xlog/include/xlog/LogStream.h index adb78a3b2..94eb49eab 100644 --- a/xlog/include/xlog/LogStream.h +++ b/xlog/include/xlog/LogStream.h @@ -7,34 +7,34 @@ namespace xlog { -class LogStream : public std::ostringstream -{ -public: - LogStream(Level level, const std::string& logger_name, Level logger_level) : - level_(level), logger_name_(logger_name), logger_level_(logger_level) - {} - - LogStream(LogStream&& e) : - level_(e.level_), logger_name_(std::move(e.logger_name_)), logger_level_(e.logger_level_) - {} - - LogStream(const LogStream&) = delete; // copy constructor - LogStream& operator=(const LogStream&) = delete; // assignment operator - LogStream& operator=(LogStream&& other) = delete; // move assignment - - ~LogStream() override + class LogStream : public std::ostringstream { - if (level_ <= logger_level_) { - for (const auto& appender : LoggerConfig::get().get_appenders()) { - appender->append(level_, logger_name_, str()); + public: + LogStream(Level level, const std::string& logger_name, Level logger_level) : + level_(level), logger_name_(logger_name), logger_level_(logger_level) + {} + + LogStream(LogStream&& e) : + level_(e.level_), logger_name_(std::move(e.logger_name_)), logger_level_(e.logger_level_) + {} + + LogStream(const LogStream&) = delete; // copy constructor + LogStream& operator=(const LogStream&) = delete; // assignment operator + LogStream& operator=(LogStream&& other) = delete; // move assignment + + ~LogStream() override + { + if (level_ <= logger_level_) { + for (const auto& appender : LoggerConfig::get().get_appenders()) { + appender->append(level_, logger_name_, str()); + } } } - } -private: - Level level_; - const std::string& logger_name_; - Level logger_level_; -}; + private: + Level level_; + const std::string& logger_name_; + Level logger_level_; + }; } diff --git a/xlog/include/xlog/Logger.h b/xlog/include/xlog/Logger.h index 2370c78a4..796cb11f9 100644 --- a/xlog/include/xlog/Logger.h +++ b/xlog/include/xlog/Logger.h @@ -15,9 +15,7 @@ namespace xlog Level level_; public: - Logger(std::string name, Level level = Level::trace) : - name_(std::move(name)), level_(level) - {} + Logger(std::string name, Level level = Level::trace) : name_(std::move(name)), level_(level) {} static Logger& root() { @@ -36,7 +34,7 @@ namespace xlog } #ifdef XLOG_PRINTF - void logf(Level level, const char *format, ...) XLOG_ATTRIBUTE_FORMAT_PRINTF(3, 4) + void logf(Level level, const char* format, ...) XLOG_ATTRIBUTE_FORMAT_PRINTF(3, 4) { std::va_list args; va_start(args, format); @@ -67,7 +65,6 @@ namespace xlog log(Level::error, fmt, std::forward(args)...); } - #ifdef XLOG_STREAMS LogStream error() { diff --git a/xlog/include/xlog/LoggerConfig.h b/xlog/include/xlog/LoggerConfig.h index ec60f9f14..00d2aec9a 100644 --- a/xlog/include/xlog/LoggerConfig.h +++ b/xlog/include/xlog/LoggerConfig.h @@ -9,66 +9,66 @@ namespace xlog { -class LoggerConfig -{ -public: - LoggerConfig(); - - [[nodiscard]] static LoggerConfig& get() + class LoggerConfig { - static LoggerConfig conf; - return conf; - } + public: + LoggerConfig(); - LoggerConfig& add_appender(std::unique_ptr&& appender) - { - appenders_.push_back(std::move(appender)); - return *this; - } + [[nodiscard]] static LoggerConfig& get() + { + static LoggerConfig conf; + return conf; + } - template - LoggerConfig& add_appender(A... args) - { - appenders_.push_back(std::make_unique(args...)); - return *this; - } + LoggerConfig& add_appender(std::unique_ptr&& appender) + { + appenders_.push_back(std::move(appender)); + return *this; + } - [[nodiscard]] const std::vector>& get_appenders() const - { - return appenders_; - } + template + LoggerConfig& add_appender(A... args) + { + appenders_.push_back(std::make_unique(args...)); + return *this; + } - void set_root_name(const std::string& root_name) - { - root_name_ = root_name; - } + [[nodiscard]] const std::vector>& get_appenders() const + { + return appenders_; + } - [[nodiscard]] const std::string& get_root_name() const - { - return root_name_; - } + void set_root_name(const std::string& root_name) + { + root_name_ = root_name; + } - void set_default_level(Level level) - { - default_level_ = level; - } + [[nodiscard]] const std::string& get_root_name() const + { + return root_name_; + } - [[nodiscard]] Level get_default_level() const - { - return default_level_; - } + void set_default_level(Level level) + { + default_level_ = level; + } - void flush_appenders() - { - for (auto& appender : appenders_) { - appender->flush(); + [[nodiscard]] Level get_default_level() const + { + return default_level_; + } + + void flush_appenders() + { + for (auto& appender : appenders_) { + appender->flush(); + } } - } -private: - std::string root_name_; - Level default_level_; - std::vector> appenders_; -}; + private: + std::string root_name_; + Level default_level_; + std::vector> appenders_; + }; } diff --git a/xlog/include/xlog/NullStream.h b/xlog/include/xlog/NullStream.h index 47bef6efb..9d41370fc 100644 --- a/xlog/include/xlog/NullStream.h +++ b/xlog/include/xlog/NullStream.h @@ -3,14 +3,14 @@ namespace xlog { -class NullStream -{ -public: - template - NullStream& operator<<(const T&) + class NullStream { - return *this; - } -}; + public: + template + NullStream& operator<<(const T&) + { + return *this; + } + }; } diff --git a/xlog/include/xlog/Win32Appender.h b/xlog/include/xlog/Win32Appender.h index b36c2c324..43755e67c 100644 --- a/xlog/include/xlog/Win32Appender.h +++ b/xlog/include/xlog/Win32Appender.h @@ -5,9 +5,9 @@ namespace xlog { -class Win32Appender : public Appender -{ - void append(Level level, const std::string& formatted_message) override; -}; + class Win32Appender : public Appender + { + void append(Level level, const std::string& formatted_message) override; + }; } diff --git a/xlog/include/xlog/xlog.h b/xlog/include/xlog/xlog.h index fe7942435..9e0e538a3 100644 --- a/xlog/include/xlog/xlog.h +++ b/xlog/include/xlog/xlog.h @@ -2,7 +2,7 @@ // Define helper macro #ifdef __GNUC__ -#define XLOG_ATTRIBUTE_FORMAT_PRINTF(format_arg, rest_arg) __attribute__ ((format (printf, format_arg, rest_arg))) +#define XLOG_ATTRIBUTE_FORMAT_PRINTF(format_arg, rest_arg) __attribute__((format(printf, format_arg, rest_arg))) #else #define XLOG_ATTRIBUTE_FORMAT_PRINTF(format_arg, rest_arg) #endif @@ -27,8 +27,8 @@ namespace xlog } #ifdef XLOG_PRINTF - inline void log(Level level, const char *format, ...) XLOG_ATTRIBUTE_FORMAT_PRINTF(2, 3); - inline void log(Level level, const char *format, ...) + inline void log(Level level, const char* format, ...) XLOG_ATTRIBUTE_FORMAT_PRINTF(2, 3); + inline void log(Level level, const char* format, ...) { std::va_list args; va_start(args, format); @@ -51,8 +51,8 @@ namespace xlog } #ifdef XLOG_PRINTF - inline void errorf(const char *format, ...) XLOG_ATTRIBUTE_FORMAT_PRINTF(1, 2); - inline void errorf(const char *format, ...) + inline void errorf(const char* format, ...) XLOG_ATTRIBUTE_FORMAT_PRINTF(1, 2); + inline void errorf(const char* format, ...) { std::va_list args; va_start(args, format); @@ -75,8 +75,8 @@ namespace xlog } #ifdef XLOG_PRINTF - inline void warnf(const char *format, ...) XLOG_ATTRIBUTE_FORMAT_PRINTF(1, 2); - inline void warnf(const char *format, ...) + inline void warnf(const char* format, ...) XLOG_ATTRIBUTE_FORMAT_PRINTF(1, 2); + inline void warnf(const char* format, ...) { std::va_list args; va_start(args, format); @@ -99,8 +99,8 @@ namespace xlog } #ifdef XLOG_PRINTF - inline void infof(const char *format, ...) XLOG_ATTRIBUTE_FORMAT_PRINTF(1, 2); - inline void infof(const char *format, ...) + inline void infof(const char* format, ...) XLOG_ATTRIBUTE_FORMAT_PRINTF(1, 2); + inline void infof(const char* format, ...) { std::va_list args; va_start(args, format); @@ -123,8 +123,8 @@ namespace xlog } #ifdef XLOG_PRINTF - inline void debugf(const char *format, ...) XLOG_ATTRIBUTE_FORMAT_PRINTF(1, 2); - inline void debugf(const char *format, ...) + inline void debugf(const char* format, ...) XLOG_ATTRIBUTE_FORMAT_PRINTF(1, 2); + inline void debugf(const char* format, ...) { std::va_list args; va_start(args, format); @@ -141,7 +141,7 @@ namespace xlog #endif template - inline void tracef(const char *format, ...) XLOG_ATTRIBUTE_FORMAT_PRINTF(1, 2); + inline void tracef(const char* format, ...) XLOG_ATTRIBUTE_FORMAT_PRINTF(1, 2); #ifndef XLOG_DISCARD_TRACE template inline void trace(std::format_string fmt, Args&&... args) @@ -150,7 +150,7 @@ namespace xlog } #ifdef XLOG_PRINTF - inline void tracef(const char *format, ...) + inline void tracef(const char* format, ...) { std::va_list args; va_start(args, format); @@ -160,14 +160,10 @@ namespace xlog #endif #else - inline void trace([[ maybe_unused ]] const char *format, ...) - { - } + inline void trace([[maybe_unused]] const char* format, ...) {} #ifdef XLOG_PRINTF - inline void tracef([[ maybe_unused ]] const char *format, ...) - { - } + inline void tracef([[maybe_unused]] const char* format, ...) {} #endif #endif @@ -198,13 +194,13 @@ namespace xlog #define INFO(...) xlog::info(__VA_ARGS__) #define TRACE(...) xlog::trace(__VA_ARGS__) -#define LOG_ONCE(lvl, ...) \ - do { \ +#define LOG_ONCE(lvl, ...) \ + do { \ static bool skip = false; \ - if (!skip) {\ - lvl(__VA_ARGS__); \ - skip = true; \ - } \ + if (!skip) { \ + lvl(__VA_ARGS__); \ + skip = true; \ + } \ } while (false) #define ERR_ONCE(...) LOG_ONCE(xlog::error, __VA_ARGS__) #define WARN_ONCE(...) LOG_ONCE(xlog::warn, __VA_ARGS__) diff --git a/xlog/src/FileAppender.cpp b/xlog/src/FileAppender.cpp index af1bb4fd7..46ec91497 100644 --- a/xlog/src/FileAppender.cpp +++ b/xlog/src/FileAppender.cpp @@ -1,8 +1,7 @@ #include -xlog::FileAppender::FileAppender(const std::string& filename, bool append, bool flush) : - flush_(flush) +xlog::FileAppender::FileAppender(const std::string& filename, bool append, bool flush) : flush_(flush) { std::ios_base::openmode m = std::ios_base::out; if (append)