Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Iskhodnyy_kod_Doom

.pdf
Скачиваний:
9
Добавлен:
13.02.2015
Размер:
1.01 Mб
Скачать

//

//P_FindNextHighestFloor

//FIND NEXT HIGHEST FLOOR IN SURROUNDING SECTORS

//Note: this should be doable w/o a fixed array.

//20 adjoining sectors max!

#define

MAX_ADJOINING_SECTORS

20

fixed_t

 

 

 

P_FindNextHighestFloor

 

( sector_t*

sec,

 

int

 

currentheight )

 

{

 

 

 

int

 

i;

 

int

 

h;

 

int

 

min;

 

line_t*

check;

 

sector_t*

other;

 

fixed_t

height = currentheight;

fixed_t

heightlist[MAX_ADJOINING_SECTORS];

for

(i=0, h=0 ;i < sec->linecount ; i++)

{

 

 

 

 

check = sec->lines[i];

 

 

other = getNextSector(check,sec);

 

if (!other) continue;

if (other->floorheight > height) heightlist[h++] = other->floorheight;

// Check for overflow. Exit.

if ( h >= MAX_ADJOINING_SECTORS )

{

fprintf( stderr,

"Sector with more than 20 adjoining sectors\n" );

break;

}

}

// Find lowest height in list if (!h)

return currentheight;

min = heightlist[0];

// Range checking? for (i = 1;i < h;i++)

if (heightlist[i] < min) min = heightlist[i];

return min;

}

//

// FIND LOWEST CEILING IN THE SURROUNDING SECTORS

//

fixed_t P_FindLowestCeilingSurrounding(sector_t* sec)

{

551

int

i;

line_t*

check;

sector_t*

other;

fixed_t

height = MAXINT;

for (i=0 ;i < sec->linecount ; i++)

{

check = sec->lines[i];

other = getNextSector(check,sec);

if (!other) continue;

if (other->ceilingheight < height) height = other->ceilingheight;

}

return height;

}

//

// FIND HIGHEST CEILING IN THE SURROUNDING SECTORS

//

fixed_t P_FindHighestCeilingSurrounding(sector_t* sec)

{

int

i;

line_t*

check;

sector_t*

other;

fixed_t

height = 0;

for (i=0 ;i < sec->linecount ; i++)

{

check = sec->lines[i];

other = getNextSector(check,sec);

if (!other) continue;

if (other->ceilingheight > height) height = other->ceilingheight;

}

return height;

}

//

// RETURN NEXT SECTOR # THAT LINE TAG REFERS TO

//

int P_FindSectorFromLineTag

( line_t*

line,

int

start )

{

 

int

i;

for (i=start+1;i<numsectors;i++)

if (sectors[i].tag == line->tag) return i;

return -1;

}

552

//

// Find minimum light from an adjacent sector

//

int P_FindMinSurroundingLight

( sector_t*

sector,

int

max )

{

 

int

i;

int

min;

line_t*

line;

sector_t*

check;

min = max;

for (i=0 ; i < sector->linecount ; i++)

{

line = sector->lines[i];

check = getNextSector(line,sector);

if (!check) continue;

if (check->lightlevel < min) min = check->lightlevel;

}

return min;

}

//

//EVENTS

//Events are operations triggered by using, crossing,

//or shooting special lines, or by timed thinkers.

//

//

//P_CrossSpecialLine - TRIGGER

//Called every time a thing origin is about

//to cross a line with a non 0 special.

//

void P_CrossSpecialLine

( int

linenum,

int

side,

mobj_t*

thing )

{

 

line_t*

line;

int

ok;

line = &lines[linenum];

// Triggers that other things can activate if (!thing->player)

{

// Things that should NOT trigger specials...

switch(thing->type)

{

case MT_ROCKET: case MT_PLASMA: case MT_BFG:

case MT_TROOPSHOT: case MT_HEADSHOT: case MT_BRUISERSHOT:

553

return;

break;

default: break;

}

ok = 0; switch(line->special)

{

case

39:

// TELEPORT TRIGGER

case

97:

// TELEPORT RETRIGGER

case

125:

// TELEPORT

MONSTERONLY TRIGGER

case

126:

// TELEPORT

MONSTERONLY RETRIGGER

case

4:

// RAISE

DOOR

 

case

10:

// PLAT

DOWN-WAIT-UP-STAY TRIGGER

case

88:

// PLAT

DOWN-WAIT-UP-STAY RETRIGGER

ok

= 1;

 

 

 

break;

}

if (!ok) return;

}

// Note: could use some const’s here. switch (line->special)

{

//TRIGGERS.

//All from here to RETRIGGERS. case 2:

//Open Door

EV_DoDoor(line,open); line->special = 0; break;

case 3:

// Close Door EV_DoDoor(line,close); line->special = 0; break;

case 4:

// Raise Door EV_DoDoor(line,normal); line->special = 0; break;

case 5:

// Raise Floor EV_DoFloor(line,raiseFloor); line->special = 0;

break;

case 6:

// Fast Ceiling Crush & Raise EV_DoCeiling(line,fastCrushAndRaise); line->special = 0;

break;

case 8:

// Build Stairs EV_BuildStairs(line,build8); line->special = 0;

break;

554

case 10:

// PlatDownWaitUp EV_DoPlat(line,downWaitUpStay,0); line->special = 0;

break;

case 12:

// Light Turn On - brightest near EV_LightTurnOn(line,0); line->special = 0;

break;

case 13:

// Light Turn On 255 EV_LightTurnOn(line,255); line->special = 0;

break;

case 16:

// Close Door 30 EV_DoDoor(line,close30ThenOpen); line->special = 0;

break;

case 17:

// Start Light Strobing EV_StartLightStrobing(line); line->special = 0;

break;

case 19:

// Lower Floor EV_DoFloor(line,lowerFloor); line->special = 0;

break;

case 22:

// Raise floor to nearest height and change texture EV_DoPlat(line,raiseToNearestAndChange,0); line->special = 0;

break;

case 25:

// Ceiling Crush and Raise EV_DoCeiling(line,crushAndRaise); line->special = 0;

break;

case 30:

//Raise floor to shortest texture height

//on either side of lines.

EV_DoFloor(line,raiseToTexture); line->special = 0;

break;

case 35:

// Lights Very Dark EV_LightTurnOn(line,35); line->special = 0; break;

case 36:

// Lower Floor (TURBO) EV_DoFloor(line,turboLower); line->special = 0;

555

break;

case 37:

// LowerAndChange EV_DoFloor(line,lowerAndChange); line->special = 0;

break;

case 38:

// Lower Floor To Lowest

EV_DoFloor( line, lowerFloorToLowest ); line->special = 0;

break;

case 39:

// TELEPORT!

EV_Teleport( line, side, thing ); line->special = 0;

break;

case 40:

// RaiseCeilingLowerFloor EV_DoCeiling( line, raiseToHighest );

EV_DoFloor( line, lowerFloorToLowest ); line->special = 0;

break;

case 44:

// Ceiling Crush

EV_DoCeiling( line, lowerAndCrush ); line->special = 0;

break;

case 52: // EXIT!

G_ExitLevel (); break;

case 53:

// Perpetual Platform Raise EV_DoPlat(line,perpetualRaise,0); line->special = 0;

break;

case 54:

// Platform Stop EV_StopPlat(line); line->special = 0; break;

case 56:

// Raise Floor Crush EV_DoFloor(line,raiseFloorCrush); line->special = 0;

break;

case 57:

// Ceiling Crush Stop EV_CeilingCrushStop(line); line->special = 0;

break;

case 58:

// Raise Floor 24 EV_DoFloor(line,raiseFloor24);

556

line->special = 0; break;

case 59:

// Raise Floor 24 And Change EV_DoFloor(line,raiseFloor24AndChange); line->special = 0;

break;

case 104:

// Turn lights off in sector(tag) EV_TurnTagLightsOff(line); line->special = 0;

break;

case 108:

// Blazing Door Raise (faster than TURBO!) EV_DoDoor (line,blazeRaise);

line->special = 0; break;

case 109:

// Blazing Door Open (faster than TURBO!) EV_DoDoor (line,blazeOpen);

line->special = 0; break;

case 100:

// Build Stairs Turbo 16 EV_BuildStairs(line,turbo16); line->special = 0;

break;

case 110:

// Blazing Door Close (faster than TURBO!) EV_DoDoor (line,blazeClose);

line->special = 0; break;

case 119:

// Raise floor to nearest surr. floor EV_DoFloor(line,raiseFloorToNearest); line->special = 0;

break;

case 121:

// Blazing PlatDownWaitUpStay EV_DoPlat(line,blazeDWUS,0); line->special = 0;

break;

case 124:

// Secret EXIT G_SecretExitLevel (); break;

case 125:

// TELEPORT MonsterONLY if (!thing->player)

{

EV_Teleport( line, side, thing ); line->special = 0;

}

break;

557

case 130:

// Raise Floor Turbo EV_DoFloor(line,raiseFloorTurbo); line->special = 0;

break;

case 141:

// Silent Ceiling Crush & Raise EV_DoCeiling(line,silentCrushAndRaise); line->special = 0;

break;

//RETRIGGERS. All from here till end. case 72:

//Ceiling Crush

EV_DoCeiling( line, lowerAndCrush ); break;

case 73:

// Ceiling Crush and Raise EV_DoCeiling(line,crushAndRaise); break;

case 74:

// Ceiling Crush Stop EV_CeilingCrushStop(line); break;

case 75:

// Close Door EV_DoDoor(line,close); break;

case 76:

// Close Door 30 EV_DoDoor(line,close30ThenOpen); break;

case 77:

// Fast Ceiling Crush & Raise EV_DoCeiling(line,fastCrushAndRaise); break;

case 79:

// Lights Very Dark EV_LightTurnOn(line,35); break;

case 80:

// Light Turn On - brightest near EV_LightTurnOn(line,0);

break;

case 81:

// Light Turn On 255 EV_LightTurnOn(line,255); break;

case 82:

// Lower Floor To Lowest

EV_DoFloor( line, lowerFloorToLowest ); break;

case 83:

// Lower Floor

558

EV_DoFloor(line,lowerFloor); break;

case 84:

// LowerAndChange EV_DoFloor(line,lowerAndChange); break;

case 86:

// Open Door EV_DoDoor(line,open); break;

case 87:

// Perpetual Platform Raise EV_DoPlat(line,perpetualRaise,0); break;

case 88:

// PlatDownWaitUp EV_DoPlat(line,downWaitUpStay,0); break;

case 89:

// Platform Stop EV_StopPlat(line); break;

case 90:

// Raise Door EV_DoDoor(line,normal); break;

case 91:

// Raise Floor EV_DoFloor(line,raiseFloor); break;

case 92:

// Raise Floor 24 EV_DoFloor(line,raiseFloor24); break;

case 93:

// Raise Floor 24 And Change EV_DoFloor(line,raiseFloor24AndChange); break;

case 94:

// Raise Floor Crush EV_DoFloor(line,raiseFloorCrush); break;

case 95:

//Raise floor to nearest height

//and change texture.

EV_DoPlat(line,raiseToNearestAndChange,0); break;

case 96:

//Raise floor to shortest texture height

//on either side of lines.

EV_DoFloor(line,raiseToTexture);

break;

559

case 97:

// TELEPORT!

EV_Teleport( line, side, thing ); break;

case 98:

// Lower Floor (TURBO) EV_DoFloor(line,turboLower); break;

case 105:

// Blazing Door Raise (faster than TURBO!) EV_DoDoor (line,blazeRaise);

break;

case 106:

// Blazing Door Open (faster than TURBO!) EV_DoDoor (line,blazeOpen);

break;

case 107:

// Blazing Door Close (faster than TURBO!) EV_DoDoor (line,blazeClose);

break;

case 120:

// Blazing PlatDownWaitUpStay. EV_DoPlat(line,blazeDWUS,0); break;

case 126:

// TELEPORT MonsterONLY. if (!thing->player)

EV_Teleport( line, side, thing ); break;

case 128:

// Raise To Nearest Floor EV_DoFloor(line,raiseFloorToNearest); break;

case 129:

// Raise Floor Turbo EV_DoFloor(line,raiseFloorTurbo); break;

}

}

//

//P_ShootSpecialLine - IMPACT SPECIALS

//Called when a thing shoots a special line.

void P_ShootSpecialLine

( mobj_t* thing,

line_t*

line )

{

 

int

ok;

// Impacts that other things can activate. if (!thing->player)

{

ok = 0;

560

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]