From fd43740b94137503a58bc4819a83c616ad660c0d Mon Sep 17 00:00:00 2001 From: James Haley Date: Fri, 24 Sep 2010 02:12:18 +0000 Subject: Implementation of teleflags for EV_Teleport. Fix to somewhat serious bug that let 0-damage tracers pass through walls. Other changes are only comments or formatting. Subversion-branch: /branches/strife-branch Subversion-revision: 2132 --- src/strife/p_telept.c | 151 +++++++++++++++++++++++++++----------------------- 1 file changed, 82 insertions(+), 69 deletions(-) (limited to 'src/strife/p_telept.c') 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; } -- cgit v1.2.3