|
|
1.1 root 1:
2: //**************************************************************************
3: //**
4: //** p_anim.c : Heretic 2 : Raven Software, Corp.
5: //**
6: //** $RCSfile: p_anim.c,v $
7: //** $Revision: 1.9 $
8: //** $Date: 95/07/17 18:50:37 $
9: //** $Author: bgokey $
10: //**
11: //**************************************************************************
12:
13: // HEADER FILES ------------------------------------------------------------
14:
15: #include "h2def.h"
16: #include "p_local.h"
17:
18: // MACROS ------------------------------------------------------------------
19:
20: #define ANIM_SCRIPT_NAME "ANIMDEFS"
21: #define MAX_ANIM_DEFS 20
22: #define MAX_FRAME_DEFS 96
23: #define ANIM_FLAT 0
24: #define ANIM_TEXTURE 1
25: #define SCI_FLAT "flat"
26: #define SCI_TEXTURE "texture"
27: #define SCI_PIC "pic"
28: #define SCI_TICS "tics"
29: #define SCI_RAND "rand"
30:
31: #define LIGHTNING_SPECIAL 198
32: #define LIGHTNING_SPECIAL2 199
33: #define SKYCHANGE_SPECIAL 200
34:
35: // TYPES -------------------------------------------------------------------
36:
37: typedef struct
38: {
39: int index;
40: int tics;
41: } frameDef_t;
42:
43: typedef struct
44: {
45: int type;
46: int index;
47: int tics;
48: int currentFrameDef;
49: int startFrameDef;
50: int endFrameDef;
51: } animDef_t;
52:
53: // EXTERNAL FUNCTION PROTOTYPES --------------------------------------------
54:
55: // PUBLIC FUNCTION PROTOTYPES ----------------------------------------------
56:
57: // PRIVATE FUNCTION PROTOTYPES ---------------------------------------------
58:
59: static void P_LightningFlash(void);
60:
61: // EXTERNAL DATA DECLARATIONS ----------------------------------------------
62:
63: extern fixed_t Sky1ColumnOffset;
64: extern fixed_t Sky2ColumnOffset;
65: extern int Sky1Texture;
66: extern boolean DoubleSky;
67:
68: // PUBLIC DATA DEFINITIONS -------------------------------------------------
69:
70: fixed_t Sky1ScrollDelta;
71: fixed_t Sky2ScrollDelta;
72:
73: // PRIVATE DATA DEFINITIONS ------------------------------------------------
74:
75: static animDef_t AnimDefs[MAX_ANIM_DEFS];
76: static frameDef_t FrameDefs[MAX_FRAME_DEFS];
77: static int AnimDefCount;
78: static boolean LevelHasLightning;
79: static int NextLightningFlash;
80: static int LightningFlash;
81: static int *LightningLightLevels;
82:
83: // CODE --------------------------------------------------------------------
84:
85: //==========================================================================
86: //
87: // P_AnimateSurfaces
88: //
89: //==========================================================================
90:
91: void P_AnimateSurfaces(void)
92: {
93: int i;
94: animDef_t *ad;
95: line_t *line;
96:
97: // Animate flats and textures
98: for(i = 0; i < AnimDefCount; i++)
99: {
100: ad = &AnimDefs[i];
101: ad->tics--;
102: if(ad->tics == 0)
103: {
104: if(ad->currentFrameDef == ad->endFrameDef)
105: {
106: ad->currentFrameDef = ad->startFrameDef;
107: }
108: else
109: {
110: ad->currentFrameDef++;
111: }
112: ad->tics = FrameDefs[ad->currentFrameDef].tics;
113: if(ad->tics > 255)
114: { // Random tics
115: ad->tics = (ad->tics>>16)
116: +P_Random()%((ad->tics&0xff00)>>8);
117: }
118: if(ad->type == ANIM_FLAT)
119: {
120: flattranslation[ad->index] =
121: FrameDefs[ad->currentFrameDef].index;
122: }
123: else
124: { // Texture
125: texturetranslation[ad->index] =
126: FrameDefs[ad->currentFrameDef].index;
127: }
128: }
129: }
130:
131: // Update scrolling textures
132: for(i = 0; i < numlinespecials; i++)
133: {
134: line = linespeciallist[i];
135: switch(line->special)
136: {
137: case 100: // Scroll_Texture_Left
138: sides[line->sidenum[0]].textureoffset += line->arg1<<10;
139: break;
140: case 101: // Scroll_Texture_Right
141: sides[line->sidenum[0]].textureoffset -= line->arg1<<10;
142: break;
143: case 102: // Scroll_Texture_Up
144: sides[line->sidenum[0]].rowoffset += line->arg1<<10;
145: break;
146: case 103: // Scroll_Texture_Down
147: sides[line->sidenum[0]].rowoffset -= line->arg1<<10;
148: break;
149: }
150: }
151:
152: // Update sky column offsets
153: Sky1ColumnOffset += Sky1ScrollDelta;
154: Sky2ColumnOffset += Sky2ScrollDelta;
155:
156: if(LevelHasLightning)
157: {
158: if(!NextLightningFlash || LightningFlash)
159: {
160: P_LightningFlash();
161: }
162: else
163: {
164: NextLightningFlash--;
165: }
166: }
167: }
168:
169: //==========================================================================
170: //
171: // P_LightningFlash
172: //
173: //==========================================================================
174:
175: static void P_LightningFlash(void)
176: {
177: int i;
178: sector_t *tempSec;
179: int *tempLight;
180: boolean foundSec;
181: int flashLight;
182:
183: if(LightningFlash)
184: {
185: LightningFlash--;
186: if(LightningFlash)
187: {
188: tempLight = LightningLightLevels;
189: tempSec = sectors;
190: for(i = 0; i < numsectors; i++, tempSec++)
191: {
192: if(tempSec->ceilingpic == skyflatnum
193: || tempSec->special == LIGHTNING_SPECIAL
194: || tempSec->special == LIGHTNING_SPECIAL2)
195: {
196: if(*tempLight < tempSec->lightlevel-4)
197: {
198: tempSec->lightlevel -= 4;
199: }
200: tempLight++;
201: }
202: }
203: }
204: else
205: { // remove the alternate lightning flash special
206: tempLight = LightningLightLevels;
207: tempSec = sectors;
208: for(i = 0; i < numsectors; i++, tempSec++)
209: {
210: if(tempSec->ceilingpic == skyflatnum
211: || tempSec->special == LIGHTNING_SPECIAL
212: || tempSec->special == LIGHTNING_SPECIAL2)
213: {
214: tempSec->lightlevel = *tempLight;
215: tempLight++;
216: }
217: }
218: Sky1Texture = P_GetMapSky1Texture(gamemap);
219: }
220: return;
221: }
222: LightningFlash = (P_Random()&7)+8;
223: flashLight = 200+(P_Random()&31);
224: tempSec = sectors;
225: tempLight = LightningLightLevels;
226: foundSec = false;
227: for(i = 0; i < numsectors; i++, tempSec++)
228: {
229: if(tempSec->ceilingpic == skyflatnum
230: || tempSec->special == LIGHTNING_SPECIAL
231: || tempSec->special == LIGHTNING_SPECIAL2)
232: {
233: *tempLight = tempSec->lightlevel;
234: if(tempSec->special == LIGHTNING_SPECIAL)
235: {
236: tempSec->lightlevel += 64;
237: if(tempSec->lightlevel > flashLight)
238: {
239: tempSec->lightlevel = flashLight;
240: }
241: }
242: else if(tempSec->special == LIGHTNING_SPECIAL2)
243: {
244: tempSec->lightlevel += 32;
245: if(tempSec->lightlevel > flashLight)
246: {
247: tempSec->lightlevel = flashLight;
248: }
249: }
250: else
251: {
252: tempSec->lightlevel = flashLight;
253: }
254: if(tempSec->lightlevel < *tempLight)
255: {
256: tempSec->lightlevel = *tempLight;
257: }
258: tempLight++;
259: foundSec = true;
260: }
261: }
262: if(foundSec)
263: {
264: Sky1Texture = P_GetMapSky2Texture(gamemap); // set alternate sky
265: S_StartSound(NULL, SFX_THUNDER_CRASH);
266: }
267: // Calculate the next lighting flash
268: if(!NextLightningFlash)
269: {
270: if(P_Random() < 50)
271: { // Immediate Quick flash
272: NextLightningFlash = (P_Random()&15)+16;
273: }
274: else
275: {
276: if(P_Random() < 128 && !(leveltime&32))
277: {
278: NextLightningFlash = ((P_Random()&7)+2)*35;
279: }
280: else
281: {
282: NextLightningFlash = ((P_Random()&15)+5)*35;
283: }
284: }
285: }
286: }
287:
288: //==========================================================================
289: //
290: // P_ForceLightning
291: //
292: //==========================================================================
293:
294: void P_ForceLightning(void)
295: {
296: NextLightningFlash = 0;
297: }
298:
299: //==========================================================================
300: //
301: // P_InitLightning
302: //
303: //==========================================================================
304:
305: void P_InitLightning(void)
306: {
307: int i;
308: int secCount;
309:
310: if(!P_GetMapLightning(gamemap))
311: {
312: LevelHasLightning = false;
313: LightningFlash = 0;
314: return;
315: }
316: LightningFlash = 0;
317: secCount = 0;
318: for(i = 0; i < numsectors; i++)
319: {
320: if(sectors[i].ceilingpic == skyflatnum
321: || sectors[i].special == LIGHTNING_SPECIAL
322: || sectors[i].special == LIGHTNING_SPECIAL2)
323: {
324: secCount++;
325: }
326: }
327: if(secCount)
328: {
329: LevelHasLightning = true;
330: }
331: else
332: {
333: LevelHasLightning = false;
334: return;
335: }
336: LightningLightLevels = (int *)Z_Malloc(secCount*sizeof(int), PU_LEVEL,
337: NULL);
338: NextLightningFlash = ((P_Random()&15)+5)*35; // don't flash at level start
339: }
340:
341: //==========================================================================
342: //
343: // P_InitFTAnims
344: //
345: // Initialize flat and texture animation lists.
346: //
347: //==========================================================================
348:
349: void P_InitFTAnims(void)
350: {
351: int base;
352: int mod;
353: int fd;
354: animDef_t *ad;
355: boolean ignore;
356: boolean done;
357:
358: fd = 0;
359: ad = AnimDefs;
360: AnimDefCount = 0;
361: SC_Open(ANIM_SCRIPT_NAME);
362: while(SC_GetString())
363: {
364: if(AnimDefCount == MAX_ANIM_DEFS)
365: {
366: I_Error("P_InitFTAnims: too many AnimDefs.");
367: }
368: if(SC_Compare(SCI_FLAT))
369: {
370: ad->type = ANIM_FLAT;
371: }
372: else if(SC_Compare(SCI_TEXTURE))
373: {
374: ad->type = ANIM_TEXTURE;
375: }
376: else
377: {
378: SC_ScriptError(NULL);
379: }
380: SC_MustGetString(); // Name
381: ignore = false;
382: if(ad->type == ANIM_FLAT)
383: {
384: if(W_CheckNumForName(sc_String) == -1)
385: {
386: ignore = true;
387: }
388: else
389: {
390: ad->index = R_FlatNumForName(sc_String);
391: }
392: }
393: else
394: { // Texture
395: if(R_CheckTextureNumForName(sc_String) == -1)
396: {
397: ignore = true;
398: }
399: else
400: {
401: ad->index = R_TextureNumForName(sc_String);
402: }
403: }
404: ad->startFrameDef = fd;
405: done = false;
406: while(done == false)
407: {
408: if(SC_GetString())
409: {
410: if(SC_Compare(SCI_PIC))
411: {
412: if(fd == MAX_FRAME_DEFS)
413: {
414: I_Error("P_InitFTAnims: too many FrameDefs.");
415: }
416: SC_MustGetNumber();
417: if(ignore == false)
418: {
419: FrameDefs[fd].index = ad->index+sc_Number-1;
420: }
421: SC_MustGetString();
422: if(SC_Compare(SCI_TICS))
423: {
424: SC_MustGetNumber();
425: if(ignore == false)
426: {
427: FrameDefs[fd].tics = sc_Number;
428: fd++;
429: }
430: }
431: else if(SC_Compare(SCI_RAND))
432: {
433: SC_MustGetNumber();
434: base = sc_Number;
435: SC_MustGetNumber();
436: if(ignore == false)
437: {
438: mod = sc_Number-base+1;
439: FrameDefs[fd].tics = (base<<16)+(mod<<8);
440: fd++;
441: }
442: }
443: else
444: {
445: SC_ScriptError(NULL);
446: }
447: }
448: else
449: {
450: SC_UnGet();
451: done = true;
452: }
453: }
454: else
455: {
456: done = true;
457: }
458: }
459: if((ignore == false) && (fd-ad->startFrameDef < 2))
460: {
461: I_Error("P_InitFTAnims: AnimDef has framecount < 2.");
462: }
463: if(ignore == false)
464: {
465: ad->endFrameDef = fd-1;
466: ad->currentFrameDef = ad->endFrameDef;
467: ad->tics = 1; // Force 1st game tic to animate
468: AnimDefCount++;
469: ad++;
470: }
471: }
472: SC_Close();
473: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.