From a488e9fc5bfc37fd3d977c06ec8a042ea948aeeb Mon Sep 17 00:00:00 2001 From: NovaRain Date: Wed, 21 Oct 2020 22:36:26 +0800 Subject: [PATCH 1/6] Fixed the macro guard in command_lite.h and added two macros --- artifacts/scripting/headers/command_lite.h | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/artifacts/scripting/headers/command_lite.h b/artifacts/scripting/headers/command_lite.h index 5d61dc34..a0113d2d 100644 --- a/artifacts/scripting/headers/command_lite.h +++ b/artifacts/scripting/headers/command_lite.h @@ -2,8 +2,8 @@ Copyright 1998-2003 Interplay Entertainment Corp. All rights reserved. */ -#ifndef COMMAND_H -#define COMMAND_H +#ifndef COMMAND_LITE_H +#define COMMAND_LITE_H #define critter_is_armed(x) (((obj_item_subtype(critter_inven_obj(x,INVEN_TYPE_RIGHT_HAND))) == item_type_weapon) or \ @@ -26,6 +26,8 @@ #endif #define dude_age (get_critter_stat(dude_obj,STAT_age)) #define dude_weight critter_weight(dude_obj) +#define dude_cur_carry who_carry_amount(dude_obj) +#define dude_max_carry who_max_carry(dude_obj) #define dude_moron_not_vegetable (((get_critter_stat(dude_obj,STAT_iq)) > 1) and ((get_critter_stat(dude_obj,STAT_iq)) < 3) ) @@ -564,4 +566,4 @@ #define set_is_click set_lvar_bit_off(LVAR_Flags, is_float_bit) -#endif // COMMAND_H +#endif // COMMAND_LITE_H From 97fde2950c072732cc8268b645c224228d0cf76f Mon Sep 17 00:00:00 2001 From: NovaRain Date: Fri, 23 Oct 2020 23:23:09 +0800 Subject: [PATCH 2/6] Added support for drawing PCX images to draw_image, draw_image_scaled, and interface_art_draw Fixed bug in TalkingHeads.cpp. --- sfall/FalloutEngine/FunctionOffsets_def.h | 6 +- sfall/FalloutEngine/Functions.cpp | 17 ++++ sfall/FalloutEngine/Functions.h | 2 + sfall/FalloutEngine/VariableOffsets.h | 2 + .../Modules/Scripting/Handlers/Interface.cpp | 78 +++++++++++++------ sfall/Modules/TalkingHeads.cpp | 16 ++-- sfall/version.h | 4 +- 7 files changed, 91 insertions(+), 34 deletions(-) diff --git a/sfall/FalloutEngine/FunctionOffsets_def.h b/sfall/FalloutEngine/FunctionOffsets_def.h index ecb3e42c..57c2e87f 100644 --- a/sfall/FalloutEngine/FunctionOffsets_def.h +++ b/sfall/FalloutEngine/FunctionOffsets_def.h @@ -1086,7 +1086,7 @@ FUNC(doCursor_, 0x4B45F8) FUNC(doDialog_, 0x430CEC) FUNC(doEvents_, 0x46DEE4) FUNC(doOptions_, 0x430268) -FUNC(do_optionsFunc_, 0x48FC50) +FUNC(do_optionsFunc_, 0x48FC50) FUNC(doRegionFunc_, 0x4B6D68) FUNC(doRegionRightFunc_, 0x4B6CE8) FUNC(doReply_, 0x430074) @@ -1726,7 +1726,7 @@ FUNC(interpretDecStringRef_, 0x467440) FUNC(interpretDumpStack_, 0x46E4B0) FUNC(interpretDumpStringHeap_, 0x46E5EC) FUNC(interpretEnableInterpreter_, 0x46CC74) -FUNC(interpretError_, 0x4671F0) +FUNC(interpretError_, 0x4671F0) FUNC(interpretFadeInNoBK_, 0x4623DC) FUNC(interpretFadeIn_, 0x462380) FUNC(interpretFadeOutNoBK_, 0x4623A4) @@ -3083,7 +3083,7 @@ FUNC(register_clear_, 0x413C4C) FUNC(register_end_, 0x413CCC) FUNC(register_object_animate_, 0x4149D0) FUNC(register_object_animate_and_hide_, 0x414B7C) -FUNC(register_object_animate_and_move_straight_, 0x4146C4) +FUNC(register_object_animate_and_move_straight_, 0x4146C4) FUNC(register_object_animate_forever_, 0x4154C4) FUNC(register_object_animate_reverse_, 0x414AA8) FUNC(register_object_call3_, 0x414F20) diff --git a/sfall/FalloutEngine/Functions.cpp b/sfall/FalloutEngine/Functions.cpp index fb3e9a80..13ec9981 100644 --- a/sfall/FalloutEngine/Functions.cpp +++ b/sfall/FalloutEngine/Functions.cpp @@ -391,6 +391,23 @@ void __cdecl trans_buf_to_buf(BYTE* src, long width, long height, long src_width __asm emms; } +BYTE* __fastcall loadPCX(const char* file, long* width, long* height) { + __asm { + mov eax, ecx; + mov ebx, height; + mov ecx, FO_VAR_pal; + call fo::funcoffs::loadPCX_; + push eax; + mov ebx, [width]; + mov edx, FO_VAR_pal; + mov ecx, [height]; + mov ebx, [ebx]; + mov ecx, [ecx]; + call fo::funcoffs::datafileConvertData_; + pop eax; + } +} + long __fastcall get_game_config_string(const char* outValue, const char* section, const char* param) { __asm { mov ebx, param; diff --git a/sfall/FalloutEngine/Functions.h b/sfall/FalloutEngine/Functions.h index 545bf7e1..b0ad07f3 100644 --- a/sfall/FalloutEngine/Functions.h +++ b/sfall/FalloutEngine/Functions.h @@ -80,6 +80,8 @@ void __cdecl buf_to_buf(BYTE* src, long width, long height, long src_width, BYTE // trans_buf_to_buf_ function implementation void __cdecl trans_buf_to_buf(BYTE* src, long width, long height, long src_width, BYTE* dst, long dst_width); +BYTE* __fastcall loadPCX(const char* file, long* width, long* height); + long __fastcall get_game_config_string(const char* outValue, const char* section, const char* param); // X-Macro for wrapper functions. diff --git a/sfall/FalloutEngine/VariableOffsets.h b/sfall/FalloutEngine/VariableOffsets.h index 8a036422..26b796c1 100644 --- a/sfall/FalloutEngine/VariableOffsets.h +++ b/sfall/FalloutEngine/VariableOffsets.h @@ -85,6 +85,7 @@ #define FO_VAR_folder_card_title2 0x5705BC #define FO_VAR_frame_time 0x5709C4 #define FO_VAR_free_perk 0x570A29 +#define FO_VAR_freePtr 0x519594 #define FO_VAR_frstc_draw1 0x5707D8 #define FO_VAR_game_config 0x58E950 #define FO_VAR_game_global_vars 0x5186C0 @@ -190,6 +191,7 @@ #define FO_VAR_optionsButtonUpKey 0x518F28 #define FO_VAR_optnwin 0x663900 #define FO_VAR_outlined_object 0x518D94 +#define FO_VAR_pal 0x56D7E0 #define FO_VAR_partyMemberAIOptions 0x519DB8 #define FO_VAR_partyMemberCount 0x519DAC #define FO_VAR_partyMemberLevelUpInfoList 0x519DBC diff --git a/sfall/Modules/Scripting/Handlers/Interface.cpp b/sfall/Modules/Scripting/Handlers/Interface.cpp index b8e2ed51..13b77615 100644 --- a/sfall/Modules/Scripting/Handlers/Interface.cpp +++ b/sfall/Modules/Scripting/Handlers/Interface.cpp @@ -458,6 +458,45 @@ void mf_set_window_flag(OpcodeContext& ctx) { } } +static void __fastcall FreeArtFile(fo::FrmFile* frmPtr) { + if (frmPtr->id == 'PCX') { + __asm mov eax, frmPtr; + __asm mov eax, [eax]frmPtr.pixelData; + __asm call ds:[FO_VAR_freePtr]; + delete[] frmPtr; + } else { + __asm mov eax, frmPtr; + __asm call fo::funcoffs::my_free_; + } +} + +static fo::FrmFile* LoadArtFile(const char* file, long frame, long direction, fo::FrmFrameData* &framePtr, bool checkPCX) { + fo::FrmFile* frmPtr = nullptr; + if (checkPCX) { + const char* pos = strrchr(file, '.'); + if (pos && _stricmp(pos, ".PCX") == 0) { + long w, h; + BYTE* data = fo::func::loadPCX(file, &w, &h); + if (!data) return nullptr; + + frmPtr = reinterpret_cast(new BYTE[78]); + std::memset(frmPtr, 0, 74); + + frmPtr->id = 'PCX'; + frmPtr->width = static_cast(w); + frmPtr->height = static_cast(h); + frmPtr->pixelData = data; + framePtr = frmPtr->GetFrameData(0, 0); + return frmPtr; + } + } + if (fo::func::load_frame(file, &frmPtr)) { + return nullptr; + } + framePtr = frmPtr->GetFrameData(direction, frame); + return frmPtr; +} + static long GetArtFIDFile(long fid, const char* &file) { long direction = 0; long _fid = fid & 0xFFFFFFF; @@ -471,16 +510,6 @@ static long GetArtFIDFile(long fid, const char* &file) { return direction; } -static fo::FrmFile* LoadArtFile(const char* file, long frame, long direction, fo::FrmFrameData* &framePtr) { - fo::FrmFile* frmPtr = nullptr; - if (fo::func::load_frame(file, &frmPtr)) { - return nullptr; - } - framePtr = frmPtr->GetFrameData(direction, frame); - - return frmPtr; -} - static long DrawImage(OpcodeContext& ctx, bool isScaled) { if (*(DWORD*)FO_VAR_currentWindow == -1) { ctx.printOpcodeError("%s() - no created/selected window for the image.", ctx.getMetaruleName()); @@ -488,7 +517,9 @@ static long DrawImage(OpcodeContext& ctx, bool isScaled) { } long direction = 0; const char* file = nullptr; - if (ctx.arg(0).isInt()) { // art id + + bool isID = ctx.arg(0).isInt(); + if (isID) { // art id long fid = ctx.arg(0).rawValue(); if (fid == -1) return -1; @@ -498,15 +529,16 @@ static long DrawImage(OpcodeContext& ctx, bool isScaled) { } fo::FrmFrameData* framePtr; - fo::FrmFile* frmPtr = LoadArtFile(file, ctx.arg(1).rawValue(), direction, framePtr); + fo::FrmFile* frmPtr = LoadArtFile(file, ctx.arg(1).rawValue(), direction, framePtr, !isID); if (frmPtr == nullptr) { ctx.printOpcodeError("%s() - cannot open the file: %s", ctx.getMetaruleName(), file); return -1; } long result = 1; + BYTE* pixelData = (frmPtr->id == 'PCX') ? frmPtr->pixelData : framePtr->data; if (isScaled && ctx.numArgs() < 3) { - fo::func::displayInWindow(framePtr->width, framePtr->width, framePtr->height, framePtr->data); // scaled to window size (w/o transparent) + fo::func::displayInWindow(framePtr->width, framePtr->width, framePtr->height, pixelData); // scaled to window size (w/o transparent) } else { int x = ctx.arg(2).rawValue(), y = ctx.arg(3).rawValue(); if (isScaled) { // draw to scale @@ -531,14 +563,14 @@ static long DrawImage(OpcodeContext& ctx, bool isScaled) { long w_width = fo::func::windowWidth(); long xy_pos = (y * w_width) + x; - fo::func::window_trans_cscale(framePtr->width, framePtr->height, s_width, s_height, xy_pos, w_width, framePtr->data); // custom scaling + fo::func::window_trans_cscale(framePtr->width, framePtr->height, s_width, s_height, xy_pos, w_width, pixelData); // custom scaling } else { // with x/y frame offsets - fo::func::windowDisplayBuf(x + frmPtr->xshift[direction], framePtr->width, y + frmPtr->yshift[direction], framePtr->height, framePtr->data, ctx.arg(4).rawValue()); + fo::func::windowDisplayBuf(x + frmPtr->xshift[direction], framePtr->width, y + frmPtr->yshift[direction], framePtr->height, pixelData, ctx.arg(4).rawValue()); } } exit: - fo::func::mem_free(frmPtr); + FreeArtFile(frmPtr); return result; } @@ -555,7 +587,8 @@ static long InterfaceDrawImage(OpcodeContext& ctx, fo::Window* interfaceWin) { bool useShift = false; long direction = -1, w = -1, h = -1; - if (ctx.arg(1).isInt()) { // art id + bool isID = ctx.arg(1).isInt(); + if (isID) { // art id long fid = ctx.arg(1).rawValue(); if (fid == -1) return -1; @@ -577,7 +610,7 @@ static long InterfaceDrawImage(OpcodeContext& ctx, fo::Window* interfaceWin) { long frame = ctx.arg(4).rawValue(); fo::FrmFrameData* framePtr; - fo::FrmFile* frmPtr = LoadArtFile(file, frame, direction, framePtr); + fo::FrmFile* frmPtr = LoadArtFile(file, frame, direction, framePtr, !isID); if (frmPtr == nullptr) { ctx.printOpcodeError("%s() - cannot open the file: %s", ctx.getMetaruleName(), file); return -1; @@ -595,14 +628,15 @@ static long InterfaceDrawImage(OpcodeContext& ctx, fo::Window* interfaceWin) { int width = (w >= 0) ? w : framePtr->width; int height = (h >= 0) ? h : framePtr->height; - fo::func::trans_cscale(framePtr->data, framePtr->width, framePtr->height, framePtr->width, + fo::func::trans_cscale(((frmPtr->id == 'PCX') ? frmPtr->pixelData : framePtr->data), framePtr->width, framePtr->height, framePtr->width, interfaceWin->surface + (y * interfaceWin->width) + x, width, height, interfaceWin->width ); if (!(ctx.arg(0).rawValue() & 0x1000000)) { fo::func::GNW_win_refresh(interfaceWin, &interfaceWin->rect, 0); } - fo::func::mem_free(frmPtr); + + FreeArtFile(frmPtr); return 1; } @@ -699,10 +733,10 @@ void mf_get_window_attribute(OpcodeContext& ctx) { result = 1; break; case 1: // x - result = win->wRect.left; + result = win->rect.x; break; case 2: // y - result = win->wRect.top; + result = win->rect.y; break; } ctx.setReturn(result); diff --git a/sfall/Modules/TalkingHeads.cpp b/sfall/Modules/TalkingHeads.cpp index 7bc7ed9c..c762b84c 100644 --- a/sfall/Modules/TalkingHeads.cpp +++ b/sfall/Modules/TalkingHeads.cpp @@ -172,22 +172,24 @@ static bool LoadFrm(Frm* frm) { return true; } -static fo::Window* dialogWin = nullptr; +static long dialogWinX = 0, dialogWinY = 0; static void __fastcall DrawHeadFrame(Frm* frm, int frameno) { if (frm && !frm->broken) { if (!frm->loaded && !LoadFrm(frm)) goto loadFail; fo::FrmFrameData* frame = fo::func::frame_ptr((fo::FrmHeaderData*)frm, frameno, 0); - if (dialogWin == nullptr) { - dialogWin = fo::func::GNW_find(fo::var::dialogueBackWindow); - if (texHighlight) Graphics::SetHighlightTexture(texHighlight, dialogWin->wRect.left, dialogWin->wRect.top); + if (dialogWinX == -1) { + fo::Window* dialogWin = fo::func::GNW_find(fo::var::dialogueBackWindow); + if (texHighlight) Graphics::SetHighlightTexture(texHighlight, dialogWin->rect.x, dialogWin->rect.y); + dialogWinX = dialogWin->rect.x; + dialogWinY = dialogWin->rect.y; } Graphics::SetHeadTex(frm->textures[frameno], frame->width, frame->height, - frame->x + frm->xshift + dialogWin->wRect.left, - frame->y + frm->yshift + dialogWin->wRect.top, + frame->x + frm->xshift + dialogWinX, + frame->y + frm->yshift + dialogWinY, (frm->showHighlights == 2) ); showHighlights = frm->showHighlights; @@ -217,7 +219,7 @@ void __declspec(naked) gdDestroyHeadWindow_hack() { __asm { call Graphics::SetDefaultTechnique; mov showHighlights, 0; - //mov dialogWin, 0; // uncomment if the dialog window position is supposed to change + //mov dialogWinX, -1; // uncomment if the dialog window position is supposed to change pop ebp; pop edi; pop edx; diff --git a/sfall/version.h b/sfall/version.h index 80a73cb4..fed7a225 100644 --- a/sfall/version.h +++ b/sfall/version.h @@ -25,6 +25,6 @@ #define VERSION_MAJOR 4 #define VERSION_MINOR 2 #define VERSION_BUILD 8 -#define VERSION_REV 0 +#define VERSION_REV 1 -#define VERSION_STRING "4.2.8" +#define VERSION_STRING "4.2.8.1" From 65c4cf644a3ae756854a8ed7647361908314489f Mon Sep 17 00:00:00 2001 From: NovaRain Date: Sat, 24 Oct 2020 12:56:26 +0800 Subject: [PATCH 3/6] Added "win_fill_color" script function --- artifacts/scripting/headers/sfall.h | 2 + artifacts/scripting/sfall function notes.txt | 9 ++- sfall/FalloutEngine/EngineUtils.cpp | 18 ++++- sfall/FalloutEngine/EngineUtils.h | 5 +- sfall/FalloutEngine/Functions_def.h | 1 + sfall/FalloutEngine/Structs.h | 69 ++++++++++++------- .../Modules/Scripting/Handlers/Interface.cpp | 18 ++++- sfall/Modules/Scripting/Handlers/Interface.h | 2 + sfall/Modules/Scripting/Handlers/Metarule.cpp | 1 + sfall/Modules/TalkingHeads.cpp | 17 +++-- 10 files changed, 103 insertions(+), 39 deletions(-) diff --git a/artifacts/scripting/headers/sfall.h b/artifacts/scripting/headers/sfall.h index 1bd44389..61cd9060 100644 --- a/artifacts/scripting/headers/sfall.h +++ b/artifacts/scripting/headers/sfall.h @@ -294,6 +294,7 @@ #define art_cache_clear sfall_func0("art_cache_clear") #define attack_is_aimed sfall_func0("attack_is_aimed") #define car_gas_amount sfall_func0("car_gas_amount") +#define clear_window sfall_func0("win_fill_color") #define combat_data sfall_func0("combat_data") #define create_win(winName, x, y, w, h) sfall_func5("create_win", winName, x, y, w, h) #define create_win_flag(winName, x, y, w, h, flag) sfall_func6("create_win", winName, x, y, w, h, flag) @@ -384,6 +385,7 @@ #define unjam_lock(obj) sfall_func1("unjam_lock", obj) #define unset_unique_id(obj) sfall_func2("set_unique_id", obj, -1) #define unwield_slot(critter, slot) sfall_func2("unwield_slot", critter, slot) +#define win_fill_color(x, y, width, height, color) sfall_func5("win_fill_color", x, y, width, height, color) #define set_fake_perk_npc(npc, perk, level, image, desc) sfall_func5("set_fake_perk_npc", npc, perk, level, image, desc) #define set_fake_trait_npc(npc, trait, active, image, desc) sfall_func5("set_fake_trait_npc", npc, trait, active, image, desc) diff --git a/artifacts/scripting/sfall function notes.txt b/artifacts/scripting/sfall function notes.txt index ef459784..0c0951b1 100644 --- a/artifacts/scripting/sfall function notes.txt +++ b/artifacts/scripting/sfall function notes.txt @@ -732,7 +732,7 @@ optional argument: - message: the text in the dialog box. Use the '\n' control character to move text to a new line (example: "Hello\nWorld!") optional arguments: - flags: mode flags (see MSGBOX_* constants in define_extra.h). Pass -1 to skip setting the flags (default flags are NORMAL and YESNO) -- color1/color2: the color index in Fallout palette. color1 sets the text color for the first line, and color2 for all subsequent lines of text (default color is 145) +- color1/color2: the color index in the game palette. color1 sets the text color for the first line, and color2 for all subsequent lines of text (default color is 145) > int sfall_func1("get_stat_min", int stat) > int sfall_func1("get_stat_max", int stat) @@ -762,7 +762,7 @@ optional arguments: - text: the text to be printed. Use the '\n' control character to move text to a new line (example: "Hello\nWorld!") - winType: the type number of the interface window (see WINTYPE_* constants in sfall.h) - x/y: offset relative to the top-left corner of the window -- color: the color index in Fallout palette. Pass 0 if the text color was previously set by vanilla SetTextColor function +- color: the color index in the game palette. Pass 0 if the text color was previously set by vanilla SetTextColor function it can also take additional flags (via bwor) for displaying text: 0x0010000 - adds a shadow to the text, the 'textshadow' compiler constant 0x1000000 - prevents immediate redrawing of the interface window, the 'textdirect' compiler constant (works the other way around) @@ -774,6 +774,11 @@ optional arguments: - can be used in conjunction with the get_object_data and set_object_data functions example: sfall_func3("set_object_data", sfall_func0("combat_data"), C_ATTACK_UNUSED, 255); +> int sfall_func0("win_fill_color") +> int sfall_func5("win_fill_color", int x, int y, int width, int height, int color) +- fills the rectangle area of the currently selected script window with the specified color, or clears the entire window with transparent color (called without arguments) +- color: the color index in the game palette (from 0 to 255) + ------------------------ ------ MORE INFO ------- ------------------------ diff --git a/sfall/FalloutEngine/EngineUtils.cpp b/sfall/FalloutEngine/EngineUtils.cpp index 6b649774..7fec3827 100644 --- a/sfall/FalloutEngine/EngineUtils.cpp +++ b/sfall/FalloutEngine/EngineUtils.cpp @@ -366,11 +366,25 @@ void DrawToSurface(long width, long height, long fromX, long fromY, long fromWid } } -// Fills the specified non-scripted interface window with index color 0 (black color) +// Fills the specified interface window with index color +void WinFillRect(long winID, long x, long y, long width, long height, BYTE indexColor) { + fo::Window* win = fo::func::GNW_find(winID); + BYTE* surf = win->surface + (win->width * y) + x; + long pitch = win->width - width; + while (height--) { + long w = width; + while (w--) *surf++ = indexColor; + surf += pitch; + }; +} + +// Fills the specified interface window with index color 0 (black color) void ClearWindow(long winID, bool refresh) { fo::Window* win = fo::func::GNW_find(winID); + BYTE* surf = win->surface; for (long i = 0; i < win->height; i++) { - std::memset(win->surface, 0, win->width); + std::memset(surf, 0, win->width); + surf += win->width; } if (refresh) { fo::func::GNW_win_refresh(win, &win->rect, 0); diff --git a/sfall/FalloutEngine/EngineUtils.h b/sfall/FalloutEngine/EngineUtils.h index 0f27a422..8035be38 100644 --- a/sfall/FalloutEngine/EngineUtils.h +++ b/sfall/FalloutEngine/EngineUtils.h @@ -115,7 +115,10 @@ void DrawToSurface(long width, long height, long fromX, long fromY, long fromWid void DrawToSurface(long width, long height, long fromX, long fromY, long fromWidth, BYTE* fromSurf, long toX, long toY, long toWidth, long toHeight, BYTE* toSurf); -// Fills the specified non-scripted interface window with index color 0 (black color) +// Fills the specified interface window with index color +void WinFillRect(long winID, long x, long y, long width, long height, BYTE indexColor); + +// Fills the specified interface window with index color 0 (black color) void ClearWindow(long winID, bool refresh = true); // Print text to surface diff --git a/sfall/FalloutEngine/Functions_def.h b/sfall/FalloutEngine/Functions_def.h index 9ebb178d..2d0242ad 100644 --- a/sfall/FalloutEngine/Functions_def.h +++ b/sfall/FalloutEngine/Functions_def.h @@ -234,6 +234,7 @@ WRAP_WATCOM_FUNC3(long, register_object_take_out, GameObject*, object, long, hol WRAP_WATCOM_FUNC3(long, register_object_turn_towards, GameObject*, object, long, tileNum, long, nothing) WRAP_WATCOM_FUNC2(long, roll_random, long, minValue, long, maxValue) WRAP_WATCOM_FUNC1(long*, runProgram, Program*, progPtr) +WRAP_WATCOM_FUNC1(long, selectWindowID, long, sWinID) WRAP_WATCOM_FUNC1(ScriptInstance*, scr_find_first_at, long, elevation) WRAP_WATCOM_FUNC0(ScriptInstance*, scr_find_next_at) WRAP_WATCOM_FUNC1(GameObject*, scr_find_obj_from_program, Program*, program) diff --git a/sfall/FalloutEngine/Structs.h b/sfall/FalloutEngine/Structs.h index 015bd4b2..35d59eec 100644 --- a/sfall/FalloutEngine/Structs.h +++ b/sfall/FalloutEngine/Structs.h @@ -188,8 +188,7 @@ struct CombatGcsd { struct ScriptInstance { long id; long next; - // first 3 bits - elevation, rest - tile number - long elevationAndTile; + long elevationAndTile; // first 3 bits - elevation, rest - tile number long spatialRadius; long flags; long scriptIdx; @@ -205,31 +204,50 @@ struct ScriptInstance { GameObject *targetObject; long actionNum; long scriptOverrides; - char gap_48[4]; + long field_48; long howMuch; - char gap_50[4]; + long field_50; long procedureTable[28]; }; // Script run-time data struct Program { - const char* fileName; + const char* fileName; // path and file name of the script "scripts\*.int" long *codeStackPtr; - long gap_8; - long gap_9; + long field_8; + long field_C; long *codePtr; long field_14; - long gap_18; + long field_18; long *dStackPtr; long *aStackPtr; long *dStackOffs; long *aStackOffs; - long gap_2C; + long field_2C; long *stringRefPtr; - long gap_34; - long *procTablePtr; + long field_34; // procTablePtr + long *procTablePtr; // field_38 + long regs[12]; + long field_6C; + long field_70; + long field_74; + long field_78; + long field_7C; + union { + long flags; + struct { + char flags1; + char flags2; + char flags3; + char flags4; + }; + }; + long currentScriptWin; // current window for executing script + long field_88; }; +static_assert(sizeof(Program) == 140, "Incorrect Program definition."); + struct ItemButtonItem { GameObject* item; union { @@ -584,8 +602,7 @@ struct Proto { long flags; long flagsExt; - // 0x0Y00XXXX: Y - script type (0=s_system, 1=s_spatial, 2=s_time, 3=s_item, 4=s_critter); XXXX - number in scripts.lst. -1 means no script. - long scriptId; + long scriptId; // 0x0Y00XXXX: Y - script type (0=s_system, 1=s_spatial, 2=s_time, 3=s_item, 4=s_critter); XXXX - number in scripts.lst. -1 means no script. ItemType type; union { @@ -730,14 +747,14 @@ struct Window { long width; long height; long clearColour; - long rand1; - long rand2; + long randX; + long randY; BYTE *surface; // bytes frame data ref to palette long *buttonsList; - long unknown5; // buttonptr? - long unknown6; + long buttonT1; // buttonptr? + long buttonT2; long *menuBar; - long *drawFunc; + long *drawFunc; // trans_buf_to_buf_ }; struct sWindow { @@ -745,18 +762,18 @@ struct sWindow { long wID; long width; long height; - long unknown1; - long unknown2; - long unknown3; - long unknown4; + long region1; + long region2; + long region3; + long region4; long *buttons; long numButtons; - long unknown5; - long unknown6; + long setPositionX; + long setPositionY; long clearColour; long flags; - long unknown7; - long unknown8; + float randX; + float randY; }; struct LSData { diff --git a/sfall/Modules/Scripting/Handlers/Interface.cpp b/sfall/Modules/Scripting/Handlers/Interface.cpp index 13b77615..619b8f14 100644 --- a/sfall/Modules/Scripting/Handlers/Interface.cpp +++ b/sfall/Modules/Scripting/Handlers/Interface.cpp @@ -474,7 +474,7 @@ static fo::FrmFile* LoadArtFile(const char* file, long frame, long direction, fo fo::FrmFile* frmPtr = nullptr; if (checkPCX) { const char* pos = strrchr(file, '.'); - if (pos && _stricmp(pos, ".PCX") == 0) { + if (pos && _stricmp(++pos, "PCX") == 0) { long w, h; BYTE* data = fo::func::loadPCX(file, &w, &h); if (!data) return nullptr; @@ -511,6 +511,7 @@ static long GetArtFIDFile(long fid, const char* &file) { } static long DrawImage(OpcodeContext& ctx, bool isScaled) { + fo::func::selectWindowID(ctx.program()->currentScriptWin); if (*(DWORD*)FO_VAR_currentWindow == -1) { ctx.printOpcodeError("%s() - no created/selected window for the image.", ctx.getMetaruleName()); return 0; @@ -782,5 +783,20 @@ void mf_interface_print(OpcodeContext& ctx) { // same as vanilla PrintRect if (!(color & 0x1000000)) fo::func::GNW_win_refresh(win, &win->rect, 0); } +void mf_win_fill_color(OpcodeContext& ctx) { + fo::func::selectWindowID(ctx.program()->currentScriptWin); + long iWin = *(DWORD*)FO_VAR_currentWindow; + if (iWin == -1) { + ctx.printOpcodeError("%s() - no created or selected window.", ctx.getMetaruleName()); + ctx.setReturn(-1); + return; + } + if (ctx.numArgs() > 0) { + fo::WinFillRect(fo::var::sWindows[iWin].wID, ctx.arg(0).rawValue(), ctx.arg(1).rawValue(), ctx.arg(2).rawValue(), ctx.arg(3).rawValue(), (BYTE)ctx.arg(4).rawValue()); + } else { + fo::ClearWindow(fo::var::sWindows[iWin].wID, false); // full clear + } +} + } } diff --git a/sfall/Modules/Scripting/Handlers/Interface.h b/sfall/Modules/Scripting/Handlers/Interface.h index 332f50f4..fda2a9c8 100644 --- a/sfall/Modules/Scripting/Handlers/Interface.h +++ b/sfall/Modules/Scripting/Handlers/Interface.h @@ -119,5 +119,7 @@ void mf_get_window_attribute(OpcodeContext&); void mf_interface_print(OpcodeContext&); +void mf_win_fill_color(OpcodeContext&); + } } diff --git a/sfall/Modules/Scripting/Handlers/Metarule.cpp b/sfall/Modules/Scripting/Handlers/Metarule.cpp index db55a41c..3794d01d 100644 --- a/sfall/Modules/Scripting/Handlers/Metarule.cpp +++ b/sfall/Modules/Scripting/Handlers/Metarule.cpp @@ -150,6 +150,7 @@ static const SfallMetarule metarules[] = { {"tile_refresh_display", mf_tile_refresh_display, 0, 0}, {"unjam_lock", mf_unjam_lock, 1, 1, -1, {ARG_OBJECT}}, {"unwield_slot", mf_unwield_slot, 2, 2, -1, {ARG_OBJECT, ARG_INT}}, + {"win_fill_color", mf_win_fill_color, 0, 5, -1, {ARG_INT, ARG_INT, ARG_INT, ARG_INT, ARG_INT}}, #ifndef NDEBUG {"validate_test", mf_test, 2, 5, -1, {ARG_INT, ARG_NUMBER, ARG_STRING, ARG_OBJECT, ARG_ANY}}, #endif diff --git a/sfall/Modules/TalkingHeads.cpp b/sfall/Modules/TalkingHeads.cpp index c762b84c..41dbe032 100644 --- a/sfall/Modules/TalkingHeads.cpp +++ b/sfall/Modules/TalkingHeads.cpp @@ -172,24 +172,27 @@ static bool LoadFrm(Frm* frm) { return true; } -static long dialogWinX = 0, dialogWinY = 0; +static struct DialogWinPos { + long x = -1; + long y; +} dialogWinPos; static void __fastcall DrawHeadFrame(Frm* frm, int frameno) { if (frm && !frm->broken) { if (!frm->loaded && !LoadFrm(frm)) goto loadFail; fo::FrmFrameData* frame = fo::func::frame_ptr((fo::FrmHeaderData*)frm, frameno, 0); - if (dialogWinX == -1) { + if (dialogWinPos.x == -1) { fo::Window* dialogWin = fo::func::GNW_find(fo::var::dialogueBackWindow); if (texHighlight) Graphics::SetHighlightTexture(texHighlight, dialogWin->rect.x, dialogWin->rect.y); - dialogWinX = dialogWin->rect.x; - dialogWinY = dialogWin->rect.y; + dialogWinPos.x = dialogWin->rect.x; + dialogWinPos.y = dialogWin->rect.y; } Graphics::SetHeadTex(frm->textures[frameno], frame->width, frame->height, - frame->x + frm->xshift + dialogWinX, - frame->y + frm->yshift + dialogWinY, + frame->x + frm->xshift + dialogWinPos.x, + frame->y + frm->yshift + dialogWinPos.y, (frm->showHighlights == 2) ); showHighlights = frm->showHighlights; @@ -219,7 +222,7 @@ void __declspec(naked) gdDestroyHeadWindow_hack() { __asm { call Graphics::SetDefaultTechnique; mov showHighlights, 0; - //mov dialogWinX, -1; // uncomment if the dialog window position is supposed to change + //mov dword ptr ds:[dialogWinPos], -1; // uncomment if the dialog window position is supposed to change pop ebp; pop edi; pop edx; From f8aa6c449acbeb000cce23d9d79fca9247c460a7 Mon Sep 17 00:00:00 2001 From: NovaRain Date: Sun, 25 Oct 2020 08:05:20 +0800 Subject: [PATCH 4/6] Fixed the error handling in win_fill_color Some code fixes. --- sfall/Modules/Interface.cpp | 10 ++++------ sfall/Modules/Scripting/Handlers/Interface.cpp | 9 ++++----- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/sfall/Modules/Interface.cpp b/sfall/Modules/Interface.cpp index 6ee14fa0..2c12ce29 100644 --- a/sfall/Modules/Interface.cpp +++ b/sfall/Modules/Interface.cpp @@ -939,14 +939,12 @@ static void __declspec(naked) main_death_scene_hook() { } static void __declspec(naked) display_body_hook() { - static const DWORD display_body_hook_Ret = 0x47098D; __asm { mov ebx, [esp + 0x60 - 0x28 + 8]; cmp ebx, 1; // check mode 0 or 1 jbe fix; - add esp, 8; - mov dword ptr [esp + 0x60 - 0x40], 0; // frm_ptr - jmp display_body_hook_Ret; + xor ebx, ebx; + jmp fo::funcoffs::art_id_; fix: dec edx; // USE.FRM mov ecx, 48; // INVBOX.FRM @@ -987,7 +985,7 @@ void Interface::init() { if (hrpIsEnabled == false || hrpVersionValid) SafeWrite8(0x481345, 4); // main_death_scene_ if (hrpVersionValid) SafeWrite8(HRPAddress(0x10011738), 10); - // Cosmetic fix for the background image of the character portrait on the inventory and character screens + // Cosmetic fix for the background image of the character portrait on the player's inventory screen HookCall(0x47093C, display_body_hook); BYTE code[11] = { 0x8B, 0xD3, // mov edx, ebx @@ -995,7 +993,7 @@ void Interface::init() { 0x0F, 0xAF, 0xD3, // imul edx, ebx (y * frame width) 0x53, 0x90 // push ebx (frame width) }; - SafeWriteBytes(0x470971, code, 11); + SafeWriteBytes(0x470971, code, 11); // calculates the offset in the pixel array for x/y coordinates } void Interface::exit() { diff --git a/sfall/Modules/Scripting/Handlers/Interface.cpp b/sfall/Modules/Scripting/Handlers/Interface.cpp index 619b8f14..74b10394 100644 --- a/sfall/Modules/Scripting/Handlers/Interface.cpp +++ b/sfall/Modules/Scripting/Handlers/Interface.cpp @@ -511,9 +511,8 @@ static long GetArtFIDFile(long fid, const char* &file) { } static long DrawImage(OpcodeContext& ctx, bool isScaled) { - fo::func::selectWindowID(ctx.program()->currentScriptWin); - if (*(DWORD*)FO_VAR_currentWindow == -1) { - ctx.printOpcodeError("%s() - no created/selected window for the image.", ctx.getMetaruleName()); + if (!fo::func::selectWindowID(ctx.program()->currentScriptWin) || *(DWORD*)FO_VAR_currentWindow == -1) { + ctx.printOpcodeError("%s() - no created or selected window.", ctx.getMetaruleName()); return 0; } long direction = 0; @@ -784,9 +783,9 @@ void mf_interface_print(OpcodeContext& ctx) { // same as vanilla PrintRect } void mf_win_fill_color(OpcodeContext& ctx) { - fo::func::selectWindowID(ctx.program()->currentScriptWin); + long result = fo::func::selectWindowID(ctx.program()->currentScriptWin); long iWin = *(DWORD*)FO_VAR_currentWindow; - if (iWin == -1) { + if (!result || iWin == -1) { ctx.printOpcodeError("%s() - no created or selected window.", ctx.getMetaruleName()); ctx.setReturn(-1); return; From dcbd6b5a235b3087219dc93202cc3836eef02645 Mon Sep 17 00:00:00 2001 From: NovaRain Date: Mon, 26 Oct 2020 11:20:26 +0800 Subject: [PATCH 5/6] Cleaned up define_lite.h and command_lite.h Commented out the empty exit() in Message module. Minor code edits. --- artifacts/scripting/headers/command_lite.h | 196 +++-------- artifacts/scripting/headers/define_lite.h | 333 +++++++----------- artifacts/scripting/sfall function notes.txt | 2 +- sfall/Modules/Message.cpp | 4 +- sfall/Modules/Message.h | 2 +- .../Modules/Scripting/Handlers/Interface.cpp | 8 +- sfall/Modules/Scripting/OpcodeContext.cpp | 2 +- sfall/Modules/Scripting/OpcodeContext.h | 17 +- 8 files changed, 189 insertions(+), 375 deletions(-) diff --git a/artifacts/scripting/headers/command_lite.h b/artifacts/scripting/headers/command_lite.h index a0113d2d..9c116754 100644 --- a/artifacts/scripting/headers/command_lite.h +++ b/artifacts/scripting/headers/command_lite.h @@ -1,13 +1,9 @@ -/* - Copyright 1998-2003 Interplay Entertainment Corp. All rights reserved. -*/ +#ifndef COMMAND_H +#define COMMAND_H -#ifndef COMMAND_LITE_H -#define COMMAND_LITE_H - - -#define critter_is_armed(x) (((obj_item_subtype(critter_inven_obj(x,INVEN_TYPE_RIGHT_HAND))) == item_type_weapon) or \ +#define critter_is_armed(x) (((obj_item_subtype(critter_inven_obj(x,INVEN_TYPE_RIGHT_HAND))) == item_type_weapon) orElse \ ((obj_item_subtype(critter_inven_obj(x,INVEN_TYPE_LEFT_HAND))) == item_type_weapon)) + #define critter_weight(x) (100 + ((get_critter_stat(x,STAT_gender) == GENDER_MALE) * 50) + (get_critter_stat(x,STAT_st) * 5) - ((get_critter_stat(x,STAT_ag) + get_critter_stat(x,STAT_en))/3)) #define critter_wearing_armor(x) (obj_item_subtype(critter_inven_obj(x,INVEN_TYPE_WORN)) == item_type_armor) @@ -21,15 +17,13 @@ #define dude_iq (get_critter_stat(dude_obj,STAT_iq)) #define dude_agility (get_critter_stat(dude_obj,STAT_ag)) #define dude_luck (get_critter_stat(dude_obj,STAT_lu)) -#ifndef dude_level #define dude_level (get_pc_stat(PCSTAT_level)) -#endif #define dude_age (get_critter_stat(dude_obj,STAT_age)) #define dude_weight critter_weight(dude_obj) #define dude_cur_carry who_carry_amount(dude_obj) #define dude_max_carry who_max_carry(dude_obj) -#define dude_moron_not_vegetable (((get_critter_stat(dude_obj,STAT_iq)) > 1) and ((get_critter_stat(dude_obj,STAT_iq)) < 3) ) +#define dude_moron_not_vegetable (((get_critter_stat(dude_obj,STAT_iq)) > 1) andAlso ((get_critter_stat(dude_obj,STAT_iq)) < 3) ) #define dude_is_male (dude_gender == GENDER_MALE) #define dude_is_female (dude_gender == GENDER_FEMALE) @@ -41,43 +35,50 @@ (obj_is_carrying_obj_pid(dude_obj, PID_ADVANCED_POWER_ARMOR_MK2)) + \ (obj_is_carrying_obj_pid(dude_obj, PID_HARDENED_POWER_ARMOR))) > 0) -#define dude_wielding_knife ((obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_RIGHT_HAND)) == PID_KNIFE) or \ - (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_RIGHT_HAND)) == PID_THROWING_KNIFE) or \ - (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_RIGHT_HAND)) == PID_RIPPER) or \ - (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_RIGHT_HAND)) == PID_COMBAT_KNIFE) or \ - (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_LEFT_HAND)) == PID_KNIFE) or \ - (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_LEFT_HAND)) == PID_THROWING_KNIFE) or \ - (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_LEFT_HAND)) == PID_RIPPER) or \ - (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_LEFT_HAND)) == PID_COMBAT_KNIFE)) +#define dude_wielding_knife ((obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_RIGHT_HAND)) == PID_KNIFE) orElse \ + (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_RIGHT_HAND)) == PID_THROWING_KNIFE) orElse \ + (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_RIGHT_HAND)) == PID_RIPPER) orElse \ + (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_RIGHT_HAND)) == PID_COMBAT_KNIFE) orElse \ + (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_RIGHT_HAND)) == PID_SWITCHBLADE) orElse \ + (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_RIGHT_HAND)) == PID_SHIV) orElse \ + (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_RIGHT_HAND)) == PID_LIL_JESUS_WEAPON) orElse \ + (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_RIGHT_HAND)) == PID_WAKIZASHI_BLADE) orElse \ + (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_LEFT_HAND)) == PID_KNIFE) orElse \ + (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_LEFT_HAND)) == PID_THROWING_KNIFE) orElse \ + (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_LEFT_HAND)) == PID_RIPPER) orElse \ + (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_LEFT_HAND)) == PID_COMBAT_KNIFE) orElse \ + (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_LEFT_HAND)) == PID_SWITCHBLADE) orElse \ + (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_LEFT_HAND)) == PID_SHIV) orElse \ + (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_LEFT_HAND)) == PID_LIL_JESUS_WEAPON) orElse \ + (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_LEFT_HAND)) == PID_WAKIZASHI_BLADE)) -#define dude_wearing_power_armor ((obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_POWERED_ARMOR) or \ - (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_ADVANCED_POWER_ARMOR) or \ - (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_ADVANCED_POWER_ARMOR_MK2) or \ +#define dude_wearing_power_armor ((obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_POWERED_ARMOR) orElse \ + (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_ADVANCED_POWER_ARMOR) orElse \ + (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_ADVANCED_POWER_ARMOR_MK2) orElse \ (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_HARDENED_POWER_ARMOR)) -#define dude_wearing_leather_armor ((obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_LEATHER_ARMOR) or \ - (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_LEATHER_JACKET) or \ - (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_LEATHER_ARMOR_MK_II) or \ +#define dude_wearing_leather_armor ((obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_LEATHER_ARMOR) orElse \ + (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_LEATHER_JACKET) orElse \ + (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_LEATHER_ARMOR_MK_II) orElse \ (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_CURED_LEATHER_ARMOR)) -#define dude_wearing_combat_armor ((obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_COMBAT_ARMOR) or \ - (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_BROTHERHOOD_COMBAT_ARMOR) or \ +#define dude_wearing_combat_armor ((obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_COMBAT_ARMOR) orElse \ + (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_BROTHERHOOD_COMBAT_ARMOR) orElse \ (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_COMBAT_ARMOR_MK_II)) -#define dude_wearing_metal_armor ((obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_METAL_ARMOR) or \ +#define dude_wearing_metal_armor ((obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_METAL_ARMOR) orElse \ (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_METAL_ARMOR_MK_II)) -#define dude_wearing_vault_suit COND019(1) -#define dude_has_gambling_skills ((dude_iq > 3) and (has_skill(dude_obj, SKILL_GAMBLING) >= 25)) +#define dude_has_gambling_skills ((dude_iq > 3) andAlso (has_skill(dude_obj, SKILL_GAMBLING) >= 25)) #define dude_is_sneaking (using_skill(dude_obj,SKILL_SNEAK)) #define dude_is_walking (art_anim(obj_art_fid(dude_obj)) == ANIM_walk) #define dude_is_running (art_anim(obj_art_fid(dude_obj)) == ANIM_running) #define dude_is_poisoned (get_poison(dude_obj)) #define dude_is_irradiated (get_critter_stat(dude_obj, STAT_current_rad)) -#define dude_is_crippled ((critter_state(dude_obj) bwand DAM_CRIP_LEG_LEFT) or \ - (critter_state(dude_obj) bwand DAM_CRIP_LEG_RIGHT) or \ - (critter_state(dude_obj) bwand DAM_CRIP_ARM_LEFT) or \ +#define dude_is_crippled ((critter_state(dude_obj) bwand DAM_CRIP_LEG_LEFT) orElse \ + (critter_state(dude_obj) bwand DAM_CRIP_LEG_RIGHT) orElse \ + (critter_state(dude_obj) bwand DAM_CRIP_ARM_LEFT) orElse \ (critter_state(dude_obj) bwand DAM_CRIP_ARM_RIGHT)) #define dude_cur_rot (has_trait(TRAIT_OBJECT,dude_obj,OBJECT_CUR_ROT)) @@ -101,8 +102,6 @@ #define dude_has_car (global_var(GVAR_PLAYER_GOT_CAR)) #define dude_is_pornstar dude_has_porn_star_rep #define dude_is_high drug_influence(dude_obj) -#define dude_found_geck global_var(GVAR_VAULT13_FOUND_GECK) - #define dude_stat_win(X,Y) ((do_check(dude_obj,X,Y)) > (do_check(self_obj,X,0))) #define dude_stat_lose(X,Y) ((do_check(dude_obj,X,Y)) < (do_check(self_obj,X,0))) @@ -114,7 +113,6 @@ #define dude_is_addict (has_trait(TRAIT_TRAIT, dude_obj, TRAIT_drug_addict)) - #define self_name (obj_name(self_obj)) #define self_gender (get_critter_stat(self_obj,STAT_gender)) #define self_strength (get_critter_stat(self_obj,STAT_st)) @@ -130,7 +128,7 @@ #define self_is_armed critter_is_armed(self_obj) #define self_wearing_armor critter_wearing_armor(self_obj) -#define self_carrying_laser_pistol ((obj_pid(critter_inven_obj(self_obj,INVEN_TYPE_LEFT_HAND)) == PID_LASER_PISTOL) or \ +#define self_carrying_laser_pistol ((obj_pid(critter_inven_obj(self_obj,INVEN_TYPE_LEFT_HAND)) == PID_LASER_PISTOL) orElse \ (obj_pid(critter_inven_obj(self_obj,INVEN_TYPE_RIGHT_HAND)) == PID_LASER_PISTOL)) #define self_is_sneaking (using_skill(self_obj,SKILL_SNEAK)) @@ -171,23 +169,24 @@ // some timer event macros -#define check_set_obj_visiblility(the_obj, x) if (obj_is_visible_flag(the_obj) == x) then set_obj_visibility(the_obj, x) +#define check_set_obj_visiblility(the_obj, x) if (obj_is_visible_flag(the_obj) == x) then set_obj_visibility(the_obj, x) #define flush_add_timer_event(obj, time, param) rm_fixed_timer_event(obj, param); \ add_timer_event(obj, time, param) + #define flush_add_timer_event_sec(obj, sec, param) flush_add_timer_event(obj, game_ticks(sec), param) /****************************************************************** General commands getting information about time ******************************************************************/ -#define morning ((game_time_hour >= 600) and (game_time_hour < 700)) +#define morning ((game_time_hour >= 600) andAlso (game_time_hour < 700)) #ifndef day -#define day ((game_time_hour >= 700) and (game_time_hour < 1800)) +#define day ((game_time_hour >= 700) andAlso (game_time_hour < 1800)) #endif -#define evening ((game_time_hour >= 1800) and (game_time_hour < 1900)) +#define evening ((game_time_hour >= 1800) andAlso (game_time_hour < 1900)) #ifndef night -#define night ((game_time_hour >= 1900) or (game_time_hour < 600)) +#define night ((game_time_hour >= 1900) orElse (game_time_hour < 600)) #endif #define GAME_TIME_SUBSECOND_RESOLUTION (10) @@ -202,7 +201,6 @@ #define GAME_TIME_IN_MINUTES (game_time / (GAME_TIME_SUBSECOND_RESOLUTION * SECONDS_PER_MINUTE)) #define GAME_TIME_IN_SECONDS (game_time / GAME_TIME_SUBSECOND_RESOLUTION) - #define ticks_til_hour(x) ((ONE_GAME_DAY * (game_time_hour > (x))) + ((((x)/100) - (game_time_hour/100)) * ONE_GAME_HOUR) + ((((x)%100) - (game_time_hour%100)) * ONE_GAME_MINUTE)) #define game_time_advance_hour(x) game_time_advance(ticks_til_hour(x)) @@ -221,9 +219,7 @@ /*************************************************************** **************** Dialogue Information *********************** ***************************************************************/ -#ifndef floater - #define floater(x) float_msg(self_obj, message_str(NAME,x), FLOAT_COLOR_NORMAL) -#endif +#define floater(x) float_msg(self_obj, message_str(NAME,x), FLOAT_COLOR_NORMAL) #define floater_rand(x,y) floater(random(x,y)) #define dude_floater(x) float_msg(dude_obj, message_str(NAME,x), FLOAT_COLOR_NORMAL) @@ -231,7 +227,6 @@ #define dude_floater_bad(x) float_msg(dude_obj, message_str(NAME,x), FLOAT_COLOR_BAD) #define dude_floater_sick(x) float_msg(dude_obj, message_str(NAME,x), FLOAT_COLOR_SICK) - #define FLOAT_COLOR_NORMAL FLOAT_MSG_YELLOW #define FLOAT_COLOR_SICK FLOAT_MSG_GREEN #define FLOAT_COLOR_BAD FLOAT_MSG_RED @@ -337,9 +332,7 @@ ******************************************************************/ #define critter_is_male (get_critter_stat(self_obj,STAT_gender) == GENDER_MALE) #define critter_is_female (get_critter_stat(self_obj,STAT_gender) == GENDER_FEMALE) -/*#define critter_is_armed (((obj_item_subtype(critter_inven_obj(self_obj,INVEN_TYPE_RIGHT_HAND))) == item_type_weapon) \ - or ((obj_item_subtype(critter_inven_obj(self_obj,INVEN_TYPE_LEFT_HAND))) == item_type_weapon)) -*/ + /****************************************************************** General commands setting and getting the map exit ******************************************************************/ @@ -387,59 +380,12 @@ #define status_is_warned(status_var) (status_is(status_var, PERSON_WARNED)) #define status_is_sex(status_var) (status_is(status_var, PERSON_SEX)) -#define status_is_alive(status_var) (not (status_is_killed(status_var) or status_is_assassinated(status_var) or status_is_dead(status_var))) +#define status_is_alive(status_var) (not (status_is_killed(status_var) orElse status_is_assassinated(status_var) orElse status_is_dead(status_var))) /****************************************************************** General commands getting information about cities ******************************************************************/ -#define abbey_visible_on_map (town_known(AREA_ABBEY) != MARK_STATE_UNKNOWN) -#define arroyo_visible_on_map (town_known(AREA_ARROYO) != MARK_STATE_UNKNOWN) -#define broken_hills_visible_on_map (town_known(AREA_BROKEN_HILLS) != MARK_STATE_UNKNOWN) -#define colusa_visible_on_map (town_known(AREA_NAVARRO) != MARK_STATE_UNKNOWN) -#define den_visible_on_map (town_known(AREA_DEN) != MARK_STATE_UNKNOWN) -#define enclave_visible_on_map (town_known(AREA_THE_ENCLAVE) != MARK_STATE_UNKNOWN) -#define EPA_visible_on_map (town_known(AREA_EPA) != MARK_STATE_UNKNOWN) -#define gecko_visible_on_map (town_known(AREA_GECKO) != MARK_STATE_UNKNOWN) -#define klamath_visible_on_map (town_known(AREA_KLAMATH) != MARK_STATE_UNKNOWN) -#define military_base_visible_on_map (town_known(AREA_MILITARY_BASE) != MARK_STATE_UNKNOWN) -#define modoc_visible_on_map (town_known(AREA_MODOC) != MARK_STATE_UNKNOWN) -#define new_CA_republic_visible_on_map (town_known(AREA_NCR) != MARK_STATE_UNKNOWN) -#define primitive_tribe_visible_on_map (town_known(AREA_PRIMITIVE_TRIBE) != MARK_STATE_UNKNOWN) -#define redding_visible_on_map (town_known(AREA_REDDING) != MARK_STATE_UNKNOWN) -#define new_reno_visible_on_map (town_known(AREA_NEW_RENO) != MARK_STATE_UNKNOWN) -#define san_francisco_visible_on_map (town_known(AREA_SAN_FRANCISCO) != MARK_STATE_UNKNOWN) -#define sierra_army_base_visible_on_map (town_known(AREA_SIERRA_ARMY_BASE) != MARK_STATE_UNKNOWN) -#define vault_13_visible_on_map (town_known(AREA_VAULT_13) != MARK_STATE_UNKNOWN) -#define vault_15_visible_on_map (town_known(AREA_VAULT_15) != MARK_STATE_UNKNOWN) -#define vault_city_visible_on_map (town_known(AREA_VAULT_CITY) != MARK_STATE_UNKNOWN) -#define vault_fake_13A_visible_on_map (town_known(AREA_FAKE_VAULT_13A) != MARK_STATE_UNKNOWN) -#define vault_fake_13B_visible_on_map (town_known(AREA_FAKE_VAULT_13B) != MARK_STATE_UNKNOWN) - -#define abbey_visit (town_known(AREA_ABBEY) == MARK_STATE_VISITED) -#define arroyo_visit (town_known(AREA_ARROYO) == MARK_STATE_VISITED) -#define broken_hills_visit (town_known(AREA_BROKEN_HILLS) == MARK_STATE_VISITED) -#define colusa_visit (town_known(AREA_NAVARRO) == MARK_STATE_VISITED) -#define den_visit (town_known(AREA_DEN) == MARK_STATE_VISITED) -#define enclave_visit (town_known(AREA_THE_ENCLAVE) == MARK_STATE_VISITED) -#define EPA_visit (town_known(AREA_EPA) == MARK_STATE_VISITED) -#define gecko_visit (town_known(AREA_GECKO) == MARK_STATE_VISITED) -#define klamath_visit (town_known(AREA_KLAMATH) == MARK_STATE_VISITED) -#define military_base_visit (town_known(AREA_MILITARY_BASE) == MARK_STATE_VISITED) -#define modoc_visit (town_known(AREA_MODOC) == MARK_STATE_VISITED) -#define new_CA_republic_visit (town_known(AREA_NCR) == MARK_STATE_VISITED) -#define primitive_tribe_visit (town_known(AREA_PRIMITIVE_TRIBE) == MARK_STATE_VISITED) -#define redding_visit (town_known(AREA_REDDING) == MARK_STATE_VISITED) -#define new_reno_visit (town_known(AREA_NEW_RENO) == MARK_STATE_VISITED) -#define san_francisco_visit (town_known(AREA_SAN_FRANCISCO) == MARK_STATE_VISITED) -#define sierra_army_base_visit (town_known(AREA_SIERRA_ARMY_BASE) == MARK_STATE_VISITED) -#define vault_13_visit (town_known(AREA_VAULT_13) == MARK_STATE_VISITED) -#define vault_15_visit (town_known(AREA_VAULT_15) == MARK_STATE_VISITED) -#define vault_city_visit (town_known(AREA_VAULT_CITY) == MARK_STATE_VISITED) -#define arroyo_destroyed_visit (town_known(AREA_ARROYO_DESTROYED) == MARK_STATE_VISITED) -#define vault_fake_13A_visit (town_known(AREA_FAKE_VAULT_13A) == MARK_STATE_VISITED) -#define vault_fake_13B_visit (town_known(AREA_FAKE_VAULT_13B) == MARK_STATE_VISITED) - #define mark_on_map(x) if (town_known(x) == MARK_STATE_UNKNOWN) then begin \ debug_msg(" mark_on_map("+x+")"); \ mark_area_known(MARK_TYPE_TOWN, x, MARK_STATE_KNOWN); \ @@ -450,63 +396,11 @@ mark_area_known(MARK_TYPE_TOWN, x, MARK_STATE_UNKNOWN); \ end -#define mark_abbey_on_map mark_on_map(AREA_ABBEY) -#define mark_arroyo_on_map mark_on_map(AREA_ARROYO) -#define mark_broken_hills_on_map mark_on_map(AREA_BROKEN_HILLS) -#define mark_colusa_on_map mark_on_map(AREA_NAVARRO) -#define mark_navarro_on_map mark_on_map(AREA_NAVARRO) -#define mark_den_on_map mark_on_map(AREA_DEN) -#define mark_enclave_on_map mark_on_map(AREA_THE_ENCLAVE) -#define mark_EPA_on_map mark_on_map(AREA_EPA) -#define mark_gecko_on_map mark_on_map(AREA_GECKO) -#define mark_klamath_on_map mark_on_map(AREA_KLAMATH) -#define mark_military_base_on_map mark_on_map(AREA_MILITARY_BASE) -#define mark_modoc_on_map mark_on_map(AREA_MODOC) -#define mark_new_CA_republic_on_map mark_on_map(AREA_NCR) -#define mark_primitive_tribe_on_map mark_on_map(AREA_PRIMITIVE_TRIBE) -#define mark_redding_on_map mark_on_map(AREA_REDDING) -#define mark_new_reno_on_map mark_on_map(AREA_NEW_RENO) -#define mark_san_francisco_on_map mark_on_map(AREA_SAN_FRANCISCO) -#define mark_sierra_army_base_on_map mark_on_map(AREA_SIERRA_ARMY_BASE) -#define mark_vault_13_on_map mark_on_map(AREA_VAULT_13) -#define mark_vault_15_on_map mark_on_map(AREA_VAULT_15) -#define mark_vault_city_on_map mark_on_map(AREA_VAULT_CITY) -#define mark_vault_fake_13A_on_map mark_on_map(AREA_FAKE_VAULT_13A) -#define mark_vault_fake_13B_on_map mark_on_map(AREA_FAKE_VAULT_13B) - -#define unmark_vault_fake_13A_on_map unmark_on_map(AREA_FAKE_VAULT_13A) - - - /******************************************************************************************************************* ********** These represent the players acomplishments through the game ********************************************* ********** Note: these reflect the Fallout2 variable designers put in the scripts assuming we were ***************** ********** going to have a magic variable to keep track of the player stats throught the game ********************** *******************************************************************************************************************/ -#define f2_state_v13_looking (0) -#define f2_state_v13_known (1) // set -Chris H -#define f2_state_v13_found (2) // set -Chris H -#define f2_state_v13_entered (3) // set -Chris H -#define f2_state_tribe_kidnapped (4) // ### state not set -#define f2_state_fix_tanker (5) // didn't need to exist -#define f2_state_tanker_fix_known (6) // set -Chris H -#define f2_state_tanker_fixed (7) // set -Chris H -#define f2_state_enclave_destroyed (8) // ### state not set - -#define set_f2(x) if (global_var(GVAR_FALLOUT_2) < x) then set_global_var(GVAR_FALLOUT_2, x) -#define force_f2(x) set_global_var(GVAR_FALLOUT_2, x) -#define get_f2(x) (global_var(GVAR_FALLOUT_2) == x) -#define f2_flag_any (global_var(GVAR_FALLOUT_2)) - -#define Fallout2_vault13_looking get_f2(f2_state_v13_looking) -#define Fallout2_vault13_location_known get_f2(f2_state_v13_known) -#define Fallout2_vault13_found get_f2(f2_state_v13_found) -#define Fallout2_vault13_entered get_f2(f2_state_v13_entered) -#define Fallout2_tribe_kidnapped get_f2(f2_state_tribe_kidnapped) -#define Fallout2_fix_tanker get_f2(f2_state_fix_tanker) -#define Fallout2_tanker_known get_f2(f2_state_tanker_fix_known) -#define Fallout2_tanker_fixed get_f2(f2_state_tanker_fixed) -#define Fallout2_enclave_destroyed get_f2(f2_state_enclave_destroyed) // Info relating to carry weight, how much something costs, and weights #define pid_weight(x) proto_data(x,it_weight) @@ -566,4 +460,4 @@ #define set_is_click set_lvar_bit_off(LVAR_Flags, is_float_bit) -#endif // COMMAND_LITE_H +#endif // COMMAND_H diff --git a/artifacts/scripting/headers/define_lite.h b/artifacts/scripting/headers/define_lite.h index feb30199..304a71df 100644 --- a/artifacts/scripting/headers/define_lite.h +++ b/artifacts/scripting/headers/define_lite.h @@ -7,7 +7,7 @@ // This file holds all of the things that should be preprocessed. -// script.h: Script Procedure Types // +// Script Procedure Types // #define no_proc (0) #define start_proc (1) #define spatial_proc (2) @@ -41,7 +41,7 @@ #define METARULE_IS_LOADGAME 22 #define is_loading_game metarule(METARULE_IS_LOADGAME, 0) -// script.h: Script Combat Procedure SubTypes // +// Script Combat Procedure SubTypes // #define COMBAT_SUBTYPE_WEAPON_USED (1) #define COMBAT_SUBTYPE_HIT_SUCCEEDED (2) #define COMBAT_SUBTYPE_SEQUENCING (3) @@ -102,19 +102,16 @@ // dialogue defines // #define start_dialogue(X,Y) start_gdialog(-1,X,Y,-1,-1) + // head_anim enums -//#define very_good_reaction (0) #define good_fidget (1) -//#define good_to_neutral (2) -//#define neutral_to_good (3) #define neutral_fidget (4) -//#define neutral_to_bad (5) -//#define bad_to_neutral (6) #define bad_fidget (7) -//#define very_bad_reaction (8) -//#define good_phonemes (9) -//#define neutral_phonemes (10) -//#define bad_phonemes (11) + +// Mood defines // +#define GOOD_REACTION (49) +#define NEUTRAL_REACTION (50) +#define BAD_REACTION (51) // Head defines // #define HEAD_MARCUS (1) //marcus -- Party Member (found in Broken Hills) @@ -129,9 +126,7 @@ #define HEAD_HAKUNIN (10) // Hakunin -- Found in Arroyo #define HEAD_BOSS (11) #define HEAD_DYING_HAKUNIN (12) -/* -#define HEAD_OVERSEER (1) //ovrsr -- vault -*/ + // Head defines // #define BACKGROUND1 (2) // rstymetl #define BACKGROUND_HUB (3) //hub.frm @@ -145,7 +140,8 @@ #define BACKGROUND_MASTER (11) //master.frm #define BACKGROUND_FOLLOWER (12) //follow.frm #define BACKGROUND_RAIDERS (13) //raider.frm - // Start of Fallout 2: Backgrounds + +// Start of Fallout 2: Backgrounds #define BACKGROUND_CAVE (14) //cave0001.frm #define BACKGROUND_ENCLAVE (15) //enclave.frm #define BACKGROUND_WASTELAND (16) //wastelnd.frm @@ -153,14 +149,6 @@ #define BACKGROUND_PRESIDENT (18) // pres.frm #define BACKGROUND_TENT (19) // tent.frm #define BACKGROUND_ADOBE (20) // Adobe.frm -// Mood defines // -#define GOOD_REACTION (49) -#define NEUTRAL_REACTION (50) -#define BAD_REACTION (51) -//#define BAD_REACTION (49) -//#define NEUTRAL_REACTION (50) -//#define GOOD_REACTION (51) - // ----------------------------------------------------------------------- // // ----------------------------------------------------------------------- // @@ -174,11 +162,11 @@ // ----------------------------------------------------------------------- // // ----------------------------------------------------------------------- // - // Trait defines // -#define TRAIT_PERK (0) +#define TRAIT_PERK (0) #define TRAIT_OBJECT (1) #define TRAIT_TRAIT (2) + // Perk Trait Types #define PERK_bonus_awareness (0) #define PERK_bonus_hth_attacks (1) @@ -207,7 +195,7 @@ #define PERK_sniper (24) #define PERK_silent_death (25) #define PERK_action_boy (26) -///#define PERK_mental_block (27) -- Disabled FO2 +#define PERK_mental_block (27) //-- Disabled FO2 #define PERK_lifegiver (28) #define PERK_dodger (29) #define PERK_snakeater (30) @@ -216,15 +204,15 @@ #define PERK_master_thief (33) #define PERK_speaker (34) #define PERK_heave_ho (35) -///#define PERK_friendly_foe (36) -- Disabled FO2 +#define PERK_friendly_foe (36) //-- Disabled FO2 #define PERK_pickpocket (37) #define PERK_ghost (38) #define PERK_cult_of_personality (39) -///#define PERK_scrounger (40) -- Disabled FO2 +#define PERK_scrounger (40) //-- Disabled FO2 #define PERK_explorer (41) -///#define PERK_flower_child (42) -- Disabled FO2 +#define PERK_flower_child (42) //-- Disabled FO2 #define PERK_pathfinder (43) -///#define PERK_animal_friend (44) -- Disabled FO2 +#define PERK_animal_friend (44) //-- Disabled FO2 #define PERK_scout (45) #define PERK_mysterious_stranger (46) #define PERK_ranger (47) @@ -233,27 +221,27 @@ #define PERK_swift_learner (50) #define PERK_tag (51) #define PERK_mutate (52) -//#define PERK_add_nuka // Do NOT USE! Engine ONLY! -//#define PERK_add_buffout // Do NOT USE! Engine ONLY! -//#define PERK_add_mentats // Do NOT USE! Engine ONLY! -//#define PERK_add_psycho // Do NOT USE! Engine ONLY! -//#define PERK_add_radaway // Do NOT USE! Engine ONLY! -//#define PERK_weapon_long_range // Do NOT USE! Engine ONLY! -//#define PERK_weapon_accurate // Do NOT USE! Engine ONLY! -//#define PERK_weapon_penetrate // Do NOT USE! Engine ONLY! -//#define PERK_weapon_knockback // Do NOT USE! Engine ONLY! -//#define PERK_armor_powered // Do NOT USE! Engine ONLY! -//#define PERK_armor_combat // Do NOT USE! Engine ONLY! -// Note: Fallout 2: New Perks // Do NOT USE! Engine ONLY! -//#define PERK_weapon_scope_range // Do NOT USE! Engine ONLY! -//#define PERK_weapon_fast_reload // Do NOT USE! Engine ONLY! -//#define PERK_weapon_night_sight // Do NOT USE! Engine ONLY! -//#define PERK_weapon_flameboy // Do NOT USE! Engine ONLY! -//#define PERK_armor_advanced_1 // Do NOT USE! Engine ONLY! -//#define PERK_armor_advanced_2 // Do NOT USE! Engine ONLY! -//#define PERK_add_jet // Do NOT USE! Engine ONLY! -//#define PERK_add_tragic // Do NOT USE! Engine ONLY! -//#define PERK_armor_charisma // Do NOT USE! Engine ONLY! +#define PERK_add_nuka (53) // Do NOT USE! Engine ONLY! +#define PERK_add_buffout (54) // Do NOT USE! Engine ONLY! +#define PERK_add_mentats (55) // Do NOT USE! Engine ONLY! +#define PERK_add_psycho (56) // Do NOT USE! Engine ONLY! +#define PERK_add_radaway (57) // Do NOT USE! Engine ONLY! +#define PERK_weapon_long_range (58) // Do NOT USE! Engine ONLY! +#define PERK_weapon_accurate (59) // Do NOT USE! Engine ONLY! +#define PERK_weapon_penetrate (60) // Do NOT USE! Engine ONLY! +#define PERK_weapon_knockback (61) // Do NOT USE! Engine ONLY! +#define PERK_armor_powered (62) // Do NOT USE! Engine ONLY! +#define PERK_armor_combat (63) // Do NOT USE! Engine ONLY! +// Note: Fallout 2: New Perks +#define PERK_weapon_scope_range (64) // Do NOT USE! Engine ONLY! +#define PERK_weapon_fast_reload (65) // Do NOT USE! Engine ONLY! +#define PERK_weapon_night_sight (66) // Do NOT USE! Engine ONLY! +#define PERK_weapon_flameboy (67) // Do NOT USE! Engine ONLY! +#define PERK_armor_advanced_1 (68) // Do NOT USE! Engine ONLY! +#define PERK_armor_advanced_2 (69) // Do NOT USE! Engine ONLY! +#define PERK_add_jet (70) // Do NOT USE! Engine ONLY! +#define PERK_add_tragic (71) // Do NOT USE! Engine ONLY! +#define PERK_armor_charisma (72) // Do NOT USE! Engine ONLY! #define PERK_gecko_skinning_perk (73) #define PERK_dermal_armor_perk (74) #define PERK_dermal_enhancement_perk (75) @@ -307,7 +295,9 @@ #define OBJECT_CUR_ROT (10) #define OBJECT_VISIBILITY (666) #define OBJECT_CUR_WEIGHT (669) + #define obj_is_visible_flag(WHO) has_trait(TRAIT_OBJECT,WHO,OBJECT_VISIBILITY) + // Trait Types #define TRAIT_fast_metabolism (0) #define TRAIT_bruiser (1) @@ -329,8 +319,7 @@ // ----------------------------------------------------------------------- // // ----------------------------------------------------------------------- // -// proto.h: stats // -// SPECIAL System stats +// SPECIAL System stats: strength, perception, endurance, charisma, intelligence, agility, luck #define STAT_st (0) #define STAT_pe (1) #define STAT_en (2) @@ -339,24 +328,22 @@ #define STAT_ag (5) #define STAT_lu (6) #define STAT_max_hp (7) -/// strength, perception, endurance, charisma, intelligence, agility, -/// luck, // luck MUST be the last basic stat +// luck MUST be the last basic stat // derived stats -#define STAT_max_hit_points (7) -#define STAT_max_move_points (8) -#define STAT_ac (9) -///#define STAT_unarmed_dmg (10) -#define STAT_unused (10) -#define STAT_melee_dmg (11) -#define STAT_carry_amt (12) -#define STAT_sequence (13) -#define STAT_heal_rate (14) -#define STAT_crit_chance (15) -#define STAT_better_crit (16) -#define STAT_dmg_thresh (17) -#define STAT_dmg_thresh_laser (18) -#define STAT_dmg_thresh_fire (19) -#define STAT_dmg_thresh_plasma (20) +#define STAT_max_hit_points (7) +#define STAT_max_move_points (8) +#define STAT_ac (9) +#define STAT_unused (10) // used in sfall for critter inventory size (see CritterInvSizeLimitMode) +#define STAT_melee_dmg (11) +#define STAT_carry_amt (12) +#define STAT_sequence (13) +#define STAT_heal_rate (14) +#define STAT_crit_chance (15) +#define STAT_better_crit (16) +#define STAT_dmg_thresh (17) +#define STAT_dmg_thresh_laser (18) +#define STAT_dmg_thresh_fire (19) +#define STAT_dmg_thresh_plasma (20) #define STAT_dmg_thresh_electrical (21) #define STAT_dmg_thresh_emp (22) #define STAT_dmg_thresh_explosion (23) @@ -379,7 +366,7 @@ #define STAT_current_rad (37) #define STAT_real_max_stat (38) // extra stat-like values that are treated specially -#define STAT_max_stat STAT_current_hp +#define STAT_max_stat STAT_current_hp #define PCSTAT_unspent_skill_points (0) #define PCSTAT_level (1) @@ -391,7 +378,7 @@ // ----------------------------------------------------------------------- // // ----------------------------------------------------------------------- // -// skill.h: Skill Equates // +// Skill Equates // // the following are skills for the SPECIAL system #define SKILL_SMALL_GUNS (0) #define SKILL_BIG_GUNS (1) @@ -418,7 +405,7 @@ // ----------------------------------------------------------------------- // // ----------------------------------------------------------------------- // -// reaction.h: Reaction Levels // +// Reaction Levels // #define rl_disastrous (0) #define rl_very_bad (1) #define rl_bad (2) @@ -428,15 +415,11 @@ #define rl_very_good (6) #define rl_excellent (7) - -// proto.h // //#define LOAD_MAP_INDEX (32) -// proto.h // #define GENDER_MALE (0) #define GENDER_FEMALE (1) - // critter_state States // #define CRITTER_IS_NORMAL (0) #define CRITTER_IS_DEAD (1) @@ -445,7 +428,6 @@ #define is_critter_dead(who) (critter_state(who) bwand CRITTER_IS_DEAD) #define is_critter_prone(who) (critter_state(who) bwand CRITTER_IS_PRONE) - // inventory Equates // #define INVEN_TYPE_WORN (0) #define INVEN_TYPE_RIGHT_HAND (1) @@ -454,7 +436,6 @@ #define INVEN_TYPE_INV_COUNT (-2) #define inven_count(WHO) critter_inven_obj(WHO, INVEN_TYPE_INV_COUNT) - // ----------------------------------------------------------------------- // // ----------------------------------------------------------------------- // @@ -469,7 +450,6 @@ #define item_type_misc_item (5) #define item_type_key_item (6) - /* Item data_members */ #define it_pid (0) #define it_name (1) @@ -508,7 +488,6 @@ #define CR_BODY_QUADRUPED 1 #define CR_BODY_ROBOTIC 2 - /* Scenery data_members */ #define sc_pid (0) #define sc_name (1) @@ -536,7 +515,6 @@ #define wa_material (9) /* Tile data_members */ - // NONE /* Misc data_members */ #define mi_pid (0) @@ -548,75 +526,37 @@ #define mi_flags (6) #define mi_flags_ext (7) - // ----------------------------------------------------------------------- // // ----------------------------------------------------------------------- // /* Combat Flags */ - -// WIP! These are old and incorrect now, look below! 6/18/97 JLR - -/* -#define DAM_KNOCKED_OUT (1) // 0x00000001 // valid flags for damage_results -#define DAM_STUNNED (2) // 0x00000002 -#define DAM_KNOCKED_DOWN (4) // 0x00000004 -#define DAM_DODGED (8) // 0x00000008 -#define DAM_CRIP_LEG_LEFT (16) // 0x00000010 -#define DAM_CRIP_LEG_RIGHT (32) // 0x00000020 -#define DAM_CRIP_FOOT_LEFT (64) // 0x00000040 -#define DAM_CRIP_FOOT_RIGHT (128) // 0x00000080 -#define DAM_CRIP_ARM_LEFT (256) // 0x00000100 -#define DAM_CRIP_ARM_RIGHT (512) // 0x00000200 -#define DAM_CRIP_HAND_LEFT (1024) // 0x00000400 -#define DAM_CRIP_HAND_RIGHT (2048) // 0x00000800 -#define DAM_BLIND_EYE_LEFT (4096) // 0x00001000 -#define DAM_BLIND_EYE_RIGHT (8192) // 0x00002000 -#define DAM_DECAPITATED (16384) // 0x00004000 -#define DAM_SURPRISED (32768) // 0x00008000 -#define DAM_DEATH_1 (65536) // 0x00010000 -#define DAM_DEATH_2 (131072) // 0x00020000 -#define DAM_DEATH_3 (262144) // 0x00040000 -#define DAM_HIT (524288) // 0x00080000 // true if hit or critical hit -#define DAM_UNBALANCED (1048576) // 0x00100000 -#define DAM_DEAF (2097152) // 0x00200000 -#define DAM_DROP_WEAPON (4194304) // 0x00400000 -#define DAM_BREAK_WEAPON (8388608) // 0x00800000 -#define DAM_UNREADY_WEAPON_LEFT (16777216) // 0x01000000 -#define DAM_UNREADY_WEAPON_RIGHT (33554432) // 0x02000000 -#define DAM_EXPLODE_WEAPON (67108864) // 0x04000000 -#define DAM_DUD_SHOT (134217728) // 0x08000000 -#define DAM_IGNORE_DR (268435456) // 0x10000000 -#define DAM_CRITICAL (536870912) // 0x20000000 // could be a critical hit or critical miss -#define DAM_ON_FIRE (1073741824) // 0x40000000 -*/ - -#define DAM_KNOCKED_OUT 1 -#define DAM_KNOCKED_DOWN 2 -#define DAM_CRIP_LEG_LEFT 4 -#define DAM_CRIP_LEG_RIGHT 8 -#define DAM_CRIP_ARM_LEFT 16 -#define DAM_CRIP_ARM_RIGHT 32 -#define DAM_BLIND 64 -#define DAM_DEAD 128 -#define DAM_HIT 256 -#define DAM_CRITICAL 512 // could be a critical hit or critical miss -#define DAM_ON_FIRE 1024 -#define DAM_BYPASS 2048 -#define DAM_EXPLODE 4096 -#define DAM_DESTROY 8192 -#define DAM_DROP 16384 -#define DAM_LOSE_TURN 32768 -#define DAM_HIT_SELF 65536 -#define DAM_LOSE_AMMO 131072 -#define DAM_DUD 262144 -#define DAM_HURT_SELF 524288 -#define DAM_RANDOM_HIT 1048576 -#define DAM_CRIP_RANDOM 2097152 -#define DAM_BACKWASH 4194304 - +// valid flags for damage_results +#define DAM_KNOCKED_OUT 0x1 +#define DAM_KNOCKED_DOWN 0x2 +#define DAM_CRIP_LEG_LEFT 0x4 +#define DAM_CRIP_LEG_RIGHT 0x8 +#define DAM_CRIP_ARM_LEFT 0x10 +#define DAM_CRIP_ARM_RIGHT 0x20 +#define DAM_BLIND 0x40 +#define DAM_DEAD 0x80 +#define DAM_HIT 0x100 // hit or critical hit +#define DAM_CRITICAL 0x200 // could be a critical hit or critical miss +#define DAM_ON_FIRE 0x400 +#define DAM_BYPASS 0x800 +#define DAM_EXPLODE 0x1000 +#define DAM_DESTROY 0x2000 +#define DAM_DROP 0x4000 +#define DAM_LOSE_TURN 0x8000 +#define DAM_HIT_SELF 0x10000 +#define DAM_LOSE_AMMO 0x20000 +#define DAM_DUD 0x40000 +#define DAM_HURT_SELF 0x80000 +#define DAM_RANDOM_HIT 0x100000 +#define DAM_CRIP_RANDOM 0x200000 +#define DAM_BACKWASH 0x400000 // Fallout 2: -#define DAM_PERFORM_REVERSE 8388608 -#define critter_uninjure(WHO, FLAGS) critter_injure(WHO, (FLAGS BWOR DAM_PERFORM_REVERSE)) +#define DAM_PERFORM_REVERSE 0x800000 +#define critter_uninjure(WHO, FLAGS) critter_injure(WHO, (FLAGS bwor DAM_PERFORM_REVERSE)) #define DMG_normal_dam 0 #define DMG_laser 1 @@ -744,11 +684,9 @@ #define wm_get_subtile_state(XPOS,YPOS) metarule3(METARULE3_WM_SUBTILE_STATE,XPOS,YPOS,0) // Begin tile_get_next_critter(tile, elevation, lastCritter) -//CMH //Note these defines are really messey. #define METARULE3_TILE_GET_NEXT_CRITTER (106) #define tile_get_next_critter(tile, elevation, lastCritter) metarule3(METARULE3_TILE_GET_NEXT_CRITTER, tile, elevation, lastCritter) -//CMH // End #define METARULE3_ART_SET_BASE_FID_NUM (107) @@ -780,6 +718,8 @@ #define INVEN_CMD_INDEX_PTR (13) #define inven_ptr(WHO,WHERE) inven_cmds(WHO,INVEN_CMD_INDEX_PTR,WHERE) + +/* Extra */ /* GSound Values */ // gsound_character_types #define snd_human (0) @@ -820,76 +760,51 @@ #define hit_left_weapon_reload (6) #define hit_right_weapon_reload (7) -/* Extra */ - -#define fadeout(X) gfade_out(X) -#define fadein(X) gfade_in(X) - +#define fade_out gfade_out(1) +#define fade_in gfade_in(1) /* Time Information (in Ticks) */ - #define ONE_GAME_SECOND (10) -#define ONE_GAME_MINUTE (60*ONE_GAME_SECOND) -#define ONE_GAME_HOUR (60*ONE_GAME_MINUTE) -#define ONE_GAME_DAY (24*ONE_GAME_HOUR) -#define ONE_GAME_WEEK (7*ONE_GAME_DAY) -#define ONE_GAME_MONTH (30*ONE_GAME_DAY) +#define ONE_GAME_MINUTE (60 * ONE_GAME_SECOND) +#define ONE_GAME_HOUR (60 * ONE_GAME_MINUTE) +#define ONE_GAME_DAY (24 * ONE_GAME_HOUR) +#define ONE_GAME_WEEK (7 * ONE_GAME_DAY) +#define ONE_GAME_MONTH (30 * ONE_GAME_DAY) /* bits */ #define bit_1 (1) #define bit_2 (2) #define bit_3 (4) #define bit_4 (8) -#define bit_5 (16) -#define bit_6 (32) -#define bit_7 (64) -#define bit_8 (128) -#define bit_9 (256) -#define bit_10 (512) -#define bit_11 (1024) -#define bit_12 (2048) -#define bit_13 (4096) -#define bit_14 (8192) -#define bit_15 (16384) -#define bit_16 (32768) -#define bit_17 (65536) -#define bit_18 (131072) -#define bit_19 (262144) -#define bit_20 (524288) -#define bit_21 (1048576) -#define bit_22 (2097152) -#define bit_23 (4194304) -#define bit_24 (8388608) -#define bit_25 (16777216) -#define bit_26 (33554432) -#define bit_27 (67108864) -#define bit_28 (134217728) -#define bit_29 (268435456) -#define bit_30 (536870912) -#define bit_31 (1073741824) -#define bit_32 (-2147483648) -#define bit_ALL (-1) - -/* macros for pickup_p_proc responses. */ -#define REACTION_TG 1 -#define REACTION_G 2 -#define REACTION_TC 3 -#define REACTION_C 4 - -#define R_CALL_THROUGH 1 -#define R_NOCALL_THROUGH -1 - -#ifndef PICKUP_THRESH -#define PICKUP_THRESH 1 -#endif - -#ifndef CALL_PICKUP -#define CALL_PICKUP R_NOCALL_THROUGH -#endif - -#ifndef NPC_REACTION_VAR -#define NPC_REACTION_VAR (-1) -#endif +#define bit_5 (0x10) +#define bit_6 (0x20) +#define bit_7 (0x40) +#define bit_8 (0x80) +#define bit_9 (0x100) +#define bit_10 (0x200) +#define bit_11 (0x400) +#define bit_12 (0x800) +#define bit_13 (0x1000) +#define bit_14 (0x2000) +#define bit_15 (0x4000) +#define bit_16 (0x8000) +#define bit_17 (0x10000) +#define bit_18 (0x20000) +#define bit_19 (0x40000) +#define bit_20 (0x80000) +#define bit_21 (0x100000) +#define bit_22 (0x200000) +#define bit_23 (0x400000) +#define bit_24 (0x800000) +#define bit_25 (0x1000000) +#define bit_26 (0x2000000) +#define bit_27 (0x4000000) +#define bit_28 (0x8000000) +#define bit_29 (0x10000000) +#define bit_30 (0x20000000) +#define bit_31 (0x40000000) +#define bit_32 (0x80000000) +#define bit_ALL (0xFFFFFFFF) diff --git a/artifacts/scripting/sfall function notes.txt b/artifacts/scripting/sfall function notes.txt index 0c0951b1..833882d1 100644 --- a/artifacts/scripting/sfall function notes.txt +++ b/artifacts/scripting/sfall function notes.txt @@ -776,7 +776,7 @@ optional arguments: > int sfall_func0("win_fill_color") > int sfall_func5("win_fill_color", int x, int y, int width, int height, int color) -- fills the rectangle area of the currently selected script window with the specified color, or clears the entire window with transparent color (called without arguments) +- fills the rectangle area of the currently selected script window with the specified color, or clears the window with transparent (index 0) color (call the function without arguments) - color: the color index in the game palette (from 0 to 255) ------------------------ diff --git a/sfall/Modules/Message.cpp b/sfall/Modules/Message.cpp index 33455d6d..a1429e96 100644 --- a/sfall/Modules/Message.cpp +++ b/sfall/Modules/Message.cpp @@ -272,8 +272,8 @@ void Message::init() { LoadGameHook::OnGameReset() += ClearScriptAddedExtraGameMsg; } -void Message::exit() { +//void Message::exit() { //gExtraGameMsgLists.clear(); -} +//} } diff --git a/sfall/Modules/Message.h b/sfall/Modules/Message.h index 1e244000..33e87cc7 100644 --- a/sfall/Modules/Message.h +++ b/sfall/Modules/Message.h @@ -57,7 +57,7 @@ class Message : public Module { public: const char* name() { return "Message"; } void init(); - void exit() override; + //void exit() override; static long AddExtraMsgFile(const char* msgName, long msgNumber); }; diff --git a/sfall/Modules/Scripting/Handlers/Interface.cpp b/sfall/Modules/Scripting/Handlers/Interface.cpp index 74b10394..ece0bcb8 100644 --- a/sfall/Modules/Scripting/Handlers/Interface.cpp +++ b/sfall/Modules/Scripting/Handlers/Interface.cpp @@ -378,7 +378,7 @@ void mf_create_win(OpcodeContext& ctx) { : fo::WinFlags::MoveOnTop; if (fo::func::createWindow(ctx.arg(0).strValue(), - ctx.arg(1).rawValue(), ctx.arg(2).rawValue(), // y, x + ctx.arg(1).rawValue(), ctx.arg(2).rawValue(), // x, y ctx.arg(3).rawValue(), ctx.arg(4).rawValue(), // w, h (flags & fo::WinFlags::Transparent) ? 0 : 256, flags) == -1) { @@ -791,7 +791,11 @@ void mf_win_fill_color(OpcodeContext& ctx) { return; } if (ctx.numArgs() > 0) { - fo::WinFillRect(fo::var::sWindows[iWin].wID, ctx.arg(0).rawValue(), ctx.arg(1).rawValue(), ctx.arg(2).rawValue(), ctx.arg(3).rawValue(), (BYTE)ctx.arg(4).rawValue()); + fo::WinFillRect(fo::var::sWindows[iWin].wID, + ctx.arg(0).rawValue(), ctx.arg(1).rawValue(), // x, y + ctx.arg(2).rawValue(), ctx.arg(3).rawValue(), // w, h + static_cast(ctx.arg(4).rawValue()) + ); } else { fo::ClearWindow(fo::var::sWindows[iWin].wID, false); // full clear } diff --git a/sfall/Modules/Scripting/OpcodeContext.cpp b/sfall/Modules/Scripting/OpcodeContext.cpp index ea872012..736ec818 100644 --- a/sfall/Modules/Scripting/OpcodeContext.cpp +++ b/sfall/Modules/Scripting/OpcodeContext.cpp @@ -70,7 +70,6 @@ int OpcodeContext::argShift() const { void OpcodeContext::setArgShift (int shift) { assert(shift >= 0); - _argShift = shift; } @@ -175,6 +174,7 @@ void OpcodeContext::handleOpcode(ScriptingFunctionHandler func, const OpcodeArgu if (_hasReturn) _pushReturnValue(); } +// unused method void __stdcall OpcodeContext::handleOpcodeStatic(fo::Program* program, DWORD opcodeOffset, ScriptingFunctionHandler func, char argNum, bool hasReturn) { // for each opcode create new context on stack (no allocations at this point) OpcodeContext currentContext(program, opcodeOffset / 4, argNum, hasReturn); diff --git a/sfall/Modules/Scripting/OpcodeContext.h b/sfall/Modules/Scripting/OpcodeContext.h index cfc41824..4f0561c4 100644 --- a/sfall/Modules/Scripting/OpcodeContext.h +++ b/sfall/Modules/Scripting/OpcodeContext.h @@ -163,10 +163,8 @@ public: static DWORD getScriptTypeBySfallType(DataType dataType); private: - // pops arguments from data stack - void _popArguments(); - // pushes return value to data stack - void _pushReturnValue(); + std::array _args; + ScriptValue _ret; fo::Program* _program; DWORD _opcode; @@ -174,12 +172,15 @@ private: const SfallMetarule* _metarule; - int _numArgs; + int _numArgs; bool _hasReturn; - int _argShift; - std::array _args; - ScriptValue _ret; + int _argShift; long _errorVal; // error value for incorrect arguments + + // pops arguments from data stack + void _popArguments(); + // pushes return value to data stack + void _pushReturnValue(); }; } From f04442d4b756f1d8bb5a6fc7a38e662afcc6f60e Mon Sep 17 00:00:00 2001 From: NovaRain Date: Tue, 27 Oct 2020 00:11:31 +0800 Subject: [PATCH 6/6] Reverted the change to Message module in the previous commit --- sfall/Modules/Message.cpp | 4 ++-- sfall/Modules/Message.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/sfall/Modules/Message.cpp b/sfall/Modules/Message.cpp index a1429e96..33455d6d 100644 --- a/sfall/Modules/Message.cpp +++ b/sfall/Modules/Message.cpp @@ -272,8 +272,8 @@ void Message::init() { LoadGameHook::OnGameReset() += ClearScriptAddedExtraGameMsg; } -//void Message::exit() { +void Message::exit() { //gExtraGameMsgLists.clear(); -//} +} } diff --git a/sfall/Modules/Message.h b/sfall/Modules/Message.h index 33e87cc7..1e244000 100644 --- a/sfall/Modules/Message.h +++ b/sfall/Modules/Message.h @@ -57,7 +57,7 @@ class Message : public Module { public: const char* name() { return "Message"; } void init(); - //void exit() override; + void exit() override; static long AddExtraMsgFile(const char* msgName, long msgNumber); };