Compare commits

..
77 Commits
Author SHA1 Message Date
NovaRain 8f846eda6e Updated changelog for better clarity 2023-11-20 21:28:42 +08:00
NovaRain 572cbd059f Updated changelog 2023-11-20 10:20:02 +08:00
NovaRain f02ba1993b Fixed create_object_sid when passing 0 as the script index number
* would result in a crash. Now it allows creating an object with no
script (different from -1, which just doesn't touch default script).
2023-11-14 21:49:36 +08:00
NovaRain f800b7bb33 Tweaked the position of the ammo bar 2023-10-30 21:33:04 +08:00
NovaRain de3d6256e3 Fixed incorrect data for saved arrays
Updated version number.
2023-10-27 22:43:23 +08:00
NovaRain ae0f3d6fdc Fixed crash when calling start_gdialog outside talk_p_proc
(the fix was embedded in StartGDialogFix, now it works regardless of
the option.)
2023-10-19 15:18:17 +08:00
NovaRain f46ffb4ea5 Updated documents (mainly array functions) 2023-10-16 11:34:45 +08:00
NovaRain c7ecf1c070 Changed the "best armor" score calc to exclude EMP
(gameplay mod friendly)
2023-10-07 19:45:19 +08:00
NovaRain 8c277730bf Updated NPC combat control mod for player's Jinxed trait/perk
* controlled critters will now be "Jinxed" as well
2023-10-05 09:26:35 +08:00
NovaRain 898e7bb4e0 Removed AdditionalWeaponAnims from ddraw.ini (always enabled)
Updated version number.
2023-10-05 09:11:17 +08:00
NovaRain 3e955572be Corrected the description of CALCAPCOST hook 2023-09-30 17:18:51 +08:00
NovaRain 7fc5dc47b4 Fixed German translation 2023-08-26 01:41:58 +08:00
NovaRain 71e3ee4801 Improved compatibility with pre-SP4 Win2000
Moved the LoadLibrary call out of DllMain entry point.
Updated version number and changelog.
2023-08-24 21:42:27 +08:00
NovaRain 59eacce6be Updated changelog and other documents 2023-08-21 14:24:44 +08:00
NovaRain ff53d2515d Fixed UpdateHPStat() for not properly capping HP
* when a critter has modified base value of max HP in its proto.
2023-08-09 10:30:58 +08:00
NovaRain 8fd5182bb5 Renamed "string_pos" function to "string_find" 2023-08-09 08:57:03 +08:00
NovaRain 2677d9faa7 Fixed the backward compatibility of get_npc_level
(broken in commit 347dc85)
2023-08-04 09:15:01 +08:00
NovaRain 9fe3ed5d98 Headers update
- Synced a small number of defines from RPU headers
- Removed duplicate defines from define_lite
2023-07-31 20:55:34 +08:00
NovaRain e6610c4bbe Expanded the engine perk options in perks.ini 2023-07-31 20:54:54 +08:00
NovaRain 31630f6627 Added build instructions to readme 2023-07-27 08:24:47 +08:00
NovaRain 489f62f5cb Header fixes
- Fix conflict with RPU command_extra.h
- Fix undefined debug_array_str error
2023-07-24 08:36:28 +08:00
NovaRain 1f802cab6f Fixed incorrect int->float conversion in op_sub
Fixed ASM code in StealCheckHook from previous commit.
2023-07-23 08:21:37 +08:00
NovaRain 788593cdcc Backported the improvements of HOOK_STEAL
Edits to hookscripts.md and ddraw.ini.
2023-07-22 21:06:38 +08:00
NovaRain 680310f702 Re-added the check for valid objs to get/set_object_data
* disabled in combat for the combat data.
2023-07-19 20:56:31 +08:00
NovaRain 4f36136a39 Edited function and sslc docs 2023-07-17 20:54:57 +08:00
NovaRain 48355fa637 Minor code edits to BugFixes.cpp
Minor edits to some comments.
2023-07-14 09:46:53 +08:00
NovaRain 6af62af27d Backported "get_object_ai_data" script function
Updated headers and documents.
Edited error messages for some script functions.
2023-07-11 11:20:56 +08:00
NovaRain bd76a3ded7 Added upper/lower limits to the hit chance value
Edited hookscript docs.
2023-07-09 15:24:46 +08:00
NovaRain 3a08488895 Added "string_pos" function from 4.x
Added a check to PartyControl::OrderAttackPatch().
Updated function documents.
Updated scripting headers.
2023-07-05 22:20:14 +08:00
NovaRain 2941157174 Added NPC combat control mod to example mods
Updated item highlighting mod and NPC armor mod.
2023-07-03 15:35:03 +08:00
NovaRain 2148650313 Use explicit GetFileAttributesA function 2023-07-02 08:29:30 +08:00
NovaRain 6dee4e1183 Removed capping of console window position and size
* for multi-monitor setup, leaving only minimum size of 640x480.
2023-06-29 21:34:41 +08:00
NovaRain b2e60ba62e Backported IniConfigFolder option
* using C-string instead of std::string.
2023-06-28 08:52:28 +08:00
NovaRain a71c2c901a Removed unused bufSize argument from IniReader
Fixed return value of getString with buffer argument.
Increased max line length to 2048.
Added file check for books/drugs/enginetweaks ini files.
Fixed possible array index out of bound error in BarBoxes.
Added trimming to custom unarmed attack names.
2023-06-27 21:40:55 +08:00
NovaRain 4f3c1a60b4 Console window improvements
- Retain maximized/minimized state
- Save normal position when closing in maximized/minimized state
- Allow to move window in negative x direction
- Disable close button
- Save position if game was closed by pressing Alt+F4 in console window
2023-06-27 21:21:13 +08:00
NovaRain 9674c16928 Fixed position jumping for console window
Improved "string_format" script function.
Edited error messages for a few functions.
Updated documents.
2023-06-25 16:30:46 +08:00
NovaRain 0c035a05df op_create_spatial: fix spatial object having no scriptIndex upon creation
ConsoleWindow: prevent user from messing up window position & size
2023-06-24 09:07:10 +08:00
NovaRain 51cd2eab69 Unified the name of "GameRest" function in modules 2023-06-22 11:51:14 +08:00
NovaRain 323631835b Added arrary cache reset to get_ini_config
* prevent returning wrong arrays (left from previous session).

Removed "tr1" namespace (no needed for VS2010 and later).
Minor code edits.
2023-06-22 09:04:22 +08:00
NovaRain 135c26ab70 Load order: more informative logging
Code fixes to PartyControl.cpp and ConsoleWindow.cpp.

Updated version number in documents.

Updated changelog in sslc document, and removed the mention about
empty statements (it never worked).
2023-06-21 22:39:59 +08:00
NovaRain 34092900a6 Backported the module manager from 4.x 2023-06-20 11:16:30 +08:00
NovaRain c8fe92ef7d Updated document and sfall.h for get_ini_config 2023-06-19 22:18:01 +08:00
NovaRain b578aecc59 Backported INI parser from 4.x (part 2)
Added Config.cpp/h (core parser based on vanilla & Fallout CE).
Implemented the parser to IniReader.
Added "get_ini_config" function.
2023-06-19 22:15:37 +08:00
NovaRain b57a87f98f Backported INI parser from 4.x (part 1)
* Some misc code changes first.
* Changed saving game/console window positions in OnBeforeGameClose.
* Simplified arrays code a bit.
* Added binary string support to atoi.
2023-06-19 21:58:45 +08:00
NovaRain 2156f82184 Backported the buffer overflow fix for debug log from 4.x
Simplified ASM code in Premade.cpp a bit.
2023-06-17 22:01:36 +08:00
NovaRain be6947e3d2 Added code page setting for the console window 2023-06-15 23:28:04 +08:00
NovaRain f0784e2987 Updated the description in [ExtraPatches] for mods_order.txt
Tweaked the error log entry for mods_order.txt.
Minor code edits.
2023-06-15 13:40:12 +08:00
NovaRain 1a6a9e5ec1 Backported ConsoleWindow option from 4.x 2023-06-15 13:27:56 +08:00
NovaRain 0be6011c19 Removed debug message about missing critter art from displaying in-game
* to prevent unnecessary annoyance to generic players.

Added a safeguard to get_tile_fid.
Fixed crash in debug build due to stdcall not being specified.
2023-06-14 09:48:51 +08:00
NovaRain 6f45d45fcd Updated documents for hook/function changes 2023-06-13 12:33:28 +08:00
NovaRain f413bb8b9a Backported the new mods_order.txt mechanism 2023-06-13 12:12:07 +08:00
NovaRain e3907c3647 Allow passing string directly to set_sfall_return in HOOK_DESCRIPTIONOBJ
- HookScripts: track return types in addition to values
- Set allowNonIntReturn in hook code to allow non-int return values to be accepted
- Moved get_sfall_arg and set_sfall_return opcodes to the new table
2023-06-13 12:07:04 +08:00
NovaRain 007386caec Backported get_tile_fid improvements from 4.x 2023-06-13 12:05:00 +08:00
NovaRain c593269ee7 Fixed get_tile_fid function to work on elevation 1 and 2
* it now follows dude elevation.
2023-06-12 23:20:49 +08:00
NovaRain 1976461b72 Fixed invWieldFunc for non-weapon/armor items
Fixed lib.inven.h header from develop branch.
2023-06-12 22:50:21 +08:00
NovaRain 9fa123d15f Added get_combat_free_move metarule
Updated documents and headers.
Added PartyOrderToAttack to ddraw.ini.
2023-06-09 11:19:45 +08:00
NovaRain 3b6435d8a4 Backported HOOK_COMBATTURN from 4.2
* using pre-4.2.8 codebase

Replaced ControlCombat option with PartyOrderToAttack.
Updated documents.
2023-06-07 21:48:54 +08:00
NovaRain 7322634780 Backported three game hooks from 4.x:
* ROLLCHECK, BESTWEAPON, CANUSEWEAPON

Updated documents.
2023-06-06 21:46:03 +08:00
NovaRain 7f0398c618 Added options to override the names of sound files for game modes
Remove the worldmap/credits music override from Fallout1Behavior.
(was added in commit 41a1fea)

Minor edits to ddraw.ini.
2023-06-05 11:46:07 +08:00
NovaRain 4e3f065453 Updated headers and function document from 4.x 2023-06-05 11:03:51 +08:00
NovaRain 378bc8a126 Added set_combat_free_move metarule and 2 args to HOOK_STDPROCEDURE
Added a missing hack from 4.x to PartyControl.cpp.
2023-06-05 10:42:02 +08:00
NovaRain e92c994744 Added a new example mod gl_rest_encounter
Added a burst control example script.
2023-06-02 15:15:01 +08:00
NovaRain a1d0e59287 Fixed crash when using NumbersInDialogue
(revert commit 576bea2)
2023-06-01 15:58:23 +08:00
NovaRain 40f2050f8c Minor edits to ddraw.ini and define_extra.h 2023-05-29 15:22:45 +08:00
NovaRain c33c200b51 Sync header changes with develop branch 2023-05-25 09:37:54 +08:00
NovaRain 26693fd0ed Decoupled hook type 2 of HOOK_AMMOCOST from CheckWeaponAmmoCost
Edits to documents to reflect the hook change.
Changed CheckWeaponAmmoCost to be enabled by default.
Updated version number.
2023-05-20 10:59:26 +08:00
NovaRain 033c8bf8ef Randomized one extra bullet for side groups in burst attacks
* idea from phobos2077.

Added minimum value check to multipliers.
2023-05-19 09:54:49 +08:00
NovaRain ddf2854938 Added "set_spray_settings" function for scriptable burst
Added documentation for set_spray_settings.
Remove postbuild.cmd from git.
2023-05-19 09:51:58 +08:00
NovaRain 637de0e07d Fixed "divided by zero" error when returning 0 in AMMOCOST hook
* with CheckWeaponAmmoCost=1.

Added a value check to the return value of AMMOCOST hook.
Updated hookscripts.md to reflect this change.
2023-05-18 10:02:07 +08:00
NovaRain ff1c87f0c5 Updated gl_compute_damage example script from 4.x
* with script-based YAAM implementation.

Sync header changes with develop branch.

Changed AttackSubType enum "GUNS" to "RANGED".
(to be in line with define_extra.h, the naming is from RE/CE.)
2023-05-15 12:16:23 +08:00
NovaRain 66c0ed8cb2 Updated some defines
- ATKMODE defines removed to avoid confusion - these are really two 4-bit fields, not bit flags!
2023-05-14 08:24:02 +08:00
NovaRain f3bbfbfa28 Sync header changes with develop branch 2023-05-08 17:30:09 +08:00
NovaRain 41a1fead58 Expanded the functionality of Fallout1Behavior
* change the world map music and the credits music to match FO1 files.

Increased the maximum value of the combat speed slider.
Some minor code edits.
2023-04-30 09:21:53 +08:00
NovaRain a0cf633899 Tweaked set_pc/critter_base/extra_stat script functions
* before they didn't update derived stats when setting SPECIAL, for
the player it requires accessing the char screen to update.

Replaced some proto_ptr() usages with GetProto().
2023-04-22 23:46:16 +08:00
NovaRain a09611edc6 Backported the "order to attack" function from 4.x
Updated translation ini files.
Updated version number.
2023-04-19 10:35:59 +08:00
NovaRain 291370a96c Attempt for reproducible builds
* ducible.exe is built with v140_xp toolset and /arch:SSE.

Code edits to Interface.cpp.

* to avoid error C3068 for Debug config in VS2010.
2023-04-17 10:09:21 +08:00
NovaRain 576bea2aa9 Minor code edits to MiscPatches.cpp 2023-04-12 10:04:43 +08:00
217 changed files with 5073 additions and 1988 deletions
+1
View File
@@ -26,6 +26,7 @@
*.exe
*.out
*.app
!ducible.exe
# NetBeans
nbproject/private/
+60 -12
View File
@@ -1,5 +1,54 @@
# Changelog
## 3.8.41
* Fixed a bug introduced in 3.8.40 that broke the interoperability of saved arrays with older versions
* Fixed a crash when calling `start_gdialog` outside the `talk_p_proc` procedure for talking heads
* Fixed `create_object_sid` script function to allow creating an object with no script correctly when passing 0 as the script index number
* Changed the calculation of the **'best armor'** score to exclude the EMP stats (gameplay mod friendly)
* Tweaked the position of the ammo bar on the interface bar
* Removed **AdditionalWeaponAnims** from `ddraw.ini`. Now additional weapon animation codes are always available
* Updated **NPC combat control mod** in the modders pack to make the player's **Jinxed** trait/perk affect all controlled critters
## 3.8.40.1
* Improved compatibility with older Windows 2000 (**pre-SP4**)
## 3.8.40
* Implemented a `mods_order.txt` to improve and simplify mod ordering and add support for mod managers. This replaces previous **.dat** file autoloading. Please refer to `ddraw.ini` for details
* Implemented a **custom config file parser**, which greatly improves the performance of sfall initialization and reading files from scripts
* Fixed a bug when updating the maximum HP stat of critters on the map when loaded for the first time
* Fixed `set_pc_base/extra_stat` and `set_critter_base/extra_stat` script functions not updating derived stats when setting SPECIAL stats
* Fixed `wield_obj_critter` script function, which can now put non-weapon/armor items in the critter's hand
* Fixed `get_tile_fid` script function to work on elevations 1 and 2 instead of always elevation 0
* Fixed `create_spatial` script function not setting the script index number upon object creation
* Fixed incorrect behavior of the subtraction operator involving floats and negative integers
* Fixed the backward compatibility of `get_npc_level` script function
* Fixed a crash bug in `display_msg` and `debug_msg` script functions when printing a string longer than 260 characters
* Fixed a crash bug in `AMMOCOST` hook when returning ammo cost of 0 for burst attacks
* Fixed various issues in script compiler and decompiler (`compile.exe` and `int2ssl.exe` in the **modders pack**)
* Improved and tweaked the behavior of **ComputeSpray_\*** options
* Expanded `atoi` script function to support parsing binary strings
* Expanded `string_format` script function to support more arguments and conversion types
* Changed **CheckWeaponAmmoCost** to be enabled by default and affect only hook type 1 of `HOOK_AMMOCOST` hook script
* Changed how `HOOK_DESCRIPTIONOBJ` hook script handles its return value. Now you can return normal strings directly in the hook
* Re-added the check for valid objects to `get/set_object_data` script functions (only disabled in combat for accessing the combat data)
* Removed the debug message about a missing critter art file from displaying in the game (added in 3.8.22)
* Removed the old built-in **NPC combat control** and added a script-based version to the example mods in the **modders pack**
* Added an option to let you use the command cursor to specify targets for party members to attack in combat
* Added an option to specify an additional directory for ini files used by scripts
* Added options to override the names of sound files used by the engine
* Added a debug option to duplicate logs to a dedicated console window alongside the game window
* Added a lower limit of -99% and an upper limit of 999% to the hit chance value to prevent a display issue
* Added more options for tweaking some engine perks to the **perks ini file**
* Added a new argument and a new return value to `HOOK_STEAL` hook script
* Added a burst control example script and a resting encounters mod to the example mods in the **modders pack**
* Updated the compute damage example script in the **modders pack**. Now it should be easier to write one's own damage formula
* Updated **NPC armor appearance mod** in the **modders pack** to prevent NPCs from equipping **unusable** weapons
* Updated **item highlighting mod** in the **modders pack** to match the feature set of the 4.x version
* Increased the setting range of the combat speed slider in the preferences screen
* Backported script functions from 4.0/4.1: `set_dude_obj`, `get_object_ai_data`
* Backported hook scripts from 4.x: `hs_combatturn`, `hs_rollcheck`, `hs_bestweapon`, `hs_canuseweapon`
* New script functions: `set_spray_settings`, `get/set_combat_free_move`, `get_ini_config`, `string_find`
## 3.8.38
* Fixed a bug introduced in 3.8.30 that could cause unexpected behavior for burst attacks at close range
* Fixed a bug introduced in 3.8.31 that caused the game to display incorrect names for corpses in some cases
@@ -43,7 +92,7 @@
## 3.8.35
* Fixed the handling of obsolete script functions that are still recognized by script compiler and decompiler
* Improved the fix for updating the HP stats of critters on the map when loaded for the first time
* Improved the fix for updating the maximum HP stat of critters on the map when loaded for the first time
* Removed **DivisionOperatorFix** from `ddraw.ini` because there is little reason to turn it off
* Removed **ComputeSprayMod** from `ddraw.ini`. Now **ComputeSpray_\*** options no longer require a master switch
* Added a fix for a crash when the player equips a weapon overloaded with ammo
@@ -53,7 +102,7 @@
## 3.8.34
* Minor fixes to **LocalMapXLimit/LocalMapYLimit** options and the built-in **item highlighting mod**
* Removed **FadeBackgroundMusic** option because the fix in 3.8.33 doesn't work reliably in all cases
* Added a fix for being unable to plant items on non-biped critters with the `Barter` flag set (e.g. Skynet and Goris)
* Added a fix for being unable to plant items on non-biped critters with the **'Barter'** flag set (e.g. Skynet and Goris)
* Updated the ammo ini loader mod in the **modders pack**
## 3.8.33.1
@@ -123,7 +172,6 @@
* Added 5 `metarule3` macros for controlling the save slot with scripts to `sfall.h` in the **modders pack**
* Added a `sfall.dat` resource file, which contains the required files for various features. The localized `sfall_xx.dat` is also supported
* New script functions: `set_scr_name`, `obj_is_openable`
* Updated **NPC armor appearance mod** to prevent NPCs from equipping **unusable** weapons
* Included Brazilian Portuguese and Polish translation (from Felipefpl and Jaiden)
## 3.8.30.2
@@ -148,7 +196,7 @@
* Fixed the error handling in `create_object_sid` script function to prevent a crash when the proto is missing
* Fixed `METARULE_CURRENT_TOWN` metarule function not returning the correct index of the current town at the start of a new game
* Fixed the auto-close containers mod for gravesites and not closing containers in some cases (in the **modders pack**)
* Fixed and improved the functionality of **AllowLargeTiles**. Now it requires a `gridmask.frm` file (included in the **modders pack**) in the `art\tiles\`` directory
* Fixed and improved the functionality of **AllowLargeTiles**. Now it requires a `gridmask.frm` file (included in the **modders pack**) in the `art\tiles\` directory
* Restored the functionality of `obj_under_cursor` script function for the movement cursor (changed in 3.8.29)
* Improved the **hero appearance mod** to be able to load the interface text from `text\<language>\game\AppIface.msg`
* Improved the functionality of **TranslationsINI** to also search for the ini file relative to the `text\<language>\` directory
@@ -173,7 +221,7 @@
* Added a tweak to remove the unspent skill points limit
* Added an option to disable the special handling of city areas 45 and 46 in the engine when visiting Area 45
* Added an option to load alternative dialog msg and subtitle files for female PC (translation friendly)
* Added an option to allow using the special `'^'` character in dialog msg files to specify the alternative text that will be displayed in the dialogue based on the player's gender
* Added an option to allow using the caret character `'^'` in dialog msg files to specify alternative text in dialogue based on the player's gender
* Added a new value to **AIDrugUsePerfFix** to allow NPCs to use only the drugs listed in `chem_primary_desire` and healing drugs
* Added support for loading premade character **GCD/BIO** files from the `premade\<language>\` directory for non-English languages
* Added support for loading fonts from the `fonts\<language>\` directory for non-English languages
@@ -211,7 +259,7 @@
* Added `snd2acm_fix.exe` (snd2acm with a fix wrapper) to the **modders pack** for writing the correct sample rate and channel info from **WAV** files to **ACM** format
* Backported script functions from 4.0/4.1: `get_ini_sections`, `get_ini_section`, `add_extra_msg_file`
* Backported 4 new modes for `metarule2_explosions` function from 4.1
* Backported `HOOK_ADJUSTFID` and `HOOK_GAMEMODECHANGE` hook scripts from 4.2
* Backported hook scripts from 4.2: `hs_adjustfid`, `hs_gamemodechange`
* Backported `SPECIAL` game mode flag from 4.2 (when switching from dialog mode to barter mode, or a party member joins/leaves in the dialog screen)
* New script functions: `interface_overlay`
@@ -224,9 +272,10 @@
## 3.8.28
* Fixed a bug introduced in 3.8.23 that could cause unexpected behavior in global scripts
* Fixed a bug in **ObjCanSeeObj_ShootThru_Fix** that caused the source to be unable to see the target if it has the `ShootTrhu` flag set
* Fixed a bug in **ObjCanSeeObj_ShootThru_Fix** that caused the source to be unable to see the target if it has the **'ShootTrhu'** flag set
* Fixed the encounter messages still being limited to 50 entries per table when **EncounterTableSize** is set to greater than 50
* Fixed temporary arrays in scripts being cleared when flushing the keyboard buffer
* Fixed the broken `Print()` script function
* Improved the field of view check in **ObjCanSeeObj_ShootThru_Fix**
* Improved the functionality of **GlobalShaderFile** to be able to load multiple shader files
* Improved the performance of **DX9** graphics modes
@@ -238,7 +287,6 @@
* Added a fix for the flags of critters in the line of fire not being taken into account when calculating the hit chance penalty of ranged attacks
* Added a fix to the check for ranged weapons in the **Fast Shot** trait and **FastShotFix**
* Added a fix for the background image of the character portrait on the player's inventory screen
* Added a fix for the broken `Print()` script function
* Added the original Fallout 1 behavior of the **Fast Shot** trait to **FastShotFix**
* Added a tweak to keep the selected attack mode when moving the weapon between active item slots
* Added an option to enable linear texture filtering for **DX9** graphics modes
@@ -617,7 +665,7 @@ Various bug fixes and features based on the work by Mr.Stalin:
* Improved the functionality of **CritterInvSizeLimitMode** and added party member's current/max inventory size info to the combat control panel
* Improved the functionality of **AllowDShowSound**: added volume control support and the ability to play alternative music files even if original **ACM** files are not present in the music folder, and fixed initialization crash bug when **DX9** mode is disabled
* Improved the functionality of **ExtraSaveSlots**: added sound effect when clicking on the navigation buttons
* Improved the fix for `start_gdialog` script function to fix a crash if calling `start_gdialog` outside of the `talk_p_proc` procedure for talking heads
* Improved the functionality of **StartGDialogFix** to fix a crash when calling `start_gdialog` outside the `talk_p_proc` procedure for talking heads
* Improved and expanded the functionality of **UseScrollingQuestsList** to display page numbers and add another set of scroll buttons
* Expanded `is_iface_tag_active` script function to check tag value of 0/1/2 (sneak/poisoned/radiated)
* Added a fix for the broken `obj_can_hear_obj` script function
@@ -635,9 +683,9 @@ Various bug fixes based on the work by Mr.Stalin:
* Fixed an issue with file IDs of additional game msg files being shifted when a file in **ExtraGameMsgFileList** is missing
* Fixed `obj_can_see_obj` script function not checking if source and target objects are on the same elevation before calling `HOOK_WITHINPERCEPTION` hook script
* Added a fix for the display issue in the pipboy when a quest list is too long with **UseScrollingQuestsList** diabled
* Added a fix for the clickability issue of holodisk list in the pipboy
* Added a fix for the clickability issue of the holodisk list in the pipboy
* Added a fix for multihex critters moving too close and overlapping their targets in combat
* Added a fix for AI not checking weapon perks properly when choosing the best weapon in combat
* Added a fix for AI not checking weapon perks properly when choosing the best weapon
## 3.8.10
* Added an option to use Fallout's normal text font instead of DOS-like font on the world map
@@ -713,7 +761,7 @@ Original engine bug fixes and various features based on the work by Crafty:
* Fixed broken `call_offset_*` script functions
* Fixed **OverrideMusicDir** not using the correct path string
* Fixed a bug in `metarule2_explosions` function that caused damage type change not to work
* Fixed a crash if calling `reg_anim_obj_run_to_tile` after `reg_anim_combat_check`
* Fixed a crash when calling `reg_anim_obj_run_to_tile` after `reg_anim_combat_check`
* Changed `sfallgv.sav` to be loaded before other save game files to make saved arrays available in the start procedure
* Changed **BodyHit_Torso** to **BodyHit_Torso_Uncalled** because it sets both *body_torso* and *body_uncalled* hit modifiers
+14
View File
@@ -42,6 +42,20 @@ In a default installation using an unmodified copy of `ddraw.ini`, the middle mo
For [__Wine__](https://www.winehq.org/) users:\
You need to set DLL overrides for `ddraw.dll` to __"native, builtin"__ in `winecfg` or use `WINEDLLOVERRIDES="ddraw=n,b"` to run Fallout from the command line. If you want to play alternative sound files, you'll also need to install GStreamer Good 32-bit plugins.
## Build Instructions
### Prerequisites:
* Visual C++ 2010 Express SP1 or Visual Studio 2010 SP1.
* [DirectX SDK (February 2010)](https://archive.org/details/dxsdk_feb10). You will also need `dinput.lib` from DXSDK August 2007. The file can be found in the [DirectX SDK Collection repo](https://github.com/NovaRain/DXSDK_Collection).
* [DirectX Runtime (June 2010)](https://www.microsoft.com/en-us/download/details.aspx?id=8109).
### Steps:
1. Set up a `postbuild.cmd` using the template from the repo.
2. Open the solution file and build with the **Release** configuration.
3. If everything is set up correctly, you should have a new sfall `ddraw.dll` in your Fallout 2 directory.
## Additional info
* [Changelog](CHANGELOG.md)
+57 -2
View File
@@ -7,10 +7,39 @@
; be used to remove their hardcoded effects, and add new stat/skill effects
[PerksTweak]
;Changes the Outdoorsman skill bonus for 'Survivalist' perk (ID 16)
;125 - maximum bonus, 25 - default bonus
SurvivalistBonus=25
;Changes the bonus for 'Master Trader' perk (ID 17)
;25 - default bonus
MasterTraderBonus=25
;Changes the Science and Repair skill bonus for 'Mr.Fixit' perk (ID 31)
;125 - maximum bonus, 10 - default bonus
MrFixitBonus=10
;Changes the skill bonuses for 'Medic' perk (ID 32)
;125 - maximum bonus, 10 - default bonus
MedicFirstAidBonus=10
MedicDoctorBonus=10
;Changes the Lockpick and Steal skill bonus for 'Master Thief' perk (ID 33)
;125 - maximum bonus, 15 - default bonus
MasterThiefBonus=15
;Changes the Speech skill bonus for 'Speaker' perk (ID 34)
;125 - maximum bonus, 20 - default bonus
SpeakerBonus=20
;Changes the Sneak skill bonus (when in darkness) for 'Ghost' perk (ID 38)
;125 - maximum bonus, 20 - default bonus
GhostBonus=20
;Changes the Outdoorsman skill bonus for 'Ranger' perk (ID 47)
;125 - maximum bonus, 15 - default bonus
RangerOutdoorsmanBonus=15
;Changes the distance bonus for 'Weapon Long Range' weapon perk (ID 58)
;2 - no bonus, 4 - default bonus
WeaponLongRangeBonus=4
@@ -34,9 +63,22 @@ VaultCityInoculationsRadBonus=10
;999 - maximum bonus, 10 - default bonus
DemolitionExpertBonus=10
;Changes the damage bonus for 'Living Anatomy' perk (ID 97)
;125 - maximum bonus, 5 - default bonus
;Changes the Gambling skill bonus for 'Gambler' perk (ID 83)
;125 - maximum bonus, 20 - default bonus
GamblerBonus=20
;Changes the Steal skill bonus for 'Harmless' perk (ID 91)
;125 - maximum bonus, 20 - default bonus
HarmlessBonus=20
;Changes the damage bonus and the Doctor skill bonus for 'Living Anatomy' perk (ID 97)
;125 - maximum bonus, 5 - default bonus, 10 - default skill bonus
LivingAnatomyBonus=5
LivingAnatomyDoctorBonus=10
;Changes the Speech and Barter skill bonus for 'Negotiator' perk (ID 99)
;125 - maximum bonus, 10 - default bonus
NegotiatorBonus=10
;Changes the damage bonus for 'Pyromaniac' perk (ID 101)
;125 - maximum bonus, 5 - default bonus
@@ -50,10 +92,23 @@ SalesmanBonus=20
;valid range: 0..100, 50 - default percent
StonewallPercent=50
;Changes the Lockpick, Steal, and Traps skill bonus for 'Thief' perk (ID 105)
;125 - maximum bonus, 10 - default bonus
ThiefBonus=10
;Changes the strength bonus for 'Weapon Handling' perk (ID 106)
;0 - no bonus, 10 - maximum bonus, 3 - default bonus
WeaponHandlingBonus=3
;Changes the skill bonuses for 'Vault City Training' perk (ID 107)
;125 - maximum bonus, 5 - default bonus
VaultCityTrainingFirstAidBonus=5
VaultCityTrainingDoctorBonus=5
;Changes the Speech skill bonus for 'Expert Excrement Expeditor' perk (ID 116)
;125 - maximum bonus, 5 - default bonus
ExpertExcrementExpeditorBonus=5
;##############################################################################
[Perks]
;Set to 1 to enable the modifications for perks
+4
View File
@@ -14,6 +14,10 @@ NPCPickupFail=%s cannot pick up the item.
AmmoInfoGlovz=Div: DR/%d, DT/%d
AmmoInfoYAAM=DT Mod: %d
PartyOrderAttackHuman=I'll take care of it.|Okay, I got it.|Sounds like a plan.
PartyOrderAttackCreature=::Growl::
PartyOrderAttackRobot=::Beep::
[AppearanceMod]
RaceText=Race
StyleText=Style
+66 -30
View File
@@ -1,5 +1,5 @@
;sfall configuration settings
;v3.8.38
;v3.8.41
[Main]
;Set to 1 if you want to use command line arguments to tell sfall to use another ini file
@@ -15,11 +15,19 @@ UseCommandLine=0
;This section allows you to set multiple paths to folders containing mods or patches
;Paths to folders and Fallout .dat files are supported
;The PatchFileXX options are available from 0 to 99. Larger numbers take precedence over smaller numbers (same as patchXXX.dat)
;The complete data load order is:
;master_patches > critter_patches > PatchFile99..PatchFile0 > patchXXX.dat > sfall.dat > critter_dat > f2_res_patches > f2_res_dat > master_dat
;Starting from 4.4/3.8.40, the game will load custom .dat files and folders from <GameRoot>\mods\mods_order.txt
;The files and folders in mods_order.txt will have a higher priority than the PatchFileXX options
;The complete order of how the engine loads game data is:
;master_patches > critter_patches > mods_order.txt > PatchFileXX > patchXXX.dat > sfall.dat > critter_dat > f2_res_patches > f2_res_dat > master_dat
;PatchFile0=mods\RP_data
;PatchFile1=
;Some details about mods_order.txt:
;If mods_order.txt does not exist, sfall will create one in <GameRoot>\mods\
;To install a new mod, copy the file/folder to <GameRoot>\mods\ and add its name to mods_order.txt
;Mods will be loaded line by line from top to bottom. You can change the load order in a text editor
;To disable a mod temporarily, you can comment it out by adding a ';' or '#' to the beginning of the line
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
[Speed]
;Set to 1 to enable options related to the game speed adjustment (SpeedMulti#, SpeedKey#, SpeedModKey, and SpeedToggleKey)
@@ -58,7 +66,7 @@ GraphicsWidth=0
GraphicsHeight=0
;Window position data. Do not modify
;Set to -1 or 0 to reset if the window position is incorrect
;Set to -1 or 0 to reset the window position to the center or top-left corner
WindowData=-1
;Uncomment the option to use a hardware shader (requires DX9 graphics mode)
@@ -78,7 +86,7 @@ TextureFilter=1
GPUBlt=0
;Set to 1 to allow using 32-bit textures for talking heads
;The texture files should be placed in art\heads\<name of the talking head FRM file>\ (w/o extension)
;The texture files should be placed in art\heads\<name of the talking head FRM file>\ (without extension)
;The files in the folder should be numbered according to the number of frames in the talking head FRM file (0.png, 1.png, etc.)
;See the text file in the modders pack for a detailed description
;Requires DX9 graphics mode and v2.0 pixel shader support (see GPUBlt option)
@@ -131,6 +139,15 @@ OverrideMusicDir=1
;This will slightly increase the startup time of the game on older computers
AutoSearchSFX=1
;Uncomment these lines to override the names of sound files used by the engine
;Filenames are limited to 8 characters (without extension)
;MainMenuMusic=07desert
;WorldMapMusic=23world
;WorldMapCarMusic=20car
;EndGameMovieMusic0=akiss
;EndGameMovieMusic1=10labone
;MapLoadingSound=wind2
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
[Input]
;Set to 1 to enable the mouse scroll wheel to scroll through the inventory, barter, and loot screens
@@ -206,7 +223,7 @@ HighlightCorpses=0
;16 - bright yellow
;32 - dark yellow
;64 - purple
;You can set a custom color from the game palette by multiplying the color index value by 256 (available since sfall 3.8.27)
;You can set a custom color from the game palette by multiplying the color index value by 256 (in 3.8.27 or later)
OutlineColor=16
;A key to press to reload your currently equipped weapon or use the active item
@@ -279,9 +296,9 @@ UseFileSystemOverride=0
;If you want to load multiple patch files (up to 1000) at once, you can include a %d in the file name (sprintf syntax)
;PatchFile=patch%03d.dat
;Set to 1 to use the modified data load order for the engine to find game data
;Original: patchXXX.dat > critter_patches > critter_dat > f2_res_patches > f2_res_dat > master_patches > master_dat
;Modified: master_patches > critter_patches > extra_patches > patchXXX.dat > sfall.dat > critter_dat > f2_res_patches > f2_res_dat > master_dat
;Set to 1 to change the order of how the engine loads game data
;Old: patchXXX.dat > critter_patches > critter_dat > f2_res_patches > f2_res_dat > master_patches > master_dat
;New: master_patches > critter_patches > [ExtraPatches] > patchXXX.dat > sfall.dat > critter_dat > f2_res_patches > f2_res_dat > master_dat
;This option is always enabled in 4.3/3.8.30 or later. The information is left for reference only
DataLoadOrderPatch=1
@@ -289,21 +306,20 @@ DataLoadOrderPatch=1
;Set to 2 to also load subtitle files from text\<language>\cuts_female\ for female PC
FemaleDialogMsgs=0
;Set to 1 to allow using the special '^' character in dialog msg files to specify the alternative text
;that will be displayed in the dialogue based on the player's gender
;Set to 1 to allow using the caret character '^' in dialog msg files to specify alternative text in dialogue based on the player's gender
;The text must be enclosed in angle brackets (example: <MaleText^FemaleText>)
DialogGenderWords=0
;To change the default and starting player models, uncomment the next four lines.
;The default models can also be changed ingame via script
;The default models can also be changed in-game via script
;MaleStartModel=hmwarr
;MaleDefaultModel=hmjmps
;FemaleStartModel=hfprim
;FemaleDefaultModel=hfjmps
;To change the various ingame movies, modify the next 17 lines
;To change the various in-game movies, modify the next 17 lines
;You can also define additional movies by adding Movie18 - Movie32 lines
;Most of these can also be changed ingame via script
;Most of these can also be changed in-game via script
Movie1=iplogo.mve
Movie2=intro.mve
Movie3=elder.mve
@@ -391,6 +407,7 @@ SaveInCombatFix=1
;Set to 1 to enable additional weapon animation codes from 'o' to 't'
;The 4 byte value at 0x39 of weapon protos may range from 0 to 15 rather than 0 to 10
;Since the letters 'n' and 'r' are in use for other animations, an animation code of 11 corresponds to 's' and 15 to 't'
;This option is always enabled in 4.4.1/3.8.41 or later. The information is left for reference only
AdditionalWeaponAnims=1
;Uncomment these lines to modify the default modifiers for aimed shots at specific bodyparts
@@ -517,7 +534,7 @@ ScienceOnCritters=0
;Default is 166 (lower - faster; valid range: 0..1000)
SpeedInventoryPCRotation=166
;Modify the number of the extra interface boxes available to modders. (Default is 5, and the maximum is 95)
;Modify the number of the extra interface boxes available to modders (Default is 5, and the maximum is 95)
BoxBarCount=5
;Uncomment to set the text colour of the extra interface boxes
@@ -530,10 +547,10 @@ BonusHtHDamageFix=1
;Set to 1 to display additional points of damage from Bonus HtH/Ranged Damage perks in the inventory
DisplayBonusDamage=0
;Modify the maximum number of animations allowed to run on a map. (Default is 32, and the maximum is 127)
;Modify the maximum number of animations allowed to run on a map (Default is 32, and the maximum is 127)
AnimationsAtOnceLimit=64
;Set to 1 to remove the limits that stop the player rolling critical successes/misses in the first few days of game time
;Set to 1 to remove the limits that stop the game from rolling critical successes/failures in the first few days of game time
RemoveCriticalTimelimits=0
;Change the colour of the font used on the main menu for the Fallout/sfall version string and copyright text
@@ -620,10 +637,10 @@ ExplosionsEmitLight=0
;MovieTimer_artimer3=270
;MovieTimer_artimer4=360
;Set to 1 to add proper check for ammo before attacking and proper calculation of the number of burst rounds
;By default, weapons can make attacks when at least one ammo is left, regardless of ammo cost calculations
;Set to 1 to add proper checks for ammo before attacking
;By default, a weapon can perform an attack with at least one ammo, regardless of ammo cost calculation
;Note that enabling this option will prevent super cattle prods and mega power fists from attacking with only one ammo left
CheckWeaponAmmoCost=0
CheckWeaponAmmoCost=1
;Controls the speed of combat panel animations (lower - faster; valid range: 0..65535)
CombatPanelAnimDelay=1000
@@ -632,13 +649,9 @@ DialogPanelAnimDelay=33
;Controls the speed of pipboy alarm clock animations (lower - faster; valid range: 0..127)
PipboyTimeAnimDelay=50
;Allows you to directly control other critters in combat
;Set to 0 to disable
;Set to 1 to control all critters in combat (allowed only in sfall debugging mode)
;Set to 2 to control all party members
ControlCombat=0
;If you want to control only specific critters, uncomment the ControlCombatPIDList line and set a comma delimited list of PIDs
;ControlCombatPIDList=62,89,97,107,160,161
;Set to 1 to let you use the command cursor to specify targets for party members to attack in combat
;The 'Attack Who' preference in the combat control panel of party members must be set to 'Whomever you want'
PartyOrderToAttack=0
;Changes the way weapon reloading works when you drag ammo onto a weapon in the inventory
;Set to -1 to disable (vanilla behavior with the 'Move Items' window)
@@ -752,7 +765,7 @@ AIBestWeaponFix=1
;Set to 1 to fix NPCs not taking chem_primary_desire in AI.txt as a preference list when using drugs in their inventory
;Set to 2 to allow NPCs to use only the drugs listed in chem_primary_desire and healing drugs (stimpaks and healing powder)
;Note: chem_primary_desire w/o fixes prevents the specified item PID from being consumed if all three values in the list are the same PID
;Note: chem_primary_desire without fixes prevents the specified item from being consumed if all three values in the list are the same PID
;chem_primary_desire also works as a priority list of drug items the NPC will try to pick up in combat when they are on the ground
AIDrugUsePerfFix=0
@@ -809,6 +822,13 @@ DisableSpecialAreas=0
;To change some engine parameters for the game mechanics, uncomment the next line
;TweaksFile=sfall\Tweaks.ini
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
[Scripts]
;Uncomment the option to specify an additional directory for ini files used by scripts
;The game will search for ini files first relative to this directory and then relative to the root directory if not found
;The path length is limited to 61 characters
;IniConfigFolder=mods\iniConfigs
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
[Debugging]
;Extra sfall configuration settings that can be used by modders
@@ -832,7 +852,7 @@ AllowUnsafeScripting=0
SkipCompatModeCheck=0
;Fallout 2 Debug Patch
;Set to 1 to send debug output to the screen, 2 to a debug.log file, or 3 to both the screen and debug.log
;Set to 1 to send debug output to the screen, 2 to a debug.log file, or 3 to both
;Does not require sfall debugging mode
;While you don't need to create an environment variable, you do still need to set the appropriate lines in fallout2.cfg
;-------
@@ -870,7 +890,7 @@ AlwaysFindScripts=0
Test_ForceFloats=0
;These options control what output is saved in the debug log (sfall-log.txt)
;Prints messages duing sfall initialization
;Prints messages during sfall initialization
Init=1
;Prints messages relating to hook scripts
Hook=0
@@ -880,3 +900,19 @@ Script=0
Criticals=1
;Prints messages relating to engine fixes
Fixes=1
;Duplicates logs to a dedicated console window alongside the game window
;This option uses bit flags to control the types of messages to be shown
;All types other than sfall log (bit 1) require DebugMode to be enabled
;1 (bit 0) - debug output from the engine
;2 (bit 1) - sfall log
;4 (bit 2) - messages from debug_msg script function
;8 (bit 3) - messages from display_msg script function
ConsoleWindow=0b0000
;Console window position and size data. Do not modify
;Clear the data to reset the window position and size
ConsoleWindowData=
;Set the code page for the console window (Default is your system code page)
ConsoleCodePage=0
@@ -0,0 +1,30 @@
/*
A basic example of how to use set_spray_settings function for script-based burst control
*/
#include "..\headers\define.h"
#include "..\headers\sfall\define_extra.h"
#include "..\headers\sfall\sfall.h"
procedure start;
procedure ammocost_handler;
procedure start begin
if game_loaded then begin
register_hook_proc(HOOK_AMMOCOST, ammocost_handler);
end
end
procedure ammocost_handler begin
variable
weapon := get_sfall_arg,
bullets := get_sfall_arg,
cost := get_sfall_arg,
event := get_sfall_arg;
if (event == 2 and weapon > 0) then begin // when calculating number of burst rounds
if (obj_pid(weapon) == PID_ASSAULT_RIFLE) then begin
set_spray_settings(1, 1, 1, 1); // burst attack will not hit other targets
end
end
end
@@ -1,28 +1,69 @@
/*
Example algorithm of how the game engine calculates combat damage
This script reimplements the combat damage calculation of the original game.
Use this to implement your own damage formula!
*/
#include "..\headers\define.h"
#include "..\headers\command.h"
#include "..\headers\sfall\sfall.h"
#include "..\headers\sfall\define_extra.h"
#include "../sfall/define_lite.h"
#include "../sfall/define_extra.h"
#include "../sfall/sfall.h"
#define DAMAGE_FORMULA_VANILLA (0)
#define DAMAGE_FORMULA_GLOVZ (1)
#define DAMAGE_FORMULA_GLOVZ2 (2)
#define DAMAGE_FORMULA_YAAM (5)
procedure start;
procedure compute_damage_F2;
procedure item_w_damage_hook;
procedure combatdamage_handler;
procedure itemdamage_handler;
procedure calc_damage_YAAM(variable weapon, variable rounds, variable armorDT, variable armorDR, variable bonusRangedDamage, variable multiplyDamage, variable difficulty);
procedure item_w_subtype(variable weapon, variable hit_mode);
procedure get_ammo_value(variable weapon, variable param);
variable item_w_damage;
variable
damage_formula,
item_damage_min,
item_damage_max,
item_damage_weapon,
item_damage_attacker;
procedure start begin
if game_loaded then begin
register_hook_proc(HOOK_COMBATDAMAGE, compute_damage_F2);
register_hook_proc(HOOK_ITEMDAMAGE, item_w_damage_hook);
damage_formula := get_ini_setting("ddraw.ini|Misc|DamageFormula");
register_hook_proc(HOOK_COMBATDAMAGE, combatdamage_handler);
register_hook_proc(HOOK_ITEMDAMAGE, itemdamage_handler);
end
end
procedure compute_damage_F2 begin
/*
HOOK_COMBATDAMAGE
Runs when:
1) Game calculates how much damage each target will get. This includes primary target as well as all extras (explosions and bursts). This happens BEFORE the actual attack animation.
2) AI decides whether it is safe to use area attack (burst, grenades), if he might hit friendlies.
Does not run for misses, or non-combat damage like dynamite explosions.
Critter arg0 - The target
Critter arg1 - The attacker
int arg2 - The amount of damage to the target
int arg3 - The amount of damage to the attacker
int arg4 - The special effect flags for the target (use bwand DAM_* to check specific flags)
int arg5 - The special effect flags for the attacker (use bwand DAM_* to check specific flags)
Item arg6 - The weapon used in the attack
int arg7 - The bodypart that was struck
int arg8 - Damage Multiplier (this is divided by 2, so a value of 3 does 1.5x damage, and 8 does 4x damage. Usually it's 2; for critical hits, the value is taken from the critical table; with Silent Death perk and the corresponding attack conditions, the value will be doubled)
int arg9 - Number of bullets actually hit the target (1 for melee attacks)
int arg10 - The amount of knockback to the target
int arg11 - Attack Type (see ATKTYPE_* constants)
mixed arg12 - computed attack data (see C_ATTACK_* for offsets and use get/set_object_data functions to get/set the data)
int ret0 - The damage to the target
int ret1 - The damage to the attacker
int ret2 - The special effect flags for the target
int ret3 - The special effect flags for the attacker
int ret4 - The amount of knockback to the target
*/
procedure combatdamage_handler begin
variable dmg_type, weapon_perk, dmg_thresh, dmg_resist, weapon_subtype, bonus_ranged, difficulty, i, dmg_mult, dmg_div, damage;
variable target, flags, knockback, amount;
@@ -40,6 +81,11 @@ procedure compute_damage_F2 begin
amountKnockback := get_sfall_arg,
hit_mode := get_sfall_arg;
if (ctdSource != item_damage_attacker or weapon != item_damage_weapon) then begin
debug_msg("! ERROR ! compute_damage: Expected attacker or weapon differs!");
return;
end
if (flagsSource bwand DAM_HIT) then begin
target := ctdTarget;
flags := flagsTarget;
@@ -50,7 +96,6 @@ procedure compute_damage_F2 begin
knockback := 0;
end
//amount := 0;
if target and (obj_type(target) == OBJ_TYPE_CRITTER) then begin
if weapon then begin
dmg_type := weapon_dmg_type(weapon);
@@ -77,7 +122,7 @@ procedure compute_damage_F2 begin
end
weapon_subtype := item_w_subtype(weapon, hit_mode); // item_w_subtype_
if (ctdSource != dude_obj) or (weapon_subtype != WEAPON_TYPE_GUNS) then
if (ctdSource != dude_obj) or (weapon_subtype != WEAPON_TYPE_RANGED) then
bonus_ranged := 0;
else
bonus_ranged := has_trait(TRAIT_PERK, ctdSource, PERK_bonus_ranged_damage) * 2;
@@ -90,27 +135,31 @@ procedure compute_damage_F2 begin
difficulty := 125;
end
// F2 default start
// Damage = (1 - (DR_armor + DR_ammo_adjust) * (((raw_damage * (dmg_mult * damageMultiplier)) / dmg_div) - dmg_thresh)
dmg_resist += get_ammo_value(weapon, PROTO_AM_DR_MOD); // item_w_dr_adjust_ (DR Adjust %)
if (dmg_resist < 100) then begin
if (dmg_resist < 0) then dmg_resist := 0;
if (damage_formula == DAMAGE_FORMULA_YAAM) then begin
amount := calc_damage_YAAM(weapon, rounds, dmg_thresh, dmg_resist, bonus_ranged, damageMultiplier, difficulty);
end else begin
// F2 default start
// Damage = (1 - (DR_armor + DR_ammo_adjust) * (((raw_damage * (dmg_mult * damageMultiplier)) / dmg_div) - dmg_thresh)
dmg_resist += get_ammo_value(weapon, PROTO_AM_DR_MOD); // item_w_dr_adjust_ (DR Adjust %)
if (dmg_resist < 100) then begin
if (dmg_resist < 0) then dmg_resist := 0;
dmg_mult := damageMultiplier * get_ammo_value(weapon, PROTO_AM_DMG_MULT); // item_w_dam_mult_ (Dmg mod A)
dmg_div := get_ammo_value(weapon, PROTO_AM_DMG_DIV); // item_w_dam_div_ (Dmg mod B)
dmg_mult := damageMultiplier * get_ammo_value(weapon, PROTO_AM_DMG_MULT); // item_w_dam_mult_ (Dmg mod A)
dmg_div := get_ammo_value(weapon, PROTO_AM_DMG_DIV); // item_w_dam_div_ (Dmg mod B)
for (i := 1; i <= rounds; i++) begin
damage := (item_w_damage + bonus_ranged) * dmg_mult; // item_w_damage_ (raw_damage)
if dmg_div then damage /= dmg_div;
for (i := 1; i <= rounds; i++) begin
damage := (random(item_damage_min, item_damage_max) + bonus_ranged) * dmg_mult; // item_w_damage_ (raw_damage)
if dmg_div then damage /= dmg_div;
damage := (((damage / 2) * difficulty) / 100) - dmg_thresh;
if (damage > 0) then begin
damage := damage - ((damage * dmg_resist) / 100); // reduce damage by the percentage of DR_armor + DR_Ammo
if (damage > 0) then amount += damage;
damage := (((damage / 2) * difficulty) / 100) - dmg_thresh;
if (damage > 0) then begin
damage := damage - ((damage * dmg_resist) / 100); // reduce damage by the percentage of DR_armor + DR_Ammo
if (damage > 0) then amount += damage;
end
end
end
// F2 default end
end
// F2 default end
if (ctdSource == dude_obj) then begin
if has_trait(TRAIT_PERK, ctdSource, PERK_living_anatomy_perk) and (critter_kill_type(ctdTarget) != KILL_TYPE_robot_kills)
@@ -140,11 +189,11 @@ procedure compute_damage_F2 begin
end
if (flagsSource bwand DAM_HIT) then begin
display_msg("amountTarget = " + amountTarget+ ", amount = " + amount);
display_msg("COMBATDAMAGE amountTarget = " + amountTarget+ ", amount = " + amount);
amountTarget := amount;
flagsTarget := flags;
end else begin
display_msg("amountSource = " + amountSource+ ", amount = " + amount);
display_msg("COMBATDAMAGE amountSource = " + amountSource+ ", amount = " + amount);
amountSource := amount;
flagsSource := flags;
end
@@ -154,40 +203,118 @@ procedure compute_damage_F2 begin
set_sfall_return(flagsTarget);
set_sfall_return(flagsSource);
set_sfall_return(amountKnockback);
set_sfall_arg(2, amountTarget);
set_sfall_arg(3, amountSource);
set_sfall_arg(4, flagsTarget);
set_sfall_arg(5, flagsSource);
set_sfall_arg(10, amountKnockback);
end
procedure item_w_damage_hook begin
variable
item_w_damage_min := get_sfall_arg,
item_w_damage_max := get_sfall_arg;
//weapon := get_sfall_arg,
//source := get_sfall_arg,
procedure calc_damage_YAAM(variable weapon, variable rounds, variable armorDT, variable armorDR, variable bonusRangedDamage, variable multiplyDamage, variable difficulty) begin
variable accumulatedDamage, ammoDiv, ammoMult, ammoDT, calcDT, _calcDT, calcDR, i, rawDamage, resistedDamage;
if (rounds <= 0) then begin
return 0;
end
ammoDiv := get_ammo_value(weapon, PROTO_AM_DMG_DIV);
ammoMult := get_ammo_value(weapon, PROTO_AM_DMG_MULT);
// Damage Multipler = Critical Multipler * Ammo Dividend
multiplyDamage *= ammoMult;
// Retrieve ammo DT (well, it's really Retrieve ammo DR, but since we're treating ammo DR as ammo DT...)
ammoDT := get_ammo_value(weapon, PROTO_AM_DR_MOD);
calcDT := armorDT - ammoDT;
_calcDT := calcDT;
if (calcDT >= 0) then begin
_calcDT := 0;
end else begin
// note that this should be a negative value
_calcDT *= 10;
calcDT := 0;
end
// DR = armor DR + DT (note that DT should be less than or equal to zero)
calcDR = armorDR + _calcDT;
if (calcDR < 0) then begin
calcDR = 0;
end else if (calcDR >= 100) then begin
return 0;
end
display_msg("YAAM: AmmoDT=" + ammoDT + ", DT=" + calcDT + "/" + armorDT + ", DR=" + calcDR + "/" + armorDR);
// Start of damage calculation loop
for (i := 0; i < rounds; i++) begin
rawDamage = random(item_damage_min, item_damage_max);
rawDamage += bonusRangedDamage;
rawDamage -= calcDT;
if (rawDamage <= 0) then
continue;
rawDamage *= multiplyDamage;
if (ammoDiv != 0) then begin
rawDamage /= ammoDiv;
end
rawDamage /= 2; // related to critical hit damage multiplier bonus
rawDamage *= difficulty; // combat difficulty setting (75 if wimpy, 100 if normal or if attacker is player, 125 if rough)
rawDamage /= 100;
resistedDamage = calcDR * rawDamage;
resistedDamage /= 100;
rawDamage -= resistedDamage;
if (rawDamage > 0) then begin
display_msg("YAAM: Bullet " + i + " dmg=" + rawDamage);
accumulatedDamage += rawDamage;
end
end
return accumulatedDamage;
end
/*
HOOK_ITEMDAMAGE
Runs when retrieving the damage rating of the player's used weapon. (Which may be their fists.)
int arg0 - The default min damage
int arg1 - The default max damage
Item arg2 - The weapon used (0 if unarmed)
Critter arg3 - The critter doing the attacking
int arg4 - The type of attack
int arg5 - non-zero if this is an attack using a melee weapon
int ret0 - Either the damage to be used, if ret1 isn't given, or the new minimum damage if it is
int ret1 - The new maximum damage
*/
procedure itemdamage_handler begin
item_damage_min := get_sfall_arg;
item_damage_max := get_sfall_arg;
item_damage_weapon := get_sfall_arg;
item_damage_attacker := get_sfall_arg;
//hit_mode := get_sfall_arg,
//isMelee := get_sfall_arg;
item_w_damage := (item_w_damage_min + (item_w_damage_max - item_w_damage_min) / 2);
display_msg("item_w_damage_ = " + item_w_damage);
set_sfall_return(item_w_damage);
display_msg("itemdamage: " + item_damage_min + "-" + item_damage_max);
end
procedure item_w_subtype(variable weapon, variable hit_mode) begin
variable attack_mode, type := WEAPON_TYPE_UNARMED;
if weapon and (hit_mode <= ATKTYPE_RWEP2) then begin
attack_mode := (get_proto_data(obj_pid(weapon), PROTO_IT_FLAGS));
attack_mode := weapon_attack_mode(obj_pid(weapon), hit_mode);
if (hit_mode == ATKTYPE_LWEP2) or (hit_mode == ATKTYPE_RWEP2) then
attack_mode := (attack_mode bwand 0xF0) / 16; // shift 4 bits to the right
else
attack_mode := (attack_mode bwand 0x0F);
if (attack_mode > ATKMODE_PRI_THROW) then
type := WEAPON_TYPE_GUNS;
else if (attack_mode == ATKMODE_PRI_THROW) then
if (attack_mode >= ATTACK_MODE_SINGLE) then
type := WEAPON_TYPE_RANGED;
else if (attack_mode == ATTACK_MODE_THROW) then
type := WEAPON_TYPE_THROWN;
else if (attack_mode > ATKMODE_PRI_KICK) then
else if (attack_mode >= ATTACK_MODE_SWING) then
type := WEAPON_TYPE_MELEE;
else if (attack_mode == ATTACK_MODE_NONE) then
type := WEAPON_TYPE_NONE;
end
return type;
@@ -1,11 +1,13 @@
/**
Item Highlight mod (Lite version)
Item Highlighting 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.
A cut-down version of the mod included in sfall 4.x, offering more features than the built-in function.
Features:
- highlighting items, containers (optional) and lootable corpses (optional) on the ground
- highlights items, containers (optional) and lootable corpses (optional) on the ground
- highlights critters using the same rules as combat mode highlighting (optional)
- configurable hotkey is used to trigger highlight
- hotkey can be pressed and held to continuously update highlighted objects based on current position
- 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)
@@ -15,7 +17,7 @@
NOTE: this script requires compiler from sfall modderspack with -s option
(short circuit evaluation)
version 1.1
version 1.2
**/
@@ -24,6 +26,7 @@
#define CRITTER_IS_DEAD (1)
#define PID_MOTION_SENSOR (59)
#define REPEAT_FRAMES (10)
#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)
@@ -32,36 +35,70 @@ variable highlightKey;
variable isHighlight;
variable alsoContainer;
variable alsoCorpse;
variable alsoCritter;
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);
procedure DudeCanSee(variable obj) begin
variable block := obj_blocking_line(dude_obj, tile_num(obj), BLOCKING_TYPE_SHOOT);
return not block or block == obj;
end
procedure DudeCanHear(variable obj) begin
variable hearDist := dude_perception * 5;
if (get_flags(obj) bwand FLAG_TRANSGLASS) then
hearDist /= 2;
return tile_distance_objs(dude_obj, obj) <= hearDist;
end
procedure GetOutlineColor(variable obj, variable isCritter) begin
if isCritter then begin
if get_team(obj) == get_team(dude_obj) then return OUTLINE_GREEN_GLOW;
if not DudeCanSee(obj) then begin
if (DudeCanHear(obj)) then return OUTLINE_DARK_YELLOW;
return 0;
end
return OUTLINE_RED_GLOW;
end
if checkLOS and not DudeCanSee(obj) then
return 0;
return outlineColor;
end
procedure ToggleHighlightObject(variable obj, variable enable, variable isCritter) begin
if (not alsoContainer or obj_item_subtype(obj) != item_type_container) and NO_HIGHLIGHT(obj) then return;
set_outline(obj, GetOutlineColor(obj, isCritter) if enable else 0);
end
procedure ToggleHighlight(variable enable) begin
variable obj;
variable obj, isCorpse;
foreach obj in list_as_array(LIST_GROUNDITEMS) begin
if obj != outlined_object then begin
call ToggleHighlightObject(obj, enable);
if obj and obj != outlined_object then begin
call ToggleHighlightObject(obj, enable, false);
end
end
if (alsoCorpse) then begin
if (alsoCorpse or alsoCritter) 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);
if obj and obj != dude_obj then begin
isCorpse := critter_state(obj) == CRITTER_IS_DEAD;
if (alsoCritter and not isCorpse) or (isCorpse and not NO_STEAL(obj)) then begin
call ToggleHighlightObject(obj, enable, not isCorpse);
end
end
end
end
tile_refresh_display;
if (checkLOS or alsoCritter) and enable != isHighlight then begin
set_global_script_repeat(REPEAT_FRAMES if enable else 0);
end
isHighlight := enable;
end
procedure KeyPressHandler begin
@@ -71,7 +108,7 @@ procedure KeyPressHandler begin
if scanCode == highlightKey and not(get_game_mode bwand (INTFACELOOT bwor BARTER)) then begin
if pressed then begin
isHighlight := true;
set_global_script_repeat(REPEAT_FRAMES);
if motionScanner then begin
scanner := obj_carrying_pid_obj(dude_obj, PID_MOTION_SENSOR);
if scanner then begin
@@ -94,16 +131,21 @@ procedure KeyPressHandler begin
call ToggleHighlight(true);
end
end else begin
isHighlight := false;
call ToggleHighlight(false);
end
end
end
// visual glitch fix - for 3.8.29+
// visual glitch fix, turn off highlight when entering combat - for 3.8.40+
procedure CombatTurnHandler begin
if isHighlight then begin
call ToggleHighlight(false);
end
end
// visual glitch fix, turn off highlight when opening loot/barter screens - for 3.8.29+
procedure GameModeChangeHandler begin
if isHighlight and (get_game_mode bwand (INTFACELOOT bwor BARTER)) then begin
isHighlight := false;
call ToggleHighlight(false);
end
end
@@ -114,12 +156,15 @@ procedure InventoryMoveHandler begin
end
procedure start begin
if game_loaded and (sfall_ver_major < 4 and sfall_ver_build >= 12) then begin
if game_loaded then begin
if (sfall_ver_major >= 4 or sfall_ver_build < 12) then return;
call InitConfigs;
highlightKey := GetConfig(configSection, "Key", 0);
alsoContainer := GetConfig(configSection, "Containers", 0);
alsoCorpse := GetConfig(configSection, "Corpses", 0);
alsoCritter := GetConfig(configSection, "Critters", 0);
checkLOS := GetConfig(configSection, "CheckLOS", 0);
outlineColor := GetConfig(configSection, "OutlineColor", 16);
if (outlineColor < 1) then outlineColor := 64;
@@ -129,7 +174,13 @@ procedure start begin
highlightFailMsg2 := Translate("HighlightFail2", "Your motion sensor is out of charge.");
register_hook_proc(HOOK_KEYPRESS, KeyPressHandler);
register_hook_proc(HOOK_COMBATTURN, CombatTurnHandler);
register_hook_proc(HOOK_GAMEMODECHANGE, GameModeChangeHandler);
register_hook_proc(HOOK_INVENTORYMOVE, InventoryMoveHandler);
set_global_script_type(1);
end else begin
if isHighlight and not(get_game_mode bwand (INTFACELOOT bwor BARTER)) then begin
call ToggleHighlight(true);
end
end
end
@@ -12,7 +12,7 @@
#include "..\scripting\headers\lib.inven.h"
*/
variable ini := "sfall-mods.ini";
variable ini := "mods\\sfall-mods.ini";
variable translationIni;
// Gets the integer value from the specified ini
@@ -1,9 +1,9 @@
Item Highlight mod (Lite version) for sfall 3.8.x
-------------------------------------------------
Item Highlighting 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.
A cut-down version of the mod included in sfall 4.x, offers more features than the built-in function.
Features:
- highlighting items, containers (optional) and lootable corpses (optional) on the ground
- highlights 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)
@@ -12,10 +12,10 @@ Features:
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).
To use, copy gl_highlighting_lite.int to your scripts folder and sfall-mods.ini to the mods folder in the same directory as sfall.
Create the mods folder if it does not exist. 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 in 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 (fixed for 3.8.18+).
- items will be kept highlighted when entering combat while holding the highlight key (fixed in 3.8.40+).
- when you pick up items while holding the highlight key, they will be kept highlighted if you drop them on the ground (fixed in 3.8.18+).
Both glitches can bo solved by pressing and releasing the highlight key again.
@@ -9,10 +9,13 @@ Containers=0
; Set to 1 to also highlight lootable corpses
Corpses=0
; Set to 1 to only highlight objects in the player's line-of-sight
CheckLOS=0
; Set to 1 to also highlight critters, with the same rules as in combat
Critters=0
; Set the color of outlines, available colors:
; Set to 1 to only highlight objects in the player's line-of-sight
CheckLOS=1
; Set the color of outlines for items, corpses, and containers; available colors:
; 1 - glowing red
; 2 - red
; 4 - grey
@@ -20,7 +23,7 @@ CheckLOS=0
; 16 - bright yellow
; 32 - dark yellow
; 64 - purple
; You can set a custom color from the game palette by multiplying the color index value by 256 (available since sfall 4.2.7)
; You can set a custom color from the game palette by multiplying the color index value by 256 (in 3.8.27 or later)
OutlineColor=16
; Motion Scanner mode:
@@ -28,3 +31,37 @@ OutlineColor=16
; 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
[CombatControl]
;Allows you to control other critters directly in combat
;Set to 0 to disable
;Set to 1 to control all critters in combat (allowed only in sfall debugging mode)
;Set to 2 to control all party members
;Set to 3 to let you use the command cursor to specify targets for party members to attack in combat
Mode=0
;If you want to control only specific critters, uncomment the PIDList line and set a comma delimited list of PIDs
;PIDList=62,89,97,107,160,161
;Set a comma delimited list of perk IDs for perks to be inherited from the player during the combat control
PerksList=0,73
;Set to 1 to allow the player to gain a positive reputation when killing NPCs while controlling other critters
GainReputation=0
;Choose a notification box to display the name of the controlled critter above the interface bar
;Must be between 5 and (4 + the value of BoxBarCount in ddraw.ini)
;For sfall 4.1.6+ the number for the notification box is set automatically, so just use any value
;Set to 0 to disable
DisplayName=0
;Set the color of display name, available colors:
;0 - green
;1 - red
;2 - white
;3 - yellow
;4 - dark yellow
;5 - blue
;6 - purple
;7 - dull pink
DisplayNameColor=0
@@ -23,6 +23,7 @@
#define FID_OBJ_CRITTER (0x01000000)
procedure update_armor_apperance;
procedure canuseweapon_handler;
variable
modIni := "npcarmor.ini",
@@ -165,7 +166,9 @@ end
procedure start begin
variable sect, sects, armorTypes, armorType, npc, pid, pids, i;
if game_loaded and (sfall_ver_major < 4 and sfall_ver_build >= 29) then begin
if game_loaded then begin
if (sfall_ver_major >= 4 or sfall_ver_build < 29) then return;
armorTypes := get_ini_section(modIni, "ArmorTypes");
armorPidMap := create_array_map;
foreach (armorType: pids in armorTypes) begin
@@ -205,6 +208,7 @@ procedure start begin
register_hook_proc(HOOK_INVENWIELD, invenwield_handler);
register_hook_proc(HOOK_ADJUSTFID, adjustfid_handler);
register_hook_proc(HOOK_INVENTORYMOVE, inventorymove_handler);
register_hook_proc_spec(HOOK_CANUSEWEAPON, canuseweapon_handler);
debug_msg("NPC armor appearance mod: Done.");
end
@@ -222,3 +226,16 @@ procedure update_armor_apperance begin
end
end
end
// prevent NPCs from equipping "unusable" weapons - for 3.8.40+
procedure canuseweapon_handler begin
variable critter, canUse;
critter := get_sfall_arg;
if (critter != dude_obj and get_sfall_arg_at(3)) then begin
canUse := check_weapon_change(critter, get_sfall_arg, true);
if (canUse == false) then begin
set_sfall_arg(3, 0);
set_sfall_return(0); // overrides the result of engine function. Any non-zero value allows using the weapon
end
end
end
@@ -8,10 +8,10 @@ Can be adopted to any mod by adjusting armor PIDs, allowed weapon anim codes, NP
Requires sfall 3.8.29 or higher.
To use, copy gl_npcarmor_lite.int to your scripts folder, and copy npcarmor.ini to the same directory as sfall.
To use, copy gl_npcarmor_lite.int to your scripts folder and copy npcarmor.ini to the same directory as sfall.
The default npcarmor.ini is set up for Restoration Project 2.3.3.
Check the included "npcarmor - vanilla.ini" for an example that does not require any new graphics.
Note that due to the lack of newer game hooks in sfall 3.8.x, there is a minor glitch in the lite version:
- in combat, NPCs can pick up and try to equip weapons with anim codes that are not allowed in INI file but supported by their appearance.
- in combat, NPCs can pick up and try to equip weapons with anim codes that are not allowed in INI file but supported by their appearance (fixed in 3.8.40+).
@@ -0,0 +1,257 @@
/*
NPC Combat Control (Lite version)
A script-based mod of the removed built-in ControlCombat option, offering more features and improvements.
Features:
- allows you to take control of your party members or other NPCs during combat
(unlike in newer 4.x versions, controlled critters cannot use Sneak skill in combat)
- configurable list of perk IDs for perks being inherited from the player (optional, not all perks can work)
- allows the player to gain a positive reputation when killing NPCs while controlling other critters (optional)
- a notification box to display the name of the controlled critter above the interface bar (optional)
NOTE: this script requires compiler from sfall modderspack with -s option
(short circuit evaluation)
Requires sfall 3.8.40 or higher
version 1.4
*/
#include "..\headers\global.h"
#include "..\headers\critrpid.h"
#include "main.h"
#ifndef DEBUG
#define DEBUGMSG(x)
#else
#define DEBUGMSG(x) debug_msg(x);
#endif
procedure start;
procedure AllowControl(variable pid);
procedure SetLight(variable critter, variable int, variable dist);
procedure CombatTurn_Handler;
procedure GameModeChange_Handler;
procedure InventoryMove_Handler;
procedure InvenWield_Handler;
procedure SetGlobalVar_Handler;
variable
controlMode,
pidList, perksList,
lightInt, lightDist, npcControl,
displayName, displayNameColor, isShowTag,
inControl := false,
dudeLightInt, dudeLightDist;
// returns non-zero for a controlled NPC
procedure AllowControl(variable pid) begin
if (pidList) then begin
return scan_array(pidList, pid bwand 0xFFFFFF) != -1;
end
return party_member_obj(pid);
end
procedure SetLight(variable critter, variable lInt, variable lDist) begin
if (lInt) then lInt := round((lInt / 65536.0) * 100); // calc percent of intensity
obj_set_light_level(critter, lInt, lDist); // TODO: make sfall obj_set_light_level function
end
procedure CombatTurn_Handler begin
variable
status := get_sfall_arg,
critter := get_sfall_arg,
pid, perkID, level;
DEBUGMSG("Combat Turn: " + status + ", by " + obj_name(critter) + "/" + critter + ", arg3: " + get_sfall_arg)
pid := obj_pid(critter);
if (pid == PID_PLAYER and inControl == false) then return;
if (pid != PID_PLAYER and controlMode != 1 and AllowControl(pid) == false) then begin
DEBUGMSG("Skip control.")
if (npcControl) then begin
npcControl := 0;
set_dude_obj(real_dude_obj);
call SetLight(dude_obj, dudeLightInt, dudeLightDist); // restore dude light
move_to(dude_obj, dude_tile, dude_elevation);
DEBUGMSG("Set dude after NPC control.")
end
return;
end
if (status == 1) then begin
set_dude_obj(critter);
DEBUGMSG("Take control of: " + obj_name(critter))
if (critter != real_dude_obj) then begin
if (npcControl == 0) then begin
dudeLightDist := get_object_data(real_dude_obj, OBJ_DATA_LIGHT_DISTANCE);
dudeLightInt := get_object_data(real_dude_obj, OBJ_DATA_LIGHT_INTENSITY);
obj_set_light_level(real_dude_obj, 0, 0); // dude off light
end
npcControl := critter;
lightDist := get_object_data(critter, OBJ_DATA_LIGHT_DISTANCE);
lightInt := get_object_data(critter, OBJ_DATA_LIGHT_INTENSITY);
// set perks (only work with 4.1.8+)
foreach (perkID in perksList) begin
level := has_trait(TRAIT_PERK, real_dude_obj, perkID);
if (level) then critter_add_trait(critter, TRAIT_PERK, perkID, level);
end
// special handling if dude has Jinxed trait/perk
if (has_trait(TRAIT_TRAIT, real_dude_obj, TRAIT_jinxed) or has_trait(TRAIT_PERK, real_dude_obj, PERK_jinxed_perk)) then begin
critter_add_trait(critter, TRAIT_PERK, PERK_jinxed_perk, 1);
end
intface_redraw;
obj_set_light_level(critter, 100, 4);
inControl := true;
end else if (npcControl) then begin
call SetLight(dude_obj, dudeLightInt, dudeLightDist); // restore dude light
npcControl := 0; // for dude control
intface_redraw;
end
if (inControl) then begin
// check preference setting _combat_highlight
if (read_byte(0x56D38C)) then set_outline(critter, OUTLINE_GREY); // TODO: replace read_byte with normal function
// center the screen on the controlled critter/dude and remove roof tiles
move_to(dude_obj, dude_tile, dude_elevation);
if (displayName and critter != real_dude_obj) then begin
set_iface_tag_text(displayName, obj_name(critter), displayNameColor);
show_iface_tag(displayName);
isShowTag := true;
end
end
end else begin
if (npcControl) then begin
call SetLight(critter, lightInt, lightDist); // restore light for controlled NPC
end
if (isShowTag) then begin
hide_iface_tag(displayName);
isShowTag := false;
end
// remove perks before switching control (only work with 4.1.8+)
if (dude_obj != real_dude_obj) then begin
DEBUGMSG("Remove perks after NPC control.")
foreach (perkID in perksList) begin
level := has_trait(TRAIT_PERK, real_dude_obj, perkID);
if (level) then critter_rm_trait(critter, TRAIT_PERK, perkID, level);
end
// special handling for Jinxed
critter_rm_trait(critter, TRAIT_PERK, PERK_jinxed_perk, -1);
end
if (status < 0) then begin
set_dude_obj(real_dude_obj);
call SetLight(dude_obj, dudeLightInt, dudeLightDist);
end
end
end
procedure GameModeChange_Handler begin
if (inControl and (get_game_mode bwand COMBAT) == 0) then begin
inControl := false;
npcControl := 0;
move_to(dude_obj, dude_tile, dude_elevation);
DEBUGMSG("Move to dude after NPC control.")
end
end
procedure InventoryMove_Handler begin
if (npcControl and get_sfall_arg == 3) then begin // armor slot
if (obj_pid(dude_obj) == PID_MARCUS or proto_data(obj_pid(dude_obj), cr_body_type) != CR_BODY_BIPED) then begin
display_msg(message_str_game(GAME_MSG_PROTO, 675));
set_sfall_return(true);
end
end
end
procedure InvenWield_Handler begin
variable
critter := get_sfall_arg,
item := get_sfall_arg,
slot := get_sfall_arg,
event := get_sfall_arg;
// Fix weapon duplication when equipping in combat
if (event and slot == INVEN_TYPE_RIGHT_HAND and AllowControl(obj_pid(critter))) then begin
set_flags(item, get_flags(item) bwand bwnot(FLAG_LEFT_HAND));
end
end
procedure SetGlobalVar_Handler begin
if (npcControl and get_sfall_arg == GVAR_PLAYER_REPUTATION and obj_pid(dude_obj) != PID_PLAYER) then begin
variable value := global_var(GVAR_PLAYER_REPUTATION);
if (get_sfall_arg > value) then begin
set_sfall_arg(1, value);
set_sfall_return(value);
end
end
end
procedure start begin
if game_loaded then begin
if (sfall_ver_major >= 4 or sfall_ver_build < 40) then return;
controlMode := GetConfig("CombatControl", "Mode", 0);
if (controlMode >= 3) then begin
if (controlMode == 3) then metarule3(999, 0, 0, 0); // enable feature: order party members to attack a specified target
controlMode := 0;
end else if (controlMode == 1 and GetIniConfig("Debugging", "Enable", 0, "ddraw.ini") == 0) then begin
controlMode := 2;
end
if (controlMode > 0) then begin
displayName := GetConfig("CombatControl", "DisplayName", 0);
if (displayName) then begin
variable nameTag := add_iface_tag;
debug_msg("NPC control - added new box: " + nameTag);
if (nameTag <= 0) then begin // box added?
variable maxBoxCount := get_ini_setting("ddraw.ini|Misc|BoxBarCount");
if (maxBoxCount < 0) then maxBoxCount := 9;
else maxBoxCount += 4;
if (displayName < 5 or displayName > maxBoxCount) then displayName := 0;
end else begin
displayName := nameTag;
end
displayNameColor := GetConfig("CombatControl", "DisplayNameColor", 0);
end
set_perk_ranks(PERK_gecko_skinning_perk, 1);
set_perk_level(PERK_gecko_skinning_perk, 999); // prevent it from appearing in the perk selection window
pidList := GetConfigListInt("CombatControl", "PIDList");
if (len_array(pidList) > 0) then
fix_array(pidList);
else
pidList := 0;
perksList := GetConfigListInt("CombatControl", "PerksList");
fix_array(perksList);
register_hook_proc(HOOK_COMBATTURN, CombatTurn_Handler);
register_hook_proc(HOOK_GAMEMODECHANGE, GameModeChange_Handler);
register_hook_proc(HOOK_INVENTORYMOVE, InventoryMove_Handler);
register_hook_proc(HOOK_INVENWIELD, InvenWield_Handler);
if (GetConfig("CombatControl", "GainReputation", 0) == 0) then begin
register_hook_proc(HOOK_SETGLOBALVAR, SetGlobalVar_Handler);
end
end else begin
exit;
end
end
end
@@ -0,0 +1,16 @@
NPC Combat Control mod (Lite version) for sfall 3.8.x
-----------------------------------------------------
A script-based mod of the removed built-in ControlCombat option, offering more features and improvements.
Features:
- allows you to take control of your party members or other NPCs during combat
(unlike in newer 4.x versions, controlled critters cannot use Sneak skill in combat)
- configurable list of perk IDs for perks being inherited from the player (optional, not all perks can work)
- allows the player to gain a positive reputation when killing NPCs while controlling other critters (optional)
- a notification box to display the name of the controlled critter above the interface bar (optional)
Requires sfall 3.8.40 or higher.
To use, copy gl_partycontrol_lite.int to your scripts folder and sfall-mods.ini (in ItemHighlight_Lite) to the mods folder in the same directory as sfall.
Create the mods folder if it does not exist.

Some files were not shown because too many files have changed in this diff Show More