Added OverrideCriticalFile option for specifying alternative crit file

Added code for preparing clearing map_update_event in queue.

Fixed a crash bug in message_str_game function when passing a negative
fileId value.

Corrected/edited some code.
This commit is contained in:
NovaRain
2019-08-20 16:47:37 +08:00
parent 99bc47e3f8
commit 2bd8a6223d
9 changed files with 57 additions and 38 deletions
+4 -2
View File
@@ -319,7 +319,7 @@ OverrideArtCacheSize=0
;Set to 2 to block all saving in combat
SaveInCombatFix=1
;Point at an ini file containing elevator data
;Point to an ini file containing elevator data
;ElevatorsFile=Elevators.ini
;Uncomment and set a comma delimited list of numbers to use a custom xp table.
@@ -347,6 +347,8 @@ AdditionalWeaponAnims=1
;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
@@ -489,7 +491,7 @@ FastShotFix=1
BoostScriptDialogLimit=0
;Allows you to edit the skill tables
;Point the next line at an ini file containing the replacement skill data
;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
+9 -5
View File
@@ -23,7 +23,8 @@
#include "FalloutEngine.h"
#include "Logging.h"
static const char* CritTableFile = ".\\CriticalOverrides.ini";
static std::string critTableFile(".\\");
static const DWORD CritTableCount = 2 * 19 + 1; // Number of species in new critical table
//static const DWORD origCritTableSize = 6 * 9 * 20; // Number of entries in original table
static const DWORD CritTableSize = 6 * 9 * CritTableCount; // Number of entries in new critical table
@@ -99,7 +100,7 @@ void CritLoad() {
int slot1 = crit + part * 6 + critter * 9 * 6;
int slot2 = crit + part * 6 + ((critter == 19) ? 38 : critter) * 9 * 6;
for (int i = 0; i < 7; i++) {
baseCritTable[slot2].values[i] = GetPrivateProfileIntA(section, CritNames[i], defaultTable[slot1].values[i], CritTableFile);
baseCritTable[slot2].values[i] = GetPrivateProfileIntA(section, CritNames[i], defaultTable[slot1].values[i], critTableFile.c_str());
if (isDebug) {
char logmsg[256];
if (baseCritTable[slot2].values[i] != defaultTable[slot1].values[i]) {
@@ -122,11 +123,11 @@ void CritLoad() {
for (int critter = 0; critter < CritTableCount; critter++) {
sprintf_s(buf, "c_%02d", critter);
int all;
if (!(all = GetPrivateProfileIntA(buf, "Enabled", 0, CritTableFile))) continue;
if (!(all = GetPrivateProfileIntA(buf, "Enabled", 0, critTableFile.c_str()))) continue;
for (int part = 0; part < 9; part++) {
if (all < 2) {
sprintf_s(buf2, "Part_%d", part);
if (!GetPrivateProfileIntA(buf, buf2, 0, CritTableFile)) continue;
if (!GetPrivateProfileIntA(buf, buf2, 0, critTableFile.c_str())) continue;
}
sprintf_s(buf2, "c_%02d_%d", critter, part);
@@ -134,7 +135,7 @@ void CritLoad() {
int slot = crit + part * 6 + critter * 9 * 6;
for (int i = 0; i < 7; i++) {
sprintf_s(buf3, "e%d_%s", crit, CritNames[i]);
baseCritTable[slot].values[i] = GetPrivateProfileIntA(buf2, buf3, baseCritTable[slot].values[i], CritTableFile);
baseCritTable[slot].values[i] = GetPrivateProfileIntA(buf2, buf3, baseCritTable[slot].values[i], critTableFile.c_str());
}
}
}
@@ -273,6 +274,9 @@ void CritInit() {
mode = GetPrivateProfileIntA("Misc", "OverrideCriticalTable", 2, ini);
if (mode < 0 || mode > 3) mode = 0;
if (mode) {
char critFile[MAX_PATH];
GetPrivateProfileStringA("Misc", "OverrideCriticalFile", "CriticalOverrides.ini", critFile, MAX_PATH, ini);
critTableFile += critFile;
CriticalTableOverride();
}
+1
View File
@@ -163,6 +163,7 @@ DWORD* ptr_pipmesg = reinterpret_cast<DWORD*>(_pipmesg);
DWORD* ptr_preload_list_index = reinterpret_cast<DWORD*>(_preload_list_index);
DWORD* ptr_procTableStrs = reinterpret_cast<DWORD*>(_procTableStrs); // table of procId (from define.h) => procName map
DWORD* ptr_proto_main_msg_file = reinterpret_cast<DWORD*>(_proto_main_msg_file);
DWORD* ptr_proto_msg_files = reinterpret_cast<DWORD*>(_proto_msg_files);
DWORD* ptr_ptable = reinterpret_cast<DWORD*>(_ptable);
DWORD* ptr_pud = reinterpret_cast<DWORD*>(_pud);
DWORD* ptr_queue = reinterpret_cast<DWORD*>(_queue);
+2
View File
@@ -195,6 +195,7 @@
#define _preload_list_index 0x519640
#define _procTableStrs 0x51C758 // table of procId (from define.h) => procName map
#define _proto_main_msg_file 0x6647FC
#define _proto_msg_files 0x6647AC
#define _ptable 0x59E934
#define _pud 0x59E960
#define _quest_count 0x51C12C
@@ -404,6 +405,7 @@ extern DWORD* ptr_pipmesg;
extern DWORD* ptr_preload_list_index;
extern DWORD* ptr_procTableStrs; // table of procId (from define.h) => procName map
extern DWORD* ptr_proto_main_msg_file;
extern DWORD* ptr_proto_msg_files;
extern DWORD* ptr_ptable;
extern DWORD* ptr_pud;
extern DWORD* ptr_queue;
+16 -5
View File
@@ -107,7 +107,7 @@ public:
return _type == DATATYPE_STR;
}
DWORD rawValue() const {
unsigned long rawValue() const {
return _val.dw;
}
@@ -1354,7 +1354,15 @@ static void __declspec(naked) map_save_in_game_hook() {
jmp game_time_;
}
}
/*
static void ClearEventUpdateMapProc() {
__asm {
mov eax, map_update_event; // type
xor edx, edx; // func
call queue_clear_type_;
}
}
*/
void ScriptExtenderSetup() {
toggleHighlightsKey = GetPrivateProfileIntA("Input", "ToggleItemHighlightsKey", 0, ini);
if (toggleHighlightsKey) {
@@ -1423,7 +1431,7 @@ void ScriptExtenderSetup() {
long long data = 0x397401C1F6; // test cl, 1; jz 0x483CF2
SafeWriteBytes(0x483CB4, (BYTE*)&data, 5);
// Set the DAM_BACKWASH_ flag for the attacker before calling compute_damage_
// Set the DAM_BACKWASH flag for the attacker before calling compute_damage_
SafeWrite32(0x423DE7, 0x40164E80); // or [esi+ctd.flags3Source], DAM_BACKWASH_
long idata = 0x146E09; // or dword ptr [esi+ctd.flagsSource], ebp
SafeWriteBytes(0x423DF0, (BYTE*)&idata, 3);
@@ -2015,11 +2023,14 @@ static DWORD _stdcall HandleMapUpdateForScripts(const DWORD procId) {
for (SfallProgsMap::iterator it = sfallProgsMap.begin(); it != sfallProgsMap.end(); it++) {
DWORD progPtr = it->second.ptr;
__asm {
mov eax, progPtr;
mov eax, progPtr;
call runProgram_;
}
}
}
} /*else if (procId == map_exit_p_proc) {
ClearEventUpdateMapProc();
}*/
RunGlobalScriptsAtProc(procId); // gl* scripts of types 0 and 3
RunHookScriptsAtProc(procId); // all hs_ scripts
+19 -18
View File
@@ -813,31 +813,32 @@ static const DWORD game_msg_files[] = {
0x672FB0, // WORLDMAP
};
// TODO: move to FalloutEngine
static const DWORD* proto_msg_files = (DWORD*)0x006647AC;
static void _stdcall op_message_str_game2() {
const char* msg = 0;
const char* msg = nullptr;
const ScriptValue &fileIdArg = opHandler.arg(0),
&msgIdArg = opHandler.arg(1);
if (fileIdArg.isInt() && msgIdArg.isInt()) {
int fileId = fileIdArg.asInt();
int msgId = msgIdArg.asInt();
if (fileId < 20) { // main msg files
msg = GetMessageStr(game_msg_files[fileId], msgId);
} else if (fileId >= 0x1000 && fileId <= 0x1005) { // proto msg files
msg = GetMessageStr((DWORD)&proto_msg_files[2*(fileId - 0x1000)], msgId);
} else if (fileId >= 0x2000) { // Extra game message files.
ExtraGameMessageListsMap::iterator it = gExtraGameMsgLists.find(fileId);
if (it != gExtraGameMsgLists.end()) {
msg = GetMsg(it->second, msgId, 2);
int fileId = fileIdArg.rawValue();
if (fileId >= 0) {
int msgId = msgIdArg.rawValue();
if (fileId < 20) { // main msg files
msg = GetMessageStr(game_msg_files[fileId], msgId);
} else if (fileId >= 0x1000 && fileId <= 0x1005) { // proto msg files
msg = GetMessageStr((DWORD)&ptr_proto_msg_files[2 * (fileId - 0x1000)], msgId);
} else if (fileId >= 0x2000) { // Extra game message files.
ExtraGameMessageListsMap::iterator it = gExtraGameMsgLists.find(fileId);
if (it != gExtraGameMsgLists.end()) {
msg = GetMsg(it->second, msgId, 2);
}
}
}
if (msg == nullptr) msg = "Error";
opHandler.setReturn(msg);
} else {
OpcodeInvalidArgs("message_str_game");
opHandler.setReturn(-1);
}
if (msg == 0) {
msg = "Error";
}
opHandler.setReturn(msg);
}
static void __declspec(naked) op_message_str_game() {
+1 -1
View File
@@ -245,7 +245,7 @@ void StatsInit() {
StatMulti[31 * 7 + 2] = 2; // rad resist
StatMulti[32 * 7 + 2] = 5; // poison resist
char key[6], buf2[256], buf3[256];
char key[6], buf2[256], buf3[MAX_PATH];
strcpy_s(buf3, table);
sprintf(table, ".\\%s", buf3);
for (int i = STAT_max_hit_points; i <= STAT_poison_resist; i++) {
+3 -5
View File
@@ -644,8 +644,6 @@ static void __declspec(naked) display_stats_hook() {
}
static void DllMain2() {
//SafeWrite8(0x4B15E8, 0xc3);
//SafeWrite8(0x4B30C4, 0xc3); //this is the one I need to override for bigger tiles
DWORD tmp;
dlogr("In DllMain2", DL_MAIN);
@@ -809,8 +807,8 @@ static void DllMain2() {
dlogr(" Done", DL_INIT);
}
char elevPath[MAX_PATH];
GetPrivateProfileString("Misc", "ElevatorsFile", "", elevPath, MAX_PATH, ini);
char elevPath[MAX_PATH - 3];
GetPrivateProfileString("Misc", "ElevatorsFile", "", elevPath, MAX_PATH - 3, ini);
if (strlen(elevPath) > 0) {
dlog("Applying elevator patch.", DL_INIT);
ElevatorsInit(elevPath);
@@ -1336,7 +1334,7 @@ bool _stdcall DllMain(HANDLE hDllHandle, DWORD dwReason, LPVOID lpreserved) {
strcpy_s(ini, ".\\ddraw.ini");
}
GetPrivateProfileStringA("Main", "TranslationsINI", "./Translations.ini", translationIni, 65, ini);
GetPrivateProfileStringA("Main", "TranslationsINI", ".\\Translations.ini", translationIni, 65, ini);
modifiedIni = GetPrivateProfileIntA("Main", "ModifiedIni", 0, ini);
DllMain2();
+2 -2
View File
@@ -290,8 +290,8 @@ void SkillsInit() {
// 0x00000400 - Energy Weapon (forces weapon to use Energy Weapons skill)
HookCall(0x47831E, item_w_skill_hook);
char buf[512], key[16], file[64];
if (GetPrivateProfileStringA("Misc", "SkillsFile", "", buf, 62, ini) > 0) {
char buf[512], key[16], file[MAX_PATH];
if (GetPrivateProfileStringA("Misc", "SkillsFile", "", buf, MAX_PATH - 3, ini) > 0) {
SkillInfo *skills = (SkillInfo*)_skill_data;
sprintf(file, ".\\%s", buf);