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

射击游戏

开发平台:

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. // DESCRIPTION:  none
  18. // Implements special effects:
  19. // Texture animation, height or lighting changes
  20. //  according to adjacent sectors, respective
  21. //  utility functions, etc.
  22. //
  23. //-----------------------------------------------------------------------------
  24. #ifndef __P_SPEC__
  25. #define __P_SPEC__
  26. //
  27. // End-level timer (-TIMER option)
  28. //
  29. extern boolean levelTimer;
  30. extern int levelTimeCount;
  31. //      Define values for map objects
  32. #define MO_TELEPORTMAN          14
  33. // at game start
  34. void    P_InitPicAnims (void);
  35. // at map load
  36. void    P_SpawnSpecials (void);
  37. // every tic
  38. void    P_UpdateSpecials (void);
  39. // when needed
  40. boolean
  41. P_UseSpecialLine
  42. ( mobj_t* thing,
  43.   line_t* line,
  44.   int side );
  45. void
  46. P_ShootSpecialLine
  47. ( mobj_t* thing,
  48.   line_t* line );
  49. void
  50. P_CrossSpecialLine
  51. ( int linenum,
  52.   int side,
  53.   mobj_t* thing );
  54. void    P_PlayerInSpecialSector (player_t* player);
  55. int
  56. twoSided
  57. ( int sector,
  58.   int line );
  59. sector_t*
  60. getSector
  61. ( int currentSector,
  62.   int line,
  63.   int side );
  64. side_t*
  65. getSide
  66. ( int currentSector,
  67.   int line,
  68.   int side );
  69. fixed_t P_FindLowestFloorSurrounding(sector_t* sec);
  70. fixed_t P_FindHighestFloorSurrounding(sector_t* sec);
  71. fixed_t
  72. P_FindNextHighestFloor
  73. ( sector_t* sec,
  74.   int currentheight );
  75. fixed_t P_FindLowestCeilingSurrounding(sector_t* sec);
  76. fixed_t P_FindHighestCeilingSurrounding(sector_t* sec);
  77. int
  78. P_FindSectorFromLineTag
  79. ( line_t* line,
  80.   int start );
  81. int
  82. P_FindMinSurroundingLight
  83. ( sector_t* sector,
  84.   int max );
  85. sector_t*
  86. getNextSector
  87. ( line_t* line,
  88.   sector_t* sec );
  89. //
  90. // SPECIAL
  91. //
  92. int EV_DoDonut(line_t* line);
  93. //
  94. // P_LIGHTS
  95. //
  96. typedef struct
  97. {
  98.     thinker_t thinker;
  99.     sector_t* sector;
  100.     int count;
  101.     int maxlight;
  102.     int minlight;
  103.     
  104. } fireflicker_t;
  105. typedef struct
  106. {
  107.     thinker_t thinker;
  108.     sector_t* sector;
  109.     int count;
  110.     int maxlight;
  111.     int minlight;
  112.     int maxtime;
  113.     int mintime;
  114.     
  115. } lightflash_t;
  116. typedef struct
  117. {
  118.     thinker_t thinker;
  119.     sector_t* sector;
  120.     int count;
  121.     int minlight;
  122.     int maxlight;
  123.     int darktime;
  124.     int brighttime;
  125.     
  126. } strobe_t;
  127. typedef struct
  128. {
  129.     thinker_t thinker;
  130.     sector_t* sector;
  131.     int minlight;
  132.     int maxlight;
  133.     int direction;
  134. } glow_t;
  135. #define GLOWSPEED 8
  136. #define STROBEBRIGHT 5
  137. #define FASTDARK 15
  138. #define SLOWDARK 35
  139. void    P_SpawnFireFlicker (sector_t* sector);
  140. void    T_LightFlash (lightflash_t* flash);
  141. void    P_SpawnLightFlash (sector_t* sector);
  142. void    T_StrobeFlash (strobe_t* flash);
  143. void
  144. P_SpawnStrobeFlash
  145. ( sector_t* sector,
  146.   int fastOrSlow,
  147.   int inSync );
  148. void    EV_StartLightStrobing(line_t* line);
  149. void    EV_TurnTagLightsOff(line_t* line);
  150. void
  151. EV_LightTurnOn
  152. ( line_t* line,
  153.   int bright );
  154. void    T_Glow(glow_t* g);
  155. void    P_SpawnGlowingLight(sector_t* sector);
  156. //
  157. // P_SWITCH
  158. //
  159. typedef struct
  160. {
  161.     char name1[9];
  162.     char name2[9];
  163.     short episode;
  164.     
  165. } switchlist_t;
  166. typedef enum
  167. {
  168.     top,
  169.     middle,
  170.     bottom
  171. } bwhere_e;
  172. typedef struct
  173. {
  174.     line_t* line;
  175.     bwhere_e where;
  176.     int btexture;
  177.     int btimer;
  178.     mobj_t* soundorg;
  179. } button_t;
  180.  // max # of wall switches in a level
  181. #define MAXSWITCHES 50
  182.  // 4 players, 4 buttons each at once, max.
  183. #define MAXBUTTONS 16
  184.  // 1 second, in ticks. 
  185. #define BUTTONTIME      35             
  186. extern button_t buttonlist[MAXBUTTONS]; 
  187. void
  188. P_ChangeSwitchTexture
  189. ( line_t* line,
  190.   int useAgain );
  191. void P_InitSwitchList(void);
  192. //
  193. // P_PLATS
  194. //
  195. typedef enum
  196. {
  197.     up,
  198.     down,
  199.     waiting,
  200.     in_stasis
  201. } plat_e;
  202. typedef enum
  203. {
  204.     perpetualRaise,
  205.     downWaitUpStay,
  206.     raiseAndChange,
  207.     raiseToNearestAndChange,
  208.     blazeDWUS
  209. } plattype_e;
  210. typedef struct
  211. {
  212.     thinker_t thinker;
  213.     sector_t* sector;
  214.     fixed_t speed;
  215.     fixed_t low;
  216.     fixed_t high;
  217.     int wait;
  218.     int count;
  219.     plat_e status;
  220.     plat_e oldstatus;
  221.     boolean crush;
  222.     int tag;
  223.     plattype_e type;
  224.     
  225. } plat_t;
  226. #define PLATWAIT 3
  227. #define PLATSPEED FRACUNIT
  228. #define MAXPLATS 30
  229. extern plat_t* activeplats[MAXPLATS];
  230. void    T_PlatRaise(plat_t* plat);
  231. int
  232. EV_DoPlat
  233. ( line_t* line,
  234.   plattype_e type,
  235.   int amount );
  236. void    P_AddActivePlat(plat_t* plat);
  237. void    P_RemoveActivePlat(plat_t* plat);
  238. void    EV_StopPlat(line_t* line);
  239. void    P_ActivateInStasis(int tag);
  240. //
  241. // P_DOORS
  242. //
  243. typedef enum
  244. {
  245.     normal,
  246.     close30ThenOpen,
  247.     close,
  248.     open,
  249.     raiseIn5Mins,
  250.     blazeRaise,
  251.     blazeOpen,
  252.     blazeClose
  253. } vldoor_e;
  254. typedef struct
  255. {
  256.     thinker_t thinker;
  257.     vldoor_e type;
  258.     sector_t* sector;
  259.     fixed_t topheight;
  260.     fixed_t speed;
  261.     // 1 = up, 0 = waiting at top, -1 = down
  262.     int             direction;
  263.     
  264.     // tics to wait at the top
  265.     int             topwait;
  266.     // (keep in case a door going down is reset)
  267.     // when it reaches 0, start going down
  268.     int             topcountdown;
  269.     
  270. } vldoor_t;
  271. #define VDOORSPEED FRACUNIT*2
  272. #define VDOORWAIT 150
  273. void
  274. EV_VerticalDoor
  275. ( line_t* line,
  276.   mobj_t* thing );
  277. int
  278. EV_DoDoor
  279. ( line_t* line,
  280.   vldoor_e type );
  281. int
  282. EV_DoLockedDoor
  283. ( line_t* line,
  284.   vldoor_e type,
  285.   mobj_t* thing );
  286. void    T_VerticalDoor (vldoor_t* door);
  287. void    P_SpawnDoorCloseIn30 (sector_t* sec);
  288. void
  289. P_SpawnDoorRaiseIn5Mins
  290. ( sector_t* sec,
  291.   int secnum );
  292. #if 0 // UNUSED
  293. //
  294. //      Sliding doors...
  295. //
  296. typedef enum
  297. {
  298.     sd_opening,
  299.     sd_waiting,
  300.     sd_closing
  301. } sd_e;
  302. typedef enum
  303. {
  304.     sdt_openOnly,
  305.     sdt_closeOnly,
  306.     sdt_openAndClose
  307. } sdt_e;
  308. typedef struct
  309. {
  310.     thinker_t thinker;
  311.     sdt_e type;
  312.     line_t* line;
  313.     int frame;
  314.     int whichDoorIndex;
  315.     int timer;
  316.     sector_t* frontsector;
  317.     sector_t* backsector;
  318.     sd_e  status;
  319. } slidedoor_t;
  320. typedef struct
  321. {
  322.     char frontFrame1[9];
  323.     char frontFrame2[9];
  324.     char frontFrame3[9];
  325.     char frontFrame4[9];
  326.     char backFrame1[9];
  327.     char backFrame2[9];
  328.     char backFrame3[9];
  329.     char backFrame4[9];
  330.     
  331. } slidename_t;
  332. typedef struct
  333. {
  334.     int             frontFrames[4];
  335.     int             backFrames[4];
  336. } slideframe_t;
  337. // how many frames of animation
  338. #define SNUMFRAMES 4
  339. #define SDOORWAIT 35*3
  340. #define SWAITTICS 4
  341. // how many diff. types of anims
  342. #define MAXSLIDEDOORS 5                            
  343. void P_InitSlidingDoorFrames(void);
  344. void
  345. EV_SlidingDoor
  346. ( line_t* line,
  347.   mobj_t* thing );
  348. #endif
  349. //
  350. // P_CEILNG
  351. //
  352. typedef enum
  353. {
  354.     lowerToFloor,
  355.     raiseToHighest,
  356.     lowerAndCrush,
  357.     crushAndRaise,
  358.     fastCrushAndRaise,
  359.     silentCrushAndRaise
  360. } ceiling_e;
  361. typedef struct
  362. {
  363.     thinker_t thinker;
  364.     ceiling_e type;
  365.     sector_t* sector;
  366.     fixed_t bottomheight;
  367.     fixed_t topheight;
  368.     fixed_t speed;
  369.     boolean crush;
  370.     // 1 = up, 0 = waiting, -1 = down
  371.     int direction;
  372.     // ID
  373.     int tag;                   
  374.     int olddirection;
  375.     
  376. } ceiling_t;
  377. #define CEILSPEED FRACUNIT
  378. #define CEILWAIT 150
  379. #define MAXCEILINGS 30
  380. extern ceiling_t* activeceilings[MAXCEILINGS];
  381. int
  382. EV_DoCeiling
  383. ( line_t* line,
  384.   ceiling_e type );
  385. void    T_MoveCeiling (ceiling_t* ceiling);
  386. void    P_AddActiveCeiling(ceiling_t* c);
  387. void    P_RemoveActiveCeiling(ceiling_t* c);
  388. int EV_CeilingCrushStop(line_t* line);
  389. void    P_ActivateInStasisCeiling(line_t* line);
  390. //
  391. // P_FLOOR
  392. //
  393. typedef enum
  394. {
  395.     // lower floor to highest surrounding floor
  396.     lowerFloor,
  397.     
  398.     // lower floor to lowest surrounding floor
  399.     lowerFloorToLowest,
  400.     
  401.     // lower floor to highest surrounding floor VERY FAST
  402.     turboLower,
  403.     
  404.     // raise floor to lowest surrounding CEILING
  405.     raiseFloor,
  406.     
  407.     // raise floor to next highest surrounding floor
  408.     raiseFloorToNearest,
  409.     // raise floor to shortest height texture around it
  410.     raiseToTexture,
  411.     
  412.     // lower floor to lowest surrounding floor
  413.     //  and change floorpic
  414.     lowerAndChange,
  415.   
  416.     raiseFloor24,
  417.     raiseFloor24AndChange,
  418.     raiseFloorCrush,
  419.      // raise to next highest floor, turbo-speed
  420.     raiseFloorTurbo,       
  421.     donutRaise,
  422.     raiseFloor512
  423.     
  424. } floor_e;
  425. typedef enum
  426. {
  427.     build8, // slowly build by 8
  428.     turbo16 // quickly build by 16
  429.     
  430. } stair_e;
  431. typedef struct
  432. {
  433.     thinker_t thinker;
  434.     floor_e type;
  435.     boolean crush;
  436.     sector_t* sector;
  437.     int direction;
  438.     int newspecial;
  439.     short texture;
  440.     fixed_t floordestheight;
  441.     fixed_t speed;
  442. } floormove_t;
  443. #define FLOORSPEED FRACUNIT
  444. typedef enum
  445. {
  446.     ok,
  447.     crushed,
  448.     pastdest
  449.     
  450. } result_e;
  451. result_e
  452. T_MovePlane
  453. ( sector_t* sector,
  454.   fixed_t speed,
  455.   fixed_t dest,
  456.   boolean crush,
  457.   int floorOrCeiling,
  458.   int direction );
  459. int
  460. EV_BuildStairs
  461. ( line_t* line,
  462.   stair_e type );
  463. int
  464. EV_DoFloor
  465. ( line_t* line,
  466.   floor_e floortype );
  467. void T_MoveFloor( floormove_t* floor);
  468. //
  469. // P_TELEPT
  470. //
  471. int
  472. EV_Teleport
  473. ( line_t* line,
  474.   int side,
  475.   mobj_t* thing );
  476. #endif
  477. //-----------------------------------------------------------------------------
  478. //
  479. // $Log:$
  480. //
  481. //-----------------------------------------------------------------------------