Compare commits

...
116 Commits
Author SHA1 Message Date
NovaRain 761124aaf4 Code edits to PartyControl.cpp 2020-10-18 07:15:57 +08:00
NovaRain 8e6a961fba Renamed elements in PerkInfo/TraitInfo structs
Implemented StatFormula struct from 4.x for Stats.cpp.
Implemented DudeState struct from 4.x for PartyControl.cpp.
2020-10-15 13:12:15 +08:00
NovaRain cca0fe0cb6 Fixed and improved the code in Graphics.cpp 2020-10-15 09:30:39 +08:00
NovaRain 180761c489 Added the ability to change the poison level for critters 2020-10-12 20:47:05 +08:00
NovaRain 540b68070b Corrected code in Arrays.cpp 2020-10-12 11:03:55 +08:00
NovaRain 466b79f5e8 Code optimization for array expression (from 4.x) 2020-10-11 10:55:58 +08:00
NovaRain b1f847afbc Code edits to Graphics.cpp according to 4.x changes
Minor edits to MetaruleExtender.cpp and notes.txt.
2020-10-11 01:09:31 +08:00
NovaRain 31fbddb612 Code correction in FalloutEngine.cpp
Updated global shader example files.
2020-10-09 08:57:46 +08:00
NovaRain 0c547da134 Backported "car_gas_amount" and "set_car_intface_art" functions from 4.0
Added prefixes to some functions (fake classes)
2020-10-08 22:14:32 +08:00
NovaRain cc5561d3d6 Updated example mod scripts 2020-10-08 15:34:41 +08:00
NovaRain 66ff811bcd Added "combat_data" script function
Added a new argument to HOOK_COMBATDAMAGE.
Removed the check for valid objects from get/set_object_data functions.
Some code fixes/edits.
2020-10-08 13:50:37 +08:00
NovaRain 27963fd064 Fixed broken Print() script function
Fixed the background image of the character portrait on inv/char screens.
Renamed "print_text" to "interface_print".
2020-10-06 11:48:31 +08:00
NovaRain dc88193ff6 Added "print_text" script function 2020-10-05 21:05:06 +08:00
NovaRain 2c36ad9a2a Removed InterfaceDontMoveOnTop from ddraw.ini (always enabled)
Added a fix to prevent toggling the cursor for a Transparent window.
2020-10-05 10:26:39 +08:00
NovaRain 9d34a4c70a Added support for transparent interface windows (#25) 2020-10-03 21:01:54 +08:00
NovaRain 548039d5bc Fixed FrmFile struct in the previous commit
Finished the code refactoring in InterfaceOps.hpp.
2020-09-29 09:04:27 +08:00
NovaRain 49c4bb2479 Some code refactoring
Added a value of 2 to TextureFilter option.
2020-09-28 12:07:12 +08:00
NovaRain 75b275159f Added "interface_art_draw" script function
Added an argument to "intface_redraw" function to redraw all interfaces.
2020-09-26 22:17:59 +08:00
NovaRain 52f42af913 Changed the behavior of saving/restoring hook arguments
(no need to specify the number of args when executing a nested hook)
Reverted the change of argCount in some hooks.
Disabled an obsolete fix for MultiHexPathingFix.
Simplified the code of draw_image/draw_image_scaled script functions.
2020-09-25 00:12:22 +08:00
NovaRain b195a8ab02 Moved all engine function defines to new FalloutFuncs_def.h
(similar to the way how 4.x handles engine functions)

Added the ability to get Automap window pointer.

Reorganized some code to prepare for later commits.
2020-09-24 15:22:32 +08:00
NovaRain 796e834a9d Some edits to the previous commit
Minor edits to some code.
2020-09-23 23:07:45 +08:00
NovaRain df4e847c59 Changed argCount to be set right after HookBegin in some hooks
* to avoid possible unexpected issues.
2020-09-23 15:33:42 +08:00
NovaRain 0a48ed3048 Added a new argument to HOOK_TOHIT (#339)
Added hook type 3 to HOOK_WITHINPERCEPTION (when AI selects a target)

Extended the upper limit of set_pickpocket_max and set_hit_chance_max
script functions to 999.

Added a fix for combat_is_shot_blocked_ not taking the flags of critters
in the line of fire into account.

Minor edits to ASM code of some hooks.
2020-09-22 22:16:57 +08:00
NovaRain 7414c8a361 Refactored ASM code of some hooks using 4.x as ref
Code edits to DisplayKarmaChanges.
Implemented the buf_to_buf_ replacement function from 4.x.
2020-09-21 21:22:21 +08:00
NovaRain 90a9ee5f15 Added loading multiple shader files for GlobalShaderFile option
Added a sharpen filter file as a global shader example.
Set TextureFilter to be enabled by default.
2020-09-21 13:03:05 +08:00
NovaRain 314100f231 Added TextureFilter option (restored from sfall 2.x) 2020-09-20 10:07:16 +08:00
NovaRain 9c92e2f487 Reorganized the function defines in FalloutEngine.cpp/h
* in the same way as 4.x's Functions_def.h.

Replaced some ASM blocks with function defines.
2020-09-19 21:34:14 +08:00
NovaRain 2d3a4d6c34 Corrected talking heads code of Use32BitHeadGraphics
Minor code correction.
2020-09-19 00:39:55 +08:00
NovaRain a936f35c80 Refactored code in Elevators.cpp to be like 4.x 2020-09-16 14:25:21 +08:00
NovaRain 3479bc6893 Backported KeepWeaponSelectMode from 4.x
Minor edits to code and documents.
2020-09-16 11:09:55 +08:00
NovaRain ff1aac40f5 Fixed temporary arrays being cleared when flushing the keyboard buffer (#337)
Added a message about failed initialization of the game and exit if an error occurs.
2020-09-15 11:34:26 +08:00
NovaRain 6142d95a60 Graphics: improved the performance of DX9 mode 2020-09-15 10:33:33 +08:00
NovaRain c4fc3d2c8b Graphics & Movies refactoring (WIP/unfinished) 2020-09-13 22:33:30 +08:00
NovaRain 40cca2452d Reverted part of changes in commit 0d5c88f
* InterpretGetValue could cause unexpected behavior in global scripts.
2020-09-13 18:37:55 +08:00
NovaRain 33a5c7428a Updated Ammo INI Loader example script mod
* now the INI will be read only once on script initialization, not
always being re-read on each map load.
2020-09-10 14:55:11 +08:00
NovaRain 55e935e18c Added the original Fallout 1 behavior to FastShotFix 2020-09-06 08:45:17 +08:00
NovaRain 398ad650b9 Added a fix to the weapon check in the Fast Shot trait
* changed range check to type+range check, the same fix is also applied
to FastShotTraitFix.

Added more info to the description of FastShotFix option.
2020-09-05 10:47:53 +08:00
NovaRain 9c7f34ffb2 Fixed typo in sfall.h (#334) 2020-09-03 21:06:01 +08:00
NovaRain 6a2a7ee82f Fixed EncounterTableSize option (#333)
* the encounter messages were still limited to 50 entries per table when
the value for encounters is set to greater than 50.

Fixed building the path to multihex objects.
2020-09-03 14:24:00 +08:00
NovaRain 849ae49bfb Tweaked the field of view check in ObjCanSeeObj_ShootThru_Fix
And fixed a bug when the target critter has the ShootTrhu flag set
(cannot be seen by the source)

Minor edits to some comments in previous commit.
2020-09-02 14:21:57 +08:00
NovaRain ed9c6c7508 Added support for ACM audio file playback to soundplay script function
(with volume control)

Added a volume control to reduce the volume for play_sfall_sound.
Added descriptions and constant defines to documents.
Some code optimization.
Updated version number.
2020-09-01 16:12:00 +08:00
NovaRain 57f4deb5cf Minor edits to Interface.cpp and ddraw.ini 2020-08-22 10:51:07 +08:00
NovaRain c6da5169b8 Minor edits to HookScripts.cpp based on 4.x changes 2020-08-21 12:57:03 +08:00
NovaRain 72f3abe3c9 Moved DeathScreenFontPatch code to Interface.cpp
Added a note about DeathScreenFontPatch in ddraw.ini.

Some code edits in BugFixes.cpp and DamageMod.cpp.
2020-08-21 12:42:46 +08:00
NovaRain 5d12d815dd Added DeathScreenFontPatch option
* use the normal font instead of bitmap font for death screen subtitles.

Attempted to fix the melee damage display for some extreme cases when
BonusHtHDamageFix=1 and DisplayBonusDamage=0.
2020-08-20 13:48:41 +08:00
NovaRain 502a5764a5 Updated global.fx and withinperception example script
Fixed some code.
2020-08-19 15:21:53 +08:00
NovaRain 13976a5278 Added a fix to limit the maximum distance for knockback animation
* 20 hexes at max. This does not affect the knockback value in
Combat Damage hook, only the animation part.

Backported AlwaysFindScripts option from 4.x for global scripts.
2020-08-18 13:45:49 +08:00
NovaRain a35487d0aa Added a fix to prevent the player from leaving the map during death anim
* when the death animation causes the player to cross an exit grid.

Fixed the height of the black background for the subtitles on death
screens when using the hi-res patch.

Added MakeJumps template to SafeWrite.h and devlog_f to Logging.cpp.

Minor code edits.
2020-08-17 15:11:16 +08:00
NovaRain f1102afbc3 Fixed the use of #pragma pack() directives for structures 2020-08-16 11:15:37 +08:00
NovaRain 4071a65f73 Replaced all 'DWORD' script pointers with the proper 'TProgram*'
Added more engine function wrappers.
2020-08-15 10:02:36 +08:00
NovaRain 8d813a952e Fixed and improved the behavior of nested timer events in global scripts
Added a fix to prevent the execution of critter_p_proc and game events
when playing movies.

Added a debug message about a corrupted proto file.

Some minor code/document edits.
2020-08-14 21:31:06 +08:00
NovaRain c1b7e729a8 Reorganized KeyPress hook & related code
* now it should work in exactly the same way as 4.x.

Improved the key press behavior for Debug Editor.
Implemented ScriptListInfoItem struct from 4.x.
2020-08-14 00:39:09 +08:00
NovaRain 12070f5e3d Fixed the playback of additional movies defined in the MovieXX options (#330)
Added the keyboard buffer cleanup function to metarule3.
2020-08-13 15:22:20 +08:00
NovaRain 63b2025468 Added the city name in the description of a save slot by default
Corrected some code.
2020-08-13 14:44:09 +08:00
NovaRain 44ad268aed Added a fix to remove floating text after moving to another elevation
* also update black edges of the map (HRP bug, #282)
2020-08-09 12:29:15 +08:00
NovaRain 2305128adc Changed the behavior of ObjCanSeeObj_ShootThru_Fix
* now the critter can only see through objects in front of it.
2020-08-08 11:52:17 +08:00
NovaRain 112c931ea3 Added a patch to allow setting custom colors for object outlines
Added a tweak to ObjCanSeeObj_ShootThru_Fix to allow critters to see
through other critters.

Fixed the internal variable for Horrigan encounter always being reset if
DisableHorrigan=0 (commit 74d3cb9)

Corrected some code.
2020-08-05 16:18:19 +08:00
NovaRain 8e3ae04aec Changed the behavior for replacing art aliases for critters
Added ANIM_charred_body/ANIM_charred_body_sf animations to art aliases
(#323)

Minor code edit to OverrideMusicDir (nop the rest to avoid leaving
garbage bytes)

Renamed some functions in Worldmap.cpp.
2020-08-03 14:41:43 +08:00
NovaRain 89ec203483 Corrected combat_attack_gcsd code in the previous commit
Added DAM_PRESERVE_FLAGS to attack_complex for keeping result flags.
Fixed OverrideMusicDir=2 not working.
2020-08-02 19:48:04 +08:00
NovaRain 21cbcb4a03 Rewrote several fixes for attack_complex in C++ and merged them
Added a default fix for attack_complex to untie target_results from
attacker_results.
2020-08-01 10:27:18 +08:00
NovaRain 76c9d63d3e Added more fixes for the arguments of attack_complex function:
* fixed result flags for the attacker and the target when calling
attack_complex function (#323)

* tweaked how attacker_results/target_results work when
AttackComplexFix is enabled.

Minor code edits.
2020-07-31 20:42:46 +08:00
NovaRain 962e7f0056 Added support for delayed speech playback to AllowDShowSound
(for synchronizing with subtitles when playing endgame slideshow)
2020-07-30 10:42:08 +08:00
NovaRain 950b9949c0 Added a new value 2 to AllowDShowMovies
* for forcing avi videos to fit the screen width.

Disabled warning C4995 (e.g. wcscpy in Movies.cpp)
Minor code edits to AI.cpp & Sound.cpp.
2020-07-29 14:20:04 +08:00
NovaRain 648bffedc6 Added volume control support for avi movies
Fixed implementation bugs when playing avi movies.
Added a couple of engine variable pointers.
2020-07-28 17:08:44 +08:00
NovaRain 058cc0bb96 Further implementation of speech playback for alternative sound files 2020-07-26 08:53:31 +08:00
NovaRain 9e79b01a27 Added a function extension for vanilla metarule3 function
Added SET_HORRIGAN_ENCOUNTER function to metarule3.
Updated German translation.
2020-07-24 21:29:54 +08:00
NovaRain 37e3ccb410 WIP: Fixed sfx/speech playback for alternative sound files 2020-07-22 12:27:18 +08:00
NovaRain 82db339ff9 Implemented CodeType enums in some SafeWrite8
Replaced some SafeWriteX with SafeWriteBatch.
Misc code edits to DebugEditor.cpp and ScriptExtender.cpp.
Minor edits to documents.
2020-07-21 12:42:46 +08:00
NovaRain 74d3cb9707 Removed some redundant code 2020-07-19 08:56:42 +08:00
NovaRain e0f0ee0f7d Fixed the default values for the MovieXX options
Added some comments to elevators.ini & other codes.
Rearranged the functions in NewGame2().
Updated FalloutEngine.h for previous commit.
Updated version number.
2020-07-18 22:28:22 +08:00
NovaRain 107335749f Implemented union in TGameObj struct (from 4.x)
Moved some code from HeroAppearance to other parts.
Some code edits.
2020-07-18 10:50:49 +08:00
NovaRain c66add00e7 Added more 4.x constants to Define.h
Renamed some members in structs according to 4.x namings.
2020-07-16 11:10:48 +08:00
NovaRain d4d8b3a06c Uploaded language translation files to repo
Updated German (#326) and Russian translations.
2020-07-08 09:54:08 +08:00
NovaRain fcd3bd05f0 Fixed NPC stuck in an animation loop in combat (#321)
* this happens when trying to move close to a multihex critter.
2020-07-01 09:49:37 +08:00
NovaRain ae6a6e80d3 Fixed ASM error in the previous commit 2020-06-30 15:49:53 +08:00
NovaRain c0557ddbc1 Fixed broken PlayIdleAnimOnReload option (#320)
(in commit aafc030)

Improved the fix for incorrect positioning after exiting small/medium
locations.
2020-06-30 12:31:49 +08:00
NovaRain 46dd02b566 Fixed the code for "display_stats" script function
Minor edit to Perks.cpp.
2020-06-29 23:03:41 +08:00
NovaRain 4c3f255915 Added a fix to prevent showing an empty perk selection window 2020-06-29 12:56:27 +08:00
NovaRain de01fdf065 Added "get_stat_max/min" script functions (#307)
Added updating player's stats on the char screen to "display_stats"
script function (#314)
2020-06-29 11:57:36 +08:00
NovaRain 1e6d2229dd Corrected the code for multihex retargeting tile
Small optimization to sfall function code.
2020-06-28 23:13:05 +08:00
NovaRain 317c4d4c05 Re-fix for the previous commit 2020-06-28 09:53:33 +08:00
NovaRain 31b244e5f3 Corrected the fix from the previous commit 2020-06-27 10:16:14 +08:00
NovaRain 066280a7ca Fixed the hang/freeze in combat (from commit b345140)
Added a fix for retargeting tile for multihex critters.
2020-06-27 09:48:20 +08:00
NovaRain 535595a997 Refactored some code in HeroAppearance.cpp 2020-06-14 10:41:57 +08:00
NovaRain 41b15b8838 Fixed bugs in the hero appearance mod:
* gender was not reset properly when creating a new character (#309)
* the player was missing some fire/electrical death animations (#310)
2020-06-14 09:29:53 +08:00
NovaRain 2cd79c1033 Moved static addresses into respective funcs in Stats.cpp 2020-06-13 00:26:31 +08:00
NovaRain cc9807344a Fixed Auto Doors example script mod
Cosmetic changes to the text descriptions in Perks.ini.
2020-06-13 00:20:48 +08:00
NovaRain 6c31cc43a0 Increased the max width of the player name on the char screen (#305)
Updated version number.
2020-06-04 06:40:57 +08:00
NovaRain b345140fba Some bug fixes regarding multihex critters in shoot blocking 2020-05-24 11:33:06 +08:00
NovaRain 3acf051b49 Renamed all metarule functions with mf_ prefix 2020-05-21 09:42:02 +08:00
NovaRain 0137504f3f Renamed all script opcode handlers with op_ prefix 2020-05-19 10:05:27 +08:00
NovaRain ebcd505561 Minor code fixes in AI.cpp:
* Fixed NPCs being unable to select a burst attack mode if the line of
fire was blocked.

* Changed the return point of combat_ai_hook_FleeFix to run
ai_check_drugs_ first.

Changed the debug message about missing art file for critters to be
displayed in game only when in sfall debugging mode.
2020-05-19 09:50:23 +08:00
NovaRain 24cb02b7d8 Fixed ai_move_away_ engine function
Some minor fixes.
2020-05-10 10:03:04 +08:00
NovaRain 48ce358451 Backported SkipLoadingGameSettings option from 4.x 2020-05-08 10:38:32 +08:00
NovaRain c293a826bc Cosmetic changes to the code:
Use double underscore for stdcall and "asm" keyword.
2020-05-07 12:30:22 +08:00
NovaRain 0da7c7b266 Minor code edits to Combat.cpp 2020-05-07 11:20:32 +08:00
NovaRain d74df7fc78 Added checking AP cost to ai_pick_hit_mode_ engine function 2020-05-07 09:49:57 +08:00
NovaRain df816bcd47 Added a tweak for finding new targets for PMs
* before they would "forget" their current target when trying to find
new ones (only 3), now the current target is included as one of
potential targets.

Tweaked the code of MultiHexPathingFix.
2020-05-05 12:15:30 +08:00
NovaRain 068988caad Added internal implementation of engine functions with hooks:
* item_w_mp_cost_ with CALCAPCOST
* is_within_perception_ with WITHINPERCEPTION
2020-05-01 10:29:27 +08:00
NovaRain 24c9499021 Added combat rating check to "Snipe" distance preference fix
Added a fix to reduce friendly fire in burst attacks.
Updated the info of TGameObj struct.
2020-05-01 08:01:24 +08:00
NovaRain 7f3de8d19a Minor code edits/fixes 2020-04-30 10:28:31 +08:00
NovaRain 87f7fe4a54 Moved code from main.cpp to new PlayerModel/MiscPatches.cpp 2020-04-28 12:43:54 +08:00
NovaRain 01ba18100e Added a fix for AI behavior for "Snipe" distance preference
Added a check for for the weapon range and the distance to the target
when AI is choosing weapon attack modes.
2020-04-28 10:58:24 +08:00
NovaRain 8b26573073 Changed the fix for AI target selection in commit f0f00a7
* NPCs will reload the weapon in the same turn (and attack if have
enough AP left) if weapon is empty while selecting targets.

Moved some leftover code in main.cpp to KillCounter.cpp & Elevators.cpp.

Misc code edits.
2020-04-27 14:32:39 +08:00
NovaRain 1839790dfb Fixed AllowDShowSound=2 not working
Limited NumSoundBuffers to the max of 32.
Fixed replacing Body_Torso with Body_Uncalled (from commit 62f890d)
Corrected the code in the previous commit.
2020-04-23 12:42:20 +08:00
NovaRain cb1d5d359f Added a tweak to the miss message in combat
* if the main target has Flat flag set, remove the message about hitting
another object.

Reorganized the code of misc patches in main.cpp.
2020-04-22 11:40:11 +08:00
NovaRain b781e117a2 Improved the fix for placing PID_CORPSE_BLOOD obj on the lower layer
(didn't work correctly after re-entering the map.)

Fixed CorpseDeleteTime not setting the timer correctly.
2020-04-21 10:55:56 +08:00
NovaRain a7d9716b68 Moved some engine structs to FalloutStructs.h
Some code edits regarding variable/struct types.
2020-04-20 12:06:13 +08:00
NovaRain cdd2bfe338 Reverted incorrect code change of SpeedPatch.cpp in previous commit.
Some code edits to Explosions.cpp and Perks.cpp.
2020-04-19 10:21:20 +08:00
NovaRain 7decec4a2c Added use_item_on_dude macro to sfall.h
Various code edits:
* Implemented more HookCalls/MakeCalls/SafeWriteBatch in code.
* Moved return/jump address consts into their respective functions.
2020-04-18 21:25:54 +08:00
NovaRain e3af4f5754 Fixed ReloadWeaponKey for using any non-weapon item (#84) 2020-04-18 11:25:46 +08:00
NovaRain 1b61bca702 Fixed "loot_obj" script function 2020-04-18 09:03:16 +08:00
NovaRain f0f00a77ea Fixed AI target selection for no ammo or target out of range cases 2020-04-18 09:01:29 +08:00
NovaRain 58d41487fd Re-fixed automatically ending combat
Updated version number.
2020-04-18 08:59:28 +08:00
NovaRain 73ccba22bf Implemented HookCalls/MakeCalls templates
* same as SafeWriteBatch, only accept address arrays due to no support
for list initialization in VS2010.
2020-04-11 08:19:32 +08:00
NovaRain 1f8b3636f3 Implemented SafeWriteBatch template from 4.x
* only the version that accepts address array due to no support
for list initialization in VS2020.
2020-04-08 10:42:59 +08:00
129 changed files with 10187 additions and 6837 deletions
+25 -32
View File
@@ -1,10 +1,9 @@
;This file handles modifications to perks and traits ;This file handles modifications to perks and traits
;When adding extra perks to a mod, it's advisable to use
; the fake perk scripting functions rather than make modifications ;When adding extra perks to a mod, it's advisable to use the fake perk scripting functions rather than make modifications
; in this file, as some perks have hardcoded effects which may ; in this file, as some perks have hardcoded effects which may catch you out
; catch you out
;Since traits need to be picked before any scripts run, they ;Since traits need to be picked before any scripts run, they have an additional NoHardcode option in this file which can
; have an additional NoHardcode option in this file which can
; be used to remove their hardcoded effects, and add new stat/skill effects ; be used to remove their hardcoded effects, and add new stat/skill effects
[PerksTweak] [PerksTweak]
@@ -31,31 +30,25 @@ WeaponHandlingBonus=3
;Set to 1 to enable the modifications for perks ;Set to 1 to enable the modifications for perks
Enable=0 Enable=0
;Name=The name of the perk (max 63 characters) ;Name: The name of the perk (max 63 characters)
;Desc=The description of the perk (max 255 characters) ;Desc: The description of the perk (max 255 characters)
;Image=The line number (0-indexed) of the corresponding FRM in skilldex.lst ;Image: The line number (0-indexed) of the corresponding FRM in skilldex.lst
;Ranks=The number of perk levels ;Ranks: The number of perk levels
;Level=The minimum required level ;Level: The minimum required level
;Type=If 0, the perk checks only Skill1 for skill requirements; if 1, it checks ;Type: If 0, the perk checks only Skill1 for skill requirements; if 1, it checks Skill1 or Skill2; if 2, it checks both Skill1 and Skill2
; Skill1 or Skill2; if 2, it checks both Skill1 and Skill2 ;Stat: The modified stat or -1 if you don't want to change any stats
;Stat=The modified stat or -1 if you don't want to change any stats ;StatMag: The increased/decreased value to the modified stat
;StatMag=The increased/decreased value to the modified stat
;Skill1=The first skill (or -1 for none) to check, but if you set a specific bit ;Skill1/Skill2: The first/second skill (or -1 for none) to check, but if you set a specific bit 0x4000000 (67108864), it checks GVAR.
; (67108864 or 0x4000000), it checks GVAR. For example, if Skill1=67108864, then ; For example, if Skill1=0x4000004, then the perk will check GVAR_BAD_MONSTER (0x4000000 + 4) on Skill1Mag value
; the perk will check GVAR_PLAYER_REPUTATION (67108864 + 0) on Skill1Mag value
;Skill1Mag=Positive value is used as the minimum requirements of the first ;Skill1Mag/Skill2Mag: Positive value is used as the minimum requirements of the first/second skill/GVAR, and a negative value is interpreted as the maximum requirement.
; skill/GVAR, and a negative value is interpreted as the maximum requirement. ; For example, with Skill1=0 and Skill1Mag=100, if player has small guns skill >= 100 and meets all other requirements, the perk will be available in the
; For example, with Skill1=0 and Skill1Mag=100, if player has small guns skill ; selection window; with Skill1=1 and Skill1Mag=-120, the perk will not be available if player has big guns skill >= 120
; >= 100 and meets all other requirements, the perk will be available in the
; selection window; with Skill1=1 and Skill1Mag=-120, the perk will not be ;STR-LCK: Positive values are used as minimum requirements of SPECIAL stats, and negative values are interpreted as maximum requirements.
; available if player has big guns skill >= 120 ; For some special perks processed by the engine (e.g. PERK_armor_powered and PERK_armor_combat), the values are not used as requirements
;Skill2=The second skill/GVAR (or -1 for none) to check ; but to add to corresponding SPECIAL stats
;Skill2Mag=Same as Skill1Mag, but for Skill2
;STR-LCK=Positive values are used as minimum requirements of SPECIAL stats, and
; negative values are interpreted as maximum requirements. For some special
; perks processed by the engine (e.g. PERK_armor_powered and PERK_armor_combat),
; the values are not used as requirements but to add to corresponding SPECIAL
; stats
;If the value is set to -99999, the variable will be ignored (similar to comment out that line) ;If the value is set to -99999, the variable will be ignored (similar to comment out that line)
@@ -63,7 +56,7 @@ Enable=0
;This is a modification to perk 119 ;This is a modification to perk 119
[119] [119]
Name=Example Name=Example
Desc=This is an example perk~Second line Desc=This is an example perk description
Image=72 Image=72
Ranks=1 Ranks=1
Level=1 Level=1
+2 -2
View File
@@ -40,7 +40,7 @@ Image=24
ButtonCount=3 ButtonCount=3
;Set the appearance of the elevator ;Set the appearance of the elevator
MainFrm=148 MainFrm=148 ; EL_VAULT.FRM
ButtonsFrm=151 ButtonsFrm=151 ; EL_MIL3.FRM
;Set up the exit points for all three buttons (see examples above) ;Set up the exit points for all three buttons (see examples above)
+50 -31
View File
@@ -1,5 +1,5 @@
;sfall configuration settings ;sfall configuration settings
;v3.8.24 ;v3.8.28
[Main] [Main]
;Change to 1 if you want to use command line args to tell sfall to use another ini file. ;Change to 1 if you want to use command line args to tell sfall to use another ini file.
@@ -28,7 +28,7 @@ SpeedMulti9=900
;The initial speed at game startup ;The initial speed at game startup
SpeedMultiInitial=100 SpeedMultiInitial=100
;Set to 1 to also affect the playback speed of mve video files without an audio track ;Set to 1 to also affect the playback speed of MVE video files without an audio track
AffectPlayback=0 AffectPlayback=0
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
@@ -53,8 +53,14 @@ WindowData=0
;Uncomment the option to use a hardware shader (requires DX9 graphics mode) ;Uncomment the option to use a hardware shader (requires DX9 graphics mode)
;The shader file <name>.fx must be placed in <GameRoot>\<master_patches>\shaders\ and must contain one technique with one or more passes ;The shader file <name>.fx must be placed in <GameRoot>\<master_patches>\shaders\ and must contain one technique with one or more passes
;You can specify multiple shader files, separated by commas
;GlobalShaderFile=global.fx ;GlobalShaderFile=global.fx
;Set to 1 to automatically enable linear texture filtering when the scale factor is not an integer
;Set to 2 to force-enable linear texture filtering
;This can be used in conjunction with the GlobalShaderFile option
TextureFilter=1
;Set to 1 to do the palette conversion on the GPU ;Set to 1 to do the palette conversion on the GPU
;Set to 2 to do the palette conversion on the CPU ;Set to 2 to do the palette conversion on the CPU
;Set to 0 to pick automatically ;Set to 0 to pick automatically
@@ -68,7 +74,8 @@ GPUBlt=0
;Requires DX9 graphics mode and v2.0 pixel shader support (see GPUBlt option) ;Requires DX9 graphics mode and v2.0 pixel shader support (see GPUBlt option)
Use32BitHeadGraphics=0 Use32BitHeadGraphics=0
;Set to 1 to automatically search for alternative avi video files when Fallout tries to play the game movies ;Set to 1 to automatically search for alternative AVI video files when Fallout tries to play the game movies
;Set to 2 to force AVI videos to fit the screen width
;Requires DX9 graphics mode ;Requires DX9 graphics mode
AllowDShowMovies=0 AllowDShowMovies=0
@@ -93,20 +100,20 @@ WorldMapTerrainInfo=0
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
[Sound] [Sound]
;Sets the number of allowed simultaneous sound effects ;Sets the number of allowed simultaneous sound effects
;Set to 0 to leave the default unchanged (i.e. 4) ;Set to 0 to leave the default unchanged (i.e. 4). The maximum is 32
NumSoundBuffers=0 NumSoundBuffers=0
;Set to 1 to allow attaching sound files to combat float messages ;Set to 1 to allow attaching sound files to combat float messages
AllowSoundForFloats=0 AllowSoundForFloats=0
;Set to 1 to automatically search for alternative formats (mp3/wma/wav) when Fallout tries to play an acm ;Set to 1 to automatically search for alternative formats (mp3/wma/wav) when Fallout tries to play an ACM
;Set to 2 to play alternative music files even if original acm files are not present in the music folder ;Set to 2 to play alternative music files even if original ACM files are not present in the music folder
;This does not effect the play_sfall_sound and stop_sfall_sound script functions ;This does not effect the play_sfall_sound and stop_sfall_sound script functions
AllowDShowSound=0 AllowDShowSound=0
;Set to 1 to override the music path used by default (i.e. data\sound\music\) if not present in the cfg ;Set to 1 to override the default music path with data\sound\music\ if music_path is not present in the cfg
;Set to 2 to overwrite all occurances of the music path ;Set to 2 to overwrite all occurrences of the music path
OverrideMusicDir=2 OverrideMusicDir=1
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
[Input] [Input]
@@ -183,9 +190,10 @@ HighlightCorpses=1
;16 - bright yellow ;16 - bright yellow
;32 - dark yellow ;32 - dark yellow
;64 - purple ;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)
OutlineColor=16 OutlineColor=16
;A key to press to reload your currently equipped weapon ;A key to press to reload your currently equipped weapon or use the active item
;Set to 0 if you don't want a reload key, or a DX scancode otherwise ;Set to 0 if you don't want a reload key, or a DX scancode otherwise
ReloadWeaponKey=0 ReloadWeaponKey=0
@@ -267,7 +275,8 @@ DataLoadOrderPatch=1
;FemaleDefaultModel=hfjmps ;FemaleDefaultModel=hfjmps
;To change the various ingame movies, modify the next 17 lines ;To change the various ingame movies, modify the next 17 lines
;Most of these can also be changed ingame via script. ;You can also define additional movies by adding Movie18 - Movie32 lines
;Most of these can also be changed ingame via script
Movie1=iplogo.mve Movie1=iplogo.mve
Movie2=intro.mve Movie2=intro.mve
Movie3=elder.mve Movie3=elder.mve
@@ -323,7 +332,7 @@ DialogueFix=1
;Prevents you from using number keys to enter unvisited areas on a town map ;Prevents you from using number keys to enter unvisited areas on a town map
TownMapHotkeysFix=1 TownMapHotkeysFix=1
;Set to 1 to disable the horrigan encounter ;Set to 1 to disable the Horrigan encounter
DisableHorrigan=0 DisableHorrigan=0
;Set to 1 to disable the random element in NPC levelling. ;Set to 1 to disable the random element in NPC levelling.
@@ -344,7 +353,7 @@ SingleCore=1
OverrideArtCacheSize=0 OverrideArtCacheSize=0
;Prevents you from saving in combat except at the start of your turn to avoid a few bugs ;Prevents you from saving in combat except at the start of your turn to avoid a few bugs
;Note that even with this option enabled, it is still not advisable to save in combat at all. ;Note that even with this option enabled, it is still not advisable to save in combat at all (obsolete information)
;Set to 2 to block all saving in combat ;Set to 2 to block all saving in combat
SaveInCombatFix=1 SaveInCombatFix=1
@@ -352,9 +361,9 @@ SaveInCombatFix=1
;Player's level is capped once the highest specified level is reached ;Player's level is capped once the highest specified level is reached
;XPTable=50,100,200 ;XPTable=50,100,200
;Set to 1 to enable additional weapon animation codes from o-t ;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 ;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 corrisponds to 's' and 15 to 't' ;Since the letters 'n' and 'r' are in use for other animations, an animation code of 11 corresponds to 's' and 15 to 't'
AdditionalWeaponAnims=1 AdditionalWeaponAnims=1
;Uncomment these lines to modify the default modifiers for aimed shots at specific bodyparts ;Uncomment these lines to modify the default modifiers for aimed shots at specific bodyparts
@@ -387,14 +396,14 @@ AlwaysReloadMsgs=0
PlayIdleAnimOnReload=0 PlayIdleAnimOnReload=0
;Changes the timer (in days) for deleting corpses on a map after you leave (valid range: 0..13) ;Changes the timer (in days) for deleting corpses on a map after you leave (valid range: 0..13)
;The corpses of critters with 'Ages' flag or on maps with 'dead_bodies_age=No' set in maps.txt will not disappear ;The corpses of critters with 'Ages' flag set or on maps with 'dead_bodies_age=No' set in maps.txt will not disappear
;Default is 6. Set to 0 for a 12-hour timer ;Default is 6. Set to 0 for a 12-hour timer
CorpseDeleteTime=6 CorpseDeleteTime=6
;Set a number of milliseconds to idle each input loop ;Set a number of milliseconds to idle each input loop
;Set to -1 to disable ;Set to -1 to disable
;Set to 0 to idle only if other processes are waiting for processor time (WinXP/2000: if processes have equal priority) ;Set to 0 to idle only if other processes are waiting for processor time (WinXP/2000: if processes have equal priority)
;Set to 1 (or some higher number if needed, the maximum is 127) to prevent 100% CPU use ;Set to 1 (or some higher number if needed) to prevent 100% CPU use. The maximum is 127
ProcessorIdle=-1 ProcessorIdle=-1
;Set to 1 if using the hero appearance mod ;Set to 1 if using the hero appearance mod
@@ -515,10 +524,11 @@ RemoveCriticalTimelimits=0
;Change the colour of the font used on the main menu for the button text ;Change the colour of the font used on the main menu for the button text
;MainMenuBigFontColour=0x3C ;MainMenuBigFontColour=0x3C
;Two alternate fixes to the interaction between HtH attacks and the fast shot trait ;Alternative behaviors to the Fast Shot trait
;0 - Fallout 2 original behaviour ;0 - Fallout 2 original behavior: -1 AP cost for ranged weapons; aimed attacks are disabled
;1 - Haenlomal's fix, called shots are enabled for HtH attacks ;1 - Haenlomal's fix: aimed attacks are enabled for melee/unarmed weapons and HtH attacks
;2 - Restoring the -1 AP bonus for HtH attacks (i.e. Fallout 1 behaviour) ;2 - Alternative behavior: apply -1 AP cost to melee/unarmed weapons and HtH attacks
;3 - Fallout 1 original behavior: -1 AP cost for all weapons; aimed attacks are disabled
FastShotFix=1 FastShotFix=1
;Set to 1 to boost the maximum number of script names from 1450 to 10000 ;Set to 1 to boost the maximum number of script names from 1450 to 10000
@@ -538,8 +548,10 @@ CritterInvSizeLimit=100
;4 - Motion sensor is required to use the item highlight feature ;4 - Motion sensor is required to use the item highlight feature
MotionScannerFlags=1 MotionScannerFlags=1
;Set to non-0 to adjust the maximum encounter table size ;Set a value greater than 40 to change the maximum encounter table size (enc_## in worldmap.txt)
;Default is 40, and the maximum is 127 ;Default is 40, and the maximum is 100
;Note: Setting this greater than 50 requires renumbering all message lines for the encounter tables in worldmap.msg
;The messages for each table must be numbered from (3000 + table number * 100) to (3099 + table number * 100)
EncounterTableSize=0 EncounterTableSize=0
;Set to 1 to disable the pipboy alarm button ;Set to 1 to disable the pipboy alarm button
@@ -558,8 +570,8 @@ SuperStimExploitFix=0
InventoryApCost=4 InventoryApCost=4
QuickPocketsApCostReduction=2 QuickPocketsApCostReduction=2
;Set to 1 to allow objects seeing through other objects that have their ShootThru flag set ;Set to 1 to fix obj_can_see_obj script function to allow critters to see through objects with 'ShootThru' flag set and other critters in front of them
;Note that enabling this option can cause unexpected NPC behavior in some situations ;Note that enabling this option can cause unexpected NPC behavior in some cases, e.g. initiating combat or dialogue when the player is behind certain obstacles
ObjCanSeeObj_ShootThru_Fix=0 ObjCanSeeObj_ShootThru_Fix=0
;Set to 1 to fix the broken obj_can_hear_obj script function ;Set to 1 to fix the broken obj_can_hear_obj script function
@@ -569,11 +581,10 @@ ObjCanHearObjFix=0
;If the argument value is -1, the mood will be determined by the local variable 0 of the script (vanilla behavior) ;If the argument value is -1, the mood will be determined by the local variable 0 of the script (vanilla behavior)
StartGDialogFix=0 StartGDialogFix=0
;Set to 1 to fix and repurpose the unused called_shot/num_attacks arguments of attack_complex script function ;Set to 1 to fix attacker_results/target_results arguments and repurpose the unused called_shot/num_attacks arguments of attack_complex script function
;This also changes the behavior of the result flags arguments ;New behavior of the arguments:
;called_shot - additional damage, when the damage received by the target is above the specified minimum damage ;called_shot - additional damage when hitting the target
;num_attacks - the number of free action points on the first turn only ;num_attacks - the number of free action points on the first turn only
;attacker_results - unused, must be 0 or not equal to the target_results argument when specifying result flags for the target
AttackComplexFix=0 AttackComplexFix=0
;Set to 1 to fix the issue with the division operator treating negative integers as unsigned ;Set to 1 to fix the issue with the division operator treating negative integers as unsigned
@@ -685,6 +696,10 @@ NumbersInDialogue=0
;Set to 1 to use Fallout's normal text font instead of DOS-like font on the world map ;Set to 1 to use Fallout's normal text font instead of DOS-like font on the world map
WorldMapFontPatch=0 WorldMapFontPatch=0
;Set to 1 to use Fallout's normal text font for death screen subtitles
;Requires changing the color of subtitles in death.pal palette to white color (index 220) to display the text correctly
DeathScreenFontPatch=0
;Set to 1 to display full item description for weapon/ammo in the barter screen ;Set to 1 to display full item description for weapon/ammo in the barter screen
FullItemDescInBarter=0 FullItemDescInBarter=0
@@ -694,8 +709,9 @@ DisplaySwiftLearnerExp=1
;Set to 1 to display party member's current level/AC/addict flag on the combat control panel ;Set to 1 to display party member's current level/AC/addict flag on the combat control panel
PartyMemberExtraInfo=0 PartyMemberExtraInfo=0
;Set to 1 to prevent the inventory/loot/automap interfaces from being placed on top of other script-created windows ;Set to 1 to skip loading all game settings except the game/combat difficulty from saved games
InterfaceDontMoveOnTop=0 ;Set to 2 to also skip loading the game/combat difficulty settings
SkipLoadingGameSettings=0
;Overrides the global variable number used to show the special death message of the Modoc toilet explosion ;Overrides the global variable number used to show the special death message of the Modoc toilet explosion
;Set to -1 to disable the special death message when the global variable is set ;Set to -1 to disable the special death message when the global variable is set
@@ -786,6 +802,9 @@ HideObjIsNullMsg=0
;Has pretty nasty side effects when saving/reloading, so don't use for regular gameplay ;Has pretty nasty side effects when saving/reloading, so don't use for regular gameplay
DontDeleteProtos=0 DontDeleteProtos=0
;Set to 1 to force sfall to search for global scripts every time the game loads rather than only the first time
AlwaysFindScripts=0
;Set to 1 to force critters to display combat float messages ;Set to 1 to force critters to display combat float messages
;Requires AllowSoundForFloats to be enabled ;Requires AllowSoundForFloats to be enabled
Test_ForceFloats=0 Test_ForceFloats=0
Binary file not shown.
+35 -29
View File
@@ -12,52 +12,58 @@ Requires sfall 3.5 or higher
*/ */
#include "..\headers\define_extra.h" #include "..\headers\sfall\sfall.h"
#include "..\headers\sfall\define_extra.h"
procedure set_ammo_mod;
procedure start; procedure start;
procedure map_enter_p_proc; procedure map_enter_p_proc;
variable ammoIni; variable ammoIni;
variable ammoData;
variable enabled; 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 procedure start begin
variable i := 1, ammo, ammoPid, dmgMod;
if game_loaded then begin if game_loaded then begin
ammoIni := get_ini_setting("ddraw.ini|Misc|DamageFormula"); enabled := get_ini_setting("ddraw.ini|Misc|DamageFormula");
if (ammoIni == 1 or ammoIni == 2) then if (enabled == 1 or enabled == 2) then
ammoIni := "AmmoGlovz.ini"; ammoIni := "AmmoGlovz.ini";
else if (ammoIni == 5) then else if (enabled == 5) then
ammoIni := "AmmoYAAM.ini"; ammoIni := "AmmoYAAM.ini";
else else
ammoIni := "AmmoMod.ini"; ammoIni := "AmmoMod.ini";
enabled := get_ini_setting(ammoIni + "|1|pid"); enabled := get_ini_setting(ammoIni + "|1|pid");
if (enabled > 0) then call set_ammo_mod; if (enabled <= 0) then return;
ammoData := create_array_map;
ammoPid := enabled; // pid from the first section
while (ammoPid > 0) do begin
ammo := create_array_map; // create permanent arrays
ammo.ac_adjust := get_ini_setting(ammoIni + "|" + i + "|ac_adjust");
ammo.dr_adjust := get_ini_setting(ammoIni + "|" + i + "|dr_adjust");
// dam_mult and dam_div must be positive integers
dmgMod := get_ini_setting(ammoIni + "|" + i + "|dam_mult");
ammo.dam_mult := dmgMod if (dmgMod > 0) else 1;
dmgMod := get_ini_setting(ammoIni + "|" + i + "|dam_div");
ammo.dam_div := dmgMod if (dmgMod > 0) else 1;
ammoData[ammoPid] := ammo;
i++;
ammoPid := get_ini_setting(ammoIni + "|" + i + "|pid");
end
call map_enter_p_proc;
debug_msg("Ammo INI Loader mod: " + ammoIni + " - set " + (i - 1) + " ammo protos.");
end end
end end
procedure map_enter_p_proc begin procedure map_enter_p_proc begin
if (enabled > 0) then call set_ammo_mod; variable pid, values;
if (enabled > 0) then begin
foreach (pid: values in ammoData) begin
set_proto_data(pid, PROTO_AM_AC_MOD, values.ac_adjust);
set_proto_data(pid, PROTO_AM_DR_MOD, values.dr_adjust);
set_proto_data(pid, PROTO_AM_DMG_MULT, values.dam_mult);
set_proto_data(pid, PROTO_AM_DMG_DIV, values.dam_div);
end
end
end end
Binary file not shown.
@@ -1,14 +1,13 @@
/* /*
Auto Doors mod v1.1 for Fallout 2 by Mr.Stalin Auto Doors mod v1.2 for Fallout 2 by Mr.Stalin
---------------------------------------------- ----------------------------------------------
- allows the player to automatically open/walk through unlocked doors when not in combat - allows the player to automatically open/walk through unlocked doors when not in combat
Requires sfall 3.7b or higher Requires sfall 3.7b or higher
NOTE: this script requires compiler from sfall modderspack with -s option NOTE: this script requires compiler from sfall modderspack with -s option (short circuit evaluation)
(short circuit evaluation)
*/ */
@@ -30,8 +29,8 @@ procedure combatturn_handler;
#define PORTAL (0) #define PORTAL (0)
#define DOOR_FLAGS (0x24) #define DOOR_FLAGS (0x24)
variable only_once := 0; variable onlyOnce := 0;
variable arrayPid; variable pidDoors;
procedure start begin procedure start begin
if game_loaded then begin if game_loaded then begin
@@ -41,11 +40,11 @@ procedure start begin
set_global_script_repeat(40); // for sfall 3.x set_global_script_repeat(40); // for sfall 3.x
call map_enter_p_proc; call map_enter_p_proc;
end else begin end else begin
if (only_once == 1 and combat_is_initialized) then begin if (onlyOnce == 1 and combat_is_initialized) then begin
only_once := 2; onlyOnce := 2;
call set_door_flag(0); // reset flag when entering combat mode call set_door_flag(0); // reset flag when entering combat mode
end else if (only_once == 2 and not(combat_is_initialized)) then begin end else if (onlyOnce == 2 and not(combat_is_initialized)) then begin
only_once := 1; onlyOnce := 1;
if (sfall_ver_major >= 4) then set_global_script_repeat(0); if (sfall_ver_major >= 4) then set_global_script_repeat(0);
call set_door_flag(FLAG_WALKTHRU); // set flag after combat mode ends call set_door_flag(FLAG_WALKTHRU); // set flag after combat mode ends
end end
@@ -53,34 +52,35 @@ procedure start begin
end end
procedure map_enter_p_proc begin procedure map_enter_p_proc begin
if (arrayPid) then begin if (pidDoors) then begin
// when changing maps, delete the current array to create a new one // when changing the map, delete the current array to create a new one
free_array(arrayPid); free_array(pidDoors);
arrayPid := 0; pidDoors := 0;
end end
only_once := 1; onlyOnce := 1;
call set_door_flag(FLAG_WALKTHRU); // set flag when entering the map call set_door_flag(FLAG_WALKTHRU); // set flag when entering the map
end end
procedure set_door_flag(variable state) begin procedure set_door_flag(variable state) begin
variable objectMap, obj, objPid, i; variable objectMap, obj, objPid, i;
if (arrayPid) then begin if (pidDoors) then begin
call set_door_flag_array(state); call set_door_flag_array(state);
return; return;
end end
objectMap := list_as_array(LIST_SCENERY); objectMap := list_as_array(LIST_SCENERY);
arrayPid := create_array(0, 0); pidDoors := create_array(0, 0);
foreach (obj in objectMap) begin foreach (obj in objectMap) begin
objPid := obj_pid(obj); objPid := obj_pid(obj);
if (proto_data(objPid, sc_type) != PORTAL) or is_in_array(objPid, arrayPid) then if (proto_data(objPid, sc_type) != PORTAL or get_proto_data(objPid, DOOR_FLAGS) or is_in_array(objPid, pidDoors)) then begin
continue; // next object continue; // next object
end
resize_array(arrayPid, i + 1); resize_array(pidDoors, i + 1);
arrayPid[i] := objPid; pidDoors[i] := objPid; // add pid to array
i++; i++;
set_proto_data(objPid, DOOR_FLAGS, state); set_proto_data(objPid, DOOR_FLAGS, state);
end end
@@ -88,14 +88,14 @@ end
procedure set_door_flag_array(variable state) begin procedure set_door_flag_array(variable state) begin
variable objPid; variable objPid;
foreach (objPid in arrayPid) begin foreach (objPid in pidDoors) begin
set_proto_data(objPid, DOOR_FLAGS, state); set_proto_data(objPid, DOOR_FLAGS, state);
end end
end end
procedure combatturn_handler begin procedure combatturn_handler begin
if (only_once == 1) then begin if (onlyOnce == 1) then begin
only_once := 2; onlyOnce := 2;
call set_door_flag_array(0); call set_door_flag_array(0);
set_global_script_repeat(60); set_global_script_repeat(60);
end end
@@ -1,85 +1,104 @@
procedure start; procedure start;
procedure GetBoozes;
procedure update_shader; procedure update_shader;
variable perception; variable begin
variable boozes; perception;
variable shader1; boozes;
variable shader2; shader1;
variable shader3; shader2;
variable shader4; shader3;
variable drunk_level; shader4;
variable next_reduction; drunk_level;
next_reduction;
booze_pids;
end
procedure start begin procedure start begin
variable new_pe; variable new_pe, new_booze, drunk_count;
variable new_booze;
variable drunk_count; if (metarule(22, 0)) then return; //is_loading_game
if (metarule(22,0)) then return;
if (game_loaded) then begin if (game_loaded) then begin
if(not graphics_funcs_available) then begin if (not graphics_funcs_available) then begin
display_msg("ERROR: You must set sfall to use graphics mode 4 or 5 to use this mod"); display_msg("ERROR: You must set sfall to use graphics mode 4 or 5 to use this mod");
return; return;
end else begin end else begin
//new_pe:=create_object_sid(125, 0, 0, -1); // pid list of the items for the mod to apply the effect
booze_pids := [/*124,*/ 125];
fix_array(booze_pids);
//new_pe := create_object_sid(125, 0, 0, -1);
//add_mult_objs_to_inven(dude_obj, new_pe, 10); //add_mult_objs_to_inven(dude_obj, new_pe, 10);
perception:=get_pc_extra_stat(1); perception := get_pc_extra_stat(1);
boozes:=obj_is_carrying_obj_pid(dude_obj, 125); boozes := GetBoozes;
set_global_script_repeat(25);
set_global_script_repeat(-1); set_global_script_repeat(50);
shader1:=load_shader("booze1.fx"); set_global_script_type(1);
shader2:=load_shader("booze2.fx");
shader3:=load_shader("booze3.fx"); shader1 := load_shader("booze1.fx");
shader4:=load_shader("booze4.fx"); shader2 := load_shader("booze2.fx");
drunk_level:=0; shader3 := load_shader("booze3.fx");
next_reduction:=0; shader4 := load_shader("booze4.fx");
//display_msg("Init: " + perception + ", " + boozes); //display_msg("Init: " + perception + ", " + boozes);
end end
end else begin end else begin
new_pe:=get_pc_extra_stat(1); new_pe := get_pc_extra_stat(1);
new_booze:=obj_is_carrying_obj_pid(dude_obj, 125); new_booze := GetBoozes;
if( (perception != new_pe) or (boozes != new_booze) ) then begin if ((perception != new_pe) orElse (boozes != new_booze)) then begin
//display_msg("var change: " + perception + ", " + boozes + " -> " + new_pe + ", " + new_booze); //display_msg("var change: " + perception + ", " + boozes + " -> " + new_pe + ", " + new_booze);
if ( (perception > new_pe) and (boozes > new_booze) ) then begin if ((perception > new_pe) andAlso (boozes > new_booze)) then begin
if ( (perception - new_pe) < (boozes - new_booze) ) then begin variable pe_diff := perception - new_pe;
drunk_count:=perception - new_pe; variable booze_diff := boozes - new_booze;
if (pe_diff < booze_diff) then begin
drunk_count := pe_diff;
end else begin end else begin
drunk_count:=boozes - new_booze; drunk_count := booze_diff;
end end
drunk_level:=drunk_level + (drunk_count*10); drunk_level += (drunk_count * 10);
//display_msg("Increasing booze count: " + drunk_level); //display_msg("Increasing booze count: " + drunk_level);
call update_shader; call update_shader;
next_reduction:=game_time + game_ticks(6); next_reduction := game_time + game_ticks(6);
end end
perception:=new_pe; perception := new_pe;
boozes:=new_booze; boozes := new_booze;
end end
if( (next_reduction != 0 ) and (game_time >= next_reduction) ) then begin if ((next_reduction != 0) andAlso (game_time >= next_reduction)) then begin
drunk_level:=drunk_level - 1; drunk_level -= 1;
if(drunk_level == 0) then next_reduction:=0; if (drunk_level == 0) then
else next_reduction:=next_reduction + game_ticks(6); next_reduction := 0;
else
next_reduction += game_ticks(6);
call update_shader; call update_shader;
//display_msg("Decreasing booze count: " + drunk_level); //display_msg("Decreasing booze count: " + drunk_level);
end end
end end
end end
procedure GetBoozes begin
variable pid, count_booze := 0;
foreach (pid in booze_pids) begin
count_booze += obj_is_carrying_obj_pid(dude_obj, pid);
end
return count_booze;
end
procedure update_shader begin procedure update_shader begin
if(drunk_level >= 100) then begin if (drunk_level >= 100) then begin
deactivate_shader(shader1); deactivate_shader(shader1);
deactivate_shader(shader2); deactivate_shader(shader2);
deactivate_shader(shader3); deactivate_shader(shader3);
activate_shader(shader4); activate_shader(shader4);
end else if(drunk_level >= 50) then begin end else if (drunk_level >= 50) then begin
deactivate_shader(shader1); deactivate_shader(shader1);
deactivate_shader(shader2); deactivate_shader(shader2);
activate_shader(shader3); activate_shader(shader3);
deactivate_shader(shader4); deactivate_shader(shader4);
end else if(drunk_level >= 25) then begin end else if (drunk_level >= 25) then begin
deactivate_shader(shader1); deactivate_shader(shader1);
activate_shader(shader2); activate_shader(shader2);
deactivate_shader(shader3); deactivate_shader(shader3);
deactivate_shader(shader4); deactivate_shader(shader4);
end else if(drunk_level > 0) then begin end else if (drunk_level > 0) then begin
activate_shader(shader1); activate_shader(shader1);
deactivate_shader(shader2); deactivate_shader(shader2);
deactivate_shader(shader3); deactivate_shader(shader3);
@@ -0,0 +1,128 @@
/*************************************************************
LumaSharpen version 1.5.0 for Reshade 3.x
by Christian Cann Schuldt Jensen ~ CeeJay.dk
It blurs the original pixel with the surrounding pixels and then subtracts this blur to sharpen the image.
It does this in luma to avoid color artifacts and allows limiting the maximum sharpning to avoid or lessen halo artifacts.
This is similar to using Unsharp Mask in Photoshop.
Adapted to sfall by Mr.Stalin
*************************************************************/
// Strength of the sharpening
// min 0.1, max 3.0
#define sharp_strength 0.75
// Limits maximum amount of sharpening a pixel receives. This helps avoid "haloing" artifacts which would otherwise occur when you raised the strength too much
// min 0.0, max 1.0, step 0.005
#define sharp_clamp 0.035
// Offset bias adjusts the radius of the sampling pattern. I designed the pattern for an offset bias of 1.0, but feel free to experiment
// min 0.0, max 6.0
#define offset_bias 1.0
//------------------------------------------------------//
// Developer settings //
//------------------------------------------------------//
#define CoefLuma float3(0.2126, 0.7152, 0.0722) // BT.709 & sRBG luma coefficient (Monitors and HD Television)
//#define CoefLuma float3(0.299, 0.587, 0.114) // BT.601 luma coefficient (SD Television)
//#define CoefLuma float3(1.0/3.0, 1.0/3.0, 1.0/3.0) // Equal weight coefficient
sampler s0;
float2 rcpres; // pixel size
float4 LumaSharpenPS(float4 color : COLOR0, float2 tex : TEXCOORD) : COLOR0
{
// Get the original pixel
float3 ori = tex2D(s0, tex).rgb; // ori = original pixel
// Combining the strength and luma multipliers
float3 sharp_strength_luma = (CoefLuma * sharp_strength); // I'll be combining even more multipliers with it later on
//------------------------------------------------------//
// Sampling patterns //
//------------------------------------------------------//
float3 blur_ori;
// [ NW, , NE ] Each texture lookup (except ori)
// [ ,ori, ] samples 4 pixels
// [ SW, , SE ]
// -- Pattern 2 -- A 9 tap gaussian using 4+1 texture fetches.
//
// -- Gaussian filter --
// [ .25, .50, .25] [ 1 , 2 , 1 ]
// [ .50, 1, .50] = [ 2 , 4 , 2 ]
// [ .25, .50, .25] [ 1 , 2 , 1 ]
blur_ori = tex2D(s0, tex + float2(rcpres.x, -rcpres.y) * 0.5 * offset_bias).rgb; // South East
blur_ori += tex2D(s0, tex - rcpres * 0.5 * offset_bias).rgb; // South West
blur_ori += tex2D(s0, tex + rcpres * 0.5 * offset_bias).rgb; // North East
blur_ori += tex2D(s0, tex - float2(rcpres.x, -rcpres.y) * 0.5 * offset_bias).rgb; // North West
blur_ori *= 0.25; // Divide by 4 the number of texture fetches
// -- Pattern 3 -- An experimental 17 tap gaussian using 4+1 texture fetches.
// Wider is less sensitive to noise but also to fine details.
// -- Gaussian filter --
// [ , 4 , 6 , , ]
// [ ,16 ,24 ,16 , 4 ]
// [ 6 ,24 , ,24 , 6 ]
// [ 4 ,16 ,24 ,16 , ]
// [ , , 6 , 4 , ]
//blur_ori = tex2D(s0, tex + rcpres * float2(0.4, -1.2) * offset_bias).rgb; // South South East
//blur_ori += tex2D(s0, tex - rcpres * float2(1.2, 0.4) * offset_bias).rgb; // West South West
//blur_ori += tex2D(s0, tex + rcpres * float2(1.2, 0.4) * offset_bias).rgb; // East North East
//blur_ori += tex2D(s0, tex - rcpres * float2(0.4, -1.2) * offset_bias).rgb; // North North West
//blur_ori *= 0.25; // Divide by the number of texture fetches
//sharp_strength_luma *= 0.51;
// -- Pattern 4 -- A 9 tap high pass (pyramid filter) using 4+1 texture fetches.
// Pyramid has a slightly more aggresive look
// -- Gaussian filter --
// [ .50, .50, .50] [ 1 , 1 , 1 ]
// [ .50, , .50] = [ 1 , , 1 ]
// [ .50, .50, .50] [ 1 , 1 , 1 ]
//blur_ori = tex2D(s0, tex + float2(0.5 * rcpres.x, -rcpres.y * offset_bias)).rgb; // South South East
//blur_ori += tex2D(s0, tex + float2(offset_bias * -rcpres.x, 0.5 * -rcpres.y)).rgb; // West South West
//blur_ori += tex2D(s0, tex + float2(offset_bias * rcpres.x, 0.5 * rcpres.y)).rgb; // East North East
//blur_ori += tex2D(s0, tex + float2(0.5 * -rcpres.x, rcpres.y * offset_bias)).rgb; // North North West
////blur_ori += (2 * ori); // Probably not needed. Only serves to lessen the effect.
//blur_ori /= 4.0; // Divide by the number of texture fetches
//sharp_strength_luma *= 0.666; // Adjust strength to aproximate the strength of pattern 2
//------------------------------------------------------//
// Sharpen //
//------------------------------------------------------//
// Calculate the sharpening --
float3 sharp = ori - blur_ori; // Subtracting the blurred image from the original image
// Adjust strength of the sharpening and clamp it
float4 sharp_strength_luma_clamp = float4(sharp_strength_luma * (0.5 / sharp_clamp), 0.5); // Roll part of the clamp into the dot
//sharp_luma = saturate((0.5 / sharp_clamp) * sharp_luma + 0.5); // scale up and clamp
float sharp_luma = saturate(dot(float4(sharp, 1.0), sharp_strength_luma_clamp)); // Calculate the luma, adjust the strength, scale up and clamp
sharp_luma = (sharp_clamp * 2.0) * sharp_luma - sharp_clamp; // scale down
// Combining the values to get the final sharpened pixel
float3 outputcolor = ori + sharp_luma; // Add the sharpening to the the original.
//------------------------------------------------------//
// Returning the output //
//------------------------------------------------------//
// Show sharpening pattern
// Visualize the strength of the sharpen\nThis is useful for seeing what areas the sharpning affects the most
//outputcolor = saturate(0.5 + (sharp_luma * 4.0)).rrr; //outputcolor = abs(sharp * 4.0);
return float4(saturate(outputcolor), 1);
}
technique LumaSharpen
{
pass P0 { PixelShader = compile ps_2_0 LumaSharpenPS(); }
}
+213 -74
View File
@@ -1,4 +1,23 @@
// Status: WIP ///////////////////////////////////////////////////////////////////////////////
// Blur filter setting
//
// min: blurFalloff 8, sharpness 10/8
// mid: blurFalloff 6, sharpness 8
// max: blurFalloff 4, sharpness 6
///////////////////////////////////////////////////////////////////////////////
#define blurFalloff 4.0
#define sharpness 6.0
///////////////////////////////////////////////////////////////////////////////
// Sharpen filter setting
//
// min: Sharpen 0.5, EdgeSharpen 1.0
// mid: Sharpen 1.0, EdgeSharpen -0.25
// max: Sharpen 1.75, EdgeSharpen -0.5 (1.5, -0.25)
///////////////////////////////////////////////////////////////////////////////
#define Sharpen 0.5
#define EdgeSharpen 1.0
texture bloomMap; texture bloomMap;
sampler s0; sampler s0;
@@ -12,6 +31,93 @@ sampler BloomSampler : samplerstate
AddressV = Clamp; AddressV = Clamp;
}; };
// Variables that set the width and height of the current game resolution from sfall (only for global shaders)
int w;
int h;
// the pixel size is computed as: 1.0f / resolution
float2 rcpres;
// system ticks (received from sfall)
//int tickcount;
static const float2 wPass = float2(1, 0);
static const float2 hPass = float2(0, 1);
float Brightness(float3 color)
{
return 0.299 * color.r + 0.587 * color.g + 0.114 * color.b;
}
float3 BlurFunction(float2 uv, float brightness, inout float totalWeight)
{
float3 pointColor = (tex2Dlod(s0, float4(uv, 0, 0)).rgb);
float diff = abs(brightness - Brightness(pointColor));
float weight = exp2((-0.25 * blurFalloff) - (diff * sharpness));
totalWeight += weight;
return pointColor * weight;
}
float4 BlurDeltaPassPS(float2 uv : TEXCOORD0, uniform float2 delta) : COLOR0
{
float3 sumColor = (tex2D(s0, uv).rgb);
float brightness = Brightness(sumColor);
delta *= rcpres;
float totalWeight = 1;
float2 pointUV = uv + delta;
sumColor += BlurFunction(pointUV, brightness, totalWeight);
pointUV = uv - delta;
sumColor += BlurFunction(pointUV, brightness, totalWeight);
return float4((sumColor / totalWeight), 1);
}
static const float2 wDelta = float2(1, 0) * rcpres;
static const float2 hDelta = float2(0, 1) * rcpres;
float4 BlurPS(float4 color : COLOR0, float2 uv : TEXCOORD0) : COLOR0
{
float totalWeight = 1;
float3 sumColor = (tex2D(s0, uv).rgb);
float brightness = Brightness(sumColor);
float2 pointUV = uv + wDelta;
sumColor += BlurFunction(pointUV, brightness, totalWeight);
pointUV = uv - wDelta;
sumColor += BlurFunction(pointUV, brightness, totalWeight);
pointUV = uv + hDelta;
sumColor += BlurFunction(pointUV, brightness, totalWeight);
pointUV = uv - hDelta;
sumColor += BlurFunction(pointUV, brightness, totalWeight);
return float4((sumColor / totalWeight), 1);
}
///////////////////////////////////////////////////////////////////////////////
// Bloom effect setting
//
// min: BloomIntensity .8
// mid: BloomIntensity .85
// max: BloomIntensity .9
///////////////////////////////////////////////////////////////////////////////
#define BaseIntensity 1.2
#define BaseSaturation 1.0
#define BloomIntensity 0.8
#define BloomSaturation 0.35
#define BloomThreshold 0.35
#define BlurPower 0.002
// pseudo gauss blur // pseudo gauss blur
static const float2 offsets[12] = { static const float2 offsets[12] = {
-0.326212, -0.405805, -0.326212, -0.405805,
@@ -28,89 +134,122 @@ static const float2 offsets[12] = {
-0.791559, -0.597705, -0.791559, -0.597705,
}; };
float w; float4 AdjustSaturation(float4 color, float saturation)
float h; {
static const float2 resolution = float2(w, h);
// blur setting
static const float blurFalloff = 8;
static const float sharpness = 4;
float4 AdjustSaturation(float4 color, float saturation) {
float grey = dot(color, float3(0.3, 0.59, 0.11)); float grey = dot(color, float3(0.3, 0.59, 0.11));
return lerp(grey, color, saturation); return lerp(grey, color, saturation);
} }
float Brightness(float3 color) float4 BloomPS(float4 color : COLOR0, float2 texCoord : TEXCOORD0) : COLOR0
{ {
return color.r * color.g - 0.75 * color.b;
}
float3 BlurFunction(float2 uv, float brightness, inout float totalWeight)
{
float3 pointColor =(tex2Dlod(s0, float4(uv, 0, 0)).rgb);
float diff = abs(brightness - Brightness(pointColor));
float weight = exp2(-0.25 * blurFalloff - diff * sharpness);
totalWeight += weight;
return pointColor * weight;
}
float4 BlurPS(float2 uv : TEXCOORD0, uniform float2 delta) : COLOR0
{
float3 sumColor = (tex2D(s0, uv).rgb);
float totalWeight = 1;
float brightness = Brightness(sumColor);
delta *= (1 / resolution);
float radius = 1;
float2 pointUV = uv + delta * radius;
sumColor += BlurFunction(pointUV, brightness, totalWeight);
pointUV = uv - delta * radius;
sumColor += BlurFunction(pointUV, brightness, totalWeight);
return float4((sumColor / totalWeight),1);
// return AdjustSaturation(Color, 0.5);
}
float4 BloomT(float2 texCoord : TEXCOORD0) : COLOR0 {
float4 c = tex2D(s0, texCoord);
float BloomThreshold = 0.2;
return saturate((c - BloomThreshold) / (1 - BloomThreshold));
}
float4 Bloom(float4 color : COLOR0, float2 texCoord : TEXCOORD0) : COLOR0 {
float BaseIntensity = 1.0;
float BaseSaturation = 1;
float BloomIntensity = 1; // 0.4
float BloomSaturation = 0.5;
float BlurPower = 0.01;
float BloomThreshold = 0.5;
float4 original = tex2D(s0, texCoord); float4 original = tex2D(s0, texCoord);
// blur
float4 sum = tex2D(s0, texCoord);
for(int i = 0; i < 12; i++){
sum += tex2D(s0, texCoord + BlurPower * offsets[i]);
}
sum /= 13;
original = AdjustSaturation(original, BaseSaturation) * BaseIntensity; original = AdjustSaturation(original, BaseSaturation) * BaseIntensity;
sum = AdjustSaturation(sum, BloomSaturation) * BloomIntensity; float sum = (original.r + original.g + original.b) * 0.333;
if (sum >= 0.95) return original;
sum = saturate((sum - BloomThreshold) / (1 - BloomThreshold)); // bloom blur
float4 bloomBlur = tex2D(s0, texCoord);
for(int i = 0; i < 12; i++)
{
bloomBlur += tex2D(s0, texCoord + BlurPower * offsets[i]);
}
bloomBlur *= 0.085;
return sum + original; float intensity = BloomIntensity - lerp(0.0, 0.2, sum);
// return sum; bloomBlur = AdjustSaturation(bloomBlur, BloomSaturation) * intensity;
bloomBlur = saturate((bloomBlur - BloomThreshold) / (1 - BloomThreshold));
return bloomBlur + original;
} }
technique Blur static const float CoefBlur = (Sharpen * 0.5);
static const float CoefOrig = (1 + CoefBlur);
// for the sharpen edge
#define SharpenEdge 0.4
static const float sharpenVal0 = (Sharpen * (1.5 + EdgeSharpen));
static const float sharpenVal1 = ((sharpenVal0 - 1) / 8.0);
// pixel "width"
static const float px = rcpres.x;
static const float py = rcpres.y;
// for the blur filter
#define mean 1.0
static const float dx = (mean * px);
static const float dy = (mean * py);
float4 SharpenComplexPS(float4 color : COLOR0, float2 texCoord : TEXCOORD0) : COLOR0
{ {
// pass P2 { PixelShader = compile ps_2_0 BloomT(); } float4 c0 = tex2D(s0, texCoord); // get original pixel
// pass P3 { PixelShader = compile ps_2_0 Bloom(); }
Pass P0 { PixelShader = compile ps_3_0 BlurPS(float2(1, 0)); } // edge detection
Pass P1 { PixelShader = compile ps_3_0 BlurPS(float2(0, 1)); } // Get neighbor points
// [ c1, c2, c3 ]
// [ c4, c0, c5 ]
// [ c6, c7, c8 ]
float4 c1 = tex2D(s0, texCoord + float2(-px, -py));
float4 c2 = tex2D(s0, texCoord + float2( 0, -py));
float4 c3 = tex2D(s0, texCoord + float2( px, -py));
float4 c4 = tex2D(s0, texCoord + float2(-px, 0));
float4 c5 = tex2D(s0, texCoord + float2( px, 0));
float4 c6 = tex2D(s0, texCoord + float2(-px, py));
float4 c7 = tex2D(s0, texCoord + float2( 0, py));
float4 c8 = tex2D(s0, texCoord + float2( px, py));
// using Sobel filter
// horizontal gradient
// [ -1, 0, 1 ]
// [ -2, 0, 2 ]
// [ -1, 0, 1 ]
float delta1 = (c3 + 2 * c5 + c8) - (c1 + 2 * c4 + c6);
// vertical gradient
// [ -1, - 2, -1 ]
// [ 0, 0, 0 ]
// [ 1, 2, 1 ]
float4 c13 = c1 + c3;
float4 c68 = c6 + c8;
float delta2 = (c68 + 2 * c7) - (c13 + 2 * c2);
// computation
if (sqrt(mul(delta1, delta1) + mul(delta2, delta2)) > SharpenEdge) {
// if we have an edge, use sharpen
return c0 * sharpenVal0 - (c13 + c2 + c4 + c5 + c68 + c7) * sharpenVal1;
// Display edges in red...
//return float4( 1.0, 0.0, 0.0, 0.0 );
} else {
// else return corrected image
// compute blurred image (gaussian filter)
c1 = tex2D(s0, texCoord + float2(-dx, -dy));
c2 = tex2D(s0, texCoord + float2( 0, -dy));
c3 = tex2D(s0, texCoord + float2( dx, -dy));
c4 = tex2D(s0, texCoord + float2(-dx, 0));
c5 = tex2D(s0, texCoord + float2( dx, 0));
c6 = tex2D(s0, texCoord + float2(-dx, dy));
c7 = tex2D(s0, texCoord + float2( 0, dy));
c8 = tex2D(s0, texCoord + float2( dx, dy));
// gaussian filter
// [ 1, 2, 1 ]
// [ 2, 4, 2 ]
// [ 1, 2, 1 ]
// to normalize the values, we need to divide by the coeff sum
float4 flou = (c1 + c3 + c6 + c8 + 2 * (c2 + c4 + c5 + c7) + 4 * c0) * 0.0625; // 1 / (1+2+1+2+4+2+1+2+1) = 1 / 16 = 0.0625
// substract blurred image from original image
return (CoefOrig * c0 - CoefBlur * flou);
}
}
technique BlurBloom
{
//pass P0 { PixelShader = compile ps_3_0 BlurDeltaPassPS(wPass); }
//pass P1 { PixelShader = compile ps_3_0 BlurDeltaPassPS(hPass); }
pass P0 { PixelShader = compile ps_3_0 BlurPS(); }
pass P3 { PixelShader = compile ps_2_0 BloomPS(); }
pass P2 { PixelShader = compile ps_2_0 SharpenComplexPS(); }
} }
@@ -0,0 +1,106 @@
// Shader from Media Player Classic - Home Cinema
// Adapted to sfall by Mr.Stalin
///////////////////////////////////////////////////////////////////////////////
// Sharpen filter setting
//
// min: Sharpen 0.5, EdgeSharpen 1.0
// mid: Sharpen 1.0, EdgeSharpen -0.25
// max: Sharpen 1.75, EdgeSharpen -0.5 (1.5, -0.25)
///////////////////////////////////////////////////////////////////////////////
#define Sharpen 0.5
#define EdgeSharpen 1.1
sampler s0;
// Variables that set the width and height of the current game resolution from sfall
float w;
float h;
float2 rcpres; // pixel size
static const float CoefBlur = (Sharpen * 0.5);
static const float CoefOrig = (1 + CoefBlur);
// for the sharpen edge
#define SharpenEdge 0.4
static const float sharpenVal0 = (Sharpen * (1.5 + EdgeSharpen));
static const float sharpenVal1 = ((sharpenVal0 - 1) / 8.0);
// pixel "width"
static const float px = rcpres.x;
static const float py = rcpres.y;
// for the blur filter
#define mean 1.0
static const float dx = (mean * px);
static const float dy = (mean * py);
float4 SharpenComplexPS(float4 color : COLOR0, float2 texCoord : TEXCOORD0) : COLOR0
{
float4 c0 = tex2D(s0, texCoord); // get original pixel
// edge detection
// Get neighbor points
// [ c1, c2, c3 ]
// [ c4, c0, c5 ]
// [ c6, c7, c8 ]
float4 c1 = tex2D(s0, texCoord + float2(-px, -py));
float4 c2 = tex2D(s0, texCoord + float2( 0, -py));
float4 c3 = tex2D(s0, texCoord + float2( px, -py));
float4 c4 = tex2D(s0, texCoord + float2(-px, 0));
float4 c5 = tex2D(s0, texCoord + float2( px, 0));
float4 c6 = tex2D(s0, texCoord + float2(-px, py));
float4 c7 = tex2D(s0, texCoord + float2( 0, py));
float4 c8 = tex2D(s0, texCoord + float2( px, py));
// using Sobel filter
// horizontal gradient
// [ -1, 0, 1 ]
// [ -2, 0, 2 ]
// [ -1, 0, 1 ]
float delta1 = (c3 + 2 * c5 + c8) - (c1 + 2 * c4 + c6);
// vertical gradient
// [ -1, - 2, -1 ]
// [ 0, 0, 0 ]
// [ 1, 2, 1 ]
float4 c13 = c1 + c3;
float4 c68 = c6 + c8;
float delta2 = (c68 + 2 * c7) - (c13 + 2 * c2);
// computation
if (sqrt(mul(delta1, delta1) + mul(delta2, delta2)) > SharpenEdge) {
// if we have an edge, use sharpen
return c0 * sharpenVal0 - (c13 + c2 + c4 + c5 + c68 + c7) * sharpenVal1;
// Display edges in red...
//return float4( 1.0, 0.0, 0.0, 0.0 );
} else {
// else return corrected image
// compute blurred image (gaussian filter)
c1 = tex2D(s0, texCoord + float2(-dx, -dy));
c2 = tex2D(s0, texCoord + float2( 0, -dy));
c3 = tex2D(s0, texCoord + float2( dx, -dy));
c4 = tex2D(s0, texCoord + float2(-dx, 0));
c5 = tex2D(s0, texCoord + float2( dx, 0));
c6 = tex2D(s0, texCoord + float2(-dx, dy));
c7 = tex2D(s0, texCoord + float2( 0, dy));
c8 = tex2D(s0, texCoord + float2( dx, dy));
// gaussian filter
// [ 1, 2, 1 ]
// [ 2, 4, 2 ]
// [ 1, 2, 1 ]
// to normalize the values, we need to divide by the coeff sum
float4 flou = (c1 + c3 + c6 + c8 + 2 * (c2 + c4 + c5 + c7) + 4 * c0) * 0.0625; // 1 / (1+2+1+2+4+2+1+2+1) = 1 / 16 = 0.0625
// substract blurred image from original image
return (CoefOrig * c0 - CoefBlur * flou);
}
}
technique SharpenT
{
pass P0 { PixelShader = compile ps_2_0 SharpenComplexPS(); }
}
@@ -1,7 +1,5 @@
/* /*
Example implementation of the algorithm of how the game engine checks if one critter sees another critter. Example implementation of the algorithm of how the game engine checks if one critter sees another critter.
NOTE: the AllowUnsafeScripting option must be enabled.
*/ */
#include "..\headers\define.h" #include "..\headers\define.h"
@@ -9,10 +7,8 @@
#include "..\headers\sfall\sfall.h" #include "..\headers\sfall\sfall.h"
#include "..\headers\sfall\define_extra.h" #include "..\headers\sfall\define_extra.h"
#define can_see_(source, target) call_offset_r2(0x412BEC, source, target)
#define obj_dist_(target, source) call_offset_r2(0x48BBD4, target, source)
procedure start; procedure start;
procedure can_see(variable obj1, variable obj2);
procedure start begin procedure start begin
if game_loaded then begin if game_loaded then begin
@@ -21,40 +17,50 @@ procedure start begin
variable variable
source := get_sfall_arg, source := get_sfall_arg,
target := get_sfall_arg, target := get_sfall_arg,
original := get_sfall_arg, engine := get_sfall_arg,
hookType := get_sfall_arg, /* new arg */ type := get_sfall_arg, /* new arg */
result := 0, result := 0,
distance; distance, seeDistance, seeText;
if target then begin if target then begin
distance := get_critter_stat(source, STAT_pe); seeDistance := get_critter_stat(source, STAT_pe);
if can_see_(source, target) then begin if can_see(source, target) then begin
distance *= 5; seeDistance *= 5;
if (get_flags(target) bwand FLAG_TRANSGLASS) then distance /= 2; if (get_flags(target) bwand FLAG_TRANSGLASS) then seeDistance /= 2;
end else if combat_is_initialized then begin end else if combat_is_initialized then begin
distance *= 2; seeDistance *= 2;
end end
if (target == dude_obj) then begin if (target == dude_obj) then begin
if sneak_success then begin if sneak_success then begin
distance /= 4; seeDistance /= 4;
if has_skill(target, SKILL_SNEAK) > 120 then distance -= 1; if has_skill(target, SKILL_SNEAK) > 120 then seeDistance -= 1;
end else if dude_is_sneaking then begin end else if dude_is_sneaking then begin
distance := distance * 2 / 3; seeDistance := (seeDistance * 2) / 3; // distance div 1.5
end end
end end
if obj_dist_(target, source) <= distance then result := 1; distance := tile_distance_objs(source, target);
if (get_flags(source) bwand FLAG_MULTIHEX) then distance--;
if (get_flags(target) bwand FLAG_MULTIHEX) then distance--;
// example if (distance <= seeDistance) then result := 1;
if (result) then begin
display_msg("hs_withinperception: " + obj_name(source) + " sees " + obj_name(target) + " [original: " + original + " script: " + result + "]"); seeText = " does not see > ";
end else begin if (result) then seeText = " sees > ";
display_msg("hs_withinperception: " + obj_name(source) + " does not see " + obj_name(target) + " [original: " + original + " script: " + result + "]");
end // Example
display_msg("hs_withinperception: " + obj_name(source) + seeText + obj_name(target) + " [engine: " + engine + ", script: " + result + "]");
/* override engine result */
//set_sfall_return(result);
end end
//set_sfall_return(result);
end end
end end
procedure can_see(variable obj1, variable obj2) begin
variable dir = obj_get_rot(obj1) - rotation_to_tile(tile_num(obj1), tile_num(obj2));
if (dir < 0) then dir = -dir;
return (dir <= 1) or (dir == 5);
end
@@ -0,0 +1,264 @@
procedure start;
variable rainshaderdef;
variable snowshaderdef;
variable sandshaderdef;
variable rainshaderesc;
variable snowshaderesc;
variable sandshaderesc;
variable rainshaderinv;
variable snowshaderinv;
variable sandshaderinv;
variable rainshadermap;
variable snowshadermap;
variable sandshadermap;
variable rainshaderskd;
variable snowshaderskd;
variable sandshaderskd;
variable cshader;
variable active;
procedure update_shader(variable shader) begin
if (shader == cshader) then begin
return;
end
if (cshader == 1) then begin
deactivate_shader(rainshaderdef);
deactivate_shader(rainshaderesc);
deactivate_shader(rainshaderinv);
deactivate_shader(rainshadermap);
deactivate_shader(rainshaderskd);
end else if (cshader == 2) then begin
deactivate_shader(snowshaderdef);
deactivate_shader(snowshaderesc);
deactivate_shader(snowshaderinv);
deactivate_shader(snowshadermap);
deactivate_shader(snowshaderskd);
end else if (cshader == 3) then begin
deactivate_shader(sandshaderdef);
deactivate_shader(sandshaderesc);
deactivate_shader(sandshaderinv);
deactivate_shader(sandshadermap);
deactivate_shader(sandshaderskd);
end
if (shader == 1) then begin
activate_shader(rainshaderdef);
activate_shader(rainshaderesc);
activate_shader(rainshaderinv);
activate_shader(rainshadermap);
activate_shader(rainshaderskd);
end else if (shader == 2) then begin
activate_shader(snowshaderdef);
activate_shader(snowshaderesc);
activate_shader(snowshaderinv);
activate_shader(snowshadermap);
activate_shader(snowshaderskd);
end else if (shader == 3) then begin
activate_shader(sandshaderdef);
activate_shader(sandshaderesc);
activate_shader(sandshaderinv);
activate_shader(sandshadermap);
activate_shader(sandshaderskd);
end
cshader := shader;
if (shader == 0) then begin
force_graphics_refresh(0);
end else begin
force_graphics_refresh(1);
end
end
procedure on_game_load begin
variable tmp;
if (graphics_funcs_available) then begin
display_msg("Weather mod: Shader functions available");
end else return;
rainshaderdef := load_shader("weather\\rain-def.fx");
snowshaderdef := load_shader("weather\\snow-def.fx");
sandshaderdef := load_shader("weather\\sand-def.fx");
rainshaderesc := load_shader("weather\\rain-esc.fx");
snowshaderesc := load_shader("weather\\snow-esc.fx");
sandshaderesc := load_shader("weather\\sand-esc.fx");
rainshaderinv := load_shader("weather\\rain-inv.fx");
snowshaderinv := load_shader("weather\\snow-inv.fx");
sandshaderinv := load_shader("weather\\sand-inv.fx");
rainshadermap := load_shader("weather\\rain-map.fx");
snowshadermap := load_shader("weather\\snow-map.fx");
sandshadermap := load_shader("weather\\sand-map.fx");
rainshaderskd := load_shader("weather\\rain-skd.fx");
snowshaderskd := load_shader("weather\\snow-skd.fx");
sandshaderskd := load_shader("weather\\sand-skd.fx");
if (rainshaderdef == -1 or snowshaderdef == -1 or sandshaderdef == -1) then begin
display_msg("Weather mod error: Could not load default shaders");
return;
end
if (rainshaderesc == -1 or snowshaderesc == -1 or sandshaderesc == -1) then begin
display_msg("Weather mod error: Could not load escape shaders");
return;
end
if (rainshaderinv == -1 or snowshaderinv == -1 or sandshaderinv == -1) then begin
display_msg("Weather mod error: Could not load inventory shaders");
return;
end
if (rainshadermap == -1 or snowshadermap == -1 or sandshadermap == -1) then begin
display_msg("Weather mod error: Could not load automap shaders");
return;
end
if (rainshaderskd == -1 or snowshaderskd == -1 or sandshaderskd == -1) then begin
display_msg("Weather mod error: Could not load skilldex shaders");
return;
end
tmp := get_shader_texture(rainshaderdef, 2);
set_shader_texture(rainshaderesc, "tex2", tmp);
set_shader_texture(rainshaderinv, "tex2", tmp);
set_shader_texture(rainshadermap, "tex2", tmp);
set_shader_texture(rainshaderskd, "tex2", tmp);
tmp := get_shader_texture(snowshaderdef, 2);
set_shader_texture(snowshaderesc, "tex2", tmp);
set_shader_texture(snowshaderinv, "tex2", tmp);
set_shader_texture(snowshadermap, "tex2", tmp);
set_shader_texture(snowshaderskd, "tex2", tmp);
tmp := get_shader_texture(sandshaderdef, 2);
set_shader_texture(sandshaderesc, "tex2", tmp);
set_shader_texture(sandshaderinv, "tex2", tmp);
set_shader_texture(sandshadermap, "tex2", tmp);
set_shader_texture(sandshaderskd, "tex2", tmp);
tmp := get_shader_texture(rainshaderdef, 1);
set_shader_texture(snowshaderdef, "tex1", tmp);
set_shader_texture(sandshaderdef, "tex1", tmp);
tmp := get_shader_texture(rainshaderesc, 1);
set_shader_texture(snowshaderesc, "tex1", tmp);
set_shader_texture(sandshaderesc, "tex1", tmp);
tmp := get_shader_texture(rainshaderinv, 1);
set_shader_texture(snowshaderinv, "tex1", tmp);
set_shader_texture(sandshaderinv, "tex1", tmp);
tmp := get_shader_texture(rainshadermap, 1);
set_shader_texture(snowshadermap, "tex1", tmp);
set_shader_texture(sandshadermap, "tex1", tmp);
tmp := get_shader_texture(rainshaderskd, 1);
set_shader_texture(snowshaderskd, "tex1", tmp);
set_shader_texture(sandshaderskd, "tex1", tmp);
set_shader_mode(rainshaderdef, 30653); // 0x77bd
set_shader_mode(snowshaderdef, 30653);
set_shader_mode(sandshaderdef, 30653);
set_shader_mode(rainshaderesc, 30645); // 0x77b5
set_shader_mode(snowshaderesc, 30645);
set_shader_mode(sandshaderesc, 30645);
set_shader_mode(rainshaderinv, 26557); // 0x67bd
set_shader_mode(snowshaderinv, 26557);
set_shader_mode(sandshaderinv, 26557);
set_shader_mode(rainshadermap, 22461); // 0x57bd
set_shader_mode(snowshadermap, 22461);
set_shader_mode(sandshadermap, 22461);
set_shader_mode(rainshaderskd, 14269); // 0x37bd
set_shader_mode(snowshaderskd, 14269);
set_shader_mode(sandshaderskd, 14269);
set_shader_mode(rainshaderesc, 2147483656); // 0x80000008
set_shader_mode(snowshaderesc, 2147483656);
set_shader_mode(sandshaderesc, 2147483656);
set_shader_mode(rainshaderinv, 2147487744); // 0x80001000
set_shader_mode(snowshaderinv, 2147487744);
set_shader_mode(sandshaderinv, 2147487744);
set_shader_mode(rainshadermap, 2147491840); // 0x80002000
set_shader_mode(snowshadermap, 2147491840);
set_shader_mode(sandshadermap, 2147491840);
set_shader_mode(rainshaderskd, 2147500032); // 0x80004000
set_shader_mode(snowshaderskd, 2147500032);
set_shader_mode(sandshaderskd, 2147500032);
//set_global_script_repeat(50);
end
procedure update_region begin
variable tmp;
variable rain := 50;
variable snow := 25;
variable sand := 25;
snow += rain;
sand += snow;
tmp := random(1,100);
if (tmp <= rain) then begin
display_msg("It's raining");
active := 1;
end else if (tmp <= snow) then begin
display_msg("It's snowing");
active := 2;
end else if (tmp <= sand) then begin
display_msg("It's sandstorming");
active := 3;
end else begin
display_msg("No weather");
active := 0;
end
//call update_shader(active);
end
procedure update_weather begin
variable tmp = random(10, 90) / 100.0;
call update_shader(active);
if (active == 1) then begin
set_shader_float(rainshaderdef, "speed", 500 - (tmp * 300));
set_shader_float(rainshaderdef, "multi", 1.5 + tmp * 6.5);
set_shader_float(rainshaderesc, "speed", 500 - (tmp * 300));
set_shader_float(rainshaderesc, "multi", 1.5 + tmp * 6.5);
set_shader_float(rainshaderinv, "speed", 500 - (tmp * 300));
set_shader_float(rainshaderinv, "multi", 1.5 + tmp * 6.5);
set_shader_float(rainshadermap, "speed", 500 - (tmp * 300));
set_shader_float(rainshadermap, "multi", 1.5 + tmp * 6.5);
set_shader_float(rainshaderskd, "speed", 500 - (tmp * 300));
set_shader_float(rainshaderskd, "multi", 1.5 + tmp * 6.5);
end else if (active == 2) then begin
set_shader_float(snowshaderdef, "speed", 800 - (tmp * 200));
set_shader_float(snowshaderdef, "multi", 0.5 + tmp * 0.5);
set_shader_float(snowshaderesc, "speed", 800 - (tmp * 200));
set_shader_float(snowshaderesc, "multi", 0.5 + tmp * 0.5);
set_shader_float(snowshaderinv, "speed", 800 - (tmp * 200));
set_shader_float(snowshaderinv, "multi", 0.5 + tmp * 0.5);
set_shader_float(snowshadermap, "speed", 800 - (tmp * 200));
set_shader_float(snowshadermap, "multi", 0.5 + tmp * 0.5);
set_shader_float(snowshaderskd, "speed", 800 - (tmp * 200));
set_shader_float(snowshaderskd, "multi", 0.5 + tmp * 0.5);
end else begin
set_shader_float(sandshaderdef, "speed", 400 - (tmp * 200));
set_shader_float(sandshaderdef, "multi", tmp);
set_shader_float(sandshaderesc, "speed", 400 - (tmp * 200));
set_shader_float(sandshaderesc, "multi", tmp);
set_shader_float(sandshaderinv, "speed", 400 - (tmp * 200));
set_shader_float(sandshaderinv, "multi", tmp);
set_shader_float(sandshadermap, "speed", 400 - (tmp * 200));
set_shader_float(sandshadermap, "multi", tmp);
set_shader_float(sandshaderskd, "speed", 400 - (tmp * 200));
set_shader_float(sandshaderskd, "multi", tmp);
end
//display_msg("Shader active: "+tmp);
end
procedure start begin
variable tmp;
if (game_loaded) then begin
call on_game_load;
call update_region;
call update_weather;
end
end
@@ -340,6 +340,9 @@ There are several changes in this version of sslc which may result in problems f
=== Changelog === === Changelog ===
================= =================
> sfall 4.2.7
- added ability to declare local variables anywhere in the procedure body
> sfall 4.2.3 > sfall 4.2.3
- fixed compiler giving "assignment operator expected" error when a variable-like macro is not being defined properly - fixed compiler giving "assignment operator expected" error when a variable-like macro is not being defined properly
- added new logical operators "AndAlso", "OrElse" for short-circuit evaluation of logical expressions - added new logical operators "AndAlso", "OrElse" for short-circuit evaluation of logical expressions
+69 -3
View File
@@ -2,6 +2,9 @@
#ifndef DEFINE_EXTRA_H #ifndef DEFINE_EXTRA_H
#define DEFINE_EXTRA_H #define DEFINE_EXTRA_H
/* Combat Flags */
#define DAM_PRESERVE_FLAGS 0x80000000 // keep the existing result flags when setting new flags in attack_complex (for sfall)
#define BODY_HIT_HEAD (0) #define BODY_HIT_HEAD (0)
#define BODY_HIT_LEFT_ARM (1) #define BODY_HIT_LEFT_ARM (1)
#define BODY_HIT_RIGHT_ARM (2) #define BODY_HIT_RIGHT_ARM (2)
@@ -102,10 +105,11 @@
#define CFLG_NOKNOCKDOWN CFLG_NOKNOCKBACK // obsolete #define CFLG_NOKNOCKDOWN CFLG_NOKNOCKBACK // obsolete
/* Window flags */ /* Window flags */
#define WIN_FLAG_MOVEONTOP (0x4) #define WIN_FLAG_DONTMOVE (0x2) // does not move the window to the foreground when clicking on the window
#define WIN_FLAG_HIDDEN (0x8) #define WIN_FLAG_MOVEONTOP (0x4) // places the window on top of other windows
#define WIN_FLAG_HIDDEN (0x8) // hidden window
#define WIN_FLAG_EXCLUSIVE (0x10) #define WIN_FLAG_EXCLUSIVE (0x10)
#define WIN_FLAG_TRANSPARENT (0x20) #define WIN_FLAG_TRANSPARENT (0x20) // transparent window flag, the window color with index 0 will be transparent
/* Message window flags */ /* Message window flags */
#define MSGBOX_AUTOSIZE (0x0) #define MSGBOX_AUTOSIZE (0x0)
@@ -337,4 +341,66 @@
#define OBJ_DATA_DAMAGE_LAST_TURN (0x48) #define OBJ_DATA_DAMAGE_LAST_TURN (0x48)
#define OBJ_DATA_WHO_HIT_ME (0x54) // current target of the critter #define OBJ_DATA_WHO_HIT_ME (0x54) // current target of the critter
// compute attack result data offsets
#define C_ATTACK_SOURCE (0x00)
#define C_ATTACK_HIT_MODE (0x04)
#define C_ATTACK_WEAPON (0x08)
#define C_ATTACK_UNUSED (0x0C)
#define C_ATTACK_DAMAGE_SOURCE (0x10) // Amount
#define C_ATTACK_FLAGS_SOURCE (0x14) // see DAM_* values in define.h
#define C_ATTACK_ROUNDS (0x18)
#define C_ATTACK_MESSAGE (0x1C) // message number set from the critical table
#define C_ATTACK_TARGET (0x20)
#define C_ATTACK_BODY_PART (0x28)
#define C_ATTACK_DAMAGE_TARGET (0x2C) // Amount
#define C_ATTACK_FLAGS_TARGET (0x30) // see DAM_*
#define C_ATTACK_KNOCKBACK_VALUE (0x34)
#define C_ATTACK_MAIN_TARGET (0x38)
#define C_ATTACK_AROUND_NUMBER (0x3C) // The number of critters around the target
#define C_ATTACK_TARGET1 (0x40)
#define C_ATTACK_TARGET2 (0x44)
#define C_ATTACK_TARGET3 (0x48)
#define C_ATTACK_TARGET4 (0x4C)
#define C_ATTACK_TARGET5 (0x50)
#define C_ATTACK_TARGET6 (0x54)
#define C_ATTACK_BODY_PART1 (0x58)
#define C_ATTACK_BODY_PART2 (0x5C)
#define C_ATTACK_BODY_PART3 (0x60)
#define C_ATTACK_BODY_PART4 (0x64)
#define C_ATTACK_BODY_PART5 (0x68)
#define C_ATTACK_BODY_PART6 (0x6C)
#define C_ATTACK_DAMAGE_TARGET1 (0x70) // Amount
#define C_ATTACK_DAMAGE_TARGET2 (0x74)
#define C_ATTACK_DAMAGE_TARGET3 (0x78)
#define C_ATTACK_DAMAGE_TARGET4 (0x7C)
#define C_ATTACK_DAMAGE_TARGET5 (0x80)
#define C_ATTACK_DAMAGE_TARGET6 (0x84)
#define C_ATTACK_FLAGS_TARGET1 (0x88) // see DAM_*
#define C_ATTACK_FLAGS_TARGET2 (0x8C)
#define C_ATTACK_FLAGS_TARGET3 (0x90)
#define C_ATTACK_FLAGS_TARGET4 (0x94)
#define C_ATTACK_FLAGS_TARGET5 (0x98)
#define C_ATTACK_FLAGS_TARGET6 (0x9C)
#define C_ATTACK_KNOCKBACK_VALUE1 (0xA0)
#define C_ATTACK_KNOCKBACK_VALUE2 (0xA4)
#define C_ATTACK_KNOCKBACK_VALUE3 (0xA8)
#define C_ATTACK_KNOCKBACK_VALUE4 (0xAC)
#define C_ATTACK_KNOCKBACK_VALUE5 (0xB0)
#define C_ATTACK_KNOCKBACK_VALUE6 (0xB4)
/* Playback mode defines for the soundplay function */
#define soundraw (0x80000000) // sfall flag
#define Stereo8bit (soundstereo)
#define Stereo8bitLoop (soundstereo bwor soundloop)
#define Mono16bit (sound16bit)
#define Mono16bitLoop (sound16bit bwor soundloop)
#define Stereo16bit (soundstereo bwor sound16bit)
#define Stereo16bitLoop (soundstereo bwor sound16bit bwor soundloop)
// Adjust (reduce) volume for soundplay and play_sfall_sound
// range: 0x0000XXXX (max volume) - 0x7FFFXXXX (mute)
#define SoundVolume25 (0x20000000)
#define SoundVolumeHalf (0x40000000)
#define SoundVolume75 (0x60000000)
#endif // DEFINE_EXTRA_H #endif // DEFINE_EXTRA_H
+105 -72
View File
@@ -70,6 +70,7 @@
#define WINTYPE_CHARACTER (5) #define WINTYPE_CHARACTER (5)
#define WINTYPE_SKILLDEX (6) #define WINTYPE_SKILLDEX (6)
#define WINTYPE_ESCMENU (7) // escape menu #define WINTYPE_ESCMENU (7) // escape menu
#define WINTYPE_AUTOMAP (8)
//Valid flags for force_encounter_with_flags //Valid flags for force_encounter_with_flags
#define ENCOUNTER_FLAG_NO_CAR (0x1) #define ENCOUNTER_FLAG_NO_CAR (0x1)
@@ -234,79 +235,111 @@
#define party_member_list_all party_member_list(1) #define party_member_list_all party_member_list(1)
// fake perks/traits add mode flags // fake perks/traits add mode flags
#define ADD_PERK_MODE_TRAIT (1) // add to the player's traits #define ADD_PERK_MODE_TRAIT (1) // add to the player's traits list
#define ADD_PERK_MODE_PERK (2) // add to the player's perks #define ADD_PERK_MODE_PERK (2) // add to the player's perks list
#define ADD_PERK_MODE_REMOVE (4) // remove from the list of selectable perks (after added to the player) #define ADD_PERK_MODE_REMOVE (4) // remove from the list of selectable perks (after added to the player)
// sfall_funcX macros // instantly apply the item to dude_obj (w/o animation)
#define add_global_timer_event(time, fixedParam) sfall_func2("add_g_timer_event", time, fixedParam) #define use_item_on_dude(item) set_self(dude_obj); \
#define add_iface_tag sfall_func0("add_iface_tag") set_self(dude_obj); \
#define add_trait(traitID) sfall_func1("add_trait", traitID) use_obj_on_obj(item, dude_obj); \
#define art_cache_clear sfall_func0("art_cache_clear") set_self(0)
#define attack_is_aimed sfall_func0("attack_is_aimed")
#define create_win(winName, x, y, w, h) sfall_func5("create_win", winName, x, y, w, h) // returns the corrected tile distance between two objects to the distance variable (return value >= 9996 is an error when getting the distance)
#define create_win_flag(winName, x, y, w, h, flag) sfall_func6("create_win", winName, x, y, w, h, flag) #define distance_objs(distance, obj1, obj2) distance := tile_distance_objs(obj1, obj2) - 1; \
#define critter_inven_obj2(obj, type) sfall_func2("critter_inven_obj2", obj, type) if (get_flags(obj1) bwand FLAG_MULTIHEX) then distance--; \
#define dialog_obj sfall_func0("dialog_obj") if (get_flags(obj2) bwand FLAG_MULTIHEX) then distance--
#define display_stats sfall_func0("display_stats")
#define draw_image(pathFile, frame, x, y, noTrans) sfall_func5("draw_image", pathFile, frame, x, y, noTrans)
#define draw_image_scaled(pathFile, frame, x, y, w, h) sfall_func6("draw_image_scaled", pathFile, frame, x, y, w, h) /* sfall metarule3 function macros */
#define exec_map_update_scripts sfall_func0("exec_map_update_scripts") // sets the number of days (range 1...127) for the Frank Horrigan encounter, or disable the encounter if days is set to 0
#define floor2(value) sfall_func1("floor2", value) #define set_horrigan_days(day) metarule3(200, day, 0, 0)
#define get_current_inven_size(obj) sfall_func1("get_current_inven_size", obj) // clears the keyboard input buffer, use it in the HOOK_KEYPRESS hook to clear keyboard events before calling functions that are waiting for keyboard input
#define get_cursor_mode sfall_func0("get_cursor_mode") #define clear_keyboard_buffer metarule3(201, 0, 0, 0)
#define get_flags(obj) sfall_func1("get_flags", obj)
#define get_interface_x(winType) sfall_func2("get_window_attribute", winType, 1)
#define get_interface_y(winType) sfall_func2("get_window_attribute", winType, 2) /* sfall_funcX macros */
#define get_inven_ap_cost sfall_func0("get_inven_ap_cost") #define add_global_timer_event(time, fixedParam) sfall_func2("add_g_timer_event", time, fixedParam)
#define get_map_enter_position sfall_func0("get_map_enter_position") #define add_iface_tag sfall_func0("add_iface_tag")
#define get_metarule_table sfall_func0("get_metarule_table") #define add_trait(traitID) sfall_func1("add_trait", traitID)
#define get_object_data(obj, offset) sfall_func2("get_object_data", obj, offset) #define art_cache_clear sfall_func0("art_cache_clear")
#define get_outline(obj) sfall_func1("get_outline", obj) #define attack_is_aimed sfall_func0("attack_is_aimed")
#define get_sfall_arg_at(argNum) sfall_func1("get_sfall_arg_at", argNum) #define car_gas_amount sfall_func0("car_gas_amount")
#define get_text_width(text) sfall_func1("get_text_width", text) #define combat_data sfall_func0("combat_data")
#define hide_window(winName) sfall_func1("hide_window", winName) #define create_win(winName, x, y, w, h) sfall_func5("create_win", winName, x, y, w, h)
#define intface_hide sfall_func0("intface_hide") #define create_win_flag(winName, x, y, w, h, flag) sfall_func6("create_win", winName, x, y, w, h, flag)
#define intface_is_hidden sfall_func0("intface_is_hidden") #define critter_inven_obj2(obj, type) sfall_func2("critter_inven_obj2", obj, type)
#define intface_is_shown(winType) sfall_func1("get_window_attribute", winType) #define dialog_obj sfall_func0("dialog_obj")
#define intface_redraw sfall_func0("intface_redraw") #define display_stats sfall_func0("display_stats")
#define intface_show sfall_func0("intface_show") #define draw_image(artFile, frame, x, y, noTrans) sfall_func5("draw_image", artFile, frame, x, y, noTrans)
#define inventory_redraw(invSide) sfall_func1("inventory_redraw", invSide) #define draw_image_scaled(artFile, frame, x, y, w, h) sfall_func6("draw_image_scaled", artFile, frame, x, y, w, h)
#define item_weight(obj) sfall_func1("item_weight", obj) #define exec_map_update_scripts sfall_func0("exec_map_update_scripts")
#define lock_is_jammed(obj) sfall_func1("lock_is_jammed", obj) #define floor2(value) sfall_func1("floor2", value)
#define loot_obj sfall_func0("loot_obj") #define get_current_inven_size(obj) sfall_func1("get_current_inven_size", obj)
#define message_box(text) sfall_func1("message_box", text) #define get_cursor_mode sfall_func0("get_cursor_mode")
#define metarule_exist(metaruleName) sfall_func1("metarule_exist", metaruleName) #define get_flags(obj) sfall_func1("get_flags", obj)
#define npc_engine_level_up(toggle) sfall_func1("npc_engine_level_up", toggle) #define get_interface_x(winType) sfall_func2("get_window_attribute", winType, 1)
#define obj_under_cursor(onlyCritter, includeDude) sfall_func2("obj_under_cursor", onlyCritter, includeDude) #define get_interface_y(winType) sfall_func2("get_window_attribute", winType, 2)
#define objects_in_radius(tile, radius, elev, type) sfall_func4("objects_in_radius", tile, radius, elev, type) #define get_inven_ap_cost sfall_func0("get_inven_ap_cost")
#define outlined_object sfall_func0("outlined_object") #define get_map_enter_position sfall_func0("get_map_enter_position")
#define real_dude_obj sfall_func0("real_dude_obj") #define get_metarule_table sfall_func0("get_metarule_table")
#define remove_all_timer_events sfall_func0("remove_timer_event") #define get_object_data(obj, offset) sfall_func2("get_object_data", obj, offset)
#define remove_timer_event(fixedParam) sfall_func1("remove_timer_event", fixedParam) #define get_outline(obj) sfall_func1("get_outline", obj)
#define set_cursor_mode(mode) sfall_func1("set_cursor_mode", mode) #define get_pc_stat_max(stat) sfall_func1("get_stat_max", stat)
#define set_flags(obj, flags) sfall_func2("set_flags", obj, flags) #define get_pc_stat_min(stat) sfall_func1("get_stat_min", stat)
#define set_iface_tag_text(tag, text, color) sfall_func3("set_iface_tag_text", tag, text, color) #define get_npc_stat_max(stat) sfall_func2("get_stat_max", stat, 1)
#define set_ini_setting(setting, value) sfall_func2("set_ini_setting", setting, value) #define get_npc_stat_min(stat) sfall_func2("get_stat_min", stat, 1)
#define set_map_enter_position(tile, elev, rot) sfall_func3("set_map_enter_position", tile, elev, rot) #define get_sfall_arg_at(argNum) sfall_func1("get_sfall_arg_at", argNum)
#define set_object_data(obj, offset, value) sfall_func3("set_object_data", obj, offset, value) #define get_text_width(text) sfall_func1("get_text_width", text)
#define set_outline(obj, color) sfall_func2("set_outline", obj, color) #define hide_window(winName) sfall_func1("hide_window", winName)
#define set_terrain_name(x, y, name) sfall_func3("set_terrain_name", x, y, name) #define interface_art_draw(winID, artFile, x, y) sfall_func4("interface_art_draw", winID, artFile, x, y)
#define set_town_title(areaID, title) sfall_func2("set_town_title", areaID, title) #define interface_art_draw_frame(winID, artID, x, y, frame) sfall_func5("interface_art_draw", winID, artID, x, y, frame)
#define set_unique_id(obj) sfall_func1("set_unique_id", obj) #define interface_art_draw_ex(winID, artID, x, y, frame, param) sfall_func6("interface_art_draw", winID, artID, x, y, frame, param)
#define set_unjam_locks_time(time) sfall_func1("set_unjam_locks_time", time) #define interface_print(text, winType, x, y, color) sfall_func5("interface_print", text, winType, x, y, color)
#define set_window_flag(winID, flag, value) sfall_func3("set_window_flag", winID, flag, value) #define interface_print_width(text, winType, x, y, color, w) sfall_func6("interface_print", text, winType, x, y, color, w)
#define show_window(winName) sfall_func1("show_window", winName) #define interface_redraw_all sfall_func1("intface_redraw", 1)
#define spatial_radius(obj) sfall_func1("spatial_radius", obj) #define intface_hide sfall_func0("intface_hide")
#define string_compare(str1, str2) sfall_func2("string_compare", str1, str2) #define intface_is_hidden sfall_func0("intface_is_hidden")
#define string_compare_locale(str1, str2, codePage) sfall_func3("string_compare", str1, str2, codePage) #define intface_is_shown(winType) sfall_func1("get_window_attribute", winType)
#define string_format(format, a1, a2) sfall_func3("string_format", format, a1, a2) #define intface_redraw sfall_func0("intface_redraw")
#define string_tolower(text) sfall_func2("string_to_case", text, 0) #define intface_show sfall_func0("intface_show")
#define string_toupper(text) sfall_func2("string_to_case", text, 1) #define inventory_redraw(invSide) sfall_func1("inventory_redraw", invSide)
#define tile_by_position(x, y) sfall_func2("tile_by_position", x, y) #define item_weight(obj) sfall_func1("item_weight", obj)
#define tile_refresh_display sfall_func0("tile_refresh_display") #define lock_is_jammed(obj) sfall_func1("lock_is_jammed", obj)
#define unjam_lock(obj) sfall_func1("unjam_lock", obj) #define loot_obj sfall_func0("loot_obj")
#define unset_unique_id(obj) sfall_func2("set_unique_id", obj, -1) #define message_box(text) sfall_func1("message_box", text)
#define unwield_slot(critter, slot) sfall_func2("unwield_slot", critter, slot) #define metarule_exist(metaruleName) sfall_func1("metarule_exist", metaruleName)
#define npc_engine_level_up(toggle) sfall_func1("npc_engine_level_up", toggle)
#define obj_under_cursor(onlyCritter, includeDude) sfall_func2("obj_under_cursor", onlyCritter, includeDude)
#define objects_in_radius(tile, radius, elev, type) sfall_func4("objects_in_radius", tile, radius, elev, type)
#define outlined_object sfall_func0("outlined_object")
#define real_dude_obj sfall_func0("real_dude_obj")
#define remove_all_timer_events sfall_func0("remove_timer_event")
#define remove_timer_event(fixedParam) sfall_func1("remove_timer_event", fixedParam)
#define set_car_intface_art(artIndex) sfall_func1("set_car_intface_art", artIndex)
#define set_cursor_mode(mode) sfall_func1("set_cursor_mode", mode)
#define set_flags(obj, flags) sfall_func2("set_flags", obj, flags)
#define set_iface_tag_text(tag, text, color) sfall_func3("set_iface_tag_text", tag, text, color)
#define set_ini_setting(setting, value) sfall_func2("set_ini_setting", setting, value)
#define set_map_enter_position(tile, elev, rot) sfall_func3("set_map_enter_position", tile, elev, rot)
#define set_object_data(obj, offset, value) sfall_func3("set_object_data", obj, offset, value)
#define set_outline(obj, color) sfall_func2("set_outline", obj, color)
#define set_terrain_name(x, y, name) sfall_func3("set_terrain_name", x, y, name)
#define set_town_title(areaID, title) sfall_func2("set_town_title", areaID, title)
#define set_unique_id(obj) sfall_func1("set_unique_id", obj)
#define set_unjam_locks_time(time) sfall_func1("set_unjam_locks_time", time)
#define set_window_flag(winID, flag, value) sfall_func3("set_window_flag", winID, flag, value)
#define show_window(winName) sfall_func1("show_window", winName)
#define spatial_radius(obj) sfall_func1("spatial_radius", obj)
#define string_compare(str1, str2) sfall_func2("string_compare", str1, str2)
#define string_compare_locale(str1, str2, codePage) sfall_func3("string_compare", str1, str2, codePage)
#define string_format(format, a1, a2) sfall_func3("string_format", format, a1, a2)
#define string_tolower(text) sfall_func2("string_to_case", text, 0)
#define string_toupper(text) sfall_func2("string_to_case", text, 1)
#define tile_by_position(x, y) sfall_func2("tile_by_position", x, y)
#define tile_refresh_display sfall_func0("tile_refresh_display")
#define unjam_lock(obj) sfall_func1("unjam_lock", obj)
#define unset_unique_id(obj) sfall_func2("set_unique_id", obj, -1)
#define unwield_slot(critter, slot) sfall_func2("unwield_slot", critter, slot)
#endif #endif
+10 -5
View File
@@ -80,13 +80,14 @@ HOOK_TOHIT (hs_tohit.int)
Runs when Fallout is calculating the chances of an attack striking a target Runs when Fallout is calculating the chances of an attack striking a target
Runs after the hit chance is fully calculated normally, including applying the 95% cap Runs after the hit chance is fully calculated normally, including applying the 95% cap
int arg1 - The unmodified hit chance int arg1 - The hit chance (capped)
critter arg2 - The attacker critter arg2 - The attacker
critter arg3 - The target of the attack critter arg3 - The target of the attack
int arg4 - The targeted bodypart int arg4 - The targeted bodypart
int arg5 - Source tile (may differ from attacker's tile, when AI is considering potential fire position) int arg5 - Source tile (may differ from attacker's tile, when AI is considering potential fire position)
int arg6 - Attack Type (one of ATKTYPE_*) int arg6 - Attack Type (one of ATKTYPE_*)
int arg7 - Ranged flag (0 or 1, actually passed 1 even for unarmed attacks, may be a vanilla bug) int arg7 - Ranged flag. 1 means the hit chance is calculated by taking into account the bonuses/penalties of the distance to the target
int arg8 - The raw hit chance before applying the cap
int ret1 - the new hit chance int ret1 - the new hit chance
@@ -173,6 +174,7 @@ int arg9 - Damage Multiplier (this is divided by 2, so a value of 3 does 1.
int arg10 - Number of bullets actually hit the target (1 for melee attacks) int arg10 - Number of bullets actually hit the target (1 for melee attacks)
int arg11 - The amount of knockback to the target int arg11 - The amount of knockback to the target
int arg12 - Attack Type (see ATKTYPE_* constants) int arg12 - Attack Type (see ATKTYPE_* constants)
mixed arg13 - computed attack data (see C_ATTACK_* for offsets and use get/set_object_data functions to get/set the data)
int ret1 - The damage to the target int ret1 - The damage to the target
int ret2 - The damage to the attacker int ret2 - The damage to the attacker
@@ -192,7 +194,7 @@ Critter arg1 - The critter that just died
HOOK_FINDTARGET (hs_findtarget.int) HOOK_FINDTARGET (hs_findtarget.int)
Runs when the ai is trying to pick a target in combat. Fallout first chooses a list of 4 likely suspects, then normally sorts them in order of weakness/distance/etc depending on the ai caps of the attacker. Runs when the AI is trying to pick a target in combat. Fallout first chooses a list of 4 likely suspects, then normally sorts them in order of weakness/distance/etc depending on the AI caps of the attacker.
This hook replaces that sorting function, allowing you to sort the targets in some arbitrary way. This hook replaces that sorting function, allowing you to sort the targets in some arbitrary way.
The return values can include critters that weren't in the list of possible targets, but the additional targets may still be discarded later on in the combat turn if they are out of the attackers perception or the chance of a successful hit is too low. The list of possible targets often includes duplicated entries, but this is fixed in sfall 4.2.3/3.8.23. The return values can include critters that weren't in the list of possible targets, but the additional targets may still be discarded later on in the combat turn if they are out of the attackers perception or the chance of a successful hit is too low. The list of possible targets often includes duplicated entries, but this is fixed in sfall 4.2.3/3.8.23.
@@ -417,8 +419,11 @@ This is fired after the default calculation is made.
Critter arg1 - Watcher object Critter arg1 - Watcher object
Obj arg2 - Target object Obj arg2 - Target object
int arg3 - Result of vanilla function: 1 - within perception range, 0 - otherwise int arg3 - Result of vanilla function: 1 - within perception range, 0 - otherwise
int arg4 - Type of hook: 1 - when being called from obj_can_see_obj script function, 2 when being called from obj_can_hear_obj script function (need to set ObjCanHearObjFix=1 in ddraw.ini), 0 for all other cases int arg4 - Type of hook:
1 - when being called from obj_can_see_obj script function
2 - when being called from obj_can_hear_obj script function (need to set ObjCanHearObjFix=1 in ddraw.ini)
3 - when AI determines whether it sees a potential target when selecting attack targets
0 - all other cases
int ret1 - overrides the returned result of the function: 0 - not in range (can't see), 1 - in range (will see if not blocked), 2 - forced detection (will see regardless, only used in obj_can_see_obj scripting function which is called by every critter in the game) int ret1 - overrides the returned result of the function: 0 - not in range (can't see), 1 - in range (will see if not blocked), 2 - forced detection (will see regardless, only used in obj_can_see_obj scripting function which is called by every critter in the game)
------------------------------------------- -------------------------------------------
+73 -20
View File
@@ -4,7 +4,8 @@
As well as the new functions, sfall also adds global scripts. These run independent of any loaded maps, but do not have an attached object. (i.e. using self_obj without using set_self first will crash the script.) To use a global script, the script must have a name which begins with 'gl' and contains a procedure called 'start', 'map_enter_p_proc', 'map_exit_p_proc', or 'map_update_p_proc'. The start procedure will be executed once when the player loads a saved game or starts a new game. The map_*_p_proc procedures will be executed once when a map is being entered/left/updated. If you wish the script to be executed repeatedly, call set_global_script_repeat on the first run of the start procedure using the number of frames between each run as the argument. (0 disables the script, 1 runs it every frame, 2 runs it every other frame etc.) As well as the new functions, sfall also adds global scripts. These run independent of any loaded maps, but do not have an attached object. (i.e. using self_obj without using set_self first will crash the script.) To use a global script, the script must have a name which begins with 'gl' and contains a procedure called 'start', 'map_enter_p_proc', 'map_exit_p_proc', or 'map_update_p_proc'. The start procedure will be executed once when the player loads a saved game or starts a new game. The map_*_p_proc procedures will be executed once when a map is being entered/left/updated. If you wish the script to be executed repeatedly, call set_global_script_repeat on the first run of the start procedure using the number of frames between each run as the argument. (0 disables the script, 1 runs it every frame, 2 runs it every other frame etc.)
Global scripts have multiple modes, which can be set using the set_global_script_type function. In the default mode (i.e. mode 0) their execution is linked to the local map game loop, so the script will not run in dialogs or on the world map. In mode 1 their execution is linked to the player input, and so they will run whenever the mouse cursor is visible on screen, including the world map, character dialogs etc. In mode 2, execution is linked to the world map loop, so the script will only be executed on the world map and not on the local map or in any dialog windows. Mode 3 is a combination of modes 0 and 2, so scripts will be executed on both local maps and the world map, but not in dialog windows. Using mode 1 requires the input wrapper to be enabled. Use available_global_script_types to check what is available. Global scripts have multiple modes, which can be set using the set_global_script_type function. In the default mode (i.e. mode 0) their execution is linked to the local map game loop, so the script will not run in dialogs or on the world map. In mode 1 their execution is linked to the player input, and so they will run whenever the mouse cursor is visible on screen, including the world map, character dialogs etc. In mode 2, execution is linked to the world map loop, so the script will only be executed on the world map and not on the local map or in any dialog windows. Mode 3 is a combination of modes 0 and 2, so scripts will be executed on both local maps and the world map, but not in dialog windows.
[Using mode 1 requires the input wrapper to be enabled. Use available_global_script_types to check what is available.] - Obsolete.
@@ -18,7 +19,7 @@ The read_xxx functions take a memory address as the parameter and can read arbit
The get/set_pc_base/extra_stat functions are equivalent to calling get/set_critter_base/extra_stat with dude_obj as the critter pointer. None of these stat functions take perks into account, and neither do they do range clamping to make sure the stats are valid. Use the normal get_critter_stat function to get a correctly perk adjusted and range clamped value for a stat. The get/set_pc_base/extra_stat functions are equivalent to calling get/set_critter_base/extra_stat with dude_obj as the critter pointer. None of these stat functions take perks into account, and neither do they do range clamping to make sure the stats are valid. Use the normal get_critter_stat function to get a correctly perk adjusted and range clamped value for a stat.
The set_stat_max/min functions can be used to set the valid ranges on on stats. Values returned by get_current_stat will be clamped to this range. The set_pc_ function only effect the player, the set_npc_ functions only effect other critters, and the set_ functions effect both. The set_stat_max/min functions can be used to set the valid ranges on stats. Values returned by get_current_stat will be clamped to this range. The set_pc_ function only affects the player, the set_npc_ functions only affects other critters, and the set_ functions affects both.
The input functions are only available if the user has the input hook turned on in ddraw.ini. Use input_funcs_available to check. The input functions are only available if the user has the input hook turned on in ddraw.ini. Use input_funcs_available to check.
@@ -42,7 +43,7 @@ The 'type' value in the weapon knockback functions can be 0 or 1. If 0, the valu
The get/set_sfall_global functions require an 8 characters long case sensitive string for the variable name. The variables behave the same as normal Fallout globals, except that they don't have to be declared beforehand in vault13.gam. Trying to get a variable which hasn't been set will always return 0. These functions are intended for use when a patch to a mod requires the addition of a new global variable, a case which would otherwise require the player to start a new game. The get/set_sfall_global functions require an 8 characters long case sensitive string for the variable name. The variables behave the same as normal Fallout globals, except that they don't have to be declared beforehand in vault13.gam. Trying to get a variable which hasn't been set will always return 0. These functions are intended for use when a patch to a mod requires the addition of a new global variable, a case which would otherwise require the player to start a new game.
set_pickpocket_max and set_hit_chance_max effect all critters rather than just the player. set_skill_max can't be used to increase the skill cap above 300. set_perk_level_mod sets a modifier between +25 and -25 that is added/subtracted from the player's level for the purposes of deciding which perks can be chosen. set_pickpocket_max and set_hit_chance_max affect all critters rather than just the player and can set the maximum in range from 0 to 999. set_skill_max can't be used to increase the skill cap above 300. set_perk_level_mod sets a modifier between +25 and -25 that is added/subtracted from the player's level for the purposes of deciding which perks can be chosen.
set_fake_trait and set_fake_perk can be used to add additional traits and perks to the character screen. They will be saved correctly when the player saves and reloads games, but by themselves they will have no further effect on the character. For perks, the allowed range for levels is between 0 and 100; setting the level to 0 removes that perk. For traits, the level must be 0 or 1. The image is a numeric id that corresponds to an entry in skilldex.lst. The name is limited to 63 characters and the description to 255 characters by sfall, but internal Fallout limits may be lower. set_fake_trait and set_fake_perk can be used to add additional traits and perks to the character screen. They will be saved correctly when the player saves and reloads games, but by themselves they will have no further effect on the character. For perks, the allowed range for levels is between 0 and 100; setting the level to 0 removes that perk. For traits, the level must be 0 or 1. The image is a numeric id that corresponds to an entry in skilldex.lst. The name is limited to 63 characters and the description to 255 characters by sfall, but internal Fallout limits may be lower.
@@ -56,7 +57,7 @@ get/set_bodypart_hit_modifier alter the hit percentage modifiers for aiming at s
(re)set/get_critical_table are used for modifying the critical table. For details see 'http://falloutmods.wikia.com/wiki/Critical_hit_tables'. Changes are not saved, and will reset to the defaults, (or to the contents of CriticalOverrides.ini, if it exists,) at each game reload. These function also require OverrideCriticalTable to be set to 1 in ddraw.ini. (Disabled by default, because it noticably increases loading times.) (re)set/get_critical_table are used for modifying the critical table. For details see 'http://falloutmods.wikia.com/wiki/Critical_hit_tables'. Changes are not saved, and will reset to the defaults, (or to the contents of CriticalOverrides.ini, if it exists,) at each game reload. These function also require OverrideCriticalTable to be set to 1 in ddraw.ini. (Disabled by default, because it noticably increases loading times.)
get/set_unspent_ap_bonus alter the AC bonus you receive per unused action point at the end of your turn in combat. To allow for fractional values, the value given if divided by 4. (Hence the default value is 4 and not 1.) get/set_unspent_ap_perk_bonus are similar, but effect the extra AC granted by the h2h evade perk. (The default value of this is also 4, equivalent to doubling the original bonus.) get/set_unspent_ap_bonus alter the AC bonus you receive per unused action point at the end of your turn in combat. To allow for fractional values, the value given if divided by 4. (Hence the default value is 4 and not 1.) get/set_unspent_ap_perk_bonus are similar, but affect the extra AC granted by the HtH Evade perk. (The default value of this is also 4, equivalent to doubling the original bonus.)
nb_* functions are reserved for the brotherhood tactical training mod, and should be avoided. nb_* functions are reserved for the brotherhood tactical training mod, and should be avoided.
@@ -67,6 +68,7 @@ get/set_proto_data are used to manipulate the in memory copies of the .pro files
the list_xxx functions can be used to loop over all items on a map. list_begin takes an argument telling sfall what you want to list. (Defined in sfall.h) It returns a list pointer, which you iterate through with list_next. Finally, when you've finished with the list use list_end on it. Not calling list_end will result in a memory leak. Alternatively, use list_as_array to get the whole list at once as a temp array variable, which can be looped over using len_array and which you don't need to remember to free afterwards. the list_xxx functions can be used to loop over all items on a map. list_begin takes an argument telling sfall what you want to list. (Defined in sfall.h) It returns a list pointer, which you iterate through with list_next. Finally, when you've finished with the list use list_end on it. Not calling list_end will result in a memory leak. Alternatively, use list_as_array to get the whole list at once as a temp array variable, which can be looped over using len_array and which you don't need to remember to free afterwards.
play_sfall_sound and stop_sfall_sound are used to play mp3/wav/wma files. The path given is relative to the Fallout folder. Specify mode as 1 to loop the file continuously, 2 to replace the current background game music with playing the specified file in loop mode, or 0 to play the file once. If you don't wish to loop, play_sfall_sound returns 0. If you do loop, it returns an id which can be passed back to stop_sfall_sound when you want to stop the effect. All sounds effects will be stopped on game reload, looping or not. These functions do not require 'AllowDShowSound' to be set to 1 in ddraw.ini. play_sfall_sound and stop_sfall_sound are used to play mp3/wav/wma files. The path given is relative to the Fallout folder. Specify mode as 1 to loop the file continuously, 2 to replace the current background game music with playing the specified file in loop mode, or 0 to play the file once. If you don't wish to loop, play_sfall_sound returns 0. If you do loop, it returns an id which can be passed back to stop_sfall_sound when you want to stop the effect. All sounds effects will be stopped on game reload, looping or not. These functions do not require 'AllowDShowSound' to be set to 1 in ddraw.ini.
Starting from sfall 4.2.8/3.8.28, you can pass a value in the 'mode' argument for a reduced sound volume. To set the volume, You need to convert the number to hexadecimal and use the argument format 0xZZZZ000Y, where ZZZZ is the volume reduction value in range from 0 to 32767 (the value 32767 is mute), and Y is the playback mode.
arrays are created and manipulated with the xxx_array functions. An array must first be created with create_array or temp_array, specifying how many data elements the array can hold. You can store any of ints, floats and strings in an array, and can mix all 3 in a single array. The id returned by create/temp_array can then be used with the other array functions. Arrays are shared between all scripts. (i.e. you can call create_array from one script, and then use the returned id from another script.) They are also saved across savegames. You must remember to free any arrays you create with create_array when you are done with them, or you will leak memory. arrays created with temp_array will be automatically freed at the end of the frame. These functions are safe, in that supplying a bad id or trying to access out of range elements will not crash the script. create_array is the only function that returns a permanent array, all other functions which return arrays (string_split, list_as_array etc,) all return temp arrays. You can use fix_array to make a temp array permanent. arrays are created and manipulated with the xxx_array functions. An array must first be created with create_array or temp_array, specifying how many data elements the array can hold. You can store any of ints, floats and strings in an array, and can mix all 3 in a single array. The id returned by create/temp_array can then be used with the other array functions. Arrays are shared between all scripts. (i.e. you can call create_array from one script, and then use the returned id from another script.) They are also saved across savegames. You must remember to free any arrays you create with create_array when you are done with them, or you will leak memory. arrays created with temp_array will be automatically freed at the end of the frame. These functions are safe, in that supplying a bad id or trying to access out of range elements will not crash the script. create_array is the only function that returns a permanent array, all other functions which return arrays (string_split, list_as_array etc,) all return temp arrays. You can use fix_array to make a temp array permanent.
@@ -339,7 +341,7 @@ Some utility/math functions are available:
- returns first object blocking given tile using given blocking function or 0 if tile is clear - returns first object blocking given tile using given blocking function or 0 if tile is clear
> array tile_get_objs(int tileNum, int elevation) > array tile_get_objs(int tileNum, int elevation)
- returns array of all objects at given tile - returns an array of all objects at given tile
- it will include any hidden, dead or system objects (like cursor), so make sure to check properly when iterating - it will include any hidden, dead or system objects (like cursor), so make sure to check properly when iterating
> array party_member_list(int includeHidden) > array party_member_list(int includeHidden)
@@ -385,8 +387,9 @@ Some utility/math functions are available:
- works just like vanilla critter_inven_obj, but correctly reports item in player's inactive hand slot - works just like vanilla critter_inven_obj, but correctly reports item in player's inactive hand slot
> void sfall_func0("intface_redraw") > void sfall_func0("intface_redraw")
- redraws main game interface > void sfall_func1("intface_redraw", bool eachWin)
- useful after direct changes to current player weapons or stats to reflect changes - redraws main game interface, useful to reflect changes after directly changing current player weapons or stats
- eachWin: pass True to redraw all interface windows
> void sfall_func0("intface_hide") > void sfall_func0("intface_hide")
- hides main interface - hides main interface
@@ -417,8 +420,9 @@ Some utility/math functions are available:
- gets the current outline color for an object - gets the current outline color for an object
> void sfall_func2("set_outline", object, int color) > void sfall_func2("set_outline", object, int color)
- sets the outline color of an object - sets the outline color of an object (see OUTLINE_* constants in sfall.h)
- 0 means or any value above 0x00FFFFFF disables the outline - can also set a custom color from the game palette by shifting the color index value left by 8 bits: 0xCC00 where CC is the palette index (available since sfall 4.2.7/3.8.27)
- passing 0 will disable the outline
- call "tile_refresh_display" after changing outline of objects to properly redraw the scene - call "tile_refresh_display" after changing outline of objects to properly redraw the scene
> int sfall_func1("get_flags", object) > int sfall_func1("get_flags", object)
@@ -435,7 +439,16 @@ Some utility/math functions are available:
- returns an object that is currently highlighted by hovering the mouse above it - returns an object that is currently highlighted by hovering the mouse above it
> void sfall_func0("real_dude_obj") > void sfall_func0("real_dude_obj")
- returns the initial dude_obj after taking control of other critters - returns the initial dude_obj after taking control of other critters in combat
> int sfall_func0("car_gas_amount")
- returns the current amount of fuel in player's car (between 0 and 80000)
- to change fuel amount, use vanilla function: metarule(METARULE_GIVE_CAR_GAS, amount) - amount can be positive or negative
> void sfall_func1("set_car_intface_art", int artIndex)
- changes the interface art (index in intrface.lst) for the car image on the world map interface
- should be called before going to the world map
- vanilla art index is 433
> int sfall_func0("get_cursor_mode") > int sfall_func0("get_cursor_mode")
- returns the current cursor mode (0 - movement cursor, 1 - command cursor, 2 - targeting cursor) - returns the current cursor mode (0 - movement cursor, 1 - command cursor, 2 - targeting cursor)
@@ -445,8 +458,8 @@ Some utility/math functions are available:
- sets the current cursor mode - sets the current cursor mode
> void sfall_func0("display_stats") > void sfall_func0("display_stats")
- displays player stats in the inventory screen display window - updates player's stats in the inventory display window or on the character screen
- works only in opened inventory - NOTE: works only when the interface window is opened
> int sfall_func1("lock_is_jammed", object) > int sfall_func1("lock_is_jammed", object)
- returns 1 if the lock (container or scenery) is currently jammed, 0 otherwise - returns 1 if the lock (container or scenery) is currently jammed, 0 otherwise
@@ -531,15 +544,15 @@ Some utility/math functions are available:
- there is also a unique ID number range for the player and party members from 18000 to 83535 - there is also a unique ID number range for the player and party members from 18000 to 83535
- to assign a new ID number generated by the engine to the object (i.e. unassign a unique ID), call the function with two arguments and pass -1 for the flag argument - to assign a new ID number generated by the engine to the object (i.e. unassign a unique ID), call the function with two arguments and pass -1 for the flag argument
> void sfall_func5("draw_image", string/int pathFile/artId, int frame, int x, int y, bool noTransparent) > void sfall_func5("draw_image", string/int artFile/artId, int frame, int x, int y, bool noTransparent)
> void sfall_func6("draw_image_scaled", string/int pathFile/artId, int frame, int x, int y, int width, int height) > void sfall_func6("draw_image_scaled", string/int artFile/artId, int frame, int x, int y, int width, int height)
- displays the specified PCX or FRM image in the active window created by vanilla CreateWin or sfall's create_win script function - displays the specified PCX or FRM image in the active window created by vanilla CreateWin or sfall's create_win script function
- pathFile/artId: path to the PCX/FRM file (e.g. "art\\inven\\5mmap.frm"), or its FRM ID number (e.g. 117440550, see specification of the FID format) - artFile/artId: path to the PCX/FRM file (e.g. "art\\inven\\5mmap.frm"), or its FRM ID number (e.g. 0x7000026, see specification of the FID format)
optional arguments: optional arguments:
- frame: frame number, the first frame starts from zero - frame: frame number, the first frame starts from zero
- x/y: offset relative to the top-left corner of the window - x/y: offset relative to the top-left corner of the window
- width/height: image size, used to scale the image when displaying it. Pass -1 to either width or height to keep the aspect ratio when scaling - width/height: the new width/height to scale the image to. Pass -1 to either width or height to keep the aspect ratio when scaling
- noTransparent: pass true to display an image without transparent background - noTransparent: pass True to display an image without transparent background
- NOTE: to omit optional arguments starting from the right, call the functions with different sfall_funcX (e.g. sfall_func4("draw_image", pathFile, frame, x, y)) - NOTE: to omit optional arguments starting from the right, call the functions with different sfall_funcX (e.g. sfall_func4("draw_image", pathFile, frame, x, y))
- if draw_image_scaled is called without x/y/width/height arguments, the image will be scaled to fit the window without transparent background - if draw_image_scaled is called without x/y/width/height arguments, the image will be scaled to fit the window without transparent background
@@ -578,7 +591,7 @@ optional arguments:
- displays the specified hidden script window or the one previously hidden with the sfall_func0("hide_window") function - displays the specified hidden script window or the one previously hidden with the sfall_func0("hide_window") function
- winName: the window name, assigned to the window by the CreateWin/create_win function - winName: the window name, assigned to the window by the CreateWin/create_win function
> void sfall_func3("set_window_flag", string/int winName/winID, int flag, bool value) > void sfall_func3("set_window_flag", string winName/int winID, int flag, bool value)
- changes the specified flag for the created script or game interface window - changes the specified flag for the created script or game interface window
- winName: the window name, assigned to the window by the CreateWin/create_win function - winName: the window name, assigned to the window by the CreateWin/create_win function
- winID: the ID number of the interface or script window obtained with the get_window_under_mouse function, or 0 for the current game interface - winID: the ID number of the interface or script window obtained with the get_window_under_mouse function, or 0 for the current game interface
@@ -631,10 +644,50 @@ optional arguments:
> int sfall_func4("message_box", string message, int flags, int color1, int color2) > int sfall_func4("message_box", string message, int flags, int color1, int color2)
- creates a dialog box with text and returns the result of pressing the button: 0 - No (Escape), 1 - Yes/Done (Enter) - creates a dialog box with text and returns the result of pressing the button: 0 - No (Escape), 1 - Yes/Done (Enter)
- returns -1 if for some reason the dialog box cannot be created - returns -1 if for some reason the dialog box cannot be created
- message: the text in the dialog box. Use the \n control character to move text to a new line (example: "Hello\nWorld!") - message: the text in the dialog box. Use the '\n' control character to move text to a new line (example: "Hello\nWorld!")
optional arguments: optional arguments:
- flags: mode flags (see MSGBOX_* constants in define_extra.h). Pass -1 to skip setting the flags (default flags are NORMAL and YESNO) - flags: mode flags (see MSGBOX_* constants in define_extra.h). Pass -1 to skip setting the flags (default flags are NORMAL and YESNO)
- color1/2: the color index in Fallout palette. color1 sets the text color for the first line, and color2 for all subsequent lines of text (default color is 145) - color1/color2: the color index in Fallout palette. color1 sets the text color for the first line, and color2 for all subsequent lines of text (default color is 145)
> int sfall_func1("get_stat_min", int stat)
> int sfall_func1("get_stat_max", int stat)
> int sfall_func2("get_stat_min", int stat, bool who)
> int sfall_func2("get_stat_max", int stat, bool who)
- returns the maximum or minimum set value of the specified stat (see set_stat_max/min functions)
- who: 0 (false) or omitting the argument - returns the value of the player, 1 (true) - returns the value set for other critters
> int sfall_func4("interface_art_draw", int winType, string artFile/int artID, int x, int y)
> int sfall_func5("interface_art_draw", int winType, string artFile/int artID, int x, int y, int frame)
> int sfall_func6("interface_art_draw", int winType, string artFile/int artID, int x, int y, int frame, array param)
- draws the specified PCX or FRM image in the game interface window, returns -1 on any error
- winType: the type number of the interface window (see WINTYPE_* constants in sfall.h)
this also takes the value of the flag (0x1000000) to prevent immediate redrawing of the interface window
- artFile/artId: path to the PCX/FRM file (e.g. "art\\inven\\5mmap.frm"), or its FRM ID number (e.g. 0x7000026, see specification of the FID format)
- x/y: offset relative to the top-left corner of the window
optional arguments:
- frame: frame number, the first frame starts from zero
- param: an array which specifies additional parameters, where:
index 0 - sprite direction for multi-directional FRM
index 1/index 2 - the new width/height to scale the image to. Pass -1 to use the original width/height
> int sfall_func5("interface_print", string text, int winType, int x, int y, int color)
> int sfall_func6("interface_print", string text, int winType, int x, int y, int color, int width)
- displays the text in the specified interface window with the current font. Use vanilla SetFont function to set the font
- returns the count of lines printed, or -1 on any error
- text: the text to be printed. Use the '\n' control character to move text to a new line (example: "Hello\nWorld!")
- winType: the type number of the interface window (see WINTYPE_* constants in sfall.h)
- x/y: offset relative to the top-left corner of the window
- color: the color index in Fallout palette. Pass 0 if the text color was previously set by vanilla SetTextColor function
it can also take additional flags (via bwor) for displaying text:
0x0010000 - adds a shadow to the text, the 'textshadow' compiler constant
0x1000000 - prevents immediate redrawing of the interface window, the 'textdirect' compiler constant (works the other way around)
0x2000000 - fills the background of the text with black color, the 'textnofill' compiler constant (works the other way around)
- width (optional): the maximum width of the text. The text will be wrapped to fit within the specified width
> mixed sfall_func0("combat_data")
- returns a pointer to the C_ATTACK_* data for the current combat attack process (see defined constants in define_extra.h)
- can be used in conjunction with the get_object_data and set_object_data functions
example: sfall_func3("set_object_data", sfall_func0("combat_data"), C_ATTACK_UNUSED, 255);
------------------------ ------------------------
------ MORE INFO ------- ------ MORE INFO -------

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