123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- // P_telept.c
- #include "DoomDef.h"
- #include "P_local.h"
- #include "soundst.h"
- //----------------------------------------------------------------------------
- //
- // FUNC P_Teleport
- //
- //----------------------------------------------------------------------------
- boolean P_Teleport(mobj_t *thing, fixed_t x, fixed_t y, angle_t angle)
- {
- fixed_t oldx;
- fixed_t oldy;
- fixed_t oldz;
- fixed_t aboveFloor;
- fixed_t fogDelta;
- player_t *player;
- unsigned an;
- mobj_t *fog;
- oldx = thing->x;
- oldy = thing->y;
- oldz = thing->z;
- aboveFloor = thing->z-thing->floorz;
- if(!P_TeleportMove(thing, x, y))
- {
- return(false);
- }
- if(thing->player)
- {
- player = thing->player;
- if(player->powers[pw_flight] && aboveFloor)
- {
- thing->z = thing->floorz+aboveFloor;
- if(thing->z+thing->height > thing->ceilingz)
- {
- thing->z = thing->ceilingz-thing->height;
- }
- player->viewz = thing->z+player->viewheight;
- }
- else
- {
- thing->z = thing->floorz;
- player->viewz = thing->z+player->viewheight;
- player->lookdir = 0;
- }
- }
- else if(thing->flags&MF_MISSILE)
- {
- thing->z = thing->floorz+aboveFloor;
- if(thing->z+thing->height > thing->ceilingz)
- {
- thing->z = thing->ceilingz-thing->height;
- }
- }
- else
- {
- thing->z = thing->floorz;
- }
- // Spawn teleport fog at source and destination
- fogDelta = thing->flags&MF_MISSILE ? 0 : TELEFOGHEIGHT;
- fog = P_SpawnMobj(oldx, oldy, oldz+fogDelta, MT_TFOG);
- S_StartSound(fog, sfx_telept);
- an = angle>>ANGLETOFINESHIFT;
- fog = P_SpawnMobj(x+20*finecosine[an],
- y+20*finesine[an], thing->z+fogDelta, MT_TFOG);
- S_StartSound(fog, sfx_telept);
- if(thing->player && !thing->player->powers[pw_weaponlevel2])
- { // Freeze player for about .5 sec
- thing->reactiontime = 18;
- }
- thing->angle = angle;
- if(thing->flags2&MF2_FOOTCLIP && P_GetThingFloorType(thing) != FLOOR_SOLID)
- {
- thing->flags2 |= MF2_FEETARECLIPPED;
- }
- else if(thing->flags2&MF2_FEETARECLIPPED)
- {
- thing->flags2 &= ~MF2_FEETARECLIPPED;
- }
- if(thing->flags&MF_MISSILE)
- {
- angle >>= ANGLETOFINESHIFT;
- thing->momx = FixedMul(thing->info->speed, finecosine[angle]);
- thing->momy = FixedMul(thing->info->speed, finesine[angle]);
- }
- else
- {
- thing->momx = thing->momy = thing->momz = 0;
- }
- return(true);
- }
- //----------------------------------------------------------------------------
- //
- // FUNC EV_Teleport
- //
- //----------------------------------------------------------------------------
- boolean EV_Teleport(line_t *line, int side, mobj_t *thing)
- {
- int i;
- int tag;
- mobj_t *m;
- thinker_t *thinker;
- sector_t *sector;
- if(thing->flags2&MF2_NOTELEPORT)
- {
- return(false);
- }
- if(side == 1)
- { // Don't teleport when crossing back side
- return(false);
- }
- 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)
- {
- if(thinker->function != P_MobjThinker)
- { // Not a mobj
- continue;
- }
- m = (mobj_t *)thinker;
- if(m->type != MT_TELEPORTMAN )
- { // Not a teleportman
- continue;
- }
- sector = m->subsector->sector;
- if(sector-sectors != i)
- { // Wrong sector
- continue;
- }
- return(P_Teleport(thing, m->x, m->y, m->angle));
- }
- }
- }
- return(false);
- }
|