/* NPC Armor Appearance mod Used to replace the scripted part of B-Team mod. 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. NOTE: this script requires compiler from sfall modderspack with -s option (short circuit evaluation) version 1.0 */ #include "main.h" #define IS_ARMOR(item) (obj_type(item) == OBJ_TYPE_ITEM and obj_item_subtype(item) == item_type_armor) variable modIni := "npcarmor.ini", defaultFids, armorPidMap, // maps armor PID to it's "type" - leather armor, metal, power armor, etc. npcMap; procedure check_armor_change(variable critter, variable item, variable isWorn) begin variable npc, armorType, fid; if (npcMap[obj_pid(critter)]) then begin npc := npcMap[obj_pid(critter)]; if (not isWorn) then begin // display_msg("No armor fid: " + npc["Default"]); return npc["Default"]; end else if (item) then begin armorType := armorPidMap[obj_pid(item)]; fid := npc[armorType] or defaultFids[armorType]; if (fid == 0 or fid == -1) then fid := npc["Default"]; // display_msg("Change fid: " + fid + ", npc: " + npc[armorType] + ", default:" + defaultFids[armorType]); return fid; end end return -1; end // for NPCs when they change armor themselves procedure invenwield_handler begin variable critter, item, fid, slot, isWorn; critter := get_sfall_arg; item := get_sfall_arg; slot := get_sfall_arg; isWorn := get_sfall_arg; if (critter and item and slot == INVEN_TYPE_WORN) then begin fid := check_armor_change(critter, item, isWorn); if (fid != -1) then begin art_change_fid_num(critter, fid); end end end // when changing armor from inventory while controlling other NPCs procedure adjustfid_handler begin variable fid, armor; if (dude_obj != real_dude_obj) then begin armor := critter_inven_obj(dude_obj, INVEN_TYPE_WORN); fid := check_armor_change(dude_obj, armor, armor != 0); if (fid != -1) then begin set_sfall_return(fid); end end end procedure start begin variable sect, sects, armorTypes, armorType, npc, pid, pids, i; if game_loaded and (sfall_ver_major >= 4) then begin register_hook_proc(HOOK_INVENWIELD, invenwield_handler); register_hook_proc(HOOK_ADJUSTFID, adjustfid_handler); defaultFids := get_ini_section(modIni, "Default"); fix_array(defaultFids); foreach (armorType: i in defaultFids) begin defaultFids[armorType] := atoi(i); end armorPidMap := create_array_map; armorTypes := get_ini_section(modIni, "ArmorTypes"); foreach (armorType: pids in armorTypes) begin pids := string_split(pids, ","); foreach (pid in pids) begin armorPidMap[atoi(pid)] := armorType; end end npcMap := create_array_map; i := 1; sect := get_ini_section(modIni, ""+i); while (sect.PID) do begin npc := create_array_map; npc["Default"] := atoi(sect["Default"]); foreach (armorType: pids in armorTypes) begin if (sect[armorType]) then begin npc[armorType] := atoi(sect[armorType]); end end npcMap[atoi(sect.PID)] := npc; i += 1; sect := get_ini_section(modIni, ""+i); end end end