Added a fix for the display issue in the pipboy when a quest list is too long with UseScrollingQuestsList diabled (from Mr.Stalin)

Added a fix for the clickability issue of holodisk list in the pipboy (from Mr.Stalin)
This commit is contained in:
NovaRain
2018-08-06 22:04:21 +08:00
parent d0c97f7118
commit d200262a2b
4 changed files with 47 additions and 3 deletions
+1 -1
View File
@@ -366,7 +366,7 @@ Repair=293
;Remove window position rounding
RemoveWindowRounding=0
;Set to 1 to add scroll buttons to the pip boy quest list, and remove the quests per area limit
;Set to 1 to add scroll buttons to the pipboy quest list, and remove the quests per area limit
UseScrollingQuestsList=1
;Uncomment these lines to control the premade characters offered when starting a new game
+2
View File
@@ -68,6 +68,7 @@
#define FO_VAR_gsound_initialized 0x518E30
#define FO_VAR_hit_location_penalty 0x510954
#define FO_VAR_holo_flag 0x664529
#define FO_VAR_holodisk 0x6644F4
#define FO_VAR_holopages 0x66445C
#define FO_VAR_hot_line_count 0x6644F8
#define FO_VAR_i_fid 0x59E95C
@@ -151,6 +152,7 @@
#define FO_VAR_proto_main_msg_file 0x6647FC
#define FO_VAR_ptable 0x59E934
#define FO_VAR_pud 0x59E960
#define FO_VAR_quest_count 0x51C12C
#define FO_VAR_queue 0x6648C0
#define FO_VAR_quick_done 0x5193BC
#define FO_VAR_read_callback 0x51DEEC
+13 -1
View File
@@ -49,6 +49,14 @@ static void __declspec(naked) PipAlarm_hack() {
}
}
static void __declspec(naked) PipStatus_hook() {
__asm {
call fo::funcoffs::ListHoloDiskTitles_;
mov dword ptr ds:[FO_VAR_holodisk], ebx;
retn;
}
}
// corrects saving script blocks (to *.sav file) by properly accounting for actual number of scripts to be saved
static void __declspec(naked) scr_write_ScriptNode_hook() {
__asm {
@@ -1137,9 +1145,13 @@ void BugFixes::init()
//}
// Fixes for clickability issue in Pip-Boy and exploit that allows to rest in places where you shouldn't be able to rest
dlog("Applying fix for Pip-Boy rest exploit.", DL_INIT);
dlog("Applying fix for Pip-Boy clickability issues and rest exploit.", DL_INIT);
MakeCall(0x4971C7, pipboy_hack);
MakeCall(0x499530, PipAlarm_hack);
// Fix for clickability issue of holodisk list
HookCall(0x497E9F, PipStatus_hook);
SafeWrite16(0x497E8C, 0xD389); // mov ebx, edx
SafeWrite32(0x497E8E, 0x90909090);
dlogr(" Done", DL_INIT);
// Fix for "Too Many Items" bug
+31 -1
View File
@@ -24,12 +24,40 @@
namespace sfall
{
static bool outRangeFlag = false;
static DWORD calledflag = 0x0;
static DWORD called_quest_number = 0x0;
static DWORD total_quests = 0x0;
static DWORD curent_quest_page = 0x0;
static DWORD wait_flag = 0x0;
// Fix crash when the quest list is too long
static void __declspec(naked) PipStatus_hook_printfix() {
__asm {
test outRangeFlag, 0xFF;
jnz force;
call fo::funcoffs::_word_wrap_;
push eax;
movzx eax, word ptr [esp + 0x49C + 8];
dec eax;
shl eax, 1;
add eax, dword ptr ds:[FO_VAR_cursor_line];
cmp eax, dword ptr ds:[FO_VAR_bottom_line]; // check max
jb skip;
mov eax, dword ptr ds:[FO_VAR_quest_count];
sub eax, 2;
mov dword ptr [esp + 0x4BC - 0x24 + 8], eax; // set last counter
mov outRangeFlag, 1;
skip:
pop eax;
retn;
force:
or eax, -1; // force log error "out of range"
mov outRangeFlag, 0;
retn;
}
}
static void __declspec(naked) newhookpress() {
__asm {
push eax;
@@ -357,10 +385,12 @@ void QuestListPatch() {
}
void QuestList::init() {
if(GetConfigInt("Misc", "UseScrollingQuestsList", 0)) {
if (GetConfigInt("Misc", "UseScrollingQuestsList", 0)) {
dlog("Applying quests list patch ", DL_INIT);
QuestListPatch();
dlogr(" Done", DL_INIT);
} else {
HookCall(0x498186, PipStatus_hook_printfix); // fix "out of range" bug when printing a list of quests
}
}