Skip to content

Commit c4b9583

Browse files
authored
Make all trap types slappable (#3843)
also makes sure the TRAP#_ACTIVATED variable properly updates
1 parent 2715c7d commit c4b9583

File tree

4 files changed

+72
-10
lines changed

4 files changed

+72
-10
lines changed

src/player_instances.c

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -254,17 +254,18 @@ long pinstfe_hand_whip(struct PlayerInfo *player, long *n)
254254
trapst = get_trap_model_stats(thing->model);
255255
if ((trapst->slappable > 0) && trap_is_active(thing))
256256
{
257-
struct Thing* trgtng = INVALID_THING;
258-
shotst = get_shot_model_stats(trapst->created_itm_model);
259-
if (trapst->slappable == 1)
260-
{
261-
external_activate_trap_shot_at_angle(thing, player->acamera->orient_a, trgtng);
262-
} else
263-
if (trapst->slappable == 2)
257+
activate_trap_by_slap(player, thing);
258+
259+
struct Dungeon* dungeon = get_dungeon(thing->owner);
260+
if (!dungeon_invalid(dungeon))
264261
{
265-
trgtng = get_nearest_enemy_creature_in_sight_and_range_of_trap(thing);
266-
external_activate_trap_shot_at_angle(thing, player->acamera->orient_a, trgtng);
262+
dungeon->trap_info.activated[thing->trap.flag_number]++;
263+
if (thing->trap.flag_number > 0)
264+
{
265+
memcpy(&dungeon->last_trap_event_location, &thing->mappos, sizeof(struct Coord3d));
266+
}
267267
}
268+
process_trap_charge(thing);
268269
}
269270
break;
270271
case TCls_Object:

src/thing_shots.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -885,6 +885,16 @@ static TbBool shot_hit_trap_at(struct Thing* shotng, struct Thing* target, struc
885885
if (((trapst->unstable == 1) && !(shotst->model_flags & ShMF_Disarming)) || trapst->unstable == 2)
886886
{
887887
activate_trap(target, target);
888+
struct Dungeon* dungeon = get_dungeon(target->owner);
889+
if (!dungeon_invalid(dungeon))
890+
{
891+
dungeon->trap_info.activated[target->trap.flag_number]++;
892+
if (target->trap.flag_number > 0)
893+
{
894+
memcpy(&dungeon->last_trap_event_location, &target->mappos, sizeof(struct Coord3d));
895+
}
896+
}
897+
process_trap_charge(target);
888898
}
889899
}
890900
if (shotst->destroy_on_first_hit) {

src/thing_traps.c

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -629,6 +629,56 @@ void activate_trap(struct Thing *traptng, struct Thing *creatng)
629629
}
630630
}
631631

632+
void activate_trap_by_slap(struct PlayerInfo *player, struct Thing* traptng)
633+
{
634+
struct Thing* trgtng = INVALID_THING;
635+
struct TrapConfigStats* trapst = get_trap_model_stats(traptng->model);
636+
TbBool special_case = false;
637+
638+
if (trapst->slappable == 2)
639+
{
640+
trgtng = get_nearest_enemy_creature_in_sight_and_range_of_trap(traptng);
641+
activate_trap(traptng, trgtng);
642+
}
643+
if (trapst->slappable == 1)
644+
{
645+
switch (trapst->activation_type)
646+
{
647+
case TrpAcT_EffectonTrap:
648+
case TrpAcT_ShotonTrap:
649+
case TrpAcT_SlabChange:
650+
case TrpAcT_CreatureSpawn:
651+
case TrpAcT_Power:
652+
activate_trap(traptng, trgtng);
653+
break;
654+
default:
655+
special_case = true;
656+
break;
657+
}
658+
659+
if (special_case == true)
660+
{
661+
traptng->trap.revealed = 1;
662+
if (trapst->notify == true)
663+
{
664+
event_create_event(traptng->mappos.x.val, traptng->mappos.y.val, EvKind_AlarmTriggered, traptng->owner, 0);
665+
}
666+
thing_play_sample(traptng, trapst->trigger_sound_idx, NORMAL_PITCH, 0, 3, 0, 2, FULL_LOUDNESS);
667+
668+
switch (trapst->activation_type)
669+
{
670+
case TrpAcT_HeadforTarget90:
671+
case TrpAcT_CreatureShot:
672+
external_activate_trap_shot_at_angle(traptng, player->acamera->orient_a, trgtng);
673+
break;
674+
default:
675+
ERRORLOG("Illegal trap activation type %d (idx=%d)", (int)trapst->activation_type, traptng->index);
676+
break;
677+
}
678+
}
679+
}
680+
}
681+
632682
TbBool find_pressure_trigger_trap_target_passing_by_subtile(const struct Thing *traptng, MapSubtlCoord stl_x, MapSubtlCoord stl_y, struct Thing **found_thing)
633683
{
634684
struct Map* mapblk = get_map_block_at(stl_x, stl_y);
@@ -1089,7 +1139,6 @@ void external_activate_trap_shot_at_angle(struct Thing *thing, short angle, stru
10891139
&& (trapst->activation_type != TrpAcT_HeadforTarget90))
10901140
{
10911141
activate_trap(thing, trgtng);
1092-
process_trap_charge(thing);
10931142
if (thing->trap.num_shots != INFINITE_CHARGES)
10941143
{
10951144
if (thing->trap.num_shots > 0) {

src/thing_traps.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,8 @@ TbBool rearm_trap(struct Thing *traptng);
9393
TngUpdateRet update_trap(struct Thing *thing);
9494
void init_traps(void);
9595
void activate_trap(struct Thing *traptng, struct Thing *creatng);
96+
void activate_trap_by_slap(struct PlayerInfo* player, struct Thing* traptng);
97+
void process_trap_charge(struct Thing* traptng);
9698

9799
unsigned long remove_trap(struct Thing *traptng, long *sell_value);
98100
unsigned long remove_trap_on_subtile(MapSubtlCoord stl_x, MapSubtlCoord stl_y, long *sell_value);

0 commit comments

Comments
 (0)