From 85dfb35f0103874b706178b35c96feed1457cca7 Mon Sep 17 00:00:00 2001 From: NovaRain Date: Fri, 11 Oct 2019 00:45:46 +0800 Subject: [PATCH] Updated NPC armor appearance mod script Added command_lite.h header file (from EcCo mod). Added alternative npcarmor.ini for vanilla Fallout 2. --- artifacts/config_files/npcarmor - vanilla.ini | 82 +++ artifacts/config_files/npcarmor.ini | 36 +- artifacts/mods/gl_npcarmor.int | Bin 4434 -> 5104 bytes artifacts/mods/gl_npcarmor.ssl | 128 ++-- artifacts/scripting/headers/command_lite.h | 567 ++++++++++++++++++ sfall/Modules/Graphics.cpp | 3 +- 6 files changed, 746 insertions(+), 70 deletions(-) create mode 100644 artifacts/config_files/npcarmor - vanilla.ini create mode 100644 artifacts/scripting/headers/command_lite.h diff --git a/artifacts/config_files/npcarmor - vanilla.ini b/artifacts/config_files/npcarmor - vanilla.ini new file mode 100644 index 00000000..188d171a --- /dev/null +++ b/artifacts/config_files/npcarmor - vanilla.ini @@ -0,0 +1,82 @@ +;NPC armor appearance configuration for vanilla Fallout 2. Does not require any new graphics +;Party members will use player's armor appearance just like old B-Team mod + +;WeaponAnims codes +; 1 - Knife (D) +; 2 - Club (E) +; 3 - Sledgehammer (F) +; 4 - Spear (G) +; 5 - Pistol (H) +; 6 - SMG (I) +; 7 - Rifle (J) +; 8 - Big Gun (K) +; 9 - Minigun (L) +; 10 - Rocket Launcher (M) +; 11-15 - sfall additional weapon animation codes + +; This section maps 7 armor types to corresponding armor item PIDs +[ArmorTypes] +Jacket = 74,265 +Leather = 1,379 +Metal = 2,240,380 +Power = 3,232 +AdvPower = 348,349 +Combat = 17,239,381 +Robe = 113,524 + +; Default armor FIDs (the same for all NPCs) +[Default] +Jacket = 16777229 +Leather = 16777228 +Metal = 16777230 +Combat = 16777226 +Power = 16777217 +AdvPower = 16777287 +Robe = 16777218 + +; Sulik +[1] +PID=16777313 +WeaponAnims=1,3,4,6 +Default=16777280 + +; Vic +[2] +PID=16777278 +WeaponAnims=1,5,7 +Default=16777307 + +; Cassidy +[3] +PID=16777305 +WeaponAnims=4,5,7 +Default=16777260 +Leather=16777260 + +; Myron +[4] +PID=16777376 +WeaponAnims=1,5 +Default=16777304 + +; Lenny +[5] +PID=16777323 +WeaponAnims=1,5,6 +Default=16777295 + +; Davin +[6] +PID=16777379 +WeaponAnims=1,2,5 +Default=16777264 + +; Miria +[7] +PID=16777380 +WeaponAnims=1,6 +Default=16777252 +Jacket=16777222 +Leather=16777221 +Metal=16777223 +Combat=16777219 diff --git a/artifacts/config_files/npcarmor.ini b/artifacts/config_files/npcarmor.ini index 085658ba..4b38cd15 100644 --- a/artifacts/config_files/npcarmor.ini +++ b/artifacts/config_files/npcarmor.ini @@ -23,21 +23,20 @@ Robe = 113,524 ; Default armor FIDs (the same for all NPCs) [Default] -Power=16777217 -AdvPower=16777287 -Robe=16777218 - +Power = 16777217 +AdvPower = 16777287 +Robe = 16777218 ; Sulik [1] PID=16777313 WeaponAnims=1,3,4,6,14 Default=16777280 -Leather=16777325 -Power=16777324 -Metal=16777323 Jacket=16777321 +Leather=16777325 +Metal=16777323 Combat=16777322 +Power=16777324 ; Vic [2] @@ -45,47 +44,46 @@ PID=16777278 WeaponAnims=1,5,7,13,14 Default=16777307 Jacket=16777329 -Combat=16777330 -Metal=16777331 -Power=16777332 Leather=16777333 +Metal=16777331 +Combat=16777330 +Power=16777332 ; Cassidy [3] PID=16777305 WeaponAnims=4,5,7,13 Default=16777354 -Leather=16777260 -Power=16777328 -Metal=16777327 Jacket=16777351 +Leather=16777260 +Metal=16777327 Combat=16777326 +Power=16777328 ; Myron [4] PID=16777376 WeaponAnims=1,5,14 Default=16777304 -Leather= -Power=16777349 Combat=16777350 +Power=16777349 -; Cat Jules +; Cat Jules (RP) [5] PID=16777720 WeaponAnims=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 Default=16777353 +Jacket=16777346 Leather=16777347 Metal=16777348 -Jacket=16777346 Combat=16777226 -; Kitsune +; Kitsune (RP) [6] PID=16777718 WeaponAnims=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 Default=16777222 +Jacket=16777222 Leather=16777221 Metal=16777223 -Jacket=16777222 Combat=16777219 diff --git a/artifacts/mods/gl_npcarmor.int b/artifacts/mods/gl_npcarmor.int index fe34af4906aa2e6e497a663608ebc08d9d588b7b..ee6da9f79816263025599c89bd8643d51d1347cd 100644 GIT binary patch literal 5104 zcmZo*I>5-lz#!DX3!<5qHLx@YG)OflG)OflHb^xnHApomH>fnIHmET$FmN(3Ft9P8 z0Oo5@t^|~ZQgHDSr~s5=ZDC+wU}j)o=zRP7%D4xmp%m{9DB~NHhEjaTpo||30(vNbfq_Ayv>+w1BsD&F>Gg6bYp++ZXB<7`q%!P`UgEhs&goTPz6N{2F;uCX9;vrHD3?i9% zWvO}PAS2^567y1WQj0+Gn3$4PT3nKrnSu}$1FI~_FRIMVFH1#;vlW*l7L_pk|Ns9# z0|Vm>1||ju1|~fQ1~%Ws0u4}1Yg#E(GcYi)SSf%=9WbewM75oC66~G!4a`RKH6g=SpsgRplT%4Jg zuHfeB0`fFpQEFmNd`f9bYJ7fD76XG04ig-~fez9IGXbPqAU(AtJ~J;fzBn}*XFqn6@q!p4TezKs0qSifrzl?fW=uGjKDNYgHeNdg8`V$3>9N-Flq_|i?BiT zFu-Kk8jPCs!7>aG8J0dM&!}O4gK+~`j@74u1ttoi8`;1#BSa6Y50qyFQP1)SQf4tQ zK<#IQ(O`ApuwYB(?i8?Ekk7zn1lNHE33&Mo^A9K{ zz`2O)1CCIJrBJN30e1}84n#OZ4K#JjJ(4AhA6+o(ipUS0hJ?-PeHaoT?Q^` zz^M%y3Opw0=7Ll+ur#njYdRE{5Xy;Qz2J1jyP#n|D6AMIn#w@A1ezA0X_5!#bE5-{ z{0s~X4GsqwLDd&XCBzKmvZ7%>L=3g1zzcF2L!0id- zkO0*`Aej$f*MM5D(DD(glK(%*m0)qB21k%e252hgg|u@(H6bh|fx`e?d)h)(8bRWL zcL5{~F>1iXVQC1pe8e5n(2!(+=Ot)K$F~kO#6jlstpkzp5&)F)!1;_%3#Cj0`w;9i zXiJGN3n|@#(&Y)LIk@D}%2K{L4ZP4;gT)DqMvWU-dWE*!Ky5NeI1w8f5O-0N6u!}z z0%`H^dq6^=NdRmfk=jZAd)eosRAqujs;M90`nM}bip(utPBV9ptUrp ze1NvQq4l}|q@BkBt;yJt>TOuKalq?sSXjYiKp^Z~fVCcA;*eActM@@I zc}NQjT2l)^+B;lOS8yV^0$gq|Fff4H2$0r4H#B#^WVqq22WYNkW2Nz zESMdzx(ezh0S!nw3TnB4)xqSUA;-T6ntPC9fZ-f81{h#r-5}Hi$^Q`l@#d2 zbsmU_;2f|Wyiou0Ao&;8y5+?Pb(jpuFOX1&ww4%>WWeTv+e=Ll|HABm`3LGIK?#t5 zF;Wc^)F+Hka|}VT$%yP{NS}$V!KlF!?t5@t3PZ{w21xsnv8+iS)b7Es0a^}&$~=(S z3^%|wL3J_QXwrwen;Bvb!#NcBb4~h9=1>)oFy@DZC{oJigNO*LfOYai!88zuc>uy+U0bI|6+b@t-6W9#6Yhmty#RJscLN%ax0GEL9 zz8EN6K;hQ}NxRGqMo=HKLHzqu}OFdtlkBO4h($ delta 1713 zcmeyMeo0B7f$0Dv0|SFl122eXmY66YThGD3z`(|U0+>CZ+$bmwrNH9M3=9kfPyr~# zvW|g)0VLiA6@XG~ISdR8APZ+f1)voBJ1AoV149^;38uJ|z!U?+5hx9%xUHa!J5U-* z@xUBKY0eL0uS>kupm=|QG@H`TdYc4EYliTKte3jCbO~GF|lY(c4JdxVriP3 z$0o+ak}KT|Dj3$7B@J5q9m@aEF1#4n$Fa*(TRv?mr zrNO8{AIxF^lN=CP2G$0nCa^jNc8Ca@22|b%OtUu_HJCRTfZ41K5HXGhqoy#h2xo&L zL^Di^v%#ndVhtPAIF88{9J-S?3WzhYPMTcDA;H8JGI<6^k`Vg|unCL}MiA54J0|mR zN=UJHfQ4D$VQAbS4H98znrz3Z#Kdkec@K*b6MM(xX`F6M>?bDQk;2W${W-Q-nVGE5xnCZFI^6=ZB+1xqtQT+1mi`5%`U z6DP-HF>V7MPJsp%aF9N044K@(A*R8_1y&5Vfzu6}4V)>HtGH#DI44b>!L7x_d0_Gh zE?rk>Y=FYM@hQj@s9E5E`~Uy{{{|CC{BUtV@*c<^Aax9kV3N6kwLxm~0$!cT2bj48 zxRo0AgIvbQ(^Ll1IC&qB7!%i|$=7()RbgIYfOv@;9x4YIVfHjWnXJL9Z_5l-0SO`I z2BW4Dh#MFnX#^x<3$@({;%aUsSddJf$Lm(lV}R-okYXN4VgUs>B#IdtpmE5(4lTG& zg48oG!{y%~$umF`8zYLWD?CC$^8BE5&(vTHaW#+JtRAJ$t L(ZDi!0j~rAd3kX# diff --git a/artifacts/mods/gl_npcarmor.ssl b/artifacts/mods/gl_npcarmor.ssl index 25d062d8..422154cd 100644 --- a/artifacts/mods/gl_npcarmor.ssl +++ b/artifacts/mods/gl_npcarmor.ssl @@ -15,9 +15,13 @@ #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) +#define FID_OBJ_CRITTER (0x01000000) + +procedure update_armor_apperance; + variable modIni := "npcarmor.ini", defaultFids, @@ -26,44 +30,55 @@ variable altWeapon, unWieldWeapon; -procedure check_armor_change(variable critter, variable item, variable isWorn) begin +/* + Returns the FID value set in the config settings for party member armor: Jacket, Leather, etc. +*/ +procedure check_armor_change(variable critter, variable armor, variable isWield) begin variable npc, armorType, fid; - if (npcMap[obj_pid(critter)]) then begin - npc := npcMap[obj_pid(critter)]; - if (not isWorn) then begin + npc := npcMap[obj_pid(critter)]; + if (npc) then begin + if (isWield == false) then begin // display_msg("No armor fid: " + npc["Default"]); return npc["Default"]; - end else if (item) then begin - armorType := armorPidMap[obj_pid(item)]; + end else if (armor) then begin + armorType := armorPidMap[obj_pid(armor)]; 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; + return -1; // engine default end -procedure check_weapon_change(variable critter, variable item, variable isWield) begin +/* + Checks if a party member can use the offered weapon +*/ +procedure check_weapon_change(variable critter, variable weapon, 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"], ","); + npc := npcMap[obj_pid(critter)]; + if (npc) then begin + if (isWield) then begin + newWeaponAnim := get_proto_data(obj_pid(weapon), PROTO_WP_ANIM); if newWeaponAnim then begin // anim code 0 - none/unarmed - foreach (i in weaponAnimList) begin - if (newWeaponAnim == atoi(i)) then return -1; + weaponAnimList := npc["WeaponAnims"]; + if (weaponAnimList != 0) then begin + foreach (i in string_split(weaponAnimList, ",")) begin + if (newWeaponAnim == atoi(i)) then return -1; // can use (engine default) + end end - return 0; + return 0; // can't use end end else begin - unWieldWeapon := obj_pid(item); + unWieldWeapon := obj_pid(weapon); end end - return -1; + return -1; // engine default end +/* + Finds the first weapon which can be used by the party member in the inventory +*/ procedure search_alt_weapon(variable critter) begin variable obj, res, i := 0; obj := inven_ptr(critter, 0); @@ -87,48 +102,47 @@ end // for NPCs when they change armor/weapon themselves procedure invenwield_handler begin - variable critter, item, fid, slot, isWorn, canWield; + variable critter, item, fid, slot, isWield, canWield; critter := get_sfall_arg; - item := get_sfall_arg; - slot := get_sfall_arg; - isWorn := get_sfall_arg; + item := get_sfall_arg; + slot := get_sfall_arg; + isWield := get_sfall_arg; - if (critter and item and slot == INVEN_TYPE_WORN) then begin - fid := check_armor_change(critter, item, isWorn); + if (/*critter and*/ item and slot == INVEN_TYPE_WORN) then begin + fid := check_armor_change(critter, item, isWield); if (fid != -1) then begin if art_exists(fid) then begin art_change_fid_num(critter, fid); end else begin - debug_msg("Error: NPC Armor mod: missing FID."); + debug_msg("[Error] NPC armor mod: Invenwield missing FID: " + fid); end end - return; - end - - if (critter and item and slot == INVEN_TYPE_RIGHT_HAND) then begin + end else if (/*critter and*/ item and slot == INVEN_TYPE_RIGHT_HAND) then begin if (altWeapon == item) then return; - canWield := check_weapon_change(critter, item, isWorn); + canWield := check_weapon_change(critter, item, isWield); set_sfall_return(canWield); if (canWield != -1) then begin - call search_alt_weapon(critter); + call search_alt_weapon(critter); // wield weapon by script end end end // when changing armor from inventory while controlling other NPCs procedure adjustfid_handler begin - variable fid, armor; + variable fid, armor, weapAnim, currFid, newFid; if (dude_obj != real_dude_obj) then begin + currFid := get_sfall_arg; + if ((currFid bwand 0x0F000000) != FID_OBJ_CRITTER) then return; armor := critter_inven_obj(dude_obj, INVEN_TYPE_WORN); fid := check_armor_change(dude_obj, armor, armor != 0); if (fid != -1) then begin - variable weapAnim := get_sfall_arg bwand 0xF000; - variable newFid := fid bwand 0xFFFF0FFF bwor weapAnim; + weapAnim := currFid bwand 0xF000; + newFid := fid bwand 0xFFFF0FFF bwor weapAnim; if art_exists(newFid) then begin set_sfall_arg(0, newFid); set_sfall_return(newFid); end else begin - debug_msg("Error: NPC Armor mod: missing FID."); + debug_msg("[Error] NPC armor mod: Adjust FID missing: " + newFid); end end end @@ -140,29 +154,18 @@ procedure inventorymove_handler begin 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 + if ((slot == INVEN_TYPE_RIGHT_HAND or slot == INVEN_TYPE_LEFT_HAND) and IS_WEAPON(item)) then begin canWield := check_weapon_change(dude_obj, item, item != 0); set_sfall_return(canWield); 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); - register_hook_proc(HOOK_INVENTORYMOVE, inventorymove_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"); + armorPidMap := create_array_map; foreach (armorType: pids in armorTypes) begin pids := string_split(pids, ","); foreach (pid in pids) begin @@ -170,6 +173,12 @@ procedure start begin end end + defaultFids := get_ini_section(modIni, "Default"); + fix_array(defaultFids); + foreach (armorType: i in defaultFids) begin + defaultFids[armorType] := atoi(i); + end + npcMap := create_array_map; i := 1; @@ -188,7 +197,26 @@ procedure start begin i += 1; sect := get_ini_section(modIni, ""+i); end - end + call update_armor_apperance; + + register_hook_proc(HOOK_INVENWIELD, invenwield_handler); + register_hook_proc(HOOK_ADJUSTFID, adjustfid_handler); + register_hook_proc(HOOK_INVENTORYMOVE, inventorymove_handler); + + debug_msg("NPC armor appearance mod: Done."); + end end +procedure update_armor_apperance begin + variable npc, arItem, fid; + foreach (npc in party_member_list_critters) begin + if (npc == dude_obj) then continue; + arItem := critter_inven_obj(npc, INVEN_TYPE_WORN); + if (arItem) then begin + fid := check_armor_change(npc, arItem, true); + if (fid == -1 or art_exists(fid) == false) then continue; + art_change_fid_num(npc, fid); + end + end +end diff --git a/artifacts/scripting/headers/command_lite.h b/artifacts/scripting/headers/command_lite.h new file mode 100644 index 00000000..5d61dc34 --- /dev/null +++ b/artifacts/scripting/headers/command_lite.h @@ -0,0 +1,567 @@ +/* + Copyright 1998-2003 Interplay Entertainment Corp. All rights reserved. +*/ + +#ifndef COMMAND_H +#define COMMAND_H + + +#define critter_is_armed(x) (((obj_item_subtype(critter_inven_obj(x,INVEN_TYPE_RIGHT_HAND))) == item_type_weapon) or \ + ((obj_item_subtype(critter_inven_obj(x,INVEN_TYPE_LEFT_HAND))) == item_type_weapon)) +#define critter_weight(x) (100 + ((get_critter_stat(x,STAT_gender) == GENDER_MALE) * 50) + (get_critter_stat(x,STAT_st) * 5) - ((get_critter_stat(x,STAT_ag) + get_critter_stat(x,STAT_en))/3)) +#define critter_wearing_armor(x) (obj_item_subtype(critter_inven_obj(x,INVEN_TYPE_WORN)) == item_type_armor) + +#define dude_is_stupid (dude_iq <= 3) +#define dude_name (obj_name(dude_obj)) +#define dude_gender (get_critter_stat(dude_obj,STAT_gender)) +#define dude_strength (get_critter_stat(dude_obj,STAT_st)) +#define dude_perception (get_critter_stat(dude_obj,STAT_pe)) +#define dude_endurance (get_critter_stat(dude_obj,STAT_en)) +#define dude_charisma (get_critter_stat(dude_obj,STAT_ch)) +#define dude_iq (get_critter_stat(dude_obj,STAT_iq)) +#define dude_agility (get_critter_stat(dude_obj,STAT_ag)) +#define dude_luck (get_critter_stat(dude_obj,STAT_lu)) +#ifndef dude_level +#define dude_level (get_pc_stat(PCSTAT_level)) +#endif +#define dude_age (get_critter_stat(dude_obj,STAT_age)) +#define dude_weight critter_weight(dude_obj) + +#define dude_moron_not_vegetable (((get_critter_stat(dude_obj,STAT_iq)) > 1) and ((get_critter_stat(dude_obj,STAT_iq)) < 3) ) + +#define dude_is_male (dude_gender == GENDER_MALE) +#define dude_is_female (dude_gender == GENDER_FEMALE) +#define dude_is_armed critter_is_armed(dude_obj) +#define dude_wearing_armor critter_wearing_armor(dude_obj) + +#define dude_has_power_armor (((obj_is_carrying_obj_pid(dude_obj, PID_POWERED_ARMOR)) + \ + (obj_is_carrying_obj_pid(dude_obj, PID_ADVANCED_POWER_ARMOR)) + \ + (obj_is_carrying_obj_pid(dude_obj, PID_ADVANCED_POWER_ARMOR_MK2)) + \ + (obj_is_carrying_obj_pid(dude_obj, PID_HARDENED_POWER_ARMOR))) > 0) + +#define dude_wielding_knife ((obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_RIGHT_HAND)) == PID_KNIFE) or \ + (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_RIGHT_HAND)) == PID_THROWING_KNIFE) or \ + (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_RIGHT_HAND)) == PID_RIPPER) or \ + (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_RIGHT_HAND)) == PID_COMBAT_KNIFE) or \ + (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_LEFT_HAND)) == PID_KNIFE) or \ + (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_LEFT_HAND)) == PID_THROWING_KNIFE) or \ + (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_LEFT_HAND)) == PID_RIPPER) or \ + (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_LEFT_HAND)) == PID_COMBAT_KNIFE)) + +#define dude_wearing_power_armor ((obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_POWERED_ARMOR) or \ + (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_ADVANCED_POWER_ARMOR) or \ + (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_ADVANCED_POWER_ARMOR_MK2) or \ + (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_HARDENED_POWER_ARMOR)) + +#define dude_wearing_leather_armor ((obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_LEATHER_ARMOR) or \ + (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_LEATHER_JACKET) or \ + (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_LEATHER_ARMOR_MK_II) or \ + (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_CURED_LEATHER_ARMOR)) + +#define dude_wearing_combat_armor ((obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_COMBAT_ARMOR) or \ + (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_BROTHERHOOD_COMBAT_ARMOR) or \ + (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_COMBAT_ARMOR_MK_II)) + +#define dude_wearing_metal_armor ((obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_METAL_ARMOR) or \ + (obj_pid(critter_inven_obj(dude_obj,INVEN_TYPE_WORN)) == PID_METAL_ARMOR_MK_II)) + +#define dude_wearing_vault_suit COND019(1) +#define dude_has_gambling_skills ((dude_iq > 3) and (has_skill(dude_obj, SKILL_GAMBLING) >= 25)) + +#define dude_is_sneaking (using_skill(dude_obj,SKILL_SNEAK)) +#define dude_is_walking (art_anim(obj_art_fid(dude_obj)) == ANIM_walk) +#define dude_is_running (art_anim(obj_art_fid(dude_obj)) == ANIM_running) +#define dude_is_poisoned (get_poison(dude_obj)) +#define dude_is_irradiated (get_critter_stat(dude_obj, STAT_current_rad)) +#define dude_is_crippled ((critter_state(dude_obj) bwand DAM_CRIP_LEG_LEFT) or \ + (critter_state(dude_obj) bwand DAM_CRIP_LEG_RIGHT) or \ + (critter_state(dude_obj) bwand DAM_CRIP_ARM_LEFT) or \ + (critter_state(dude_obj) bwand DAM_CRIP_ARM_RIGHT)) + +#define dude_cur_rot (has_trait(TRAIT_OBJECT,dude_obj,OBJECT_CUR_ROT)) +#define dude_inv_rot ((dude_cur_rot + 3)%6) +#define dude_tile (tile_num(dude_obj)) +#define dude_elevation (elevation(dude_obj)) + +#define tile_behind_obj(who) (tile_num_in_direction(tile_num(who),((has_trait(TRAIT_OBJECT,who,OBJECT_CUR_ROT) + 3) % 6), 1)) + +#define dude_cur_hits (get_critter_stat(dude_obj,STAT_current_hp)) +#define dude_max_hits (get_critter_stat(dude_obj,STAT_max_hp)) + +#define dude_mental_block (has_trait(TRAIT_PERK,dude_obj,PERK_mental_block)) +#define dude_presence (has_trait(TRAIT_PERK,dude_obj,PERK_presence)) +#define dude_awareness (has_trait(TRAIT_PERK,dude_obj,PERK_bonus_awareness)) +#define dude_fortune_finder (has_trait(TRAIT_PERK,dude_obj,PERK_fortune_finder)) +#define dude_smooth_talker (has_trait(TRAIT_PERK,dude_obj,PERK_smooth_talker)) + +#define dude_caps (item_caps_total(dude_obj)) + +#define dude_has_car (global_var(GVAR_PLAYER_GOT_CAR)) +#define dude_is_pornstar dude_has_porn_star_rep +#define dude_is_high drug_influence(dude_obj) +#define dude_found_geck global_var(GVAR_VAULT13_FOUND_GECK) + + +#define dude_stat_win(X,Y) ((do_check(dude_obj,X,Y)) > (do_check(self_obj,X,0))) +#define dude_stat_lose(X,Y) ((do_check(dude_obj,X,Y)) < (do_check(self_obj,X,0))) +#define dude_stat_tie(X,Y) ((do_check(dude_obj,X,Y)) == (do_check(self_obj,X,0))) +#define dude_can_see_self obj_can_see_obj(dude_obj,self_obj) + +#define dude_item(x) obj_carrying_pid_obj(dude_obj, x) +#define dude_item_count(x) obj_is_carrying_obj_pid(dude_obj, x) + +#define dude_is_addict (has_trait(TRAIT_TRAIT, dude_obj, TRAIT_drug_addict)) + + +#define self_name (obj_name(self_obj)) +#define self_gender (get_critter_stat(self_obj,STAT_gender)) +#define self_strength (get_critter_stat(self_obj,STAT_st)) +#define self_perception (get_critter_stat(self_obj,STAT_pe)) +#define self_endurance (get_critter_stat(self_obj,STAT_en)) +#define self_charisma (get_critter_stat(self_obj,STAT_ch)) +#define self_iq (get_critter_stat(self_obj,STAT_iq)) +#define self_agility (get_critter_stat(self_obj,STAT_ag)) +#define self_luck (get_critter_stat(self_obj,STAT_lu)) + +#define self_is_male (self_gender == GENDER_MALE) +#define self_is_female (self_gender == GENDER_FEMALE) +#define self_is_armed critter_is_armed(self_obj) +#define self_wearing_armor critter_wearing_armor(self_obj) + +#define self_carrying_laser_pistol ((obj_pid(critter_inven_obj(self_obj,INVEN_TYPE_LEFT_HAND)) == PID_LASER_PISTOL) or \ + (obj_pid(critter_inven_obj(self_obj,INVEN_TYPE_RIGHT_HAND)) == PID_LASER_PISTOL)) + +#define self_is_sneaking (using_skill(self_obj,SKILL_SNEAK)) +#define self_is_walking (art_anim(obj_art_fid(self_obj)) == ANIM_walk) +#define self_is_running (art_anim(obj_art_fid(self_obj)) == ANIM_running) +#define self_is_poisoned (get_poison(self_obj)) + +#define self_cur_rot (has_trait(TRAIT_OBJECT,self_obj,OBJECT_CUR_ROT)) +#define self_inv_rot ((self_cur_rot + 3)%6) +#define self_tile (tile_num(self_obj)) +#define self_elevation (elevation(self_obj)) + +#define self_pid (obj_pid(self_obj)) +#define self_team has_trait(TRAIT_OBJECT,self_obj,OBJECT_TEAM_NUM) +#define self_ai has_trait(TRAIT_OBJECT,self_obj,OBJECT_AI_PACKET) +#define self_visible obj_is_visible_flag(self_obj) + +#define self_cur_hits (get_critter_stat(self_obj,STAT_current_hp)) +#define self_max_hits (get_critter_stat(self_obj,STAT_max_hp)) + +#define self_mental_block (has_trait(TRAIT_PERK,self_obj,PERK_mental_block)) +#define self_presence (has_trait(TRAIT_PERK,self_obj,PERK_presence)) +#define self_awareness (has_trait(TRAIT_PERK,self_obj,PERK_bonus_awareness)) +#define self_fortune_finder (has_trait(TRAIT_PERK,self_obj,PERK_fortune_finder)) + +#define self_caps (item_caps_total(self_obj)) +#define self_fid (obj_art_fid(self_obj)) + +#define skill_success(x,y,z) (is_success(roll_vs_skill(x,y,z))) +#define stat_success(x,y,z) (is_success(do_check(x,y,z))) + +#define self_can_see_dude obj_can_see_obj(self_obj,dude_obj) +#define self_distance_from_dude tile_distance(self_tile, dude_tile) +#define self_is_high drug_influence(self_obj) + +#define self_item(x) obj_carrying_pid_obj(self_obj, x) +#define self_item_count(x) obj_is_carrying_obj_pid(self_obj, x) + + +// some timer event macros +#define check_set_obj_visiblility(the_obj, x) if (obj_is_visible_flag(the_obj) == x) then set_obj_visibility(the_obj, x) + +#define flush_add_timer_event(obj, time, param) rm_fixed_timer_event(obj, param); \ + add_timer_event(obj, time, param) +#define flush_add_timer_event_sec(obj, sec, param) flush_add_timer_event(obj, game_ticks(sec), param) + +/****************************************************************** + General commands getting information about time +******************************************************************/ + +#define morning ((game_time_hour >= 600) and (game_time_hour < 700)) +#ifndef day +#define day ((game_time_hour >= 700) and (game_time_hour < 1800)) +#endif +#define evening ((game_time_hour >= 1800) and (game_time_hour < 1900)) +#ifndef night +#define night ((game_time_hour >= 1900) or (game_time_hour < 600)) +#endif + +#define GAME_TIME_SUBSECOND_RESOLUTION (10) +#define SECONDS_PER_MINUTE (60) +#define MINUTES_PER_HOUR (60) +#define HOURS_PER_DAY (24) +#define DAYS_PER_YEAR (365) + // Seconds Minutes Hours Days Months ==> Year +#define GAME_TIME_IN_YEARS (game_time / (GAME_TIME_SUBSECOND_RESOLUTION * SECONDS_PER_MINUTE * MINUTES_PER_HOUR * HOURS_PER_DAY * DAYS_PER_YEAR)) +#define GAME_TIME_IN_DAYS (game_time / (GAME_TIME_SUBSECOND_RESOLUTION * 60 * 60 * 24)) +#define GAME_TIME_IN_HOURS (game_time / (GAME_TIME_SUBSECOND_RESOLUTION * SECONDS_PER_MINUTE * MINUTES_PER_HOUR)) +#define GAME_TIME_IN_MINUTES (game_time / (GAME_TIME_SUBSECOND_RESOLUTION * SECONDS_PER_MINUTE)) +#define GAME_TIME_IN_SECONDS (game_time / GAME_TIME_SUBSECOND_RESOLUTION) + + +#define ticks_til_hour(x) ((ONE_GAME_DAY * (game_time_hour > (x))) + ((((x)/100) - (game_time_hour/100)) * ONE_GAME_HOUR) + ((((x)%100) - (game_time_hour%100)) * ONE_GAME_MINUTE)) +#define game_time_advance_hour(x) game_time_advance(ticks_til_hour(x)) + +// use times in define.h for passed_time(example: ONE_GAME_DAY) +#define time_has_passed(old_time, passed_time) ((passed_time + old_time) <= game_time) +// get the actual amout of time that has passed +#define amt_time_has_passed(old_time, time_unit) ((game_time - old_time) / time_unit) + +#define one_second_passed(old_time) time_has_passed(old_time,ONE_GAME_SECOND) +#define one_minute_passed(old_time) time_has_passed(old_time,ONE_GAME_MINUTE) +#define one_hour_passed(old_time) time_has_passed(old_time,ONE_GAME_HOUR) +#define one_day_passed(old_time) time_has_passed(old_time,ONE_GAME_DAY) +#define one_week_passed(old_time) time_has_passed(old_time,ONE_GAME_WEEK) +#define one_month_passed(old_time) time_has_passed(old_time,ONE_GAME_MONTH) + +/*************************************************************** +**************** Dialogue Information *********************** +***************************************************************/ +#ifndef floater + #define floater(x) float_msg(self_obj, message_str(NAME,x), FLOAT_COLOR_NORMAL) +#endif +#define floater_rand(x,y) floater(random(x,y)) + +#define dude_floater(x) float_msg(dude_obj, message_str(NAME,x), FLOAT_COLOR_NORMAL) +#define dude_floater_rand(x,y) dude_floater(random(x,y)) +#define dude_floater_bad(x) float_msg(dude_obj, message_str(NAME,x), FLOAT_COLOR_BAD) +#define dude_floater_sick(x) float_msg(dude_obj, message_str(NAME,x), FLOAT_COLOR_SICK) + + +#define FLOAT_COLOR_NORMAL FLOAT_MSG_YELLOW +#define FLOAT_COLOR_SICK FLOAT_MSG_GREEN +#define FLOAT_COLOR_BAD FLOAT_MSG_RED +#define FLOAT_COLOR_GOOD FLOAT_MSG_WHITE +#define FLOAT_COLOR_SFX FLOAT_MSG_LIGHT_GREY +#define FLOAT_COLOR_SAD FLOAT_MSG_GREY +#define FLOAT_COLOR_AFRAID FLOAT_MSG_LIGHT_RED +#define FLOAT_COLOR_PAIN FLOAT_MSG_LIGHT_GREY +#define FLOAT_COLOR_HIGH FLOAT_MSG_PURPLE +#define FLOAT_COLOR_WHISPER FLOAT_MSG_GREY + +#define obj_floater_type(z,x,type) float_msg(z, x, FLOAT_COLOR_NORMAL + ((type - FLOAT_COLOR_NORMAL) * has_trait(TRAIT_PERK, dude_obj, PERK_empathy))) +#define floater_type_msg(x, type) obj_floater_type(self_obj, x, type) +#define floater_type(x, type) floater_type_msg(mstr(x), type) +#define floater_bad(x) floater_type(x, FLOAT_COLOR_BAD) +#define floater_bad_rand(x,y) floater_bad(random(x,y)) +#define floater_sick(x) floater_type(x, FLOAT_COLOR_SICK) +#define floater_sick_rand(x,y) floater_sick(random(x,y)) +#define floater_afraid(x) floater_type(x, FLOAT_COLOR_AFRAID) +#define floater_afraid_rand(x,y) floater_afraid(random(x,y)) +#define floater_high(x) floater_type(x, FLOAT_COLOR_HIGH) +#define floater_high_rand(x,y) floater_high(random(x,y)) +#define floater_good(x) floater_type(x, FLOAT_COLOR_GOOD) +#define floater_good_rand(x,y) floater_good(random(x,y)) + +#define mstr(x) message_str(NAME,x) +#define display_mstr(x) display_msg(mstr(x)) +#define g_mstr(x) message_str(SCRIPT_GENERIC,x) +#define g_grunt g_mstr(random(300,303)) +#define g_bye g_mstr(random(375,376)) + +#define LOW_IQ (-3) + +#define Reply(x) gSay_Reply(NAME,x) +#define Reply_Rand(x,y) Reply(random(x,y)) +#define GMessage(x) gSay_Message(NAME,x,GOOD_REACTION) +#define NMessage(x) gSay_Message(NAME,x,NEUTRAL_REACTION) +#define BMessage(x) gSay_Message(NAME,x,BAD_REACTION) + +// this converts a number from 0-100 to the text representing the number, ie: 1 -> "one", 40 -> "forty-one" +#define num_to_num_text(x) g_mstr(2000+x) + +// Option(Message Number, Node Number, IQ) ==> giQ_Option(IQ, Message Number, Node Number) -rwh2 (11/12/97) +#define GOption(x,y,z) giQ_Option(z,NAME,x,y,GOOD_REACTION) +#define NOption(x,y,z) giQ_Option(z,NAME,x,y,NEUTRAL_REACTION) +#define BOption(x,y,z) giQ_Option(z,NAME,x,y,BAD_REACTION) +#define GLowOption(x,y) giQ_Option(LOW_IQ,NAME,x,y,GOOD_REACTION) +#define NLowOption(x,y) giQ_Option(LOW_IQ,NAME,x,y,NEUTRAL_REACTION) +#define BLowOption(x,y) giQ_Option(LOW_IQ,NAME,x,y,BAD_REACTION) + +#define display_mstr_rand(x,y) display_msg(mstr(random(x,y))) + +/*************************************************************** +**************** Global Variable commands ********************* +***************************************************************/ +#define inc_global_var_amt(x,y) set_global_var(x,global_var(x)+y) +#define inc_global_var(x) inc_global_var_amt(x,1) +#define dec_global_var_amt(x,y) set_global_var(x,global_var(x)-y) +#define dec_global_var(x) dec_global_var_amt(x,1) + +/*************************************************************** +**************** map Variable commands ************************ +***************************************************************/ +#define inc_map_var_amt(x,y) set_map_var(x,map_var(x)+y) +#define inc_map_var(x) inc_map_var_amt(x,1) +#define dec_map_var_amt(x,y) set_map_var(x,map_var(x)-y) +#define dec_map_var(x) dec_map_var_amt(x,1) + +/*************************************************************** +**************** Local Variable commands ********************** +***************************************************************/ +#define inc_local_var_amt(x,y) set_local_var(x,local_var(x)+y) +#define inc_local_var(x) inc_local_var_amt(x,1) +#define dec_local_var_amt(x,y) set_local_var(x,local_var(x)-y) +#define dec_local_var(x) dec_local_var_amt(x,1) + +/*************************************************************** +**************** Bit Manipulation Macros *********************** +***************************************************************/ +#define MAXINT 4294967295 //Max int +#define INV(x) (MAXINT - x) //An inverse function + +// get bit state +#define gvar_bit(x, the_bit) ((global_var(x) bwand the_bit) != 0) +#define mvar_bit(x, the_bit) ((map_var(x) bwand the_bit) != 0) +#define lvar_bit(x, the_bit) ((local_var(x) bwand the_bit) != 0) + +// switch bit on +#define set_gvar_bit_on(x, the_bit) set_global_var(x, global_var(x) bwor the_bit) +#define set_mvar_bit_on(x, the_bit) set_map_var(x, map_var(x) bwor the_bit) +#define set_lvar_bit_on(x, the_bit) set_local_var(x, local_var(x) bwor the_bit) + +// switch bit off +#define set_gvar_bit_off(x, the_bit) set_global_var(x, global_var(x) bwand INV(the_bit)) +#define set_mvar_bit_off(x, the_bit) set_map_var(x, map_var(x) bwand INV(the_bit)) +#define set_lvar_bit_off(x, the_bit) set_local_var(x, local_var(x) bwand INV(the_bit)) + +// truncates a number +#define trunc(x) (x * -(x<1)) + +/****************************************************************** + General commands getting information about a critter +******************************************************************/ +#define critter_is_male (get_critter_stat(self_obj,STAT_gender) == GENDER_MALE) +#define critter_is_female (get_critter_stat(self_obj,STAT_gender) == GENDER_FEMALE) +/*#define critter_is_armed (((obj_item_subtype(critter_inven_obj(self_obj,INVEN_TYPE_RIGHT_HAND))) == item_type_weapon) \ + or ((obj_item_subtype(critter_inven_obj(self_obj,INVEN_TYPE_LEFT_HAND))) == item_type_weapon)) +*/ +/****************************************************************** + General commands setting and getting the map exit +******************************************************************/ +// note set either exit or next to 0 for invalid +#define set_map_exit_tiles(the_exit,the_next) set_global_var(GVAR_MAP_EXIT_TILE,the_exit); set_global_var(GVAR_MAP_NEXT_TILE,the_next) +#define map_exit_tile (global_var(GVAR_MAP_EXIT_TILE)) +#define map_next_tile (global_var(GVAR_MAP_NEXT_TILE)) + +/****************************************************************** + General commands for checking and changing status variables + note: variable needs to be global for the functions to work + note: the defines for the status's are in GLOBAL.H +******************************************************************/ +#define change_status_on(status_var, which_status) set_gvar_bit_on(status_var, which_status); +#define change_status_off(status_var, which_status) set_gvar_bit_off(status_var, which_status); + +#define set_status_known(status_var) change_status_on(status_var, PERSON_KNOWN) +#define set_status_attacked(status_var) change_status_on(status_var, PERSON_ATTACKED) +#define set_status_killed(status_var) change_status_on(status_var, PERSON_KILLED) +#define set_status_assassinated(status_var) change_status_on(status_var, PERSON_ASSASSINATED) +#define set_status_dead(status_var) change_status_on(status_var, PERSON_DEAD) +#define set_status_spoken_to(status_var) change_status_on(status_var, PERSON_SPOKEN_TO) +#define set_status_spoken_to_special(status_var) change_status_on(status_var, PERSON_SPOKEN_TO_SPECIAL) +#define set_status_special(status_var) change_status_on(status_var, PERSON_SPECIAL) +#define set_status_special_2(status_var) change_status_on(status_var, PERSON_SPECIAL_2) +#define set_status_in_party(status_var) change_status_on(status_var, PERSON_IN_PARTY) +#define set_status_not_in_party(status_var) change_status_off(status_var, PERSON_IN_PARTY) +#define set_status_warned(status_var) change_status_on(status_var, PERSON_WARNED) +#define set_status_sex(status_var) change_status_on(status_var, PERSON_SEX) + +#define status_is(status_var, check_status) (gvar_bit(status_var, check_status)) + +#define status_is_known(status_var) (status_is(status_var, PERSON_KNOWN)) +#define status_is_unknown(status_var) (status_is_known(status_var) == false) +#define status_is_attacked(status_var) (status_is(status_var, PERSON_ATTACKED)) +#define status_is_killed(status_var) (status_is(status_var, PERSON_KILLED)) +#define status_is_assassinated(status_var) (status_is(status_var, PERSON_ASSASSINATED)) +#define status_is_dead(status_var) (status_is(status_var, PERSON_DEAD)) +#define status_is_spoken_to(status_var) (status_is(status_var, PERSON_SPOKEN_TO)) +#define status_is_spoken_to_special(status_var) (status_is(status_var, PERSON_SPOKEN_TO_SPECIAL)) +#define status_is_special(status_var) (status_is(status_var, PERSON_SPECIAL)) +#define status_is_special_2(status_var) (status_is(status_var, PERSON_SPECIAL_2)) +#define status_is_in_party(status_var) (status_is(status_var, PERSON_IN_PARTY)) +#define status_is_not_in_party(status_var) (status_is(status_var, PERSON_IN_PARTY) == false) +#define status_is_warned(status_var) (status_is(status_var, PERSON_WARNED)) +#define status_is_sex(status_var) (status_is(status_var, PERSON_SEX)) + +#define status_is_alive(status_var) (not (status_is_killed(status_var) or status_is_assassinated(status_var) or status_is_dead(status_var))) + + +/****************************************************************** + General commands getting information about cities +******************************************************************/ +#define abbey_visible_on_map (town_known(AREA_ABBEY) != MARK_STATE_UNKNOWN) +#define arroyo_visible_on_map (town_known(AREA_ARROYO) != MARK_STATE_UNKNOWN) +#define broken_hills_visible_on_map (town_known(AREA_BROKEN_HILLS) != MARK_STATE_UNKNOWN) +#define colusa_visible_on_map (town_known(AREA_NAVARRO) != MARK_STATE_UNKNOWN) +#define den_visible_on_map (town_known(AREA_DEN) != MARK_STATE_UNKNOWN) +#define enclave_visible_on_map (town_known(AREA_THE_ENCLAVE) != MARK_STATE_UNKNOWN) +#define EPA_visible_on_map (town_known(AREA_EPA) != MARK_STATE_UNKNOWN) +#define gecko_visible_on_map (town_known(AREA_GECKO) != MARK_STATE_UNKNOWN) +#define klamath_visible_on_map (town_known(AREA_KLAMATH) != MARK_STATE_UNKNOWN) +#define military_base_visible_on_map (town_known(AREA_MILITARY_BASE) != MARK_STATE_UNKNOWN) +#define modoc_visible_on_map (town_known(AREA_MODOC) != MARK_STATE_UNKNOWN) +#define new_CA_republic_visible_on_map (town_known(AREA_NCR) != MARK_STATE_UNKNOWN) +#define primitive_tribe_visible_on_map (town_known(AREA_PRIMITIVE_TRIBE) != MARK_STATE_UNKNOWN) +#define redding_visible_on_map (town_known(AREA_REDDING) != MARK_STATE_UNKNOWN) +#define new_reno_visible_on_map (town_known(AREA_NEW_RENO) != MARK_STATE_UNKNOWN) +#define san_francisco_visible_on_map (town_known(AREA_SAN_FRANCISCO) != MARK_STATE_UNKNOWN) +#define sierra_army_base_visible_on_map (town_known(AREA_SIERRA_ARMY_BASE) != MARK_STATE_UNKNOWN) +#define vault_13_visible_on_map (town_known(AREA_VAULT_13) != MARK_STATE_UNKNOWN) +#define vault_15_visible_on_map (town_known(AREA_VAULT_15) != MARK_STATE_UNKNOWN) +#define vault_city_visible_on_map (town_known(AREA_VAULT_CITY) != MARK_STATE_UNKNOWN) +#define vault_fake_13A_visible_on_map (town_known(AREA_FAKE_VAULT_13A) != MARK_STATE_UNKNOWN) +#define vault_fake_13B_visible_on_map (town_known(AREA_FAKE_VAULT_13B) != MARK_STATE_UNKNOWN) + +#define abbey_visit (town_known(AREA_ABBEY) == MARK_STATE_VISITED) +#define arroyo_visit (town_known(AREA_ARROYO) == MARK_STATE_VISITED) +#define broken_hills_visit (town_known(AREA_BROKEN_HILLS) == MARK_STATE_VISITED) +#define colusa_visit (town_known(AREA_NAVARRO) == MARK_STATE_VISITED) +#define den_visit (town_known(AREA_DEN) == MARK_STATE_VISITED) +#define enclave_visit (town_known(AREA_THE_ENCLAVE) == MARK_STATE_VISITED) +#define EPA_visit (town_known(AREA_EPA) == MARK_STATE_VISITED) +#define gecko_visit (town_known(AREA_GECKO) == MARK_STATE_VISITED) +#define klamath_visit (town_known(AREA_KLAMATH) == MARK_STATE_VISITED) +#define military_base_visit (town_known(AREA_MILITARY_BASE) == MARK_STATE_VISITED) +#define modoc_visit (town_known(AREA_MODOC) == MARK_STATE_VISITED) +#define new_CA_republic_visit (town_known(AREA_NCR) == MARK_STATE_VISITED) +#define primitive_tribe_visit (town_known(AREA_PRIMITIVE_TRIBE) == MARK_STATE_VISITED) +#define redding_visit (town_known(AREA_REDDING) == MARK_STATE_VISITED) +#define new_reno_visit (town_known(AREA_NEW_RENO) == MARK_STATE_VISITED) +#define san_francisco_visit (town_known(AREA_SAN_FRANCISCO) == MARK_STATE_VISITED) +#define sierra_army_base_visit (town_known(AREA_SIERRA_ARMY_BASE) == MARK_STATE_VISITED) +#define vault_13_visit (town_known(AREA_VAULT_13) == MARK_STATE_VISITED) +#define vault_15_visit (town_known(AREA_VAULT_15) == MARK_STATE_VISITED) +#define vault_city_visit (town_known(AREA_VAULT_CITY) == MARK_STATE_VISITED) +#define arroyo_destroyed_visit (town_known(AREA_ARROYO_DESTROYED) == MARK_STATE_VISITED) +#define vault_fake_13A_visit (town_known(AREA_FAKE_VAULT_13A) == MARK_STATE_VISITED) +#define vault_fake_13B_visit (town_known(AREA_FAKE_VAULT_13B) == MARK_STATE_VISITED) + +#define mark_on_map(x) if (town_known(x) == MARK_STATE_UNKNOWN) then begin \ + debug_msg(" mark_on_map("+x+")"); \ + mark_area_known(MARK_TYPE_TOWN, x, MARK_STATE_KNOWN); \ + end + +#define unmark_on_map(x) if (town_known(x) != MARK_STATE_UNKNOWN) then begin \ + debug_msg(" unmark_on_map("+x+")"); \ + mark_area_known(MARK_TYPE_TOWN, x, MARK_STATE_UNKNOWN); \ + end + +#define mark_abbey_on_map mark_on_map(AREA_ABBEY) +#define mark_arroyo_on_map mark_on_map(AREA_ARROYO) +#define mark_broken_hills_on_map mark_on_map(AREA_BROKEN_HILLS) +#define mark_colusa_on_map mark_on_map(AREA_NAVARRO) +#define mark_navarro_on_map mark_on_map(AREA_NAVARRO) +#define mark_den_on_map mark_on_map(AREA_DEN) +#define mark_enclave_on_map mark_on_map(AREA_THE_ENCLAVE) +#define mark_EPA_on_map mark_on_map(AREA_EPA) +#define mark_gecko_on_map mark_on_map(AREA_GECKO) +#define mark_klamath_on_map mark_on_map(AREA_KLAMATH) +#define mark_military_base_on_map mark_on_map(AREA_MILITARY_BASE) +#define mark_modoc_on_map mark_on_map(AREA_MODOC) +#define mark_new_CA_republic_on_map mark_on_map(AREA_NCR) +#define mark_primitive_tribe_on_map mark_on_map(AREA_PRIMITIVE_TRIBE) +#define mark_redding_on_map mark_on_map(AREA_REDDING) +#define mark_new_reno_on_map mark_on_map(AREA_NEW_RENO) +#define mark_san_francisco_on_map mark_on_map(AREA_SAN_FRANCISCO) +#define mark_sierra_army_base_on_map mark_on_map(AREA_SIERRA_ARMY_BASE) +#define mark_vault_13_on_map mark_on_map(AREA_VAULT_13) +#define mark_vault_15_on_map mark_on_map(AREA_VAULT_15) +#define mark_vault_city_on_map mark_on_map(AREA_VAULT_CITY) +#define mark_vault_fake_13A_on_map mark_on_map(AREA_FAKE_VAULT_13A) +#define mark_vault_fake_13B_on_map mark_on_map(AREA_FAKE_VAULT_13B) + +#define unmark_vault_fake_13A_on_map unmark_on_map(AREA_FAKE_VAULT_13A) + + + +/******************************************************************************************************************* +********** These represent the players acomplishments through the game ********************************************* +********** Note: these reflect the Fallout2 variable designers put in the scripts assuming we were ***************** +********** going to have a magic variable to keep track of the player stats throught the game ********************** +*******************************************************************************************************************/ +#define f2_state_v13_looking (0) +#define f2_state_v13_known (1) // set -Chris H +#define f2_state_v13_found (2) // set -Chris H +#define f2_state_v13_entered (3) // set -Chris H +#define f2_state_tribe_kidnapped (4) // ### state not set +#define f2_state_fix_tanker (5) // didn't need to exist +#define f2_state_tanker_fix_known (6) // set -Chris H +#define f2_state_tanker_fixed (7) // set -Chris H +#define f2_state_enclave_destroyed (8) // ### state not set + +#define set_f2(x) if (global_var(GVAR_FALLOUT_2) < x) then set_global_var(GVAR_FALLOUT_2, x) +#define force_f2(x) set_global_var(GVAR_FALLOUT_2, x) +#define get_f2(x) (global_var(GVAR_FALLOUT_2) == x) +#define f2_flag_any (global_var(GVAR_FALLOUT_2)) + +#define Fallout2_vault13_looking get_f2(f2_state_v13_looking) +#define Fallout2_vault13_location_known get_f2(f2_state_v13_known) +#define Fallout2_vault13_found get_f2(f2_state_v13_found) +#define Fallout2_vault13_entered get_f2(f2_state_v13_entered) +#define Fallout2_tribe_kidnapped get_f2(f2_state_tribe_kidnapped) +#define Fallout2_fix_tanker get_f2(f2_state_fix_tanker) +#define Fallout2_tanker_known get_f2(f2_state_tanker_fix_known) +#define Fallout2_tanker_fixed get_f2(f2_state_tanker_fixed) +#define Fallout2_enclave_destroyed get_f2(f2_state_enclave_destroyed) + +// Info relating to carry weight, how much something costs, and weights +#define pid_weight(x) proto_data(x,it_weight) +#define obj_weight(x) pid_weight(obj_pid(x)) +#define pid_cost(x) proto_data(x, it_cost) +#define obj_cost(x) pid_cost(obj_pid(x)) + +#define amt_cost_barter(who1, who2, x) floor(2 * x * ((160.0 + has_skill(who2,SKILL_BARTER)) / (160.0 + has_skill(who1,SKILL_BARTER)))) +#define pid_cost_barter(who1, who2, x) amt_cost_barter(who1, who2, pid_cost(x)) +#define obj_cost_barter(who1, who2, x) pid_cost_barter(who1, who2, obj_pid(x)) +#define who_max_carry(x) get_critter_stat(x,STAT_carry_amt) +#define who_carry_amount(x) has_trait(TRAIT_OBJECT, x, OBJECT_CUR_WEIGHT) +#define who_inven_free_amt(x) (who_max_carry(x) - who_carry_amount(x)) + + +/******************************************************************** +************ These are for cutting down on the lvars ************ +********************************************************************/ +// for examples of use, see new reno and raiders +// default bits for character flag +#define herebefore_bit bit_1 +#define hostile_bit bit_2 +#define examined_bit bit_3 +#define personal_enemy_bit bit_4 +#define initialized_bit bit_5 +#define is_float_bit bit_7 +#define destroy_me_bit bit_8 +#define heard_call_bit bit_9 + +// here before +#define herebefore lvar_bit(LVAR_Flags, herebefore_bit) +#define set_herebefore set_lvar_bit_on(LVAR_Flags, herebefore_bit) +#define off_herebefore set_lvar_bit_off(LVAR_Flags, herebefore_bit) +// hostile +#define hostile lvar_bit(LVAR_Flags, hostile_bit) +#define set_hostile set_lvar_bit_on(LVAR_Flags, hostile_bit) +#define off_hostile set_lvar_bit_off(LVAR_Flags, hostile_bit) +// examined +#define examined lvar_bit(LVAR_Flags, examined_bit) +#define set_examined set_lvar_bit_on(LVAR_Flags, examined_bit) +// personal enemy +#define personal_enemy lvar_bit(LVAR_Flags, personal_enemy_bit) +#define set_personal_enemy set_lvar_bit_on(LVAR_Flags, personal_enemy_bit); set_hostile +// initialized +#define destroy_me lvar_bit(LVAR_Flags, destroy_me_bit) +#define set_destroy_me set_lvar_bit_on(LVAR_Flags, destroy_me_bit) +// initialized +#define initialized lvar_bit(LVAR_Flags, initialized_bit) +#define set_initialized set_lvar_bit_on(LVAR_Flags, initialized_bit) +// heard_call +#define heard_call lvar_bit(LVAR_Flags, heard_call_bit) +#define set_heard_call set_lvar_bit_on(LVAR_Flags, heard_call_bit) +// set message type +#define is_float lvar_bit(LVAR_Flags, is_float_bit) +#define is_click (is_float == false) +#define set_is_float set_lvar_bit_on(LVAR_Flags, is_float_bit) +#define set_is_click set_lvar_bit_off(LVAR_Flags, is_float_bit) + + +#endif // COMMAND_H diff --git a/sfall/Modules/Graphics.cpp b/sfall/Modules/Graphics.cpp index 339ea3c1..9b433dcb 100644 --- a/sfall/Modules/Graphics.cpp +++ b/sfall/Modules/Graphics.cpp @@ -997,7 +997,8 @@ void Graphics::init() { #define _DLL_NAME "d3dx9_43.dll" HMODULE h = LoadLibraryEx(_DLL_NAME, 0, LOAD_LIBRARY_AS_DATAFILE); if (!h) { - MessageBoxA(0, "You have selected graphics mode 4 or 5, but " _DLL_NAME " is missing\nSwitch back to mode 0, or install an up to date version of DirectX", "Error", 0); + MessageBoxA(0, "You have selected graphics mode 4 or 5, but " _DLL_NAME " is missing.\n" + "Switch back to mode 0, or install an up to date version of DirectX.", "Error", 0); ExitProcess(-1); } else { FreeLibrary(h);