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