Refactor adjust_fid function, make it compatible with NPC control, Hero Appearance and NPC Armor appearance mods

This commit is contained in:
phobos2077
2017-04-01 00:20:00 +07:00
parent 34500d9dd5
commit 203dcdf6be
3 changed files with 27 additions and 28 deletions
+2 -2
View File
@@ -447,8 +447,8 @@ struct Proto {
// for each DamageType
long damageThreshold[7];
long perk;
long maleFid;
long femaleFid;
long maleFrameNum;
long femaleFrameNum;
};
struct Container {
+25 -13
View File
@@ -21,6 +21,7 @@
#include "..\main.h"
#include "..\FalloutEngine\Fallout2.h"
#include "..\InputFuncs.h"
#include "PartyControl.h"
#include "HookScripts.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() {
using namespace fo;
DWORD fid;
if ((var::inven_dude->artFid & 0xF000000) >> 24 == OBJ_TYPE_CRITTER) {
DWORD frameNum = var::art_vault_guy_num;
DWORD frameNum;
DWORD weaponAnimCode = 0;
auto critterPro = GetProto(var::inven_pid);
if (critterPro != nullptr) {
frameNum = critterPro->fid & 0xFFF;
}
if (var::i_worn != nullptr) {
auto armorPro = GetProto(var::i_worn->protoId);
frameNum = func::stat_level(var::inven_dude, STAT_gender) == GENDER_FEMALE
? armorPro->item.armor.femaleFid
: armorPro->item.armor.maleFid;
if (frameNum == -1) {
frameNum = var::art_vault_guy_num;
if (PartyControl::IsNpcControlled()) {
// if NPC is under control, use current FID of critter
frameNum = var::inven_dude->artFid & 0xFFF;
} else {
// vanilla logic:
frameNum = var::art_vault_guy_num;
auto critterPro = GetProto(var::inven_pid);
if (critterPro != nullptr) {
frameNum = critterPro->fid & 0xFFF;
}
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()
-13
View File
@@ -67,17 +67,6 @@ static bool _stdcall IsInPidList(fo::GameObject* obj) {
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
static void SaveRealDudeState() {
realDude.obj_dude = fo::var::obj_dude;
@@ -145,7 +134,6 @@ static void SetCurrentDude(fo::GameObject* npc) {
isControllingNPC = true;
delayedExperience = 0;
ToggleInventoryArmorDisplay(false);
fo::func::intface_redraw();
}
@@ -179,7 +167,6 @@ static void RestoreRealDudeState() {
fo::func::intface_redraw();
ToggleInventoryArmorDisplay(true);
isControllingNPC = false;
}