Compare commits

..
120 Commits
Author SHA1 Message Date
NovaRain 50755832e3 Merge branch 'develop' 2020-10-27 00:57:16 +08:00
NovaRain f04442d4b7 Reverted the change to Message module in the previous commit 2020-10-27 00:11:31 +08:00
NovaRain dcbd6b5a23 Cleaned up define_lite.h and command_lite.h
Commented out the empty exit() in Message module.
Minor code edits.
2020-10-26 11:20:26 +08:00
NovaRain f8aa6c449a Fixed the error handling in win_fill_color
Some code fixes.
2020-10-25 08:05:20 +08:00
NovaRain 65c4cf644a Added "win_fill_color" script function 2020-10-24 12:56:26 +08:00
NovaRain 97fde2950c Added support for drawing PCX images to draw_image, draw_image_scaled, and interface_art_draw
Fixed bug in TalkingHeads.cpp.
2020-10-23 23:23:09 +08:00
NovaRain a488e9fc5b Fixed the macro guard in command_lite.h and added two macros 2020-10-21 22:36:26 +08:00
NovaRain 914c653d69 Merge branch 'develop' 2020-10-18 07:22:34 +08:00
NovaRain 6d412e97fc Minor edits to PartyControl.cpp 2020-10-18 07:16:39 +08:00
NovaRain 1141348efe Added the ability for controlled critters to use Sneak skill in combat 2020-10-15 10:36:11 +08:00
NovaRain 5c9d512d12 Fixed and improved the code in Graphics module 2020-10-15 09:30:04 +08:00
NovaRain d36031613d Added the ability to change the poison level for critters 2020-10-12 20:45:39 +08:00
NovaRain cf277efc85 Corrected code in Arrays.cpp 2020-10-12 11:01:25 +08:00
NovaRain 9a3b770182 Code optimization for array expression 2020-10-11 10:13:52 +08:00
NovaRain fa9aa6dc6f Moved some code from Graphics.cpp to the new submodule GameRender.cpp
Minor edits to MetaruleExtender.cpp and notes.txt.
2020-10-11 01:08:59 +08:00
NovaRain 3d99f6ea66 Code correction in Functions.cpp
Updated global shader example files.
2020-10-09 08:52:14 +08:00
NovaRain a02d90a52e Updated define_extra.h 2020-10-08 15:38:24 +08:00
NovaRain ce5e9cd990 Updated example mod scripts 2020-10-08 15:33:37 +08:00
NovaRain c71ca95665 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.
2020-10-08 13:49:58 +08:00
NovaRain 2f750a8a4b 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:46:13 +08:00
NovaRain ac28d7293b Added "print_text" script function 2020-10-05 14:38:53 +08:00
NovaRain 51dfee26d3 Removed InterfaceDontMoveOnTop from ddraw.ini (always enabled)
Added a fix to prevent toggling the cursor for a Transparent window.
2020-10-05 10:23:17 +08:00
NovaRain cbe6be6c46 Added support for transparent interface windows (#25) 2020-10-03 11:45:25 +08:00
NovaRain 349d217257 Fixed FrmFile struct in the previous commit 2020-09-29 09:02:56 +08:00
NovaRain 4e9d4f2f37 Some code refactoring
Added a value of 2 to TextureFilter option.
2020-09-28 12:04:08 +08:00
NovaRain 5eac185bfe Minor edits to the document in previous commit 2020-09-26 22:14:18 +08:00
NovaRain e696db4b7b Added "interface_art_draw" script function
Added an argument to "intface_redraw" function to redraw all interfaces.
2020-09-26 16:15:32 +08:00
NovaRain 88d9126b18 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.
2020-09-25 00:07:56 +08:00
NovaRain a1d18983e4 Added the ability to get Automap window pointer
Reorganized some code to prepare for later commits.
2020-09-24 15:14:25 +08:00
NovaRain 8179583160 Correction to the hooks code
Minor edits to some code.
2020-09-23 22:37:11 +08:00
NovaRain 876616fc7d 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 15:43:26 +08:00
NovaRain 008692bec7 Fixed the MMX buf_to_buf_ for warning C4799
Minor edits to ASM code of some hooks.
2020-09-21 21:30:08 +08:00
NovaRain 0dd8ea5335 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 12:54:42 +08:00
NovaRain bf9deabded Added TextureFilter option (restored from sfall 2.x) 2020-09-20 09:58:55 +08:00
NovaRain 11bcbe2013 Moved some engine function defines from Functions.cpp to Functions_def.h
Implemented a new "buf_to_buf" function (experimental)
* need to check the backward compatibility.
2020-09-19 10:02:16 +08:00
NovaRain 806e09e501 Corrected talking heads code of Use32BitHeadGraphics
Minor code correction.
2020-09-19 00:37:16 +08:00
NovaRain 2eb1c64bc3 Removed KeepWeaponSelectMode from ddraw.ini (always enabled)
Minor edits to code and documents.
2020-09-16 10:53:39 +08:00
NovaRain a9cde5757f 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:33:57 +08:00
NovaRain f16ba16d21 Graphics: improved the performance of DX9 mode 2020-09-15 10:21:35 +08:00
NovaRain 0ce02e2a12 Graphics & Movies refactoring (WIP/unfinished) 2020-09-13 22:10:44 +08:00
NovaRain 96447ca1d3 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:43:46 +08:00
NovaRain a7355ad937 Added the original Fallout 1 behavior to FastShotFix (#335) 2020-09-06 08:30:20 +08:00
NovaRain 2badb5fdd2 Added a fix to the weapon check in the Fast Shot trait (#335)
* 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:39:22 +08:00
NovaRain 282a491718 Fixed typo in sfall.h (#334) 2020-09-03 21:05:18 +08:00
NovaRain 43fcaf41e1 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:20:23 +08:00
NovaRain 3df322b80e 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:38 +08:00
NovaRain 0945382369 Added support for ACM audio file playback to soundplay script function
(with volume control, #331)

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:10:45 +08:00
NovaRain 69ccc1cfab Merge branch 'develop' 2020-08-22 13:15:50 +08:00
NovaRain ac4e4c7868 Minor edits to Interface.cpp and ddraw.ini 2020-08-22 10:48:46 +08:00
NovaRain d46bb42efd Reorganized hooks related code 2020-08-21 12:55:18 +08:00
NovaRain aa132d9951 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:36:41 +08:00
NovaRain dfb7779e87 Reorganized the code related to the core functions of hooks
Added DeathScreenFontPatch option to use the normal font for death
screen subtitles (was using bitmap font).

Attempted to fix the melee damage display for some extreme cases when
BonusHtHDamageFix=1 and DisplayBonusDamage=0.
2020-08-20 13:32:40 +08:00
NovaRain 19df2f9eec Updated global.fx and withinperception example script
Fixed some code.
2020-08-19 15:19:11 +08:00
NovaRain e6d30d7def 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.
2020-08-18 13:07:25 +08:00
NovaRain c657a9ef86 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 method to SafeWrite.cpp and devlog_f to Logging.cpp.
2020-08-17 15:07:41 +08:00
NovaRain cbccc7de4e Fixed the use of #pragma pack() directives for structures
Corrected HookFile struct in the previous commit.
2020-08-16 11:09:31 +08:00
NovaRain 8fa54d8255 Changed hs_* hook script to be searched only once on game start
* in the same fashion as global scripts, affected by AlwaysFindScripts.
2020-08-15 22:19:45 +08:00
NovaRain 46a5616b34 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:23:08 +08:00
NovaRain ff4757d529 Fixed the playback of additional movies defined in the MovieXX options (#330)
Added the keyboard buffer cleanup function to metarule3.
2020-08-13 15:20:30 +08:00
NovaRain b0a35eec49 Added the city name in the description of a save slot by default
Corrected some code.
2020-08-13 14:38:09 +08:00
NovaRain d553e9cbdd 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:17:32 +08:00
NovaRain d2b1cdec46 Changed the behavior of ObjCanSeeObj_ShootThru_Fix
* now the critter can only see through objects in front of it.
2020-08-08 11:50:12 +08:00
NovaRain 37b4a18770 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.

Corrected some code.
2020-08-05 16:10:28 +08:00
NovaRain fd1067373a 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)
2020-08-03 14:28:01 +08:00
NovaRain 82b75f4ea2 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 (#295)
2020-08-02 19:43:51 +08:00
NovaRain 435180d157 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:22:30 +08:00
NovaRain 694d97e123 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:35:58 +08:00
NovaRain a27f020edc Added support for delayed speech playback to AllowDShowSound
(for synchronizing with subtitles when playing endgame slideshow)
2020-07-30 10:29:06 +08:00
NovaRain da5484668c 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)
2020-07-29 14:16:45 +08:00
NovaRain 600360638e Added volume control support for avi movies
Fixed implementation bugs when playing avi movies.
Added a couple of engine variable defines.
2020-07-28 15:21:47 +08:00
NovaRain 19be167c19 Further implementation of speech playback for alternative sound files 2020-07-26 08:46:16 +08:00
NovaRain deaaf6a137 Added a function extension for vanilla metarule3 function
Added SET_HORRIGAN_ENCOUNTER function to metarule3.
Updated German translation.
2020-07-24 21:20:48 +08:00
NovaRain 29da941582 WIP: Fixed sfx/speech playback for alternative sound files 2020-07-22 12:24:20 +08:00
NovaRain b178e15b31 Implemented CodeType enums in some SafeWrite8
Replaced some SafeWriteX with SafeWriteBatch.
Minor edits to documents.
2020-07-21 12:28:15 +08:00
NovaRain 2491cb22af Removed some redundant code 2020-07-19 08:38:48 +08:00
NovaRain 85afa1e4d8 Fixed the default values for the MovieXX options
Added some comments to elevators.ini & other codes.
Updated version number.
2020-07-18 22:13:54 +08:00
NovaRain 64da4dce6c Uploaded language translation files to repo
Updated German (#326) and Russian translations.
2020-07-08 09:55:30 +08:00
NovaRain e10b7ca718 Merge branch 'develop' 2020-07-03 21:37:11 +08:00
NovaRain 586d41cce8 Minor edit to ddraw.ini 2020-07-03 21:36:51 +08:00
NovaRain 30d249f02e 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:47:02 +08:00
NovaRain 467d895ba6 Removed AutoSearchPath from ddraw.ini
* the folder path for auto-loading custom files is now constant.
2020-06-30 22:02:21 +08:00
NovaRain bfaed2eb68 Fixed ASM error in the previous commit 2020-06-30 15:49:32 +08:00
NovaRain a43a28fe8b Fixed broken PlayIdleAnimOnReload option (#320)
(in commit af049ea)

Improved the fix for incorrect positioning after exiting small/medium
locations.
2020-06-30 12:26:56 +08:00
NovaRain 5dd8c441b9 Fixed the code for "display_stats" script function
Minor edit to Perks.cpp.
2020-06-29 23:02:45 +08:00
NovaRain 440cfbd72c Added a fix to prevent showing an empty perk selection window 2020-06-29 12:47:57 +08:00
NovaRain 1db8988368 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:53:12 +08:00
NovaRain 6ecc1fcd1f Corrected the code for multihex retargeting tile
Small optimization to sfall function code.
2020-06-28 23:11:51 +08:00
NovaRain 6c8bbea764 Re-fix for the previous commit 2020-06-28 09:51:29 +08:00
NovaRain d947150dc1 Corrected the fix from the previous commit 2020-06-27 10:12:34 +08:00
NovaRain f5ecaa8bd2 Fixed the hang/freeze in combat (from commit d888161)
Added a fix for retargeting tile for multihex critters.
2020-06-27 09:46:43 +08:00
NovaRain e389bb0dc5 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:25:57 +08:00
NovaRain 94296b40d8 Moved static addresses into respective funcs in Stats.cpp 2020-06-13 00:24:13 +08:00
NovaRain fab5aa2f2f Fixed Auto Doors example script mod
Cosmetic changes to the text descriptions in Perks.ini.
2020-06-13 00:14:44 +08:00
NovaRain 703073e255 Increased the max width of the player name on the char screen (#305)
Updated version number.
2020-06-04 06:38:48 +08:00
NovaRain d888161128 Some bug fixes regarding multihex critters in shoot blocking 2020-05-24 11:30:32 +08:00
NovaRain ea921aabbd Merge branch 'develop' 2020-05-21 09:42:23 +08:00
NovaRain b263b69fa3 Renamed all script opcode handlers with op_ prefix
Renamed all metarule functions with mf_ prefix.
2020-05-20 11:30:25 +08:00
NovaRain 6bb56b0f95 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:48:46 +08:00
NovaRain 9a4f0c7505 Merge branch 'develop' 2020-05-11 09:35:28 +08:00
NovaRain c89a18522d Fixed ai_move_away_ engine function
Some minor fixes.
2020-05-10 09:56:11 +08:00
NovaRain c7ccb7f2c2 Edited the msg for SkipLoadingGameSettings a bit
Added a few more defines.
2020-05-08 10:44:37 +08:00
NovaRain b25ca683f3 Cosmetic changes to the code:
Use double underscore for stdcall and "asm" keyword.
2020-05-07 12:27:53 +08:00
NovaRain e28b3a5796 Minor code edits to Combat.cpp
Added some function defines.
2020-05-07 12:13:28 +08:00
NovaRain a9c74501df Added checking AP cost to ai_pick_hit_mode_ engine function 2020-05-07 09:47:57 +08:00
NovaRain b03b93d6fc 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:13:11 +08:00
NovaRain 1f696b9f12 Added internal implementation of engine functions with hooks:
* item_w_mp_cost_ with CALCAPCOST
* is_within_perception_ with WITHINPERCEPTION
2020-05-01 10:27:05 +08:00
NovaRain 3d2d1cdf2a Added combat rating check to "Snipe" distance preference fix 2020-05-01 08:00:49 +08:00
NovaRain 42347ac062 Added a fix to reduce friendly fire in burst attacks (experimental) 2020-04-30 16:01:57 +08:00
NovaRain 007b415740 Changed the priority of files in AutoSearchPath
* now they have higher priority than the PatchFileXX options.

Minor code edits/fixes.
2020-04-30 10:13:44 +08:00
NovaRain 35d2491bcb 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:55:56 +08:00
NovaRain ece76ee726 Changed the fix for AI target selection in commit f731de7
* NPCs will reload the weapon in the same turn (and attack if have
enough AP left) if weapon is empty while selecting targets.

Misc code edits.
2020-04-27 14:25:40 +08:00
NovaRain d6f4a23527 Fixed AllowDShowSound=2 not working
Limited NumSoundBuffers to the max of 32.
Fixed replacing Body_Torso with Body_Uncalled (from commit 7e31713)
Corrected the code in the previous commit.
2020-04-23 12:33:00 +08:00
NovaRain 045ad2f5d7 Added a tweak to the miss message in combat
* if the main target has Flat flag set, remove the message about hitting
another object.

Minor code edits to DebugEditor.cpp & MiscPatches.cpp.
2020-04-22 11:32:03 +08:00
NovaRain 13703f1a3b 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:54:35 +08:00
NovaRain 58bb77d79f Fixed GvarID option behavior in Drugs.ini
Reverted incorrect code change of SpeedPatch.cpp in previous commit.
Some code edits to Explosions.cpp and Perks.cpp.
2020-04-19 09:58:47 +08:00
NovaRain 229371e4ab 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.
* Changed for-loop with iterators to use pre-increment.
2020-04-18 21:19:22 +08:00
NovaRain 1884e279c7 Fixed ReloadWeaponKey for using any non-weapon item (#84) 2020-04-18 10:44:17 +08:00
NovaRain e81d79e43e Fixed "loot_obj" script function 2020-04-18 08:57:02 +08:00
NovaRain f731de7a25 Fixed AI target selection for no ammo or target out of range cases 2020-04-18 08:33:08 +08:00
NovaRain 0d6bc33279 Re-fixed automatically ending combat
Updated version number.
2020-04-18 07:28:00 +08:00
168 changed files with 7695 additions and 4628 deletions
+9 -2
View File
@@ -13,18 +13,25 @@ Count=0
[1] [1]
; drug item PID ; drug item PID
PID=0 PID=0
; set a limit on the count of first and second delayed effects when using the drug, i.e. if the queue has delayed effects from the drug, ; set a limit on the count of first and second delayed effects when using the drug, i.e. if the queue has delayed effects from the drug,
; and their count is greater or equal to NumEffects, it is not possible to obtain new effects from using the drug ; and their count is greater or equal to NumEffects, it is not possible to obtain new effects from using the drug
; this count is 4 for Buffout/Mentats/Psycho/Jet ; e.g. this count is 4 for Buffout/Mentats/Psycho/Jet
; set -1 to leave this parameter unchanged ; set -1 to leave this parameter unchanged
NumEffects=-1 NumEffects=-1
; the duration of the addiction effect in game minutes (i.e. 1440 = 24 game hours) ; the duration of the addiction effect in game minutes (i.e. 1440 = 24 game hours)
; set to 0 to use the default time (7 days for all drugs except Jet) ; set to 0 to use the default time of 7 days (as all drugs except Jet)
AddictTime=0 AddictTime=0
; the number of the global variable from vault13.gam responsible for displaying addiction in the character screen ; the number of the global variable from vault13.gam responsible for displaying addiction in the character screen
; if you set GvarID with numbers: 21-26, 295, 296, or variable numbers that have already been declared in previous sections,
; the TextID and FrmID options in this section will be ignored
; set to 0 if the addiction is not required ; set to 0 if the addiction is not required
GvarID=0 GvarID=0
; the index number from editor.msg to display the title of the addiction (the description uses the index number of TextID + 100) ; the index number from editor.msg to display the title of the addiction (the description uses the index number of TextID + 100)
TextID=-1 TextID=-1
; the line number (0-indexed) of the corresponding FRM in skilldex.lst ; the line number (0-indexed) of the corresponding FRM in skilldex.lst
FrmID=-1 FrmID=-1
+28 -35
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,41 +30,35 @@ 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)
;You can add simple extra perks with ID numbers from 119 to 255 ;You can add simple extra perks with ID numbers from 119 to 255
; that do not require using scripting functions to change player stats, and can also be used for Armor perks ; that do not require using scripting functions to change player stats, and can also be used for Armor perks
;These parameters are only for extra perks ;These parameters are only for extra perks
;Stat1-Stat2 = same as Stat ;Stat1/Stat2: same as Stat
;Stat1Mag-Stat2Mag = same as StatMag ;Stat1Mag/Stat2Mag: same as StatMag
;Skill3-Skill5 = The skill to be modified (or -1 for none) ;Skill3-Skill5: The skill to be modified (or -1 for none)
;Skill3Mod-Skill5Mod = The increased/decreased value to the modified skill ;Skill3Mod-Skill5Mod: The increased/decreased value to the modified skill
;############################################################################## ;##############################################################################
;This is a modification to vanilla perk 0 ;This is a modification to vanilla perk 0
+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)
+1
View File
@@ -21,6 +21,7 @@ CheckLOS=0
; 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 4.2.7)
OutlineColor=16 OutlineColor=16
; Motion Scanner mode: ; Motion Scanner mode:
+48 -40
View File
@@ -1,5 +1,5 @@
;sfall configuration settings ;sfall configuration settings
;v4.2.4 ;v4.2.8
[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.
@@ -18,10 +18,10 @@ UseCommandLine=0
;The greater numbers take precedence over lesser numbers ;The greater numbers take precedence over lesser numbers
;PatchFile0=mods\RP_data ;PatchFile0=mods\RP_data
;Path to the folder in which the game will automatically search and load custom .dat files ;Path to the folder in which the game will automatically search and load custom files (by *.dat mask, including folders)
;The data load order of the .dat files in the folder will be in reverse alphabetical order of the filenames ;The data load order of the files in the folder will be in reverse alphabetical order of the filenames
;The .dat files specified in the PatchFileXX options will have higher priority than others ;The files placed in this folder will have higher priority than the PatchFileXX options
;Uncomment the option to specify a different folder path. The default path is <GameRoot>\mods\ ;This option has no effect in v4.2.6 or later. The default path is <GameRoot>\mods\
;AutoSearchPath=mods ;AutoSearchPath=mods
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
@@ -44,7 +44,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
@@ -69,8 +69,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
@@ -84,7 +90,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
@@ -121,20 +128,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]
@@ -193,7 +200,7 @@ SpeedKey9=0x00
;Set to -1 for either ctrl key, -2 for either alt key or -3 for either shift key ;Set to -1 for either ctrl key, -2 for either alt key or -3 for either shift key
WindowScrollKey=0 WindowScrollKey=0
;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
@@ -284,7 +291,8 @@ DialogGenderWords=0
;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
@@ -340,7 +348,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.
@@ -361,7 +369,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
@@ -369,9 +377,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
@@ -404,14 +412,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
@@ -532,10 +540,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
@@ -554,8 +563,10 @@ CritterInvSizeLimit=100
;2 - Motion sensor doesn't require charges ;2 - Motion sensor doesn't require charges
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
@@ -574,8 +585,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
@@ -585,11 +596,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
@@ -696,8 +706,9 @@ 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 keep the selected attack mode when moving the weapon between active item slots ;Set to 1 to use Fallout's normal text font for death screen subtitles
KeepWeaponSelectMode=1 ;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
@@ -715,13 +726,10 @@ PartyMemberExtraInfo=0
;that overrides First Aid/Doctor functions has very limited usefulness ;that overrides First Aid/Doctor functions has very limited usefulness
PartyMemberSkillFix=0 PartyMemberSkillFix=0
;Set to 1 to skip loading all game settings except the game/combat difficulty from a saved game ;Set to 1 to skip loading all game settings except the game/combat difficulty from saved games
;Set to 2 to also skip loading the game/combat difficulty settings ;Set to 2 to also skip loading the game/combat difficulty settings
SkipLoadingGameSettings=0 SkipLoadingGameSettings=0
;Set to 1 to prevent the inventory/loot/automap interfaces from being placed on top of other script-created windows
InterfaceDontMoveOnTop=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
SpecialDeathGVAR=491 SpecialDeathGVAR=491
@@ -831,7 +839,7 @@ DontDeleteProtos=0
;Set to 1 to force sfall to inject all hooks code into the game, even if corresponding hook scripts don't exist ;Set to 1 to force sfall to inject all hooks code into the game, even if corresponding hook scripts don't exist
InjectAllGameHooks=0 InjectAllGameHooks=0
;Set to 1 to force sfall to search for global scripts every time the game loads rather than only once on the first game start ;Set to 1 to force sfall to search for global/hook scripts every time the game loads rather than only the first time
AlwaysFindScripts=0 AlwaysFindScripts=0
;Set to 1 to force critters to display combat float messages ;Set to 1 to force critters to display combat float messages
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
+44 -148
View File
@@ -1,13 +1,9 @@
/*
Copyright 1998-2003 Interplay Entertainment Corp. All rights reserved.
*/
#ifndef COMMAND_H #ifndef COMMAND_H
#define COMMAND_H #define COMMAND_H
#define critter_is_armed(x) (((obj_item_subtype(critter_inven_obj(x,INVEN_TYPE_RIGHT_HAND))) == item_type_weapon) orElse \
#define critter_is_armed(x) (((obj_item_subtype(critter_inven_obj(x,INVEN_TYPE_RIGHT_HAND))) == item_type_weapon) or \
((obj_item_subtype(critter_inven_obj(x,INVEN_TYPE_LEFT_HAND))) == item_type_weapon)) ((obj_item_subtype(critter_inven_obj(x,INVEN_TYPE_LEFT_HAND))) == item_type_weapon))
#define critter_weight(x) (100 + ((get_critter_stat(x,STAT_gender) == GENDER_MALE) * 50) + (get_critter_stat(x,STAT_st) * 5) - ((get_critter_stat(x,STAT_ag) + get_critter_stat(x,STAT_en))/3)) #define critter_weight(x) (100 + ((get_critter_stat(x,STAT_gender) == GENDER_MALE) * 50) + (get_critter_stat(x,STAT_st) * 5) - ((get_critter_stat(x,STAT_ag) + get_critter_stat(x,STAT_en))/3))
#define critter_wearing_armor(x) (obj_item_subtype(critter_inven_obj(x,INVEN_TYPE_WORN)) == item_type_armor) #define critter_wearing_armor(x) (obj_item_subtype(critter_inven_obj(x,INVEN_TYPE_WORN)) == item_type_armor)
@@ -21,13 +17,13 @@
#define dude_iq (get_critter_stat(dude_obj,STAT_iq)) #define dude_iq (get_critter_stat(dude_obj,STAT_iq))
#define dude_agility (get_critter_stat(dude_obj,STAT_ag)) #define dude_agility (get_critter_stat(dude_obj,STAT_ag))
#define dude_luck (get_critter_stat(dude_obj,STAT_lu)) #define dude_luck (get_critter_stat(dude_obj,STAT_lu))
#ifndef dude_level
#define dude_level (get_pc_stat(PCSTAT_level)) #define dude_level (get_pc_stat(PCSTAT_level))
#endif
#define dude_age (get_critter_stat(dude_obj,STAT_age)) #define dude_age (get_critter_stat(dude_obj,STAT_age))
#define dude_weight critter_weight(dude_obj) #define dude_weight critter_weight(dude_obj)
#define dude_cur_carry who_carry_amount(dude_obj)
#define dude_max_carry who_max_carry(dude_obj)
#define dude_moron_not_vegetable (((get_critter_stat(dude_obj,STAT_iq)) > 1) and ((get_critter_stat(dude_obj,STAT_iq)) < 3) ) #define dude_moron_not_vegetable (((get_critter_stat(dude_obj,STAT_iq)) > 1) andAlso ((get_critter_stat(dude_obj,STAT_iq)) < 3) )
#define dude_is_male (dude_gender == GENDER_MALE) #define dude_is_male (dude_gender == GENDER_MALE)
#define dude_is_female (dude_gender == GENDER_FEMALE) #define dude_is_female (dude_gender == GENDER_FEMALE)
@@ -39,43 +35,50 @@
(obj_is_carrying_obj_pid(dude_obj, PID_ADVANCED_POWER_ARMOR_MK2)) + \ (obj_is_carrying_obj_pid(dude_obj, PID_ADVANCED_POWER_ARMOR_MK2)) + \
(obj_is_carrying_obj_pid(dude_obj, PID_HARDENED_POWER_ARMOR))) > 0) (obj_is_carrying_obj_pid(dude_obj, PID_HARDENED_POWER_ARMOR))) > 0)
#define dude_wielding_knife ((obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_RIGHT_HAND)) == PID_KNIFE) or \ #define dude_wielding_knife ((obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_RIGHT_HAND)) == PID_KNIFE) orElse \
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_RIGHT_HAND)) == PID_THROWING_KNIFE) or \ (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_RIGHT_HAND)) == PID_THROWING_KNIFE) orElse \
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_RIGHT_HAND)) == PID_RIPPER) or \ (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_RIGHT_HAND)) == PID_RIPPER) orElse \
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_RIGHT_HAND)) == PID_COMBAT_KNIFE) or \ (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_RIGHT_HAND)) == PID_COMBAT_KNIFE) orElse \
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_LEFT_HAND)) == PID_KNIFE) or \ (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_RIGHT_HAND)) == PID_SWITCHBLADE) orElse \
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_LEFT_HAND)) == PID_THROWING_KNIFE) or \ (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_RIGHT_HAND)) == PID_SHIV) orElse \
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_LEFT_HAND)) == PID_RIPPER) or \ (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_RIGHT_HAND)) == PID_LIL_JESUS_WEAPON) orElse \
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_LEFT_HAND)) == PID_COMBAT_KNIFE)) (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_RIGHT_HAND)) == PID_WAKIZASHI_BLADE) orElse \
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_LEFT_HAND)) == PID_KNIFE) orElse \
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_LEFT_HAND)) == PID_THROWING_KNIFE) orElse \
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_LEFT_HAND)) == PID_RIPPER) orElse \
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_LEFT_HAND)) == PID_COMBAT_KNIFE) orElse \
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_LEFT_HAND)) == PID_SWITCHBLADE) orElse \
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_LEFT_HAND)) == PID_SHIV) orElse \
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_LEFT_HAND)) == PID_LIL_JESUS_WEAPON) orElse \
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_LEFT_HAND)) == PID_WAKIZASHI_BLADE))
#define dude_wearing_power_armor ((obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_POWERED_ARMOR) or \ #define dude_wearing_power_armor ((obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_POWERED_ARMOR) orElse \
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_ADVANCED_POWER_ARMOR) or \ (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_ADVANCED_POWER_ARMOR) orElse \
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_ADVANCED_POWER_ARMOR_MK2) or \ (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_ADVANCED_POWER_ARMOR_MK2) orElse \
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_HARDENED_POWER_ARMOR)) (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_HARDENED_POWER_ARMOR))
#define dude_wearing_leather_armor ((obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_LEATHER_ARMOR) or \ #define dude_wearing_leather_armor ((obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_LEATHER_ARMOR) orElse \
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_LEATHER_JACKET) or \ (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_LEATHER_JACKET) orElse \
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_LEATHER_ARMOR_MK_II) or \ (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_LEATHER_ARMOR_MK_II) orElse \
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_CURED_LEATHER_ARMOR)) (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_CURED_LEATHER_ARMOR))
#define dude_wearing_combat_armor ((obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_COMBAT_ARMOR) or \ #define dude_wearing_combat_armor ((obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_COMBAT_ARMOR) orElse \
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_BROTHERHOOD_COMBAT_ARMOR) or \ (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_BROTHERHOOD_COMBAT_ARMOR) orElse \
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_COMBAT_ARMOR_MK_II)) (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_COMBAT_ARMOR_MK_II))
#define dude_wearing_metal_armor ((obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_METAL_ARMOR) or \ #define dude_wearing_metal_armor ((obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_METAL_ARMOR) orElse \
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_METAL_ARMOR_MK_II)) (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_METAL_ARMOR_MK_II))
#define dude_wearing_vault_suit COND019(1) #define dude_has_gambling_skills ((dude_iq > 3) andAlso (has_skill(dude_obj, SKILL_GAMBLING) >= 25))
#define dude_has_gambling_skills ((dude_iq > 3) and (has_skill(dude_obj, SKILL_GAMBLING) >= 25))
#define dude_is_sneaking (using_skill(dude_obj,SKILL_SNEAK)) #define dude_is_sneaking (using_skill(dude_obj,SKILL_SNEAK))
#define dude_is_walking (art_anim(obj_art_fid(dude_obj)) == ANIM_walk) #define dude_is_walking (art_anim(obj_art_fid(dude_obj)) == ANIM_walk)
#define dude_is_running (art_anim(obj_art_fid(dude_obj)) == ANIM_running) #define dude_is_running (art_anim(obj_art_fid(dude_obj)) == ANIM_running)
#define dude_is_poisoned (get_poison(dude_obj)) #define dude_is_poisoned (get_poison(dude_obj))
#define dude_is_irradiated (get_critter_stat(dude_obj, STAT_current_rad)) #define dude_is_irradiated (get_critter_stat(dude_obj, STAT_current_rad))
#define dude_is_crippled ((critter_state(dude_obj) bwand DAM_CRIP_LEG_LEFT) or \ #define dude_is_crippled ((critter_state(dude_obj) bwand DAM_CRIP_LEG_LEFT) orElse \
(critter_state(dude_obj) bwand DAM_CRIP_LEG_RIGHT) or \ (critter_state(dude_obj) bwand DAM_CRIP_LEG_RIGHT) orElse \
(critter_state(dude_obj) bwand DAM_CRIP_ARM_LEFT) or \ (critter_state(dude_obj) bwand DAM_CRIP_ARM_LEFT) orElse \
(critter_state(dude_obj) bwand DAM_CRIP_ARM_RIGHT)) (critter_state(dude_obj) bwand DAM_CRIP_ARM_RIGHT))
#define dude_cur_rot (has_trait(TRAIT_OBJECT,dude_obj,OBJECT_CUR_ROT)) #define dude_cur_rot (has_trait(TRAIT_OBJECT,dude_obj,OBJECT_CUR_ROT))
@@ -99,8 +102,6 @@
#define dude_has_car (global_var(GVAR_PLAYER_GOT_CAR)) #define dude_has_car (global_var(GVAR_PLAYER_GOT_CAR))
#define dude_is_pornstar dude_has_porn_star_rep #define dude_is_pornstar dude_has_porn_star_rep
#define dude_is_high drug_influence(dude_obj) #define dude_is_high drug_influence(dude_obj)
#define dude_found_geck global_var(GVAR_VAULT13_FOUND_GECK)
#define dude_stat_win(X,Y) ((do_check(dude_obj,X,Y)) > (do_check(self_obj,X,0))) #define dude_stat_win(X,Y) ((do_check(dude_obj,X,Y)) > (do_check(self_obj,X,0)))
#define dude_stat_lose(X,Y) ((do_check(dude_obj,X,Y)) < (do_check(self_obj,X,0))) #define dude_stat_lose(X,Y) ((do_check(dude_obj,X,Y)) < (do_check(self_obj,X,0)))
@@ -112,7 +113,6 @@
#define dude_is_addict (has_trait(TRAIT_TRAIT, dude_obj, TRAIT_drug_addict)) #define dude_is_addict (has_trait(TRAIT_TRAIT, dude_obj, TRAIT_drug_addict))
#define self_name (obj_name(self_obj)) #define self_name (obj_name(self_obj))
#define self_gender (get_critter_stat(self_obj,STAT_gender)) #define self_gender (get_critter_stat(self_obj,STAT_gender))
#define self_strength (get_critter_stat(self_obj,STAT_st)) #define self_strength (get_critter_stat(self_obj,STAT_st))
@@ -128,7 +128,7 @@
#define self_is_armed critter_is_armed(self_obj) #define self_is_armed critter_is_armed(self_obj)
#define self_wearing_armor critter_wearing_armor(self_obj) #define self_wearing_armor critter_wearing_armor(self_obj)
#define self_carrying_laser_pistol ((obj_pid(critter_inven_obj(self_obj,INVEN_TYPE_LEFT_HAND)) == PID_LASER_PISTOL) or \ #define self_carrying_laser_pistol ((obj_pid(critter_inven_obj(self_obj,INVEN_TYPE_LEFT_HAND)) == PID_LASER_PISTOL) orElse \
(obj_pid(critter_inven_obj(self_obj,INVEN_TYPE_RIGHT_HAND)) == PID_LASER_PISTOL)) (obj_pid(critter_inven_obj(self_obj,INVEN_TYPE_RIGHT_HAND)) == PID_LASER_PISTOL))
#define self_is_sneaking (using_skill(self_obj,SKILL_SNEAK)) #define self_is_sneaking (using_skill(self_obj,SKILL_SNEAK))
@@ -169,23 +169,24 @@
// some timer event macros // some timer event macros
#define check_set_obj_visiblility(the_obj, x) if (obj_is_visible_flag(the_obj) == x) then set_obj_visibility(the_obj, x) #define check_set_obj_visiblility(the_obj, x) if (obj_is_visible_flag(the_obj) == x) then set_obj_visibility(the_obj, x)
#define flush_add_timer_event(obj, time, param) rm_fixed_timer_event(obj, param); \ #define flush_add_timer_event(obj, time, param) rm_fixed_timer_event(obj, param); \
add_timer_event(obj, time, param) add_timer_event(obj, time, param)
#define flush_add_timer_event_sec(obj, sec, param) flush_add_timer_event(obj, game_ticks(sec), param) #define flush_add_timer_event_sec(obj, sec, param) flush_add_timer_event(obj, game_ticks(sec), param)
/****************************************************************** /******************************************************************
General commands getting information about time General commands getting information about time
******************************************************************/ ******************************************************************/
#define morning ((game_time_hour >= 600) and (game_time_hour < 700)) #define morning ((game_time_hour >= 600) andAlso (game_time_hour < 700))
#ifndef day #ifndef day
#define day ((game_time_hour >= 700) and (game_time_hour < 1800)) #define day ((game_time_hour >= 700) andAlso (game_time_hour < 1800))
#endif #endif
#define evening ((game_time_hour >= 1800) and (game_time_hour < 1900)) #define evening ((game_time_hour >= 1800) andAlso (game_time_hour < 1900))
#ifndef night #ifndef night
#define night ((game_time_hour >= 1900) or (game_time_hour < 600)) #define night ((game_time_hour >= 1900) orElse (game_time_hour < 600))
#endif #endif
#define GAME_TIME_SUBSECOND_RESOLUTION (10) #define GAME_TIME_SUBSECOND_RESOLUTION (10)
@@ -200,7 +201,6 @@
#define GAME_TIME_IN_MINUTES (game_time / (GAME_TIME_SUBSECOND_RESOLUTION * SECONDS_PER_MINUTE)) #define GAME_TIME_IN_MINUTES (game_time / (GAME_TIME_SUBSECOND_RESOLUTION * SECONDS_PER_MINUTE))
#define GAME_TIME_IN_SECONDS (game_time / GAME_TIME_SUBSECOND_RESOLUTION) #define GAME_TIME_IN_SECONDS (game_time / GAME_TIME_SUBSECOND_RESOLUTION)
#define ticks_til_hour(x) ((ONE_GAME_DAY * (game_time_hour > (x))) + ((((x)/100) - (game_time_hour/100)) * ONE_GAME_HOUR) + ((((x)%100) - (game_time_hour%100)) * ONE_GAME_MINUTE)) #define ticks_til_hour(x) ((ONE_GAME_DAY * (game_time_hour > (x))) + ((((x)/100) - (game_time_hour/100)) * ONE_GAME_HOUR) + ((((x)%100) - (game_time_hour%100)) * ONE_GAME_MINUTE))
#define game_time_advance_hour(x) game_time_advance(ticks_til_hour(x)) #define game_time_advance_hour(x) game_time_advance(ticks_til_hour(x))
@@ -219,9 +219,7 @@
/*************************************************************** /***************************************************************
**************** Dialogue Information *********************** **************** Dialogue Information ***********************
***************************************************************/ ***************************************************************/
#ifndef floater #define floater(x) float_msg(self_obj, message_str(NAME,x), FLOAT_COLOR_NORMAL)
#define floater(x) float_msg(self_obj, message_str(NAME,x), FLOAT_COLOR_NORMAL)
#endif
#define floater_rand(x,y) floater(random(x,y)) #define floater_rand(x,y) floater(random(x,y))
#define dude_floater(x) float_msg(dude_obj, message_str(NAME,x), FLOAT_COLOR_NORMAL) #define dude_floater(x) float_msg(dude_obj, message_str(NAME,x), FLOAT_COLOR_NORMAL)
@@ -229,7 +227,6 @@
#define dude_floater_bad(x) float_msg(dude_obj, message_str(NAME,x), FLOAT_COLOR_BAD) #define dude_floater_bad(x) float_msg(dude_obj, message_str(NAME,x), FLOAT_COLOR_BAD)
#define dude_floater_sick(x) float_msg(dude_obj, message_str(NAME,x), FLOAT_COLOR_SICK) #define dude_floater_sick(x) float_msg(dude_obj, message_str(NAME,x), FLOAT_COLOR_SICK)
#define FLOAT_COLOR_NORMAL FLOAT_MSG_YELLOW #define FLOAT_COLOR_NORMAL FLOAT_MSG_YELLOW
#define FLOAT_COLOR_SICK FLOAT_MSG_GREEN #define FLOAT_COLOR_SICK FLOAT_MSG_GREEN
#define FLOAT_COLOR_BAD FLOAT_MSG_RED #define FLOAT_COLOR_BAD FLOAT_MSG_RED
@@ -335,9 +332,7 @@
******************************************************************/ ******************************************************************/
#define critter_is_male (get_critter_stat(self_obj,STAT_gender) == GENDER_MALE) #define critter_is_male (get_critter_stat(self_obj,STAT_gender) == GENDER_MALE)
#define critter_is_female (get_critter_stat(self_obj,STAT_gender) == GENDER_FEMALE) #define critter_is_female (get_critter_stat(self_obj,STAT_gender) == GENDER_FEMALE)
/*#define critter_is_armed (((obj_item_subtype(critter_inven_obj(self_obj,INVEN_TYPE_RIGHT_HAND))) == item_type_weapon) \
or ((obj_item_subtype(critter_inven_obj(self_obj,INVEN_TYPE_LEFT_HAND))) == item_type_weapon))
*/
/****************************************************************** /******************************************************************
General commands setting and getting the map exit General commands setting and getting the map exit
******************************************************************/ ******************************************************************/
@@ -385,59 +380,12 @@
#define status_is_warned(status_var) (status_is(status_var, PERSON_WARNED)) #define status_is_warned(status_var) (status_is(status_var, PERSON_WARNED))
#define status_is_sex(status_var) (status_is(status_var, PERSON_SEX)) #define status_is_sex(status_var) (status_is(status_var, PERSON_SEX))
#define status_is_alive(status_var) (not (status_is_killed(status_var) or status_is_assassinated(status_var) or status_is_dead(status_var))) #define status_is_alive(status_var) (not (status_is_killed(status_var) orElse status_is_assassinated(status_var) orElse status_is_dead(status_var)))
/****************************************************************** /******************************************************************
General commands getting information about cities General commands getting information about cities
******************************************************************/ ******************************************************************/
#define abbey_visible_on_map (town_known(AREA_ABBEY) != MARK_STATE_UNKNOWN)
#define arroyo_visible_on_map (town_known(AREA_ARROYO) != MARK_STATE_UNKNOWN)
#define broken_hills_visible_on_map (town_known(AREA_BROKEN_HILLS) != MARK_STATE_UNKNOWN)
#define colusa_visible_on_map (town_known(AREA_NAVARRO) != MARK_STATE_UNKNOWN)
#define den_visible_on_map (town_known(AREA_DEN) != MARK_STATE_UNKNOWN)
#define enclave_visible_on_map (town_known(AREA_THE_ENCLAVE) != MARK_STATE_UNKNOWN)
#define EPA_visible_on_map (town_known(AREA_EPA) != MARK_STATE_UNKNOWN)
#define gecko_visible_on_map (town_known(AREA_GECKO) != MARK_STATE_UNKNOWN)
#define klamath_visible_on_map (town_known(AREA_KLAMATH) != MARK_STATE_UNKNOWN)
#define military_base_visible_on_map (town_known(AREA_MILITARY_BASE) != MARK_STATE_UNKNOWN)
#define modoc_visible_on_map (town_known(AREA_MODOC) != MARK_STATE_UNKNOWN)
#define new_CA_republic_visible_on_map (town_known(AREA_NCR) != MARK_STATE_UNKNOWN)
#define primitive_tribe_visible_on_map (town_known(AREA_PRIMITIVE_TRIBE) != MARK_STATE_UNKNOWN)
#define redding_visible_on_map (town_known(AREA_REDDING) != MARK_STATE_UNKNOWN)
#define new_reno_visible_on_map (town_known(AREA_NEW_RENO) != MARK_STATE_UNKNOWN)
#define san_francisco_visible_on_map (town_known(AREA_SAN_FRANCISCO) != MARK_STATE_UNKNOWN)
#define sierra_army_base_visible_on_map (town_known(AREA_SIERRA_ARMY_BASE) != MARK_STATE_UNKNOWN)
#define vault_13_visible_on_map (town_known(AREA_VAULT_13) != MARK_STATE_UNKNOWN)
#define vault_15_visible_on_map (town_known(AREA_VAULT_15) != MARK_STATE_UNKNOWN)
#define vault_city_visible_on_map (town_known(AREA_VAULT_CITY) != MARK_STATE_UNKNOWN)
#define vault_fake_13A_visible_on_map (town_known(AREA_FAKE_VAULT_13A) != MARK_STATE_UNKNOWN)
#define vault_fake_13B_visible_on_map (town_known(AREA_FAKE_VAULT_13B) != MARK_STATE_UNKNOWN)
#define abbey_visit (town_known(AREA_ABBEY) == MARK_STATE_VISITED)
#define arroyo_visit (town_known(AREA_ARROYO) == MARK_STATE_VISITED)
#define broken_hills_visit (town_known(AREA_BROKEN_HILLS) == MARK_STATE_VISITED)
#define colusa_visit (town_known(AREA_NAVARRO) == MARK_STATE_VISITED)
#define den_visit (town_known(AREA_DEN) == MARK_STATE_VISITED)
#define enclave_visit (town_known(AREA_THE_ENCLAVE) == MARK_STATE_VISITED)
#define EPA_visit (town_known(AREA_EPA) == MARK_STATE_VISITED)
#define gecko_visit (town_known(AREA_GECKO) == MARK_STATE_VISITED)
#define klamath_visit (town_known(AREA_KLAMATH) == MARK_STATE_VISITED)
#define military_base_visit (town_known(AREA_MILITARY_BASE) == MARK_STATE_VISITED)
#define modoc_visit (town_known(AREA_MODOC) == MARK_STATE_VISITED)
#define new_CA_republic_visit (town_known(AREA_NCR) == MARK_STATE_VISITED)
#define primitive_tribe_visit (town_known(AREA_PRIMITIVE_TRIBE) == MARK_STATE_VISITED)
#define redding_visit (town_known(AREA_REDDING) == MARK_STATE_VISITED)
#define new_reno_visit (town_known(AREA_NEW_RENO) == MARK_STATE_VISITED)
#define san_francisco_visit (town_known(AREA_SAN_FRANCISCO) == MARK_STATE_VISITED)
#define sierra_army_base_visit (town_known(AREA_SIERRA_ARMY_BASE) == MARK_STATE_VISITED)
#define vault_13_visit (town_known(AREA_VAULT_13) == MARK_STATE_VISITED)
#define vault_15_visit (town_known(AREA_VAULT_15) == MARK_STATE_VISITED)
#define vault_city_visit (town_known(AREA_VAULT_CITY) == MARK_STATE_VISITED)
#define arroyo_destroyed_visit (town_known(AREA_ARROYO_DESTROYED) == MARK_STATE_VISITED)
#define vault_fake_13A_visit (town_known(AREA_FAKE_VAULT_13A) == MARK_STATE_VISITED)
#define vault_fake_13B_visit (town_known(AREA_FAKE_VAULT_13B) == MARK_STATE_VISITED)
#define mark_on_map(x) if (town_known(x) == MARK_STATE_UNKNOWN) then begin \ #define mark_on_map(x) if (town_known(x) == MARK_STATE_UNKNOWN) then begin \
debug_msg(" mark_on_map("+x+")"); \ debug_msg(" mark_on_map("+x+")"); \
mark_area_known(MARK_TYPE_TOWN, x, MARK_STATE_KNOWN); \ mark_area_known(MARK_TYPE_TOWN, x, MARK_STATE_KNOWN); \
@@ -448,63 +396,11 @@
mark_area_known(MARK_TYPE_TOWN, x, MARK_STATE_UNKNOWN); \ mark_area_known(MARK_TYPE_TOWN, x, MARK_STATE_UNKNOWN); \
end end
#define mark_abbey_on_map mark_on_map(AREA_ABBEY)
#define mark_arroyo_on_map mark_on_map(AREA_ARROYO)
#define mark_broken_hills_on_map mark_on_map(AREA_BROKEN_HILLS)
#define mark_colusa_on_map mark_on_map(AREA_NAVARRO)
#define mark_navarro_on_map mark_on_map(AREA_NAVARRO)
#define mark_den_on_map mark_on_map(AREA_DEN)
#define mark_enclave_on_map mark_on_map(AREA_THE_ENCLAVE)
#define mark_EPA_on_map mark_on_map(AREA_EPA)
#define mark_gecko_on_map mark_on_map(AREA_GECKO)
#define mark_klamath_on_map mark_on_map(AREA_KLAMATH)
#define mark_military_base_on_map mark_on_map(AREA_MILITARY_BASE)
#define mark_modoc_on_map mark_on_map(AREA_MODOC)
#define mark_new_CA_republic_on_map mark_on_map(AREA_NCR)
#define mark_primitive_tribe_on_map mark_on_map(AREA_PRIMITIVE_TRIBE)
#define mark_redding_on_map mark_on_map(AREA_REDDING)
#define mark_new_reno_on_map mark_on_map(AREA_NEW_RENO)
#define mark_san_francisco_on_map mark_on_map(AREA_SAN_FRANCISCO)
#define mark_sierra_army_base_on_map mark_on_map(AREA_SIERRA_ARMY_BASE)
#define mark_vault_13_on_map mark_on_map(AREA_VAULT_13)
#define mark_vault_15_on_map mark_on_map(AREA_VAULT_15)
#define mark_vault_city_on_map mark_on_map(AREA_VAULT_CITY)
#define mark_vault_fake_13A_on_map mark_on_map(AREA_FAKE_VAULT_13A)
#define mark_vault_fake_13B_on_map mark_on_map(AREA_FAKE_VAULT_13B)
#define unmark_vault_fake_13A_on_map unmark_on_map(AREA_FAKE_VAULT_13A)
/******************************************************************************************************************* /*******************************************************************************************************************
********** These represent the players acomplishments through the game ********************************************* ********** These represent the players acomplishments through the game *********************************************
********** Note: these reflect the Fallout2 variable designers put in the scripts assuming we were ***************** ********** Note: these reflect the Fallout2 variable designers put in the scripts assuming we were *****************
********** going to have a magic variable to keep track of the player stats throught the game ********************** ********** going to have a magic variable to keep track of the player stats throught the game **********************
*******************************************************************************************************************/ *******************************************************************************************************************/
#define f2_state_v13_looking (0)
#define f2_state_v13_known (1) // set -Chris H
#define f2_state_v13_found (2) // set -Chris H
#define f2_state_v13_entered (3) // set -Chris H
#define f2_state_tribe_kidnapped (4) // ### state not set
#define f2_state_fix_tanker (5) // didn't need to exist
#define f2_state_tanker_fix_known (6) // set -Chris H
#define f2_state_tanker_fixed (7) // set -Chris H
#define f2_state_enclave_destroyed (8) // ### state not set
#define set_f2(x) if (global_var(GVAR_FALLOUT_2) < x) then set_global_var(GVAR_FALLOUT_2, x)
#define force_f2(x) set_global_var(GVAR_FALLOUT_2, x)
#define get_f2(x) (global_var(GVAR_FALLOUT_2) == x)
#define f2_flag_any (global_var(GVAR_FALLOUT_2))
#define Fallout2_vault13_looking get_f2(f2_state_v13_looking)
#define Fallout2_vault13_location_known get_f2(f2_state_v13_known)
#define Fallout2_vault13_found get_f2(f2_state_v13_found)
#define Fallout2_vault13_entered get_f2(f2_state_v13_entered)
#define Fallout2_tribe_kidnapped get_f2(f2_state_tribe_kidnapped)
#define Fallout2_fix_tanker get_f2(f2_state_fix_tanker)
#define Fallout2_tanker_known get_f2(f2_state_tanker_fix_known)
#define Fallout2_tanker_fixed get_f2(f2_state_tanker_fixed)
#define Fallout2_enclave_destroyed get_f2(f2_state_enclave_destroyed)
// Info relating to carry weight, how much something costs, and weights // Info relating to carry weight, how much something costs, and weights
#define pid_weight(x) proto_data(x,it_weight) #define pid_weight(x) proto_data(x,it_weight)
+24 -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)
@@ -414,9 +418,11 @@
#define C_ATTACK_SOURCE (0x00) #define C_ATTACK_SOURCE (0x00)
#define C_ATTACK_HIT_MODE (0x04) #define C_ATTACK_HIT_MODE (0x04)
#define C_ATTACK_WEAPON (0x08) #define C_ATTACK_WEAPON (0x08)
#define C_ATTACK_UNUSED (0x0C)
#define C_ATTACK_DAMAGE_SOURCE (0x10) // Amount #define C_ATTACK_DAMAGE_SOURCE (0x10) // Amount
#define C_ATTACK_FLAGS_SOURCE (0x14) // see DAM_* values in define.h #define C_ATTACK_FLAGS_SOURCE (0x14) // see DAM_* values in define.h
#define C_ATTACK_ROUNDS (0x18) #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_TARGET (0x20)
#define C_ATTACK_BODY_PART (0x28) #define C_ATTACK_BODY_PART (0x28)
#define C_ATTACK_DAMAGE_TARGET (0x2C) // Amount #define C_ATTACK_DAMAGE_TARGET (0x2C) // Amount
@@ -455,4 +461,19 @@
#define C_ATTACK_KNOCKBACK_VALUE5 (0xB0) #define C_ATTACK_KNOCKBACK_VALUE5 (0xB0)
#define C_ATTACK_KNOCKBACK_VALUE6 (0xB4) #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

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