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

Iskhodnyy_kod_Doom

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

break;

}

}

else if (res == crushed)

{

switch(door->type)

{

case

blazeClose:

 

case

close:

// DO NOT GO BACK UP!

break;

 

default: door->direction = 1;

S_StartSound((mobj_t *)&door->sector->soundorg, sfx_doropn);

break;

}

}

break;

case 1: // UP

res = T_MovePlane(door->sector, door->speed, door->topheight, false,1,door->direction);

if (res == pastdest)

{

switch(door->type)

{

case blazeRaise: case normal:

door->direction = 0; // wait at top door->topcountdown = door->topwait; break;

case close30ThenOpen: case blazeOpen:

case open: door->sector->specialdata = NULL;

P_RemoveThinker (&door->thinker); // unlink and free break;

default:

break;

}

}

break;

}

}

//

//EV_DoLockedDoor

//Move a locked door up/down

int

 

EV_DoLockedDoor

 

( line_t*

line,

vldoor_e

type,

mobj_t*

thing )

{

 

player_t*

p;

371

p = thing->player;

if (!p)

return 0;

switch(line->special)

{

 

 

case

99:

// Blue Lock

case

133:

 

if

( !p )

 

 

return 0;

 

if

(!p->cards[it_bluecard] && !p->cards[it_blueskull])

{

 

 

 

p->message = PD_BLUEO;

 

S_StartSound(NULL,sfx_oof);

 

return 0;

 

}

 

 

break;

 

case

134: // Red Lock

case

135:

 

if

( !p )

 

 

return 0;

 

if

(!p->cards[it_redcard] && !p->cards[it_redskull])

{

 

 

 

p->message = PD_REDO;

 

S_StartSound(NULL,sfx_oof);

 

return 0;

 

}

 

 

break;

 

case

136:

// Yellow Lock

case

137:

 

if

( !p )

 

 

return 0;

 

if

(!p->cards[it_yellowcard] &&

 

!p->cards[it_yellowskull])

{

 

 

p->message = PD_YELLOWO; S_StartSound(NULL,sfx_oof); return 0;

}

break;

}

return EV_DoDoor(line,type);

}

int

 

EV_DoDoor

 

( line_t*

line,

vldoor_e

type )

{

 

int

secnum,rtn;

sector_t*

sec;

vldoor_t*

door;

secnum = -1; rtn = 0;

while ((secnum = P_FindSectorFromLineTag(line,secnum)) >= 0)

{

sec = &sectors[secnum];

372

if (sec->specialdata) continue;

// new door thinker rtn = 1;

door = Z_Malloc (sizeof(*door), PU_LEVSPEC, 0); P_AddThinker (&door->thinker); sec->specialdata = door;

door->thinker.function.acp1 = (actionf_p1) T_VerticalDoor; door->sector = sec;

door->type = type; door->topwait = VDOORWAIT; door->speed = VDOORSPEED;

switch(type)

{

case blazeClose:

door->topheight = P_FindLowestCeilingSurrounding(sec); door->topheight -= 4*FRACUNIT;

door->direction = -1; door->speed = VDOORSPEED * 4;

S_StartSound((mobj_t *)&door->sector->soundorg, sfx_bdcls);

break;

case close:

door->topheight = P_FindLowestCeilingSurrounding(sec); door->topheight -= 4*FRACUNIT;

door->direction = -1;

S_StartSound((mobj_t *)&door->sector->soundorg, sfx_dorcls);

break;

case close30ThenOpen:

door->topheight = sec->ceilingheight; door->direction = -1;

S_StartSound((mobj_t *)&door->sector->soundorg, sfx_dorcls);

break;

case blazeRaise: case blazeOpen:

door->direction = 1;

door->topheight = P_FindLowestCeilingSurrounding(sec); door->topheight -= 4*FRACUNIT;

door->speed = VDOORSPEED * 4;

if (door->topheight != sec->ceilingheight) S_StartSound((mobj_t *)&door->sector->soundorg,

sfx_bdopn);

break;

case normal: case open:

door->direction = 1;

door->topheight = P_FindLowestCeilingSurrounding(sec); door->topheight -= 4*FRACUNIT;

if (door->topheight != sec->ceilingheight) S_StartSound((mobj_t *)&door->sector->soundorg,

sfx_doropn);

break;

default:

break;

373

}

}

return rtn;

}

//

// EV_VerticalDoor : open a door manually, no tag value

//

 

void

 

EV_VerticalDoor

 

( line_t*

line,

mobj_t*

thing )

{

 

player_t*

player;

int

secnum;

sector_t*

sec;

vldoor_t*

door;

int

side;

side = 0;

// only front sides can be used

// Check for locks player = thing->player;

switch(line->special)

{

case

26: // Blue Lock

case

32:

if

( !player )

 

return;

if

(!player->cards[it_bluecard] && !player->cards[it_blueskull])

{

 

 

player->message = PD_BLUEK;

 

S_StartSound(NULL,sfx_oof);

 

return;

}

break;

case 27: // Yellow Lock case 34:

if ( !player ) return;

if (!player->cards[it_yellowcard] && !player->cards[it_yellowskull])

{

player->message = PD_YELLOWK; S_StartSound(NULL,sfx_oof); return;

}

break;

case 28: // Red Lock case 33:

if ( !player ) return;

if (!player->cards[it_redcard] && !player->cards[it_redskull])

{

player->message = PD_REDK; S_StartSound(NULL,sfx_oof); return;

374

}

break;

}

// if the sector has an active thinker, use it sec = sides[ line->sidenum[side^1]] .sector; secnum = sec-sectors;

if (sec->specialdata)

{

door = sec->specialdata; switch(line->special)

{

case

1: // ONLY FOR "RAISE" DOORS, NOT "OPEN"s

case

26:

case

27:

case

28:

case

117:

if (door->direction == -1)

 

door->direction = 1;

// go back up

else

 

{

 

if (!thing->player)

 

return;

// JDC: bad guys never close doors

door->direction = -1;

// start going down immediately

}

 

return;

 

}

}

// for proper sound switch(line->special)

{

case 117: // BLAZING DOOR RAISE case 118: // BLAZING DOOR OPEN

S_StartSound((mobj_t *)&sec->soundorg,sfx_bdopn); break;

case 1: // NORMAL DOOR SOUND case 31:

S_StartSound((mobj_t *)&sec->soundorg,sfx_doropn); break;

default: // LOCKED DOOR SOUND

S_StartSound((mobj_t *)&sec->soundorg,sfx_doropn); break;

}

// new door thinker

door = Z_Malloc (sizeof(*door), PU_LEVSPEC, 0); P_AddThinker (&door->thinker);

sec->specialdata = door;

door->thinker.function.acp1 = (actionf_p1) T_VerticalDoor; door->sector = sec;

door->direction = 1; door->speed = VDOORSPEED; door->topwait = VDOORWAIT;

switch(line->special)

{

case 1:

case 26:

case 27:

375

case 28:

door->type = normal; break;

case 31: case 32: case 33: case 34:

door->type = open; line->special = 0; break;

case 117: // blazing door raise door->type = blazeRaise; door->speed = VDOORSPEED*4;

break;

case 118: // blazing door open door->type = blazeOpen; line->special = 0;

door->speed = VDOORSPEED*4; break;

}

// find the top and bottom of the movement range door->topheight = P_FindLowestCeilingSurrounding(sec); door->topheight -= 4*FRACUNIT;

}

//

// Spawn a door that closes after 30 seconds

//

void P_SpawnDoorCloseIn30 (sector_t* sec)

{

vldoor_t* door;

door = Z_Malloc ( sizeof(*door), PU_LEVSPEC, 0);

P_AddThinker (&door->thinker);

sec->specialdata = door; sec->special = 0;

door->thinker.function.acp1 = (actionf_p1)T_VerticalDoor; door->sector = sec;

door->direction = 0; door->type = normal; door->speed = VDOORSPEED; door->topcountdown = 30 * 35;

}

//

// Spawn a door that opens after 5 minutes

//

void P_SpawnDoorRaiseIn5Mins

( sector_t*

sec,

int

secnum )

{

 

vldoor_t*

door;

door = Z_Malloc ( sizeof(*door), PU_LEVSPEC, 0);

P_AddThinker (&door->thinker);

376

sec->specialdata = door; sec->special = 0;

door->thinker.function.acp1 = (actionf_p1)T_VerticalDoor; door->sector = sec;

door->direction = 2; door->type = raiseIn5Mins; door->speed = VDOORSPEED;

door->topheight = P_FindLowestCeilingSurrounding(sec); door->topheight -= 4*FRACUNIT;

door->topwait = VDOORWAIT; door->topcountdown = 5 * 60 * 35;

}

//UNUSED

//Separate into p_slidoor.c?

#if 0

// ABANDONED TO THE MISTS OF TIME!!!

//

 

//EV_SlidingDoor : slide a door horizontally

//(animate midtexture, then set noblocking line)

slideframe_t slideFrames[MAXSLIDEDOORS];

void P_InitSlidingDoorFrames(void)

{

int

i;

int

f1;

int

f2;

int

f3;

int

f4;

// DOOM II ONLY...

if ( gamemode != commercial) return;

for (i = 0;i < MAXSLIDEDOORS; i++)

{

if (!slideFrameNames[i].frontFrame1[0]) break;

f1 = R_TextureNumForName(slideFrameNames[i].frontFrame1);

f2 = R_TextureNumForName(slideFrameNames[i].frontFrame2);

f3 = R_TextureNumForName(slideFrameNames[i].frontFrame3);

f4 = R_TextureNumForName(slideFrameNames[i].frontFrame4);

slideFrames[i].frontFrames[0] = f1; slideFrames[i].frontFrames[1] = f2; slideFrames[i].frontFrames[2] = f3; slideFrames[i].frontFrames[3] = f4;

f1 = R_TextureNumForName(slideFrameNames[i].backFrame1);

f2 = R_TextureNumForName(slideFrameNames[i].backFrame2);

f3 = R_TextureNumForName(slideFrameNames[i].backFrame3);

f4 = R_TextureNumForName(slideFrameNames[i].backFrame4);

slideFrames[i].backFrames[0] = f1; slideFrames[i].backFrames[1] = f2; slideFrames[i].backFrames[2] = f3; slideFrames[i].backFrames[3] = f4;

}

377

}

//

//Return index into "slideFrames" array

//for which door type to use

//

int P_FindSlidingDoorType(line_t* line)

{

int

i;

int

val;

for (i = 0;i < MAXSLIDEDOORS;i++)

{

val = sides[line->sidenum[0]].midtexture; if (val == slideFrames[i].frontFrames[0])

return i;

}

return -1;

}

 

void T_SlidingDoor (slidedoor_t*

door)

{

 

switch(door->status)

 

{

 

case sd_opening:

 

if (!door->timer--)

 

{

 

if (++door->frame == SNUMFRAMES)

{

// IF DOOR IS DONE OPENING...

sides[door->line->sidenum[0]].midtexture = 0; sides[door->line->sidenum[1]].midtexture = 0; door->line->flags &= ML_BLOCKING^0xff;

if (door->type == sdt_openOnly)

{

door->frontsector->specialdata = NULL; P_RemoveThinker (&door->thinker); break;

}

door->timer = SDOORWAIT; door->status = sd_waiting;

}

else

{

// IF DOOR NEEDS TO ANIMATE TO NEXT FRAME...

door->timer = SWAITTICS;

sides[door->line->sidenum[0]].midtexture = slideFrames[door->whichDoorIndex]. frontFrames[door->frame];

sides[door->line->sidenum[1]].midtexture = slideFrames[door->whichDoorIndex]. backFrames[door->frame];

}

}

break;

case sd_waiting:

// IF DOOR IS DONE WAITING...

if (!door->timer--)

{

378

// CAN DOOR CLOSE?

if (door->frontsector->thinglist != NULL || door->backsector->thinglist != NULL)

{

door->timer = SDOORWAIT; break;

}

//door->frame = SNUMFRAMES-1; door->status = sd_closing; door->timer = SWAITTICS;

}

break;

case sd_closing:

if (!door->timer--)

{

if (--door->frame < 0)

{

// IF DOOR IS DONE CLOSING...

door->line->flags |= ML_BLOCKING; door->frontsector->specialdata = NULL; P_RemoveThinker (&door->thinker); break;

}

else

{

// IF DOOR NEEDS TO ANIMATE TO NEXT FRAME...

door->timer = SWAITTICS;

sides[door->line->sidenum[0]].midtexture = slideFrames[door->whichDoorIndex]. frontFrames[door->frame];

sides[door->line->sidenum[1]].midtexture = slideFrames[door->whichDoorIndex]. backFrames[door->frame];

}

}

break;

}

}

 

void

 

EV_SlidingDoor

 

( line_t*

line,

mobj_t*

thing )

{

 

sector_t*

sec;

slidedoor_t*

door;

// DOOM II ONLY...

if (gamemode != commercial) return;

// Make sure door isn’t already being animated sec = line->frontsector;

door = NULL;

if (sec->specialdata)

{

if (!thing->player) return;

door = sec->specialdata;

379

if (door->type == sdt_openAndClose)

{

if (door->status == sd_waiting) door->status = sd_closing;

}

else

return;

}

// Init sliding door vars if (!door)

{

door = Z_Malloc (sizeof(*door), PU_LEVSPEC, 0); P_AddThinker (&door->thinker); sec->specialdata = door;

door->type = sdt_openAndClose; door->status = sd_opening;

door->whichDoorIndex = P_FindSlidingDoorType(line);

if (door->whichDoorIndex < 0)

I_Error("EV_SlidingDoor: Can’t use texture for sliding door!");

door->frontsector = sec; door->backsector = line->backsector; door->thinker.function = T_SlidingDoor; door->timer = SWAITTICS;

door->frame = 0; door->line = line;

}

}

#endif

9.5p enemy.c

// Emacs style mode select -*- C++ -*- //-----------------------------------------------------------------------------

//

//$Id:$

//Copyright (C) 1993-1996 by id Software, Inc.

//This program is free software; you can redistribute it and/or

//modify it under the terms of the GNU General Public License

//as published by the Free Software Foundation; either version 2

//of the License, or (at your option) any later version.

//

//This program is distributed in the hope that it will be useful,

//but WITHOUT ANY WARRANTY; without even the implied warranty of

//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the

//GNU General Public License for more details.

//

//$Log:$

//DESCRIPTION:

//Enemy thinking, AI.

//Action Pointer Functions

//that are associated with states/frames.

//-----------------------------------------------------------------------------

static const char

rcsid[] = "$Id: p_enemy.c,v 1.5 1997/02/03 22:45:11 b1 Exp $";

#include <stdlib.h>

380

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