Compare commits

..
2 Commits
Author SHA1 Message Date
NovaRain 3e3f6f92ed Merge branch '3.8-maintenance' 2016-11-14 10:20:26 +08:00
NovaRain 9be861a84b Merge branch '3.8-maintenance' 2016-11-10 09:14:49 +08:00
71 changed files with 1433 additions and 3716 deletions
+1 -29
View File
@@ -7,34 +7,6 @@
; have an additional NoHardcode option in this file which can
; be used to remove their hardcoded effects, and add new stat/skill effects
;Name=The name of the perk
;Desc=The description of the perk
;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
;If the value is set to -99999, the variable will be ignored (similar to comment out that line)
;This is a modification to perk 119
[119]
Name=Example
@@ -64,4 +36,4 @@ Name=Example
Desc=This is an example trait
Image=72
StatMod=0|-1 ;Subtract 1 from strength
SkillMod=0|20|1|-5 ;Add 20 to the player's small guns skill and subtract 5 from big guns
SkillMod=0|20|1|-5 ;Add 20 to the players small guns skill and subtract 5 from big guns
+46 -48
View File
@@ -1,5 +1,5 @@
;sfall configuration settings
;v3.8.6
;v3.8.1
[Main]
;Change to 1 if you want to use command line args to tell sfall to use another ini file.
@@ -48,26 +48,26 @@ SpeedMultiInitial=100
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
[Graphics]
;Set to 0 for 8 bit fullscreen
;Set to 4 for DX9 fullscreen
;Set to 5 for DX9 windowed
;A DX9 mode is required for any graphics related script extender functions to work (i.e. fullscreen shaders)
;Set to 4 for dx9 fullscreen
;Set to 5 for dx9 windowed
;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
;If using a DX9 mode, this changes the resolution
;If using a dx9 mode, this changes the resolution
;The graphics are simply stretched to fit the new window; this does _not_ let you see more of the map
;If set to 0, use Fallout's native resolution
GraphicsWidth=0
GraphicsHeight=0
;Set to 1 to do the palette conversion on the GPU
;Set to 2 to do the palette conversion on the CPU
;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
;GPU is faster, but requires v2.0 pixel shader support
GPUBlt=0
;Set to 1 to allow using 32 bit graphics for talking heads
;Requires graphics mode 4 or 5, and GPUBlt set to 1
;Requires graphics mode 4 or 5, and gpublt set to 1
Use32BitHeadGraphics=0
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
@@ -98,7 +98,7 @@ ReverseMouseButtons=0
BackgroundKeyboard=0
BackgroundMouse=0
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
;The modifier key you have to hold down to change any speed settings
;Set to 0 if you don't want to use a modifier key, or a DX scancode otherwise
@@ -131,25 +131,16 @@ WindowScrollKey=0
ToggleItemHighlightsKey=42
;Set to 1 to also highlight containers
;Set to 2 for purple outlines
HighlightContainers=0
;Set the color of outlines, available colors:
;0x01 - glowing red
;0x02 - red
;0x04 - grey
;0x08 - glowing green
;0x10 - bright yellow
;0x20 - dark yellow
;0x40 - purple
OutlineColor=0x10
;A key to press to reload your currently equipped weapon
ReloadWeaponKey=0
;A key to press to open a debug game editor
DebugEditorKey=0
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
[Misc]
;Time limit in years. Must be between -3 and 13
@@ -173,10 +164,24 @@ WorldMapFPSPatch=1
;Controls the world map speed if WorldMapFPSPatch is 1. Higher values cause slower movement
WorldMapDelay2=66
;Set to 1 to enable Ray's patch to make world map encounter rate independent of your travel speed
;Higher values of WorldMapEncounterRate cause a slower encounter rate
WorldMapEncounterFix=0
WorldMapEncounterRate=5
;XX OBSOLETE XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
;XX
;XX ;This will change the physical speed at which you move across the map
;XX ;Set to 0 to leave at the default. (i.e. limited by vwait in windowed mode, or by processor speed in fullscreen)
;XX ;If set to something other than 0, it enforces a maximum fps on the world map screen.
;XX ;Changing this to something other than 0 is not recommended if you've already applied a world map speed patch to your Fallout exe.
;XX WorldMapFPS=0
;XX
;XX ;Only set to 1 if your systems high performance timer is unreliable for some reason
;XX ForceLowResolutionTimer=0
;XX
;XX ;Set to 1 to enable Ray's patch to make world map encounter rate independent of your travel speed
;XX WorldMapEncounterFix=0
;XX WorldMapEncounterRate=6
;XX
;XX ;Obsolete, but can still be used if you know what it does.
;XX ;WorldMapDelay=0
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
;The number of slots available in the locations list panel of the world map
;Set to 0 to leave unchanged. 17 is default.
@@ -233,7 +238,6 @@ Movie16=artimer4.mve
Movie17=credits.mve
;To change the starting year, month or day, uncomment the next 3 lines
;Both StartMonth and StartDay are 0-indexed
;StartYear=-1
;StartMonth=-1
;StartDay=-1
@@ -253,7 +257,7 @@ PipBoyAvailableAtGameStart=0
;Set to 1 to double the number of available kill types
;If you use this, you need to provide the extra descriptions in proto.msg (entries from 1450 to 1487 are names and 1488 to 1525 are descriptions)
;Changing this option mid game will not invalidate old save games, but the player's kill counters will be completely screwed.
;Changing this option mid game will not invalidate old save games, but the players kill counters will be completely screwed.
;Setting this to 1 may cause problems if the player kills more than 32767 of any one critter type
;Additional kill types must have their new critical tables set! (See the OverrideCriticalTable option)
ExtraKillTypes=0
@@ -275,8 +279,8 @@ TownMapHotkeysFix=1
;Set to 1 to disable the horrigan encounter
DisableHorrigan=0
;Set to 1 to disable the random element in NPC levelling.
;This will cause all NPC party members to automatically level up as soon as the player reaches the requirements
;Set to 1 to disable the random element in npc levelling.
;This will cause all npc party members to automatically level up as soon as the player reaches the requirements
NPCAutoLevel=0
;Change the initial starting location and world map viewport
@@ -301,7 +305,7 @@ SaveInCombatFix=1
;ElevatorsFile=Elevators.ini
;Uncomment and set a comma delimited list of numbers to use a custom xp table.
;Player's level is capped once the highest specified level is reached
;Players level is capped once the highest specified level is reached
;XPTable=50,100,200
;Set to 1 to enable additional weapon animations codes from o-t
@@ -313,7 +317,7 @@ AdditionalWeaponAnims=1
;BodyHit_Head=-40
;BodyHit_Left_Arm=-30
;BodyHit_Right_Arm=-30
;BodyHit_Torso_Uncalled=0
;BodyHit_Torso=0
;BodyHit_Right_Leg=-20
;BodyHit_Left_Leg=-20
;BodyHit_Eyes=-60
@@ -341,7 +345,7 @@ CorpseLineOfFireFix=0
;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
;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, the maximum is 127) to prevent 100% cpu use
ProcessorIdle=-1
;Set to 1 if using the hero appearance mod
@@ -350,17 +354,17 @@ EnableHeroAppearanceMod=0
;Set to 1 to skip the 3 opening movies
SkipOpeningMovies=0
;Causes NPCs who complete their combat turn with ap left over will try and find other ways to spend it.
;Only NPCs with ap left equal to or greater than the value given here will be considered.
;Causes npc's who complete their combat turn with ap left over will try and find other ways to spend it.
;Only npcs with ap left equal to or greater than the value given here will be considered.
;Set to 0 to disable
NPCsTryToSpendExtraAP=0
;Allows the use of tiles over 80*36 in size. sfall will just split and resave them at startup
;Set to 1 to check all tiles on started (slow)
;Set to 2 if you provide a XLtiles.lst file in art/tiles/ containing a list of the tile ids that need checking
;set to 2 if you provide a XLtiles.lst file in art/tiles/ containing a list of the tile ids that need checking
AllowLargeTiles=0
;Change the Skilldex cursor frm numbers
;Change the skilldex cursor frm numbers
;Default is 293 for all skills
Lockpick=293
Steal=293
@@ -382,7 +386,7 @@ UseScrollingQuestsList=1
;PremadeFIDs=201,203,202
;Use this line to modify the list of cities and their associated global variables used for city reputations
;Syntax is 'city id : global id', with each city/global pair separated by a comma.
;Syntax is 'city id : global id',with each city/global pair separated by a comma.
;CityRepsCount=19
;CityRepsList=0:47,2:48,1:49,4:50,5:51,3:52,8:53,6:54,7:55,13:56,10:57,11:59,14:61,17:63,19:64,18:65,25:66,9:294,20:308
@@ -392,12 +396,11 @@ UseScrollingQuestsList=1
;Set to 1 to add additional pages of save slots
ExtraSaveSlots=0
;Set to 1 to speed up the HP/AC counter animations
;Set to 2 to update the HP/AC counters instantly
;Set to 1 to speed up the hp/ac counter animations
;Set to 2 to update the hp/ac counters instantly
SpeedInterfaceCounterAnims=0
;These lines allow you to control the karma frm's displayed on the character screen
;Number of KarmaPoints should be 1 less than number of KarmaFRMs
;KarmaFRMsCount=3
;KarmaFRMs=47,48,49
;KarmaPoints=-100,100
@@ -405,7 +408,7 @@ SpeedInterfaceCounterAnims=0
;Set to 1 to allow science and repair to be used on the player, or 2 for all critters. (Rather than only brahmin/robots)
ScienceOnCritters=0
;Modify this value to change the player's speed of rotation on the inventory and character screens
;Modify this value to change the players speed of rotation on the inventory and character screens
;Default is 166
SpeedInventoryPCRotation=166
@@ -429,7 +432,7 @@ RemoveCriticalTimelimits=0
NPCStage6Fix=0
;Change the colour of the font used on the main menu for the Fallout/sfall version number
;It's the last byte ('3c' by default) that picks the colour used. The first byte supplies additional flags
;It's the last byte ('3c' by default,) that picks the colour used. The first byte supplies additional flags
;MainMenuFontColour=0x0600003c
;Two alternate fixes to the interaction between HtH attacks and the fast shot trait
@@ -450,7 +453,7 @@ BoostScriptDialogLimit=0
;DerivedStats=Stats.ini
;These options modify the checks to see if a critter can carry an additional item, changing which items are counted towards the weight limit and adding an additional size check
;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
;Set the mode to 0 to disable the size check, 1 to apply to 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 extra unused stat (STAT_unused = 10)
;Add 4 to the mode to limit the weight check to used items only
CritterInvSizeLimitMode=0
@@ -556,9 +559,6 @@ DialogOptions9Lines=1
;Set to 1 to leave the music playing in dialogue with talking heads
EnableMusicInDialogue=0
;Set to 1 to prevent the player from running while sneaking without Silent Running perk
DontTurnOffSneakIfYouRun=0
;Set to 1 to fix the bug that unable to sell used geiger counters or stealth boys
CanSellUsedGeiger=1
@@ -606,12 +606,10 @@ DebugMode=0
SkipCompatModeCheck=0
;Set to 1 to skip the executable file size check
;Does not require enabling sfall debugging mode
SkipSizeCheck=0
;If you're testing changes to the Fallout exe, you can override the CRC that sfall looks for here
;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 enabling sfall debugging mode
;ExtraCRC=0x00000000,0x00000000
;Set to 1 to stop Fallout from deleting non readonly protos at startup
Binary file not shown.
Binary file not shown.
@@ -1,24 +1,22 @@
procedure start;
procedure start;
// adjust include paths if needed
#include "..\..\scripting_docs\headers\sfall.h"
#include "..\..\scripting_docs\headers\sfall.h"
#define RESULT_SUCCESS (1)
#define RESULT_FAIL (0)
procedure start begin
if game_loaded then begin
register_hook(HOOK_STEAL);
end else begin
procedure start begin
if not init_hook then begin
variable
thief := get_sfall_arg,
target := get_sfall_arg,
item := get_sfall_arg,
action := get_sfall_arg,
result := RESULT_SUCCESS;
if (thief == dude_obj) then begin
display_msg(sprintf(mstr_skill(570 + result + action*2), obj_name(item)));
set_sfall_return(result);
end
end
if (thief == dude_obj) then begin
display_msg(sprintf(mstr_skill(570 + result + action*2), obj_name(item)));
set_sfall_return(result);
end
end
end
@@ -1,20 +0,0 @@
procedure start;
// adjust include paths if needed
#include "..\..\scripting_docs\headers\sfall.h"
#include "..\..\scripting_docs\headers\dik.h"
procedure start begin
if game_loaded then begin
register_hook(HOOK_KEYPRESS);
end else begin
variable
event := get_sfall_arg,
keyDX := get_sfall_arg;
if (event == 1) and (keyDX == DIK_SEMICOLON) then begin
tap_key(DIK_CAPITAL);
tap_key(DIK_A);
tap_key(DIK_CAPITAL);
end
end
end
Binary file not shown.
@@ -0,0 +1,16 @@
procedure start;
#include ".\HEADERS\dik.h"
procedure start begin
variable event, keyDX;
if not init_hook then begin
event := get_sfall_arg;
keyDX := get_sfall_arg;
if ((event == 1) and (keyDX == DIK_SEMICOLON)) then begin
tap_key(DIK_CAPITAL);
tap_key(DIK_A);
tap_key(DIK_CAPITAL);
end
end
end
@@ -2,8 +2,8 @@
----------------------------------------
- makes pressing the semicolon key send an uppercase A after a semicolon.
- Note: the uppercase A (shift + A if Caps Lock is off) is the built-in hotkey for the TAKE ALL button on the loot screen.
- the uppercase A (shift + A if Caps Lock is off) is the built-in hotkey for the TAKE ALL button on the loot screen.
To use, copy *.int file to your scripts folder.
To use, copy hs_keypress.int file to your scripts folder.
This mod is a simple example of how you can use HOOK_KEYPRESS hooks.
+3 -2
View File
@@ -83,7 +83,6 @@
#define PROTO_IT_SIZE (112)
#define PROTO_IT_WEIGHT (116)
#define PROTO_IT_COST (120)
#define PROTO_IT_INV_FID (124)
// weapons
#define PROTO_WP_ANIM (36)
@@ -160,10 +159,11 @@
#define PROTO_DR_ADDICT_DELAY (100)
// critters
#define PROTO_CR_FLAGS (32)
#define PROTO_CR_ACTION_FLAGS (32)
#define PROTO_CR_HEAD_FID (40)
#define PROTO_CR_AI_PACKET (44)
#define PROTO_CR_TEAM_NUM (48)
#define PROTO_CR_FLAGS (52)
#define PROTO_CR_BODY_TYPE (388)
#define PROTO_CR_KILL_EXP (392)
#define PROTO_CR_KILL_TYPE (396)
@@ -224,4 +224,5 @@
#define WPN_ANIM_MINIGUN (0x09) // (L)
#define WPN_ANIM_ROCKET_LAUNCHER (0x0A) // (M)
#endif // DEFINE_EXTRA_H
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
-162
View File
@@ -1,162 +0,0 @@
#ifndef LIB_INVEN_H
#define LIB_INVEN_H
#include "define_lite.h"
/**
Inventory contents as temp array to be used in foreach
*/
procedure inven_as_array(variable critter) begin
variable i:=0, list;
list := temp_array(100, 4);
while (inven_ptr(critter, i)) do begin
if (i>=len_array(list)) then
resize_array(list, len_array(list) + 100);
list[i] := inven_ptr(critter, i);
i++;
end
resize_array(list, i);
return list;
end
procedure add_items_pid(variable who_obj, variable the_pid, variable pid_qty) begin
variable item;
item := create_object(the_pid,0,0);
add_mult_objs_to_inven(who_obj, item, (pid_qty));
return item;
end
// aliases:
#define add_item_pid(obj, pid) add_items_pid(obj, pid, 1)
#ifndef critter_wearing_armor
#define critter_wearing_armor(x) (obj_item_subtype(critter_inven_obj(x,INVEN_TYPE_WORN)) == item_type_armor)
#endif
procedure unwield_armor(variable who_obj) begin
variable armor;
if (not(who_obj)) then return;
if (critter_wearing_armor(who_obj)) then begin
armor := critter_inven_obj(who_obj,INVEN_TYPE_WORN);
rm_obj_from_inven(who_obj, armor);
add_obj_to_inven(who_obj, armor);
end
end
procedure remove_items_pid(variable who_obj, variable the_pid, variable pid_qty) begin
variable begin
item;
removed_qty;
tmp;
end
if (not(who_obj)) then return;
removed_qty := obj_is_carrying_obj_pid(who_obj,the_pid);
if (pid_qty < removed_qty and pid_qty != -1) then begin
removed_qty := pid_qty;
end
if (removed_qty > 0) then begin
item := obj_carrying_pid_obj(who_obj, the_pid);
if (obj_type(who_obj) == 1) then begin
if (critter_inven_obj(who_obj,INVEN_TYPE_WORN) == item) then begin
call unwield_armor(who_obj);
end else if ((critter_inven_obj(who_obj, INVEN_TYPE_LEFT_HAND) == item) or (critter_inven_obj(who_obj, INVEN_TYPE_RIGHT_HAND) == item)) then begin
inven_unwield(who_obj);
end
end
tmp := rm_mult_objs_from_inven(who_obj, item, removed_qty);
destroy_object(item);
end
end
procedure remove_item_obj(variable who_obj, variable item) begin
if (obj_type(who_obj) == 1) then begin
if (critter_inven_obj(who_obj,INVEN_TYPE_WORN) == item) then begin
call unwield_armor(who_obj);
end else if ((critter_inven_obj(who_obj, INVEN_TYPE_LEFT_HAND) == item) or (critter_inven_obj(who_obj, INVEN_TYPE_RIGHT_HAND) == item)) then begin
inven_unwield(who_obj);
end
end
rm_obj_from_inven(who_obj, item);
destroy_object(item);
end
// aliases:
#define remove_item_pid(obj, pid) remove_items_pid(obj, pid, 1)
#define remove_all_items_pid(obj, pid) remove_items_pid(obj, pid, -1)
/**
Set item quantity in inventory, by item pid
*/
procedure set_items_qty_pid(variable invenobj, variable itempid, variable newcount)
begin
variable begin
count;
obj;
end
count := obj_is_carrying_obj_pid(invenobj, itempid);
if (newcount > count) then begin
obj := create_object_sid(itempid, 0, 0, -1);
add_mult_objs_to_inven(invenobj, obj, newcount - count);
end else if (newcount < count) then begin
call remove_items_pid(invenobj, itempid, count - newcount);
end
end
/*
procedure check_restock_item(the_item, min_amt, max_amt, res_perc)
restock_amt := random(min_amt, max_amt);
if (obj_is_carrying_obj_pid(self_obj, the_item) < restock_amt) then begin
if (res_perc >= random(1,100)) then begin
stock_pid_qty(self_obj, the_item, restock_amt)
end
end else begin
stock_pid_qty(self_obj, the_item, restock_amt)
end
procedure check_restock_item_min_limit(the_item, min_amt, max_amt, res_perc)
if (obj_is_carrying_obj_pid(self_obj, the_item) < min_amt) then begin
check_restock_item(the_item, min_amt, max_amt, res_perc)
end
*/
procedure reduce_merchant_loot(variable critter, variable moneyPercent, variable probArmor, variable probDrugs, variable probWeapons, variable probAmmo, variable probMisc) begin
variable inv, item, it, prob, tmp;
inv := inven_as_array(critter);
item_caps_adjust(critter, -(item_caps_total(critter) * moneyPercent / 100));
//display_msg("total items "+len_array(inv));
foreach item in inv begin
if (obj_pid(item) != PID_BOTTLE_CAPS) then begin
it := obj_item_subtype(item);
if (it == item_type_armor) then
prob := probArmor;
else if (it == item_type_drug) then
prob := probDrugs;
else if (it == item_type_weapon) then
prob := probWeapons;
else if (it == item_type_ammo) then
prob := probAmmo;
else
prob := probMisc;
if (random(0, 99) < prob) then begin
//display_msg("remove "+obj_name(item));
call remove_all_items_pid(critter, obj_pid(item));
end
end
end
end
procedure item_by_attack_type(variable critter, variable type) begin
variable slot;
if (type > 3 and type != ATKTYPE_LWEP_RELOAD and type != ATKTYPE_RWEP_RELOAD) then
return 0;
if (type < 2 or type == ATKTYPE_LWEP_RELOAD) then
slot := INVEN_TYPE_LEFT_HAND;
else
slot := INVEN_TYPE_RIGHT_HAND;
return critter_inven_obj(critter, slot);
end
#endif
-47
View File
@@ -1,47 +0,0 @@
#ifndef LIB_MATH_H
#define LIB_MATH_H
/**
Numbers...
*/
#define MAX(x, y) ((x > y) * x + (x <= y) * y)
#define MIN(x, y) ((x < y) * x + (x >= y) * y)
#define in_range(x, from, to) (x >= from and x <= to)
procedure max(variable x, variable y) begin
if (x > y) then return x;
return y;
end
procedure min(variable x, variable y) begin
if (x < y) then return x;
return y;
end
/*procedure round(variable val) begin
variable intp;
intp := floor(val);
if ((val-intp) >= 0.5) then intp++;
return intp;
end*/
procedure ceil(variable val) begin
variable intp;
intp := floor(val);
if (abs(val-intp) > 0.0) then begin
intp++;
end
return intp;
end
procedure cap_number(variable num, variable min, variable max) begin
if (num > max) then num := max;
else if (num < min) then num := min;
return num;
end
#endif
-85
View File
@@ -1,85 +0,0 @@
#ifndef LIB_MISC_H
#define LIB_MISC_H
/**
Some generic procedures
*/
/*
procedure round(variable val) begin
variable intp;
intp := floor(val);
if ((val-intp) >= 0.5) then intp++;
return intp;
end*/
// this fixes strange behavior when using negative float values
// looks like the only way to create correct negative float is to use atof()
// DEPRECATED as of sfall 3.4 (engine bug fixed)
/*procedure itof_safe(variable var) begin
if (var < 0) then begin
var := atof("-"+(-var));
end
return var;
end*/
// Parse keyboard shortcut definition
procedure parse_hotkey(variable string) begin
variable lst;
variable n;
lst := string_split(string, "+");
if (len_array(lst) == 0) then
return 0;
n := atoi(lst[0]);
if (len_array(lst) > 1) then
n += atoi(lst[1])*0x10000;
return n;
end
// Check if shortcut is pressed
procedure hotkey_pressed(variable n) begin
if (n < 0x10000) then
return key_pressed(n);
else
return key_pressed(n bwand 0xFFFF) and key_pressed((n bwand 0xFFFF0000) / 0x10000);
end
// same as above, but suited for hs_keypress hook when keycode is already known
procedure hotkey_pressed_now(variable n, variable key) begin
if (n < 0x10000) then
return key == n;
else begin
variable k1 := (n bwand 0xFFFF),
k2 := ((n bwand 0xFFFF0000) / 0x10000);
if (k1 == key) then begin
if (key_pressed(k2)) then return true;
end else if (k2 == key) then begin
if (key_pressed(k1)) then return true;
end
return false;
end
end
/**
Attempt to make list_as_array safe
*/
/*procedure list_as_array_safe(variable type) begin
variable list, item, arr, i;
list := list_begin(type);
arr := temp_array(100, 4);
i := 0;
item := list_next(list);
while (item) do begin
if (len_array(arr) == i) then resize_array(arr, len_array(arr) + 100);
arr[i] := item;
item := list_next(list);
i++;
end
resize_array(arr, i);
list_end(list);
return arr;
end*/
#endif
-243
View File
@@ -1,243 +0,0 @@
/**
This library contains procedures to work with strings.
@author phobos2077
*/
#ifndef LIB_STRINGS_H
#define LIB_STRINGS_H
#define is_in_string(str, substr) (string_pos(str, substr) != -1)
#define string_starts_with(str, substr) (string_pos(str, substr) == 0)
/**
* Returns position of first occurance of substr in str, or -1 if not found
*/
procedure string_pos(variable str, variable subst) begin
variable lst, n;
lst := string_split(str, subst);
if (len_array(lst) < 2) then
return -1;
return strlen(lst[0]);
end
/**
* Join array of strings using delimeter
*/
procedure string_join(variable array, variable join) begin
variable str, i, len;
str := "";
len := len_array(array);
if (len > 0) then begin
str := array[0];
for (i:=1; i<len; i++) begin
str += join + array[i];
end
end
return str;
end
/**
* replaces all occurances of substring in a string with another substring
*/
#define string_replace(str, search, replace) (string_join(string_split(str, search), replace))
/**
* sprintf with two arguments
*/
procedure sprintf2(variable str, variable arg1, variable arg2) begin
variable split, len, i, j, arg;
split := string_split(str, "%");
len := len_array(split);
str := "";
if (len > 0) then begin
str := split[0];
j := 0;
for (i := 1; i < len; i++) begin
if (split[i] == "") then begin
if (i < len - 1) then begin
str += "%" + split[i+1];
i++;
end
end else begin
if (j == 0) then
arg := arg1;
else if (j == 1) then
arg := arg2;
else
arg := 0;
str += sprintf("%" + split[i], arg);
j++;
end
end
end
return str;
end
/**
* sprintf with unlimited number of arguments
*/
procedure sprintf_array(variable str, variable args) begin
variable split, len, i, j;
split := string_split(str, "%");
len := len_array(split);
str := "";
if (len > 0) then begin
str := split[0];
j := 0;
for (i := 1; i < len; i++) begin
if (split[i] == "") then begin
if (i < len - 1) then begin
str += "%" + split[i+1];
i++;
end
end else begin
str += sprintf("%" + split[i], args[j]);
j++;
end
end
end
return str;
end
/**
* Returns position of last occurance of substr in str, or -1 if not found
*/
/*procedure string_rpos(variable str, variable substr) begin
variable lst, n;
lst := string_split(str, substr);
n := len_array(lst);
if (n < 2) then
return -1;
return string_len(str) - (string_len(lst[n-1]) + string_len(substr));
end*/
/**
* Basically the same as string_split, but delim is of type char instead of string
*/
procedure string_get_tokens(variable str, variable delim) begin
variable lst, line, token, maxlen, len, count;
count := 1;
maxlen := 4;
token := tokenize(str, 0, delim);
//if (token != 0) then
//count := 1;
line := token;
while (line != str) do begin
count += 1;
len := strlen(token);
if (len > maxlen) then
maxlen := len;
token := tokenize(str, line, delim);
if (token != 0) then
line += delim + token;
end
//end
return count;
end
procedure string_repeat(variable str, variable count) begin
variable out := "", i := 0;
while (i < count) do begin
out += str;
i++;
end
return out;
end
/**
* Workaround for string_split bug in sfall 3.3
* DEPRECATED as of sfall 3.4 (bug fixed)
*/
procedure string_split_safe(variable str, variable split) begin
variable lst;
str += split;
lst := string_split(str, split);
resize_array(lst, len_array(lst) - 1);
return lst;
end
/**
* The same as sfall string_split, but returns array of integers instead
* Useful in cunjunction with is_in_array()
*/
procedure string_split_ints(variable str, variable split) begin
variable i := 0;
variable list;
list := string_split(str, split);
while (i < len_array(list)) do begin
list[i] := atoi(list[i]);
i++;
end
return list;
end
/**
String parse functions. Idea taken from KLIMaka on TeamX forums.
Placeholders in format %d% are replaced from string. d refers to variable index (starting from 1).
You can repeat one placeholder multiple times, or use placeholders in any order.
Example:
parse_str_2("Hello, %2%. I have only $%1% to spare.", money_amount, dude_name);
Will return:
Hello, Killiano. I have only $1200 to spare.
The *_list function takes a temp_array as second parameter.
*/
#define _TOKENIZE_BEGIN \
variable token, rest, line, result, n; \
line := tokenize(str, 0, '%'); \
result := line; \
while line != str do begin \
token := tokenize(str, line, '%'); \
line += "%" + token; \
if token == "" then result += "%"; \
else begin
#define _TOKENIZE_END \
end \
rest := tokenize(str, line, '%'); \
if (rest != 0) then begin \
line += "%" + rest; \
result += rest; \
end \
end \
return result;
procedure parse_str_list(variable str, variable list) begin
_TOKENIZE_BEGIN
n := atoi(token) - 1;
if (n >= 0 and n < len_array(list)) then result += list[n];
_TOKENIZE_END
end
procedure parse_str_2(variable str, variable x1, variable x2) begin
_TOKENIZE_BEGIN
n := atoi(token);
if (n == 1) then result += x1;
else if (n == 2) then result += x2;
_TOKENIZE_END
end
procedure parse_str_4(variable str, variable x1, variable x2, variable x3, variable x4) begin
_TOKENIZE_BEGIN
n := atoi(token);
if (n == 1) then result += x1;
else if (n == 2) then result += x2;
else if (n == 3) then result += x3;
else if (n == 4) then result += x4;
_TOKENIZE_END
end
#undef _TOKENIZE_BEGIN
#undef _TOKENIZE_END
#endif
+6 -6
View File
@@ -189,10 +189,10 @@
#define party_member_list_all party_member_list(1)
#define critter_inven_obj2(obj, type) sfall_func2("critter_inven_obj2", obj, type)
#define exec_map_update_scripts sfall_func0("exec_map_update_scripts")
#define intface_hide sfall_func0("intface_hide")
#define intface_is_hidden sfall_func0("intface_is_hidden")
#define intface_redraw sfall_func0("intface_redraw")
#define intface_show sfall_func0("intface_show")
#define spatial_radius(obj) sfall_func1("spatial_radius", obj)
#define critter_inven_obj2(obj, type) sfall_func2("critter_inven_obj2", obj, type)
#define intface_redraw sfall_func0("intface_redraw")
#define intface_hide sfall_func0("intface_hide")
#define intface_show sfall_func0("intface_show")
#define intface_is_hidden sfall_func0("intface_is_hidden")
#define exec_map_update_scripts sfall_func0("exec_map_update_scripts")
+36 -64
View File
@@ -6,48 +6,29 @@ Hook scripts are specially named scripts that are run by sfall at specific point
In addition to the bit of code it overrides, the script will be run once when first loaded and again at each player reload to allow for setup. Hook scripts have access to a set of arguments supplied to sfall, but aren't required to use them all. They also return one or more values, but again they're optional, and you only need to return a value if you want to override the default.
To aid in mods compatibility, avoid using hs_xxx .int scripts. Instead it is recommended to use a normal global script combined with register_hook_proc or register_hook.
As good practise to aid in mod compatibility, only use the hs_xxx .int script if you are setting return values. For any other scripts, use a normal global script combined with register_hook or register_hook_proc.
Example setup for a hook-script based mod:
There are script functions specific to hook scripts:
procedure tohit_hook_handler begin
display_msg("Modifying hit_hook " + get_sfall_arg);
set_hit_chance_max(100);
set_sfall_return(100);
end
procedure start begin
if game_loaded then begin
register_hook_proc(HOOK_TOHIT, tohit_hook_handler);
end
end
There are script functions available, specific to hook scripts:
> int init_hook()
int init_hook()
The hook script equivilent of game_loaded; it returns 2 when the script is first loaded, 1 when the player reloads and 0 otherwise.
> mixed get_sfall_arg()
mixed get_sfall_arg()
Gets the next argument from sfall. Each time it's called it returns the next argument, or otherwise it returns 0 if there are no more arguments left.
> array get_sfall_args()
int get_sfall_args()
Returns all hook arguments as a new temp array.
> void set_sfall_return(int value)
void set_sfall_return(int value)
Used to return the new values from the script. Each time it's called it sets the next value, or if you've already set all return values it does nothing.
> void set_sfall_arg(int argnum, int value)
Changes argument value. The argument number (argnum) is 0-indexed. This is usefull if you have several hook scripts attached to one hook point (see below).
void set_sfall_arg(int argnum, int value)
Changes argument value. This is usefull if you have several hook scripts attached to one hook point (see below).
> void register_hook(int hooktype)
void register_hook(int hooktype)
Used from a normal global script if you want to run it at the same point a full hook script would normally run. In case of this function, "start" proc will be execuded in a current global script. You can use all above functions like normal.
> void register_hook_proc(int hooktype, proc procedure)
void register_hook_proc(int hooktype, proc procedure)
The same as register_hook, except that you specifically define which procedure in the current script should be called as a hook (instead of "start"). Pass procedure the same as how you use dialog option functions. This IS the recommended way to use hook scripts, as it gives both modularity (each mod logic in a separate global script, no conflicts if you don't use "hs_*.int" scripts) and flexibility (you can place all related hook scripts for specific mod in a single script!).
NOTE: you can hook several scripts to a single hook point, for example if it's different mods from different authors or just some different aspects of one larger mod. In this case scripts are executed in reverse order of how they were registered. When one of the scripts in a chain returns value with "set_sfall_return", the next script may override this value if calls "set_sfall_return" again. Sometimes you need to multiply certain value in a chain of hook scripts.
@@ -58,13 +39,13 @@ Example: let's say we have a Mod A which reduces all "to hit" chances by 50%. Th
Mod B also want to affect hit chances globally, by increasing them by 50%. Now in order for both mods to work well together, we need to add this line to Mod A hook script:
set_sfall_arg(0, (original_chance / 2));
set_sfall_arg(original_chance / 2);
This basically changes hook argument for the next script. Mod B code:
original_chance = get_sfall_arg;
set_sfall_return(original_chance * 1.5);
set_sfall_arg(0, (original_chance * 1.5));
set_sfall_arg(original_chance * 1.5);
So if you combine both mods together, they will run in chain and the end result will be a 75% from original hit chance (hook register order doesn't matter in this case, if you use "set_sfall_arg" in both hooks).
@@ -75,7 +56,7 @@ The defines to use for the hooktype are in sfall.h.
----------- HOOK SCRIPT TYPES -------------
-------------------------------------------
HOOK_TOHIT (hs_tohit.int)
hs_tohit.int
Runs when fallout is calculating the chances of an attack striking a target
Runs after the hit chance is fully calculated normally, including applying the 95% cap
@@ -84,15 +65,12 @@ int arg1 - The unmodified hit chance
critter arg2 - The attacker
critter arg3 - The target of the attack
int arg4 - The targeted bodypart
int arg5 - Source tile (may differ from attacker's tile, when AI is considering potential fire position)
int arg6 - Attack Type (one of ATKTYPE_*)
int arg7 - Ranged flag (0 or 1, actually passed 1 even for unarmed attacks, may be a vanilla bug)
int ret1 - the new hit chance
-------------------------------------------
HOOK_AFTERHITROLL (hs_afterhitroll.int)
hs_afterhitroll.int
Runs after fallout has decided if an attack will hit or miss
@@ -108,7 +86,7 @@ critter ret3 - Override the target of the attack
-------------------------------------------
HOOK_CALCAPCOST (hs_calcapcost.int)
hs_calcapcost.int
Runs whenever fallout is calculating the ap cost of using the weapon (or unarmed attack). Doesn't run for using other item types or moving.
Note that the first time a game is loaded, this script doesn't run before the initial interface is drawn, so if the script effects the ap cost of whatever is in the players hands at the time the wrong ap cost will be shown. It will be fixed the next time the interface is redrawn.
@@ -123,7 +101,7 @@ int ret1 - The new ap cost
-------------------------------------------
HOOK_DEATHANIM1 (hs_deathanim1.int)
hs_deathanim1.int
Runs before fallout tries to calculate the death animation. Lets you switch out which weapon fallout sees
@@ -136,7 +114,7 @@ int ret1 - The pid of an object to override the attacking weapon with
-------------------------------------------
HOOK_DEATHANIM2 (hs_deathanim2.int)
hs_deathanim2.int
Runs after fallout has calculated the death animation. Lets you set your own custom frame id, so more powerful than hs_deathanim1, but performs no validation.
When using critter_dmg function, this script will also run. In that case weapon pid will be -1 and target will point to an object with obj_art_fid == 0x20001F5.
@@ -151,7 +129,7 @@ int ret1 - The death anim id to override with
-------------------------------------------
HOOK_COMBATDAMAGE (hs_combatdamage.int)
hs_combatdamage.int
Runs when:
1) Game calculates how much damage each target will get. This includes primary target as well as all extras (explosions and bursts). This happens BEFORE the actual attack animation.
@@ -166,10 +144,9 @@ int arg5 - The special effect flags for the target
int arg6 - The special effect flags for the attacker
int arg7 - The weapon used in the attack
int arg8 - The bodypart that was struck
int arg9 - Damage Multipiler (this is divided by 2, so a value of 3 does 1.5x damage, and 8 does 4x damage. Usually it's 2, but with Silent Death perk and the corresponding attack conditions, it's 4; for critical hits, the value is taken from the critical table)
int arg9 - Roll result of the attack (check with is_success, etc functions; basically: 0-crit. fail, 1-fail, 2-success, 3-crit. success)
int arg10 - Number of bullets actually hit the target (1 for melee attacks)
int arg11 - The amount of knockback to the target
int arg12 - Attack Type (see ATKTYPE_* constants)
int ret1 - The damage to the target
int ret2 - The damage to the attacker
@@ -179,7 +156,7 @@ int ret5 - The amount of knockback to the target
-------------------------------------------
HOOK_ONDEATH (hs_ondeath.int)
hs_ondeath.int
Runs immediately after a critter dies for any reason. No return values; this is just a convinence for when you need to do something after death for a large number of different critters and don't want to have to script each and every one of them.
@@ -187,7 +164,7 @@ Critter arg1 - The critter that just died
-------------------------------------------
HOOK_FINDTARGET (hs_findtarget.int)
hs_findtarget.int
Runs when the ai is trying to pick a target in combat. Fallout first chooses a list of 4 likely suspects, then normally sorts them in order of weakness/distance/etc depending on the ai caps of the attacker. This hook replaces that sorting function, allowing you to sort the targets in some arbitrary way. Use sfall_return to give the 4 targets, in order of preference. All 4 must be given if you want to override normal sorting; if you want to specify less than 4 targets fill in the extra spaces with 0's. If you do not give 4 targets, the npcs normal sorting mechanism will be used.
@@ -206,7 +183,7 @@ critter ret4 - The fourth choice of target
-------------------------------------------
HOOK_USEOBJON (hs_useobjon.int)
hs_useobjon.int
Runs when:
1) a critter uses an object on another critter. (Or themselves)
@@ -224,7 +201,7 @@ int ret1 - overrides hard-coded handler and selects what should happen with
-------------------------------------------
HOOK_USEOBJ (hs_useobj.int)
hs_useobj.int
Runs when:
1) a critter uses an object from inventory which have "Use" action flag set or it's an active flare or dynamite.
@@ -240,7 +217,7 @@ int ret1 - overrides hard-coded handler and selects what should happen with
-------------------------------------------
HOOK_REMOVEINVENOBJ (hs_removeinvenobj.int)
hs_removeinvenobj.int
Runs when an object is removed from a critters inventory for any reason
@@ -251,25 +228,22 @@ int arg4 - The reason the object is being removed. (Actually, the site from
-------------------------------------------
HOOK_BARTERPRICE (hs_barterprice.int)
hs_barterprice.int
Runs whenever the value of goods being purchased is calculated
critter arg1 - the critter doing the bartering (either dude_obj or inven_dude)
critter arg2 - the critter being bartered with
int arg3 - the default value of the goods
critter arg4 - table of requested goods (being bought from NPC)
critter arg4 - the barter critter (has all of the goods being traded in its inventory)
int arg5 - the amount of actual caps in the barter stack (as opposed to goods)
int arg6 - the value of all goods being traded before skill modifications
critter arg7 - table of offered goods (being sold to NPC)
int arg8 - the total cost of the goods offered by the player
int arg9 - set 1 if the "offers" button was pressed (not for a party member), otherwise 0
int ret1 - the modified value of all of the goods
-------------------------------------------
HOOK_MOVECOST (hs_movecost.int)
hs_movecost.int
Runs when calculating the ap cost of movement
@@ -303,7 +277,7 @@ object* ret1 - 0 if the hex doesn't block, or any sort of object pointer if it d
-------------------------------------------
HOOK_ITEMDAMAGE (hs_itemdamage.int)
hs_itemdamage.int
Runs when retriving the damage rating of the players used weapon. (Which may be their fists.)
@@ -319,7 +293,7 @@ int ret2 - The new maximum damage
-------------------------------------------
HOOK_AMMOCOST (hs_ammocost.int)
hs_ammocost.int
Runs when calculating ammo cost for a weapon. Doesn't affect damage, only how much ammo is spent.
By default, weapon will shoot when at least 1 round is left, regardless of ammo cost calculations.
@@ -335,7 +309,7 @@ int ret1 - new ammo cost value (set to 0 for unlimited ammo)
-------------------------------------------
HOOK_KEYPRESS (hs_keypress.int)
hs_keypress.int
Runs once every time when any key was pressed or released.
DX codes: (see dik.h header)
@@ -347,7 +321,7 @@ int arg3 - key VK code (very similar to ASCII codes)
-------------------------------------------
HOOK_MOUSECLICK (hs_mouseclick.int)
hs_mouseclick.int
Runs once every time when a mouse button was pressed or release.
@@ -356,7 +330,7 @@ int arg2 - button number (0 - left, 1 - right, up to 7)
-------------------------------------------
HOOK_USESKILL (hs_useskill.int)
hs_useskill.int
Runs when using any skill on any object.
@@ -373,7 +347,7 @@ int ret1 - overrides hard-coded handler (-1 - use engine handler, any other
-------------------------------------------
HOOK_STEAL (hs_steal.int)
hs_steal.int
Runs when checking an attempt to steal or plant an item in other inventory using Steal skill.
@@ -389,7 +363,7 @@ int ret1 - overrides hard-coded handler (1 - force success, 0 - force fail,
-------------------------------------------
HOOK_WITHINPERCEPTION (hs_withinperception.int)
hs_withinperception.int
Runs when checking if one critter sees another critter. This is used in different situations like combat AI. You can override the result.
@@ -405,7 +379,7 @@ int ret1 - overrides the returned result of the function: 0 - not in range (
-------------------------------------------
HOOK_INVENTORYMOVE (hs_inventorymove.int)
hs_inventorymove.int
Runs before moving items between inventory slots in dude interface. You can override the action.
What you can NOT do with this hook:
@@ -424,12 +398,10 @@ int ret1 - Override setting (-1 - use engine handler, any other value - prev
-------------------------------------------
HOOK_INVENWIELD (hs_invenwield.int)
hs_invenwield.int
Runs before wielding or unwielding an armor or a weapon by a critter (except when using inventory by PC).
An example usage would be to change critter art depending on armor being used or to dynamically customize weapon animations.
NOTE: when replacing a previously wielded armor or weapon, the unwielding hook will not be executed.
If you need to rely on this, try checking if armor/weapon already equipped when wielding hook is executed.
Critter arg1 - critter
Obj arg2 - item being wielded or unwielded (weapon/armor), may be 0 when unwielding
@@ -106,9 +106,6 @@ array - array ID to be used with array-related functions (actually an integer)
> int get_npc_level(string npc)
- also takes the npc name as an argument, and returns the npc's current level. Again, the npc needs to be in your party.
> void set_car_current_town(int town)
- changes the current town index for the player's car
> int get_ini_setting(string setting)
- reads an integer value from an ini file in the fallout directory.
- It only takes a single argument; seperate the file name, section and key with a '|' character; e.g. 'myvar:=get_ini_setting("myini.ini|mysec|var1")' If the file or key cannot be found, -1 is returned.

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