p_telept.c
上传用户:xuyinpeng
上传日期:2021-05-12
资源大小:455k
文件大小:3k
源码类别:

射击游戏

开发平台:

Visual C++

  1. // Emacs style mode select   -*- C++ -*- 
  2. //-----------------------------------------------------------------------------
  3. //
  4. // $Id:$
  5. //
  6. // Copyright (C) 1993-1996 by id Software, Inc.
  7. //
  8. // This source is available for distribution and/or modification
  9. // only under the terms of the DOOM Source Code License as
  10. // published by id Software. All rights reserved.
  11. //
  12. // The source is distributed in the hope that it will be useful,
  13. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. // FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License
  15. // for more details.
  16. //
  17. // $Log:$
  18. //
  19. // DESCRIPTION:
  20. // Teleportation.
  21. //
  22. //-----------------------------------------------------------------------------
  23. static const char
  24. rcsid[] = "$Id: p_telept.c,v 1.3 1997/01/28 22:08:29 b1 Exp $";
  25. #include "doomdef.h"
  26. #include "s_sound.h"
  27. #include "p_local.h"
  28. // Data.
  29. #include "sounds.h"
  30. // State.
  31. #include "r_state.h"
  32. //
  33. // TELEPORTATION
  34. //
  35. int
  36. EV_Teleport
  37. ( line_t* line,
  38.   int side,
  39.   mobj_t* thing )
  40. {
  41.     int i;
  42.     int tag;
  43.     mobj_t* m;
  44.     mobj_t* fog;
  45.     unsigned an;
  46.     thinker_t* thinker;
  47.     sector_t* sector;
  48.     fixed_t oldx;
  49.     fixed_t oldy;
  50.     fixed_t oldz;
  51.     // don't teleport missiles
  52.     if (thing->flags & MF_MISSILE)
  53. return 0;
  54.     // Don't teleport if hit back of line,
  55.     //  so you can get out of teleporter.
  56.     if (side == 1)
  57. return 0;
  58.     
  59.     tag = line->tag;
  60.     for (i = 0; i < numsectors; i++)
  61.     {
  62. if (sectors[ i ].tag == tag )
  63. {
  64.     thinker = thinkercap.next;
  65.     for (thinker = thinkercap.next;
  66.  thinker != &thinkercap;
  67.  thinker = thinker->next)
  68.     {
  69. // not a mobj
  70. if (thinker->function.acp1 != (actionf_p1)P_MobjThinker)
  71.     continue;
  72. m = (mobj_t *)thinker;
  73. // not a teleportman
  74. if (m->type != MT_TELEPORTMAN )
  75.     continue;
  76. sector = m->subsector->sector;
  77. // wrong sector
  78. if (sector-sectors != i )
  79.     continue;
  80. oldx = thing->x;
  81. oldy = thing->y;
  82. oldz = thing->z;
  83. if (!P_TeleportMove (thing, m->x, m->y))
  84.     return 0;
  85. thing->z = thing->floorz;  //fixme: not needed?
  86. if (thing->player)
  87.     thing->player->viewz = thing->z+thing->player->viewheight;
  88. // spawn teleport fog at source and destination
  89. fog = P_SpawnMobj (oldx, oldy, oldz, MT_TFOG);
  90. S_StartSound (fog, sfx_telept);
  91. an = m->angle >> ANGLETOFINESHIFT;
  92. fog = P_SpawnMobj (m->x+20*finecosine[an], m->y+20*finesine[an]
  93.    , thing->z, MT_TFOG);
  94. // emit sound, where?
  95. S_StartSound (fog, sfx_telept);
  96. // don't move for a bit
  97. if (thing->player)
  98.     thing->reactiontime = 18;
  99. thing->angle = m->angle;
  100. thing->momx = thing->momy = thing->momz = 0;
  101. return 1;
  102.     }
  103. }
  104.     }
  105.     return 0;
  106. }