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

射击游戏

开发平台:

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:  Ceiling aninmation (lowering, crushing, raising)
  20. //
  21. //-----------------------------------------------------------------------------
  22. static const char
  23. rcsid[] = "$Id: p_ceilng.c,v 1.4 1997/02/03 16:47:53 b1 Exp $";
  24. #include "z_zone.h"
  25. #include "doomdef.h"
  26. #include "p_local.h"
  27. #include "s_sound.h"
  28. // State.
  29. #include "doomstat.h"
  30. #include "r_state.h"
  31. // Data.
  32. #include "sounds.h"
  33. //
  34. // CEILINGS
  35. //
  36. ceiling_t* activeceilings[MAXCEILINGS];
  37. //
  38. // T_MoveCeiling
  39. //
  40. void T_MoveCeiling (ceiling_t* ceiling)
  41. {
  42.     result_e res;
  43.     switch(ceiling->direction)
  44.     {
  45.       case 0:
  46. // IN STASIS
  47. break;
  48.       case 1:
  49. // UP
  50. res = T_MovePlane(ceiling->sector,
  51.   ceiling->speed,
  52.   ceiling->topheight,
  53.   false,1,ceiling->direction);
  54. if (!(leveltime&7))
  55. {
  56.     switch(ceiling->type)
  57.     {
  58.       case silentCrushAndRaise:
  59. break;
  60.       default:
  61. S_StartSound((mobj_t *)&ceiling->sector->soundorg,
  62.      sfx_stnmov);
  63. // ?
  64. break;
  65.     }
  66. }
  67. if (res == pastdest)
  68. {
  69.     switch(ceiling->type)
  70.     {
  71.       case raiseToHighest:
  72. P_RemoveActiveCeiling(ceiling);
  73. break;
  74.       case silentCrushAndRaise:
  75. S_StartSound((mobj_t *)&ceiling->sector->soundorg,
  76.      sfx_pstop);
  77.       case fastCrushAndRaise:
  78.       case crushAndRaise:
  79. ceiling->direction = -1;
  80. break;
  81.       default:
  82. break;
  83.     }
  84.     
  85. }
  86. break;
  87.       case -1:
  88. // DOWN
  89. res = T_MovePlane(ceiling->sector,
  90.   ceiling->speed,
  91.   ceiling->bottomheight,
  92.   ceiling->crush,1,ceiling->direction);
  93. if (!(leveltime&7))
  94. {
  95.     switch(ceiling->type)
  96.     {
  97.       case silentCrushAndRaise: break;
  98.       default:
  99. S_StartSound((mobj_t *)&ceiling->sector->soundorg,
  100.      sfx_stnmov);
  101.     }
  102. }
  103. if (res == pastdest)
  104. {
  105.     switch(ceiling->type)
  106.     {
  107.       case silentCrushAndRaise:
  108. S_StartSound((mobj_t *)&ceiling->sector->soundorg,
  109.      sfx_pstop);
  110.       case crushAndRaise:
  111. ceiling->speed = CEILSPEED;
  112.       case fastCrushAndRaise:
  113. ceiling->direction = 1;
  114. break;
  115.       case lowerAndCrush:
  116.       case lowerToFloor:
  117. P_RemoveActiveCeiling(ceiling);
  118. break;
  119.       default:
  120. break;
  121.     }
  122. }
  123. else // ( res != pastdest )
  124. {
  125.     if (res == crushed)
  126.     {
  127. switch(ceiling->type)
  128. {
  129.   case silentCrushAndRaise:
  130.   case crushAndRaise:
  131.   case lowerAndCrush:
  132.     ceiling->speed = CEILSPEED / 8;
  133.     break;
  134.   default:
  135.     break;
  136. }
  137.     }
  138. }
  139. break;
  140.     }
  141. }
  142. //
  143. // EV_DoCeiling
  144. // Move a ceiling up/down and all around!
  145. //
  146. int
  147. EV_DoCeiling
  148. ( line_t* line,
  149.   ceiling_e type )
  150. {
  151.     int secnum;
  152.     int rtn;
  153.     sector_t* sec;
  154.     ceiling_t* ceiling;
  155.     secnum = -1;
  156.     rtn = 0;
  157.     
  158.     // Reactivate in-stasis ceilings...for certain types.
  159.     switch(type)
  160.     {
  161.       case fastCrushAndRaise:
  162.       case silentCrushAndRaise:
  163.       case crushAndRaise:
  164. P_ActivateInStasisCeiling(line);
  165.       default:
  166. break;
  167.     }
  168.     while ((secnum = P_FindSectorFromLineTag(line,secnum)) >= 0)
  169.     {
  170. sec = &sectors[secnum];
  171. if (sec->specialdata)
  172.     continue;
  173. // new door thinker
  174. rtn = 1;
  175. ceiling = Z_Malloc (sizeof(*ceiling), PU_LEVSPEC, 0);
  176. P_AddThinker (&ceiling->thinker);
  177. sec->specialdata = ceiling;
  178. ceiling->thinker.function.acp1 = (actionf_p1)T_MoveCeiling;
  179. ceiling->sector = sec;
  180. ceiling->crush = false;
  181. switch(type)
  182. {
  183.   case fastCrushAndRaise:
  184.     ceiling->crush = true;
  185.     ceiling->topheight = sec->ceilingheight;
  186.     ceiling->bottomheight = sec->floorheight + (8*FRACUNIT);
  187.     ceiling->direction = -1;
  188.     ceiling->speed = CEILSPEED * 2;
  189.     break;
  190.   case silentCrushAndRaise:
  191.   case crushAndRaise:
  192.     ceiling->crush = true;
  193.     ceiling->topheight = sec->ceilingheight;
  194.   case lowerAndCrush:
  195.   case lowerToFloor:
  196.     ceiling->bottomheight = sec->floorheight;
  197.     if (type != lowerToFloor)
  198. ceiling->bottomheight += 8*FRACUNIT;
  199.     ceiling->direction = -1;
  200.     ceiling->speed = CEILSPEED;
  201.     break;
  202.   case raiseToHighest:
  203.     ceiling->topheight = P_FindHighestCeilingSurrounding(sec);
  204.     ceiling->direction = 1;
  205.     ceiling->speed = CEILSPEED;
  206.     break;
  207. }
  208. ceiling->tag = sec->tag;
  209. ceiling->type = type;
  210. P_AddActiveCeiling(ceiling);
  211.     }
  212.     return rtn;
  213. }
  214. //
  215. // Add an active ceiling
  216. //
  217. void P_AddActiveCeiling(ceiling_t* c)
  218. {
  219.     int i;
  220.     
  221.     for (i = 0; i < MAXCEILINGS;i++)
  222.     {
  223. if (activeceilings[i] == NULL)
  224. {
  225.     activeceilings[i] = c;
  226.     return;
  227. }
  228.     }
  229. }
  230. //
  231. // Remove a ceiling's thinker
  232. //
  233. void P_RemoveActiveCeiling(ceiling_t* c)
  234. {
  235.     int i;
  236.     for (i = 0;i < MAXCEILINGS;i++)
  237.     {
  238. if (activeceilings[i] == c)
  239. {
  240.     activeceilings[i]->sector->specialdata = NULL;
  241.     P_RemoveThinker (&activeceilings[i]->thinker);
  242.     activeceilings[i] = NULL;
  243.     break;
  244. }
  245.     }
  246. }
  247. //
  248. // Restart a ceiling that's in-stasis
  249. //
  250. void P_ActivateInStasisCeiling(line_t* line)
  251. {
  252.     int i;
  253.     for (i = 0;i < MAXCEILINGS;i++)
  254.     {
  255. if (activeceilings[i]
  256.     && (activeceilings[i]->tag == line->tag)
  257.     && (activeceilings[i]->direction == 0))
  258. {
  259.     activeceilings[i]->direction = activeceilings[i]->olddirection;
  260.     activeceilings[i]->thinker.function.acp1
  261.       = (actionf_p1)T_MoveCeiling;
  262. }
  263.     }
  264. }
  265. //
  266. // EV_CeilingCrushStop
  267. // Stop a ceiling from crushing!
  268. //
  269. int EV_CeilingCrushStop(line_t *line)
  270. {
  271.     int i;
  272.     int rtn;
  273.     rtn = 0;
  274.     for (i = 0;i < MAXCEILINGS;i++)
  275.     {
  276. if (activeceilings[i]
  277.     && (activeceilings[i]->tag == line->tag)
  278.     && (activeceilings[i]->direction != 0))
  279. {
  280.     activeceilings[i]->olddirection = activeceilings[i]->direction;
  281.     activeceilings[i]->thinker.function.acv = (actionf_v)NULL;
  282.     activeceilings[i]->direction = 0; // in-stasis
  283.     rtn = 1;
  284. }
  285.     }
  286.     
  287.     return rtn;
  288. }