mirror of
https://github.com/sfall-team/sfall.git
synced 2026-07-27 16:52:34 -07:00
Refactor adjust_fid function, make it compatible with NPC control, Hero Appearance and NPC Armor appearance mods
This commit is contained in:
@@ -447,8 +447,8 @@ struct Proto {
|
|||||||
// for each DamageType
|
// for each DamageType
|
||||||
long damageThreshold[7];
|
long damageThreshold[7];
|
||||||
long perk;
|
long perk;
|
||||||
long maleFid;
|
long maleFrameNum;
|
||||||
long femaleFid;
|
long femaleFrameNum;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Container {
|
struct Container {
|
||||||
|
|||||||
+25
-13
@@ -21,6 +21,7 @@
|
|||||||
#include "..\main.h"
|
#include "..\main.h"
|
||||||
#include "..\FalloutEngine\Fallout2.h"
|
#include "..\FalloutEngine\Fallout2.h"
|
||||||
#include "..\InputFuncs.h"
|
#include "..\InputFuncs.h"
|
||||||
|
#include "PartyControl.h"
|
||||||
#include "HookScripts.h"
|
#include "HookScripts.h"
|
||||||
#include "LoadGameHook.h"
|
#include "LoadGameHook.h"
|
||||||
|
|
||||||
@@ -608,25 +609,36 @@ void __declspec(naked) ItemCountFix() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// reimplementation adjust_fid engine function
|
// reimplementation of adjust_fid engine function
|
||||||
|
// Differences from vanilla:
|
||||||
|
// - doesn't use art_vault_guy_num as default art, uses current critter FID instead
|
||||||
|
// - invokes onAdjustFid delegate that allows to hook into FID calculation
|
||||||
DWORD __stdcall adjust_fid_replacement2() {
|
DWORD __stdcall adjust_fid_replacement2() {
|
||||||
using namespace fo;
|
using namespace fo;
|
||||||
|
|
||||||
DWORD fid;
|
DWORD fid;
|
||||||
if ((var::inven_dude->artFid & 0xF000000) >> 24 == OBJ_TYPE_CRITTER) {
|
if ((var::inven_dude->artFid & 0xF000000) >> 24 == OBJ_TYPE_CRITTER) {
|
||||||
DWORD frameNum = var::art_vault_guy_num;
|
DWORD frameNum;
|
||||||
DWORD weaponAnimCode = 0;
|
DWORD weaponAnimCode = 0;
|
||||||
auto critterPro = GetProto(var::inven_pid);
|
if (PartyControl::IsNpcControlled()) {
|
||||||
if (critterPro != nullptr) {
|
// if NPC is under control, use current FID of critter
|
||||||
frameNum = critterPro->fid & 0xFFF;
|
frameNum = var::inven_dude->artFid & 0xFFF;
|
||||||
}
|
} else {
|
||||||
if (var::i_worn != nullptr) {
|
// vanilla logic:
|
||||||
auto armorPro = GetProto(var::i_worn->protoId);
|
frameNum = var::art_vault_guy_num;
|
||||||
frameNum = func::stat_level(var::inven_dude, STAT_gender) == GENDER_FEMALE
|
auto critterPro = GetProto(var::inven_pid);
|
||||||
? armorPro->item.armor.femaleFid
|
if (critterPro != nullptr) {
|
||||||
: armorPro->item.armor.maleFid;
|
frameNum = critterPro->fid & 0xFFF;
|
||||||
if (frameNum == -1) {
|
}
|
||||||
frameNum = var::art_vault_guy_num;
|
if (var::i_worn != nullptr) {
|
||||||
|
auto armorPro = GetProto(var::i_worn->protoId);
|
||||||
|
DWORD armorFrameNum = func::stat_level(var::inven_dude, STAT_gender) == GENDER_FEMALE
|
||||||
|
? armorPro->item.armor.femaleFrameNum
|
||||||
|
: armorPro->item.armor.maleFrameNum;
|
||||||
|
|
||||||
|
if (armorFrameNum != -1) {
|
||||||
|
frameNum = armorFrameNum;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
auto itemInHand = func::intface_is_item_right_hand()
|
auto itemInHand = func::intface_is_item_right_hand()
|
||||||
|
|||||||
@@ -67,17 +67,6 @@ static bool _stdcall IsInPidList(fo::GameObject* obj) {
|
|||||||
return std::find(allowedCritterPids.begin(), allowedCritterPids.end(), pid) != allowedCritterPids.end();
|
return std::find(allowedCritterPids.begin(), allowedCritterPids.end(), pid) != allowedCritterPids.end();
|
||||||
}
|
}
|
||||||
|
|
||||||
// enable or disable showing actual armor on Dude in inventory screens
|
|
||||||
// if disabled, the default art will be used
|
|
||||||
static void ToggleInventoryArmorDisplay(bool enable) {
|
|
||||||
constexpr DWORD addr = 0x47171D;
|
|
||||||
if (enable) {
|
|
||||||
MakeCall(addr, (void*)fo::funcoffs::proto_ptr_); // vanilla code
|
|
||||||
} else {
|
|
||||||
MakeJump(addr, (void*)0x471778); // skip reading critter FID from proto and applying armor ID (use existing fid)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// saves the state of PC before moving control to NPC
|
// saves the state of PC before moving control to NPC
|
||||||
static void SaveRealDudeState() {
|
static void SaveRealDudeState() {
|
||||||
realDude.obj_dude = fo::var::obj_dude;
|
realDude.obj_dude = fo::var::obj_dude;
|
||||||
@@ -145,7 +134,6 @@ static void SetCurrentDude(fo::GameObject* npc) {
|
|||||||
|
|
||||||
isControllingNPC = true;
|
isControllingNPC = true;
|
||||||
delayedExperience = 0;
|
delayedExperience = 0;
|
||||||
ToggleInventoryArmorDisplay(false);
|
|
||||||
|
|
||||||
fo::func::intface_redraw();
|
fo::func::intface_redraw();
|
||||||
}
|
}
|
||||||
@@ -179,7 +167,6 @@ static void RestoreRealDudeState() {
|
|||||||
|
|
||||||
fo::func::intface_redraw();
|
fo::func::intface_redraw();
|
||||||
|
|
||||||
ToggleInventoryArmorDisplay(true);
|
|
||||||
isControllingNPC = false;
|
isControllingNPC = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user