From 0d023c32db12e3450549317999aefcb3dca7fa8f Mon Sep 17 00:00:00 2001 From: NovaRain Date: Tue, 29 Oct 2019 10:41:03 +0800 Subject: [PATCH] Improved and moved the address conflict checking to CheckAddress.cpp/h Added ddraw_CheckAddr.ini file to check conflicts properly. Some code fixes/edits. --- artifacts/ddraw.ini | 3 +- sfall/CheckAddress.cpp | 173 ++++++++ sfall/CheckAddress.h | 10 + sfall/Modules/Elevators.cpp | 2 +- sfall/Modules/LoadOrder.cpp | 5 +- sfall/Modules/Message.cpp | 4 +- sfall/Modules/Perks.cpp | 14 +- sfall/Modules/Premade.cpp | 2 +- sfall/SafeWrite.cpp | 42 +- sfall/SafeWrite.h | 11 +- sfall/SimplePatch.h | 3 +- sfall/ddraw.vcxproj | 4 +- sfall/ddraw.vcxproj.filters | 2 + sfall/ddraw_CheckAddr.ini | 806 ++++++++++++++++++++++++++++++++++++ 14 files changed, 1014 insertions(+), 67 deletions(-) create mode 100644 sfall/CheckAddress.cpp create mode 100644 sfall/CheckAddress.h create mode 100644 sfall/ddraw_CheckAddr.ini diff --git a/artifacts/ddraw.ini b/artifacts/ddraw.ini index fa1a1089..0004e15d 100644 --- a/artifacts/ddraw.ini +++ b/artifacts/ddraw.ini @@ -94,7 +94,7 @@ GPUBlt=0 Use32BitHeadGraphics=0 ;Set to 1 to automatically search for alternative avi video files when Fallout tries to play the game movies -;Requires graphics mode 4 or 5 +;Requires DX9 graphics mode 4 or 5 AllowDShowMovies=0 ;Fade effect time percentage modifier @@ -797,7 +797,6 @@ AlwaysFindScripts=0 Test_ForceFloats=0 ;These options control what output is saved in the debug log (sfall-log.txt) - ;Prints messages duing sfall initialization Init=0 ;Prints messages relating to hook scripts diff --git a/sfall/CheckAddress.cpp b/sfall/CheckAddress.cpp new file mode 100644 index 00000000..c0b21022 --- /dev/null +++ b/sfall/CheckAddress.cpp @@ -0,0 +1,173 @@ +#include "main.h" + +#include "CheckAddress.h" + +namespace sfall +{ + +#ifndef NDEBUG + +std::multimap writeAddress; + +static std::vector excludeAddr = { + 0x42a14f, + 0x42a178, + + //0x43C77D, // for 0x43C77C +}; + +struct HackPair { + long addr; + long len; + + HackPair(long addr, long len) : addr(addr), len(len) {} +}; + +static std::vector hackAddr = { + // scripting: Anims + {0x459C97, 1}, {0x459D4B, 1}, {0x459E3B, 1}, {0x459EEB, 1}, {0x459F9F, 1}, {0x45A053, 1}, {0x45A10B, 1}, {0x45AE53, 1}, + // scripting: Misc + {0x495C50, 4}, {0x495C77, 6}, {0x495CEC, 6}, {0x495CFB, 1}, {0x495BF1, 5}, {0x4AFBC1, 1}, {0x4AFC1C, 2}, + // scripting: Perks + {0x424AB6, 1}, {0x4AFAE2, 4}, + {0x49687F, 1}, {0x496880, 4}, // hookcall + // scripting: Stats + {0x43C27A, 1}, {0x4AFABD, 5}, + // scripting: Worldmap + {0x4C06D1, 5}, + + // module: AI + {0x4290B6, 5}, + // module: BarBoxes + {0x461342, 5}, {0x461243, 5}, + {0x461493, 5}, //{0x461495, 1}, + {0x461513, 1}, {0x461718, 1}, {0x46170A, 1}, + // module: Books + {0x49B9FB, 5}, + // module: Combat + {0x478EC6, 1}, {0x478EC7, 4}, // hookcall + // module: CritterStats + {0x4AF761, 1}, {0x4AF762, 4}, // hookcall + // module: DamageMod + {0x4722DD, 1}, {0x4722DE, 4}, {0x472309, 1}, {0x47230A, 4}, // hookcalls + // module: Debug + {0x48007E, 1}, + // module: Drugs + {0x479EEC, 5}, {0x43C15C, 5}, {0x47A5B8, 5}, {0x47A50C, 5}, + {0x47A523, 4}, {0x47A527, 1}, {0x47A3A8, 1}, + // module: Explosions + {0x49BCC7, 5}, {0x49BD56, 5}, {0x4A2865, 5}, {0x4737F2, 5}, {0x49C005, 5}, + {0x411B54, 1}, {0x423C93, 1}, + {0x411A19, 4}, {0x411A29, 4}, {0x411A35, 4}, {0x411A3C, 4}, + {0x479183, 4}, {0x47918B, 4}, + {0x411709, 1}, {0x4119FC, 1}, {0x411C08, 1}, {0x4517C1, 1}, {0x423BC8, 1}, {0x42381A, 1}, + // module: ExtraSave + //{0x47B923, 6}, + // module: Inventory + // module: LoadOrder + {0x43FA9F, 4}, {0x44EB5B, 4}, {0x48152E, 4}, + //{0x480A95, 5}, (it in movies.cpp) + // module: MainMenu + {0x481753, 4}, {0x48175C, 4}, {0x481748, 4}, + // module: Message + {0x484B18, 1}, {0x484B19, 4}, // hookcall + // module: Movies + {0x44E937, 1}, {0x44E938, 4}, {0x44E949, 1}, {0x44E94A, 4}, // hookcalls + //{0x4A378B, 5}, {0x4A36EC, 4}, {0x4A3747, 4}, {0x4A376A, 4}, + // module: Objects + {0x4A364A, 5}, {0x4831D9, 1}, {0x4831DA, 1}, + {0x4841D6, 1}, {0x4841D7, 4}, // hookcall + // module: PartyControl + {0x422BDE, 1}, {0x4229EC, 1}, + {0x49EB09, 1}, {0x49EB0A, 4}, {0x458242, 1}, {0x458243, 4}, {0x458326, 1}, {0x458327, 4}, // hookcalls + // module: Perks + {0x43C77C, 1}, {0x43C77D, 4}, // hookcall + {0x478AC4, 1}, {0x478AC5, 4}, {0x496823, 5}, + {0x496C2D, 1}, {0x496C2E, 4}, {0x496D11, 1}, {0x496D12, 4}, // hookcalls + // trait hookcalls + {0x4245E0, 1}, {0x4245E1, 4}, {0x4248F9, 1}, {0x4248FA, 4}, {0x478C8A, 1}, {0x478C8B, 4}, + {0x478E70, 1}, {0x478E71, 4}, {0x410707, 1}, {0x410708, 4}, {0x42389F, 1}, {0x4238A0, 4}, + {0x47A0CD, 1}, {0x47A0CE, 4}, {0x47A51A, 1}, {0x47A51B, 4}, {0x479BE1, 1}, {0x479BE2, 4}, + {0x47A0DD, 1}, {0x47A0DE, 4}, {0x43C295, 1}, {0x43C296, 4}, {0x43C2F3, 1}, {0x43C2F4, 4}, + {0x43C2A4, 1}, {0x43C2A5, 4}, {0x44272E, 1}, {0x44272F, 4}, + // end + {0x4B3C7C, 5}, {0x4B40FC, 5}, + {0x4B3A81, 4}, {0x4B3B80, 4}, {0x4B3AAE, 4}, {0x4B3BA0, 4}, {0x4B3BC0, 4}, + {0x478E75, 5}, + {0x42448E, 4}, {0x424489, 4}, {0x424474, 4}, + {0x42465D, 1}, {0x424636, 1}, {0x4251CE, 1}, + // module: Player model + {0x418B88, 4}, {0x418BAB, 4}, {0x418B50, 4}, {0x418B6D, 4}, + // module: Skills + {0x4AA59D, 5}, {0x4AA738, 5}, {0x4AA940, 5}, + {0x4AA9E1, 1}, {0x4AA9E2, 4}, {0x4AA9F1, 1}, {0x4AA9F2, 4}, {0x4AA9EC, 1}, {0x4AA9ED, 4}, // hookcalls + // module: Stats + {0x4AF6FC, 5}, + // module: Worldmap + {0x4A33B8, 6}, {0x4A34EC, 1}, {0x4A3544, 1}, + {0x42E57A, 1}, {0x42E57B, 4}, // hookcall + {0x4C2D9B, 4}, {0x499FDE, 4}, + {0x49952C, 1}, {0x497557, 1}, {0x42E587, 1}, {0x42E588, 4}, {0x499FD4, 2}, {0x499E93, 2}, + // module: MiscPatches + {0x460BB6, 4}, {0x41276A, 1}, {0x480AAA, 4}, {0x444BA5, 4}, {0x444BCA, 4}, +}; + +//static std::vector jumpAddr = { +//}; + +// Checking for conflicts requires all options in ddraw.ini to be enabled +void PrintAddrList() { + long level = iniGetInt("Debugging", "Enable", 0, ::sfall::ddrawIni); + if (level < 10) hackAddr.clear(); + + std::vector sortAddr(hackAddr); + + for (const auto &wa : writeAddress) { + sortAddr.emplace_back(wa.first, wa.second); + } + std::sort(sortAddr.begin(), sortAddr.end(), [](const HackPair &a, const HackPair &b) { + return (a.addr != b.addr) ? a.addr < b.addr : a.len < b.len; + }); + + unsigned long pa = 0, pl = 0; + for (const auto &el : sortAddr) + { + unsigned long diff = (pa) ? (el.addr - pa) : -1; // length between two addresses + if (diff == 0) { + dlog_f("0x%x L:%d [Overwriting]\n", DL_MAIN, el.addr, el.len); + } else if (diff < pl) { + dlog_f("0x%x L:%d [Conflict] with 0x%x L:%d\n", DL_MAIN, el.addr, el.len, pa, pl); + MessageBoxA(0, "Conflict detected!", "", MB_TASKMODAL); + } else if (level >= 11 && diff == pl) { + dlog_f("0x%x L:%d [Warning] Hacking near:0x%x\n", DL_MAIN, el.addr, el.len, pa); + } else if (level >= 12) { + dlog_f("0x%x L:%d\n", DL_MAIN, el.addr, el.len); + } + pa = el.addr; + pl = el.len; + } +} + +void CheckConflict(DWORD addr, long len) { + if (writeAddress.find(addr) != writeAddress.cend()) { + if (std::find(excludeAddr.cbegin(), excludeAddr.cend(), addr) != excludeAddr.cend()) return; + char buf[64]; + sprintf_s(buf, "Memory overwriting at address 0x%x", addr); + MessageBoxA(0, buf, "", MB_TASKMODAL); + } + writeAddress.emplace(addr, len); +} + +void AddrAddToList(DWORD addr, long len) { + writeAddress.emplace(addr, len); +} + +#else + +void PrintAddrList() {} +void CheckConflict(DWORD addr, long len) {} +void AddrAddToList(DWORD addr, long len) {} + +#endif + +} diff --git a/sfall/CheckAddress.h b/sfall/CheckAddress.h new file mode 100644 index 00000000..c621dcdd --- /dev/null +++ b/sfall/CheckAddress.h @@ -0,0 +1,10 @@ +#pragma once + +namespace sfall +{ + +void PrintAddrList(); +void CheckConflict(DWORD addr, long len); +void AddrAddToList(DWORD addr, long len); + +} diff --git a/sfall/Modules/Elevators.cpp b/sfall/Modules/Elevators.cpp index 842ce99c..7c210234 100644 --- a/sfall/Modules/Elevators.cpp +++ b/sfall/Modules/Elevators.cpp @@ -113,7 +113,7 @@ static void LoadElevators(const char* elevFile) { for (int i = 0; i < vanillaElevatorCount; i++) elevatorType[i] = i; char section[4]; - if (elevFile) { + if (elevFile && GetFileAttributes(elevFile) != INVALID_FILE_ATTRIBUTES) { for (int i = 0; i < elevatorCount; i++) { _itoa_s(i, section, 10); int type = iniGetInt(section, "Image", elevatorType[i], elevFile); diff --git a/sfall/Modules/LoadOrder.cpp b/sfall/Modules/LoadOrder.cpp index 82af8a54..6426334a 100644 --- a/sfall/Modules/LoadOrder.cpp +++ b/sfall/Modules/LoadOrder.cpp @@ -162,9 +162,8 @@ static void __stdcall InitExtraPatches() { patchFiles.shrink_to_fit(); } -static void __fastcall game_init_databases_hook() { - fo::PathNode* master_patches; - __asm mov master_patches, eax; // eax = _master_db_handle +static void __fastcall game_init_databases_hook() { // eax = _master_db_handle + fo::PathNode* master_patches = (fo::PathNode*)fo::var::master_db_handle; if (!patchFiles.empty()) InitExtraPatches(); diff --git a/sfall/Modules/Message.cpp b/sfall/Modules/Message.cpp index 98a9c1fb..9bb7c72c 100644 --- a/sfall/Modules/Message.cpp +++ b/sfall/Modules/Message.cpp @@ -184,7 +184,6 @@ static void ClearReadExtraGameMsgFiles() { for (auto it = gExtraGameMsgLists.begin(); it != gExtraGameMsgLists.end(); ++it) { fo::func::message_exit(it->second.get()); } - //gExtraGameMsgLists.clear(); } void Message::init() { @@ -192,11 +191,12 @@ void Message::init() { LoadGameHook::OnGameInit() += FallbackEnglishLoadMsgFiles; LoadGameHook::OnBeforeGameStart() += ReadExtraGameMsgFiles; + LoadGameHook::OnBeforeGameClose() += ClearReadExtraGameMsgFiles; LoadGameHook::OnGameReset() += ClearScriptAddedExtraGameMsg; } void Message::exit() { - ClearReadExtraGameMsgFiles(); + //gExtraGameMsgLists.clear(); } } diff --git a/sfall/Modules/Perks.cpp b/sfall/Modules/Perks.cpp index a9d22ef0..37dfde0b 100644 --- a/sfall/Modules/Perks.cpp +++ b/sfall/Modules/Perks.cpp @@ -858,10 +858,10 @@ static void PerkSetup() { if (!perksReInit) { // _perk_data SafeWriteBatch((DWORD)perks, {0x496669, 0x496837, 0x496BAD, 0x496C41, 0x496D25}); - SafeWrite32(0x496696, (DWORD)perks + 4); - SafeWrite32(0x496BD1, (DWORD)perks + 4); - SafeWrite32(0x496BF5, (DWORD)perks + 8); - SafeWrite32(0x496AD4, (DWORD)perks + 12); + SafeWrite32(0x496696, (DWORD)&perks[0].description); + SafeWrite32(0x496BD1, (DWORD)&perks[0].description); + SafeWrite32(0x496BF5, (DWORD)&perks[0].image); + SafeWrite32(0x496AD4, (DWORD)&perks[0].ranks); } memcpy(perks, var::perk_data, sizeof(PerkInfo) * PERK_count); // copy vanilla data @@ -1121,9 +1121,9 @@ static void TraitSetup() { // _trait_data SafeWrite32(0x4B3A81, (DWORD)traits); SafeWrite32(0x4B3B80, (DWORD)traits); - SafeWrite32(0x4B3AAE, (DWORD)traits + 4); - SafeWrite32(0x4B3BA0, (DWORD)traits + 4); - SafeWrite32(0x4B3BC0, (DWORD)traits + 8); + SafeWrite32(0x4B3AAE, (DWORD)&traits[0].description); + SafeWrite32(0x4B3BA0, (DWORD)&traits[0].description); + SafeWrite32(0x4B3BC0, (DWORD)&traits[0].image); char buf[512], num[5] = {'t'}; char* num2 = &num[1]; diff --git a/sfall/Modules/Premade.cpp b/sfall/Modules/Premade.cpp index 4519b0a2..340f6a72 100644 --- a/sfall/Modules/Premade.cpp +++ b/sfall/Modules/Premade.cpp @@ -46,7 +46,7 @@ void Premade::init() { SafeWrite32(0x51C8D4, count); SafeWrite32(0x4A7D76, (DWORD)premade); SafeWrite32(0x4A8B1E, (DWORD)premade); - SafeWrite32(0x4A7E2C, (DWORD)premade + 20); + SafeWrite32(0x4A7E2C, (DWORD)&premade[0].fid); strcpy((char*)0x50AF68, premade[0].path); dlogr(" Done", DL_INIT); } diff --git a/sfall/SafeWrite.cpp b/sfall/SafeWrite.cpp index 10d7adb5..53f168ea 100644 --- a/sfall/SafeWrite.cpp +++ b/sfall/SafeWrite.cpp @@ -1,4 +1,5 @@ #include "main.h" +#include "CheckAddress.h" namespace sfall { @@ -9,47 +10,6 @@ enum CodeType : BYTE { Nop = 0x90 }; -#ifndef NDEBUG -std::multimap writeAddress; - -/* Checking for conflicts requires all options in ddraw.ini to be enabled */ -void PrintAddrList() { - bool level = (iniGetInt("Debugging", "Enable", 0, ::sfall::ddrawIni) > 1); - unsigned long pa = 0, pl = 0; - for (const auto &wa : writeAddress) { - unsigned long diff = (pa) ? (wa.first - pa) : -1; // length between two addresses - if (diff == 0) { - dlog_f("0x%x L:%d [Overwriting]\n", DL_MAIN, wa.first, wa.second); - } else if (diff < pl) { - dlog_f("0x%x L:%d [Conflict] with 0x%x L:%d\n", DL_MAIN, wa.first, wa.second, pa, pl); - } else if (level && diff == pl) { - dlog_f("0x%x L:%d [Warning] PL:%d\n", DL_MAIN, wa.first, wa.second, pl); - } else if (level) { - dlog_f("0x%x L:%d\n", DL_MAIN, wa.first, wa.second); - } - pa = wa.first; - pl = wa.second; - } -} - -void CheckConflict(DWORD addr, long len) { - if (writeAddress.find(addr) != writeAddress.cend()) { - char buf[64]; - sprintf_s(buf, "Memory writing conflict at address 0x%x.", addr); - //dlogr(buf, DL_MAIN); - MessageBoxA(0, buf, "", MB_TASKMODAL); - } - writeAddress.emplace(addr, len); -} - -void AddrAddToList(DWORD addr, long len) { - writeAddress.emplace(addr, len); -} -#else -void CheckConflict(DWORD addr, long len) {} -void AddrAddToList(DWORD addr, long len) {} -#endif - static void _stdcall SafeWriteFunc(BYTE code, DWORD addr, void* func) { DWORD oldProtect, data = (DWORD)func - (addr + 5); diff --git a/sfall/SafeWrite.h b/sfall/SafeWrite.h index 410f03d3..6ec9982d 100644 --- a/sfall/SafeWrite.h +++ b/sfall/SafeWrite.h @@ -3,23 +3,18 @@ #include #include +#include "CheckAddress.h" + namespace sfall { -#ifndef NDEBUG -void AddrAddToList(DWORD addr, long len); -void PrintAddrList(); -#endif - template void _stdcall SafeWrite(DWORD addr, T data) { DWORD oldProtect; VirtualProtect((void*)addr, sizeof(T), PAGE_EXECUTE_READWRITE, &oldProtect); *((T*)addr) = data; VirtualProtect((void*)addr, sizeof(T), oldProtect, &oldProtect); - #ifndef NDEBUG - AddrAddToList(addr, sizeof(T)); - #endif + AddrAddToList(addr, sizeof(T)); } template diff --git a/sfall/SimplePatch.h b/sfall/SimplePatch.h index d48292ae..dd650e18 100644 --- a/sfall/SimplePatch.h +++ b/sfall/SimplePatch.h @@ -23,8 +23,9 @@ T SimplePatch(DWORD *addrs, int numAddrs, const char* iniSection, const char* in } _snprintf_s(msg, sizeof(msg), _TRUNCATE, "Applying patch: %s = %d.", iniKey, value); dlog((const char*)msg, DL_INIT); - for (int i = 0; i < numAddrs; i++) + for (int i = 0; i < numAddrs; i++) { SafeWrite(addrs[i], (T)value); + } dlogr(" Done", DL_INIT); } return value; diff --git a/sfall/ddraw.vcxproj b/sfall/ddraw.vcxproj index 29299ee1..f277febc 100644 --- a/sfall/ddraw.vcxproj +++ b/sfall/ddraw.vcxproj @@ -45,7 +45,7 @@ DynamicLibrary NotSet - v141 + v140_xp @@ -277,6 +277,7 @@ + @@ -376,6 +377,7 @@ + diff --git a/sfall/ddraw.vcxproj.filters b/sfall/ddraw.vcxproj.filters index f2a52345..1a87a52a 100644 --- a/sfall/ddraw.vcxproj.filters +++ b/sfall/ddraw.vcxproj.filters @@ -285,6 +285,7 @@ Modules + @@ -530,6 +531,7 @@ Modules + diff --git a/sfall/ddraw_CheckAddr.ini b/sfall/ddraw_CheckAddr.ini new file mode 100644 index 00000000..adc11e01 --- /dev/null +++ b/sfall/ddraw_CheckAddr.ini @@ -0,0 +1,806 @@ +;sfall configuration settings - version for checking conflicting addresses. + +[Main] +;Change to 1 if you want to use command line args to tell sfall to use another ini file. +UseCommandLine=0 + +;Uncomment and point to a file to get alternate translations for some sfall messages +;TranslationsINI=.\Translations.ini + +;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +[ExtraPatches] +;This section allows you to set multiple paths to folders containing mods or patches that will be loaded by the game +;The priority of read files will be higher than the files in patchXXX.dat +;If DataLoadOrderPatch is enabled, the data load order will be: +;master_patches > critter_patches > PatchFile99 - PatchFile0 > patchXXX.dat > ... +;Paths to folders and Fallout .dat files are supported. The available range for PatchFile option names is from 0 to 99 +;The greater numbers take precedence over lesser numbers +;PatchFile0=mods\RP_data + +;Path to the folder in which the game will automatically search and load custom .dat files +;The data load order of the .dat files in the folder will be in reverse alphabetical order of the filenames +;The .dat files specified in the PatchFileXX options will have higher priority than others +;Uncomment the option to specify a different folder path. The default path is \mods\ +;AutoSearchPath=mods + +;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +[Sound] +;Sets the number of allowed simultaneous sound effects +;Set to 0 to leave the default unchanged (i.e. 4) +NumSoundBuffers=16 + +;Set to 1 to allow attaching sound files to combat float messages +AllowSoundForFloats=1 + +;Set to 1 to automatically search for alternative formats (mp3/wma/wav) when Fallout tries to play an acm +;Set to 2 to play alternative music files even if original acm files are not present in the music folder +;This does not effect the play_sfall_sound and stop_sfall_sound script functions +AllowDShowSound=2 + +;Set to 1 to override the music path used by default (i.e. data\sound\music\) if not present in the cfg +;Set to 2 to overwrite all occurances of the music path +OverrideMusicDir=2 + +;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +[Speed] +;Set to 0 to disable everything in this section +Enable=1 + +;The speeds corresponding to each slot in percent. (i.e. 100 is normal speed) +SpeedMulti0=50 +SpeedMulti1=100 +SpeedMulti2=200 +SpeedMulti3=300 +SpeedMulti4=400 +SpeedMulti5=500 +SpeedMulti6=600 +SpeedMulti7=700 +SpeedMulti8=800 +SpeedMulti9=900 + +;The initial speed at game startup +SpeedMultiInitial=110 + +;Set to 1 to also affect the playback speed of mve video files without an audio track +AffectPlayback=1 + +;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +[Graphics] +;Set to 0 for 8 bit fullscreen +;Set to 4 for DX9 fullscreen +;Set to 5 for DX9 windowed +;A DX9 mode is required for any graphics related script extender functions to work (i.e. fullscreen shaders) +;Modes 1, 2 and 3 are no longer supported +Mode=5 + +;If using a DX9 mode, this changes the resolution +;The graphics are simply stretched to fit the new window; this does _not_ let you see more of the map +;If set to 0, use Fallout's native resolution +GraphicsWidth=1280 +GraphicsHeight=720 + +;Set to 1 to do the palette conversion on the GPU +;Set to 2 to do the palette conversion on the CPU +;Set to 0 to pick automatically +;GPU is faster, but requires v2.0 pixel shader support +GPUBlt=0 + +;Set to 1 to allow using 32-bit textures for talking heads +;The texture files should be placed in art\heads\\ (w/o extension) +;The files in the folder should be numbered according to the number of frames in the talking head FRM file (0.png, 1.png, etc.) +;See the text file in the modders pack for a detailed description +;Requires DX9 graphics mode and v2.0 pixel shader support (see GPUBlt option) +Use32BitHeadGraphics=1 + +;Set to 1 to automatically search for alternative avi video files when Fallout tries to play the game movies +;Requires DX9 graphics mode 4 or 5 +AllowDShowMovies=1 + +;Fade effect time percentage modifier +;Default is 100. Decrease/increase this value to speed up/slow down fade effects +FadeMultiplier=101 + +;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +[Interface] +;Set to 1 to use the expanded world map interface +;Set to 2 to skip correcting the position of entrance markers on town maps +;You can use resized FRMs in 700x682 for town maps in the expanded world map interface +;Requires High Resolution Patch v4.1.8 and a new WORLDMAP.frm file in art\intrface\ (included in sfall.dat) +;The resolution of hi-res patch must be set to at least 890x720 +ExpandWorldMap=1 + +;Set to 1 to expand the number of action points displayed on the interface bar +;Requires new IFACE_E.frm and HR_IFACE_E.frm files in art\intrface\ (included in sfall.dat) to display correctly +;The minimum supported version of High Resolution Patch is 4.1.8 +ActionPointsBar=1 + +;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +[Input] +;Set to 1 to enable the mouse scroll wheel to scroll through the inventory, barter, and loot screens +UseScrollWheel=1 + +;The mouse Z position is divided by this modifier to calculate the number of inventory +;slots to scroll. My mouse moves 120 pixel in the z direction for one click of the mouse +;wheel, but this may vary depending on your mouse manufacturer and windows settings. +;Set to 0 to only ever scroll 1 click +ScrollMod=0 + +;Adjusts mouse sensitivity to some percentage of normal. +;Negative values are valid if you want your mouse axis reversed for some reason +MouseSensitivity=100 + +;DX scancode of a key to press when the middle mouse button is clicked +;The default of 0x30 toggles between your two weapons +;Set to 0 to disable +MiddleMouse=0x30 + +;Set to 1 to reverse the left and right mouse buttons +ReverseMouseButtons=0 + +;Set these to 1 if you want Fallout to access the keyboard or mouse in background mode +;Try these if you get the 'Failure initializing input devices' error +BackgroundKeyboard=0 +BackgroundMouse=0 + +;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + +;The modifier key you have to hold down to change any speed settings +;Set to 0 if you don't want to use a modifier key, or a DX scancode otherwise +;Set to -1 for either ctrl key, -2 for either alt key or -3 for either shift key +SpeedModKey=-1 + +;A key to press to toggle the speed tweak on or off +;Specify 0 if you don't want a toggle key, or a DX scancode otherwise +SpeedToggleKey=0 + +;The keys corresponding to the 10 speed slots +;Set to 0 to disable a slot, otherwise specify the DX scancode of the key you want to use +SpeedKey0=0x52 +SpeedKey1=0x4f +SpeedKey2=0x50 +SpeedKey3=0x51 +SpeedKey4=0x4b +SpeedKey5=0x4c +SpeedKey6=0x4d +SpeedKey7=0x00 +SpeedKey8=0x00 +SpeedKey9=0x00 + +;A key to hold down to move the window around when using graphics mode 5 +;Set to 0 if you don't want to use a modifier key, or a DX scancode otherwise +;Set to -1 for either ctrl key, -2 for either alt key or -3 for either shift key +WindowScrollKey=0 + +;A key to press to reload your currently equipped weapon +;Set to 0 if you don't want a reload key, or a DX scancode otherwise +ReloadWeaponKey=0 + +;A key to hold down to let you move/drop a whole stack of items at once without the 'Move Items' window +;Set to 0 if you don't want to use a modifier key, or a DX scancode otherwise +ItemFastMoveKey=29 + +;Set to 1 to skip the 'Move Items' window when taking items from containers or corpses and not holding down ItemFastMoveKey +;Requires ItemFastMoveKey to be enabled +FastMoveFromContainer=0 + +;A key to press to open a debug game editor +;Set to 0 to disable, or a DX scancode otherwise +;Requires sfall debugging mode and FalloutClient.exe from the modders pack +DebugEditorKey=0 + +;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +[Misc] +;Changes some of Fallout 2 engine functions to Fallout 1 behavior: +;- disables playing the final movie/credits after the endgame slideshow +;- disables halving the weight for power armor items +Fallout1Behavior=1 + +;Time limit in years. Must be between -3 and 13 +;Set to 0 if you want to die the instant you leave arroyo +;Set to -1 to remove the time limit, and automatically reset the date back to 2241 each time you would have reached it +;Set to -2 or -3 to remove the time limit, automatically reset the date, but override Fallout's GetDate function to return the correct year +TimeLimit=-1 + +;World map travel time percentage modifier +;Modifies how fast in game time passes while you're moving around the map screen without affecting encounter rate +;100 is normal speed, 0 stops time from passing +WorldMapTimeMod=100 + +;Set to 1 to use the Fallout 1 code to control world map speed +WorldMapFPSPatch=1 + +;Controls the world map speed if WorldMapFPSPatch is 1. Higher values cause slower movement +WorldMapDelay2=66 + +;Set to 1 to enable Ray's patch to make world map encounter rate independent of your travel speed +;Higher values of WorldMapEncounterRate cause a slower encounter rate +WorldMapEncounterFix=1 +WorldMapEncounterRate=5 + +;The number of slots available in the locations list panel of the world map +;Set to 0 to leave unchanged. 17 is default. +;Setting this greater than 17 requires a replacement background FRM, or you'll get glitched graphics +WorldMapSlots=17 + +;To start a new game somewhere other than artemple.map, uncomment the next line and set it to the map you want to load +;StartingMap= + +;To change the 'FALLOUT II v1.02d' version string on the main menu, uncomment the next line +;You can use up to 2 %d's in this if you want to include Fallout's version number somewhere +VersionString=Test + +;To use a config file other than fallout2.cfg, uncomment the next line and add the name of your new file +;ConfigFile= + +;Set to 1 to enable functions relating to overriding the file system +UseFileSystemOverride=1 + +;To use a patch file other than patch000.dat, uncomment the next line and add your new file name +;If you want to load multiple patch files (up to 1000) at once, you can include a %d in the file name (sprintf syntax) +PatchFile=patch%03d.dat + +;Set to 1 to use the modified data load order for the engine to find game data +;Original: patchXXX.dat > critter_patches > critter_dat > f2_res_patches > f2_res_dat > master_patches > master_dat +;Modified: master_patches > critter_patches > patchXXX.dat > critter_dat > f2_res_patches > f2_res_dat > master_dat +DataLoadOrderPatch=1 + +;Set to 1 to enable loading alternative dialog msg files from text\\dialog_female\ for female PC +;Set to 2 to also load subtitle files from text\\cuts_female\ for female PC +FemaleDialogMsgs=1 + +;To change the default and starting player models, uncomment the next four lines. +;The default models can also be changed ingame via script +;MaleStartModel=hmwarr +;MaleDefaultModel=hmjmps +;FemaleStartModel=hfprim +;FemaleDefaultModel=hfjmps + +;To change the various ingame movies, modify the next 17 lines +;Most of these can also be changed ingame via script. +Movie1=iplogo.mve +Movie2=intro.mve +Movie3=elder.mve +Movie4=vsuit.mve +Movie5=afailed.mve +Movie6=adestroy.mve +Movie7=car.mve +Movie8=cartucci.mve +Movie9=timeout.mve +Movie10=tanker.mve +Movie11=enclave.mve +Movie12=derrick.mve +Movie13=artimer1.mve +Movie14=artimer2.mve +Movie15=artimer3.mve +Movie16=artimer4.mve +Movie17=credits.mve + +;To change the starting year, month or day, uncomment the next 3 lines +;Both StartMonth and StartDay are 0-indexed (i.e. 0 is January or the first day of a month) +StartYear=2241 +StartMonth=6 +StartDay=25 + +;To change the limit of the distance away from the player to which you're allowed to scroll the local maps, uncomment the next two lines +;Defaults are 480 in the x direction and 400 in the y direction. +;Not compatible with the res patch! +LocalMapXLimit=480 +LocalMapYLimit=400 + +;To add additional perks to the game, uncomment the next line and set it to point to a file containing perk information +;PerksFile=Perks.ini + +;Set to 1 if you want the pipboy to be available at the start of the game +;Set to 2 to make the pipboy available by only skipping the vault suit movie check +PipBoyAvailableAtGameStart=2 + +;Set to 1 to double the number of available kill types +;If you use this, you need to provide the extra descriptions in proto.msg (entries from 1450 to 1487 are names and 1488 to 1525 are descriptions) +;Changing this option mid game will not invalidate old save games, but the player's kill counters will be completely screwed. +;Setting this to 1 may cause problems if the player kills more than 32767 of any one critter type +;Additional kill types must have their new critical tables set! (See the OverrideCriticalTable option) +ExtraKillTypes=1 + +;Choose the damage formula used to calculate combat damage. +;Don't set this to anything other than 0 unless another mod you're using explicitly tells you to! +;0 - Fallout default +;1 - Glovz's Damage Fix +;2 - Glovz's Damage Fix with Damage Multiplier tweak +;5 - Haenlomal's Yet Another Ammo Mod. +DamageFormula=0 + +;Prevents you from using 0 to escape from dialogue at any time. +DialogueFix=1 + +;Prevents you from using number keys to enter unvisited areas on a town map +TownMapHotkeysFix=1 + +;Set to 1 to disable the horrigan encounter +DisableHorrigan=1 + +;Set to 1 to disable the random element in NPC levelling. +;This will cause all NPC party members to automatically level up as soon as the player reaches the requirements +NPCAutoLevel=1 + +;Change the initial starting location and world map viewport +;Leave at -1 for default +StartXPos=200 +StartYPos=200 +ViewXPos=200 +ViewYPos=200 + +;Set to 1 to force Fallout not to use multiple processor cores even if they are available +SingleCore=0 + +;Set to 1 to override the art_chache_size setting in fallout2.cfg +OverrideArtCacheSize=1 + +;Prevents you from saving in combat except at the start of your turn to avoid a few bugs +;Note that even with this option enabled, it is still not advisable to save in combat at all. +;Set to 2 to block all saving in combat +SaveInCombatFix=1 + +;Point to an ini file containing elevator data +ElevatorsFile=nofile.ini + +;Uncomment and set a comma delimited list of numbers to use a custom xp table. +;Player's level is capped once the highest specified level is reached +XPTable=50,100,200 + +;Set to 1 to enable additional weapon animation codes from o-t +;The 4 byte value at 0x39 of weapon protos may range from 0 to 15 rather than 0 to 10 +;Since the letters 'n' and 'r' are in use for other animations, an animation code of 11 corrisponds to 's' and 15 to 't' +AdditionalWeaponAnims=1 + +;Uncomment these lines to modify the default modifiers for aimed shots at specific bodyparts +;Modifiers affect both NPCs and the player +;BodyHit_Head=-40 +;BodyHit_Left_Arm=-30 +;BodyHit_Right_Arm=-30 +;BodyHit_Torso=0 +;BodyHit_Right_Leg=-20 +;BodyHit_Left_Leg=-20 +;BodyHit_Eyes=-60 +;BodyHit_Groin=-30 +;The modifier for unaimed shots +;BodyHit_Torso_Uncalled=0 + +;Set to 1 to use a CriticalOverrides.ini file to override the default critical table +;Set to 2 to use the default critical with bug fixes (doesn't require an ini) +;Set to 3 to use a new format CriticalOverrides.ini file, with preadded bug fixes +;If the ExtraKillTypes option is enabled, this should be set to 3, with containing entries for any new types +;Must be non-zero to use the edit/get/reset_critical script functions +OverrideCriticalTable=2 +;To change the path and filename of the critical table file, uncomment the next line +;OverrideCriticalFile=CriticalOverrides.ini + +;Set to 1 to get notification of karma changes in the notification window +DisplayKarmaChanges=0 + +;Set to 1 to always reload messages, rather than only at map load +AlwaysReloadMsgs=1 + +;Set to 1 to force the player to play the idle animation when reloading their weapon +PlayIdleAnimOnReload=1 + +;Set to 1 to prevent corpses from blocking line of fire +CorpseLineOfFireFix=1 + +;Changes the timer (in days) for deleting corpses on a map after you leave (valid range: 0..13) +;The corpses of critters with 'Ages' flag or on maps with 'dead_bodies_age=No' set in maps.txt will not disappear +;Default is 6. Set to 0 for a 12-hour timer +CorpseDeleteTime=1 + +;Set a number of milliseconds to idle each input loop +;Set to -1 to disable +;Set to 0 to idle only if other processes are waiting for processor time +;Set to 1 (or some higher number if needed, the maximum is 127) to prevent 100% CPU use +ProcessorIdle=1 + +;Set to 1 if using the hero appearance mod +;Set to 2 for backward compatibility with scripts that manually fix obj_art_fid/art_change_fid_num script functions for dude_obj +;You can add AppChCrt.frm and AppChEdt.frm files to art\intrface\ to set a custom background for the character screen +EnableHeroAppearanceMod=1 + +;Set to 1 to skip the 3 opening movies +;Set to 2 to also skip the splash screen +SkipOpeningMovies=2 + +;Causes NPCs who complete their combat turn with AP left over will try and find other ways to spend it. +;Only NPCs with AP left equal to or greater than the value given here will be considered. +;Set to 0 to disable +NPCsTryToSpendExtraAP=3 + +;Set to 1 to fix NPCs not checking weapon perks properly when choosing the best weapon in combat +;Set to 2 to change the priority multiplier for having weapon perk to 3x (the original is 5x) +;Note that enabling this option can significantly affect the weapon of choice for some NPCs +AIBestWeaponFix=2 + +;Set to 1 to fix NPCs not taking chem_primary_desire in AI.txt as drug use preference when using drugs in their inventory +AIDrugUsePerfFix=1 + +;Allows the use of tiles over 80x36 in size. sfall will just split and resave them at startup +;Set to 1 to check all tiles on started (slow) +;Set to 2 if you provide a XLtiles.lst file in art\tiles\ containing a list of the tile ids that need checking +AllowLargeTiles=1 + +;Set to 1 to boost the maximum number of tile FRMs from 4096 to 16383 +MoreTiles=1 + +;Change the Skilldex cursor FRM numbers +;Default is 293 for all skills +Lockpick=292 +Steal=292 +Traps=292 +FirstAid=292 +Doctor=292 +Science=292 +Repair=292 + +;Set to 1 to add scroll buttons to the pipboy quest list, and remove the quests per area limit +;Set to 2 to use a different set of scroll buttons +UseScrollingQuestsList=1 + +;To change the location of quest list scroll buttons, uncomment the next two lines +;Defaults are 140 for the X-axis and 334 for the Y-axis +;QuestsScrollButtonsX=140 +;QuestsScrollButtonsY=334 + +;Uncomment these lines to control the premade characters offered when starting a new game +;Multiple options should be separated by commas, and there must be the same number of entries in both lines +;Each name in PremadePaths is limited to 11 characters +PremadePaths=combat,diplomat,stealth +PremadeFIDs=201,203,202 + +;Use this line to modify the list of cities and their associated global variables used for city reputations +;Syntax is 'city id:global id', with each city/global pair separated by a comma. +CityRepsList=0:47,2:48,1:49,4:50,5:51,3:52,8:53,6:54,7:55,13:56,10:57,11:59,14:61,17:63,19:64,18:65,25:66,9:294,20:308 + +;Set this to a valid path to save a copy of the console contents +ConsoleOutputPath="bingle.txt" + +;Set to 1 to add additional pages of save slots +ExtraSaveSlots=1 + +;To use more than one save slot for quick saving (F6 key) without picking a slot beforehand, set the next two lines +;AutoQuickSave sets how many save slots on a page you want to use for quick saving (valid range: 1..10) +;AutoQuickSavePage is the page number to use (valid range: 1..1000) if ExtraSaveSlots is enabled +;The quick saves will be rotated from the first slot on the page to the n-th slot +;Set to 0 to disable. AutoQuickSave will use the current selected page if AutoQuickSavePage is disabled +AutoQuickSave=1 +AutoQuickSavePage=1 + +;Set to 1 to speed up the HP/AC counter animations +;Set to 2 to update the HP/AC counters instantly +;Set to 3 to update the AC counter instantly when switching to other controlled critters in combat +SpeedInterfaceCounterAnims=1 + +;These lines allow you to control the karma FRMs displayed on the character screen +;Number of KarmaPoints should be 1 less than number of KarmaFRMs +KarmaFRMs=47,48,49 +;KarmaPoints=-100,100 + +;Set to 1 to allow science and repair to be used on the player, or 2 for all critters. (Rather than only brahmin/robots) +ScienceOnCritters=1 + +;Modify this value to change the player's speed of rotation on the inventory and character screens +;Default is 166 +SpeedInventoryPCRotation=220 + +;Modify the number of the extra interface boxes available to modders. (Default is 5, and the maximum is 95) +BoxBarCount=15 + +;Uncomment to set the text colour of the extra interface boxes +;The line must contain the same number of digits as the value of BoxBarCount, each either a 0 for green or 1 for red +;BoxBarColours=00000 + +;Set to 1 to fix the bug that caused bonus HtH damage to not be applied correctly. +BonusHtHDamageFix=1 + +;Set to 1 to display additional points of damage from Bonus HtH/Ranged Damage perks in the inventory +DisplayBonusDamage=0 + +;Set to 1 to display the range of the second attack mode in the inventory when you switch weapon modes in active item slots +DisplaySecondWeaponRange=1 + +;Modify the maximum number of animations allowed to run on a map. (Default is 32, and the maximum is 127) +AnimationsAtOnceLimit=120 + +;Set to 1 to remove the limits that stop the player rolling critical successes/misses in the first few days of game time +RemoveCriticalTimelimits=1 + +;Change the colour of the font used on the main menu for the Fallout/sfall version number and copyright text +;It's the last byte ('3C' by default) that picks the colour used. The first byte supplies additional flags for this option +;MainMenuFontColour=0x00003C +;Change the colour of the font used on the main menu for the button text +MainMenuBigFontColour=0x3C + +;Two alternate fixes to the interaction between HtH attacks and the fast shot trait +;0 - Fallout 2 original behaviour +;1 - Haenlomal's fix, called shots are enabled for HtH attacks +;2 - Restoring the -1 AP bonus for HtH attacks (i.e. Fallout 1 behaviour) +FastShotFix=2 + +;Set to 1 to boost the maximum number of script names from 1450 to 10000 +BoostScriptDialogLimit=1 + +;Allows you to edit the skill tables +;Point the next line to an ini file containing the replacement skill data +;SkillsFile=Skills.ini + +;To change the relationship between SPECIAL stats and derived stats, uncomment the next line +;See the Stats.ini in the modders pack for an example file +;DerivedStats=Stats.ini + +;Allows you to change some parameters for drugs and their addictions +;See the Drugs.ini in the modders pack for an example file +;DrugsFile=Drugs.ini + +;These options modify the checks to see if a critter can carry an additional item, changing which items are counted towards the weight limit and adding an additional size check +;Set the mode to 0 to disable the size check, 1 to apply to the PC only, 2 to apply to the PC and party members, or 3 to apply to all critters +;Only the PC uses CritterInvSizeLimit. Other critters will use the unused stat (STAT_unused = 10) or have the size limit of 100 if the stat is not set +;Add 4 to the mode to limit the weight check to used items only +;You can use line number 542/543 in proto.msg and line number 35 in inventry.msg to set up custom messages for item size +CritterInvSizeLimitMode=6 +CritterInvSizeLimit=200 + +;Some bit flags to alter behaviour of the motion sensor +;1 - Allow sensor use on automap when motion sensor is in pack rather than hands +;2 - Motion sensor doesn't require charges +MotionScannerFlags=3 + +;Set to non-0 to adjust the maximum encounter table size +;Default is 40, and the maximum is 127 +EncounterTableSize=127 + +;Set to 1 to disable the pipboy alarm button +DisablePipboyAlarm=1 + +;Uncomment the next four lines to move the main menu buttons and credit text (the 'Copyright(c)' line on the main menu) +MainMenuOffsetX=1 +MainMenuOffsetY=1 +;MainMenuCreditsOffsetX=0 +;MainMenuCreditsOffsetY=0 + +;Prevents you from using super stims on a critter who is at full health. +SuperStimExploitFix=1 + +;Change the AP cost for accessing inventory in combat, and the related effect of Quick Pockets perk +InventoryApCost=3 +QuickPocketsApCostReduction=2 + +;Set to 1 to allow objects seeing through other objects that have their ShootThru flag set +;Note that enabling this option can cause unexpected NPC behavior in some situations +ObjCanSeeObj_ShootThru_Fix=1 + +;Set to 1 to fix the broken obj_can_hear_obj script function +ObjCanHearObjFix=1 + +;Set to 1 to enable the mood argument of start_gdialog script function to be available for talking heads +;If the argument value is -1, the mood will be determined by the local variable 0 of the script (vanilla behavior) +StartGDialogFix=1 + +;Set to 1 to fix and repurpose the unused called_shot/num_attacks arguments of attack_complex script function +;This also changes the behavior of the result flags arguments +;called_shot - additional damage, when the damage received by the target is above the specified minimum damage +;num_attacks - the number of free action points on the first turn only +;attacker_results - unused, must be 0 or not equal to the target_results argument when specifying result flags for the target +AttackComplexFix=1 + +;Set to 1 to enable the balanced bullet distribution formula for burst attacks +ComputeSprayMod=1 + +;These options modify the bullet distribution of burst attacks if ComputeSprayMod is 1 +;All the bullets are divided into three groups: central, left and right +;These three groups will then travel along three parallel tracks, trying to hit targets on the way +;CenterMult/Div set the ratio of how many bullets go to the central group, and remaining bullets are divided equally to left and right sides +;TargetMult/Div set the ratio of how many bullets in the central group will attack the primary target directly +;Multipliers are capped at divisor values +ComputeSpray_CenterMult=1 +ComputeSpray_CenterDiv=3 +ComputeSpray_TargetMult=1 +ComputeSpray_TargetDiv=2 + +;Set to 1 to make explosions and projectiles emit light +ExplosionsEmitLight=1 + +;Uncomment these lines to change explosives damage. DmgMax can be set to 9999 at max, and DmgMin is capped at DmgMax +Dynamite_DmgMax=51 +Dynamite_DmgMin=31 +PlasticExplosive_DmgMax=81 +PlasticExplosive_DmgMin=41 + +;Uncomment these lines to change the timers of how many days after the game starts Hakunin dream sequences will occur +MovieTimer_artimer1=91 +MovieTimer_artimer2=181 +MovieTimer_artimer3=271 +MovieTimer_artimer4=359 + +;Set to 1 to enable the new arrays behavior +;Set to 0 for backward compatibility with pre-3.4 scripts +arraysBehavior=1 + +;Set to 1 to add proper checks if there is enough ammo to use weapons that use multiple ammo per shot +CheckWeaponAmmoCost=1 + +;To add additional books to the game, uncomment the next line and point to a file containing book information +;See the Books.ini in the modders pack for an example file +;BooksFile=Books.ini + +;Controls the speed of combat panel animations (lower - faster; valid range: 0..65535) +CombatPanelAnimDelay=500 +;Controls the speed of dialog panel animations (lower - faster; valid range: 0..255) +DialogPanelAnimDelay=16 +;Controls the speed of pipboy alarm clock animations (lower - faster; valid range: 0..127) +PipboyTimeAnimDelay=25 + +;Set to 1 to stack empty identical weapons, no matter what type of ammo was loaded before +StackEmptyWeapons=1 + +;Changes the way weapon reloading works when you drag ammo onto a weapon in the inventory +;Set to -1 to disable (vanilla behavior with the 'Move Items' window) +;Set to 0 to use all the ammo boxes to reload +;Set to 1 or more to reserve the specified amount of ammo boxes and use all the rest to reload +;If the amount of ammo boxes in the inventory is less than or equal to the reserve, only one box will be used +ReloadReserve=1 + +;Set to 1 to change the counter in the 'Move Items' window to start with maximum number, except in the barter screen +ItemCounterDefaultMax=1 + +;Set to 1 to leave the music playing in dialogue with talking heads +EnableMusicInDialogue=1 + +;Set to 1 to prevent the player from running while sneaking without Silent Running perk +DontTurnOffSneakIfYouRun=1 + +;Changes the distance at which the player will switch to walking when trying to use objects (valid range: 0..3) +;Set to 0 to disable switching. (Default is 3) +UseWalkDistance=2 + +;Set to 1 to fix the bug of being unable to sell used geiger counters or stealth boys +CanSellUsedGeiger=1 + +;Set to 1 to fix the issue with being able to charge the car by using cells on other scenery/critters +;Set to 0 if another mod you're using has custom vehicles +CarChargingFix=1 + +;Set to 1 to prevent the car from being lost when entering a location via the Town/World button and then leaving on foot +;Note that the global variable 633 (GVAR_CAR_PLACED_TILE) will be set to -1 when the player leaves a location +CarPlacedTileFix=1 + +;Set to 1 to skip weapon equip/unequip animations when performing various actions +InstantWeaponEquip=1 + +;To add additional game msg files, uncomment the next line and set a comma delimited list of filenames without .msg extension +;By default, the files will have consecutive numbers assigned beginning with 0 +;You can use the syntax 'filename:number' to manually assign numbers to specific msg files, with each pair separated by a comma +;If a file after the specified pair does not have a number assigned, it will have the next consecutive number from the last pair +;You need to use the message_str_game script function to get messages from the files +;ExtraGameMsgFileList= + +;Set to 1 to display numbered dialogue options +NumbersInDialogue=1 + +;Set to 1 to use Fallout's normal text font instead of DOS-like font on the world map +WorldMapFontPatch=1 + +;Set to 1 to keep the selected attack mode when moving the weapon between active item slots +KeepWeaponSelectMode=1 + +;Set to 1 to display full item description for weapon/ammo in the barter screen +FullItemDescInBarter=1 + +;Set to 1 to display experience points with the bonus from Swift Learner perk when gained from non-scripted situations +DisplaySwiftLearnerExp=1 + +;Set to 1 to display party member's current level/AC/addict flag on the combat control panel +PartyMemberExtraInfo=1 + +;Set to 1 to fix the bug of using First Aid/Doctor skills when using them on the player +;This will cause the party member to apply his/her skills when you use First Aid/Doctor skills on the player, but only if +;the player is standing next to the party member +;Note that because the related engine function is not fully implemented, enabling this option without a global script +;that overrides First Aid/Doctor functions has very limited usefulness +PartyMemberSkillFix=1 + +;Set to 1 to skip loading all game settings except the game/combat difficulty from a saved game +;Set to 2 to also skip loading the game/combat difficulty settings +SkipLoadingGameSettings=2 + +;Set to 1 to prevent the inventory/loot/automap interfaces from being placed on top of other script-created windows +InterfaceDontMoveOnTop=1 + +;Overrides the global variable number used to show the special death message of the Modoc toilet explosion +;Set to -1 to disable the special death message when the global variable is set +SpecialDeathGVAR=-1 + +;Set to 1 to disable the special handling of map IDs 19 and 37 in the engine when entering the maps +;Note that enabling this option can break the map changes in Modoc and Vault 15 +DisableSpecialMapIDs=1 + +;Changes the base value of the duration of the knockout effect (valid range: 35..100; default is 35) +;The formula for the duration in ticks is: 10 * (value - 3 * EN) +KnockoutTime=36 + +;Set to 1 to display sfall built-in credits at the bottom of credits.txt contents instead of at the top +CreditsAtBottom=0 + +;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +[Scripts] +;Comma-separated list of masked paths to load global scripts from +;Only use single backslash \ as the directory separator +;Paths outside of scripts folder are supported +GlobalScriptPaths=scripts\gl*.int,scripts\sfall\gl*.int + +;Uncomment the option to specify a common folder path for all ini files used by scripts +;You will have to put all the available ini files of the mods in this directory +;The maximum length of the specified path is 61 characters +;IniConfigFolder=IniConfig + +;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +[Debugging] +;Extra sfall configuration settings that can be used by modders +;This section is not effected by the 'UseCommandLine' option. It will always be read from the main ini + +;Set to 1 to enable sfall debugging mode +Enable=11 + +;Fallout 2 Debug Patch +;Set to 1 to send debug output to the screen, 2 to a debug.log file, or 3 to both the screen and debug.log +;Does not require sfall debugging mode +;While you don't need to create an environment variable, you do still need to set the appropriate lines in fallout2.cfg: +;------- +;[debug] +;mode=environment +;output_map_data_info=1 +;show_load_info=1 +;show_script_messages=1 +;show_tile_num=1 +;[sound] +;debug=1 +;debug_sfxc=1 +;------- +DebugMode=3 + +;Set to 1 to hide error messages in debug output when a null value is passed to the function as an object +HideObjIsNullMsg=1 + +;Change to 1 to skip the compatibility mode check +SkipCompatModeCheck=0 + +;Set to 1 to skip the executable file size check +;Does not require sfall debugging mode +SkipSizeCheck=0 + +;If you're testing changes to the Fallout exe, you can override the CRC that sfall looks for here +;You can use several hex values, separated by commas +;Does not require sfall debugging mode +;ExtraCRC=0x00000000,0x00000000 + +;Set to 1 to stop Fallout from deleting non read-only protos at startup +;Has pretty nasty side effects when saving/reloading, so don't use for regular gameplay +DontDeleteProtos=0 + +;Set to 1 to give scripts direct access to Fallout's address space, and to make arbitrary calls into Fallout's code +;Does not require sfall debugging mode +AllowUnsafeScripting=0 + +;Set to 1 to force sfall to inject all hooks code into the game, even if corresponding hook scripts don't exist +InjectAllGameHooks=1 + +;Set to 1 to force sfall to search for global scripts every time the game loads rather than only once on the first game start +AlwaysFindScripts=0 + +;Set to 1 to force critters to display combat float messages +;Requires AllowSoundForFloats to be enabled +Test_ForceFloats=1 + +;These options control what output is saved in the debug log (sfall-log.txt) +;Prints messages duing sfall initialization +Init=1 +;Prints messages relating to hook scripts +Hook=0 +;Prints messages relating to scripting +Script=0 +;Prints messages relating to the critical table +Criticals=0