Added performance patches, some code moved to main.cpp

Minor edits to ddraw.ini.

Tweaked the names in AsmMacros.h.
This commit is contained in:
NovaRain
2020-03-22 09:27:24 +08:00
parent 1c6f8cc255
commit 22140e2a0c
16 changed files with 103 additions and 85 deletions
+3 -3
View File
@@ -69,7 +69,7 @@ GraphicsHeight=0
;Set to 0 to reset if the window position is incorrect
WindowData=0
;Uncomment the option to use a hardware shader (requires DX9 graphics mode 4 or 5)
;Uncomment the option to use a hardware shader (requires DX9 graphics mode)
;The shader file <name>.fx must be placed in <GameRoot>\<master_patches>\shaders\ and must contain one technique with one or more passes
;GlobalShaderFile=global.fx
@@ -87,7 +87,7 @@ GPUBlt=0
Use32BitHeadGraphics=0
;Set to 1 to automatically search for alternative avi video files when Fallout tries to play the game movies
;Requires DX9 graphics mode 4 or 5
;Requires DX9 graphics mode
AllowDShowMovies=0
;Fade effect time percentage modifier
@@ -160,7 +160,7 @@ SpeedKey7=0x00
SpeedKey8=0x00
SpeedKey9=0x00
;A key to hold down to move the window around when using graphics mode 5
;A key to hold down to move the window around when using DX9 graphics mode 5
;Set to 0 if you don't want to use a modifier key, or a DX scancode otherwise
;Set to -1 for either ctrl key, -2 for either alt key or -3 for either shift key
WindowScrollKey=0
-3
View File
@@ -3246,9 +3246,6 @@ void BugFixesInit()
// Place the player on a nearby empty tile if the entrance tile is blocked by another object when entering a map
HookCall(0x4836F8, map_check_state_hook);
// Remove duplicate code from intface_redraw_ engine function
BlockCall(0x45EBBF);
// Fix for critter_add/rm_trait functions ignoring the value of the "amount" argument
// Note: pass negative amount values to critter_rm_trait to remove all ranks of the perk (vanilla behavior)
HookCall(0x458CDB, op_critter_rm_trait_hook);
-12
View File
@@ -343,16 +343,6 @@ static void __declspec(naked) debug_log_hack() {
}
}
static void __declspec(naked) op_display_msg_hook() {
__asm {
cmp dword ptr ds:_debug_func, 0;
jne debug;
retn;
debug:
jmp config_get_value_;
}
}
static void DebugModePatch() {
int dbgMode = iniGetInt("Debugging", "DebugMode", 0, ddrawIniDef);
if (dbgMode > 0) {
@@ -393,8 +383,6 @@ static void DebugModePatch() {
dlogr(" Done", DL_INIT);
}
// Just for speeding up display_msg function (optional)
HookCall(0x455404, op_display_msg_hook);
}
static void DontDeleteProtosPatch() {
+8
View File
@@ -881,6 +881,10 @@ void __stdcall GsoundPlaySfxFile(const char* name) {
WRAP_WATCOM_CALL1(gsound_play_sfx_file_, name)
}
bool __stdcall ArtExists(long artFid) {
WRAP_WATCOM_CALL1(art_exists_, artFid)
}
// Returns the name of the critter
const char* __stdcall CritterName(TGameObj* critter) {
WRAP_WATCOM_CALL1(critter_name_, critter)
@@ -1508,6 +1512,10 @@ long __stdcall ArtPtrUnlock(DWORD lockId) {
WRAP_WATCOM_CALL1(art_ptr_unlock_, lockId)
}
long __stdcall LightGetTile(long elevation, long tileNum) {
WRAP_WATCOM_CALL2(light_get_tile_, elevation, tileNum)
}
long __stdcall LoadFrame(const char* filename, FrmFile** frmPtr) {
WRAP_WATCOM_CALL2(load_frame_, filename, frmPtr)
}
+5
View File
@@ -1073,6 +1073,8 @@ long __stdcall GetInputBtn();
// plays SFX sound with given name
void __stdcall GsoundPlaySfxFile(const char* name);
bool __stdcall ArtExists(long artFid);
// Returns the name of the critter
const char* __stdcall CritterName(TGameObj* critter);
@@ -1325,6 +1327,9 @@ BYTE* __stdcall ArtLock(long frmId, DWORD* lockPtr, long* widthOut, long* height
long __stdcall ArtPtrUnlock(DWORD lockId);
// returns light level at given tile
long __stdcall LightGetTile(long elevation, long tileNum);
long __stdcall LoadFrame(const char* filename, FrmFile** frmPtr);
long __stdcall FMtextWidth(const char* text);
+2 -9
View File
@@ -260,14 +260,7 @@ int __fastcall PartyControl_SwitchHandHook(TGameObj* item) {
int fId = *ptr_i_fid; //(*ptr_obj_dude)->artFid;
char weaponCode = AnimCodeByWeapon(item);
fId = (fId & 0xFFFF0FFF) | (weaponCode << 12);
// check if art with this weapon exists
int canUse;
__asm {
mov eax, fId;
call art_exists_;
mov canUse, eax;
}
if (!canUse) {
if (!ArtExists(fId)) {
DisplayCantDoThat();
return 1;
}
@@ -313,8 +306,8 @@ gonormal:
}
// hack to exit from this function safely when you load game during NPC turn
static const DWORD CombatHack_add_noncoms_back = 0x422359;
static void __declspec(naked) CombatHack_add_noncoms_() {
static const DWORD CombatHack_add_noncoms_back = 0x422359;
__asm {
call CombatWrapper_v2;
cmp eax, -1;
+2 -2
View File
@@ -630,7 +630,7 @@ static void __declspec(naked) GetSfallArg() {
call GetHSArg;
mov edx, eax;
mov eax, ebx;
_RET_VAL_INT2;
_RET_VAL_INT;
mov ecx, esi;
retn;
}
@@ -669,7 +669,7 @@ static void __declspec(naked) GetSfallArgs() {
call GetSfallArgs2;
mov edx, eax;
mov eax, ebx;
_RET_VAL_INT2;
_RET_VAL_INT;
mov ecx, esi;
retn;
}
+20 -22
View File
@@ -199,29 +199,27 @@ static void __declspec(naked) op_reg_anim_callback() {
_WRAP_OPCODE(op_reg_anim_callback2, 1, 0)
}
static void _stdcall op_explosions_metarule2() {
const ScriptValue &modeArg = opHandler.arg(0),
&arg1Arg = opHandler.arg(1),
&arg2Arg = opHandler.arg(2);
if (modeArg.isInt() && arg1Arg.isInt() && arg2Arg.isInt()) {
int mode = modeArg.rawValue(),
result = ExplosionsMetaruleFunc(mode, arg1Arg.rawValue(), arg2Arg.rawValue());
if (result == -1) {
opHandler.printOpcodeError("metarule2_explosions() - mode (%d) is not supported for the function.", mode);
}
opHandler.setReturn(result);
} else {
OpcodeInvalidArgs("metarule2_explosions");
opHandler.setReturn(-1);
}
}
static void __declspec(naked) op_explosions_metarule() {
_OP_BEGIN(ebp)
_GET_ARG_R32(ebp, ebx, esi) // arg3
_GET_ARG_R32(ebp, ecx, edi) // arg2
_GET_ARG_R32(ebp, edx, eax) // arg1
// eax should not change until function call
_CHECK_ARG_INT(bx, fail)
_CHECK_ARG_INT(cx, fail)
_CHECK_ARG_INT(dx, fail)
__asm {
push esi
push edi
push eax
call ExplosionsMetaruleFunc;
jmp end;
}
fail:
__asm {
mov eax, -1
}
end:
_RET_VAL_INT(ebp)
_OP_END
_WRAP_OPCODE(op_explosions_metarule2, 3, 1)
}
static void sf_art_cache_flush() {
+2 -2
View File
@@ -113,7 +113,7 @@ __asm skipgetstr##num: \
notstring##num:
// must be immediately after C function call
#define _RET_VAL_INT(rscript) __asm { \
#define _RET_VAL_INT32(rscript) __asm { \
__asm mov edx, eax \
__asm mov eax, rscript \
__asm call interpretPushLong_ \
@@ -137,7 +137,7 @@ notstring##num:
eax and ebx register must contain the script_ptr
edx register must contain the returned value
*/
#define _RET_VAL_INT2 __asm { \
#define _RET_VAL_INT __asm { \
__asm call interpretPushLong_ \
__asm mov edx, VAR_TYPE_INT \
__asm mov eax, ebx \
+1 -1
View File
@@ -397,7 +397,7 @@ static void __declspec(naked) funcGetShaderVersion() {
call GetShaderVersion;
mov edx, eax;
mov eax, ebx;
_RET_VAL_INT2;
_RET_VAL_INT;
mov ecx, esi;
retn;
}
+4 -4
View File
@@ -38,7 +38,7 @@ result:
// retn;
error:
xor edx, edx;
jmp result;
jmp result;
}
}
@@ -54,7 +54,7 @@ result:
// retn;
error:
xor edx, edx;
jmp result;
jmp result;
}
}
@@ -70,7 +70,7 @@ result:
// retn;
error:
xor edx, edx;
jmp result;
jmp result;
}
}
@@ -251,7 +251,7 @@ static void __fastcall CallOffsetInternal(TProgram* script, DWORD func) {
mov eax, script;
mov edx, args[0];
mov ebx, eax;
_RET_VAL_INT2;
_RET_VAL_INT;
}
}
}
+19 -21
View File
@@ -132,7 +132,7 @@ static void __declspec(naked) GameLoaded() {
call ScriptHasLoaded;
movzx edx, al;
mov eax, ebx;
_RET_VAL_INT2;
_RET_VAL_INT;
mov ecx, esi;
retn;
}
@@ -170,7 +170,7 @@ skip:
mov edx, ds:[_pc_kill_counts][eax * 4];
end:
mov eax, ebx; // script
_RET_VAL_INT2;
_RET_VAL_INT;
retn;
fail:
xor edx, edx; // return 0
@@ -588,7 +588,7 @@ static void __declspec(naked) funcGetTickCount() {
call GetTickCount2;
mov edx, eax;
mov eax, ebx;
_RET_VAL_INT2;
_RET_VAL_INT;
mov ecx, esi;
retn;
}
@@ -943,7 +943,7 @@ static void __declspec(naked) get_tile_fid() {
mov ebx, esi; // script
end:
mov eax, ebx;
_RET_VAL_INT2;
_RET_VAL_INT;
pop ecx;
retn;
fail:
@@ -1095,27 +1095,25 @@ static void __declspec(naked) op_sneak_success() {
__asm {
call is_pc_sneak_working_
}
_RET_VAL_INT(ebp)
_RET_VAL_INT32(ebp)
_OP_END
}
static void __declspec(naked) op_tile_light() {
_OP_BEGIN(ebp)
_GET_ARG_R32(ebp, ebx, edi) // arg2 - tile
_GET_ARG_R32(ebp, ecx, esi) // arg1 - elevation
_CHECK_ARG_INT(bx, fail)
_CHECK_ARG_INT(cx, fail)
__asm {
mov eax, esi
mov edx, edi
call light_get_tile_
jmp end
fail:
mov eax, -1
end:
static void _stdcall op_tile_light2() {
const ScriptValue &elevArg = opHandler.arg(0),
&tileArg = opHandler.arg(1);
if (elevArg.isInt() && tileArg.isInt()) {
int lightLevel = LightGetTile(elevArg.rawValue(), tileArg.rawValue());
opHandler.setReturn(lightLevel);
} else {
OpcodeInvalidArgs("tile_light");
opHandler.setReturn(-1);
}
_RET_VAL_INT(ebp)
_OP_END
}
static void __declspec(naked) op_tile_light() {
_WRAP_OPCODE(op_tile_light2, 2, 1)
}
static void sf_exec_map_update_scripts() {
+1 -1
View File
@@ -456,7 +456,7 @@ fail:
xor eax, eax;
end:
}
_RET_VAL_INT(ebp)
_RET_VAL_INT32(ebp)
_OP_END
}
+3 -3
View File
@@ -432,7 +432,7 @@ static void __declspec(naked) op_load_array() {
push ecx; // arg 1: key
call LoadArray;
}
_RET_VAL_INT(ebp)
_RET_VAL_INT32(ebp)
_OP_END
}
@@ -457,7 +457,7 @@ static void __declspec(naked) op_get_array_key() {
wrongarg:
xor eax, eax; // return 0 on wrong arguments
}
_RET_VAL_INT(ebp)
_RET_VAL_INT32(ebp)
end:
_OP_END
}
@@ -482,7 +482,7 @@ static void __declspec(naked) op_stack_array() {
push edi // arg 1: key
call StackArray
}
_RET_VAL_INT(ebp)
_RET_VAL_INT32(ebp)
_OP_END
}
+2 -2
View File
@@ -122,7 +122,7 @@ static void __declspec(naked) funcInWorldMap() {
call InWorldMap;
mov edx, eax;
mov eax, ebx;
_RET_VAL_INT2;
_RET_VAL_INT;
mov ecx, esi;
retn;
}
@@ -134,7 +134,7 @@ static void __declspec(naked) GetGameMode() {
call GetLoopFlags;
mov edx, eax;
mov eax, ebx;
_RET_VAL_INT2;
_RET_VAL_INT;
mov ecx, esi;
retn;
}
+31
View File
@@ -331,6 +331,16 @@ playWalkMovie:
}
}
static void __declspec(naked) op_display_msg_hook() {
__asm {
cmp dword ptr ds:_debug_func, 0;
jne debug;
retn;
debug:
jmp config_get_value_;
}
}
static void DllMain2() {
long tmp;
dlogr("In DllMain2", DL_MAIN);
@@ -484,6 +494,27 @@ static void DllMain2() {
dlogr("Running HeroAppearanceModInit().", DL_INIT);
HeroAppearanceModInit();
/////////////////// Engine Optimization Patches ////////////////////
// Speed up display_msg script function
HookCall(0x455404, op_display_msg_hook);
// Remove duplicate code from intface_redraw_ engine function
BlockCall(0x45EBBF);
// Improve performance of the data conversion of script interpreter
// mov eax, [edx+eax]; bswap eax; ret;
SafeWrite32(0x4672A4, 0x0F02048B);
SafeWrite16(0x4672A8, 0xC3C8);
// mov eax, [edx+eax]; bswap eax;
SafeWrite32(0x4673E5, 0x0F02048B);
SafeWrite8(0x4673E9, 0xC8);
// mov ax, [eax]; rol ax, 8; ret;
SafeWrite32(0x467292, 0x66008B66);
SafeWrite32(0x467296, 0xC308C0C1);
////////////////////////////////////////////////////////////////////
if (GetConfigString("Misc", "StartingMap", "", mapName, 64)) {
dlog("Applying starting map patch.", DL_INIT);
SafeWrite32(0x480AAA, (DWORD)&mapName);