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

射击游戏

开发平台:

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. //
  18. // $Log:$
  19. //
  20. // DESCRIPTION:
  21. // Switches, buttons. Two-state animation. Exits.
  22. //
  23. //-----------------------------------------------------------------------------
  24. static const char
  25. rcsid[] = "$Id: p_switch.c,v 1.3 1997/01/28 22:08:29 b1 Exp $";
  26. #include "i_system.h"
  27. #include "doomdef.h"
  28. #include "p_local.h"
  29. #include "g_game.h"
  30. #include "s_sound.h"
  31. // Data.
  32. #include "sounds.h"
  33. // State.
  34. #include "doomstat.h"
  35. #include "r_state.h"
  36. //
  37. // CHANGE THE TEXTURE OF A WALL SWITCH TO ITS OPPOSITE
  38. //
  39. switchlist_t alphSwitchList[] =
  40. {
  41.     // Doom shareware episode 1 switches
  42.     {"SW1BRCOM", "SW2BRCOM", 1},
  43.     {"SW1BRN1", "SW2BRN1", 1},
  44.     {"SW1BRN2", "SW2BRN2", 1},
  45.     {"SW1BRNGN", "SW2BRNGN", 1},
  46.     {"SW1BROWN", "SW2BROWN", 1},
  47.     {"SW1COMM", "SW2COMM", 1},
  48.     {"SW1COMP", "SW2COMP", 1},
  49.     {"SW1DIRT", "SW2DIRT", 1},
  50.     {"SW1EXIT", "SW2EXIT", 1},
  51.     {"SW1GRAY", "SW2GRAY", 1},
  52.     {"SW1GRAY1", "SW2GRAY1", 1},
  53.     {"SW1METAL", "SW2METAL", 1},
  54.     {"SW1PIPE", "SW2PIPE", 1},
  55.     {"SW1SLAD", "SW2SLAD", 1},
  56.     {"SW1STARG", "SW2STARG", 1},
  57.     {"SW1STON1", "SW2STON1", 1},
  58.     {"SW1STON2", "SW2STON2", 1},
  59.     {"SW1STONE", "SW2STONE", 1},
  60.     {"SW1STRTN", "SW2STRTN", 1},
  61.     
  62.     // Doom registered episodes 2&3 switches
  63.     {"SW1BLUE", "SW2BLUE", 2},
  64.     {"SW1CMT", "SW2CMT", 2},
  65.     {"SW1GARG", "SW2GARG", 2},
  66.     {"SW1GSTON", "SW2GSTON", 2},
  67.     {"SW1HOT", "SW2HOT", 2},
  68.     {"SW1LION", "SW2LION", 2},
  69.     {"SW1SATYR", "SW2SATYR", 2},
  70.     {"SW1SKIN", "SW2SKIN", 2},
  71.     {"SW1VINE", "SW2VINE", 2},
  72.     {"SW1WOOD", "SW2WOOD", 2},
  73.     
  74.     // Doom II switches
  75.     {"SW1PANEL", "SW2PANEL", 3},
  76.     {"SW1ROCK", "SW2ROCK", 3},
  77.     {"SW1MET2", "SW2MET2", 3},
  78.     {"SW1WDMET", "SW2WDMET", 3},
  79.     {"SW1BRIK", "SW2BRIK", 3},
  80.     {"SW1MOD1", "SW2MOD1", 3},
  81.     {"SW1ZIM", "SW2ZIM", 3},
  82.     {"SW1STON6", "SW2STON6", 3},
  83.     {"SW1TEK", "SW2TEK", 3},
  84.     {"SW1MARB", "SW2MARB", 3},
  85.     {"SW1SKULL", "SW2SKULL", 3},
  86.     {"", "", 0}
  87. };
  88. int switchlist[MAXSWITCHES * 2];
  89. int numswitches;
  90. button_t        buttonlist[MAXBUTTONS];
  91. //
  92. // P_InitSwitchList
  93. // Only called at game initialization.
  94. //
  95. void P_InitSwitchList(void)
  96. {
  97.     int i;
  98.     int index;
  99.     int episode;
  100.     episode = 1;
  101.     if (gamemode == registered)
  102. episode = 2;
  103.     else
  104. if ( gamemode == commercial )
  105.     episode = 3;
  106.     for (index = 0,i = 0;i < MAXSWITCHES;i++)
  107.     {
  108. if (!alphSwitchList[i].episode)
  109. {
  110.     numswitches = index/2;
  111.     switchlist[index] = -1;
  112.     break;
  113. }
  114. if (alphSwitchList[i].episode <= episode)
  115. {
  116. #if 0 // UNUSED - debug?
  117.     int value;
  118.     if (R_CheckTextureNumForName(alphSwitchList[i].name1) < 0)
  119.     {
  120. I_Error("Can't find switch texture '%s'!",
  121. alphSwitchList[i].name1);
  122. continue;
  123.     }
  124.     
  125.     value = R_TextureNumForName(alphSwitchList[i].name1);
  126. #endif
  127.     switchlist[index++] = R_TextureNumForName(alphSwitchList[i].name1);
  128.     switchlist[index++] = R_TextureNumForName(alphSwitchList[i].name2);
  129. }
  130.     }
  131. }
  132. //
  133. // Start a button counting down till it turns off.
  134. //
  135. void
  136. P_StartButton
  137. ( line_t* line,
  138.   bwhere_e w,
  139.   int texture,
  140.   int time )
  141. {
  142.     int i;
  143.     
  144.     // See if button is already pressed
  145.     for (i = 0;i < MAXBUTTONS;i++)
  146.     {
  147. if (buttonlist[i].btimer
  148.     && buttonlist[i].line == line)
  149. {
  150.     
  151.     return;
  152. }
  153.     }
  154.     
  155.     
  156.     for (i = 0;i < MAXBUTTONS;i++)
  157.     {
  158. if (!buttonlist[i].btimer)
  159. {
  160.     buttonlist[i].line = line;
  161.     buttonlist[i].where = w;
  162.     buttonlist[i].btexture = texture;
  163.     buttonlist[i].btimer = time;
  164.     buttonlist[i].soundorg = (mobj_t *)&line->frontsector->soundorg;
  165.     return;
  166. }
  167.     }
  168.     
  169.     I_Error("P_StartButton: no button slots left!");
  170. }
  171. //
  172. // Function that changes wall texture.
  173. // Tell it if switch is ok to use again (1=yes, it's a button).
  174. //
  175. void
  176. P_ChangeSwitchTexture
  177. ( line_t* line,
  178.   int  useAgain )
  179. {
  180.     int     texTop;
  181.     int     texMid;
  182.     int     texBot;
  183.     int     i;
  184.     int     sound;
  185.     if (!useAgain)
  186. line->special = 0;
  187.     texTop = sides[line->sidenum[0]].toptexture;
  188.     texMid = sides[line->sidenum[0]].midtexture;
  189.     texBot = sides[line->sidenum[0]].bottomtexture;
  190.     sound = sfx_swtchn;
  191.     // EXIT SWITCH?
  192.     if (line->special == 11)                
  193. sound = sfx_swtchx;
  194.     for (i = 0;i < numswitches*2;i++)
  195.     {
  196. if (switchlist[i] == texTop)
  197. {
  198.     S_StartSound(buttonlist->soundorg,sound);
  199.     sides[line->sidenum[0]].toptexture = switchlist[i^1];
  200.     if (useAgain)
  201. P_StartButton(line,top,switchlist[i],BUTTONTIME);
  202.     return;
  203. }
  204. else
  205. {
  206.     if (switchlist[i] == texMid)
  207.     {
  208. S_StartSound(buttonlist->soundorg,sound);
  209. sides[line->sidenum[0]].midtexture = switchlist[i^1];
  210. if (useAgain)
  211.     P_StartButton(line, middle,switchlist[i],BUTTONTIME);
  212. return;
  213.     }
  214.     else
  215.     {
  216. if (switchlist[i] == texBot)
  217. {
  218.     S_StartSound(buttonlist->soundorg,sound);
  219.     sides[line->sidenum[0]].bottomtexture = switchlist[i^1];
  220.     if (useAgain)
  221. P_StartButton(line, bottom,switchlist[i],BUTTONTIME);
  222.     return;
  223. }
  224.     }
  225. }
  226.     }
  227. }
  228. //
  229. // P_UseSpecialLine
  230. // Called when a thing uses a special line.
  231. // Only the front sides of lines are usable.
  232. //
  233. boolean
  234. P_UseSpecialLine
  235. ( mobj_t* thing,
  236.   line_t* line,
  237.   int side )
  238. {               
  239.     // Err...
  240.     // Use the back sides of VERY SPECIAL lines...
  241.     if (side)
  242.     {
  243. switch(line->special)
  244. {
  245.   case 124:
  246.     // Sliding door open&close
  247.     // UNUSED?
  248.     break;
  249.   default:
  250.     return false;
  251.     break;
  252. }
  253.     }
  254.     
  255.     // Switches that other things can activate.
  256.     if (!thing->player)
  257.     {
  258. // never open secret doors
  259. if (line->flags & ML_SECRET)
  260.     return false;
  261. switch(line->special)
  262. {
  263.   case 1:  // MANUAL DOOR RAISE
  264.   case 32: // MANUAL BLUE
  265.   case 33: // MANUAL RED
  266.   case 34: // MANUAL YELLOW
  267.     break;
  268.     
  269.   default:
  270.     return false;
  271.     break;
  272. }
  273.     }
  274.     
  275.     // do something  
  276.     switch (line->special)
  277.     {
  278. // MANUALS
  279.       case 1: // Vertical Door
  280.       case 26: // Blue Door/Locked
  281.       case 27: // Yellow Door /Locked
  282.       case 28: // Red Door /Locked
  283.       case 31: // Manual door open
  284.       case 32: // Blue locked door open
  285.       case 33: // Red locked door open
  286.       case 34: // Yellow locked door open
  287.       case 117: // Blazing door raise
  288.       case 118: // Blazing door open
  289. EV_VerticalDoor (line, thing);
  290. break;
  291. //UNUSED - Door Slide Open&Close
  292. // case 124:
  293. // EV_SlidingDoor (line, thing);
  294. // break;
  295. // SWITCHES
  296.       case 7:
  297. // Build Stairs
  298. if (EV_BuildStairs(line,build8))
  299.     P_ChangeSwitchTexture(line,0);
  300. break;
  301.       case 9:
  302. // Change Donut
  303. if (EV_DoDonut(line))
  304.     P_ChangeSwitchTexture(line,0);
  305. break;
  306.       case 11:
  307. // Exit level
  308. P_ChangeSwitchTexture(line,0);
  309. G_ExitLevel ();
  310. break;
  311.       case 14:
  312. // Raise Floor 32 and change texture
  313. if (EV_DoPlat(line,raiseAndChange,32))
  314.     P_ChangeSwitchTexture(line,0);
  315. break;
  316.       case 15:
  317. // Raise Floor 24 and change texture
  318. if (EV_DoPlat(line,raiseAndChange,24))
  319.     P_ChangeSwitchTexture(line,0);
  320. break;
  321.       case 18:
  322. // Raise Floor to next highest floor
  323. if (EV_DoFloor(line, raiseFloorToNearest))
  324.     P_ChangeSwitchTexture(line,0);
  325. break;
  326.       case 20:
  327. // Raise Plat next highest floor and change texture
  328. if (EV_DoPlat(line,raiseToNearestAndChange,0))
  329.     P_ChangeSwitchTexture(line,0);
  330. break;
  331.       case 21:
  332. // PlatDownWaitUpStay
  333. if (EV_DoPlat(line,downWaitUpStay,0))
  334.     P_ChangeSwitchTexture(line,0);
  335. break;
  336.       case 23:
  337. // Lower Floor to Lowest
  338. if (EV_DoFloor(line,lowerFloorToLowest))
  339.     P_ChangeSwitchTexture(line,0);
  340. break;
  341.       case 29:
  342. // Raise Door
  343. if (EV_DoDoor(line,normal))
  344.     P_ChangeSwitchTexture(line,0);
  345. break;
  346.       case 41:
  347. // Lower Ceiling to Floor
  348. if (EV_DoCeiling(line,lowerToFloor))
  349.     P_ChangeSwitchTexture(line,0);
  350. break;
  351.       case 71:
  352. // Turbo Lower Floor
  353. if (EV_DoFloor(line,turboLower))
  354.     P_ChangeSwitchTexture(line,0);
  355. break;
  356.       case 49:
  357. // Ceiling Crush And Raise
  358. if (EV_DoCeiling(line,crushAndRaise))
  359.     P_ChangeSwitchTexture(line,0);
  360. break;
  361.       case 50:
  362. // Close Door
  363. if (EV_DoDoor(line,close))
  364.     P_ChangeSwitchTexture(line,0);
  365. break;
  366.       case 51:
  367. // Secret EXIT
  368. P_ChangeSwitchTexture(line,0);
  369. G_SecretExitLevel ();
  370. break;
  371.       case 55:
  372. // Raise Floor Crush
  373. if (EV_DoFloor(line,raiseFloorCrush))
  374.     P_ChangeSwitchTexture(line,0);
  375. break;
  376.       case 101:
  377. // Raise Floor
  378. if (EV_DoFloor(line,raiseFloor))
  379.     P_ChangeSwitchTexture(line,0);
  380. break;
  381.       case 102:
  382. // Lower Floor to Surrounding floor height
  383. if (EV_DoFloor(line,lowerFloor))
  384.     P_ChangeSwitchTexture(line,0);
  385. break;
  386.       case 103:
  387. // Open Door
  388. if (EV_DoDoor(line,open))
  389.     P_ChangeSwitchTexture(line,0);
  390. break;
  391.       case 111:
  392. // Blazing Door Raise (faster than TURBO!)
  393. if (EV_DoDoor (line,blazeRaise))
  394.     P_ChangeSwitchTexture(line,0);
  395. break;
  396.       case 112:
  397. // Blazing Door Open (faster than TURBO!)
  398. if (EV_DoDoor (line,blazeOpen))
  399.     P_ChangeSwitchTexture(line,0);
  400. break;
  401.       case 113:
  402. // Blazing Door Close (faster than TURBO!)
  403. if (EV_DoDoor (line,blazeClose))
  404.     P_ChangeSwitchTexture(line,0);
  405. break;
  406.       case 122:
  407. // Blazing PlatDownWaitUpStay
  408. if (EV_DoPlat(line,blazeDWUS,0))
  409.     P_ChangeSwitchTexture(line,0);
  410. break;
  411.       case 127:
  412. // Build Stairs Turbo 16
  413. if (EV_BuildStairs(line,turbo16))
  414.     P_ChangeSwitchTexture(line,0);
  415. break;
  416.       case 131:
  417. // Raise Floor Turbo
  418. if (EV_DoFloor(line,raiseFloorTurbo))
  419.     P_ChangeSwitchTexture(line,0);
  420. break;
  421.       case 133:
  422. // BlzOpenDoor BLUE
  423.       case 135:
  424. // BlzOpenDoor RED
  425.       case 137:
  426. // BlzOpenDoor YELLOW
  427. if (EV_DoLockedDoor (line,blazeOpen,thing))
  428.     P_ChangeSwitchTexture(line,0);
  429. break;
  430.       case 140:
  431. // Raise Floor 512
  432. if (EV_DoFloor(line,raiseFloor512))
  433.     P_ChangeSwitchTexture(line,0);
  434. break;
  435. // BUTTONS
  436.       case 42:
  437. // Close Door
  438. if (EV_DoDoor(line,close))
  439.     P_ChangeSwitchTexture(line,1);
  440. break;
  441.       case 43:
  442. // Lower Ceiling to Floor
  443. if (EV_DoCeiling(line,lowerToFloor))
  444.     P_ChangeSwitchTexture(line,1);
  445. break;
  446.       case 45:
  447. // Lower Floor to Surrounding floor height
  448. if (EV_DoFloor(line,lowerFloor))
  449.     P_ChangeSwitchTexture(line,1);
  450. break;
  451.       case 60:
  452. // Lower Floor to Lowest
  453. if (EV_DoFloor(line,lowerFloorToLowest))
  454.     P_ChangeSwitchTexture(line,1);
  455. break;
  456.       case 61:
  457. // Open Door
  458. if (EV_DoDoor(line,open))
  459.     P_ChangeSwitchTexture(line,1);
  460. break;
  461.       case 62:
  462. // PlatDownWaitUpStay
  463. if (EV_DoPlat(line,downWaitUpStay,1))
  464.     P_ChangeSwitchTexture(line,1);
  465. break;
  466.       case 63:
  467. // Raise Door
  468. if (EV_DoDoor(line,normal))
  469.     P_ChangeSwitchTexture(line,1);
  470. break;
  471.       case 64:
  472. // Raise Floor to ceiling
  473. if (EV_DoFloor(line,raiseFloor))
  474.     P_ChangeSwitchTexture(line,1);
  475. break;
  476.       case 66:
  477. // Raise Floor 24 and change texture
  478. if (EV_DoPlat(line,raiseAndChange,24))
  479.     P_ChangeSwitchTexture(line,1);
  480. break;
  481.       case 67:
  482. // Raise Floor 32 and change texture
  483. if (EV_DoPlat(line,raiseAndChange,32))
  484.     P_ChangeSwitchTexture(line,1);
  485. break;
  486.       case 65:
  487. // Raise Floor Crush
  488. if (EV_DoFloor(line,raiseFloorCrush))
  489.     P_ChangeSwitchTexture(line,1);
  490. break;
  491.       case 68:
  492. // Raise Plat to next highest floor and change texture
  493. if (EV_DoPlat(line,raiseToNearestAndChange,0))
  494.     P_ChangeSwitchTexture(line,1);
  495. break;
  496.       case 69:
  497. // Raise Floor to next highest floor
  498. if (EV_DoFloor(line, raiseFloorToNearest))
  499.     P_ChangeSwitchTexture(line,1);
  500. break;
  501.       case 70:
  502. // Turbo Lower Floor
  503. if (EV_DoFloor(line,turboLower))
  504.     P_ChangeSwitchTexture(line,1);
  505. break;
  506.       case 114:
  507. // Blazing Door Raise (faster than TURBO!)
  508. if (EV_DoDoor (line,blazeRaise))
  509.     P_ChangeSwitchTexture(line,1);
  510. break;
  511.       case 115:
  512. // Blazing Door Open (faster than TURBO!)
  513. if (EV_DoDoor (line,blazeOpen))
  514.     P_ChangeSwitchTexture(line,1);
  515. break;
  516.       case 116:
  517. // Blazing Door Close (faster than TURBO!)
  518. if (EV_DoDoor (line,blazeClose))
  519.     P_ChangeSwitchTexture(line,1);
  520. break;
  521.       case 123:
  522. // Blazing PlatDownWaitUpStay
  523. if (EV_DoPlat(line,blazeDWUS,0))
  524.     P_ChangeSwitchTexture(line,1);
  525. break;
  526.       case 132:
  527. // Raise Floor Turbo
  528. if (EV_DoFloor(line,raiseFloorTurbo))
  529.     P_ChangeSwitchTexture(line,1);
  530. break;
  531.       case 99:
  532. // BlzOpenDoor BLUE
  533.       case 134:
  534. // BlzOpenDoor RED
  535.       case 136:
  536. // BlzOpenDoor YELLOW
  537. if (EV_DoLockedDoor (line,blazeOpen,thing))
  538.     P_ChangeSwitchTexture(line,1);
  539. break;
  540.       case 138:
  541. // Light Turn On
  542. EV_LightTurnOn(line,255);
  543. P_ChangeSwitchTexture(line,1);
  544. break;
  545.       case 139:
  546. // Light Turn Off
  547. EV_LightTurnOn(line,35);
  548. P_ChangeSwitchTexture(line,1);
  549. break;
  550.     }
  551.     return true;
  552. }