diff --git a/artifacts/example_mods/AmmoMod/AmmoGlovz.ini b/artifacts/example_mods/AmmoMod/AmmoGlovz.ini new file mode 100644 index 00000000..5441e2f0 --- /dev/null +++ b/artifacts/example_mods/AmmoMod/AmmoGlovz.ini @@ -0,0 +1,201 @@ +;Glovz's Damage Fix + +; PID_EXPLOSIVE_ROCKET +[1] +pid=14 +ac_adjust=-10 +dr_adjust=0 +dam_mult=1 +dam_div=1 + +; PID_10MM_JHP +[2] +pid=29 +ac_adjust=0 +dr_adjust=0 +dam_mult=2 +dam_div=1 + +; PID_10MM_AP +[3] +pid=30 +ac_adjust=-5 +dr_adjust=0 +dam_mult=1 +dam_div=2 + +; PID_44_MAGNUM_JHP +[4] +pid=31 +ac_adjust=0 +dr_adjust=-10 +dam_mult=2 +dam_div=1 + +; PID_FLAMETHROWER_FUEL +[5] +pid=32 +ac_adjust=-20 +dr_adjust=0 +dam_mult=1 +dam_div=1 + +; PID_14MM_AP +[6] +pid=33 +ac_adjust=-5 +dr_adjust=-30 +dam_mult=1 +dam_div=2 + +; PID_223_FMJ +[7] +pid=34 +ac_adjust=-15 +dr_adjust=-15 +dam_mult=2 +dam_div=2 + +; PID_5MM_JHP +[8] +pid=35 +ac_adjust=0 +dr_adjust=-15 +dam_mult=2 +dam_div=1 + +; PID_5MM_AP +[9] +pid=36 +ac_adjust=-5 +dr_adjust=-15 +dam_mult=1 +dam_div=2 + +; PID_ROCKET_AP +[10] +pid=37 +ac_adjust=-10 +dr_adjust=0 +dam_mult=1 +dam_div=2 + +; PID_SMALL_ENERGY_CELL +[11] +pid=38 +ac_adjust=-20 +dr_adjust=0 +dam_mult=2 +dam_div=1 + +; PID_MICRO_FUSION_CELL +[12] +pid=39 +ac_adjust=-20 +dr_adjust=0 +dam_mult=2 +dam_div=1 + +; PID_SHOTGUN_SHELLS +[13] +pid=95 +ac_adjust=-15 +dr_adjust=0 +dam_mult=3 +dam_div=1 + +; PID_44_FMJ_MAGNUM +[14] +pid=111 +ac_adjust=-5 +dr_adjust=-10 +dam_mult=2 +dam_div=2 + +; PID_9MM_BALL +[15] +pid=121 +ac_adjust=0 +dr_adjust=0 +dam_mult=1 +dam_div=1 + +; PID_BBS +[16] +pid=163 +ac_adjust=0 +dr_adjust=0 +dam_mult=1 +dam_div=1 + +; PID_ROBO_ROCKET_AMMO +[17] +pid=274 +ac_adjust=-10 +dr_adjust=-10 +dam_mult=1 +dam_div=1 + +; PID_45_CALIBER_AMMO +[18] +pid=357 +ac_adjust=0 +dr_adjust=-5 +dam_mult=2 +dam_div=1 + +; PID_2MM_EC_AMMO +[19] +pid=358 +ac_adjust=-25 +dr_adjust=-20 +dam_mult=1 +dam_div=3 + +; PID_4_7MM_CASELESS +[20] +pid=359 +ac_adjust=-5 +dr_adjust=-25 +dam_mult=1 +dam_div=2 + +; PID_9MM_AMMO +[21] +pid=360 +ac_adjust=0 +dr_adjust=0 +dam_mult=2 +dam_div=1 + +; PID_HN_NEEDLER_CARTRIDGE +[22] +pid=361 +ac_adjust=-20 +dr_adjust=-5 +dam_mult=1 +dam_div=1 + +; PID_HN_AP_NEEDLER_CARTRIDGE +[23] +pid=362 +ac_adjust=-20 +dr_adjust=-5 +dam_mult=1 +dam_div=2 + +; PID_7_62MM_AMMO +[24] +pid=363 +ac_adjust=-10 +dr_adjust=-20 +dam_mult=2 +dam_div=2 + +; PID_FLAMETHROWER_FUEL_MK_II +[25] +pid=382 +ac_adjust=-20 +dr_adjust=-15 +dam_mult=1 +dam_div=1 diff --git a/artifacts/example_mods/AmmoMod/AmmoYAAM.ini b/artifacts/example_mods/AmmoMod/AmmoYAAM.ini new file mode 100644 index 00000000..07cdbb78 --- /dev/null +++ b/artifacts/example_mods/AmmoMod/AmmoYAAM.ini @@ -0,0 +1,201 @@ +;YAAM + +; PID_EXPLOSIVE_ROCKET +[1] +pid=14 +ac_adjust=0 +dr_adjust=0 +dam_mult=3 +dam_div=2 + +; PID_10MM_JHP +[2] +pid=29 +ac_adjust=0 +dr_adjust=0 +dam_mult=3 +dam_div=2 + +; PID_10MM_AP +[3] +pid=30 +ac_adjust=0 +dr_adjust=4 +dam_mult=1 +dam_div=1 + +; PID_44_MAGNUM_JHP +[4] +pid=31 +ac_adjust=0 +dr_adjust=0 +dam_mult=3 +dam_div=2 + +; PID_FLAMETHROWER_FUEL +[5] +pid=32 +ac_adjust=-20 +dr_adjust=0 +dam_mult=3 +dam_div=4 + +; PID_14MM_AP +[6] +pid=33 +ac_adjust=0 +dr_adjust=8 +dam_mult=1 +dam_div=1 + +; PID_223_FMJ +[7] +pid=34 +ac_adjust=-20 +dr_adjust=5 +dam_mult=1 +dam_div=1 + +; PID_5MM_JHP +[8] +pid=35 +ac_adjust=0 +dr_adjust=0 +dam_mult=3 +dam_div=2 + +; PID_5MM_AP +[9] +pid=36 +ac_adjust=0 +dr_adjust=4 +dam_mult=1 +dam_div=1 + +; PID_ROCKET_AP +[10] +pid=37 +ac_adjust=0 +dr_adjust=20 +dam_mult=1 +dam_div=1 + +; PID_SMALL_ENERGY_CELL +[11] +pid=38 +ac_adjust=0 +dr_adjust=0 +dam_mult=1 +dam_div=1 + +; PID_MICRO_FUSION_CELL +[12] +pid=39 +ac_adjust=0 +dr_adjust=0 +dam_mult=1 +dam_div=1 + +; PID_SHOTGUN_SHELLS +[13] +pid=95 +ac_adjust=-10 +dr_adjust=0 +dam_mult=1 +dam_div=1 + +; PID_44_FMJ_MAGNUM +[14] +pid=111 +ac_adjust=0 +dr_adjust=5 +dam_mult=1 +dam_div=1 + +; PID_9MM_BALL +[15] +pid=121 +ac_adjust=0 +dr_adjust=2 +dam_mult=3 +dam_div=2 + +; PID_BBS +[16] +pid=163 +ac_adjust=0 +dr_adjust=0 +dam_mult=1 +dam_div=1 + +; PID_ROBO_ROCKET_AMMO +[17] +pid=274 +ac_adjust=0 +dr_adjust=10 +dam_mult=1 +dam_div=1 + +; PID_45_CALIBER_AMMO +[18] +pid=357 +ac_adjust=0 +dr_adjust=0 +dam_mult=1 +dam_div=1 + +; PID_2MM_EC_AMMO +[19] +pid=358 +ac_adjust=-30 +dr_adjust=9 +dam_mult=3 +dam_div=2 + +; PID_4_7MM_CASELESS +[20] +pid=359 +ac_adjust=-5 +dr_adjust=7 +dam_mult=3 +dam_div=2 + +; PID_9MM_AMMO +[21] +pid=360 +ac_adjust=0 +dr_adjust=2 +dam_mult=1 +dam_div=1 + +; PID_HN_NEEDLER_CARTRIDGE +[22] +pid=361 +ac_adjust=-10 +dr_adjust=2 +dam_mult=1 +dam_div=1 + +; PID_HN_AP_NEEDLER_CARTRIDGE +[23] +pid=362 +ac_adjust=-10 +dr_adjust=5 +dam_mult=2 +dam_div=1 + +; PID_7_62MM_AMMO +[24] +pid=363 +ac_adjust=-5 +dr_adjust=2 +dam_mult=1 +dam_div=1 + +; PID_FLAMETHROWER_FUEL_MK_II +[25] +pid=382 +ac_adjust=-20 +dr_adjust=0 +dam_mult=1 +dam_div=1 diff --git a/artifacts/example_mods/AmmoMod/gl_ammomod.int b/artifacts/example_mods/AmmoMod/gl_ammomod.int new file mode 100644 index 00000000..3572190c Binary files /dev/null and b/artifacts/example_mods/AmmoMod/gl_ammomod.int differ diff --git a/artifacts/example_mods/AmmoMod/gl_ammomod.ssl b/artifacts/example_mods/AmmoMod/gl_ammomod.ssl new file mode 100644 index 00000000..144cf495 --- /dev/null +++ b/artifacts/example_mods/AmmoMod/gl_ammomod.ssl @@ -0,0 +1,63 @@ +/* + +Ammo INI Loader mod for Fallout 2 by NovaRain +--------------------------------------------- + +- modifies ammo protos with data from an INI file: + * AmmoGlovz.ini if DamageFormula=1 or 2 in ddraw.ini + * AmmoYAAM.ini if DamageFormula=5 in ddraw.ini + * AmmoMod.ini if not using any bulit-in damage formula + +Requires sfall 3.5 or higher + +*/ + +#include "..\headers\define_extra.h" + +procedure set_ammo_mod; +procedure start; +procedure map_enter_p_proc; + +variable ammoIni; +variable enabled; + +procedure set_ammo_mod begin + variable pid, dmg_mod, i := 1; + + while (i > 0) do begin + pid := get_ini_setting(ammoIni + "|" + i + "|pid"); + if (pid < 1) then break; + set_proto_data(pid, PROTO_AM_AC_MOD, get_ini_setting(ammoIni + "|" + i + "|ac_adjust")); + set_proto_data(pid, PROTO_AM_DR_MOD, get_ini_setting(ammoIni + "|" + i + "|dr_adjust")); + + // dam_mult and dam_div must be positive integers + dmg_mod := get_ini_setting(ammoIni + "|" + i + "|dam_mult"); + if (dmg_mod < 1) then dmg_mod := 1; + set_proto_data(pid, PROTO_AM_DMG_MULT, dmg_mod); + dmg_mod := get_ini_setting(ammoIni + "|" + i + "|dam_div"); + if (dmg_mod < 1) then dmg_mod := 1; + set_proto_data(pid, PROTO_AM_DMG_DIV, dmg_mod); + + i++; + end + //debug_msg("AmmoMod: " + ammoIni + " - set " + (i - 1) + " ammo protos."); +end + +procedure start begin + if game_loaded then begin + ammoIni := get_ini_setting("ddraw.ini|Misc|DamageFormula"); + switch (ammoIni) begin + case 1: ammoIni := "AmmoGlovz.ini"; + case 2: ammoIni := "AmmoGlovz.ini"; + case 5: ammoIni := "AmmoYAAM.ini"; + default: ammoIni := "AmmoMod.ini"; + end + + enabled := get_ini_setting(ammoIni + "|1|pid"); + if (enabled > 0) then call set_ammo_mod; + end +end + +procedure map_enter_p_proc begin + if (enabled > 0) then call set_ammo_mod; +end diff --git a/artifacts/example_mods/AmmoMod/readme.txt b/artifacts/example_mods/AmmoMod/readme.txt new file mode 100644 index 00000000..cdae1926 --- /dev/null +++ b/artifacts/example_mods/AmmoMod/readme.txt @@ -0,0 +1,12 @@ +Ammo INI Loader mod for Fallout 2 by NovaRain +--------------------------------------------- + +- modifies ammo protos with data from an INI file: + * AmmoGlovz.ini if DamageFormula=1 or 2 in ddraw.ini + * AmmoYAAM.ini if DamageFormula=5 in ddraw.ini + * AmmoMod.ini if not using any bulit-in damage formula + + +Requires sfall 3.5 or higher. + +To use, copy gl_ammomod.int to your scripts folder, and copy the INI files to the same directory as sfall. diff --git a/artifacts/example_mods/ItemHighlight_Lite/gl_highlighting_lite.int b/artifacts/example_mods/ItemHighlight_Lite/gl_highlighting_lite.int new file mode 100644 index 00000000..e33b5672 Binary files /dev/null and b/artifacts/example_mods/ItemHighlight_Lite/gl_highlighting_lite.int differ diff --git a/artifacts/example_mods/ItemHighlight_Lite/gl_highlighting_lite.ssl b/artifacts/example_mods/ItemHighlight_Lite/gl_highlighting_lite.ssl new file mode 100644 index 00000000..457fc9d9 --- /dev/null +++ b/artifacts/example_mods/ItemHighlight_Lite/gl_highlighting_lite.ssl @@ -0,0 +1,120 @@ +/** + + Item Highlight mod (Lite version) + + A cut-down version of the mod included in sfall 4.x, offers a bit more features than the built-in function. + Features: + - highlighting items, containers (optional) and lootable corpses (optional) on the ground + - configurable hotkey is used to trigger highlight + - only objects in direct line-of-sight of player are highlighted (optional) + - motion scanner is required to enable highlight (optional) + - motion scanner charges are decreased on each use (optional) + + Requires sfall 3.8.12 or higher + + NOTE: this script requires compiler from sfall modderspack with -s option + (short circuit evaluation) + + version 1.1 + +**/ + +#include "main.h" +//#include "..\..\..\!SRC\headers\define.h" + +#define CRITTER_IS_DEAD (1) +#define PID_MOTION_SENSOR (59) +#define NO_HIGHLIGHT(obj) (get_flags(obj) bwand FLAG_NOHIGHLIGHT) +#define NO_STEAL(obj) (get_proto_data(obj_pid(obj), PROTO_CR_FLAGS) bwand CFLG_NOSTEAL) + +variable configSection := "Highlighting"; +variable highlightKey; +variable isHighlight; +variable alsoContainer; +variable alsoCorpse; +variable checkLOS; +variable outlineColor; +variable motionScanner; +variable highlightFailMsg1; +variable highlightFailMsg2; + +procedure ToggleHighlightObject(variable obj, variable enable) begin + if obj and (not enable or not checkLOS or not obj_blocking_line(dude_obj, tile_num(obj), BLOCKING_TYPE_SHOOT)) then begin + if (alsoContainer and obj_item_subtype(obj) == item_type_container) or (not NO_HIGHLIGHT(obj)) then begin + if (enable) then set_outline(obj, outlineColor); + else set_outline(obj, 0); + end + end +end + +procedure ToggleHighlight(variable enable) begin + variable obj; + foreach obj in list_as_array(LIST_GROUNDITEMS) begin + if obj != outlined_object then begin + call ToggleHighlightObject(obj, enable); + end + end + if (alsoCorpse) then begin + foreach obj in list_as_array(LIST_CRITTERS) begin + if critter_state(obj) == CRITTER_IS_DEAD and not NO_STEAL(obj) then begin + call ToggleHighlightObject(obj, enable); + end + end + end + tile_refresh_display; +end + +procedure KeyPressHandler begin + variable pressed := get_sfall_arg, + scanCode := get_sfall_arg, + scanner, charges; + + if scanCode == highlightKey and not(get_game_mode bwand (INTFACELOOT bwor BARTER)) then begin + if pressed then begin + isHighlight := true; + if motionScanner then begin + scanner := obj_carrying_pid_obj(dude_obj, PID_MOTION_SENSOR); + if scanner then begin + if motionScanner >= 2 then begin + charges := get_weapon_ammo_count(scanner); + if charges > 0 then begin + set_weapon_ammo_count(scanner, charges - 1); + intface_redraw; + call ToggleHighlight(true); + end else begin + display_msg(highlightFailMsg2); + end + end else begin + call ToggleHighlight(true); + end + end else begin + display_msg(highlightFailMsg1); + end + end else begin + call ToggleHighlight(true); + end + end else begin + isHighlight := false; + call ToggleHighlight(false); + end + end +end + +procedure start begin + if game_loaded and (sfall_ver_major < 4) then begin + call InitConfigs; + + highlightKey := GetConfig(configSection, "Key", 0); + alsoContainer := GetConfig(configSection, "Containers", 0); + alsoCorpse := GetConfig(configSection, "Corpses", 0); + checkLOS := GetConfig(configSection, "CheckLOS", 0); + outlineColor := GetConfig(configSection, "OutlineColor", 16); + if (outlineColor < 1) then outlineColor := 64; + motionScanner := GetConfig(configSection, "MotionScanner", 0); + + highlightFailMsg1 := Translate("HighlightFail1", "You aren't carrying a motion sensor."); + highlightFailMsg2 := Translate("HighlightFail2", "Your motion sensor is out of charge."); + + register_hook_proc(HOOK_KEYPRESS, KeyPressHandler); + end +end diff --git a/artifacts/example_mods/ItemHighlight_Lite/main.h b/artifacts/example_mods/ItemHighlight_Lite/main.h new file mode 100644 index 00000000..84a4c50a --- /dev/null +++ b/artifacts/example_mods/ItemHighlight_Lite/main.h @@ -0,0 +1,57 @@ + +#include "..\scripting\headers\sfall.h" +#include "..\scripting\headers\define_lite.h" +#include "..\scripting\headers\define_extra.h" + +#include "..\scripting\headers\lib.arrays.h" +#include "..\scripting\headers\lib.strings.h" +// #include "..\scripting\headers\lib.inven.h" + +variable ini := "sfall-mods.ini"; +variable translationIni; + +// Gets the integer value from ini +procedure GetConfig(variable section, variable key, variable def) begin + variable val := get_ini_setting(ini + "|" + section + "|" + key); + if val == -1 then val := def; + return val; +end + +// Gets the string value from ini +procedure GetConfigStr(variable section, variable key, variable def) begin + variable val := get_ini_string(ini + "|" + section + "|" + key); + if val == -1 or val == "" then val := def; + return val; +end + +// Gets the value from ini as a temp array of strings +procedure GetConfigList(variable section, variable key) begin + variable val := get_ini_string(ini + "|" + section + "|" + key); + if val == -1 or val == "" then return []; + + return string_split(val, ","); +end + +// Gets the value from ini as a temp array of ints +procedure GetConfigListInt(variable section, variable key) begin + variable arr, i, item; + + arr := GetConfigList(section, key); + for (i := 0; i < len_array(arr); i++) begin + arr[i] := atoi(arr[i]); + end + return arr; +end + +// Translates given string using Translations.ini +procedure Translate(variable id, variable def) begin + variable str := get_ini_string(translationIni + "|Sfall|" + id); + if not str or (strlen(str) == 0) then begin + str := def; + end + return str; +end + +procedure InitConfigs begin + translationIni := GetConfigStr("Main", "TranslationsINI", "./Translations.ini"); +end diff --git a/artifacts/example_mods/ItemHighlight_Lite/readme.txt b/artifacts/example_mods/ItemHighlight_Lite/readme.txt new file mode 100644 index 00000000..1238a37a --- /dev/null +++ b/artifacts/example_mods/ItemHighlight_Lite/readme.txt @@ -0,0 +1,21 @@ +Item Highlight mod (Lite version) for sfall 3.8.x +------------------------------------------------- + +A cut-down version of the mod included in sfall 4.x, offers a bit more features than the built-in function. +Features: +- highlighting items, containers (optional) and lootable corpses (optional) on the ground +- configurable hotkey is used to trigger highlight +- only objects in direct line-of-sight of player are highlighted (optional) +- motion scanner is required to enable highlight (optional) +- motion scanner charges are decreased on each use (optional) + + +Requires sfall 3.8.12 or higher. + +To use, copy gl_highlighting_lite.int to your scripts folder, and copy sfall-mods.ini to the same directory as sfall. +Also, you should disable the built-in function in ddraw.ini (ToggleItemHighlightsKey=0). + +Note that due to the lack of newer game hooks in sfall 3.8.x, there are some minor visual glitches with the lite version: +- items will be kept highlighted when entering combat while holding the highlight key. +- when you pick up items while holding the highlight key, they will be kept highlighted if you drop them on the ground. +Both glitches can bo solved by pressing and releasing the highlight key again. diff --git a/artifacts/example_mods/ItemHighlight_Lite/sfall-mods.ini b/artifacts/example_mods/ItemHighlight_Lite/sfall-mods.ini new file mode 100644 index 00000000..3669c62c --- /dev/null +++ b/artifacts/example_mods/ItemHighlight_Lite/sfall-mods.ini @@ -0,0 +1,30 @@ +[Highlighting] + +; DX scancode of a key to press to highlight items on the ground +; 42 - SHIFT key +Key=42 + +; Set to 1 to also highlight containers +Containers=1 + +; Set to 1 to also highlight lootable corpses +Corpses=1 + +; Set to 1 to only highlight objects in the player's line-of-sight +CheckLOS=0 + +; Set the color of outlines, available colors: +; 1 - glowing red +; 2 - red +; 4 - grey +; 8 - glowing green +; 16 - bright yellow +; 32 - dark yellow +; 64 - purple +OutlineColor=16 + +; Motion Scanner mode: +; 0 - ignored +; 1 - requires Motion Scanner present in player inventory to activate highlighting +; 2 - requires Motion Scanner and also requires 1 charge on every use (depleted scanner will not work anymore) +MotionScanner=0 diff --git a/sfall/Arrays.cpp b/sfall/Arrays.cpp index 919d2acf..021e5197 100644 --- a/sfall/Arrays.cpp +++ b/sfall/Arrays.cpp @@ -440,6 +440,15 @@ void _stdcall FreeArray(DWORD id) { } } +void DeleteAllTempArrays() { + if (!tempArrays.empty()) { + for (std::set::iterator it = tempArrays.begin(); it != tempArrays.end(); ++it) { + FreeArray(*it); + } + tempArrays.clear(); + } +} + DWORD _stdcall GetArrayKey(DWORD id, int index, DWORD* resultType) { *resultType = VAR_TYPE_INT; if (arrays.find(id) == arrays.end() || index < -1 || index > arrays[id].size()) return 0; diff --git a/sfall/Arrays.h b/sfall/Arrays.h index c0b3fc72..3724c07c 100644 --- a/sfall/Arrays.h +++ b/sfall/Arrays.h @@ -2,7 +2,6 @@ #include "main.h" #include #include -#include #define ARRAY_MAX_STRING (255) // maximum length of string to be stored as array key or value #define ARRAY_MAX_SIZE (100000) // maximum number of array elements, @@ -140,9 +139,6 @@ extern DWORD nextArrayID; extern DWORD arraysBehavior; -// temp arrays: set of arrayId -extern std::set tempArrays; - // saved arrays: arrayKey => arrayId extern ArrayKeysMap savedArrays; @@ -166,6 +162,9 @@ DWORD _stdcall TempArray(DWORD len, DWORD flags); // destroys array void _stdcall FreeArray(DWORD id); +// destroy all temp arrays +void DeleteAllTempArrays(); + /* op_get_array_key can be used to iterate over all keys in associative array */ diff --git a/sfall/Bugs.cpp b/sfall/BugFixes.cpp similarity index 99% rename from sfall/Bugs.cpp rename to sfall/BugFixes.cpp index ba772134..51e09d59 100644 --- a/sfall/Bugs.cpp +++ b/sfall/BugFixes.cpp @@ -1,6 +1,6 @@ #include "main.h" -#include "Bugs.h" +#include "BugFixes.h" #include "Define.h" #include "FalloutEngine.h" #include "LoadGameHook.h" @@ -2051,7 +2051,7 @@ bad: } } -void BugsInit() +void BugFixesInit() { // fix vanilla negate operator on float values MakeCall(0x46AB68, NegateFixHack); diff --git a/sfall/Bugs.h b/sfall/BugFixes.h similarity index 88% rename from sfall/Bugs.h rename to sfall/BugFixes.h index 95699da5..b9ad0b46 100644 --- a/sfall/Bugs.h +++ b/sfall/BugFixes.h @@ -1,6 +1,6 @@ #pragma once -void BugsInit(); +void BugFixesInit(); void DrugsSaveFix(HANDLE file); bool DrugsLoadFix(HANDLE file); diff --git a/sfall/FalloutEngine.cpp b/sfall/FalloutEngine.cpp index 40973065..8a137fff 100644 --- a/sfall/FalloutEngine.cpp +++ b/sfall/FalloutEngine.cpp @@ -947,8 +947,8 @@ void __stdcall DialogOut(const char* text) { long __fastcall WordWrap(const char* text, int maxWidth, DWORD* buf, BYTE* count) { __asm { mov eax, ecx; - mov ecx, count; mov ebx, buf; + mov ecx, count; call _word_wrap_; } } @@ -960,21 +960,19 @@ void __stdcall RedrawWin(DWORD winRef) { } } -void __stdcall DisplayInventory(long inventoryOffset, long visibleOffset, long mode) { +void __fastcall DisplayInventory(long inventoryOffset, long visibleOffset, long mode) { __asm { mov ebx, mode; - mov edx, visibleOffset; - mov eax, inventoryOffset; + mov eax, ecx; call display_inventory_; } } -void __stdcall DisplayTargetInventory(long inventoryOffset, long visibleOffset, DWORD* targetInventory, long mode) { +void __fastcall DisplayTargetInventory(long inventoryOffset, long visibleOffset, DWORD* targetInventory, long mode) { __asm { - mov ecx, mode; + mov eax, ecx; mov ebx, targetInventory; - mov edx, visibleOffset; - mov eax, inventoryOffset; + mov ecx, mode; call display_target_inventory_; } } diff --git a/sfall/FalloutEngine.h b/sfall/FalloutEngine.h index 1d6c900b..be66c600 100644 --- a/sfall/FalloutEngine.h +++ b/sfall/FalloutEngine.h @@ -1015,9 +1015,9 @@ long __fastcall WordWrap(const char* text, int maxWidth, DWORD* buf, BYTE* count void __stdcall RedrawWin(DWORD winRef); -void __stdcall DisplayInventory(long inventoryOffset, long visibleOffset, long mode); +void __fastcall DisplayInventory(long inventoryOffset, long visibleOffset, long mode); -void __stdcall DisplayTargetInventory(long inventoryOffset, long visibleOffset, DWORD* targetInventory, long mode); +void __fastcall DisplayTargetInventory(long inventoryOffset, long visibleOffset, DWORD* targetInventory, long mode); long __stdcall StatLevel(TGameObj* critter, long statId); diff --git a/sfall/LoadGameHook.cpp b/sfall/LoadGameHook.cpp index cd51f0a7..237da25e 100644 --- a/sfall/LoadGameHook.cpp +++ b/sfall/LoadGameHook.cpp @@ -20,7 +20,7 @@ #include "AI.h" #include "Arrays.h" -#include "Bugs.h" +#include "BugFixes.h" #include "Console.h" #include "Criticals.h" #include "Define.h" diff --git a/sfall/ScriptExtender.cpp b/sfall/ScriptExtender.cpp index 3ea82ab9..a4efd7b1 100644 --- a/sfall/ScriptExtender.cpp +++ b/sfall/ScriptExtender.cpp @@ -20,7 +20,7 @@ #include #include -#include +//#include #include #include "Arrays.h" @@ -1853,11 +1853,7 @@ static void RunScript(sGlobalScript* script) { - reset reg_anim_* combatstate checks */ static void ResetStateAfterFrame() { - if (!tempArrays.empty()) { - for (std::set::iterator it = tempArrays.begin(); it != tempArrays.end(); ++it) - FreeArray(*it); - tempArrays.clear(); - } + DeleteAllTempArrays(); RegAnimCombatCheck(1); } diff --git a/sfall/ScriptOps/InterfaceOp.hpp b/sfall/ScriptOps/InterfaceOp.hpp index 3ad25738..e6eb4744 100644 --- a/sfall/ScriptOps/InterfaceOp.hpp +++ b/sfall/ScriptOps/InterfaceOp.hpp @@ -411,7 +411,7 @@ static void sf_display_stats() { } static void sf_inventory_redraw() { - int mode = -1; + int mode; DWORD loopFlag = GetCurrentLoops(); if (loopFlag & INVENTORY) { mode = 0; diff --git a/sfall/ScriptOps/ScriptArrays.hpp b/sfall/ScriptOps/ScriptArrays.hpp index 526f2416..eadab031 100644 --- a/sfall/ScriptOps/ScriptArrays.hpp +++ b/sfall/ScriptOps/ScriptArrays.hpp @@ -468,33 +468,36 @@ static void __declspec(naked) op_stack_array() { } // object LISTS - struct sList { - DWORD* obj; + TGameObj** obj; DWORD len; DWORD pos; - sList(const std::vector* vec) { - len=vec->size(); - obj=new DWORD[len]; - for(DWORD i=0;i* vec) : pos(0) { + len = vec->size(); + obj = new TGameObj*[len]; + for (size_t i = 0; i < len; i++) { + obj[i] = (*vec)[i]; + } } }; -static void FillListVector(DWORD type, std::vector& vec) { +static void FillListVector(DWORD type, std::vector& vec) { + vec.reserve(100); if (type == 6) { - DWORD scriptPtr, self_obj, programPtr; - for (int elev=0; elev<=2; elev++) { + TScript* scriptPtr; + TGameObj* self_obj; + TProgram* programPtr; + for (int elev = 0; elev <= 2; elev++) { __asm { mov eax, elev; call scr_find_first_at_; mov scriptPtr, eax; } - while (scriptPtr != 0) { - self_obj = *(DWORD*)(scriptPtr + 0x34); - if (self_obj == 0) { - programPtr = *(DWORD*)(scriptPtr + 0x18); + while (scriptPtr != nullptr) { + self_obj = scriptPtr->self_obj; + if (self_obj == nullptr) { + programPtr = scriptPtr->program_ptr; __asm { mov eax, programPtr; call scr_find_obj_from_program_; @@ -508,28 +511,29 @@ static void FillListVector(DWORD type, std::vector& vec) { } } } - } else if (type == 4) { + /*} else if (type == 4) { DWORD** squares=(DWORD**)_squares; for(int elv=0;elv<2;elv++) { DWORD* esquares=squares[elv]; for(int tile=0;tile<10000;tile++) { esquares[tile]=0x8f000002; } - } - } else { - for(int elv=0;elv<3;elv++) { - for(int tile=0;tile<40000;tile++) { - DWORD obj; + }*/ + } else if (type != 4) { + for (int elv = 0; elv < 3; elv++) { + for (int tile = 0; tile < 40000; tile++) { + TGameObj* obj; __asm { mov edx, tile; mov eax, elv; call obj_find_first_at_tile_; mov obj, eax; } - while(obj) { - DWORD otype = ((DWORD*)obj)[25]; - otype = (otype&0xff000000) >> 24; - if(type==9 || (type==0&&otype==1) || (type==1&&otype==0) || (type>=2&&type<=5&&type==otype)) vec.push_back(obj); + while (obj) { + DWORD otype = obj->pid >> 24; + if (type == 9 || (type == 0 && otype == 1) || (type == 1 && otype == 0) || (type >= 2 && type <= 5 && type == otype)) { + vec.push_back(obj); + } __asm { call obj_find_next_at_tile_; mov obj, eax; @@ -539,29 +543,35 @@ static void FillListVector(DWORD type, std::vector& vec) { } } } + static void* _stdcall list_begin2(DWORD type) { - std::vector vec = std::vector(); + std::vector vec = std::vector(); FillListVector(type, vec); - sList* list=new sList(&vec); + sList* list = new sList(&vec); return list; } + static DWORD _stdcall list_as_array2(DWORD type) { - std::vector vec = std::vector(); + std::vector vec = std::vector(); FillListVector(type, vec); - DWORD id=TempArray(vec.size(), 4); - for(DWORD i=0;ipos==list->len) return 0; + +static TGameObj* _stdcall list_next2(sList* list) { + if (!list || list->pos == list->len) return 0; else return list->obj[list->pos++]; } + static void _stdcall list_end2(sList* list) { delete[] list->obj; delete list; } + static void __declspec(naked) list_begin() { __asm { pushad; diff --git a/sfall/ddraw.vcxproj b/sfall/ddraw.vcxproj index 938cb981..bd04b39c 100644 --- a/sfall/ddraw.vcxproj +++ b/sfall/ddraw.vcxproj @@ -269,7 +269,7 @@ - + @@ -336,7 +336,7 @@ - + diff --git a/sfall/ddraw.vcxproj.filters b/sfall/ddraw.vcxproj.filters index bacf96ea..c675963c 100644 --- a/sfall/ddraw.vcxproj.filters +++ b/sfall/ddraw.vcxproj.filters @@ -181,7 +181,7 @@ Headers - + Headers @@ -325,7 +325,7 @@ Source - + Source diff --git a/sfall/main.cpp b/sfall/main.cpp index e74ce7e3..e8486031 100644 --- a/sfall/main.cpp +++ b/sfall/main.cpp @@ -25,7 +25,7 @@ #include "AnimationsAtOnceLimit.h" #include "BarBoxes.h" #include "Books.h" -#include "Bugs.h" +#include "BugFixes.h" #include "BurstMods.h" #include "console.h" #include "CRC.h" @@ -385,7 +385,7 @@ void RemoveSavFiles() { void ClearSavPrototypes() { savPrototypes.clear(); - MapDirErase(_F_PROTO_CRITTERS, _F_SAV); + RemoveSavFiles(); } //////////////////////////////////////////////////////////////////////////////// @@ -714,8 +714,8 @@ static void DllMain2() { DWORD tmp; dlogr("In DllMain2", DL_MAIN); - dlogr("Running BugsInit().", DL_INIT); - BugsInit(); + dlogr("Running BugFixesInit().", DL_INIT); + BugFixesInit(); dlogr("Running SpeedPatchInit().", DL_INIT); SpeedPatchInit();