Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

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