mirror of
https://github.com/sfall-team/sfall.git
synced 2026-07-27 16:52:34 -07:00
Added NPC combat control mod to example mods
Updated item highlighting mod and NPC armor mod.
This commit is contained in:
@@ -1,11 +1,13 @@
|
||||
/**
|
||||
|
||||
Item Highlight mod (Lite version)
|
||||
Item Highlighting mod (Lite version)
|
||||
|
||||
A cut-down version of the mod included in sfall 4.x, offers a bit more features than the built-in function.
|
||||
A cut-down version of the mod included in sfall 4.x, offering more features than the built-in function.
|
||||
Features:
|
||||
- highlighting items, containers (optional) and lootable corpses (optional) on the ground
|
||||
- highlights items, containers (optional) and lootable corpses (optional) on the ground
|
||||
- highlights critters using the same rules as combat mode highlighting (optional)
|
||||
- configurable hotkey is used to trigger highlight
|
||||
- hotkey can be pressed and held to continuously update highlighted objects based on current position
|
||||
- only objects in direct line-of-sight of player are highlighted (optional)
|
||||
- motion scanner is required to enable highlight (optional)
|
||||
- motion scanner charges are decreased on each use (optional)
|
||||
@@ -15,7 +17,7 @@
|
||||
NOTE: this script requires compiler from sfall modderspack with -s option
|
||||
(short circuit evaluation)
|
||||
|
||||
version 1.1
|
||||
version 1.2
|
||||
|
||||
**/
|
||||
|
||||
@@ -24,6 +26,7 @@
|
||||
|
||||
#define CRITTER_IS_DEAD (1)
|
||||
#define PID_MOTION_SENSOR (59)
|
||||
#define REPEAT_FRAMES (10)
|
||||
#define NO_HIGHLIGHT(obj) (get_flags(obj) bwand FLAG_NOHIGHLIGHT)
|
||||
#define NO_STEAL(obj) (get_proto_data(obj_pid(obj), PROTO_CR_FLAGS) bwand CFLG_NOSTEAL)
|
||||
|
||||
@@ -32,36 +35,70 @@ variable highlightKey;
|
||||
variable isHighlight;
|
||||
variable alsoContainer;
|
||||
variable alsoCorpse;
|
||||
variable alsoCritter;
|
||||
variable checkLOS;
|
||||
variable outlineColor;
|
||||
variable motionScanner;
|
||||
variable highlightFailMsg1;
|
||||
variable highlightFailMsg2;
|
||||
|
||||
procedure ToggleHighlightObject(variable obj, variable enable) begin
|
||||
if obj and (not enable or not checkLOS or not obj_blocking_line(dude_obj, tile_num(obj), BLOCKING_TYPE_SHOOT)) then begin
|
||||
if (alsoContainer and obj_item_subtype(obj) == item_type_container) or (not NO_HIGHLIGHT(obj)) then begin
|
||||
if (enable) then set_outline(obj, outlineColor);
|
||||
else set_outline(obj, 0);
|
||||
procedure DudeCanSee(variable obj) begin
|
||||
variable block := obj_blocking_line(dude_obj, tile_num(obj), BLOCKING_TYPE_SHOOT);
|
||||
return not block or block == obj;
|
||||
end
|
||||
|
||||
procedure DudeCanHear(variable obj) begin
|
||||
variable hearDist := dude_perception * 5;
|
||||
if (get_flags(obj) bwand FLAG_TRANSGLASS) then
|
||||
hearDist /= 2;
|
||||
|
||||
return tile_distance_objs(dude_obj, obj) <= hearDist;
|
||||
end
|
||||
|
||||
procedure GetOutlineColor(variable obj, variable isCritter) begin
|
||||
if isCritter then begin
|
||||
if get_team(obj) == get_team(dude_obj) then return OUTLINE_GREEN_GLOW;
|
||||
if not DudeCanSee(obj) then begin
|
||||
if (DudeCanHear(obj)) then return OUTLINE_DARK_YELLOW;
|
||||
return 0;
|
||||
end
|
||||
return OUTLINE_RED_GLOW;
|
||||
end
|
||||
if checkLOS and not DudeCanSee(obj) then
|
||||
return 0;
|
||||
|
||||
return outlineColor;
|
||||
end
|
||||
|
||||
procedure ToggleHighlightObject(variable obj, variable enable, variable isCritter) begin
|
||||
if (not alsoContainer or obj_item_subtype(obj) != item_type_container) and NO_HIGHLIGHT(obj) then return;
|
||||
|
||||
set_outline(obj, GetOutlineColor(obj, isCritter) if enable else 0);
|
||||
end
|
||||
|
||||
procedure ToggleHighlight(variable enable) begin
|
||||
variable obj;
|
||||
variable obj, isCorpse;
|
||||
foreach obj in list_as_array(LIST_GROUNDITEMS) begin
|
||||
if obj != outlined_object then begin
|
||||
call ToggleHighlightObject(obj, enable);
|
||||
if obj and obj != outlined_object then begin
|
||||
call ToggleHighlightObject(obj, enable, false);
|
||||
end
|
||||
end
|
||||
if (alsoCorpse) then begin
|
||||
if (alsoCorpse or alsoCritter) then begin
|
||||
foreach obj in list_as_array(LIST_CRITTERS) begin
|
||||
if critter_state(obj) == CRITTER_IS_DEAD and not NO_STEAL(obj) then begin
|
||||
call ToggleHighlightObject(obj, enable);
|
||||
if obj and obj != dude_obj then begin
|
||||
isCorpse := critter_state(obj) == CRITTER_IS_DEAD;
|
||||
if (alsoCritter and not isCorpse) or (isCorpse and not NO_STEAL(obj)) then begin
|
||||
call ToggleHighlightObject(obj, enable, not isCorpse);
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
tile_refresh_display;
|
||||
if (checkLOS or alsoCritter) and enable != isHighlight then begin
|
||||
set_global_script_repeat(REPEAT_FRAMES if enable else 0);
|
||||
end
|
||||
|
||||
isHighlight := enable;
|
||||
end
|
||||
|
||||
procedure KeyPressHandler begin
|
||||
@@ -71,7 +108,7 @@ procedure KeyPressHandler begin
|
||||
|
||||
if scanCode == highlightKey and not(get_game_mode bwand (INTFACELOOT bwor BARTER)) then begin
|
||||
if pressed then begin
|
||||
isHighlight := true;
|
||||
set_global_script_repeat(REPEAT_FRAMES);
|
||||
if motionScanner then begin
|
||||
scanner := obj_carrying_pid_obj(dude_obj, PID_MOTION_SENSOR);
|
||||
if scanner then begin
|
||||
@@ -94,16 +131,21 @@ procedure KeyPressHandler begin
|
||||
call ToggleHighlight(true);
|
||||
end
|
||||
end else begin
|
||||
isHighlight := false;
|
||||
call ToggleHighlight(false);
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
// visual glitch fix - for 3.8.29+
|
||||
// visual glitch fix, turn off highlight when entering combat - for 3.8.40+
|
||||
procedure CombatTurnHandler begin
|
||||
if isHighlight then begin
|
||||
call ToggleHighlight(false);
|
||||
end
|
||||
end
|
||||
|
||||
// visual glitch fix, turn off highlight when opening loot/barter screens - for 3.8.29+
|
||||
procedure GameModeChangeHandler begin
|
||||
if isHighlight and (get_game_mode bwand (INTFACELOOT bwor BARTER)) then begin
|
||||
isHighlight := false;
|
||||
call ToggleHighlight(false);
|
||||
end
|
||||
end
|
||||
@@ -114,12 +156,15 @@ procedure InventoryMoveHandler begin
|
||||
end
|
||||
|
||||
procedure start begin
|
||||
if game_loaded and (sfall_ver_major < 4 and sfall_ver_build >= 12) then begin
|
||||
if game_loaded then begin
|
||||
if (sfall_ver_major >= 4 or sfall_ver_build < 12) then return;
|
||||
|
||||
call InitConfigs;
|
||||
|
||||
highlightKey := GetConfig(configSection, "Key", 0);
|
||||
alsoContainer := GetConfig(configSection, "Containers", 0);
|
||||
alsoCorpse := GetConfig(configSection, "Corpses", 0);
|
||||
alsoCritter := GetConfig(configSection, "Critters", 0);
|
||||
checkLOS := GetConfig(configSection, "CheckLOS", 0);
|
||||
outlineColor := GetConfig(configSection, "OutlineColor", 16);
|
||||
if (outlineColor < 1) then outlineColor := 64;
|
||||
@@ -129,7 +174,13 @@ procedure start begin
|
||||
highlightFailMsg2 := Translate("HighlightFail2", "Your motion sensor is out of charge.");
|
||||
|
||||
register_hook_proc(HOOK_KEYPRESS, KeyPressHandler);
|
||||
register_hook_proc(HOOK_COMBATTURN, CombatTurnHandler);
|
||||
register_hook_proc(HOOK_GAMEMODECHANGE, GameModeChangeHandler);
|
||||
register_hook_proc(HOOK_INVENTORYMOVE, InventoryMoveHandler);
|
||||
set_global_script_type(1);
|
||||
end else begin
|
||||
if isHighlight and not(get_game_mode bwand (INTFACELOOT bwor BARTER)) then begin
|
||||
call ToggleHighlight(true);
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user