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

射击游戏

开发平台:

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. // $Log:$
  18. //
  19. // DESCRIPTION:
  20. // Handle Sector base lighting effects.
  21. // Muzzle flash?
  22. //
  23. //-----------------------------------------------------------------------------
  24. static const char
  25. rcsid[] = "$Id: p_lights.c,v 1.5 1997/02/03 22:45:11 b1 Exp $";
  26. #include "z_zone.h"
  27. #include "m_random.h"
  28. #include "doomdef.h"
  29. #include "p_local.h"
  30. // State.
  31. #include "r_state.h"
  32. //
  33. // FIRELIGHT FLICKER
  34. //
  35. //
  36. // T_FireFlicker
  37. //
  38. void T_FireFlicker (fireflicker_t* flick)
  39. {
  40.     int amount;
  41.     if (--flick->count)
  42. return;
  43.     amount = (P_Random()&3)*16;
  44.     
  45.     if (flick->sector->lightlevel - amount < flick->minlight)
  46. flick->sector->lightlevel = flick->minlight;
  47.     else
  48. flick->sector->lightlevel = flick->maxlight - amount;
  49.     flick->count = 4;
  50. }
  51. //
  52. // P_SpawnFireFlicker
  53. //
  54. void P_SpawnFireFlicker (sector_t* sector)
  55. {
  56.     fireflicker_t* flick;
  57.     // Note that we are resetting sector attributes.
  58.     // Nothing special about it during gameplay.
  59.     sector->special = 0; 
  60.     flick = Z_Malloc ( sizeof(*flick), PU_LEVSPEC, 0);
  61.     P_AddThinker (&flick->thinker);
  62.     flick->thinker.function.acp1 = (actionf_p1) T_FireFlicker;
  63.     flick->sector = sector;
  64.     flick->maxlight = sector->lightlevel;
  65.     flick->minlight = P_FindMinSurroundingLight(sector,sector->lightlevel)+16;
  66.     flick->count = 4;
  67. }
  68. //
  69. // BROKEN LIGHT FLASHING
  70. //
  71. //
  72. // T_LightFlash
  73. // Do flashing lights.
  74. //
  75. void T_LightFlash (lightflash_t* flash)
  76. {
  77.     if (--flash->count)
  78. return;
  79.     if (flash->sector->lightlevel == flash->maxlight)
  80.     {
  81. flash-> sector->lightlevel = flash->minlight;
  82. flash->count = (P_Random()&flash->mintime)+1;
  83.     }
  84.     else
  85.     {
  86. flash-> sector->lightlevel = flash->maxlight;
  87. flash->count = (P_Random()&flash->maxtime)+1;
  88.     }
  89. }
  90. //
  91. // P_SpawnLightFlash
  92. // After the map has been loaded, scan each sector
  93. // for specials that spawn thinkers
  94. //
  95. void P_SpawnLightFlash (sector_t* sector)
  96. {
  97.     lightflash_t* flash;
  98.     // nothing special about it during gameplay
  99.     sector->special = 0;
  100.     flash = Z_Malloc ( sizeof(*flash), PU_LEVSPEC, 0);
  101.     P_AddThinker (&flash->thinker);
  102.     flash->thinker.function.acp1 = (actionf_p1) T_LightFlash;
  103.     flash->sector = sector;
  104.     flash->maxlight = sector->lightlevel;
  105.     flash->minlight = P_FindMinSurroundingLight(sector,sector->lightlevel);
  106.     flash->maxtime = 64;
  107.     flash->mintime = 7;
  108.     flash->count = (P_Random()&flash->maxtime)+1;
  109. }
  110. //
  111. // STROBE LIGHT FLASHING
  112. //
  113. //
  114. // T_StrobeFlash
  115. //
  116. void T_StrobeFlash (strobe_t* flash)
  117. {
  118.     if (--flash->count)
  119. return;
  120.     if (flash->sector->lightlevel == flash->minlight)
  121.     {
  122. flash-> sector->lightlevel = flash->maxlight;
  123. flash->count = flash->brighttime;
  124.     }
  125.     else
  126.     {
  127. flash-> sector->lightlevel = flash->minlight;
  128. flash->count =flash->darktime;
  129.     }
  130. }
  131. //
  132. // P_SpawnStrobeFlash
  133. // After the map has been loaded, scan each sector
  134. // for specials that spawn thinkers
  135. //
  136. void
  137. P_SpawnStrobeFlash
  138. ( sector_t* sector,
  139.   int fastOrSlow,
  140.   int inSync )
  141. {
  142.     strobe_t* flash;
  143.     flash = Z_Malloc ( sizeof(*flash), PU_LEVSPEC, 0);
  144.     P_AddThinker (&flash->thinker);
  145.     flash->sector = sector;
  146.     flash->darktime = fastOrSlow;
  147.     flash->brighttime = STROBEBRIGHT;
  148.     flash->thinker.function.acp1 = (actionf_p1) T_StrobeFlash;
  149.     flash->maxlight = sector->lightlevel;
  150.     flash->minlight = P_FindMinSurroundingLight(sector, sector->lightlevel);
  151.     if (flash->minlight == flash->maxlight)
  152. flash->minlight = 0;
  153.     // nothing special about it during gameplay
  154.     sector->special = 0;
  155.     if (!inSync)
  156. flash->count = (P_Random()&7)+1;
  157.     else
  158. flash->count = 1;
  159. }
  160. //
  161. // Start strobing lights (usually from a trigger)
  162. //
  163. void EV_StartLightStrobing(line_t* line)
  164. {
  165.     int secnum;
  166.     sector_t* sec;
  167.     secnum = -1;
  168.     while ((secnum = P_FindSectorFromLineTag(line,secnum)) >= 0)
  169.     {
  170. sec = &sectors[secnum];
  171. if (sec->specialdata)
  172.     continue;
  173. P_SpawnStrobeFlash (sec,SLOWDARK, 0);
  174.     }
  175. }
  176. //
  177. // TURN LINE'S TAG LIGHTS OFF
  178. //
  179. void EV_TurnTagLightsOff(line_t* line)
  180. {
  181.     int i;
  182.     int j;
  183.     int min;
  184.     sector_t* sector;
  185.     sector_t* tsec;
  186.     line_t* templine;
  187.     sector = sectors;
  188.     
  189.     for (j = 0;j < numsectors; j++, sector++)
  190.     {
  191. if (sector->tag == line->tag)
  192. {
  193.     min = sector->lightlevel;
  194.     for (i = 0;i < sector->linecount; i++)
  195.     {
  196. templine = sector->lines[i];
  197. tsec = getNextSector(templine,sector);
  198. if (!tsec)
  199.     continue;
  200. if (tsec->lightlevel < min)
  201.     min = tsec->lightlevel;
  202.     }
  203.     sector->lightlevel = min;
  204. }
  205.     }
  206. }
  207. //
  208. // TURN LINE'S TAG LIGHTS ON
  209. //
  210. void
  211. EV_LightTurnOn
  212. ( line_t* line,
  213.   int bright )
  214. {
  215.     int i;
  216.     int j;
  217.     sector_t* sector;
  218.     sector_t* temp;
  219.     line_t* templine;
  220.     sector = sectors;
  221.     for (i=0;i<numsectors;i++, sector++)
  222.     {
  223. if (sector->tag == line->tag)
  224. {
  225.     // bright = 0 means to search
  226.     // for highest light level
  227.     // surrounding sector
  228.     if (!bright)
  229.     {
  230. for (j = 0;j < sector->linecount; j++)
  231. {
  232.     templine = sector->lines[j];
  233.     temp = getNextSector(templine,sector);
  234.     if (!temp)
  235. continue;
  236.     if (temp->lightlevel > bright)
  237. bright = temp->lightlevel;
  238. }
  239.     }
  240.     sector-> lightlevel = bright;
  241. }
  242.     }
  243. }
  244.     
  245. //
  246. // Spawn glowing light
  247. //
  248. void T_Glow(glow_t* g)
  249. {
  250.     switch(g->direction)
  251.     {
  252.       case -1:
  253. // DOWN
  254. g->sector->lightlevel -= GLOWSPEED;
  255. if (g->sector->lightlevel <= g->minlight)
  256. {
  257.     g->sector->lightlevel += GLOWSPEED;
  258.     g->direction = 1;
  259. }
  260. break;
  261.       case 1:
  262. // UP
  263. g->sector->lightlevel += GLOWSPEED;
  264. if (g->sector->lightlevel >= g->maxlight)
  265. {
  266.     g->sector->lightlevel -= GLOWSPEED;
  267.     g->direction = -1;
  268. }
  269. break;
  270.     }
  271. }
  272. void P_SpawnGlowingLight(sector_t* sector)
  273. {
  274.     glow_t* g;
  275.     g = Z_Malloc( sizeof(*g), PU_LEVSPEC, 0);
  276.     P_AddThinker(&g->thinker);
  277.     g->sector = sector;
  278.     g->minlight = P_FindMinSurroundingLight(sector,sector->lightlevel);
  279.     g->maxlight = sector->lightlevel;
  280.     g->thinker.function.acp1 = (actionf_p1) T_Glow;
  281.     g->direction = -1;
  282.     sector->special = 0;
  283. }