mirror of
https://github.com/sfall-team/sfall.git
synced 2026-07-27 16:52:34 -07:00
Barter extra slots: Make optional by using LoadUnlistedFrm to replace default FRM
This commit is contained in:
@@ -133,6 +133,10 @@ WorldMapTravelMarkers=0
|
|||||||
;Set to 1 to display terrain types when hovering the cursor over the player's marker on the world map
|
;Set to 1 to display terrain types when hovering the cursor over the player's marker on the world map
|
||||||
WorldMapTerrainInfo=0
|
WorldMapTerrainInfo=0
|
||||||
|
|
||||||
|
;Set to 1 to enable tall trade window with 4 item slots per table instead of 3
|
||||||
|
;Requires new barter_239.frm and trade_238.frm files in art\intrface\ (included in sfall.dat) to display correctly
|
||||||
|
InventoryExtraSlots=0
|
||||||
|
|
||||||
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
||||||
[Sound]
|
[Sound]
|
||||||
;Sets the number of allowed simultaneous sound effects
|
;Sets the number of allowed simultaneous sound effects
|
||||||
|
|||||||
@@ -712,7 +712,7 @@ static bool LoadFrmFrame(fo::UnlistedFrm::Frame *frame, fo::DbFile* frmStream) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
fo::UnlistedFrm *LoadUnlistedFrm(char *frmName, unsigned int folderRef) {
|
fo::UnlistedFrm *LoadUnlistedFrm(const char *frmName, unsigned int folderRef) {
|
||||||
if (folderRef > fo::OBJ_TYPE_SKILLDEX) return nullptr;
|
if (folderRef > fo::OBJ_TYPE_SKILLDEX) return nullptr;
|
||||||
|
|
||||||
const char *artfolder = fo::var::art[folderRef].path; // address of art type name
|
const char *artfolder = fo::var::art[folderRef].path; // address of art type name
|
||||||
|
|||||||
@@ -191,7 +191,7 @@ void RedrawObject(fo::GameObject* obj);
|
|||||||
// Redraws all windows
|
// Redraws all windows
|
||||||
void RefreshGNW(bool skipOwner = false);
|
void RefreshGNW(bool skipOwner = false);
|
||||||
|
|
||||||
fo::UnlistedFrm *LoadUnlistedFrm(char *frmName, unsigned int folderRef);
|
fo::UnlistedFrm *LoadUnlistedFrm(const char *frmName, unsigned int folderRef);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+89
-11
@@ -1104,6 +1104,94 @@ static void UIAnimationSpeedPatch() {
|
|||||||
SimplePatch<BYTE>(&addrs[4], 2, "Misc", "PipboyTimeAnimDelay", 50, 0, 127);
|
SimplePatch<BYTE>(&addrs[4], 2, "Misc", "PipboyTimeAnimDelay", 50, 0, 127);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static fo::UnlistedFrm* barterTallFrm = nullptr;
|
||||||
|
static fo::UnlistedFrm* tradeTallFrm = nullptr;
|
||||||
|
|
||||||
|
static BYTE* __fastcall gdialog_barter_create_win__get_art_data() {
|
||||||
|
fo::UnlistedFrm** frm;
|
||||||
|
const char* frmName;
|
||||||
|
if (fo::var::dialog_target_is_party) {
|
||||||
|
frm = &tradeTallFrm;
|
||||||
|
frmName = "trade_238.frm";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
frm = &barterTallFrm;
|
||||||
|
frmName = "barter_239.frm";
|
||||||
|
}
|
||||||
|
if (*frm == nullptr) {
|
||||||
|
*frm = fo::util::LoadUnlistedFrm(frmName, fo::ArtType::OBJ_TYPE_INTRFACE);
|
||||||
|
if (*frm == nullptr) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (*frm)->frames[0].indexBuff;
|
||||||
|
}
|
||||||
|
|
||||||
|
static DWORD __fastcall gdialog_barter_create_win__get_art_height() {
|
||||||
|
fo::UnlistedFrm** frm = fo::var::dialog_target_is_party
|
||||||
|
? &tradeTallFrm
|
||||||
|
: &barterTallFrm;
|
||||||
|
|
||||||
|
if (*frm == nullptr) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return (*frm)->frames[0].height;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __declspec(naked) gdialog_barter_create_win__art_frame_data_hook() {
|
||||||
|
__asm {
|
||||||
|
pushadc;
|
||||||
|
call gdialog_barter_create_win__get_art_data;
|
||||||
|
test eax, eax;
|
||||||
|
jz skipCall;
|
||||||
|
pop ecx;
|
||||||
|
pop edx;
|
||||||
|
add esp, 4;
|
||||||
|
retn;
|
||||||
|
skipCall:
|
||||||
|
popadc;
|
||||||
|
jmp fo::funcoffs::art_frame_data_;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static long frmHeight;
|
||||||
|
static void __declspec(naked) gdialog_barter_create_win__art_frame_length_hook() {
|
||||||
|
__asm {
|
||||||
|
pushadc;
|
||||||
|
call gdialog_barter_create_win__get_art_height;
|
||||||
|
test eax, eax;
|
||||||
|
jz skipCall;
|
||||||
|
pop ecx;
|
||||||
|
pop edx;
|
||||||
|
add esp, 4;
|
||||||
|
retn;
|
||||||
|
skipCall:
|
||||||
|
popadc;
|
||||||
|
jmp fo::funcoffs::art_frame_length_;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void InventoryExtraSlotsPatch() {
|
||||||
|
if (IniReader::GetConfigInt("Interface", "InventoryExtraSlots", 0) == 0) return;
|
||||||
|
|
||||||
|
dlogr("Applying extra inventory slots patch.", DL_INIT);
|
||||||
|
SafeWrite32(0x46EDA4, 4); // Trade window slot count 3 -> 4
|
||||||
|
SafeWriteBatch<DWORD>(228, { 0x46EDAB, 0x46EE13 }); // Trade window height 180 + 48 (one slot) = 228
|
||||||
|
SafeWrite32(0x46EDD4, 518); // Trade window max Y = Y pos + height = 290 + 228 = 518 (was 470)
|
||||||
|
SafeWriteBatch<DWORD>(528, { // Game dialog BG window height = 480 + 48 = 528
|
||||||
|
0x44831E, // gdialog_barter_create_win_
|
||||||
|
//0x44879F, // gdControlCreateWin_
|
||||||
|
//0x449740, // gdCustomCreateWin_
|
||||||
|
//0x44A6CF, // gdialog_window_create_
|
||||||
|
0x44AAE9, // talk_to_create_background_window
|
||||||
|
});
|
||||||
|
|
||||||
|
HookCall(0x4482EA, gdialog_barter_create_win__art_frame_data_hook);
|
||||||
|
HookCall(0x4482FF, gdialog_barter_create_win__art_frame_length_hook);
|
||||||
|
}
|
||||||
|
|
||||||
void Interface::init() {
|
void Interface::init() {
|
||||||
InterfaceWindowPatch();
|
InterfaceWindowPatch();
|
||||||
InventoryCharacterRotationSpeedPatch();
|
InventoryCharacterRotationSpeedPatch();
|
||||||
@@ -1139,17 +1227,7 @@ void Interface::init() {
|
|||||||
ammoBarXPos -= 2;
|
ammoBarXPos -= 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
InventoryExtraSlotsPatch();
|
||||||
SafeWrite32(0x46EDA4, 4); // Trade window slot count 3 -> 4
|
|
||||||
SafeWriteBatch<DWORD>(228, { 0x46EDAB, 0x46EE13 }); // Trade window height 180 + 48 (one slot) = 228
|
|
||||||
SafeWrite32(0x46EDD4, 518); // Trade window max Y = Y pos + height = 290 + 228 = 518 (was 470)
|
|
||||||
SafeWriteBatch<DWORD>(528, { // Game dialog BG window height = 480 + 48 = 528
|
|
||||||
0x44831E, // gdialog_barter_create_win_
|
|
||||||
//0x44879F, // gdControlCreateWin_
|
|
||||||
//0x449740, // gdCustomCreateWin_
|
|
||||||
//0x44A6CF, // gdialog_window_create_
|
|
||||||
0x44AAE9, // talk_to_create_background_window
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Interface::exit() {
|
void Interface::exit() {
|
||||||
|
|||||||
Reference in New Issue
Block a user