From 95a10758ae54c2c35b36320ad4d97beaa20b2976 Mon Sep 17 00:00:00 2001 From: NovaRain Date: Mon, 27 Sep 2021 10:35:42 +0800 Subject: [PATCH] Added the ability to set custom names for unarmed attacks Updated Translations.ini template. Commented out empty exit function in some modules. --- artifacts/config_files/Translations.ini | 19 +++++++++++++- sfall/Animations.cpp | 4 +-- sfall/Animations.h | 2 +- sfall/DamageMod.cpp | 16 +++++++++-- sfall/EngineTweaks.cpp | 4 +-- sfall/EngineTweaks.h | 2 +- sfall/IniReader.cpp | 30 ++++++++++----------- sfall/IniReader.h | 22 ++++++++-------- sfall/Message.cpp | 4 +-- sfall/Message.h | 2 +- sfall/Movies.cpp | 4 +-- sfall/Movies.h | 2 +- sfall/Translate.cpp | 6 ++--- sfall/Translate.h | 6 ++--- sfall/Unarmed.cpp | 35 +++++++++++++++++++++++++ sfall/Unarmed.h | 1 + 16 files changed, 112 insertions(+), 47 deletions(-) diff --git a/artifacts/config_files/Translations.ini b/artifacts/config_files/Translations.ini index 6471fc09..86e6df12 100644 --- a/artifacts/config_files/Translations.ini +++ b/artifacts/config_files/Translations.ini @@ -4,7 +4,7 @@ KarmaGain=You gained %d karma. KarmaLoss=You lost %d karma. HighlightFail1=You aren't carrying a motion sensor. HighlightFail2=Your motion sensor is out of charge. -SuperStimExploitMsg=You cannot use a super stim on someone who is not injured! +SuperStimExploitMsg=You cannot use this item on someone who is not injured! BlockedCombat=You cannot enter combat at this time. SaveSfallDataFail=ERROR saving extended savegame information! Check if other programs interfere with savegame files/folders and try again. PartyLvlMsg=Lvl: @@ -16,3 +16,20 @@ NPCPickupFail=%s cannot pick up the item. RaceText=Race StyleText=Style DoneBtn=Done + +;Custom names for player's unarmed attacks (max 16 characters) +[Unarmed] +;Punch=Punch: +;Kick=Kick: +;StrongPunch=Strong Punch: +;HammerPunch=Hammer Punch: +;Haymaker=Haymaker: +;Jab=Jab: +;PalmStrike=Palm Strike: +;PiercingStrike=Piercing Strike: +;StrongKick=Strong Kick: +;SnapKick=Snap Kick: +;PowerKick=Power Kick: +;HipKick=Hip Kick: +;HookKick=Hook Kick: +;PiercingKick=Piercing kick: diff --git a/sfall/Animations.cpp b/sfall/Animations.cpp index 65dd0cfc..9e9b5a87 100644 --- a/sfall/Animations.cpp +++ b/sfall/Animations.cpp @@ -583,5 +583,5 @@ void Animations_Init() { MakeCall(0x419A17, art_alias_fid_hack); } -void Animations_Exit() { -} +//void Animations_Exit() { +//} diff --git a/sfall/Animations.h b/sfall/Animations.h index 6b700b77..936f4cec 100644 --- a/sfall/Animations.h +++ b/sfall/Animations.h @@ -19,5 +19,5 @@ #pragma once void Animations_Init(); -void Animations_Exit(); +//void Animations_Exit(); void ClearAllLockAnimSets(); diff --git a/sfall/DamageMod.cpp b/sfall/DamageMod.cpp index 70af41a5..3eb656ba 100644 --- a/sfall/DamageMod.cpp +++ b/sfall/DamageMod.cpp @@ -423,7 +423,7 @@ static void __declspec(naked) DisplayBonusHtHDmg1_hook() { } } -static bool bonusHtHDamageFix = false; +static bool bonusHtHDamageFix = true; static bool displayBonusDamage = false; static long __fastcall GetHtHDamage(TGameObj* source, long &meleeDmg, long handOffset) { @@ -435,13 +435,19 @@ static long __fastcall GetHtHDamage(TGameObj* source, long &meleeDmg, long handO long perkBonus = sfgame_perk_level(source, PERK_bonus_hth_damage) << 1; if (!displayBonusDamage) meleeDmg -= perkBonus; - if (bonusHtHDamageFix && displayBonusDamage) min += perkBonus; + if (displayBonusDamage && bonusHtHDamageFix) min += perkBonus; return min + bonus; } +static const char* __fastcall GetHtHName(long handOffset) { + AttackType hit = Unarmed_GetStoredHitMode((handOffset == 0) ? HANDSLOT_Left : HANDSLOT_Right); + return Unarmed_GetName(hit); +} + static void __declspec(naked) DisplayBonusHtHDmg2_hack() { static const DWORD DisplayBonusHtHDmg2Exit = 0x47254F; + static const DWORD DisplayBonusHtHDmg2Exit2 = 0x472556; __asm { mov ecx, eax; call stat_level_; // get STAT_melee_dmg @@ -450,7 +456,13 @@ static void __declspec(naked) DisplayBonusHtHDmg2_hack() { push edi; // handOffset call GetHtHDamage; push eax; // min dmg + mov ecx, edi; + call GetHtHName; + test eax, eax; + jnz customName; jmp DisplayBonusHtHDmg2Exit; +customName: + jmp DisplayBonusHtHDmg2Exit2; } } diff --git a/sfall/EngineTweaks.cpp b/sfall/EngineTweaks.cpp index 32dd7444..1943aaab 100644 --- a/sfall/EngineTweaks.cpp +++ b/sfall/EngineTweaks.cpp @@ -32,5 +32,5 @@ void EngineTweaks_Init() { } } -void EngineTweaks_Exit() { -} +//void EngineTweaks_Exit() { +//} diff --git a/sfall/EngineTweaks.h b/sfall/EngineTweaks.h index 5f85cc72..e897edcd 100644 --- a/sfall/EngineTweaks.h +++ b/sfall/EngineTweaks.h @@ -19,4 +19,4 @@ #pragma once void EngineTweaks_Init(); -void EngineTweaks_Exit(); +//void EngineTweaks_Exit(); diff --git a/sfall/IniReader.cpp b/sfall/IniReader.cpp index 47a5e6d3..1d387464 100644 --- a/sfall/IniReader.cpp +++ b/sfall/IniReader.cpp @@ -25,15 +25,15 @@ DWORD modifiedIni; static const char* ddrawIni = ".\\ddraw.ini"; static char ini[65] = ".\\"; -static int getInt(const char* section, const char* setting, int defaultValue, const char* iniFile) { +static int __stdcall getInt(const char* section, const char* setting, int defaultValue, const char* iniFile) { return GetPrivateProfileIntA(section, setting, defaultValue, iniFile); } -static size_t getString(const char* section, const char* setting, const char* defaultValue, char* buf, size_t bufSize, const char* iniFile) { +static size_t __stdcall getString(const char* section, const char* setting, const char* defaultValue, char* buf, size_t bufSize, const char* iniFile) { return GetPrivateProfileStringA(section, setting, defaultValue, buf, bufSize, iniFile); } -static std::string getString(const char* section, const char* setting, const char* defaultValue, size_t bufSize, const char* iniFile) { +static std::string __stdcall getString(const char* section, const char* setting, const char* defaultValue, size_t bufSize, const char* iniFile) { char* buf = new char[bufSize]; getString(section, setting, defaultValue, buf, bufSize, iniFile); std::string str(buf); @@ -41,7 +41,7 @@ static std::string getString(const char* section, const char* setting, const cha return str; } -static std::vector getList(const char* section, const char* setting, const char* defaultValue, size_t bufSize, char delimiter, const char* iniFile) { +static std::vector __stdcall getList(const char* section, const char* setting, const char* defaultValue, size_t bufSize, char delimiter, const char* iniFile) { std::vector list = split(getString(section, setting, defaultValue, bufSize, iniFile), delimiter); std::transform(list.cbegin(), list.cend(), list.begin(), trim); return list; @@ -59,47 +59,47 @@ void SetConfigFile(const char* iniFile) { strcat_s(ini, iniFile); } -int GetIntDefaultConfig(const char* section, const char* setting, int defaultValue) { +int __stdcall GetIntDefaultConfig(const char* section, const char* setting, int defaultValue) { return getInt(section, setting, defaultValue, ddrawIni); } -std::vector GetListDefaultConfig(const char* section, const char* setting, const char* defaultValue, size_t bufSize, char delimiter) { +std::vector __stdcall GetListDefaultConfig(const char* section, const char* setting, const char* defaultValue, size_t bufSize, char delimiter) { return getList(section, setting, defaultValue, bufSize, delimiter, ddrawIni); } -int GetConfigInt(const char* section, const char* setting, int defaultValue) { +int __stdcall GetConfigInt(const char* section, const char* setting, int defaultValue) { return getInt(section, setting, defaultValue, ini); } -std::string GetConfigString(const char* section, const char* setting, const char* defaultValue, size_t bufSize) { +std::string __stdcall GetConfigString(const char* section, const char* setting, const char* defaultValue, size_t bufSize) { return trim(getString(section, setting, defaultValue, bufSize, ini)); } -size_t GetConfigString(const char* section, const char* setting, const char* defaultValue, char* buf, size_t bufSize) { +size_t __stdcall GetConfigString(const char* section, const char* setting, const char* defaultValue, char* buf, size_t bufSize) { return getString(section, setting, defaultValue, buf, bufSize, ini); } -std::vector GetConfigList(const char* section, const char* setting, const char* defaultValue, size_t bufSize) { +std::vector __stdcall GetConfigList(const char* section, const char* setting, const char* defaultValue, size_t bufSize) { return getList(section, setting, defaultValue, bufSize, ',', ini); } -int IniGetInt(const char* section, const char* setting, int defaultValue, const char* iniFile) { +int __stdcall IniGetInt(const char* section, const char* setting, int defaultValue, const char* iniFile) { return getInt(section, setting, defaultValue, iniFile); } -size_t IniGetString(const char* section, const char* setting, const char* defaultValue, char* buf, size_t bufSize, const char* iniFile) { +size_t __stdcall IniGetString(const char* section, const char* setting, const char* defaultValue, char* buf, size_t bufSize, const char* iniFile) { return getString(section, setting, defaultValue, buf, bufSize, iniFile); } -std::string IniGetString(const char* section, const char* setting, const char* defaultValue, size_t bufSize, const char* iniFile) { +std::string __stdcall IniGetString(const char* section, const char* setting, const char* defaultValue, size_t bufSize, const char* iniFile) { return getString(section, setting, defaultValue, bufSize, iniFile); } -std::vector IniGetList(const char* section, const char* setting, const char* defaultValue, size_t bufSize, char delimiter, const char* iniFile) { +std::vector __stdcall IniGetList(const char* section, const char* setting, const char* defaultValue, size_t bufSize, char delimiter, const char* iniFile) { return getList(section, setting, defaultValue, bufSize, delimiter, iniFile); } -int SetConfigInt(const char* section, const char* setting, int value) { +int __stdcall SetConfigInt(const char* section, const char* setting, int value) { char buf[33]; _itoa_s(value, buf, 33, 10); int result = WritePrivateProfileStringA(section, setting, buf, ini); diff --git a/sfall/IniReader.h b/sfall/IniReader.h index 88ef381e..917c4d81 100644 --- a/sfall/IniReader.h +++ b/sfall/IniReader.h @@ -27,33 +27,33 @@ void SetDefaultConfigFile(); void SetConfigFile(const char* iniFile); // Gets the integer value from the default config (i.e. ddraw.ini) -int GetIntDefaultConfig(const char* section, const char* setting, int defaultValue); +int __stdcall GetIntDefaultConfig(const char* section, const char* setting, int defaultValue); // Gets a list of values separated by the delimiter from the default config (i.e. ddraw.ini) -std::vector GetListDefaultConfig(const char* section, const char* setting, const char* defaultValue, size_t bufSize, char delimiter); +std::vector __stdcall GetListDefaultConfig(const char* section, const char* setting, const char* defaultValue, size_t bufSize, char delimiter); // Gets the integer value from sfall configuration INI file -int GetConfigInt(const char* section, const char* setting, int defaultValue); +int __stdcall GetConfigInt(const char* section, const char* setting, int defaultValue); // Gets the string value from sfall configuration INI file with trim function -std::string GetConfigString(const char* section, const char* setting, const char* defaultValue, size_t bufSize = 128); +std::string __stdcall GetConfigString(const char* section, const char* setting, const char* defaultValue, size_t bufSize = 128); // Loads the string value from sfall configuration INI file into the provided buffer -size_t GetConfigString(const char* section, const char* setting, const char* defaultValue, char* buffer, size_t bufSize = 128); +size_t __stdcall GetConfigString(const char* section, const char* setting, const char* defaultValue, char* buffer, size_t bufSize = 128); // Parses the comma-separated list from the settings from sfall configuration INI file -std::vector GetConfigList(const char* section, const char* setting, const char* defaultValue, size_t bufSize = 128); +std::vector __stdcall GetConfigList(const char* section, const char* setting, const char* defaultValue, size_t bufSize = 128); // Gets the integer value from given INI file -int IniGetInt(const char* section, const char* setting, int defaultValue, const char* iniFile); +int __stdcall IniGetInt(const char* section, const char* setting, int defaultValue, const char* iniFile); // Gets the string value from given INI file -size_t IniGetString(const char* section, const char* setting, const char* defaultValue, char* buf, size_t bufSize, const char* iniFile); +size_t __stdcall IniGetString(const char* section, const char* setting, const char* defaultValue, char* buf, size_t bufSize, const char* iniFile); // Gets the string value from given INI file -std::string IniGetString(const char* section, const char* setting, const char* defaultValue, size_t bufSize, const char* iniFile); +std::string __stdcall IniGetString(const char* section, const char* setting, const char* defaultValue, size_t bufSize, const char* iniFile); // Parses the comma-separated list setting from given INI file -std::vector IniGetList(const char* section, const char* setting, const char* defaultValue, size_t bufSize, char delimiter, const char* iniFile); +std::vector __stdcall IniGetList(const char* section, const char* setting, const char* defaultValue, size_t bufSize, char delimiter, const char* iniFile); -int SetConfigInt(const char* section, const char* setting, int value); +int __stdcall SetConfigInt(const char* section, const char* setting, int value); diff --git a/sfall/Message.cpp b/sfall/Message.cpp index 90c4576a..c4e736b0 100644 --- a/sfall/Message.cpp +++ b/sfall/Message.cpp @@ -242,6 +242,6 @@ void Message_Init() { } } -void Message_Exit() { +//void Message_Exit() { //gExtraGameMsgLists.clear(); -} +//} diff --git a/sfall/Message.h b/sfall/Message.h index 01482007..2d43b90c 100644 --- a/sfall/Message.h +++ b/sfall/Message.h @@ -49,7 +49,7 @@ extern ExtraGameMessageListsMap gExtraGameMsgLists; extern const MSGList* gameMsgFiles[]; void Message_Init(); -void Message_Exit(); +//void Message_Exit(); void FallbackEnglishLoadMsgFiles(); void ReadExtraGameMsgFiles(); void ClearReadExtraGameMsgFiles(); diff --git a/sfall/Movies.cpp b/sfall/Movies.cpp index b687ded9..0b2310d7 100644 --- a/sfall/Movies.cpp +++ b/sfall/Movies.cpp @@ -620,5 +620,5 @@ void Movies_Init() { SkipOpeningMoviesPatch(); } -void Movies_Exit() { -} +//void Movies_Exit() { +//} diff --git a/sfall/Movies.h b/sfall/Movies.h index 81a822b4..06e4e010 100644 --- a/sfall/Movies.h +++ b/sfall/Movies.h @@ -22,4 +22,4 @@ static const int MaxMovies = 32; extern char MoviePaths[MaxMovies * 65]; void Movies_Init(); -void Movies_Exit(); +//void Movies_Exit(); diff --git a/sfall/Translate.cpp b/sfall/Translate.cpp index 9946fea1..58e4f492 100644 --- a/sfall/Translate.cpp +++ b/sfall/Translate.cpp @@ -30,15 +30,15 @@ static struct Translation { } } translationIni; -size_t Translate_Get(const char* section, const char* setting, const char* defaultValue, char* buffer, size_t bufSize) { +size_t __stdcall Translate_Get(const char* section, const char* setting, const char* defaultValue, char* buffer, size_t bufSize) { return IniGetString(section, setting, defaultValue, buffer, bufSize, translationIni.File()); } -std::string Translate_Get(const char* section, const char* setting, const char* defaultValue, size_t bufSize) { +std::string __stdcall Translate_Get(const char* section, const char* setting, const char* defaultValue, size_t bufSize) { return std::move(IniGetString(section, setting, defaultValue, bufSize, translationIni.File())); } -std::vector Translate_GetList(const char* section, const char* setting, const char* defaultValue, char delimiter, size_t bufSize) { +std::vector __stdcall Translate_GetList(const char* section, const char* setting, const char* defaultValue, char delimiter, size_t bufSize) { return std::move(IniGetList(section, setting, defaultValue, bufSize, delimiter, translationIni.File())); } diff --git a/sfall/Translate.h b/sfall/Translate.h index 45b48423..be25ff6c 100644 --- a/sfall/Translate.h +++ b/sfall/Translate.h @@ -21,13 +21,13 @@ void Translate_Init(const char* config); // Translates given string using sfall translation INI file and puts the result into given buffer -size_t Translate_Get(const char* section, const char* setting, const char* defaultValue, char* buffer, size_t bufSize = 128); +size_t __stdcall Translate_Get(const char* section, const char* setting, const char* defaultValue, char* buffer, size_t bufSize = 128); // Translates given string using sfall translation INI file -std::string Translate_Get(const char* section, const char* setting, const char* defaultValue, size_t bufSize = 128); +std::string __stdcall Translate_Get(const char* section, const char* setting, const char* defaultValue, size_t bufSize = 128); // Translates given list of strings using sfall translation INI file -std::vector Translate_GetList(const char* section, const char* setting, const char* defaultValue, char delimiter, size_t bufSize = 256); +std::vector __stdcall Translate_GetList(const char* section, const char* setting, const char* defaultValue, char delimiter, size_t bufSize = 256); /* Messages */ diff --git a/sfall/Unarmed.cpp b/sfall/Unarmed.cpp index 2d882818..c94dbfb3 100644 --- a/sfall/Unarmed.cpp +++ b/sfall/Unarmed.cpp @@ -20,6 +20,7 @@ #include "main.h" #include "FalloutEngine.h" +#include "Translate.h" #include "DamageMod.h" @@ -29,6 +30,8 @@ static struct { HandSlotMode mode; } slotHitData[2]; +std::string hitNames[14]; + class Hits { public: static const long count = 20; @@ -343,6 +346,18 @@ long Unarmed_GetDamage(AttackType hit, long &minOut, long &maxOut) { return unarmed.Hit(hit).bonusDamage; } +const char* Unarmed_GetName(AttackType hit) { + if (hit > ATKTYPE_PIERCINGKICK) return nullptr; + + switch (hit) { + case ATKTYPE_PUNCH: + case ATKTYPE_KICK: + return (!hitNames[hit - 4].empty()) ? hitNames[hit - 4].c_str() : nullptr; + default: + return (hit >= ATKTYPE_STRONGPUNCH && !hitNames[hit - 6].empty()) ? hitNames[hit - 6].c_str() : nullptr; + } +} + //////////////////////////////////////////////////////////////////////////////// static AttackType GetPunchingHit() { @@ -485,6 +500,26 @@ void Unarmed_Init() { // Store the current values of unarmed attack modes when opening the player's inventory HookCall(0x46E8D4, handle_inventory_hook); + + const char* setting[14] = { + "Punch", + "Kick", + "StrongPunch", + "HammerPunch", + "Haymaker", + "Jab", + "PalmStrike", + "PiercingStrike", + "StrongKick", + "SnapKick", + "PowerKick", + "HipKick", + "HookKick", + "PiercingKick" + }; + for (size_t i = 0; i < 14; i++) { + hitNames[i] = Translate_Get("Unarmed", setting[i], "", 17); + } } //void Unarmed_Exit() { diff --git a/sfall/Unarmed.h b/sfall/Unarmed.h index 621c45ec..5d6e5bbe 100644 --- a/sfall/Unarmed.h +++ b/sfall/Unarmed.h @@ -23,5 +23,6 @@ void Unarmed_Init(); long Unarmed_GetHitAPCost(AttackType hit); long Unarmed_GetDamage(AttackType hit, long &minOut, long &maxOut); +const char* Unarmed_GetName(AttackType hit); AttackType Unarmed_GetStoredHitMode(HandSlot slot);