mirror of
https://github.com/sfall-team/sfall.git
synced 2026-07-27 16:52:34 -07:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
061a3925e6 | ||
|
|
c6fa6bac30 | ||
|
|
0988004245 | ||
|
|
e59af7e88a | ||
|
|
7cf1b60b38 | ||
|
|
a8919367ea | ||
|
|
0a44f7118a | ||
|
|
cda56aca7d | ||
|
|
761124aaf4 | ||
|
|
8e6a961fba | ||
|
|
cca0fe0cb6 | ||
|
|
180761c489 | ||
|
|
540b68070b | ||
|
|
466b79f5e8 | ||
|
|
b1f847afbc | ||
|
|
31fbddb612 | ||
|
|
0c547da134 | ||
|
|
cc5561d3d6 | ||
|
|
66ff811bcd | ||
|
|
27963fd064 | ||
|
|
dc88193ff6 | ||
|
|
2c36ad9a2a | ||
|
|
9d34a4c70a | ||
|
|
548039d5bc | ||
|
|
49c4bb2479 | ||
|
|
75b275159f | ||
|
|
52f42af913 | ||
|
|
b195a8ab02 | ||
|
|
796e834a9d | ||
|
|
df4e847c59 | ||
|
|
0a48ed3048 | ||
|
|
7414c8a361 | ||
|
|
90a9ee5f15 | ||
|
|
314100f231 | ||
|
|
9c92e2f487 | ||
|
|
2d3a4d6c34 | ||
|
|
a936f35c80 | ||
|
|
3479bc6893 | ||
|
|
ff1aac40f5 | ||
|
|
6142d95a60 | ||
|
|
c4fc3d2c8b | ||
|
|
40cca2452d | ||
|
|
33a5c7428a | ||
|
|
55e935e18c | ||
|
|
398ad650b9 | ||
|
|
9c7f34ffb2 | ||
|
|
6a2a7ee82f | ||
|
|
849ae49bfb | ||
|
|
ed9c6c7508 | ||
|
|
57f4deb5cf | ||
|
|
c6da5169b8 | ||
|
|
72f3abe3c9 | ||
|
|
5d12d815dd | ||
|
|
502a5764a5 | ||
|
|
13976a5278 | ||
|
|
a35487d0aa | ||
|
|
f1102afbc3 | ||
|
|
4071a65f73 | ||
|
|
8d813a952e | ||
|
|
c1b7e729a8 | ||
|
|
12070f5e3d | ||
|
|
63b2025468 | ||
|
|
44ad268aed | ||
|
|
2305128adc | ||
|
|
112c931ea3 | ||
|
|
8e3ae04aec | ||
|
|
89ec203483 | ||
|
|
21cbcb4a03 | ||
|
|
76c9d63d3e | ||
|
|
962e7f0056 | ||
|
|
950b9949c0 | ||
|
|
648bffedc6 | ||
|
|
058cc0bb96 | ||
|
|
9e79b01a27 | ||
|
|
37e3ccb410 | ||
|
|
82db339ff9 | ||
|
|
74d3cb9707 | ||
|
|
e0f0ee0f7d | ||
|
|
107335749f | ||
|
|
c66add00e7 | ||
|
|
d4d8b3a06c | ||
|
|
fcd3bd05f0 | ||
|
|
ae6a6e80d3 | ||
|
|
c0557ddbc1 | ||
|
|
46dd02b566 | ||
|
|
4c3f255915 | ||
|
|
de01fdf065 | ||
|
|
1e6d2229dd | ||
|
|
317c4d4c05 | ||
|
|
31b244e5f3 | ||
|
|
066280a7ca | ||
|
|
535595a997 | ||
|
|
41b15b8838 | ||
|
|
2cd79c1033 | ||
|
|
cc9807344a | ||
|
|
6c31cc43a0 | ||
|
|
b345140fba | ||
|
|
3acf051b49 | ||
|
|
0137504f3f | ||
|
|
ebcd505561 | ||
|
|
24cb02b7d8 | ||
|
|
48ce358451 | ||
|
|
c293a826bc | ||
|
|
0da7c7b266 | ||
|
|
d74df7fc78 | ||
|
|
df816bcd47 | ||
|
|
068988caad | ||
|
|
24c9499021 | ||
|
|
7f3de8d19a | ||
|
|
87f7fe4a54 | ||
|
|
01ba18100e | ||
|
|
8b26573073 | ||
|
|
1839790dfb | ||
|
|
cb1d5d359f | ||
|
|
b781e117a2 | ||
|
|
a7d9716b68 | ||
|
|
cdd2bfe338 | ||
|
|
7decec4a2c | ||
|
|
e3af4f5754 | ||
|
|
1b61bca702 | ||
|
|
f0f00a77ea | ||
|
|
58d41487fd | ||
|
|
73ccba22bf | ||
|
|
1f8b3636f3 | ||
|
|
b7e80d445e | ||
|
|
e404684f58 | ||
|
|
4c78ba595c | ||
|
|
1f1d6eb6f0 | ||
|
|
9935553bce | ||
|
|
cd4d3b5b2f | ||
|
|
a61ff5b626 | ||
|
|
bc2e8e4362 | ||
|
|
136404a723 | ||
|
|
1a17ac5ac8 | ||
|
|
07543dd29d | ||
|
|
4243bead5d | ||
|
|
f80e933889 | ||
|
|
7cbde234c6 | ||
|
|
f6ae7c5f2c | ||
|
|
58060a8c5f | ||
|
|
22140e2a0c | ||
|
|
1c6f8cc255 | ||
|
|
e479609581 | ||
|
|
ab11c0422a | ||
|
|
09752c98a4 | ||
|
|
aab04764ae | ||
|
|
0ba3b62eff | ||
|
|
0c0d1dd73e | ||
|
|
0fd45aa37a | ||
|
|
00a6e4f0f9 | ||
|
|
36ef55ddd0 | ||
|
|
db2435416d | ||
|
|
0120e46782 | ||
|
|
eddefd6bd5 | ||
|
|
f9cbab3d55 | ||
|
|
e3168946ba | ||
|
|
8bb660ff11 | ||
|
|
8a7d9cbd78 | ||
|
|
008fdb12b7 |
@@ -1,10 +1,9 @@
|
||||
;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
|
||||
; in this file, as some perks have hardcoded effects which may
|
||||
; catch you out
|
||||
;Since traits need to be picked before any scripts run, they
|
||||
; have an additional NoHardcode option in this file which can
|
||||
|
||||
;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 catch you out
|
||||
|
||||
;Since traits need to be picked before any scripts run, they have an additional NoHardcode option in this file which can
|
||||
; be used to remove their hardcoded effects, and add new stat/skill effects
|
||||
|
||||
[PerksTweak]
|
||||
@@ -31,31 +30,25 @@ WeaponHandlingBonus=3
|
||||
;Set to 1 to enable the modifications for perks
|
||||
Enable=0
|
||||
|
||||
;Name=The name of the perk (max 63 characters)
|
||||
;Desc=The description of the perk (max 255 characters)
|
||||
;Image=The line number (0-indexed) of the corresponding FRM in skilldex.lst
|
||||
;Ranks=The number of perk levels
|
||||
;Level=The minimum required level
|
||||
;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
|
||||
;Stat=The modified stat or -1 if you don't want to change any stats
|
||||
;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
|
||||
; (67108864 or 0x4000000), it checks GVAR. For example, if Skill1=67108864, then
|
||||
; the perk will check GVAR_PLAYER_REPUTATION (67108864 + 0) on Skill1Mag value
|
||||
;Skill1Mag=Positive value is used as the minimum requirements of the first
|
||||
; 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
|
||||
; selection window; with Skill1=1 and Skill1Mag=-120, the perk will not be
|
||||
; available if player has big guns skill >= 120
|
||||
;Skill2=The second skill/GVAR (or -1 for none) to check
|
||||
;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
|
||||
;Name: The name of the perk (max 63 characters)
|
||||
;Desc: The description of the perk (max 255 characters)
|
||||
;Image: The line number (0-indexed) of the corresponding FRM in skilldex.lst
|
||||
;Ranks: The number of perk levels
|
||||
;Level: The minimum required level
|
||||
;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
|
||||
;Stat: The modified stat or -1 if you don't want to change any stats
|
||||
;StatMag: The increased/decreased value to the modified stat
|
||||
|
||||
;Skill1/Skill2: The first/second skill (or -1 for none) to check, but if you set a specific bit 0x4000000 (67108864), it checks GVAR.
|
||||
; For example, if Skill1=0x4000004, then the perk will check GVAR_BAD_MONSTER (0x4000000 + 4) on Skill1Mag value
|
||||
|
||||
;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.
|
||||
; 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
|
||||
; selection window; with Skill1=1 and Skill1Mag=-120, the perk will not be available if player has big guns skill >= 120
|
||||
|
||||
;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)
|
||||
|
||||
@@ -63,7 +56,7 @@ Enable=0
|
||||
;This is a modification to perk 119
|
||||
[119]
|
||||
Name=Example
|
||||
Desc=This is an example perk~Second line
|
||||
Desc=This is an example perk description
|
||||
Image=72
|
||||
Ranks=1
|
||||
Level=1
|
||||
|
||||
@@ -40,7 +40,7 @@ Image=24
|
||||
ButtonCount=3
|
||||
|
||||
;Set the appearance of the elevator
|
||||
MainFrm=148
|
||||
ButtonsFrm=151
|
||||
MainFrm=148 ; EL_VAULT.FRM
|
||||
ButtonsFrm=151 ; EL_MIL3.FRM
|
||||
|
||||
;Set up the exit points for all three buttons (see examples above)
|
||||
|
||||
+101
-63
@@ -1,5 +1,5 @@
|
||||
;sfall configuration settings
|
||||
;v3.8.23
|
||||
;v3.8.28.1
|
||||
|
||||
[Main]
|
||||
;Change to 1 if you want to use command line args to tell sfall to use another ini file.
|
||||
@@ -8,24 +8,6 @@ UseCommandLine=0
|
||||
;Uncomment and point to a file to get alternate translations for some sfall messages
|
||||
;TranslationsINI=sfall\Translations.ini
|
||||
|
||||
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
||||
[Sound]
|
||||
;Sets the number of allowed simultaneous sound effects
|
||||
;Set to 0 to leave the default unchanged (i.e. 4)
|
||||
NumSoundBuffers=0
|
||||
|
||||
;Set to 1 to allow attaching sound files to combat float messages
|
||||
AllowSoundForFloats=0
|
||||
|
||||
;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
|
||||
;This does not effect the play_sfall_sound and stop_sfall_sound script functions
|
||||
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 2 to overwrite all occurances of the music path
|
||||
OverrideMusicDir=2
|
||||
|
||||
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
||||
[Speed]
|
||||
;Set to 0 to disable everything in this section
|
||||
@@ -46,7 +28,7 @@ SpeedMulti9=900
|
||||
;The initial speed at game startup
|
||||
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
|
||||
|
||||
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
||||
@@ -54,6 +36,7 @@ AffectPlayback=0
|
||||
;Set to 0 for 8 bit fullscreen
|
||||
;Set to 4 for DX9 fullscreen
|
||||
;Set to 5 for DX9 windowed
|
||||
;Set to 6 for DX9 fullscreen windowed (the resolution in f2_res.ini should be set to the same aspect ratio as your desktop resolution)
|
||||
;A DX9 mode is required for any graphics related script extender functions to work (i.e. fullscreen shaders)
|
||||
;Modes 1, 2 and 3 are no longer supported
|
||||
Mode=0
|
||||
@@ -64,10 +47,20 @@ Mode=0
|
||||
GraphicsWidth=0
|
||||
GraphicsHeight=0
|
||||
|
||||
;Uncomment the option to use a hardware shader (requires DX9 graphics mode 4 or 5)
|
||||
;Window position data. Do not modify
|
||||
;Set to 0 to reset if the window position is incorrect
|
||||
WindowData=0
|
||||
|
||||
;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
|
||||
;You can specify multiple shader files, separated by commas
|
||||
;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 2 to do the palette conversion on the CPU
|
||||
;Set to 0 to pick automatically
|
||||
@@ -81,8 +74,9 @@ GPUBlt=0
|
||||
;Requires DX9 graphics mode and v2.0 pixel shader support (see GPUBlt option)
|
||||
Use32BitHeadGraphics=0
|
||||
|
||||
;Set to 1 to automatically search for alternative avi video files when Fallout tries to play the game movies
|
||||
;Requires DX9 graphics mode 4 or 5
|
||||
;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
|
||||
AllowDShowMovies=0
|
||||
|
||||
;Fade effect time percentage modifier
|
||||
@@ -103,6 +97,24 @@ WorldMapTravelMarkers=0
|
||||
;Set to 1 to display terrain types when hovering the cursor over the player's marker on the world map
|
||||
WorldMapTerrainInfo=0
|
||||
|
||||
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
||||
[Sound]
|
||||
;Sets the number of allowed simultaneous sound effects
|
||||
;Set to 0 to leave the default unchanged (i.e. 4). The maximum is 32
|
||||
NumSoundBuffers=0
|
||||
|
||||
;Set to 1 to allow attaching sound files to combat float messages
|
||||
AllowSoundForFloats=0
|
||||
|
||||
;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
|
||||
;This does not effect the play_sfall_sound and stop_sfall_sound script functions
|
||||
AllowDShowSound=0
|
||||
|
||||
;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 occurrences of the music path
|
||||
OverrideMusicDir=1
|
||||
|
||||
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
||||
[Input]
|
||||
;Set to 1 to enable the mouse scroll wheel to scroll through the inventory, barter, and loot screens
|
||||
@@ -155,7 +167,7 @@ SpeedKey7=0x00
|
||||
SpeedKey8=0x00
|
||||
SpeedKey9=0x00
|
||||
|
||||
;A key to hold down to move the window around when using graphics mode 5
|
||||
;A key to hold down to move the window around when using DX9 graphics mode 5
|
||||
;Set to 0 if you don't want to use a modifier key, or a DX scancode otherwise
|
||||
;Set to -1 for either ctrl key, -2 for either alt key or -3 for either shift key
|
||||
WindowScrollKey=0
|
||||
@@ -178,9 +190,10 @@ HighlightCorpses=1
|
||||
;16 - bright yellow
|
||||
;32 - dark yellow
|
||||
;64 - purple
|
||||
;You can set a custom color from the game palette by multiplying the color index value by 256 (available since sfall 3.8.27)
|
||||
OutlineColor=16
|
||||
|
||||
;A key to press to reload your currently equipped weapon
|
||||
;A key to press to reload your currently equipped weapon or use the active item
|
||||
;Set to 0 if you don't want a reload key, or a DX scancode otherwise
|
||||
ReloadWeaponKey=0
|
||||
|
||||
@@ -262,7 +275,8 @@ DataLoadOrderPatch=1
|
||||
;FemaleDefaultModel=hfjmps
|
||||
|
||||
;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
|
||||
Movie2=intro.mve
|
||||
Movie3=elder.mve
|
||||
@@ -315,7 +329,10 @@ DamageFormula=0
|
||||
;Prevents you from using 0 to escape from dialogue at any time.
|
||||
DialogueFix=1
|
||||
|
||||
;Set to 1 to disable the horrigan encounter
|
||||
;Prevents you from using number keys to enter unvisited areas on a town map
|
||||
TownMapHotkeysFix=1
|
||||
|
||||
;Set to 1 to disable the Horrigan encounter
|
||||
DisableHorrigan=0
|
||||
|
||||
;Set to 1 to disable the random element in NPC levelling.
|
||||
@@ -336,7 +353,7 @@ SingleCore=1
|
||||
OverrideArtCacheSize=0
|
||||
|
||||
;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
|
||||
SaveInCombatFix=1
|
||||
|
||||
@@ -344,9 +361,9 @@ SaveInCombatFix=1
|
||||
;Player's level is capped once the highest specified level is reached
|
||||
;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
|
||||
;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
|
||||
|
||||
;Uncomment these lines to modify the default modifiers for aimed shots at specific bodyparts
|
||||
@@ -379,14 +396,14 @@ AlwaysReloadMsgs=0
|
||||
PlayIdleAnimOnReload=0
|
||||
|
||||
;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
|
||||
CorpseDeleteTime=6
|
||||
|
||||
;Set a number of milliseconds to idle each input loop
|
||||
;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 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
|
||||
|
||||
;Set to 1 if using the hero appearance mod
|
||||
@@ -507,10 +524,11 @@ RemoveCriticalTimelimits=0
|
||||
;Change the colour of the font used on the main menu for the button text
|
||||
;MainMenuBigFontColour=0x3C
|
||||
|
||||
;Two alternate fixes to the interaction between HtH attacks and the fast shot trait
|
||||
;0 - Fallout 2 original behaviour
|
||||
;1 - Haenlomal's fix, called shots are enabled for HtH attacks
|
||||
;2 - Restoring the -1 AP bonus for HtH attacks (i.e. Fallout 1 behaviour)
|
||||
;Alternative behaviors to the Fast Shot trait
|
||||
;0 - Fallout 2 original behavior: -1 AP cost for ranged weapons; aimed attacks are disabled
|
||||
;1 - Haenlomal's fix: aimed attacks are enabled for melee/unarmed weapons and HtH attacks
|
||||
;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
|
||||
|
||||
;Set to 1 to boost the maximum number of script names from 1450 to 10000
|
||||
@@ -520,7 +538,7 @@ BoostScriptDialogLimit=0
|
||||
;Set the mode to 0 to disable the size check, 1 to apply to the PC only, 2 to apply to the PC and party members, or 3 to apply to all critters
|
||||
;Only the PC uses CritterInvSizeLimit. Other critters will use the unused stat (STAT_unused = 10) or have the size limit of 100 if the stat is not set
|
||||
;Add 4 to the mode to limit the weight check to used items only
|
||||
;You can use line number 542/543 in proto.msg and line number 35 in inventry.msg to set up custom messages for item size
|
||||
;You can use message number 542/543 in proto.msg and message number 35 in inventry.msg to set up custom messages for item size
|
||||
CritterInvSizeLimitMode=0
|
||||
CritterInvSizeLimit=100
|
||||
|
||||
@@ -530,8 +548,10 @@ CritterInvSizeLimit=100
|
||||
;4 - Motion sensor is required to use the item highlight feature
|
||||
MotionScannerFlags=1
|
||||
|
||||
;Set to non-0 to adjust the maximum encounter table size
|
||||
;Default is 40, and the maximum is 127
|
||||
;Set a value greater than 40 to change the maximum encounter table size (enc_## in worldmap.txt)
|
||||
;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
|
||||
|
||||
;Set to 1 to disable the pipboy alarm button
|
||||
@@ -550,8 +570,8 @@ SuperStimExploitFix=0
|
||||
InventoryApCost=4
|
||||
QuickPocketsApCostReduction=2
|
||||
|
||||
;Set to 1 to allow objects seeing through other objects that have their ShootThru flag set
|
||||
;Note that enabling this option can cause unexpected NPC behavior in some situations
|
||||
;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 cases, e.g. initiating combat or dialogue when the player is behind certain obstacles
|
||||
ObjCanSeeObj_ShootThru_Fix=0
|
||||
|
||||
;Set to 1 to fix the broken obj_can_hear_obj script function
|
||||
@@ -561,11 +581,10 @@ ObjCanHearObjFix=0
|
||||
;If the argument value is -1, the mood will be determined by the local variable 0 of the script (vanilla behavior)
|
||||
StartGDialogFix=0
|
||||
|
||||
;Set to 1 to fix and repurpose the unused called_shot/num_attacks arguments of attack_complex script function
|
||||
;This also changes the behavior of the result flags arguments
|
||||
;called_shot - additional damage, when the damage received by the target is above the specified minimum damage
|
||||
;Set to 1 to fix attacker_results/target_results arguments and repurpose the unused called_shot/num_attacks arguments of attack_complex script function
|
||||
;New behavior of the arguments:
|
||||
;called_shot - additional damage when hitting the target
|
||||
;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
|
||||
|
||||
;Set to 1 to fix the issue with the division operator treating negative integers as unsigned
|
||||
@@ -646,6 +665,13 @@ DontTurnOffSneakIfYouRun=0
|
||||
;Set to 0 to disable switching. (Default is 3)
|
||||
UseWalkDistance=3
|
||||
|
||||
;Changes the displayed message when you recover from the negative effects of radiation exposure
|
||||
;The value is the message number in misc.msg (Default is 3003: 'You feel better')
|
||||
RadEffectsRemovalMsg=3003
|
||||
|
||||
;Set to 1 to display messages about radiation for the active geiger counter
|
||||
ActiveGeigerMsgs=1
|
||||
|
||||
;Set to 1 to fix the bug of being unable to sell used geiger counters or stealth boys
|
||||
CanSellUsedGeiger=1
|
||||
|
||||
@@ -661,6 +687,9 @@ CarPlacedTileFix=1
|
||||
InstantWeaponEquip=0
|
||||
|
||||
;To add additional game msg files, uncomment the next line and set a comma delimited list of filenames without .msg extension
|
||||
;By default, the files will have consecutive numbers assigned beginning with 0
|
||||
;You can use the syntax 'filename:number' to manually assign numbers to specific msg files, with each pair separated by a comma
|
||||
;If a file after the specified pair does not have a number assigned, it will have the next consecutive number from the last pair
|
||||
;You need to use the message_str_game script function to get messages from the files
|
||||
;ExtraGameMsgFileList=
|
||||
|
||||
@@ -670,6 +699,10 @@ NumbersInDialogue=0
|
||||
;Set to 1 to use Fallout's normal text font instead of DOS-like font on the world map
|
||||
WorldMapFontPatch=0
|
||||
|
||||
;Set to 1 to use Fallout's normal text font for death screen subtitles
|
||||
;Requires changing the color of subtitles in death.pal palette to white color (index 220) to display the text correctly
|
||||
DeathScreenFontPatch=0
|
||||
|
||||
;Set to 1 to display full item description for weapon/ammo in the barter screen
|
||||
FullItemDescInBarter=0
|
||||
|
||||
@@ -679,8 +712,9 @@ DisplaySwiftLearnerExp=1
|
||||
;Set to 1 to display party member's current level/AC/addict flag on the combat control panel
|
||||
PartyMemberExtraInfo=0
|
||||
|
||||
;Set to 1 to prevent the inventory/loot/automap interfaces from being placed on top of other script-created windows
|
||||
InterfaceDontMoveOnTop=0
|
||||
;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
|
||||
SkipLoadingGameSettings=0
|
||||
|
||||
;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
|
||||
@@ -730,10 +764,27 @@ CreditsAtBottom=0
|
||||
;Set to 1 to enable sfall debugging mode
|
||||
Enable=0
|
||||
|
||||
;Set to 1 to give scripts direct access to Fallout's address space, and to make arbitrary calls into Fallout's code
|
||||
;Set to 2 to also disable the memory address check in unsafe script functions
|
||||
;Does not require sfall debugging mode
|
||||
AllowUnsafeScripting=0
|
||||
|
||||
;If you're testing changes to the Fallout exe, you can override the CRC that sfall looks for here
|
||||
;You can use several hex values, separated by commas
|
||||
;Does not require sfall debugging mode
|
||||
;ExtraCRC=0x00000000,0x00000000
|
||||
|
||||
;Set to 1 to skip the executable file size check
|
||||
;Does not require sfall debugging mode
|
||||
SkipSizeCheck=0
|
||||
|
||||
;Change to 1 to skip the compatibility mode check
|
||||
SkipCompatModeCheck=0
|
||||
|
||||
;Fallout 2 Debug Patch
|
||||
;Set to 1 to send debug output to the screen, 2 to a debug.log file, or 3 to both the screen and debug.log
|
||||
;Does not require sfall debugging mode
|
||||
;While you don't need to create an environment variable, you do still need to set the appropriate lines in fallout2.cfg:
|
||||
;While you don't need to create an environment variable, you do still need to set the appropriate lines in fallout2.cfg
|
||||
;-------
|
||||
;[debug]
|
||||
;mode=environment
|
||||
@@ -750,25 +801,12 @@ DebugMode=0
|
||||
;Set to 1 to hide error messages in debug output when a null value is passed to the function as an object
|
||||
HideObjIsNullMsg=0
|
||||
|
||||
;Change to 1 to skip the compatibility mode check
|
||||
SkipCompatModeCheck=0
|
||||
|
||||
;Set to 1 to skip the executable file size check
|
||||
;Does not require sfall debugging mode
|
||||
SkipSizeCheck=0
|
||||
|
||||
;If you're testing changes to the Fallout exe, you can override the CRC that sfall looks for here
|
||||
;You can use several hex values, separated by commas
|
||||
;Does not require sfall debugging mode
|
||||
;ExtraCRC=0x00000000,0x00000000
|
||||
|
||||
;Set to 1 to stop Fallout from deleting non read-only protos at startup
|
||||
;Has pretty nasty side effects when saving/reloading, so don't use for regular gameplay
|
||||
DontDeleteProtos=0
|
||||
|
||||
;Set to 1 to give scripts direct access to Fallout's address space, and to make arbitrary calls into Fallout's code
|
||||
;Does not require sfall debugging mode
|
||||
AllowUnsafeScripting=0
|
||||
;Set to 1 to force sfall to search for global scripts every time the game loads rather than only the first time
|
||||
AlwaysFindScripts=0
|
||||
|
||||
;Set to 1 to force critters to display combat float messages
|
||||
;Requires AllowSoundForFloats to be enabled
|
||||
|
||||
Binary file not shown.
@@ -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 map_enter_p_proc;
|
||||
|
||||
variable ammoIni;
|
||||
variable ammoData;
|
||||
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
|
||||
variable i := 1, ammo, ammoPid, dmgMod;
|
||||
if game_loaded then begin
|
||||
ammoIni := get_ini_setting("ddraw.ini|Misc|DamageFormula");
|
||||
if (ammoIni == 1 or ammoIni == 2) then
|
||||
enabled := get_ini_setting("ddraw.ini|Misc|DamageFormula");
|
||||
if (enabled == 1 or enabled == 2) then
|
||||
ammoIni := "AmmoGlovz.ini";
|
||||
else if (ammoIni == 5) then
|
||||
else if (enabled == 5) then
|
||||
ammoIni := "AmmoYAAM.ini";
|
||||
else
|
||||
ammoIni := "AmmoMod.ini";
|
||||
|
||||
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
|
||||
|
||||
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
|
||||
|
||||
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
|
||||
|
||||
Requires sfall 3.7b or higher
|
||||
|
||||
NOTE: this script requires compiler from sfall modderspack with -s option
|
||||
(short circuit evaluation)
|
||||
NOTE: this script requires compiler from sfall modderspack with -s option (short circuit evaluation)
|
||||
|
||||
*/
|
||||
|
||||
@@ -30,8 +29,8 @@ procedure combatturn_handler;
|
||||
#define PORTAL (0)
|
||||
#define DOOR_FLAGS (0x24)
|
||||
|
||||
variable only_once := 0;
|
||||
variable arrayPid;
|
||||
variable onlyOnce := 0;
|
||||
variable pidDoors;
|
||||
|
||||
procedure start begin
|
||||
if game_loaded then begin
|
||||
@@ -41,11 +40,11 @@ procedure start begin
|
||||
set_global_script_repeat(40); // for sfall 3.x
|
||||
call map_enter_p_proc;
|
||||
end else begin
|
||||
if (only_once == 1 and combat_is_initialized) then begin
|
||||
only_once := 2;
|
||||
if (onlyOnce == 1 and combat_is_initialized) then begin
|
||||
onlyOnce := 2;
|
||||
call set_door_flag(0); // reset flag when entering combat mode
|
||||
end else if (only_once == 2 and not(combat_is_initialized)) then begin
|
||||
only_once := 1;
|
||||
end else if (onlyOnce == 2 and not(combat_is_initialized)) then begin
|
||||
onlyOnce := 1;
|
||||
if (sfall_ver_major >= 4) then set_global_script_repeat(0);
|
||||
call set_door_flag(FLAG_WALKTHRU); // set flag after combat mode ends
|
||||
end
|
||||
@@ -53,34 +52,35 @@ procedure start begin
|
||||
end
|
||||
|
||||
procedure map_enter_p_proc begin
|
||||
if (arrayPid) then begin
|
||||
// when changing maps, delete the current array to create a new one
|
||||
free_array(arrayPid);
|
||||
arrayPid := 0;
|
||||
if (pidDoors) then begin
|
||||
// when changing the map, delete the current array to create a new one
|
||||
free_array(pidDoors);
|
||||
pidDoors := 0;
|
||||
end
|
||||
only_once := 1;
|
||||
onlyOnce := 1;
|
||||
call set_door_flag(FLAG_WALKTHRU); // set flag when entering the map
|
||||
end
|
||||
|
||||
procedure set_door_flag(variable state) begin
|
||||
variable objectMap, obj, objPid, i;
|
||||
|
||||
if (arrayPid) then begin
|
||||
if (pidDoors) then begin
|
||||
call set_door_flag_array(state);
|
||||
return;
|
||||
end
|
||||
|
||||
objectMap := list_as_array(LIST_SCENERY);
|
||||
arrayPid := create_array(0, 0);
|
||||
pidDoors := create_array(0, 0);
|
||||
|
||||
foreach (obj in objectMap) begin
|
||||
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
|
||||
end
|
||||
|
||||
resize_array(arrayPid, i + 1);
|
||||
arrayPid[i] := objPid;
|
||||
resize_array(pidDoors, i + 1);
|
||||
pidDoors[i] := objPid; // add pid to array
|
||||
i++;
|
||||
set_proto_data(objPid, DOOR_FLAGS, state);
|
||||
end
|
||||
@@ -88,14 +88,14 @@ end
|
||||
|
||||
procedure set_door_flag_array(variable state) begin
|
||||
variable objPid;
|
||||
foreach (objPid in arrayPid) begin
|
||||
foreach (objPid in pidDoors) begin
|
||||
set_proto_data(objPid, DOOR_FLAGS, state);
|
||||
end
|
||||
end
|
||||
|
||||
procedure combatturn_handler begin
|
||||
if (only_once == 1) then begin
|
||||
only_once := 2;
|
||||
if (onlyOnce == 1) then begin
|
||||
onlyOnce := 2;
|
||||
call set_door_flag_array(0);
|
||||
set_global_script_repeat(60);
|
||||
end
|
||||
|
||||
Binary file not shown.
@@ -1,85 +1,104 @@
|
||||
procedure start;
|
||||
procedure GetBoozes;
|
||||
procedure update_shader;
|
||||
|
||||
variable perception;
|
||||
variable boozes;
|
||||
variable shader1;
|
||||
variable shader2;
|
||||
variable shader3;
|
||||
variable shader4;
|
||||
variable drunk_level;
|
||||
variable next_reduction;
|
||||
variable begin
|
||||
perception;
|
||||
boozes;
|
||||
shader1;
|
||||
shader2;
|
||||
shader3;
|
||||
shader4;
|
||||
drunk_level;
|
||||
next_reduction;
|
||||
booze_pids;
|
||||
end
|
||||
|
||||
procedure start begin
|
||||
variable new_pe;
|
||||
variable new_booze;
|
||||
variable drunk_count;
|
||||
if (metarule(22,0)) then return;
|
||||
variable new_pe, new_booze, drunk_count;
|
||||
|
||||
if (metarule(22, 0)) then return; //is_loading_game
|
||||
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");
|
||||
return;
|
||||
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);
|
||||
perception:=get_pc_extra_stat(1);
|
||||
boozes:=obj_is_carrying_obj_pid(dude_obj, 125);
|
||||
set_global_script_repeat(25);
|
||||
set_global_script_repeat(-1);
|
||||
shader1:=load_shader("booze1.fx");
|
||||
shader2:=load_shader("booze2.fx");
|
||||
shader3:=load_shader("booze3.fx");
|
||||
shader4:=load_shader("booze4.fx");
|
||||
drunk_level:=0;
|
||||
next_reduction:=0;
|
||||
perception := get_pc_extra_stat(1);
|
||||
boozes := GetBoozes;
|
||||
|
||||
set_global_script_repeat(50);
|
||||
set_global_script_type(1);
|
||||
|
||||
shader1 := load_shader("booze1.fx");
|
||||
shader2 := load_shader("booze2.fx");
|
||||
shader3 := load_shader("booze3.fx");
|
||||
shader4 := load_shader("booze4.fx");
|
||||
//display_msg("Init: " + perception + ", " + boozes);
|
||||
end
|
||||
end else begin
|
||||
new_pe:=get_pc_extra_stat(1);
|
||||
new_booze:=obj_is_carrying_obj_pid(dude_obj, 125);
|
||||
if( (perception != new_pe) or (boozes != new_booze) ) then begin
|
||||
new_pe := get_pc_extra_stat(1);
|
||||
new_booze := GetBoozes;
|
||||
if ((perception != new_pe) orElse (boozes != new_booze)) then begin
|
||||
//display_msg("var change: " + perception + ", " + boozes + " -> " + new_pe + ", " + new_booze);
|
||||
if ( (perception > new_pe) and (boozes > new_booze) ) then begin
|
||||
if ( (perception - new_pe) < (boozes - new_booze) ) then begin
|
||||
drunk_count:=perception - new_pe;
|
||||
if ((perception > new_pe) andAlso (boozes > new_booze)) then begin
|
||||
variable pe_diff := perception - new_pe;
|
||||
variable booze_diff := boozes - new_booze;
|
||||
if (pe_diff < booze_diff) then begin
|
||||
drunk_count := pe_diff;
|
||||
end else begin
|
||||
drunk_count:=boozes - new_booze;
|
||||
drunk_count := booze_diff;
|
||||
end
|
||||
drunk_level:=drunk_level + (drunk_count*10);
|
||||
drunk_level += (drunk_count * 10);
|
||||
//display_msg("Increasing booze count: " + drunk_level);
|
||||
call update_shader;
|
||||
next_reduction:=game_time + game_ticks(6);
|
||||
next_reduction := game_time + game_ticks(6);
|
||||
end
|
||||
perception:=new_pe;
|
||||
boozes:=new_booze;
|
||||
perception := new_pe;
|
||||
boozes := new_booze;
|
||||
end
|
||||
if( (next_reduction != 0 ) and (game_time >= next_reduction) ) then begin
|
||||
drunk_level:=drunk_level - 1;
|
||||
if(drunk_level == 0) then next_reduction:=0;
|
||||
else next_reduction:=next_reduction + game_ticks(6);
|
||||
if ((next_reduction != 0) andAlso (game_time >= next_reduction)) then begin
|
||||
drunk_level -= 1;
|
||||
if (drunk_level == 0) then
|
||||
next_reduction := 0;
|
||||
else
|
||||
next_reduction += game_ticks(6);
|
||||
call update_shader;
|
||||
//display_msg("Decreasing booze count: " + drunk_level);
|
||||
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
|
||||
if(drunk_level >= 100) then begin
|
||||
if (drunk_level >= 100) then begin
|
||||
deactivate_shader(shader1);
|
||||
deactivate_shader(shader2);
|
||||
deactivate_shader(shader3);
|
||||
activate_shader(shader4);
|
||||
end else if(drunk_level >= 50) then begin
|
||||
end else if (drunk_level >= 50) then begin
|
||||
deactivate_shader(shader1);
|
||||
deactivate_shader(shader2);
|
||||
activate_shader(shader3);
|
||||
deactivate_shader(shader4);
|
||||
end else if(drunk_level >= 25) then begin
|
||||
end else if (drunk_level >= 25) then begin
|
||||
deactivate_shader(shader1);
|
||||
activate_shader(shader2);
|
||||
deactivate_shader(shader3);
|
||||
deactivate_shader(shader4);
|
||||
end else if(drunk_level > 0) then begin
|
||||
end else if (drunk_level > 0) then begin
|
||||
activate_shader(shader1);
|
||||
deactivate_shader(shader2);
|
||||
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(); }
|
||||
}
|
||||
@@ -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;
|
||||
sampler s0;
|
||||
@@ -12,6 +31,93 @@ sampler BloomSampler : samplerstate
|
||||
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
|
||||
static const float2 offsets[12] = {
|
||||
-0.326212, -0.405805,
|
||||
@@ -28,89 +134,122 @@ static const float2 offsets[12] = {
|
||||
-0.791559, -0.597705,
|
||||
};
|
||||
|
||||
float w;
|
||||
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) {
|
||||
float4 AdjustSaturation(float4 color, float saturation)
|
||||
{
|
||||
float grey = dot(color, float3(0.3, 0.59, 0.11));
|
||||
|
||||
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);
|
||||
|
||||
// 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;
|
||||
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;
|
||||
// return sum;
|
||||
float intensity = BloomIntensity - lerp(0.0, 0.2, 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(); }
|
||||
// pass P3 { PixelShader = compile ps_2_0 Bloom(); }
|
||||
Pass P0 { PixelShader = compile ps_3_0 BlurPS(float2(1, 0)); }
|
||||
Pass P1 { PixelShader = compile ps_3_0 BlurPS(float2(0, 1)); }
|
||||
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 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.
|
||||
|
||||
NOTE: the AllowUnsafeScripting option must be enabled.
|
||||
*/
|
||||
|
||||
#include "..\headers\define.h"
|
||||
@@ -9,10 +7,8 @@
|
||||
#include "..\headers\sfall\sfall.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 can_see(variable obj1, variable obj2);
|
||||
|
||||
procedure start begin
|
||||
if game_loaded then begin
|
||||
@@ -21,40 +17,50 @@ procedure start begin
|
||||
variable
|
||||
source := get_sfall_arg,
|
||||
target := get_sfall_arg,
|
||||
original := get_sfall_arg,
|
||||
hookType := get_sfall_arg, /* new arg */
|
||||
engine := get_sfall_arg,
|
||||
type := get_sfall_arg, /* new arg */
|
||||
result := 0,
|
||||
distance;
|
||||
distance, seeDistance, seeText;
|
||||
|
||||
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
|
||||
distance *= 5;
|
||||
if (get_flags(target) bwand FLAG_TRANSGLASS) then distance /= 2;
|
||||
if can_see(source, target) then begin
|
||||
seeDistance *= 5;
|
||||
if (get_flags(target) bwand FLAG_TRANSGLASS) then seeDistance /= 2;
|
||||
end else if combat_is_initialized then begin
|
||||
distance *= 2;
|
||||
seeDistance *= 2;
|
||||
end
|
||||
|
||||
if (target == dude_obj) then begin
|
||||
if sneak_success then begin
|
||||
distance /= 4;
|
||||
if has_skill(target, SKILL_SNEAK) > 120 then distance -= 1;
|
||||
seeDistance /= 4;
|
||||
if has_skill(target, SKILL_SNEAK) > 120 then seeDistance -= 1;
|
||||
end else if dude_is_sneaking then begin
|
||||
distance := distance * 2 / 3;
|
||||
seeDistance := (seeDistance * 2) / 3; // distance div 1.5
|
||||
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 (result) then begin
|
||||
display_msg("hs_withinperception: " + obj_name(source) + " sees " + obj_name(target) + " [original: " + original + " script: " + result + "]");
|
||||
end else begin
|
||||
display_msg("hs_withinperception: " + obj_name(source) + " does not see " + obj_name(target) + " [original: " + original + " script: " + result + "]");
|
||||
end
|
||||
if (distance <= seeDistance) then result := 1;
|
||||
|
||||
seeText = " does not see > ";
|
||||
if (result) then seeText = " sees > ";
|
||||
|
||||
// Example
|
||||
display_msg("hs_withinperception: " + obj_name(source) + seeText + obj_name(target) + " [engine: " + engine + ", script: " + result + "]");
|
||||
|
||||
/* override engine result */
|
||||
//set_sfall_return(result);
|
||||
end
|
||||
|
||||
//set_sfall_return(result);
|
||||
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
|
||||
|
||||
Binary file not shown.
@@ -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
|
||||
@@ -155,7 +155,7 @@ Example:
|
||||
- creates permanent array (but not "saved")
|
||||
- if size is >= 0, creates list with given size
|
||||
- if size == -1, creates map (associative array)
|
||||
- if size == -1 and flags == 2, creates a "lookup" map in which the values of existing keys are read-only and can't be updated.
|
||||
- if size == -1 and flags == 2, creates a "lookup" map (associative array) in which the values of existing keys are read-only and can't be updated.
|
||||
This type of array allows you to store a zero (0) key value
|
||||
- NOTE: in earlier versions (up to 4.1.3/3.8.13) the second argument is not used, just use 0
|
||||
- returns arrayID (valid until array is deleted)
|
||||
|
||||
@@ -340,6 +340,9 @@ There are several changes in this version of sslc which may result in problems f
|
||||
=== Changelog ===
|
||||
=================
|
||||
|
||||
> sfall 4.2.7
|
||||
- added ability to declare local variables anywhere in the procedure body
|
||||
|
||||
> sfall 4.2.3
|
||||
- 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
|
||||
|
||||
@@ -1,13 +1,9 @@
|
||||
/*
|
||||
Copyright 1998-2003 Interplay Entertainment Corp. All rights reserved.
|
||||
*/
|
||||
|
||||
#ifndef COMMAND_H
|
||||
#define COMMAND_H
|
||||
|
||||
|
||||
#define critter_is_armed(x) (((obj_item_subtype(critter_inven_obj(x,INVEN_TYPE_RIGHT_HAND))) == item_type_weapon) or \
|
||||
#define critter_is_armed(x) (((obj_item_subtype(critter_inven_obj(x,INVEN_TYPE_RIGHT_HAND))) == item_type_weapon) orElse \
|
||||
((obj_item_subtype(critter_inven_obj(x,INVEN_TYPE_LEFT_HAND))) == item_type_weapon))
|
||||
|
||||
#define critter_weight(x) (100 + ((get_critter_stat(x,STAT_gender) == GENDER_MALE) * 50) + (get_critter_stat(x,STAT_st) * 5) - ((get_critter_stat(x,STAT_ag) + get_critter_stat(x,STAT_en))/3))
|
||||
#define critter_wearing_armor(x) (obj_item_subtype(critter_inven_obj(x,INVEN_TYPE_WORN)) == item_type_armor)
|
||||
|
||||
@@ -21,13 +17,13 @@
|
||||
#define dude_iq (get_critter_stat(dude_obj,STAT_iq))
|
||||
#define dude_agility (get_critter_stat(dude_obj,STAT_ag))
|
||||
#define dude_luck (get_critter_stat(dude_obj,STAT_lu))
|
||||
#ifndef dude_level
|
||||
#define dude_level (get_pc_stat(PCSTAT_level))
|
||||
#endif
|
||||
#define dude_age (get_critter_stat(dude_obj,STAT_age))
|
||||
#define dude_weight critter_weight(dude_obj)
|
||||
#define dude_cur_carry who_carry_amount(dude_obj)
|
||||
#define dude_max_carry who_max_carry(dude_obj)
|
||||
|
||||
#define dude_moron_not_vegetable (((get_critter_stat(dude_obj,STAT_iq)) > 1) and ((get_critter_stat(dude_obj,STAT_iq)) < 3) )
|
||||
#define dude_moron_not_vegetable (((get_critter_stat(dude_obj,STAT_iq)) > 1) andAlso ((get_critter_stat(dude_obj,STAT_iq)) < 3) )
|
||||
|
||||
#define dude_is_male (dude_gender == GENDER_MALE)
|
||||
#define dude_is_female (dude_gender == GENDER_FEMALE)
|
||||
@@ -39,43 +35,50 @@
|
||||
(obj_is_carrying_obj_pid(dude_obj, PID_ADVANCED_POWER_ARMOR_MK2)) + \
|
||||
(obj_is_carrying_obj_pid(dude_obj, PID_HARDENED_POWER_ARMOR))) > 0)
|
||||
|
||||
#define dude_wielding_knife ((obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_RIGHT_HAND)) == PID_KNIFE) or \
|
||||
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_RIGHT_HAND)) == PID_THROWING_KNIFE) or \
|
||||
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_RIGHT_HAND)) == PID_RIPPER) or \
|
||||
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_RIGHT_HAND)) == PID_COMBAT_KNIFE) or \
|
||||
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_LEFT_HAND)) == PID_KNIFE) or \
|
||||
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_LEFT_HAND)) == PID_THROWING_KNIFE) or \
|
||||
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_LEFT_HAND)) == PID_RIPPER) or \
|
||||
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_LEFT_HAND)) == PID_COMBAT_KNIFE))
|
||||
#define dude_wielding_knife ((obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_RIGHT_HAND)) == PID_KNIFE) orElse \
|
||||
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_RIGHT_HAND)) == PID_THROWING_KNIFE) orElse \
|
||||
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_RIGHT_HAND)) == PID_RIPPER) orElse \
|
||||
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_RIGHT_HAND)) == PID_COMBAT_KNIFE) orElse \
|
||||
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_RIGHT_HAND)) == PID_SWITCHBLADE) orElse \
|
||||
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_RIGHT_HAND)) == PID_SHIV) orElse \
|
||||
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_RIGHT_HAND)) == PID_LIL_JESUS_WEAPON) orElse \
|
||||
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_RIGHT_HAND)) == PID_WAKIZASHI_BLADE) orElse \
|
||||
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_LEFT_HAND)) == PID_KNIFE) orElse \
|
||||
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_LEFT_HAND)) == PID_THROWING_KNIFE) orElse \
|
||||
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_LEFT_HAND)) == PID_RIPPER) orElse \
|
||||
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_LEFT_HAND)) == PID_COMBAT_KNIFE) orElse \
|
||||
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_LEFT_HAND)) == PID_SWITCHBLADE) orElse \
|
||||
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_LEFT_HAND)) == PID_SHIV) orElse \
|
||||
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_LEFT_HAND)) == PID_LIL_JESUS_WEAPON) orElse \
|
||||
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_LEFT_HAND)) == PID_WAKIZASHI_BLADE))
|
||||
|
||||
#define dude_wearing_power_armor ((obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_POWERED_ARMOR) or \
|
||||
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_ADVANCED_POWER_ARMOR) or \
|
||||
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_ADVANCED_POWER_ARMOR_MK2) or \
|
||||
#define dude_wearing_power_armor ((obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_POWERED_ARMOR) orElse \
|
||||
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_ADVANCED_POWER_ARMOR) orElse \
|
||||
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_ADVANCED_POWER_ARMOR_MK2) orElse \
|
||||
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_HARDENED_POWER_ARMOR))
|
||||
|
||||
#define dude_wearing_leather_armor ((obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_LEATHER_ARMOR) or \
|
||||
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_LEATHER_JACKET) or \
|
||||
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_LEATHER_ARMOR_MK_II) or \
|
||||
#define dude_wearing_leather_armor ((obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_LEATHER_ARMOR) orElse \
|
||||
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_LEATHER_JACKET) orElse \
|
||||
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_LEATHER_ARMOR_MK_II) orElse \
|
||||
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_CURED_LEATHER_ARMOR))
|
||||
|
||||
#define dude_wearing_combat_armor ((obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_COMBAT_ARMOR) or \
|
||||
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_BROTHERHOOD_COMBAT_ARMOR) or \
|
||||
#define dude_wearing_combat_armor ((obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_COMBAT_ARMOR) orElse \
|
||||
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_BROTHERHOOD_COMBAT_ARMOR) orElse \
|
||||
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_COMBAT_ARMOR_MK_II))
|
||||
|
||||
#define dude_wearing_metal_armor ((obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_METAL_ARMOR) or \
|
||||
#define dude_wearing_metal_armor ((obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_METAL_ARMOR) orElse \
|
||||
(obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_METAL_ARMOR_MK_II))
|
||||
|
||||
#define dude_wearing_vault_suit COND019(1)
|
||||
#define dude_has_gambling_skills ((dude_iq > 3) and (has_skill(dude_obj, SKILL_GAMBLING) >= 25))
|
||||
#define dude_has_gambling_skills ((dude_iq > 3) andAlso (has_skill(dude_obj, SKILL_GAMBLING) >= 25))
|
||||
|
||||
#define dude_is_sneaking (using_skill(dude_obj,SKILL_SNEAK))
|
||||
#define dude_is_walking (art_anim(obj_art_fid(dude_obj)) == ANIM_walk)
|
||||
#define dude_is_running (art_anim(obj_art_fid(dude_obj)) == ANIM_running)
|
||||
#define dude_is_poisoned (get_poison(dude_obj))
|
||||
#define dude_is_irradiated (get_critter_stat(dude_obj, STAT_current_rad))
|
||||
#define dude_is_crippled ((critter_state(dude_obj) bwand DAM_CRIP_LEG_LEFT) or \
|
||||
(critter_state(dude_obj) bwand DAM_CRIP_LEG_RIGHT) or \
|
||||
(critter_state(dude_obj) bwand DAM_CRIP_ARM_LEFT) or \
|
||||
#define dude_is_crippled ((critter_state(dude_obj) bwand DAM_CRIP_LEG_LEFT) orElse \
|
||||
(critter_state(dude_obj) bwand DAM_CRIP_LEG_RIGHT) orElse \
|
||||
(critter_state(dude_obj) bwand DAM_CRIP_ARM_LEFT) orElse \
|
||||
(critter_state(dude_obj) bwand DAM_CRIP_ARM_RIGHT))
|
||||
|
||||
#define dude_cur_rot (has_trait(TRAIT_OBJECT,dude_obj,OBJECT_CUR_ROT))
|
||||
@@ -99,8 +102,6 @@
|
||||
#define dude_has_car (global_var(GVAR_PLAYER_GOT_CAR))
|
||||
#define dude_is_pornstar dude_has_porn_star_rep
|
||||
#define dude_is_high drug_influence(dude_obj)
|
||||
#define dude_found_geck global_var(GVAR_VAULT13_FOUND_GECK)
|
||||
|
||||
|
||||
#define dude_stat_win(X,Y) ((do_check(dude_obj,X,Y)) > (do_check(self_obj,X,0)))
|
||||
#define dude_stat_lose(X,Y) ((do_check(dude_obj,X,Y)) < (do_check(self_obj,X,0)))
|
||||
@@ -112,7 +113,6 @@
|
||||
|
||||
#define dude_is_addict (has_trait(TRAIT_TRAIT, dude_obj, TRAIT_drug_addict))
|
||||
|
||||
|
||||
#define self_name (obj_name(self_obj))
|
||||
#define self_gender (get_critter_stat(self_obj,STAT_gender))
|
||||
#define self_strength (get_critter_stat(self_obj,STAT_st))
|
||||
@@ -128,7 +128,7 @@
|
||||
#define self_is_armed critter_is_armed(self_obj)
|
||||
#define self_wearing_armor critter_wearing_armor(self_obj)
|
||||
|
||||
#define self_carrying_laser_pistol ((obj_pid(critter_inven_obj(self_obj,INVEN_TYPE_LEFT_HAND)) == PID_LASER_PISTOL) or \
|
||||
#define self_carrying_laser_pistol ((obj_pid(critter_inven_obj(self_obj,INVEN_TYPE_LEFT_HAND)) == PID_LASER_PISTOL) orElse \
|
||||
(obj_pid(critter_inven_obj(self_obj,INVEN_TYPE_RIGHT_HAND)) == PID_LASER_PISTOL))
|
||||
|
||||
#define self_is_sneaking (using_skill(self_obj,SKILL_SNEAK))
|
||||
@@ -169,23 +169,24 @@
|
||||
|
||||
|
||||
// some timer event macros
|
||||
#define check_set_obj_visiblility(the_obj, x) if (obj_is_visible_flag(the_obj) == x) then set_obj_visibility(the_obj, x)
|
||||
#define check_set_obj_visiblility(the_obj, x) if (obj_is_visible_flag(the_obj) == x) then set_obj_visibility(the_obj, x)
|
||||
|
||||
#define flush_add_timer_event(obj, time, param) rm_fixed_timer_event(obj, param); \
|
||||
add_timer_event(obj, time, param)
|
||||
|
||||
#define flush_add_timer_event_sec(obj, sec, param) flush_add_timer_event(obj, game_ticks(sec), param)
|
||||
|
||||
/******************************************************************
|
||||
General commands getting information about time
|
||||
******************************************************************/
|
||||
|
||||
#define morning ((game_time_hour >= 600) and (game_time_hour < 700))
|
||||
#define morning ((game_time_hour >= 600) andAlso (game_time_hour < 700))
|
||||
#ifndef day
|
||||
#define day ((game_time_hour >= 700) and (game_time_hour < 1800))
|
||||
#define day ((game_time_hour >= 700) andAlso (game_time_hour < 1800))
|
||||
#endif
|
||||
#define evening ((game_time_hour >= 1800) and (game_time_hour < 1900))
|
||||
#define evening ((game_time_hour >= 1800) andAlso (game_time_hour < 1900))
|
||||
#ifndef night
|
||||
#define night ((game_time_hour >= 1900) or (game_time_hour < 600))
|
||||
#define night ((game_time_hour >= 1900) orElse (game_time_hour < 600))
|
||||
#endif
|
||||
|
||||
#define GAME_TIME_SUBSECOND_RESOLUTION (10)
|
||||
@@ -200,7 +201,6 @@
|
||||
#define GAME_TIME_IN_MINUTES (game_time / (GAME_TIME_SUBSECOND_RESOLUTION * SECONDS_PER_MINUTE))
|
||||
#define GAME_TIME_IN_SECONDS (game_time / GAME_TIME_SUBSECOND_RESOLUTION)
|
||||
|
||||
|
||||
#define ticks_til_hour(x) ((ONE_GAME_DAY * (game_time_hour > (x))) + ((((x)/100) - (game_time_hour/100)) * ONE_GAME_HOUR) + ((((x)%100) - (game_time_hour%100)) * ONE_GAME_MINUTE))
|
||||
#define game_time_advance_hour(x) game_time_advance(ticks_til_hour(x))
|
||||
|
||||
@@ -219,9 +219,7 @@
|
||||
/***************************************************************
|
||||
**************** Dialogue Information ***********************
|
||||
***************************************************************/
|
||||
#ifndef floater
|
||||
#define floater(x) float_msg(self_obj, message_str(NAME,x), FLOAT_COLOR_NORMAL)
|
||||
#endif
|
||||
#define floater(x) float_msg(self_obj, message_str(NAME,x), FLOAT_COLOR_NORMAL)
|
||||
#define floater_rand(x,y) floater(random(x,y))
|
||||
|
||||
#define dude_floater(x) float_msg(dude_obj, message_str(NAME,x), FLOAT_COLOR_NORMAL)
|
||||
@@ -229,7 +227,6 @@
|
||||
#define dude_floater_bad(x) float_msg(dude_obj, message_str(NAME,x), FLOAT_COLOR_BAD)
|
||||
#define dude_floater_sick(x) float_msg(dude_obj, message_str(NAME,x), FLOAT_COLOR_SICK)
|
||||
|
||||
|
||||
#define FLOAT_COLOR_NORMAL FLOAT_MSG_YELLOW
|
||||
#define FLOAT_COLOR_SICK FLOAT_MSG_GREEN
|
||||
#define FLOAT_COLOR_BAD FLOAT_MSG_RED
|
||||
@@ -335,9 +332,7 @@
|
||||
******************************************************************/
|
||||
#define critter_is_male (get_critter_stat(self_obj,STAT_gender) == GENDER_MALE)
|
||||
#define critter_is_female (get_critter_stat(self_obj,STAT_gender) == GENDER_FEMALE)
|
||||
/*#define critter_is_armed (((obj_item_subtype(critter_inven_obj(self_obj,INVEN_TYPE_RIGHT_HAND))) == item_type_weapon) \
|
||||
or ((obj_item_subtype(critter_inven_obj(self_obj,INVEN_TYPE_LEFT_HAND))) == item_type_weapon))
|
||||
*/
|
||||
|
||||
/******************************************************************
|
||||
General commands setting and getting the map exit
|
||||
******************************************************************/
|
||||
@@ -385,59 +380,12 @@
|
||||
#define status_is_warned(status_var) (status_is(status_var, PERSON_WARNED))
|
||||
#define status_is_sex(status_var) (status_is(status_var, PERSON_SEX))
|
||||
|
||||
#define status_is_alive(status_var) (not (status_is_killed(status_var) or status_is_assassinated(status_var) or status_is_dead(status_var)))
|
||||
#define status_is_alive(status_var) (not (status_is_killed(status_var) orElse status_is_assassinated(status_var) orElse status_is_dead(status_var)))
|
||||
|
||||
|
||||
/******************************************************************
|
||||
General commands getting information about cities
|
||||
******************************************************************/
|
||||
#define abbey_visible_on_map (town_known(AREA_ABBEY) != MARK_STATE_UNKNOWN)
|
||||
#define arroyo_visible_on_map (town_known(AREA_ARROYO) != MARK_STATE_UNKNOWN)
|
||||
#define broken_hills_visible_on_map (town_known(AREA_BROKEN_HILLS) != MARK_STATE_UNKNOWN)
|
||||
#define colusa_visible_on_map (town_known(AREA_NAVARRO) != MARK_STATE_UNKNOWN)
|
||||
#define den_visible_on_map (town_known(AREA_DEN) != MARK_STATE_UNKNOWN)
|
||||
#define enclave_visible_on_map (town_known(AREA_THE_ENCLAVE) != MARK_STATE_UNKNOWN)
|
||||
#define EPA_visible_on_map (town_known(AREA_EPA) != MARK_STATE_UNKNOWN)
|
||||
#define gecko_visible_on_map (town_known(AREA_GECKO) != MARK_STATE_UNKNOWN)
|
||||
#define klamath_visible_on_map (town_known(AREA_KLAMATH) != MARK_STATE_UNKNOWN)
|
||||
#define military_base_visible_on_map (town_known(AREA_MILITARY_BASE) != MARK_STATE_UNKNOWN)
|
||||
#define modoc_visible_on_map (town_known(AREA_MODOC) != MARK_STATE_UNKNOWN)
|
||||
#define new_CA_republic_visible_on_map (town_known(AREA_NCR) != MARK_STATE_UNKNOWN)
|
||||
#define primitive_tribe_visible_on_map (town_known(AREA_PRIMITIVE_TRIBE) != MARK_STATE_UNKNOWN)
|
||||
#define redding_visible_on_map (town_known(AREA_REDDING) != MARK_STATE_UNKNOWN)
|
||||
#define new_reno_visible_on_map (town_known(AREA_NEW_RENO) != MARK_STATE_UNKNOWN)
|
||||
#define san_francisco_visible_on_map (town_known(AREA_SAN_FRANCISCO) != MARK_STATE_UNKNOWN)
|
||||
#define sierra_army_base_visible_on_map (town_known(AREA_SIERRA_ARMY_BASE) != MARK_STATE_UNKNOWN)
|
||||
#define vault_13_visible_on_map (town_known(AREA_VAULT_13) != MARK_STATE_UNKNOWN)
|
||||
#define vault_15_visible_on_map (town_known(AREA_VAULT_15) != MARK_STATE_UNKNOWN)
|
||||
#define vault_city_visible_on_map (town_known(AREA_VAULT_CITY) != MARK_STATE_UNKNOWN)
|
||||
#define vault_fake_13A_visible_on_map (town_known(AREA_FAKE_VAULT_13A) != MARK_STATE_UNKNOWN)
|
||||
#define vault_fake_13B_visible_on_map (town_known(AREA_FAKE_VAULT_13B) != MARK_STATE_UNKNOWN)
|
||||
|
||||
#define abbey_visit (town_known(AREA_ABBEY) == MARK_STATE_VISITED)
|
||||
#define arroyo_visit (town_known(AREA_ARROYO) == MARK_STATE_VISITED)
|
||||
#define broken_hills_visit (town_known(AREA_BROKEN_HILLS) == MARK_STATE_VISITED)
|
||||
#define colusa_visit (town_known(AREA_NAVARRO) == MARK_STATE_VISITED)
|
||||
#define den_visit (town_known(AREA_DEN) == MARK_STATE_VISITED)
|
||||
#define enclave_visit (town_known(AREA_THE_ENCLAVE) == MARK_STATE_VISITED)
|
||||
#define EPA_visit (town_known(AREA_EPA) == MARK_STATE_VISITED)
|
||||
#define gecko_visit (town_known(AREA_GECKO) == MARK_STATE_VISITED)
|
||||
#define klamath_visit (town_known(AREA_KLAMATH) == MARK_STATE_VISITED)
|
||||
#define military_base_visit (town_known(AREA_MILITARY_BASE) == MARK_STATE_VISITED)
|
||||
#define modoc_visit (town_known(AREA_MODOC) == MARK_STATE_VISITED)
|
||||
#define new_CA_republic_visit (town_known(AREA_NCR) == MARK_STATE_VISITED)
|
||||
#define primitive_tribe_visit (town_known(AREA_PRIMITIVE_TRIBE) == MARK_STATE_VISITED)
|
||||
#define redding_visit (town_known(AREA_REDDING) == MARK_STATE_VISITED)
|
||||
#define new_reno_visit (town_known(AREA_NEW_RENO) == MARK_STATE_VISITED)
|
||||
#define san_francisco_visit (town_known(AREA_SAN_FRANCISCO) == MARK_STATE_VISITED)
|
||||
#define sierra_army_base_visit (town_known(AREA_SIERRA_ARMY_BASE) == MARK_STATE_VISITED)
|
||||
#define vault_13_visit (town_known(AREA_VAULT_13) == MARK_STATE_VISITED)
|
||||
#define vault_15_visit (town_known(AREA_VAULT_15) == MARK_STATE_VISITED)
|
||||
#define vault_city_visit (town_known(AREA_VAULT_CITY) == MARK_STATE_VISITED)
|
||||
#define arroyo_destroyed_visit (town_known(AREA_ARROYO_DESTROYED) == MARK_STATE_VISITED)
|
||||
#define vault_fake_13A_visit (town_known(AREA_FAKE_VAULT_13A) == MARK_STATE_VISITED)
|
||||
#define vault_fake_13B_visit (town_known(AREA_FAKE_VAULT_13B) == MARK_STATE_VISITED)
|
||||
|
||||
#define mark_on_map(x) if (town_known(x) == MARK_STATE_UNKNOWN) then begin \
|
||||
debug_msg(" mark_on_map("+x+")"); \
|
||||
mark_area_known(MARK_TYPE_TOWN, x, MARK_STATE_KNOWN); \
|
||||
@@ -448,63 +396,11 @@
|
||||
mark_area_known(MARK_TYPE_TOWN, x, MARK_STATE_UNKNOWN); \
|
||||
end
|
||||
|
||||
#define mark_abbey_on_map mark_on_map(AREA_ABBEY)
|
||||
#define mark_arroyo_on_map mark_on_map(AREA_ARROYO)
|
||||
#define mark_broken_hills_on_map mark_on_map(AREA_BROKEN_HILLS)
|
||||
#define mark_colusa_on_map mark_on_map(AREA_NAVARRO)
|
||||
#define mark_navarro_on_map mark_on_map(AREA_NAVARRO)
|
||||
#define mark_den_on_map mark_on_map(AREA_DEN)
|
||||
#define mark_enclave_on_map mark_on_map(AREA_THE_ENCLAVE)
|
||||
#define mark_EPA_on_map mark_on_map(AREA_EPA)
|
||||
#define mark_gecko_on_map mark_on_map(AREA_GECKO)
|
||||
#define mark_klamath_on_map mark_on_map(AREA_KLAMATH)
|
||||
#define mark_military_base_on_map mark_on_map(AREA_MILITARY_BASE)
|
||||
#define mark_modoc_on_map mark_on_map(AREA_MODOC)
|
||||
#define mark_new_CA_republic_on_map mark_on_map(AREA_NCR)
|
||||
#define mark_primitive_tribe_on_map mark_on_map(AREA_PRIMITIVE_TRIBE)
|
||||
#define mark_redding_on_map mark_on_map(AREA_REDDING)
|
||||
#define mark_new_reno_on_map mark_on_map(AREA_NEW_RENO)
|
||||
#define mark_san_francisco_on_map mark_on_map(AREA_SAN_FRANCISCO)
|
||||
#define mark_sierra_army_base_on_map mark_on_map(AREA_SIERRA_ARMY_BASE)
|
||||
#define mark_vault_13_on_map mark_on_map(AREA_VAULT_13)
|
||||
#define mark_vault_15_on_map mark_on_map(AREA_VAULT_15)
|
||||
#define mark_vault_city_on_map mark_on_map(AREA_VAULT_CITY)
|
||||
#define mark_vault_fake_13A_on_map mark_on_map(AREA_FAKE_VAULT_13A)
|
||||
#define mark_vault_fake_13B_on_map mark_on_map(AREA_FAKE_VAULT_13B)
|
||||
|
||||
#define unmark_vault_fake_13A_on_map unmark_on_map(AREA_FAKE_VAULT_13A)
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************************************************
|
||||
********** These represent the players acomplishments through the game *********************************************
|
||||
********** Note: these reflect the Fallout2 variable designers put in the scripts assuming we were *****************
|
||||
********** going to have a magic variable to keep track of the player stats throught the game **********************
|
||||
*******************************************************************************************************************/
|
||||
#define f2_state_v13_looking (0)
|
||||
#define f2_state_v13_known (1) // set -Chris H
|
||||
#define f2_state_v13_found (2) // set -Chris H
|
||||
#define f2_state_v13_entered (3) // set -Chris H
|
||||
#define f2_state_tribe_kidnapped (4) // ### state not set
|
||||
#define f2_state_fix_tanker (5) // didn't need to exist
|
||||
#define f2_state_tanker_fix_known (6) // set -Chris H
|
||||
#define f2_state_tanker_fixed (7) // set -Chris H
|
||||
#define f2_state_enclave_destroyed (8) // ### state not set
|
||||
|
||||
#define set_f2(x) if (global_var(GVAR_FALLOUT_2) < x) then set_global_var(GVAR_FALLOUT_2, x)
|
||||
#define force_f2(x) set_global_var(GVAR_FALLOUT_2, x)
|
||||
#define get_f2(x) (global_var(GVAR_FALLOUT_2) == x)
|
||||
#define f2_flag_any (global_var(GVAR_FALLOUT_2))
|
||||
|
||||
#define Fallout2_vault13_looking get_f2(f2_state_v13_looking)
|
||||
#define Fallout2_vault13_location_known get_f2(f2_state_v13_known)
|
||||
#define Fallout2_vault13_found get_f2(f2_state_v13_found)
|
||||
#define Fallout2_vault13_entered get_f2(f2_state_v13_entered)
|
||||
#define Fallout2_tribe_kidnapped get_f2(f2_state_tribe_kidnapped)
|
||||
#define Fallout2_fix_tanker get_f2(f2_state_fix_tanker)
|
||||
#define Fallout2_tanker_known get_f2(f2_state_tanker_fix_known)
|
||||
#define Fallout2_tanker_fixed get_f2(f2_state_tanker_fixed)
|
||||
#define Fallout2_enclave_destroyed get_f2(f2_state_enclave_destroyed)
|
||||
|
||||
// Info relating to carry weight, how much something costs, and weights
|
||||
#define pid_weight(x) proto_data(x,it_weight)
|
||||
|
||||
@@ -2,6 +2,9 @@
|
||||
#ifndef 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_LEFT_ARM (1)
|
||||
#define BODY_HIT_RIGHT_ARM (2)
|
||||
@@ -102,10 +105,11 @@
|
||||
#define CFLG_NOKNOCKDOWN CFLG_NOKNOCKBACK // obsolete
|
||||
|
||||
/* Window flags */
|
||||
#define WIN_FLAG_MOVEONTOP (0x4)
|
||||
#define WIN_FLAG_HIDDEN (0x8)
|
||||
#define WIN_FLAG_DONTMOVE (0x2) // does not move the window to the foreground when clicking on the window
|
||||
#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_TRANSPARENT (0x20)
|
||||
#define WIN_FLAG_TRANSPARENT (0x20) // transparent window flag, the window color with index 0 will be transparent
|
||||
|
||||
/* Message window flags */
|
||||
#define MSGBOX_AUTOSIZE (0x0)
|
||||
@@ -337,4 +341,66 @@
|
||||
#define OBJ_DATA_DAMAGE_LAST_TURN (0x48)
|
||||
#define OBJ_DATA_WHO_HIT_ME (0x54) // current target of the critter
|
||||
|
||||
// compute attack result data offsets
|
||||
#define C_ATTACK_SOURCE (0x00)
|
||||
#define C_ATTACK_HIT_MODE (0x04)
|
||||
#define C_ATTACK_WEAPON (0x08)
|
||||
#define C_ATTACK_UNUSED (0x0C)
|
||||
#define C_ATTACK_DAMAGE_SOURCE (0x10) // Amount
|
||||
#define C_ATTACK_FLAGS_SOURCE (0x14) // see DAM_* values in define.h
|
||||
#define C_ATTACK_ROUNDS (0x18)
|
||||
#define C_ATTACK_MESSAGE (0x1C) // message number set from the critical table
|
||||
#define C_ATTACK_TARGET (0x20)
|
||||
#define C_ATTACK_BODY_PART (0x28)
|
||||
#define C_ATTACK_DAMAGE_TARGET (0x2C) // Amount
|
||||
#define C_ATTACK_FLAGS_TARGET (0x30) // see DAM_*
|
||||
#define C_ATTACK_KNOCKBACK_VALUE (0x34)
|
||||
#define C_ATTACK_MAIN_TARGET (0x38)
|
||||
#define C_ATTACK_AROUND_NUMBER (0x3C) // The number of critters around the target
|
||||
#define C_ATTACK_TARGET1 (0x40)
|
||||
#define C_ATTACK_TARGET2 (0x44)
|
||||
#define C_ATTACK_TARGET3 (0x48)
|
||||
#define C_ATTACK_TARGET4 (0x4C)
|
||||
#define C_ATTACK_TARGET5 (0x50)
|
||||
#define C_ATTACK_TARGET6 (0x54)
|
||||
#define C_ATTACK_BODY_PART1 (0x58)
|
||||
#define C_ATTACK_BODY_PART2 (0x5C)
|
||||
#define C_ATTACK_BODY_PART3 (0x60)
|
||||
#define C_ATTACK_BODY_PART4 (0x64)
|
||||
#define C_ATTACK_BODY_PART5 (0x68)
|
||||
#define C_ATTACK_BODY_PART6 (0x6C)
|
||||
#define C_ATTACK_DAMAGE_TARGET1 (0x70) // Amount
|
||||
#define C_ATTACK_DAMAGE_TARGET2 (0x74)
|
||||
#define C_ATTACK_DAMAGE_TARGET3 (0x78)
|
||||
#define C_ATTACK_DAMAGE_TARGET4 (0x7C)
|
||||
#define C_ATTACK_DAMAGE_TARGET5 (0x80)
|
||||
#define C_ATTACK_DAMAGE_TARGET6 (0x84)
|
||||
#define C_ATTACK_FLAGS_TARGET1 (0x88) // see DAM_*
|
||||
#define C_ATTACK_FLAGS_TARGET2 (0x8C)
|
||||
#define C_ATTACK_FLAGS_TARGET3 (0x90)
|
||||
#define C_ATTACK_FLAGS_TARGET4 (0x94)
|
||||
#define C_ATTACK_FLAGS_TARGET5 (0x98)
|
||||
#define C_ATTACK_FLAGS_TARGET6 (0x9C)
|
||||
#define C_ATTACK_KNOCKBACK_VALUE1 (0xA0)
|
||||
#define C_ATTACK_KNOCKBACK_VALUE2 (0xA4)
|
||||
#define C_ATTACK_KNOCKBACK_VALUE3 (0xA8)
|
||||
#define C_ATTACK_KNOCKBACK_VALUE4 (0xAC)
|
||||
#define C_ATTACK_KNOCKBACK_VALUE5 (0xB0)
|
||||
#define C_ATTACK_KNOCKBACK_VALUE6 (0xB4)
|
||||
|
||||
/* Playback mode defines for the soundplay function */
|
||||
#define soundraw (0x80000000) // sfall flag
|
||||
#define Stereo8bit (soundstereo)
|
||||
#define Stereo8bitLoop (soundstereo bwor soundloop)
|
||||
#define Mono16bit (sound16bit)
|
||||
#define Mono16bitLoop (sound16bit bwor soundloop)
|
||||
#define Stereo16bit (soundstereo bwor sound16bit)
|
||||
#define Stereo16bitLoop (soundstereo bwor sound16bit bwor soundloop)
|
||||
|
||||
// Adjust (reduce) volume for soundplay and play_sfall_sound
|
||||
// range: 0x0000XXXX (max volume) - 0x7FFFXXXX (mute)
|
||||
#define SoundVolume25 (0x20000000)
|
||||
#define SoundVolumeHalf (0x40000000)
|
||||
#define SoundVolume75 (0x60000000)
|
||||
|
||||
#endif // DEFINE_EXTRA_H
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user