P_CEILNG.C 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  1. //**************************************************************************
  2. //**
  3. //** p_ceilng.c : Heretic 2 : Raven Software, Corp.
  4. //**
  5. //** $RCSfile: p_ceilng.c,v $
  6. //** $Revision: 1.17 $
  7. //** $Date: 95/09/11 22:06:25 $
  8. //** $Author: cjr $
  9. //**
  10. //**************************************************************************
  11. #include "h2def.h"
  12. #include "p_local.h"
  13. #include "soundst.h"
  14. //==================================================================
  15. //==================================================================
  16. //
  17. // CEILINGS
  18. //
  19. //==================================================================
  20. //==================================================================
  21. ceiling_t *activeceilings[MAXCEILINGS];
  22. //==================================================================
  23. //
  24. // T_MoveCeiling
  25. //
  26. //==================================================================
  27. void T_MoveCeiling (ceiling_t *ceiling)
  28. {
  29. result_e res;
  30. switch(ceiling->direction)
  31. {
  32. // case 0: // IN STASIS
  33. // break;
  34. case 1: // UP
  35. res = T_MovePlane(ceiling->sector,ceiling->speed,
  36. ceiling->topheight, false, 1, ceiling->direction);
  37. if (res == RES_PASTDEST)
  38. {
  39. SN_StopSequence((mobj_t *)&ceiling->sector->soundorg);
  40. switch(ceiling->type)
  41. {
  42. case CLEV_CRUSHANDRAISE:
  43. ceiling->direction = -1;
  44. ceiling->speed = ceiling->speed*2;
  45. break;
  46. default:
  47. P_RemoveActiveCeiling(ceiling);
  48. break;
  49. }
  50. }
  51. break;
  52. case -1: // DOWN
  53. res = T_MovePlane(ceiling->sector,ceiling->speed,
  54. ceiling->bottomheight, ceiling->crush, 1, ceiling->direction);
  55. if(res == RES_PASTDEST)
  56. {
  57. SN_StopSequence((mobj_t *)&ceiling->sector->soundorg);
  58. switch(ceiling->type)
  59. {
  60. case CLEV_CRUSHANDRAISE:
  61. case CLEV_CRUSHRAISEANDSTAY:
  62. ceiling->direction = 1;
  63. ceiling->speed = ceiling->speed/2;
  64. break;
  65. default:
  66. P_RemoveActiveCeiling(ceiling);
  67. break;
  68. }
  69. }
  70. else if(res == RES_CRUSHED)
  71. {
  72. switch(ceiling->type)
  73. {
  74. case CLEV_CRUSHANDRAISE:
  75. case CLEV_LOWERANDCRUSH:
  76. case CLEV_CRUSHRAISEANDSTAY:
  77. //ceiling->speed = ceiling->speed/4;
  78. break;
  79. default:
  80. break;
  81. }
  82. }
  83. break;
  84. }
  85. }
  86. //==================================================================
  87. //
  88. // EV_DoCeiling
  89. // Move a ceiling up/down and all around!
  90. //
  91. //==================================================================
  92. int EV_DoCeiling (line_t *line, byte *arg, ceiling_e type)
  93. {
  94. int secnum,rtn;
  95. sector_t *sec;
  96. ceiling_t *ceiling;
  97. secnum = -1;
  98. rtn = 0;
  99. /* Old Ceiling stasis code
  100. //
  101. // Reactivate in-stasis ceilings...for certain types.
  102. //
  103. switch(type)
  104. {
  105. case CLEV_CRUSHANDRAISE:
  106. P_ActivateInStasisCeiling(line);
  107. default:
  108. break;
  109. }
  110. */
  111. while ((secnum = P_FindSectorFromTag(arg[0], secnum)) >= 0)
  112. {
  113. sec = &sectors[secnum];
  114. if (sec->specialdata)
  115. continue;
  116. //
  117. // new door thinker
  118. //
  119. rtn = 1;
  120. ceiling = Z_Malloc (sizeof(*ceiling), PU_LEVSPEC, 0);
  121. P_AddThinker (&ceiling->thinker);
  122. sec->specialdata = ceiling;
  123. ceiling->thinker.function = T_MoveCeiling;
  124. ceiling->sector = sec;
  125. ceiling->crush = 0;
  126. ceiling->speed = arg[1]*(FRACUNIT/8);
  127. switch(type)
  128. {
  129. case CLEV_CRUSHRAISEANDSTAY:
  130. ceiling->crush = arg[2]; // arg[2] = crushing value
  131. ceiling->topheight = sec->ceilingheight;
  132. ceiling->bottomheight = sec->floorheight + (8*FRACUNIT);
  133. ceiling->direction = -1;
  134. break;
  135. case CLEV_CRUSHANDRAISE:
  136. ceiling->topheight = sec->ceilingheight;
  137. case CLEV_LOWERANDCRUSH:
  138. ceiling->crush = arg[2]; // arg[2] = crushing value
  139. case CLEV_LOWERTOFLOOR:
  140. ceiling->bottomheight = sec->floorheight;
  141. if(type != CLEV_LOWERTOFLOOR)
  142. {
  143. ceiling->bottomheight += 8*FRACUNIT;
  144. }
  145. ceiling->direction = -1;
  146. break;
  147. case CLEV_RAISETOHIGHEST:
  148. ceiling->topheight = P_FindHighestCeilingSurrounding(sec);
  149. ceiling->direction = 1;
  150. break;
  151. case CLEV_LOWERBYVALUE:
  152. ceiling->bottomheight = sec->ceilingheight-arg[2]*FRACUNIT;
  153. ceiling->direction = -1;
  154. break;
  155. case CLEV_RAISEBYVALUE:
  156. ceiling->topheight = sec->ceilingheight+arg[2]*FRACUNIT;
  157. ceiling->direction = 1;
  158. break;
  159. case CLEV_MOVETOVALUETIMES8:
  160. {
  161. int destHeight = arg[2]*FRACUNIT*8;
  162. if(arg[3])
  163. {
  164. destHeight = -destHeight;
  165. }
  166. if(sec->ceilingheight <= destHeight)
  167. {
  168. ceiling->direction = 1;
  169. ceiling->topheight = destHeight;
  170. if(sec->ceilingheight == destHeight)
  171. {
  172. rtn = 0;
  173. }
  174. }
  175. else if(sec->ceilingheight > destHeight)
  176. {
  177. ceiling->direction = -1;
  178. ceiling->bottomheight = destHeight;
  179. }
  180. break;
  181. }
  182. default:
  183. rtn = 0;
  184. break;
  185. }
  186. ceiling->tag = sec->tag;
  187. ceiling->type = type;
  188. P_AddActiveCeiling(ceiling);
  189. if(rtn)
  190. {
  191. SN_StartSequence((mobj_t *)&ceiling->sector->soundorg,
  192. SEQ_PLATFORM+ceiling->sector->seqType);
  193. }
  194. }
  195. return rtn;
  196. }
  197. //==================================================================
  198. //
  199. // Add an active ceiling
  200. //
  201. //==================================================================
  202. void P_AddActiveCeiling(ceiling_t *c)
  203. {
  204. int i;
  205. for (i = 0; i < MAXCEILINGS;i++)
  206. if (activeceilings[i] == NULL)
  207. {
  208. activeceilings[i] = c;
  209. return;
  210. }
  211. }
  212. //==================================================================
  213. //
  214. // Remove a ceiling's thinker
  215. //
  216. //==================================================================
  217. void P_RemoveActiveCeiling(ceiling_t *c)
  218. {
  219. int i;
  220. for (i = 0;i < MAXCEILINGS;i++)
  221. if (activeceilings[i] == c)
  222. {
  223. activeceilings[i]->sector->specialdata = NULL;
  224. P_RemoveThinker (&activeceilings[i]->thinker);
  225. P_TagFinished(activeceilings[i]->sector->tag);
  226. activeceilings[i] = NULL;
  227. break;
  228. }
  229. }
  230. #if 0
  231. //==================================================================
  232. //
  233. // Restart a ceiling that's in-stasis
  234. //
  235. //==================================================================
  236. void P_ActivateInStasisCeiling(line_t *line)
  237. {
  238. int i;
  239. for (i = 0;i < MAXCEILINGS;i++)
  240. if (activeceilings[i] && (activeceilings[i]->tag == line->arg1) &&
  241. (activeceilings[i]->direction == 0))
  242. {
  243. activeceilings[i]->direction = activeceilings[i]->olddirection;
  244. activeceilings[i]->thinker.function = T_MoveCeiling;
  245. SN_StartSequence((mobj_t *)&activeceilings[i]->sector->soundorg,
  246. SEQ_PLATFORM+activeceilings[i]->sector->seqType);
  247. }
  248. }
  249. #endif
  250. //==================================================================
  251. //
  252. // EV_CeilingCrushStop
  253. // Stop a ceiling from crushing!
  254. //
  255. //==================================================================
  256. int EV_CeilingCrushStop(line_t *line, byte *args)
  257. {
  258. int i;
  259. int rtn;
  260. rtn = 0;
  261. for (i = 0;i < MAXCEILINGS;i++)
  262. {
  263. if(activeceilings[i] && activeceilings[i]->tag == args[0])
  264. {
  265. rtn = 1;
  266. SN_StopSequence((mobj_t*)&activeceilings[i]->sector->soundorg);
  267. activeceilings[i]->sector->specialdata = NULL;
  268. P_RemoveThinker (&activeceilings[i]->thinker);
  269. P_TagFinished(activeceilings[i]->sector->tag);
  270. activeceilings[i] = NULL;
  271. break;
  272. }
  273. }
  274. return rtn;
  275. }