From 943cd5d2dc641fcc09dd9493fe074bf3d98743f2 Mon Sep 17 00:00:00 2001 From: NovaRain Date: Tue, 7 May 2019 13:49:26 +0800 Subject: [PATCH] Code edits on ScriptShaders & OpcodeContext.cpp. Minor edits on some other code. Added the missing Test_ForceFloats option to ddraw.ini. --- artifacts/ddraw.ini | 4 ++ sfall/FalloutEngine/Structs.h | 33 ++++++------- sfall/Modules/BarBoxes.cpp | 3 +- sfall/Modules/Graphics.cpp | 5 +- sfall/Modules/Graphics.h | 1 + sfall/Modules/Movies.cpp | 4 +- sfall/Modules/ScriptShaders.cpp | 56 ++++++++++------------- sfall/Modules/ScriptShaders.h | 1 + sfall/Modules/Scripting/OpcodeContext.cpp | 8 ++-- 9 files changed, 58 insertions(+), 57 deletions(-) diff --git a/artifacts/ddraw.ini b/artifacts/ddraw.ini index 53382673..fa8eb786 100644 --- a/artifacts/ddraw.ini +++ b/artifacts/ddraw.ini @@ -25,6 +25,10 @@ NumSoundBuffers=0 ;Set to 1 to allow attaching sound files to combat float messages AllowSoundForFloats=1 +;Set to 1 to force critters to display combat float messages +;Requires sfall debugging mode and AllowSoundForFloats to be enabled +Test_ForceFloats=0 + ;Set to 1 to automatically search for alternative formats (mp3/wma/wav) when Fallout tries to play an acm ;Set to 2 to play alternative music files even if original acm files are not present in the music folder ;This does not effect the play_sfall_sound and stop_sfall_sound script functions diff --git a/sfall/FalloutEngine/Structs.h b/sfall/FalloutEngine/Structs.h index 5b67d7e0..a6af6648 100644 --- a/sfall/FalloutEngine/Structs.h +++ b/sfall/FalloutEngine/Structs.h @@ -136,7 +136,7 @@ struct GameObject { return (protoId >> 24); } inline char TypeFid() { - return (artFid >> 24); + return ((artFid >> 24) & 0xF0); } }; @@ -271,18 +271,19 @@ struct ElevatorFrms { #pragma pack(1) struct FrmFile { - long id; //0x00 - long unused; //0x04 - short frames; //0x08 + long id; //0x00 + short fps; //0x04 + short actionFrame; //0x06 + short frames; //0x08 short xshift[6]; //0x0a short yshift[6]; //0x16 - long framestart[6];//0x22 - long size; //0x3a + long framestart[6]; //0x22 + long size; //0x3a short width; //0x3e - short height; //0x40 - long frmSize; //0x42 - short xoffset; //0x46 - short yoffset; //0x48 + short height; //0x40 + long frmSize; //0x42 + short xoffset; //0x46 + short yoffset; //0x48 BYTE pixels[80 * 36]; //0x4a }; @@ -301,13 +302,13 @@ public: #pragma pack(2) typedef class FrmFrameData { public: - DWORD version; //version num - WORD fps; //frames per sec + DWORD version; // version num + WORD fps; // frames per sec WORD actionFrame; - WORD numFrames; //number of frames per direction - WORD xCentreShift[6]; //offset from frm centre +=right -=left - WORD yCentreShift[6]; //offset from frm centre +=down -=up - DWORD oriOffset[6]; //frame area offset for diff orientations + WORD numFrames; // number of frames per direction + WORD xCentreShift[6]; // offset from frm centre +=right -=left + WORD yCentreShift[6]; // offset from frm centre +=down -=up + DWORD oriOffset[6]; // frame area offset for diff orientations DWORD frameAreaSize; } FrmFrameData; diff --git a/sfall/Modules/BarBoxes.cpp b/sfall/Modules/BarBoxes.cpp index 64a34021..4a3385f6 100644 --- a/sfall/Modules/BarBoxes.cpp +++ b/sfall/Modules/BarBoxes.cpp @@ -18,6 +18,7 @@ #include "..\main.h" #include "..\FalloutEngine\Fallout2.h" +#include "Graphics.h" #include "LoadGameHook.h" #include "BarBoxes.h" @@ -220,7 +221,7 @@ static void SetEngine(int count) { } static long SetMaxSlots() { - long scrWidth = fo::var::scr_size.offx - (fo::var::scr_size.x + 1); + long scrWidth = Graphics::GetGameWidthRes(); int slots = scrWidth / 127; if (++slots > 16) { diff --git a/sfall/Modules/Graphics.cpp b/sfall/Modules/Graphics.cpp index 1663a90c..4792c753 100644 --- a/sfall/Modules/Graphics.cpp +++ b/sfall/Modules/Graphics.cpp @@ -32,15 +32,14 @@ #include #include "..\main.h" - #include "..\FalloutEngine\Fallout2.h" #include "..\InputFuncs.h" #include "..\Version.h" - -#include "Graphics.h" #include "LoadGameHook.h" #include "ScriptShaders.h" +#include "Graphics.h" + namespace sfall { diff --git a/sfall/Modules/Graphics.h b/sfall/Modules/Graphics.h index 19cbe5ae..42139151 100644 --- a/sfall/Modules/Graphics.h +++ b/sfall/Modules/Graphics.h @@ -49,6 +49,7 @@ public: static void SetDefaultTechnique(); }; +extern IDirect3D9* d3d9; extern IDirect3DDevice9* d3d9Device; int _stdcall GetShaderVersion(); diff --git a/sfall/Modules/Movies.cpp b/sfall/Modules/Movies.cpp index 149da74d..d1e9ad7b 100644 --- a/sfall/Modules/Movies.cpp +++ b/sfall/Modules/Movies.cpp @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -#include // should be above DX SDK includes to avoid warning 4995 +//#include // should be above DX SDK includes to avoid warning 4995 #include #include @@ -37,8 +37,6 @@ namespace sfall static DWORD MoviePtrs[MaxMovies]; char MoviePaths[MaxMovies * 65]; -extern IDirect3D9* d3d9; - class CAllocator : public IVMRSurfaceAllocator9, IVMRImagePresenter9 { private: IDirect3DSurface9* surface; diff --git a/sfall/Modules/ScriptShaders.cpp b/sfall/Modules/ScriptShaders.cpp index 1aa185a0..37f58554 100644 --- a/sfall/Modules/ScriptShaders.cpp +++ b/sfall/Modules/ScriptShaders.cpp @@ -27,33 +27,27 @@ namespace sfall { -static size_t shaderSize; +static size_t shadersSize; struct sShader { ID3DXEffect* Effect; - bool Active; D3DXHANDLE ehTicks; DWORD mode; DWORD mode2; + bool Active; - sShader() { - Effect = 0; - Active = false; - ehTicks = 0; - mode = 0; - mode2 = 0; - } + sShader() : Effect(0), ehTicks(0), mode(0), mode2(0), Active(false) {} }; static std::vector shaders; static std::vector shaderTextures; size_t ScriptShaders::Count() { - return shaderSize; + return shadersSize; } void _stdcall SetShaderMode(DWORD d, DWORD mode) { - if (d >= shaders.size() || !shaders[d].Effect) return; + if (d >= shadersSize || !shaders[d].Effect) return; if (mode & 0x80000000) { shaders[d].mode2 = mode ^ 0x80000000; } else { @@ -64,8 +58,8 @@ void _stdcall SetShaderMode(DWORD d, DWORD mode) { int _stdcall LoadShader(const char* path) { if (!Graphics::mode || strstr(path, "..") || strstr(path, ":")) return -1; char buf[MAX_PATH]; - sprintf(buf, "%s\\shaders\\%s", fo::var::patches, path); - for (DWORD d = 0; d < shaders.size(); d++) { + sprintf_s(buf, "%s\\shaders\\%s", fo::var::patches, path); + for (DWORD d = 0; d < shadersSize; d++) { if (!shaders[d].Effect) { if (FAILED(D3DXCreateEffectFromFile(d3d9Device, buf, 0, 0, 0, 0, &shaders[d].Effect, 0))) return -1; else return d; @@ -80,31 +74,31 @@ int _stdcall LoadShader(const char* path) { const char* name; IDirect3DTexture9* tex; - sprintf_s(buf, "texname%d", i); + sprintf(buf, "texname%d", i); if (FAILED(shader.Effect->GetString(buf, &name))) break; sprintf_s(buf, "%s\\art\\stex\\%s", fo::var::patches, name); if (FAILED(D3DXCreateTextureFromFileA(d3d9Device, buf, &tex))) continue; - sprintf_s(buf, "tex%d", i); + sprintf(buf, "tex%d", i); shader.Effect->SetTexture(buf, tex); shaderTextures.push_back(tex); } shader.ehTicks = shader.Effect->GetParameterByName(0, "tickcount"); shaders.push_back(shader); - shaderSize = shaders.size(); - return shaderSize - 1; + shadersSize = shaders.size(); + return shadersSize - 1; } void _stdcall ActivateShader(DWORD d) { - if (d < shaders.size() && shaders[d].Effect) shaders[d].Active = true; + if (d < shadersSize && shaders[d].Effect) shaders[d].Active = true; } void _stdcall DeactivateShader(DWORD d) { - if (d < shaders.size()) shaders[d].Active = false; + if (d < shadersSize) shaders[d].Active = false; } int _stdcall GetShaderTexture(DWORD d, DWORD id) { - if (id < 1 || id > 128 || d >= shaders.size() || !shaders[d].Effect) return -1; + if (id < 1 || id > 128 || d >= shadersSize || !shaders[d].Effect) return -1; IDirect3DBaseTexture9* tex = 0; char buf[8] = "tex"; _itoa_s(id, &buf[3], 4, 10); @@ -117,43 +111,43 @@ int _stdcall GetShaderTexture(DWORD d, DWORD id) { } void _stdcall FreeShader(DWORD d) { - if (d < shaders.size()) { + if (d < shadersSize) { SAFERELEASE(shaders[d].Effect); shaders[d].Active = false; } } void _stdcall SetShaderInt(DWORD d, const char* param, int value) { - if (d >= shaders.size() || !shaders[d].Effect) return; + if (d >= shadersSize || !shaders[d].Effect) return; shaders[d].Effect->SetInt(param, value); } void _stdcall SetShaderFloat(DWORD d, const char* param, float value) { - if (d >= shaders.size() || !shaders[d].Effect) return; + if (d >= shadersSize || !shaders[d].Effect) return; shaders[d].Effect->SetFloat(param, value); } void _stdcall SetShaderVector(DWORD d, const char* param, float f1, float f2, float f3, float f4) { - if (d >= shaders.size() || !shaders[d].Effect) return; + if (d >= shadersSize || !shaders[d].Effect) return; shaders[d].Effect->SetFloatArray(param, &f1, 4); } void _stdcall SetShaderTexture(DWORD d, const char* param, DWORD value) { - if (d >= shaders.size() || !shaders[d].Effect || value >= shaderTextures.size()) return; + if (d >= shadersSize || !shaders[d].Effect || value >= shaderTextures.size()) return; shaders[d].Effect->SetTexture(param, shaderTextures[value]); } void ResetShaders() { - for (DWORD d = 0; d < shaders.size(); d++) SAFERELEASE(shaders[d].Effect); + for (DWORD d = 0; d < shadersSize; d++) SAFERELEASE(shaders[d].Effect); shaders.clear(); - shaderSize = 0; + shadersSize = 0; } void ScriptShaders::Refresh(IDirect3DSurface9* sSurf1, IDirect3DSurface9* sSurf2, IDirect3DTexture9* sTex2) { - for (int d = shaders.size() - 1; d >= 0; d--) { + for (int d = shadersSize - 1; d >= 0; d--) { if (!shaders[d].Effect || !shaders[d].Active) continue; if (shaders[d].mode2 && !(shaders[d].mode2 & GetLoopFlags())) continue; - if (shaders[d].mode&GetLoopFlags()) continue; + if (shaders[d].mode & GetLoopFlags()) continue; if (shaders[d].ehTicks) shaders[d].Effect->SetInt(shaders[d].ehTicks, GetTickCount()); UINT passes; @@ -171,13 +165,13 @@ void ScriptShaders::Refresh(IDirect3DSurface9* sSurf1, IDirect3DSurface9* sSurf2 } void ScriptShaders::OnResetDevice() { - for (DWORD d = 0; d < shaders.size(); d++) { + for (DWORD d = 0; d < shadersSize; d++) { if (shaders[d].Effect) shaders[d].Effect->OnResetDevice(); } } void ScriptShaders::OnLostDevice() { - for (DWORD d = 0; d < shaders.size(); d++) { + for (DWORD d = 0; d < shadersSize; d++) { if (shaders[d].Effect) shaders[d].Effect->OnLostDevice(); } } diff --git a/sfall/Modules/ScriptShaders.h b/sfall/Modules/ScriptShaders.h index 3cf30a0a..a76d0fea 100644 --- a/sfall/Modules/ScriptShaders.h +++ b/sfall/Modules/ScriptShaders.h @@ -1,6 +1,7 @@ #pragma once #include "Module.h" +#include "Graphics.h" namespace sfall { diff --git a/sfall/Modules/Scripting/OpcodeContext.cpp b/sfall/Modules/Scripting/OpcodeContext.cpp index d0844dc7..4ee830b0 100644 --- a/sfall/Modules/Scripting/OpcodeContext.cpp +++ b/sfall/Modules/Scripting/OpcodeContext.cpp @@ -66,7 +66,8 @@ void OpcodeContext::setArgShift (int shift) { } const ScriptValue& OpcodeContext::arg(int index) const { - return _args.at(index + _argShift); + assert((index + _argShift) < OP_MAX_ARGUMENTS); + return _args[index + _argShift]; } const ScriptValue& OpcodeContext::returnValue() const { @@ -109,6 +110,7 @@ bool OpcodeContext::validateArguments(const OpcodeArgumentType argTypes[], const // exception is when type set to if (actualType == DataType::NONE) break; auto argType = argTypes[i]; + if (argType == ARG_ANY) continue; if ((argType == ARG_INT || argType == ARG_OBJECT) && !(actualType == DataType::INT)) { printOpcodeError("%s() - argument #%d is not an integer.", opcodeName, ++i); return false; @@ -208,9 +210,9 @@ void OpcodeContext::_popArguments() { // retrieve string argument if (type == DataType::STR) { - _args.at(i) = fo::func::interpretGetString(_program, rawValueType, rawValue); + _args[i] = fo::func::interpretGetString(_program, rawValueType, rawValue); } else { - _args.at(i) = ScriptValue(type, rawValue); + _args[i] = ScriptValue(type, rawValue); } } }