summaryrefslogtreecommitdiff
path: root/src/strife/p_telept.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/strife/p_telept.c')
-rw-r--r--src/strife/p_telept.c151
1 files changed, 82 insertions, 69 deletions
diff --git a/src/strife/p_telept.c b/src/strife/p_telept.c
index abd307c5..f947a9d9 100644
--- a/src/strife/p_telept.c
+++ b/src/strife/p_telept.c
@@ -46,65 +46,69 @@
//
// TELEPORTATION
//
+// haleyjd 09/22/10: [STRIFE] Modified to take a flags parameter to control
+// silent teleportation.
+//
int
EV_Teleport
-( line_t* line,
- int side,
- mobj_t* thing )
+( line_t* line,
+ int side,
+ mobj_t* thing,
+ teleflags_e flags)
{
- int i;
- int tag;
- mobj_t* m;
- mobj_t* fog;
- unsigned an;
- thinker_t* thinker;
- sector_t* sector;
- fixed_t oldx;
- fixed_t oldy;
- fixed_t oldz;
+ int i;
+ int tag;
+ mobj_t* m;
+ mobj_t* fog;
+ unsigned an;
+ thinker_t* thinker;
+ sector_t* sector;
+ fixed_t oldx;
+ fixed_t oldy;
+ fixed_t oldz;
// don't teleport missiles
if (thing->flags & MF_MISSILE)
- return 0;
+ return 0;
// Don't teleport if hit back of line,
// so you can get out of teleporter.
- if (side == 1)
- return 0;
+ if (side == 1)
+ return 0;
+
-
tag = line->tag;
for (i = 0; i < numsectors; i++)
{
- if (sectors[ i ].tag == tag )
- {
- thinker = thinkercap.next;
- for (thinker = thinkercap.next;
- thinker != &thinkercap;
- thinker = thinker->next)
- {
- // not a mobj
- if (thinker->function.acp1 != (actionf_p1)P_MobjThinker)
- continue;
-
- m = (mobj_t *)thinker;
-
- // not a teleportman
- if (m->type != MT_TELEPORTMAN )
- continue;
-
- sector = m->subsector->sector;
- // wrong sector
- if (sector-sectors != i )
- continue;
-
- oldx = thing->x;
- oldy = thing->y;
- oldz = thing->z;
-
- if (!P_TeleportMove (thing, m->x, m->y))
- return 0;
-
+ if (sectors[ i ].tag == tag )
+ {
+ thinker = thinkercap.next;
+ for (thinker = thinkercap.next;
+ thinker != &thinkercap;
+ thinker = thinker->next)
+ {
+ // not a mobj
+ if (thinker->function.acp1 != (actionf_p1)P_MobjThinker)
+ continue;
+
+ m = (mobj_t *)thinker;
+
+ // not a teleportman
+ if (m->type != MT_TELEPORTMAN )
+ continue;
+
+ sector = m->subsector->sector;
+ // wrong sector
+ if (sector-sectors != i )
+ continue;
+
+ oldx = thing->x;
+ oldy = thing->y;
+ oldz = thing->z;
+
+ if (!P_TeleportMove (thing, m->x, m->y))
+ return 0;
+
// fraggle: this was changed in final doom,
// problem between normal doom2 1.9 and final doom
//
@@ -112,30 +116,39 @@ EV_Teleport
// it does not have this quirk.
if (gameversion < exe_final || gameversion == exe_chex)
- thing->z = thing->floorz;
+ thing->z = thing->floorz;
+
+ if (thing->player)
+ thing->player->viewz = thing->z+thing->player->viewheight;
+
+ // spawn teleport fog at source and destination
+ // haleyjd 09/22/10: [STRIFE] controlled by teleport flags
+ // BUG: Behavior would be undefined if this function were passed
+ // any combination of teleflags that has the NO*FOG but not the
+ // corresponding NO*SND flag - fortunately this is never done
+ // anywhere in the code.
+ if(!(flags & TF_NOSRCFOG))
+ fog = P_SpawnMobj (oldx, oldy, oldz, MT_TFOG);
+ if(!(flags & TF_NOSRCSND))
+ S_StartSound (fog, sfx_telept);
+
+ an = m->angle >> ANGLETOFINESHIFT;
- if (thing->player)
- thing->player->viewz = thing->z+thing->player->viewheight;
-
- // spawn teleport fog at source and destination
- fog = P_SpawnMobj (oldx, oldy, oldz, MT_TFOG);
- S_StartSound (fog, sfx_telept);
- an = m->angle >> ANGLETOFINESHIFT;
- fog = P_SpawnMobj (m->x+20*finecosine[an], m->y+20*finesine[an]
- , thing->z, MT_TFOG);
-
- // emit sound, where?
- S_StartSound (fog, sfx_telept);
-
- // don't move for a bit
- if (thing->player)
- thing->reactiontime = 18;
-
- thing->angle = m->angle;
- thing->momx = thing->momy = thing->momz = 0;
- return 1;
- }
- }
+ if(!(flags & TF_NODSTFOG))
+ fog = P_SpawnMobj (m->x+20*finecosine[an], m->y+20*finesine[an],
+ thing->z, MT_TFOG);
+ if(!(flags & TF_NODSTSND))
+ S_StartSound (fog, sfx_telept);
+
+ // don't move for a bit
+ if (thing->player)
+ thing->reactiontime = 18;
+
+ thing->angle = m->angle;
+ thing->momx = thing->momy = thing->momz = 0;
+ return 1;
+ }
+ }
}
return 0;
}