Added the ability to define allowed weapon animations for NPCs to NPC armor appearance mod (#159)

This commit is contained in:
NovaRain
2018-06-05 22:08:39 +08:00
parent 410c7ab417
commit ea1c00ec91
3 changed files with 50 additions and 4 deletions
+6
View File
@@ -19,6 +19,7 @@ Robe=16777218
; Sulik ; Sulik
[1] [1]
PID=16777313 PID=16777313
WeaponAnims=1,3,4,6
Default=16777280 Default=16777280
Leather=16777325 Leather=16777325
Power=16777324 Power=16777324
@@ -29,6 +30,7 @@ Combat=16777322
; Vic ; Vic
[2] [2]
PID=16777278 PID=16777278
WeaponAnims=1,5,7
Default=16777307 Default=16777307
Jacket=16777329 Jacket=16777329
Combat=16777330 Combat=16777330
@@ -39,6 +41,7 @@ Leather=16777333
; Cassidy ; Cassidy
[3] [3]
PID=16777305 PID=16777305
WeaponAnims=4,5,7
Default=16777354 Default=16777354
Leather=16777260 Leather=16777260
Power=16777328 Power=16777328
@@ -49,6 +52,7 @@ Combat=16777326
; Myron ; Myron
[4] [4]
PID=16777376 PID=16777376
WeaponAnims=1,5
Default=16777304 Default=16777304
Leather= Leather=
Power=16777349 Power=16777349
@@ -57,6 +61,7 @@ Combat=16777350
; Cat Jules ; Cat Jules
[5] [5]
PID=16777734 PID=16777734
WeaponAnims=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
Default=16777353 Default=16777353
Leather=16777347 Leather=16777347
Metal=16777348 Metal=16777348
@@ -66,6 +71,7 @@ Combat=16777226
; Kitsune ; Kitsune
[6] [6]
PID=16777724 PID=16777724
WeaponAnims=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
Default=16777222 Default=16777222
Leather=16777221 Leather=16777221
Metal=16777223 Metal=16777223
Binary file not shown.
+44 -4
View File
@@ -4,18 +4,19 @@
Used to replace the scripted part of B-Team mod. Used to replace the scripted part of B-Team mod.
Appropriate graphics are required for this mod to work. Appropriate graphics are required for this mod to work.
Can be adopted to any mod by adjusting armor PIDs, NPC PIDs and NPC FIDs in INI file. Can be adopted to any mod by adjusting armor PIDs, allowed weapon anim codes, NPC PIDs and NPC FIDs in INI file.
NOTE: this script requires compiler from sfall modderspack with -s option NOTE: this script requires compiler from sfall modderspack with -s option
(short circuit evaluation) (short circuit evaluation)
version 1.0 version 1.1
*/ */
#include "main.h" #include "main.h"
#define IS_ARMOR(item) (obj_type(item) == OBJ_TYPE_ITEM and obj_item_subtype(item) == item_type_armor) #define IS_ARMOR(item) (obj_type(item) == OBJ_TYPE_ITEM and obj_item_subtype(item) == item_type_armor)
#define IS_WEAPON(item) (obj_type(item) == OBJ_TYPE_ITEM and obj_item_subtype(item) == item_type_weapon)
variable variable
modIni := "npcarmor.ini", modIni := "npcarmor.ini",
@@ -41,9 +42,28 @@ procedure check_armor_change(variable critter, variable item, variable isWorn) b
return -1; return -1;
end end
// for NPCs when they change armor themselves procedure check_weapon_change(variable critter, variable item, variable isWield) begin
variable npc, newWeaponAnim, weaponAnimList, i;
if (npcMap[obj_pid(critter)]) then begin
npc := npcMap[obj_pid(critter)];
if isWield then begin
newWeaponAnim := get_proto_data(obj_pid(item), PROTO_WP_ANIM);
weaponAnimList := string_split(npc["WeaponAnims"], ",");
if newWeaponAnim then begin
foreach (i in weaponAnimList) begin
if (newWeaponAnim == atoi(i)) then return -1;
end
end else begin // anim code 0 - none/unarmed
return -1;
end
end
end
return 0;
end
// for NPCs when they change armor/weapon themselves
procedure invenwield_handler begin procedure invenwield_handler begin
variable critter, item, fid, slot, isWorn; variable critter, item, fid, slot, isWorn, canWield;
critter := get_sfall_arg; critter := get_sfall_arg;
item := get_sfall_arg; item := get_sfall_arg;
slot := get_sfall_arg; slot := get_sfall_arg;
@@ -55,6 +75,11 @@ procedure invenwield_handler begin
art_change_fid_num(critter, fid); art_change_fid_num(critter, fid);
end end
end end
if (critter and item and (slot == INVEN_TYPE_RIGHT_HAND or slot == INVEN_TYPE_LEFT_HAND)) then begin
canWield := check_weapon_change(critter, item, isWorn);
set_sfall_return(canWield);
end
end end
// when changing armor from inventory while controlling other NPCs // when changing armor from inventory while controlling other NPCs
@@ -69,12 +94,26 @@ procedure adjustfid_handler begin
end end
end end
// when changing weapon from inventory while controlling other NPCs
procedure inventorymove_handler begin
variable slot, item, canWield;
slot := get_sfall_arg;
item := get_sfall_arg;
if (dude_obj != real_dude_obj) then begin
if (IS_WEAPON(item) and (slot == INVEN_TYPE_RIGHT_HAND or slot == INVEN_TYPE_LEFT_HAND)) then begin
canWield := check_weapon_change(dude_obj, item, item != 0);
set_sfall_return(canWield);
end
end
end
procedure start begin procedure start begin
variable sect, sects, armorTypes, armorType, npc, pid, pids, i; variable sect, sects, armorTypes, armorType, npc, pid, pids, i;
if game_loaded and (sfall_ver_major >= 4) then begin if game_loaded and (sfall_ver_major >= 4) then begin
register_hook_proc(HOOK_INVENWIELD, invenwield_handler); register_hook_proc(HOOK_INVENWIELD, invenwield_handler);
register_hook_proc(HOOK_ADJUSTFID, adjustfid_handler); register_hook_proc(HOOK_ADJUSTFID, adjustfid_handler);
register_hook_proc(HOOK_INVENTORYMOVE, inventorymove_handler);
defaultFids := get_ini_section(modIni, "Default"); defaultFids := get_ini_section(modIni, "Default");
fix_array(defaultFids); fix_array(defaultFids);
@@ -97,6 +136,7 @@ procedure start begin
sect := get_ini_section(modIni, ""+i); sect := get_ini_section(modIni, ""+i);
while (sect.PID) do begin while (sect.PID) do begin
npc := create_array_map; npc := create_array_map;
npc["WeaponAnims"] := sect["WeaponAnims"];
npc["Default"] := atoi(sect["Default"]); npc["Default"] := atoi(sect["Default"]);
foreach (armorType: pids in armorTypes) begin foreach (armorType: pids in armorTypes) begin
if (sect[armorType]) then begin if (sect[armorType]) then begin