2 //**************************************************************************
4 //** p_ceilng.c : Heretic 2 : Raven Software, Corp.
11 //**************************************************************************
17 //==================================================================
18 //==================================================================
22 //==================================================================
23 //==================================================================
25 ceiling_t *activeceilings[MAXCEILINGS];
27 //==================================================================
31 //==================================================================
32 void T_MoveCeiling (ceiling_t *ceiling)
36 switch(ceiling->direction)
38 // case 0: // IN STASIS
41 res = T_MovePlane(ceiling->sector,ceiling->speed,
42 ceiling->topheight, false, 1, ceiling->direction);
43 if (res == RES_PASTDEST)
45 SN_StopSequence((mobj_t *)&ceiling->sector->soundorg);
48 case CLEV_CRUSHANDRAISE:
49 ceiling->direction = -1;
50 ceiling->speed = ceiling->speed*2;
53 P_RemoveActiveCeiling(ceiling);
59 res = T_MovePlane(ceiling->sector,ceiling->speed,
60 ceiling->bottomheight, ceiling->crush, 1, ceiling->direction);
61 if(res == RES_PASTDEST)
63 SN_StopSequence((mobj_t *)&ceiling->sector->soundorg);
66 case CLEV_CRUSHANDRAISE:
67 case CLEV_CRUSHRAISEANDSTAY:
68 ceiling->direction = 1;
69 ceiling->speed = ceiling->speed/2;
72 P_RemoveActiveCeiling(ceiling);
76 else if(res == RES_CRUSHED)
80 case CLEV_CRUSHANDRAISE:
81 case CLEV_LOWERANDCRUSH:
82 case CLEV_CRUSHRAISEANDSTAY:
83 //ceiling->speed = ceiling->speed/4;
93 //==================================================================
96 // Move a ceiling up/down and all around!
98 //==================================================================
99 int EV_DoCeiling (line_t *line, byte *arg, ceiling_e type)
108 /* Old Ceiling stasis code
110 // Reactivate in-stasis ceilings...for certain types.
114 case CLEV_CRUSHANDRAISE:
115 P_ActivateInStasisCeiling(line);
120 while ((secnum = P_FindSectorFromTag(arg[0], secnum)) >= 0)
122 sec = §ors[secnum];
123 if (sec->specialdata)
130 ceiling = Z_Malloc (sizeof(*ceiling), PU_LEVSPEC, 0);
131 P_AddThinker (&ceiling->thinker);
132 sec->specialdata = ceiling;
133 ceiling->thinker.function = T_MoveCeiling;
134 ceiling->sector = sec;
136 ceiling->speed = arg[1]*(FRACUNIT/8);
139 case CLEV_CRUSHRAISEANDSTAY:
140 ceiling->crush = arg[2]; // arg[2] = crushing value
141 ceiling->topheight = sec->ceilingheight;
142 ceiling->bottomheight = sec->floorheight + (8*FRACUNIT);
143 ceiling->direction = -1;
145 case CLEV_CRUSHANDRAISE:
146 ceiling->topheight = sec->ceilingheight;
147 case CLEV_LOWERANDCRUSH:
148 ceiling->crush = arg[2]; // arg[2] = crushing value
149 case CLEV_LOWERTOFLOOR:
150 ceiling->bottomheight = sec->floorheight;
151 if(type != CLEV_LOWERTOFLOOR)
153 ceiling->bottomheight += 8*FRACUNIT;
155 ceiling->direction = -1;
157 case CLEV_RAISETOHIGHEST:
158 ceiling->topheight = P_FindHighestCeilingSurrounding(sec);
159 ceiling->direction = 1;
161 case CLEV_LOWERBYVALUE:
162 ceiling->bottomheight = sec->ceilingheight-arg[2]*FRACUNIT;
163 ceiling->direction = -1;
165 case CLEV_RAISEBYVALUE:
166 ceiling->topheight = sec->ceilingheight+arg[2]*FRACUNIT;
167 ceiling->direction = 1;
169 case CLEV_MOVETOVALUETIMES8:
171 int destHeight = arg[2]*FRACUNIT*8;
175 destHeight = -destHeight;
177 if(sec->ceilingheight <= destHeight)
179 ceiling->direction = 1;
180 ceiling->topheight = destHeight;
181 if(sec->ceilingheight == destHeight)
186 else if(sec->ceilingheight > destHeight)
188 ceiling->direction = -1;
189 ceiling->bottomheight = destHeight;
197 ceiling->tag = sec->tag;
198 ceiling->type = type;
199 P_AddActiveCeiling(ceiling);
202 SN_StartSequence((mobj_t *)&ceiling->sector->soundorg,
203 SEQ_PLATFORM+ceiling->sector->seqType);
209 //==================================================================
211 // Add an active ceiling
213 //==================================================================
214 void P_AddActiveCeiling(ceiling_t *c)
217 for (i = 0; i < MAXCEILINGS;i++)
218 if (activeceilings[i] == NULL)
220 activeceilings[i] = c;
225 //==================================================================
227 // Remove a ceiling's thinker
229 //==================================================================
230 void P_RemoveActiveCeiling(ceiling_t *c)
234 for (i = 0;i < MAXCEILINGS;i++)
235 if (activeceilings[i] == c)
237 activeceilings[i]->sector->specialdata = NULL;
238 P_RemoveThinker (&activeceilings[i]->thinker);
239 P_TagFinished(activeceilings[i]->sector->tag);
240 activeceilings[i] = NULL;
246 //==================================================================
248 // Restart a ceiling that's in-stasis
250 //==================================================================
251 void P_ActivateInStasisCeiling(line_t *line)
255 for (i = 0;i < MAXCEILINGS;i++)
256 if (activeceilings[i] && (activeceilings[i]->tag == line->arg1) &&
257 (activeceilings[i]->direction == 0))
259 activeceilings[i]->direction = activeceilings[i]->olddirection;
260 activeceilings[i]->thinker.function = T_MoveCeiling;
261 SN_StartSequence((mobj_t *)&activeceilings[i]->sector->soundorg,
262 SEQ_PLATFORM+activeceilings[i]->sector->seqType);
267 //==================================================================
269 // EV_CeilingCrushStop
270 // Stop a ceiling from crushing!
272 //==================================================================
274 int EV_CeilingCrushStop(line_t *line, byte *args)
280 for (i = 0;i < MAXCEILINGS;i++)
282 if(activeceilings[i] && activeceilings[i]->tag == args[0])
285 SN_StopSequence((mobj_t*)&activeceilings[i]->sector->soundorg);
286 activeceilings[i]->sector->specialdata = NULL;
287 P_RemoveThinker (&activeceilings[i]->thinker);
288 P_TagFinished(activeceilings[i]->sector->tag);
289 activeceilings[i] = NULL;