mirror of
https://github.com/sfall-team/sfall.git
synced 2026-07-27 16:52:34 -07:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5786cfb267 | ||
|
|
78dfb530a9 | ||
|
|
d588f2e691 | ||
|
|
daf7a82997 | ||
|
|
9ad2b19e1a | ||
|
|
4b66dd3682 | ||
|
|
4899aeece1 | ||
|
|
946266e367 | ||
|
|
438ea071fc | ||
|
|
89760235c7 | ||
|
|
321f1c6034 | ||
|
|
513338f160 | ||
|
|
08b92542f4 | ||
|
|
46013c94b0 | ||
|
|
7a4ab59089 | ||
|
|
e505e204cb | ||
|
|
7343754d53 | ||
|
|
ae1e17d359 | ||
|
|
32dbe5581d | ||
|
|
a93ad5a9ba | ||
|
|
874b047ce1 | ||
|
|
afa590c5a8 | ||
|
|
b89c52fcec | ||
|
|
ec2d323f75 | ||
|
|
586679b07f |
@@ -7,6 +7,34 @@
|
|||||||
; have an additional NoHardcode option in this file which can
|
; have an additional NoHardcode option in this file which can
|
||||||
; be used to remove their hardcoded effects, and add new stat/skill effects
|
; be used to remove their hardcoded effects, and add new stat/skill effects
|
||||||
|
|
||||||
|
;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
|
;This is a modification to perk 119
|
||||||
[119]
|
[119]
|
||||||
Name=Example
|
Name=Example
|
||||||
@@ -36,4 +64,4 @@ Name=Example
|
|||||||
Desc=This is an example trait
|
Desc=This is an example trait
|
||||||
Image=72
|
Image=72
|
||||||
StatMod=0|-1 ;Subtract 1 from strength
|
StatMod=0|-1 ;Subtract 1 from strength
|
||||||
SkillMod=0|20|1|-5 ;Add 20 to the players small guns skill and subtract 5 from big guns
|
SkillMod=0|20|1|-5 ;Add 20 to the player's small guns skill and subtract 5 from big guns
|
||||||
|
|||||||
+6
-3
@@ -1,5 +1,5 @@
|
|||||||
;sfall configuration settings
|
;sfall configuration settings
|
||||||
;v3.8.4
|
;v3.8.6
|
||||||
|
|
||||||
[Main]
|
[Main]
|
||||||
;Change to 1 if you want to use command line args to tell sfall to use another ini file.
|
;Change to 1 if you want to use command line args to tell sfall to use another ini file.
|
||||||
@@ -382,7 +382,7 @@ UseScrollingQuestsList=1
|
|||||||
;PremadeFIDs=201,203,202
|
;PremadeFIDs=201,203,202
|
||||||
|
|
||||||
;Use this line to modify the list of cities and their associated global variables used for city reputations
|
;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
|
;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
|
;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
|
||||||
|
|
||||||
@@ -429,7 +429,7 @@ RemoveCriticalTimelimits=0
|
|||||||
NPCStage6Fix=0
|
NPCStage6Fix=0
|
||||||
|
|
||||||
;Change the colour of the font used on the main menu for the Fallout/sfall version number
|
;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
|
;MainMenuFontColour=0x0600003c
|
||||||
|
|
||||||
;Two alternate fixes to the interaction between HtH attacks and the fast shot trait
|
;Two alternate fixes to the interaction between HtH attacks and the fast shot trait
|
||||||
@@ -556,6 +556,9 @@ DialogOptions9Lines=1
|
|||||||
;Set to 1 to leave the music playing in dialogue with talking heads
|
;Set to 1 to leave the music playing in dialogue with talking heads
|
||||||
EnableMusicInDialogue=0
|
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
|
;Set to 1 to fix the bug that unable to sell used geiger counters or stealth boys
|
||||||
CanSellUsedGeiger=1
|
CanSellUsedGeiger=1
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
+13
-11
@@ -1,22 +1,24 @@
|
|||||||
procedure start;
|
procedure start;
|
||||||
// adjust include paths if needed
|
// adjust include paths if needed
|
||||||
#include "..\..\scripting_docs\headers\sfall.h"
|
#include "..\..\scripting_docs\headers\sfall.h"
|
||||||
|
|
||||||
#define RESULT_SUCCESS (1)
|
#define RESULT_SUCCESS (1)
|
||||||
#define RESULT_FAIL (0)
|
#define RESULT_FAIL (0)
|
||||||
|
|
||||||
procedure start begin
|
procedure start begin
|
||||||
if not init_hook then begin
|
if game_loaded then begin
|
||||||
|
register_hook(HOOK_STEAL);
|
||||||
|
end else begin
|
||||||
variable
|
variable
|
||||||
thief := get_sfall_arg,
|
thief := get_sfall_arg,
|
||||||
target := get_sfall_arg,
|
target := get_sfall_arg,
|
||||||
item := get_sfall_arg,
|
item := get_sfall_arg,
|
||||||
action := get_sfall_arg,
|
action := get_sfall_arg,
|
||||||
result := RESULT_SUCCESS;
|
result := RESULT_SUCCESS;
|
||||||
|
|
||||||
if (thief == dude_obj) then begin
|
if (thief == dude_obj) then begin
|
||||||
display_msg(sprintf(mstr_skill(570 + result + action*2), obj_name(item)));
|
display_msg(sprintf(mstr_skill(570 + result + action*2), obj_name(item)));
|
||||||
set_sfall_return(result);
|
set_sfall_return(result);
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,20 @@
|
|||||||
|
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.
@@ -1,16 +0,0 @@
|
|||||||
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.
|
- makes pressing the semicolon key send an uppercase A after a semicolon.
|
||||||
- the uppercase A (shift + A if Caps Lock is off) is the built-in hotkey for the TAKE ALL button on the loot screen.
|
- 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.
|
||||||
|
|
||||||
To use, copy hs_keypress.int file to your scripts folder.
|
To use, copy *.int file to your scripts folder.
|
||||||
|
|
||||||
This mod is a simple example of how you can use HOOK_KEYPRESS hooks.
|
This mod is a simple example of how you can use HOOK_KEYPRESS hooks.
|
||||||
|
|||||||
@@ -83,6 +83,7 @@
|
|||||||
#define PROTO_IT_SIZE (112)
|
#define PROTO_IT_SIZE (112)
|
||||||
#define PROTO_IT_WEIGHT (116)
|
#define PROTO_IT_WEIGHT (116)
|
||||||
#define PROTO_IT_COST (120)
|
#define PROTO_IT_COST (120)
|
||||||
|
#define PROTO_IT_INV_FID (124)
|
||||||
|
|
||||||
// weapons
|
// weapons
|
||||||
#define PROTO_WP_ANIM (36)
|
#define PROTO_WP_ANIM (36)
|
||||||
@@ -159,11 +160,10 @@
|
|||||||
#define PROTO_DR_ADDICT_DELAY (100)
|
#define PROTO_DR_ADDICT_DELAY (100)
|
||||||
|
|
||||||
// critters
|
// critters
|
||||||
#define PROTO_CR_ACTION_FLAGS (32)
|
#define PROTO_CR_FLAGS (32)
|
||||||
#define PROTO_CR_HEAD_FID (40)
|
#define PROTO_CR_HEAD_FID (40)
|
||||||
#define PROTO_CR_AI_PACKET (44)
|
#define PROTO_CR_AI_PACKET (44)
|
||||||
#define PROTO_CR_TEAM_NUM (48)
|
#define PROTO_CR_TEAM_NUM (48)
|
||||||
#define PROTO_CR_FLAGS (52)
|
|
||||||
#define PROTO_CR_BODY_TYPE (388)
|
#define PROTO_CR_BODY_TYPE (388)
|
||||||
#define PROTO_CR_KILL_EXP (392)
|
#define PROTO_CR_KILL_EXP (392)
|
||||||
#define PROTO_CR_KILL_TYPE (396)
|
#define PROTO_CR_KILL_TYPE (396)
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,162 @@
|
|||||||
|
|
||||||
|
#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
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
#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
|
||||||
@@ -0,0 +1,85 @@
|
|||||||
|
#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
|
||||||
@@ -0,0 +1,243 @@
|
|||||||
|
/**
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
@@ -189,10 +189,10 @@
|
|||||||
#define party_member_list_all party_member_list(1)
|
#define party_member_list_all party_member_list(1)
|
||||||
|
|
||||||
|
|
||||||
#define spatial_radius(obj) sfall_func1("spatial_radius", obj)
|
|
||||||
#define critter_inven_obj2(obj, type) sfall_func2("critter_inven_obj2", obj, type)
|
#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")
|
#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)
|
||||||
|
|||||||
@@ -13,15 +13,15 @@ Example setup for a hook-script based mod:
|
|||||||
|
|
||||||
|
|
||||||
procedure tohit_hook_handler begin
|
procedure tohit_hook_handler begin
|
||||||
display_msg("Modifying hit_hook " + get_sfall_arg);
|
display_msg("Modifying hit_hook " + get_sfall_arg);
|
||||||
set_hit_chance_max(100);
|
set_hit_chance_max(100);
|
||||||
set_sfall_return(100);
|
set_sfall_return(100);
|
||||||
end
|
end
|
||||||
|
|
||||||
procedure start begin
|
procedure start begin
|
||||||
if game_loaded then begin
|
if game_loaded then begin
|
||||||
register_hook_proc(HOOK_TOHIT, tohit_hook_handler);
|
register_hook_proc(HOOK_TOHIT, tohit_hook_handler);
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
@@ -42,7 +42,7 @@ Returns all hook arguments as a new temp array.
|
|||||||
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.
|
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)
|
> 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).
|
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 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.
|
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.
|
||||||
@@ -58,13 +58,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:
|
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(original_chance / 2);
|
set_sfall_arg(0, (original_chance / 2));
|
||||||
|
|
||||||
This basically changes hook argument for the next script. Mod B code:
|
This basically changes hook argument for the next script. Mod B code:
|
||||||
|
|
||||||
original_chance = get_sfall_arg;
|
original_chance = get_sfall_arg;
|
||||||
set_sfall_return(original_chance * 1.5);
|
set_sfall_return(original_chance * 1.5);
|
||||||
set_sfall_arg(original_chance * 1.5);
|
set_sfall_arg(0, (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).
|
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).
|
||||||
|
|
||||||
@@ -166,9 +166,10 @@ int arg5 - The special effect flags for the target
|
|||||||
int arg6 - The special effect flags for the attacker
|
int arg6 - The special effect flags for the attacker
|
||||||
int arg7 - The weapon used in the attack
|
int arg7 - The weapon used in the attack
|
||||||
int arg8 - The bodypart that was struck
|
int arg8 - The bodypart that was struck
|
||||||
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 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 arg10 - Number of bullets actually hit the target (1 for melee attacks)
|
int arg10 - Number of bullets actually hit the target (1 for melee attacks)
|
||||||
int arg11 - The amount of knockback to the target
|
int arg11 - The amount of knockback to the target
|
||||||
|
int arg12 - Attack Type (see ATKTYPE_* constants)
|
||||||
|
|
||||||
int ret1 - The damage to the target
|
int ret1 - The damage to the target
|
||||||
int ret2 - The damage to the attacker
|
int ret2 - The damage to the attacker
|
||||||
@@ -262,7 +263,7 @@ int arg5 - the amount of actual caps in the barter stack (as opposed to good
|
|||||||
int arg6 - the value of all goods being traded before skill modifications
|
int arg6 - the value of all goods being traded before skill modifications
|
||||||
critter arg7 - table of offered goods (being sold to NPC)
|
critter arg7 - table of offered goods (being sold to NPC)
|
||||||
int arg8 - the total cost of the goods offered by the player
|
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 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
|
int ret1 - the modified value of all of the goods
|
||||||
|
|
||||||
|
|||||||
@@ -106,6 +106,9 @@ array - array ID to be used with array-related functions (actually an integer)
|
|||||||
> int get_npc_level(string npc)
|
> 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.
|
- 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)
|
> int get_ini_setting(string setting)
|
||||||
- reads an integer value from an ini file in the fallout directory.
|
- 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.
|
- 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
Reference in New Issue
Block a user