From 3115b1bd751e001b2a5ce67a08f51f30cc1844dd Mon Sep 17 00:00:00 2001 From: phobos2077 Date: Thu, 6 Jul 2023 01:20:26 +0200 Subject: [PATCH] Traps: use config for all settings, nothing is hard coded now --- root/data/config/traps.ini | 59 ++++++++-- root/data/scripts/gl_pbs_traps.int | Bin 9022 -> 13908 bytes root/data/scripts/test2.int | Bin 16632 -> 16974 bytes root/data/text/english/dialog/test2.msg | 8 +- root/data/text/russian/dialog/test2.msg | 8 +- root/mods/ecco/traps.ini | 62 ---------- scripts_src/_pbs_headers/traps.h | 143 +++++++----------------- scripts_src/_pbs_main/gl_pbs_traps.ssl | 57 ++++++---- scripts_src/_pbs_main/test2.ssl | 136 +++++++++++----------- 9 files changed, 206 insertions(+), 267 deletions(-) delete mode 100644 root/mods/ecco/traps.ini diff --git a/root/data/config/traps.ini b/root/data/config/traps.ini index d31a448..b12643b 100644 --- a/root/data/config/traps.ini +++ b/root/data/config/traps.ini @@ -35,35 +35,76 @@ other=0 613=0 -; TODO: this is not implemented yet -[Trap_0] ; Spike -name_msg=10 +; Values for grenades default to proto data +; Values for explosives default to explosives data +[Armament_25] ; Frag Grenade +skill_mod=-10 +;radius=2 +;dmg_type=6 +;dmg_min=30 +;dmg_max=60 + +[Armament_26] ; Plasma Grenade +skill_mod=-30 + +[Armament_27] ; Pulse Grenade +skill_mod=-30 + +[Armament_51] ; Dynamite +skill_mod=-50 +radius=3 + +[Armament_85] ; Plastic explosive +skill_mod=-50 +radius=3 + +[Armament_159] ; Molotov +skill_mod=-20 +dmg_type=2 ; Fire +sound_sfx=WHO1XXX2 + +[Armament_613] ; Home-made grenade +skill_mod=0 + + +[Trap_1] ; Spike item_pid=618 trap_pid=2335 ; 33556767 +radius=1 stop=1 dmg_min=8 dmg_max=16 skill_mod=-10 -[Trap_1] ; Bear -name_msg=13 +[Trap_2] ; Bear item_pid=645 trap_pid=2336 +radius=0 stop=3 dmg_min=12 dmg_max=24 skill_mod=-40 -[Trap_2] ; Mine -name_msg=11 +[Trap_3] ; Mine item_pid=616 trap_pid=2337 +radius=0 armaments=25,26,27,51,85,159,613 skill_mod=-10 -[Trap_3] ; Sensor -name_msg=12 +[Trap_4] ; Sensor item_pid=619 trap_pid=2339 +radius=1 armaments=25,26,27,51,85,159,613 skill_mod=-30 + +[Trap_5] ; RESERVED +;name_msg=10 +;item_pid=618 +trap_pid=2338 + +[Trap_6] ; RESERVED +;name_msg=10 +;item_pid=618 +trap_pid=2340 diff --git a/root/data/scripts/gl_pbs_traps.int b/root/data/scripts/gl_pbs_traps.int index a369b668f67670f91f0dfb26f94c2bb2b7dc0aed..cb0ed727411b4b633111f3cf0085323257eee5e7 100644 GIT binary patch literal 13908 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 literal 9022 zcmb_geTZCF6~Axxd$ZY{%zk8dvq|1=K1h>ol5T37th%P!KnpPqF>0yR>Fmr)GRf}D zGBeqBtHPZ}Ek%k{ETKe@{8fUK3bnK`1~!O)l#2aBrDzcmNt+P!NAUxNih4fpyf?d( z-9{I7?mOq6d+s^E^KtKcHgVN6#-!|899t{4*(U9<_2GXM{>R{di`{Cs+3g_J2mh_` zANgzBFT`Mk36GBN$N3!-Lhp_9*PIu6D$ehETj(Qk{@M#de=W}MR=sm^e$NktekRUe zcTnhaaegWRG$QkI9seDmaqdc-kI;}j&PV{^f5y+KK#sDTl|wzrffG zs(u#d52HUIpYY@Skyn5QI};iQncismA#qd~GWb6i{^>Y>3+#!1iKk3*ckBsFl zR57OeOt3Il3d-g5sbcYrF%DP~Ee|`5;>?SClRmazUnYN=TC=DpSbMP6#WN z3(DD2ey)-)7MxVJI6IxGRL+)^)jgLfl>?Zs!1iEGA3vqZk|38Z6rThxXrDfNGMy=v zG7IT)r35)WQ_SSj*%H_gFyENLN`59tXN!eOCSNG0Glhk8rIbNz`$Q1QG&mJx!C{k{ zn=X??dOn}6yidfM!Khd{ z4Uw1;O{rNxIVgbD={X2wF>B0!;15#y4<@k-GVb%4xgFq7>s^!n*I{g)^znC`ejz;} zQNIbZhx6qMh@sS1U_S9xz-`n&bnMt8$NW+Mh%Yj`(#nL;a;a23}v($f}B(?~m+gitBsH3_wb zsAi#BiE0t5nW$EwHW1a$RL8KT*$%_^9Lznie4TBv!}!!O7~`juZ$RD-*`4+-+hs>+ z9O1}|2G-N?w|b5CG4>vL^6WjxSrZC>!jhdG=k1`~V~49hLX`foXb;*$oL4N_@s`+^ zu#AUiCrATh-)UQ5^&)es-?NidMkW#4Enz33It|cOvOICh?qfSTcY+ekucsiggzaGPKi z-DXWIuM)Id(f^u^y-X`xM20iEMJ(~`ekTj-NYbmWr?FXV0e(1C&*3Z&)k56!w+5r&>%LeVYZ5LO zx*lyH;c|iYsO3{lhsy=Ftm~rIpJLr0BfRSStHX<>_;)$%ga;Ku{pq6Z6TK55=bmKT z+UJN5Ic4`y|9p;q&(o^?Zp~BBH;*ILbX_c@%51tGep+Qz4~?Gef)Tl8->}q$Zr5#U zJ}j{!r#p~M726jss5RY#I>*`3-5!ZK?5!&xC)jH~HQnj=@w;EmPI-ckSHoJK09$#2 zS|S^2{gBQ}?;M|(-UUVrvh(5asPJC42Z)RPjHO=_4n~PNSA+xACY-lq1bh^oo@Z;? zuX+jN{atILXD{QV__+O~c6yFPaD+W*ey9P8{gM%M0-1i75s{OH*00zDSStD}D8l)I z+@ze!;PWAlcXAr+tkoYxyuQklBMl^6l_#efNVqCbKG8q|s~mP;>YZ@J8Y8D7jEv-X z$XLnwm3*7zA>K0He>c?Y%1BZyVmhxbBklMMZ{hWl0P77V?F=(d%sS zx)1nv<~dEY+ZvFT?sU5jL$Y#{;m%-M!%q-byhu@p!zhJ(8XNGVQFPT}6YdG`CoK}q z)a#;Cwa{5B5{i$EvKFFdKPgcWEqFIsO?T?m&WajQkLHfE5A^JdYC=nTZ}5E)W?taU>T6Ii_ zR*iL}I%$t#(Wxr{2dJ0>bvq^NcM^KiqDOKCI9*O9HZJNO-rx+?yiVVmgGSS@! zcGRyH`i^nwe}i!uaCfEu5toB;i{bXaVy%OpUnD;yXVwo0#T8iVREnAj?~clArDIqVgdaV zN5i{b!gOqQbQ{s5j&3JbDVm2M zOTNRL)Uv#bA-*(&Z%Ezqvg&>mc!Wpv{9!ty0=!Uyv+?xx&9sLfsNkZhjzzy zmRvzhi7(y`U1Oa?kH@6(EC)Y8dURRoZ^xt)PI}9-(wAb=O-|acm!`h*ApJfec?C7U z{5dac8BfiBjYG42lja3EqliW_*^_6944j3QPh&XuXsvb~nXw;=#uclUN zgziVfuk!tfxL~<(lv5^LU1Gl)(|jzV803 z`~=*|X(il-XcT$;enYe;adDawa7U+^#F81fo6}5_n~@WGCU$#Su5vN=-Axy4lx`wt^~gU35quZo zJ`>ZZvoyjTRp?0?rQ>ZpDwM`iPkF5&&Rpz^)Im0$;`2LdmFU+F6Tx9QpIG`%em8Q> z8Jk-9ZoY}XzkB#CQS-0*W8Agn_m=Mp9)Is$dWYO}j3ptaDR+;GAxk~!hwOuVtpt1{ zok=Z}Z1KNCvYPwRQv|%xxw=zCXKJU2yaP)|;w}P1bWVU}ytdj4b#)S6~r;Y1Y z)^-Th265%{uAMouzC&`q9qK~wT_8)EU`{OUtZAW{PM4vQT|TdX?BV>3(2Mq7?r57Y zNBSR1enh%F`aVoOZ}W|a1iu|>XK%HCC26c*>5zU`L>l!i+Fz3lp0fI8r0b=U@WhVD zF(QhAp1XqC=G|P^enIS1q_KA|RzF8vjkKoWvXQFE+EJBaOZ)_D|UB(vkRt0m*8&&e5p- zW%;j!YLDV4**&_6@f*8kZ;EYOrQd)<{w}ItQ78}T Jp0T8R{}<24@-6@X diff --git a/root/data/scripts/test2.int b/root/data/scripts/test2.int index 17752732a5106cf159eff8b54d7f98ec1e7d8af8..d12f1c588cfd674e7b094749b8e062386846bb9c 100644 GIT binary patch literal 16974 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 I4ZlnOUnXqk1poj5 diff --git a/root/data/text/english/dialog/test2.msg b/root/data/text/english/dialog/test2.msg index 978d593..7916508 100644 --- a/root/data/text/english/dialog/test2.msg +++ b/root/data/text/english/dialog/test2.msg @@ -1,9 +1,9 @@ # 0 - 5000 reserved for traps # trap types -{10}{}{spike trap} -{11}{}{pressure plate trap} -{12}{}{proximity sensor trap} -{13}{}{bear trap} +{11}{}{spike trap} +{12}{}{bear trap} +{13}{}{mine trap} +{14}{}{proximity sensor trap} # traps look at {50}{}{You see a %s.} diff --git a/root/data/text/russian/dialog/test2.msg b/root/data/text/russian/dialog/test2.msg index 717092b..7cccbb7 100644 --- a/root/data/text/russian/dialog/test2.msg +++ b/root/data/text/russian/dialog/test2.msg @@ -1,10 +1,10 @@ # phobos2077 crafting. Translated by Pyran. Corrected and added by Drobovik. # 0 - 5000 reserved for traps # trap types -{10}{}{ловушку с шипами} -{11}{}{мину-ловушку} -{12}{}{ловушку с сенсорным детонатором} -{13}{}{ловушку-капкан} +{11}{}{ловушку с шипами} +{12}{}{ловушку-капкан} +{13}{}{мину-ловушку} +{14}{}{ловушку с сенсорным детонатором} # traps look at {50}{}{Вы видите %s.} diff --git a/root/mods/ecco/traps.ini b/root/mods/ecco/traps.ini deleted file mode 100644 index 69cd4ff..0000000 --- a/root/mods/ecco/traps.ini +++ /dev/null @@ -1,62 +0,0 @@ -[TRAPS] -; This is a hotkey for assembling the trap in active slot: Ctrl+1 -assemble_hotkey=29+2 - -; traps friend or foe recognition: -; 0 - trigger by anyone, 1 - don't trigger by dude, 2 - don't trigger by party members, 3 - both 1 and 2 -trap_friendfoe=3 - -; if arming a trap is considered a crime (if you are seen doing it, you will be attacked; 0 to disable) -trap_is_crime=1 -; if critter sets off your trap, he will know it's you and will attack (0 to disable), this also affect critters cought in trap explosion -trap_reveals_dude=1 - -; trap install difficulty, roll-vs-skill modifier is summed from skill_ground_, skill_type_ and skill_arm_ values (for explosive traps) -skill_ground_dirt=-30 -skill_ground_wood=-20 -skill_ground_stone=-10 -skill_ground_other=0 - -; Spike trap -skill_type_0=10 -; Mine trap -skill_type_1=10 -; Sensor mine trap -skill_type_2=30 -; Bear trap -skill_type_3=40 - -; armament skill modifier for each PID: -; frag grenade -skill_arm_25=10 -; plasma grenade -skill_arm_26=30 -; pulse grenade -skill_arm_27=30 -; dynamite -skill_arm_51=50 -; plastic explosives -skill_arm_85=50 -; Molotov -skill_arm_159=20 -; home-made grenade -skill_arm_613=0 - -; Spike trap -damage_min_0=8 -damage_max_0=16 - -; Bear trap -damage_min_3=12 -damage_max_3=24 - - - -; TODO: this is not implemented yet -[trap_0] -item_pid=616 -trap_pid=0x0200091F ; 33556767 -dmg_min=8 -dmg_max=16 -skill_mod=-10 -armaments=25,26,27,51,85,159,613 diff --git a/scripts_src/_pbs_headers/traps.h b/scripts_src/_pbs_headers/traps.h index 2cfdebf..3986c85 100644 --- a/scripts_src/_pbs_headers/traps.h +++ b/scripts_src/_pbs_headers/traps.h @@ -5,7 +5,6 @@ #ifndef PBS_TRAPS_H #define PBS_TRAPS_H - #include "../sfall/sfall.h" #include "../sfall/lib.arrays.h" #include "../sfall/lib.strings.h" @@ -23,27 +22,8 @@ #define SCRIPT_PBS_TRAPS SCRIPT_TEST2 -#define is_explosive_pid(pid) (pid == PID_FRAG_GRENADE or pid == PID_PBS_HOMEMADE_GRENADE \ - or pid == PID_DYNAMITE or pid == PID_PLASTIC_EXPLOSIVES \ - or pid == PID_PULSE_GRENADE or pid == PID_PLASMA_GRENADE or pid == PID_MOLOTOV_COCKTAIL) - -#define TRAPINFO_SIZE (10) - -#define TRAPINFO_OFS_INDEX (0) // trap record start index in SGVAR_TRAPS_BY_DUDE array -#define TRAPINFO_OFS_TILE (1) // trap tile -#define TRAPINFO_OFS_ELEV (2) // elevation -#define TRAPINFO_OFS_MAP (3) // map index -#define TRAPINFO_OFS_TYPE (4) // trap type -#define TRAPINFO_OFS_ARMPID (5) // trap armament item PID -#define TRAPINFO_OFS_STATE (6) // see below -#define TRAPINFO_OFS_OBJPID (7) // pid of visual object (eg. floor plate) -#define TRAPINFO_OFS_CHARGES (8) // number of uses left -#define TRAPINFO_OFS_FLAGS (9) // flags, see below -// reserved up to (9) - -#define TRAP_STATE_ACTIVE (0) -#define TRAP_STATE_SETOFF (1) -#define TRAP_STATE_DISARMED (2) +#define TRAP_STATE_DISARMED (0) +#define TRAP_STATE_ACTIVE (1) #define TRAP_FRAME_DEFAULT (0) #define TRAP_FRAME_ACTIVE (1) @@ -53,48 +33,6 @@ #define TRAP_TYPE_SENSOR (2) #define TRAP_TYPE_BEAR (3) -//#define TRAP_OBJECT_PID PID_METAL_FLOOR_TRAP_VISIBLE -//#define TRAP_OBJECT_PID_DISARMED PID_METAL_FLOOR_TRAP_DISARMED - -#define is_trap_kit_pid(pid) (pid == PID_PBS_TRAP_KIT_MINE or pid == PID_PBS_TRAP_KIT_SPIKE or pid == PID_PBS_TRAP_KIT_SENSOR or pid == PID_PBS_TRAP_KIT_BEAR) - -pure procedure tile_contains_any_trap(variable tile, variable elev) begin - variable pids, pid; - pids := [PID_METAL_FLOOR_TRAP_VISIBLE, PID_METAL_FLOOR_TRAP_DISARMED, PID_METAL_FLOOR_TRAP_DEPRESSED, - PID_CAVE_FLOOR_TRAP_VISIBLE, PID_CAVE_FLOOR_TRAP_DISARMED, PID_CAVE_FLOOR_TRAP_DEPRESSED, - PID_PBS_SPIKE_TRAP, PID_PBS_MINE_TRAP, PID_PBS_SENSOR_MINE, PID_PBS_BEAR_TRAP, - PID_PBS_TRAP_RESERVED_4, PID_PBS_TRAP_RESERVED_6]; - foreach (pid in pids) begin - if (tile_contains_obj_pid(tile, elev, pid)) then return true; - end - return false; -end - -/*#define tile_contains_any_trap(tile, elev) (tile_contains_obj_pid(tile, elev, PID_METAL_FLOOR_TRAP_VISIBLE) \ - or tile_contains_obj_pid(tile, elev, PID_METAL_FLOOR_TRAP_DISARMED) \ - or tile_contains_obj_pid(tile, elev, PID_METAL_FLOOR_TRAP_DEPRESSED) \ - or tile_contains_obj_pid(tile, elev, PID_CAVE_FLOOR_TRAP_VISIBLE) \ - or tile_contains_obj_pid(tile, elev, PID_CAVE_FLOOR_TRAP_DISARMED) \ - or tile_contains_obj_pid(tile, elev, PID_CAVE_FLOOR_TRAP_DEPRESSED))*/ - -#define trap_index(x,y) get_array(x, y + TRAPINFO_OFS_INDEX) -#define trap_tile(x,y) get_array(x, y + TRAPINFO_OFS_TILE) -#define trap_elev(x,y) get_array(x, y + TRAPINFO_OFS_ELEV) -#define trap_map(x,y) get_array(x, y + TRAPINFO_OFS_MAP) -#define trap_type(x,y) get_array(x, y + TRAPINFO_OFS_TYPE) -#define trap_armpid(x,y) get_array(x, y + TRAPINFO_OFS_ARMPID) -#define trap_state(x,y) get_array(x, y + TRAPINFO_OFS_STATE) -#define trap_objpid(x,y) get_array(x, y + TRAPINFO_OFS_OBJPID) -#define trap_charges(x,y) get_array(x, y + TRAPINFO_OFS_CHARGES) -#define trap_flags(x,y) get_array(x, y + TRAPINFO_OFS_FLAGS) -#define trap_object(x,y) tile_contains_pid_obj(trap_tile(x,y), trap_elev(x,y), trap_objpid(x,y)) - -// TODO: use config? -#define is_trap_customizable_type(type) (type == TRAP_TYPE_MINE or type == TRAP_TYPE_SENSOR) - -// TODO: 100% or config? -#define TRAP_SENSOR_CHANCE (70) - // custom timed_event's #define TRAP_EVENT_INIT (0) #define TRAP_EVENT_DESTROY (1) @@ -111,24 +49,11 @@ end #define make_critter_angry(obj) add_array_set(load_create_array(ARR_ANGRY_TEAMS, 0), obj_team(obj)) -// TODO: better solution? arrays? based on config data? -#define trapkit_pid_by_trap_type(type) ((type == TRAP_TYPE_SPIKE)*PID_PBS_TRAP_KIT_SPIKE \ - +(type == TRAP_TYPE_MINE)*PID_PBS_TRAP_KIT_MINE \ - +(type == TRAP_TYPE_SENSOR)*PID_PBS_TRAP_KIT_SENSOR \ - +(type == TRAP_TYPE_BEAR)*PID_PBS_TRAP_KIT_BEAR) - -#define trap_type_by_trapkit_pid(pid) ((pid == PID_PBS_TRAP_KIT_SPIKE)*TRAP_TYPE_SPIKE \ - +(pid == PID_PBS_TRAP_KIT_MINE)*TRAP_TYPE_MINE \ - +(pid == PID_PBS_TRAP_KIT_SENSOR)*TRAP_TYPE_SENSOR \ - +(pid == PID_PBS_TRAP_KIT_BEAR)*TRAP_TYPE_BEAR) +#define trapkit_pid_by_trap_type(type) (pbs_trap_config.types[type].item_pid) +#define trap_type_by_trapkit_pid(pid) (pbs_trap_config.item_to_type[pid]) +#define is_trap_kit_pid(pid) (trap_type_by_trapkit_pid(pid) != 0) -procedure create_trap_object(variable trapType, variable tile, variable elev, variable charges); - -procedure react_hostile_action; - -procedure trap_setoff_explosion(variable trapObj, variable mainTarget, variable dmgMin, variable dmgMax, variable radius, variable dmgType, variable isCritical, variable pid, variable sfx); -procedure trap_setoff_melee(variable critter, variable dmgMin, variable dmgMax, variable dmgType, variable isCritical, variable stopTurns); #define send_trap_init_event(obj, type, charges) add_timer_event(obj, 0, TRAP_EVENT_INIT + 0x100 * (type bwand 0xFF) + 0x10000 * (charges bwand 0xFF)) @@ -146,36 +71,52 @@ end #define _EXPORT_VAR(name, value) import variable name; #endif +_EXPORT_VAR(pbs_trap_config, 0) _EXPORT_VAR(pbs_trap_victims, 0) // maps trap object to it's victim, used to "send" object from spatial script -_EXPORT_VAR(pbs_ini_trap_is_crime, 1) -_EXPORT_VAR(pbs_ini_trap_reveals_dude, 1) -_EXPORT_VAR(pbs_ini_trap_friendfoe, 1) _EXPORT_VAR(pbs_trap_last_target, 0) _EXPORT_VAR(pbs_trap_last_target_dead, 0) _EXPORT_VAR(pbs_trap_hold_critters, 0) #undef _EXPORT_VAR + +procedure create_trap_object(variable trapType, variable tile, variable elev, variable charges); +procedure react_hostile_action; +procedure trap_setoff_explosion(variable trapObj, variable mainTarget, variable dmgMin, variable dmgMax, variable radius, variable dmgType, variable isCritical, variable pid, variable sfx); +procedure trap_setoff_melee(variable critter, variable dmgMin, variable dmgMax, variable dmgType, variable isCritical, variable stopTurns); + +variable trap_object_pid_set; + +pure procedure tile_contains_any_trap(variable tile, variable elev) begin + if not trap_object_pid_set then begin + trap_object_pid_set := array_fixed(array_to_set(array_keys(pbs_trap_config.pid_to_type))); + call array_append(trap_object_pid_set, array_to_set([ + PID_METAL_FLOOR_TRAP_VISIBLE, PID_METAL_FLOOR_TRAP_DISARMED, PID_METAL_FLOOR_TRAP_DEPRESSED, + PID_CAVE_FLOOR_TRAP_VISIBLE, PID_CAVE_FLOOR_TRAP_DISARMED, PID_CAVE_FLOOR_TRAP_DEPRESSED])); + debug_log("trap_object_pid_set: "+debug_array_str(trap_object_pid_set)); + end + variable obj, objs := tile_get_objs(tile, elev); + foreach (obj in objs) begin + if (trap_object_pid_set[obj_pid(obj)]) then return true; + end + return false; +end + +pure procedure is_suitable_armament(variable pid, variable type) begin + variable arms := pbs_trap_config.types[type].armaments; + debug_log("arms="+debug_array_str(arms)); + return is_in_array(pid, arms) if arms else false; +end + + /** Create new trap object with correct PID, and init properly. Used when creating and transforming trap. @param type - type of trap */ -// TODO: remove state procedure create_trap_object(variable type, variable tile, variable elev, variable charges) begin - variable begin - newPid := 0; - newObj; - end - // TODO: use one PID and just change FID instead? - if (type == TRAP_TYPE_SPIKE) then begin - newPid := PID_PBS_SPIKE_TRAP; - end else if (type == TRAP_TYPE_MINE) then begin - newPid := PID_PBS_MINE_TRAP; - end else if (type == TRAP_TYPE_SENSOR) then begin - newPid := PID_PBS_SENSOR_MINE; - end else if (type == TRAP_TYPE_BEAR) then begin - newPid := PID_PBS_BEAR_TRAP; - end else begin + variable newPid := 0, newObj; + newPid := 0x02000000 + pbs_trap_config.types[type].trap_pid; + if (newPid == 0) then begin debug_err("Invalid trap type: "+type); return 0; end @@ -293,7 +234,7 @@ procedure trap_damage_critter(variable critter, variable dmgMin, variable dmgMax pbs_trap_hold_critters[critter] := array_fixed([stop, tile_num(critter)]); debug_log("Stopping critter: "+debug_array_str(pbs_trap_hold_critters)); end - if (pbs_ini_trap_reveals_dude) then begin + if (pbs_trap_config.reveal_dude) then begin debug_log("Making angry!"); call make_critter_angry(critter); end @@ -363,7 +304,7 @@ procedure trap_setoff_melee(variable critter, variable dmgMin, variable dmgMax, end end -procedure get_suitable_armament_in_inventory(variable critter) begin +procedure get_suitable_armament_in_inventory(variable critter, variable trapType) begin variable item, lastPid, list; lastPid := get_sfall_global_int(SGVAR_TRAPS_LAST_ARMAMENT); // first search for last used item PID @@ -374,7 +315,7 @@ procedure get_suitable_armament_in_inventory(variable critter) begin // if none, then search for any suitable armament list := inven_as_array(critter); foreach item in list begin - if is_explosive_pid(obj_pid(item)) then return item; + if is_suitable_armament(obj_pid(item), trapType) then return item; end return 0; end diff --git a/scripts_src/_pbs_main/gl_pbs_traps.ssl b/scripts_src/_pbs_main/gl_pbs_traps.ssl index c1e75e6..cdc72ed 100644 --- a/scripts_src/_pbs_main/gl_pbs_traps.ssl +++ b/scripts_src/_pbs_main/gl_pbs_traps.ssl @@ -41,12 +41,13 @@ variable angry_set; //variable ar_explosions; variable attack_delay := -1; -variable ini_assemble_hotkey; +variable assemble_hotkey; variable last_hold_reset_time := -1; -#define cfg_parse_int(cfg, ini, name) if (ini.name) then cfg.name := atoi(ini.name) -#define cfg_parse_intlist(cfg, ini, name) if (ini.name) then cfg.name := string_split_ints(ini.name, ",") -#define cfg_parse_hotkey(cfg, ini, name) if (ini.name) then cfg.name := parse_hotkey(ini.name) +#define cfg_parse_int(cfg, ini, name) if (ini.name) then cfg.name := atoi(ini.name) +#define cfg_parse_int_def(cfg, ini, name, def) cfg.name := atoi(ini.name) if ini.name else def +#define cfg_parse_intlist(cfg, ini, name) if (ini.name) then cfg.name := array_fixed(string_split_ints(ini.name, ",")) +#define cfg_parse_hotkey(cfg, ini, name) if (ini.name) then cfg.name := parse_hotkey(ini.name) procedure load_traps_config begin variable @@ -55,31 +56,48 @@ procedure load_traps_config begin cfg := create_array_map; cfg_parse_hotkey(cfg, iniMain, assemble_hotkey); - cfg_parse_int(cfg, iniMain, friendfoe); - cfg_parse_int(cfg, iniMain, arming_is_crime); - cfg_parse_int(cfg, iniMain, reveal_dude); + cfg_parse_int_def(cfg, iniMain, friendfoe, 1); + cfg_parse_int_def(cfg, iniMain, arming_is_crime, 0); + cfg_parse_int_def(cfg, iniMain, reveal_dude, 0); - cfg.armament_skill := array_fixed(array_transform_kv(ini["Armament_Skill"], @string_to_int, @string_to_int)); + //cfg.armament_skill := array_fixed(array_transform_kv(ini["Armament_Skill"], @string_to_int, @string_to_int)); cfg.ground_skill := array_fixed(array_transform(ini["Ground_Skill"], @string_to_int)); cfg.types := create_array_map; - + cfg.item_to_type := create_array_map; + cfg.pid_to_type := create_array_map; + cfg.armaments := create_array_map; + variable sectName, section; - variable prefix := "Trap_"; + variable trapPrefix := "Trap_", armamentPrefix := "Armament_"; foreach (sectName: section in ini) begin - if (string_starts_with(sectName, prefix)) then begin + if (string_starts_with(sectName, trapPrefix)) then begin variable - type := atoi(substr(sectName, strlen(prefix), 0)), + type := atoi(substr(sectName, strlen(trapPrefix), 0)), typeCfg := create_array_map; - cfg_parse_int(typeCfg, section, name_msg); cfg_parse_int(typeCfg, section, item_pid); cfg_parse_int(typeCfg, section, trap_pid); + cfg_parse_int(typeCfg, section, radius); cfg_parse_int(typeCfg, section, stop); cfg_parse_int(typeCfg, section, dmg_min); cfg_parse_int(typeCfg, section, dmg_max); cfg_parse_int(typeCfg, section, skill_mod); cfg_parse_intlist(typeCfg, section, armaments); cfg.types[type] := typeCfg; + if (typeCfg.item_pid) then cfg.item_to_type[typeCfg.item_pid] := type; + if (typeCfg.trap_pid) then cfg.pid_to_type[typeCfg.trap_pid] := type; + end else if (string_starts_with(sectName, armamentPrefix)) then begin + variable armPid := atoi(substr(sectName, strlen(armamentPrefix), 0)); + if (armPid > 0) then begin + variable armCfg := create_array_map; + cfg_parse_int(armCfg, section, skill_mod); + cfg_parse_int_def(armCfg, section, radius, -1); + cfg_parse_int(armCfg, section, dmg_min); + cfg_parse_int(armCfg, section, dmg_max); + cfg_parse_int_def(armCfg, section, dmg_type, -1); // differentiate 0 (DMG_normal_dam) from no value + // audio_sfx + cfg.armaments[armPid] := armCfg; + end end end return cfg; @@ -177,16 +195,13 @@ procedure start begin //call roll_test(100, 5, -50, 5, 0.2); - // exported settings - pbs_ini_trap_reveals_dude := get_int_from_ini(INI_FILE, INI_SECTION, "trap_reveals_dude"); - pbs_ini_trap_friendfoe := get_int_from_ini(INI_FILE, INI_SECTION, "trap_friendfoe"); - pbs_ini_trap_is_crime := get_int_from_ini(INI_FILE, INI_SECTION, "trap_is_crime"); - ini_assemble_hotkey := parse_hotkey(get_str_from_ini(INI_FILE, INI_SECTION, "assemble_hotkey")); - pbs_trap_config := load_traps_config; + + assemble_hotkey := pbs_trap_config.assemble_hotkey; + debug_log(debug_array_str(pbs_trap_config)); debug_log("types: "+debug_array_str_deep(pbs_trap_config.types, 2)); - debug_log("armaments: "+debug_array_str(pbs_trap_config.armament_skill)); + debug_log("armaments: "+debug_array_str_deep(pbs_trap_config.armaments, 2)); debug_log("ground: "+debug_array_str(pbs_trap_config.ground_skill)); // initialize global and exported arrays @@ -218,7 +233,7 @@ end procedure keypress_hook begin variable pressed := get_sfall_arg, key := get_sfall_arg; - if (pressed and not(get_game_mode bwand bwnot(COMBAT + PCOMBAT))) then if (hotkey_pressed_now(ini_assemble_hotkey, key)) then begin + if (pressed and not(get_game_mode bwand bwnot(COMBAT + PCOMBAT))) then if (hotkey_pressed_now(assemble_hotkey, key)) then begin variable item; item := critter_inven_obj(dude_obj, 2 - active_hand); if (item) then if (is_trap_kit_pid(obj_pid(item))) then begin diff --git a/scripts_src/_pbs_main/test2.ssl b/scripts_src/_pbs_main/test2.ssl index 58ffda3..2611820 100644 --- a/scripts_src/_pbs_main/test2.ssl +++ b/scripts_src/_pbs_main/test2.ssl @@ -15,6 +15,7 @@ #include "../sfall/define_lite.h" #include "../sfall/command_lite.h" #include "../sfall/command_extra.h" +#include "../sfall/lib.strings.h" #include "../_pbs_headers/traps.h" procedure start; @@ -59,16 +60,18 @@ procedure trap_setoff_effect(variable pid, variable critter); #define my_trap_charges local_var(LVAR_Charges) #define set_my_trap_charges(x) set_local_var(LVAR_Charges, x) +#define my_trap_cfg pbs_trap_config.types[my_trap_type] -#define i_am_trap (my_trap_type >= 0) +#define i_am_trap (my_trap_type > 0) #define i_am_armed (my_trap_state == TRAP_STATE_ACTIVE) -#define i_am_customizable (is_trap_customizable_type(my_trap_type)) +#define i_am_customizable (my_trap_cfg.armaments != 0) /* procedure try_initialize begin if (initialized) then return; - if (self_pid == -1) then begin + variable pid := self_pid; + if (pid == -1) then begin set_my_trap_type(TRAP_TYPE_SPATIAL); end else begin // Trap type will be passed via TRAP_EVENT_INIT @@ -111,7 +114,7 @@ procedure timed_event_p_proc begin set_my_trap_type((fixed_param / 0x100) bwand 0xFF); set_my_trap_charges((fixed_param / 0x10000) bwand 0xFF); set_my_trap_state(TRAP_STATE_DISARMED); - debug_log_fmt("Init event. Type: %d, charges: %d, spatial: %d, id: %d.", my_trap_type, my_trap_charges, self_pid == -1, get_object_data(self_obj, OBJ_DATA_ID)); + debug_log_fmt("Init event. Type: %d, charges: %d, spatial: %d.", my_trap_type, my_trap_charges, self_pid == -1); end else if (eventType == TRAP_EVENT_DESTROY) then begin destroy_object(self_obj); end else if (eventType == TRAP_EVENT_SETOFF) then begin @@ -143,26 +146,20 @@ end procedure spatial_p_proc begin script_overrides; - debug_log("SPATIAL!!! "+(obj_name(source_obj) if source_obj else "none")); variable critter := source_obj; if (not is_critter_dead(critter)) - and (critter != dude_obj or (pbs_ini_trap_friendfoe bwand TRAP_FRIENDFOE_DUDE) == 0) - and (critter == dude_obj or not obj_in_party(critter) or (pbs_ini_trap_friendfoe bwand TRAP_FRIENDFOE_PARTY) == 0) then + and (critter != dude_obj or (pbs_trap_config.friendfoe bwand TRAP_FRIENDFOE_DUDE) == 0) + and (critter == dude_obj or not obj_in_party(critter) or (pbs_trap_config.friendfoe bwand TRAP_FRIENDFOE_PARTY) == 0) then begin - // spike or sensor traps go off at 1 hex radius - variable critterTile := tile_num(critter); - if (critterTile == self_tile - or ((my_trap_type == TRAP_TYPE_SENSOR or my_trap_type == TRAP_TYPE_SPIKE) and random(0, 99) < TRAP_SENSOR_CHANCE)) then - begin - // This is run on a separate spatial script, so we can't call setoff directly, use events. - variable obj; - foreach (obj in tile_get_objs(self_tile, self_elevation)) begin - // Setoff all trap objects we can find on this tile. - if (get_script(obj) == SCRIPT_PBS_TRAPS and obj_pid(obj) != -1) then begin - pbs_trap_victims[obj] := critter; - add_timer_event(obj, 0, TRAP_EVENT_SETOFF); - end + debug_log("Triggering trap! "+obj_name_safe(source_obj)); + // This is run on a separate spatial script, so we can't call setoff directly, use events. + variable obj; + foreach (obj in tile_get_objs(self_tile, self_elevation)) begin + // Setoff all trap objects we can find on this tile. + if (get_script(obj) == SCRIPT_PBS_TRAPS and obj_pid(obj) != -1) then begin + pbs_trap_victims[obj] := critter; + add_timer_event(obj, 0, TRAP_EVENT_SETOFF); end end end @@ -224,7 +221,7 @@ procedure use_obj_on_p_proc begin if (i_am_trap and not(i_am_armed)) then begin script_overrides; if (i_am_customizable) then begin - if (is_explosive_pid(pid)) then begin + if (is_suitable_armament(pid, my_trap_type)) then begin call dude_try_to_arm_trap(obj_being_used_with); end else begin display_mstr(411); @@ -247,7 +244,7 @@ procedure use_skill_on_p_proc begin end else begin if (i_am_customizable) then begin // try to automatically find suited armament for trap - item := get_suitable_armament_in_inventory(source_obj); + item := get_suitable_armament_in_inventory(source_obj, my_trap_type); if (item) then begin call dude_try_to_arm_trap(item); end else begin @@ -268,9 +265,14 @@ procedure use_skill_on_p_proc begin end procedure dude_disarm_and_pickup_trap begin - variable item; - item := create_object(trapkit_pid_by_trap_type(my_trap_type), 0, 0); - set_weapon_ammo_count(item, my_trap_charges); + variable + itemPid := trapkit_pid_by_trap_type(my_trap_type), + item := create_object(itemPid, 0, 0); + + variable charges := my_trap_charges; + if (charges <= 0) then charges := get_proto_data(itemPid, PROTO_MI_CHARGES); + + set_weapon_ammo_count(item, charges); add_obj_to_inven(source_obj, item); if (my_trap_armpid > 0) then begin item := create_object(my_trap_armpid, 0, 0); @@ -293,6 +295,7 @@ procedure dude_try_to_arm_trap(variable armamentObj) begin arr; i; armamentPid := 0; + armamentCfg; groundFid; end @@ -307,18 +310,19 @@ procedure dude_try_to_arm_trap(variable armamentObj) begin else groundType:="other"; - trapTypeMod := get_int_from_ini(INI_FILE, INI_SECTION, "skill_type_" + my_trap_type); - groundTypeMod := get_int_from_ini(INI_FILE, INI_SECTION, "skill_ground_" + groundType); + trapTypeMod := pbs_trap_config.types[my_trap_type].skill_mod; + groundTypeMod := pbs_trap_config.ground_skill[groundType]; if (armamentObj) then begin armamentPid := obj_pid(armamentObj); - armTypeMod := get_int_from_ini(INI_FILE, INI_SECTION, "skill_arm_" + armamentPid); + armamentCfg := pbs_trap_config.armaments[armamentPid]; + armTypeMod := armamentCfg.skill_mod if armamentCfg else 0; // remember last used armament (if any), regardless if it will be success or fail set_sfall_global(SGVAR_TRAPS_LAST_ARMAMENT, armamentPid); end - rollMod := -(trapTypeMod + groundTypeMod + armTypeMod); + rollMod := trapTypeMod + groundTypeMod + armTypeMod; roll := roll_vs_traps_ext(dude_obj, rollMod); //debug_log_fmt("Armament: %s (%d)", obj_name(armamentObj), armamentPid); - debug_log_fmt("roll-vs-traps: %d, Mod: %s, How Much: %d (difficulty: %d)", roll, string_format("%d=%d+%d+%d", rollMod, -groundTypeMod, -trapTypeMod, -armTypeMod), traps_how_much, difficulty_level); + debug_log_fmt("roll-vs-traps: %d, Mod: %s, How Much: %d (difficulty: %d)", roll, string_format("%d=%d+%d+%d", rollMod, groundTypeMod, trapTypeMod, armTypeMod), traps_how_much, difficulty_level); if (is_success(roll)) then begin if (armamentObj) then begin @@ -357,10 +361,10 @@ procedure arm_trap(variable armPid, variable isCrit) begin set_my_trap_state(TRAP_STATE_ACTIVE); set_my_trap_armpid(armPid); debug_log("Creating spatial."); - variable spatialObj := create_spatial(SCRIPT_PBS_TRAPS, self_tile, self_elevation, 1); + variable spatialObj := create_spatial(SCRIPT_PBS_TRAPS, self_tile, self_elevation, my_trap_cfg.radius); // 0 radius by default send_trap_init_event(spatialObj, my_trap_type, my_trap_charges); - if (pbs_ini_trap_is_crime) then begin + if (pbs_trap_config.arming_is_crime) then begin call react_hostile_action; end end @@ -388,50 +392,50 @@ end @param armPid - pid of trap armament @param critter - critter recieving the damage */ -procedure trap_setoff_effect(variable armPid, variable critter) begin +procedure trap_setoff_effect(variable armPid, variable critter) begin\ + variable typeCfg := pbs_trap_config.types[my_trap_type]; if (armPid) then begin // explosive trap variable - dmgMinMax := get_explosion_damage(armPid), - dmgMin := dmgMinMax[0], - dmgMax := dmgMinMax[1], - radius := 3, - dmgType := DMG_explosion, - effectPid, audioSfx; - - if (dmgMin <= 0 and dmgMax <= 0) then begin + armCfg := pbs_trap_config.armaments[armPid], + dmgMin := armCfg.dmg_min, + dmgMax := armCfg.dmg_max, + dmgType := armCfg.dmg_type, + radius := armCfg.radius, + audioSfx := armCfg.audio_sfx, + explDmg := get_explosion_damage(armPid), + effectPid; + + if (explDmg[0] > 0 or explDmg[1] > 0) then begin // explosive item + if (dmgMin == 0 and dmgMax == 0) then begin + dmgMin := explDmg[0]; + dmgMax := explDmg[1]; + end + if (dmgType < 0) then dmgType := DMG_explosion; + if (radius < 0) then radius := 3; // vanilla explosive radius + end else begin // not explosive, must be weapon (grenade) if (proto_data(armPid, it_type) != item_type_weapon) then begin debug_err("trap_setoff_effect: Invalid trap armanent pid: "+armPid); return; end - // NOT Dynamite, Plastic or custom explosive type - dmgMin := get_proto_data(armPid, PROTO_WP_DMG_MIN); - dmgMax := get_proto_data(armPid, PROTO_WP_DMG_MAX); - dmgType := get_proto_data(armPid, PROTO_WP_DMG_TYPE); - radius := 2; // default grenade radius - if (armPid == PID_FRAG_GRENADE or armPid == PID_PBS_HOMEMADE_GRENADE) then begin - audioSfx := "WHO1XXX" + random(1,2); - end else if (armPid == PID_MOLOTOV_COCKTAIL) then begin - dmgType := DMG_fire; - audioSfx := "WHO1XXX2"; - end else if (armPid == PID_PLASMA_GRENADE) then begin - effectPid := PID_EXPLOSION_PLASMA_1; - audioSfx := "WHP1XXX1"; - end else if (armPid == PID_PULSE_GRENADE) then begin - effectPid := PID_EXPLOSION_EMP_1; - audioSfx := "WHQ1XXX1"; + if (dmgMin == 0 and dmgMax == 0) then begin + dmgMin := get_proto_data(armPid, PROTO_WP_DMG_MIN); + dmgMax := get_proto_data(armPid, PROTO_WP_DMG_MAX); + end + if (dmgType < 0) then dmgType := get_proto_data(armPid, PROTO_WP_DMG_TYPE); + if (radius < 0) then radius := 2; // vanilla grenade radius + if (audioSfx == 0) then begin + variable soundCode := get_proto_data(armPid, PROTO_WP_SOUND); + audioSfx := sprintf("WH%c1XXX1", soundCode); end end call trap_setoff_explosion(self_obj, critter, dmgMin, dmgMax, radius, dmgType, is_critical_hit, effectPid, audioSfx); - end else begin - variable - trapType := my_trap_type, - trapCharges := my_trap_charges; - - // "melee" trap - dmgMin := math_max(get_int_from_ini(INI_FILE, INI_SECTION, "damage_min_"+trapType), 0); - dmgMax := math_max(get_int_from_ini(INI_FILE, INI_SECTION, "damage_max_"+trapType), 0); + end else begin // "melee" trap + variable stop := typeCfg.stop; + if (my_trap_charges <= 1 and stop > 1) then stop := 1; // trap can't hold critter if it's destroyed + dmgMin := typeCfg.dmg_min; + dmgMax := typeCfg.dmg_max; - call trap_setoff_melee(critter, dmgMin, dmgMax, DMG_normal_dam, is_critical_hit, 3 if (trapType == TRAP_TYPE_BEAR and trapCharges > 1) else 1); + call trap_setoff_melee(critter, dmgMin, dmgMax, DMG_normal_dam, is_critical_hit, stop); end end