]> icculus.org git repositories - theoddone33/hhexen.git/blob - include/p_spec.h
b86e4231de8527e6f8dbac8b433fa96a70fab39a
[theoddone33/hhexen.git] / include / p_spec.h
1
2 //**************************************************************************
3 //**
4 //** p_spec.h : Heretic 2 : Raven Software, Corp.
5 //**
6 //** $RCSfile$
7 //** $Revision$
8 //** $Date$
9 //** $Author$
10 //**
11 //**************************************************************************
12
13 extern int *TerrainTypes;
14
15 //
16 //      scrolling line specials
17 //
18
19 #define MAXLINEANIMS 64
20 extern short numlinespecials;
21 extern line_t *linespeciallist[MAXLINEANIMS];
22
23 //      Define values for map objects
24 #define MO_TELEPORTMAN 14
25
26 // at game start
27 void P_InitTerrainTypes(void);
28 void P_InitLava(void);
29
30 // at map load
31 void P_SpawnSpecials(void);
32
33 // every tic
34 void P_UpdateSpecials(void);
35
36 // when needed
37 boolean P_ExecuteLineSpecial(int special, byte *args, line_t *line, int side,
38         mobj_t *mo);
39 boolean P_ActivateLine(line_t *ld, mobj_t *mo, int side, int activationType);
40 //boolean P_UseSpecialLine ( mobj_t *thing, line_t *line);
41 //void    P_ShootSpecialLine ( mobj_t *thing, line_t *line);
42 //void    P_CrossSpecialLine (int linenum, int side, mobj_t *thing);
43
44 void P_PlayerInSpecialSector(player_t *player);
45 void P_PlayerOnSpecialFlat(player_t *player, int floorType);
46
47 //int twoSided(int sector,int line);
48 //sector_t *getSector(int currentSector,int line,int side);
49 //side_t  *getSide(int currentSector,int line, int side);
50 fixed_t P_FindLowestFloorSurrounding(sector_t *sec);
51 fixed_t P_FindHighestFloorSurrounding(sector_t *sec);
52 fixed_t P_FindNextHighestFloor(sector_t *sec,int currentheight);
53 fixed_t P_FindLowestCeilingSurrounding(sector_t *sec);
54 fixed_t P_FindHighestCeilingSurrounding(sector_t *sec);
55 //int P_FindSectorFromLineTag(line_t  *line,int start);
56 int P_FindSectorFromTag(int tag, int start);
57 //int P_FindMinSurroundingLight(sector_t *sector,int max);
58 sector_t *getNextSector(line_t *line,sector_t *sec);
59 line_t *P_FindLine(int lineTag, int *searchPosition);
60
61 //
62 //      SPECIAL
63 //
64 //int EV_DoDonut(line_t *line);
65
66 //-------------------------------
67 // P_anim.c
68 //-------------------------------
69
70 void P_AnimateSurfaces(void);
71 void P_InitFTAnims(void);
72 void P_InitLightning(void);
73 void P_ForceLightning(void);
74
75 /*
76 ===============================================================================
77
78                                                         P_LIGHTS
79
80 ===============================================================================
81 */
82
83 typedef enum
84 {
85         LITE_RAISEBYVALUE,
86         LITE_LOWERBYVALUE,
87         LITE_CHANGETOVALUE,
88         LITE_FADE,
89         LITE_GLOW,
90         LITE_FLICKER,
91         LITE_STROBE
92 } lighttype_t;
93
94 typedef struct
95 {
96         thinker_t       thinker;
97         sector_t        *sector;
98         lighttype_t     type;
99         int             value1;
100         int                     value2;
101         int                     tics1;
102         int                     tics2;
103         int             count;
104 } light_t;
105         
106 typedef struct
107 {
108         thinker_t       thinker;
109         sector_t        *sector;
110         int index;
111         int base;
112 } phase_t;
113
114 #define LIGHT_SEQUENCE_START    2
115 #define LIGHT_SEQUENCE          3
116 #define LIGHT_SEQUENCE_ALT      4
117
118 void T_Phase(phase_t *phase);
119 void T_Light(light_t *light);
120 void P_SpawnPhasedLight(sector_t *sector, int base, int index);
121 void P_SpawnLightSequence(sector_t *sector, int indexStep);
122 boolean EV_SpawnLight(line_t *line, byte *arg, lighttype_t type);
123
124 #if 0
125 typedef struct
126 {
127         thinker_t thinker;
128         sector_t *sector;
129         int count;
130         int maxlight;
131         int minlight;
132         int maxtime;
133         int mintime;
134 } lightflash_t;
135
136 typedef struct
137 {
138         thinker_t thinker;
139         sector_t *sector;
140         int count;
141         int minlight;
142         int maxlight;
143         int darktime;
144         int brighttime;
145 } strobe_t;
146
147 typedef struct
148 {
149         thinker_t thinker;
150         sector_t *sector;
151         int minlight;
152         int maxlight;
153         int direction;
154 } glow_t;
155
156 typedef struct
157 {
158         thinker_t       thinker;
159         sector_t        *sector;
160         int index;
161         int base;
162 } phase_t;
163
164 #define GLOWSPEED 8
165 #define STROBEBRIGHT 5
166 #define FASTDARK 15
167 #define SLOWDARK 35
168
169 #define LIGHT_SEQUENCE_START    2
170 #define LIGHT_SEQUENCE                  3
171 #define LIGHT_SEQUENCE_ALT      4
172
173 void T_LightFlash (lightflash_t *flash);
174 void P_SpawnLightFlash (sector_t *sector);
175 void T_StrobeFlash (strobe_t *flash);
176 void P_SpawnStrobeFlash (sector_t *sector, int fastOrSlow, int inSync);
177 void EV_StartLightStrobing(line_t *line);
178 void EV_TurnTagLightsOff(line_t      *line);
179 void EV_LightTurnOn(line_t *line, int bright);
180 void T_Glow(glow_t *g);
181 void P_SpawnGlowingLight(sector_t *sector);
182 void T_Phase(phase_t *phase);
183 void P_SpawnPhasedLight(sector_t *sector, int base, int index);
184 void P_SpawnLightSequence(sector_t *sector, int indexStep);
185 #endif
186
187 /*
188 ===============================================================================
189
190                                                         P_SWITCH
191
192 ===============================================================================
193 */
194 typedef struct
195 {
196         char name1[9];
197         char name2[9];
198         int soundID;
199 } switchlist_t;
200
201 typedef enum
202 {
203         SWTCH_TOP,
204         SWTCH_MIDDLE,
205         SWTCH_BOTTOM
206 } bwhere_e;
207
208 typedef struct
209 {
210         line_t *line;
211         bwhere_e where;
212         int btexture;
213         int btimer;
214         mobj_t *soundorg;
215 } button_t;
216
217 #define MAXSWITCHES 50              // max # of wall switches in a level
218 #define MAXBUTTONS 16              // 4 players, 4 buttons each at once, max.
219 #define BUTTONTIME 35              // 1 second
220
221 extern button_t buttonlist[MAXBUTTONS];
222
223 void P_ChangeSwitchTexture(line_t *line, int useAgain);
224 void P_InitSwitchList(void);
225
226 /*
227 ===============================================================================
228
229                                                         P_PLATS
230
231 ===============================================================================
232 */
233
234 typedef enum
235 {
236         PLAT_UP,
237         PLAT_DOWN,
238         PLAT_WAITING,
239 //      PLAT_IN_STASIS
240 } plat_e;
241
242 typedef enum
243 {
244         PLAT_PERPETUALRAISE,
245         PLAT_DOWNWAITUPSTAY,
246         PLAT_DOWNBYVALUEWAITUPSTAY,
247         PLAT_UPWAITDOWNSTAY,
248         PLAT_UPBYVALUEWAITDOWNSTAY,
249         //PLAT_RAISEANDCHANGE,
250         //PLAT_RAISETONEARESTANDCHANGE
251 } plattype_e;
252
253 typedef struct
254 {
255         thinker_t thinker;
256         sector_t *sector;
257         fixed_t speed;
258         fixed_t low;
259         fixed_t high;
260         int wait;
261         int count;
262         plat_e status;
263         plat_e oldstatus;
264         int crush;
265         int tag;
266         plattype_e type;
267 } plat_t;
268
269 #define PLATWAIT 3
270 #define PLATSPEED FRACUNIT
271 #define MAXPLATS 30
272
273 extern plat_t *activeplats[MAXPLATS];
274
275 void T_PlatRaise(plat_t *plat);
276 int EV_DoPlat(line_t *line, byte *args, plattype_e type, int amount);
277 void P_AddActivePlat(plat_t *plat);
278 void P_RemoveActivePlat(plat_t *plat);
279 void EV_StopPlat(line_t *line, byte *args);
280
281 /*
282 ===============================================================================
283
284                                                         P_DOORS
285
286 ===============================================================================
287 */
288 typedef enum
289 {
290         DREV_NORMAL,
291         DREV_CLOSE30THENOPEN,
292         DREV_CLOSE,
293         DREV_OPEN,
294         DREV_RAISEIN5MINS,
295 } vldoor_e;
296
297 typedef struct
298 {
299         thinker_t thinker;
300         sector_t *sector;
301         vldoor_e type;
302         fixed_t topheight;
303         fixed_t speed;
304         int direction; // 1 = up, 0 = waiting at top, -1 = down
305         int topwait; // tics to wait at the top (keep in case a door going down is reset)
306         int topcountdown;   // when it reaches 0, start going down
307 } vldoor_t;
308
309 #define VDOORSPEED FRACUNIT*2
310 #define VDOORWAIT 150
311
312 boolean EV_VerticalDoor(line_t *line, mobj_t *thing);
313 int EV_DoDoor(line_t *line, byte *args, vldoor_e type);
314 void T_VerticalDoor(vldoor_t *door);
315 //void P_SpawnDoorCloseIn30(sector_t *sec);
316 //void P_SpawnDoorRaiseIn5Mins(sector_t *sec, int secnum);
317
318 /*
319 ===============================================================================
320
321                                                         P_CEILNG
322
323 ===============================================================================
324 */
325 typedef enum
326 {
327         CLEV_LOWERTOFLOOR,
328         CLEV_RAISETOHIGHEST,
329         CLEV_LOWERANDCRUSH,
330         CLEV_CRUSHANDRAISE,
331         CLEV_LOWERBYVALUE,
332         CLEV_RAISEBYVALUE,
333         CLEV_CRUSHRAISEANDSTAY,
334         CLEV_MOVETOVALUETIMES8
335 } ceiling_e;
336
337 typedef struct
338 {
339         thinker_t thinker;
340         sector_t *sector;
341         ceiling_e type;
342         fixed_t bottomheight, topheight;
343         fixed_t speed;
344         int crush;
345         int direction; // 1 = up, 0 = waiting, -1 = down
346         int tag; // ID
347         int olddirection;
348 } ceiling_t;
349
350 #define CEILSPEED FRACUNIT
351 #define CEILWAIT 150
352 #define MAXCEILINGS 30
353
354 extern ceiling_t *activeceilings[MAXCEILINGS];
355
356 int EV_DoCeiling(line_t *line, byte *args, ceiling_e type);
357 void T_MoveCeiling(ceiling_t *ceiling);
358 void P_AddActiveCeiling(ceiling_t *c);
359 void P_RemoveActiveCeiling(ceiling_t *c);
360 int EV_CeilingCrushStop(line_t *line, byte *args);
361
362 /*
363 ===============================================================================
364
365                                                         P_FLOOR
366
367 ===============================================================================
368 */
369 typedef enum
370 {
371         FLEV_LOWERFLOOR,             // lower floor to highest surrounding floor
372         FLEV_LOWERFLOORTOLOWEST,     // lower floor to lowest surrounding floor
373         FLEV_LOWERFLOORBYVALUE,
374         FLEV_RAISEFLOOR,             // raise floor to lowest surrounding CEILING
375         FLEV_RAISEFLOORTONEAREST,  // raise floor to next highest surrounding floor
376         FLEV_RAISEFLOORBYVALUE,
377         FLEV_RAISEFLOORCRUSH,
378         FLEV_RAISEBUILDSTEP,        // One step of a staircase
379         FLEV_RAISEBYVALUETIMES8,
380         FLEV_LOWERBYVALUETIMES8,
381         FLEV_LOWERTIMES8INSTANT,
382         FLEV_RAISETIMES8INSTANT,
383         FLEV_MOVETOVALUETIMES8
384 } floor_e;
385
386 typedef struct
387 {
388         thinker_t thinker;
389         sector_t *sector;
390         floor_e type;
391         int crush;
392         int direction;
393         int newspecial;
394         short texture;
395         fixed_t floordestheight;
396         fixed_t speed;
397         int     delayCount;
398         int delayTotal;
399         fixed_t stairsDelayHeight;
400         fixed_t stairsDelayHeightDelta;
401         fixed_t resetHeight;
402         short resetDelay;
403         short resetDelayCount;
404         byte textureChange;
405 } floormove_t;
406
407 typedef struct
408 {
409         thinker_t thinker;
410         sector_t *sector;
411         int ceilingSpeed;
412         int floorSpeed;
413         int floordest;
414         int ceilingdest;
415         int direction;
416         int crush;
417 } pillar_t;
418
419 typedef struct
420 {
421         thinker_t thinker;
422         sector_t *sector;
423         fixed_t originalHeight;
424         fixed_t accumulator;
425         fixed_t accDelta;
426         fixed_t targetScale;
427         fixed_t scale;
428         fixed_t scaleDelta;
429         int ticker;
430         int state;
431 } floorWaggle_t;
432
433 #define FLOORSPEED FRACUNIT
434
435 typedef enum
436 {
437         RES_OK,
438         RES_CRUSHED,
439         RES_PASTDEST
440 } result_e;
441
442 typedef enum
443 {
444         STAIRS_NORMAL,
445         STAIRS_SYNC,
446         STAIRS_PHASED
447 } stairs_e;
448
449 result_e T_MovePlane(sector_t *sector, fixed_t speed,
450                         fixed_t dest, int crush, int floorOrCeiling, int direction);
451
452 int EV_BuildStairs(line_t *line, byte *args, int direction, stairs_e type);
453 int EV_DoFloor(line_t *line, byte *args, floor_e floortype);
454 void T_MoveFloor(floormove_t *floor);
455 void T_BuildPillar(pillar_t *pillar);
456 void T_FloorWaggle(floorWaggle_t *waggle);
457 int EV_BuildPillar(line_t *line, byte *args, boolean crush);
458 int EV_OpenPillar(line_t *line, byte *args);
459 int EV_DoFloorAndCeiling(line_t *line, byte *args, boolean raise);
460 int EV_FloorCrushStop(line_t *line, byte *args);
461 boolean EV_StartFloorWaggle(int tag, int height, int speed, int offset,
462         int timer);
463
464 //--------------------------------------------------------------------------
465 //
466 // p_telept
467 //
468 //--------------------------------------------------------------------------
469
470 boolean P_Teleport(mobj_t *thing, fixed_t x, fixed_t y, angle_t angle,
471         boolean useFog);
472 boolean EV_Teleport(int tid, mobj_t *thing, boolean fog);
473
474 //--------------------------------------------------------------------------
475 //
476 // p_acs
477 //
478 //--------------------------------------------------------------------------
479
480 #define MAX_ACS_SCRIPT_VARS 10
481 #define MAX_ACS_MAP_VARS 32
482 #define MAX_ACS_WORLD_VARS 64
483 #define ACS_STACK_DEPTH 32
484 #define MAX_ACS_STORE 20
485
486 typedef enum
487 {
488         ASTE_INACTIVE,
489         ASTE_RUNNING,
490         ASTE_SUSPENDED,
491         ASTE_WAITINGFORTAG,
492         ASTE_WAITINGFORPOLY,
493         ASTE_WAITINGFORSCRIPT,
494         ASTE_TERMINATING
495 } aste_t;
496
497 typedef struct acs_s acs_t;
498 typedef struct acsInfo_s acsInfo_t;
499
500 struct acsInfo_s
501 {
502         int number;
503         int *address;
504         int argCount;
505         aste_t state;
506         int waitValue;
507 };
508
509 struct acs_s
510 {
511         thinker_t thinker;
512         mobj_t *activator;
513         line_t *line;
514         int side;
515         int number;
516         int infoIndex;
517         int delayCount;
518         int stack[ACS_STACK_DEPTH];
519         int     stackPtr;
520         int vars[MAX_ACS_SCRIPT_VARS];
521         int *ip;
522 };
523
524 typedef struct
525 {
526         int map;                // Target map
527         int script;             // Script number on target map
528         byte args[4];   // Padded to 4 for alignment
529 } acsstore_t;
530
531 void P_LoadACScripts(int lump);
532 boolean P_StartACS(int number, int map, byte *args, mobj_t *activator,
533         line_t *line, int side);
534 boolean P_StartLockedACS(line_t *line, byte *args, mobj_t *mo, int side); 
535 boolean P_TerminateACS(int number, int map);
536 boolean P_SuspendACS(int number, int map);
537 void T_InterpretACS(acs_t *script);
538 void P_TagFinished(int tag);
539 void P_PolyobjFinished(int po);
540 void P_ACSInitNewGame(void);
541 void P_CheckACSStore(void);
542
543 extern int ACScriptCount;
544 extern byte *ActionCodeBase;
545 extern acsInfo_t *ACSInfo;
546 extern int MapVars[MAX_ACS_MAP_VARS];
547 extern int WorldVars[MAX_ACS_WORLD_VARS];
548 extern acsstore_t ACSStore[MAX_ACS_STORE+1]; // +1 for termination marker
549
550 //--------------------------------------------------------------------------
551 //
552 // p_things
553 //
554 //--------------------------------------------------------------------------
555
556 extern mobjtype_t TranslateThingType[];
557
558 boolean EV_ThingProjectile(byte *args, boolean gravity);
559 boolean EV_ThingSpawn(byte *args, boolean fog);
560 boolean EV_ThingActivate(int tid);
561 boolean EV_ThingDeactivate(int tid);
562 boolean EV_ThingRemove(int tid);
563 boolean EV_ThingDestroy(int tid);