⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 p_telept.c

📁 The source code of Doom legacy for windows
💻 C
📖 第 1 页 / 共 2 页
字号:
          // Momentum of thing crossing teleporter linedef          fixed_t momx = thing->momx;          fixed_t momy = thing->momy;          // Whether this is a player, and if so, a pointer to its player_t          player_t *player = thing->player;          // Attempt to teleport, aborting if blocked          if (!P_TeleportMove(thing, m->x, m->y))            return 0;          // Rotate thing according to difference in angles          thing->angle += angle;          // Adjust z position to be same height above ground as before          thing->z = z + thing->floorz;          // Rotate thing's momentum to come out of exit just like it entered          thing->momx = FixedMul(momx, c) - FixedMul(momy, s);          thing->momy = FixedMul(momy, c) + FixedMul(momx, s);          // Adjust player's view, in case there has been a height change          // Voodoo dolls are excluded by making sure player->mo == thing.          if (player && player->mo == thing)            {              // Save the current deltaviewheight, used in stepping              fixed_t deltaviewheight = player->deltaviewheight;              // Clear deltaviewheight, since we don't want any changes              player->deltaviewheight = 0;              // Set player's view according to the newly set parameters              P_CalcHeight(player);              // Reset the delta to have the same dynamics as before              player->deltaviewheight = deltaviewheight;              // SoM: 3/15/2000: move chasecam at new player location              if ( camera.chase )                 P_ResetCamera (thing->player);            }          return 1;        }  return 0;}//// Silent linedef-based TELEPORTATION, by Lee Killough// Primarily for rooms-over-rooms etc.// This is the complete player-preserving kind of teleporter.// It has advantages over the teleporter with thing exits.//// maximum fixed_t units to move object to avoid hiccups#define FUDGEFACTOR 10int EV_SilentLineTeleport(line_t *line, int side, mobj_t *thing,                          boolean reverse){  int i;  line_t *l;  if (side || thing->flags & MF_MISSILE)    return 0;  for (i = -1; (i = P_FindLineFromLineTag(line, i)) >= 0;)    if ((l=lines+i) != line && l->backsector)      {        // Get the thing's position along the source linedef        fixed_t pos = abs(line->dx) > abs(line->dy) ?          FixedDiv(thing->x - line->v1->x, line->dx) :          FixedDiv(thing->y - line->v1->y, line->dy) ;        // Get the angle between the two linedefs, for rotating        // orientation and momentum. Rotate 180 degrees, and flip        // the position across the exit linedef, if reversed.        angle_t angle = (reverse ? pos = FRACUNIT-pos, 0 : ANG180) +          R_PointToAngle2(0, 0, l->dx, l->dy) -          R_PointToAngle2(0, 0, line->dx, line->dy);        // Interpolate position across the exit linedef        fixed_t x = l->v2->x - FixedMul(pos, l->dx);        fixed_t y = l->v2->y - FixedMul(pos, l->dy);        // Sine, cosine of angle adjustment        fixed_t s = finesine[angle>>ANGLETOFINESHIFT];        fixed_t c = finecosine[angle>>ANGLETOFINESHIFT];        // Maximum distance thing can be moved away from interpolated        // exit, to ensure that it is on the correct side of exit linedef        int fudge = FUDGEFACTOR;        // Whether this is a player, and if so, a pointer to its player_t.        // Voodoo dolls are excluded by making sure thing->player->mo==thing.        player_t *player = thing->player && thing->player->mo == thing ?          thing->player : NULL;        // Whether walking towards first side of exit linedef steps down        int stepdown =          l->frontsector->floorheight < l->backsector->floorheight;        // Height of thing above ground        fixed_t z = thing->z - thing->floorz;        // Side to exit the linedef on positionally.        //        // Notes:        //        // This flag concerns exit position, not momentum. Due to        // roundoff error, the thing can land on either the left or        // the right side of the exit linedef, and steps must be        // taken to make sure it does not end up on the wrong side.        //        // Exit momentum is always towards side 1 in a reversed        // teleporter, and always towards side 0 otherwise.        //        // Exiting positionally on side 1 is always safe, as far        // as avoiding oscillations and stuck-in-wall problems,        // but may not be optimum for non-reversed teleporters.        //        // Exiting on side 0 can cause oscillations if momentum        // is towards side 1, as it is with reversed teleporters.        //        // Exiting on side 1 slightly improves player viewing        // when going down a step on a non-reversed teleporter.        int side = reverse || (player && stepdown);        // Make sure we are on correct side of exit linedef.        while (P_PointOnLineSide(x, y, l) != side && --fudge>=0)          if (abs(l->dx) > abs(l->dy))            y -= l->dx < 0 != side ? -1 : 1;          else            x += l->dy < 0 != side ? -1 : 1;        // Attempt to teleport, aborting if blocked        if (!P_TeleportMove(thing, x, y))          return 0;        // Adjust z position to be same height above ground as before.        // Ground level at the exit is measured as the higher of the        // two floor heights at the exit linedef.        thing->z = z + sides[l->sidenum[stepdown]].sector->floorheight;        // Rotate thing's orientation according to difference in linedef angles        thing->angle += angle;        // Momentum of thing crossing teleporter linedef        x = thing->momx;        y = thing->momy;        // Rotate thing's momentum to come out of exit just like it entered        thing->momx = FixedMul(x, c) - FixedMul(y, s);        thing->momy = FixedMul(y, c) + FixedMul(x, s);        // Adjust a player's view, in case there has been a height change        if (player)          {            // Save the current deltaviewheight, used in stepping            fixed_t deltaviewheight = player->deltaviewheight;            // Clear deltaviewheight, since we don't want any changes now            player->deltaviewheight = 0;            // Set player's view according to the newly set parameters            P_CalcHeight(player);            // Reset the delta to have the same dynamics as before            player->deltaviewheight = deltaviewheight;            // SoM: 3/15/2000: move chasecam at new player location            if ( camera.chase )               P_ResetCamera (thing->player);          }        return 1;      }  return 0;}// SoM: This works kind of like the Boom function only without rotation.// Portal lines MUST have the exact same length and direction anyway..int EV_PortalTeleport(line_t*  line, mobj_t* thing, int side){  line_t*         ltarget = NULL;  fixed_t         thingbot, thingtop;  fixed_t         dx, dy;  fixed_t         newx, newy;  wallportal_t*   wpr;  angle_t         ang1, ang2;  // Reject teleporting if the thing's center does not actually cross the line  ang1 = R_PointToAngle2(thing->x, thing->y, line->v1->x, line->v1->y);  ang2 = R_PointToAngle2(thing->x, thing->y, line->v2->x, line->v2->y);  CONS_Printf("ang: 21=%i\n", (ang1 - ang2) / ANGLE_1);  if(!line->wallportals)    I_Error("Portal teleport without portals!! linenum: %i\n", line - lines);  thingbot = thing->z;  thingtop = thing->z + thing->height;  for(wpr = line->wallportals; wpr; wpr = wpr->next)  {    if(thingbot >= *wpr->topheight || thingtop <= *wpr->bottomheight)      continue;    ltarget = wpr->portal->mline;    break;  }  if(!ltarget)    return 0;  if(wpr->side != side)    return 0;  dx = thing->x - line->v1->x;  dy = thing->y - line->v1->y;  newx = ltarget->v2->x + dx;  newy = ltarget->v2->y + dy;  if (!P_TeleportMove(thing, newx, newy))    return 0;  thing->z = thingbot;  if (thing->player && thing->player->mo == thing)  {    fixed_t deltaviewheight = thing->player->deltaviewheight;    thing->player->deltaviewheight = 0;    P_CalcHeight(thing->player);    thing->player->deltaviewheight = deltaviewheight;    if ( camera.chase )      P_ResetCamera (thing->player);  }  return 1;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -