mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2025-10-30 08:01:28 +00:00
Split up EV_DoElevator
This commit is contained in:
parent
e8dff8f12a
commit
f8874f3460
3 changed files with 198 additions and 77 deletions
266
src/p_floor.c
266
src/p_floor.c
|
|
@ -1889,92 +1889,210 @@ void EV_DoCrushFloorOnce(mtag_t tag, fixed_t speed)
|
||||||
// jff 2/22/98 new type to move floor and ceiling in parallel
|
// jff 2/22/98 new type to move floor and ceiling in parallel
|
||||||
//
|
//
|
||||||
void EV_DoElevator(mtag_t tag, line_t *line, elevator_e elevtype)
|
void EV_DoElevator(mtag_t tag, line_t *line, elevator_e elevtype)
|
||||||
|
{
|
||||||
|
// This function is deprecated.
|
||||||
|
// Use any of the following functions directly, instead.
|
||||||
|
|
||||||
|
switch (elevtype)
|
||||||
|
{
|
||||||
|
case elevateDown:
|
||||||
|
EV_DoElevateDown(tag);
|
||||||
|
break;
|
||||||
|
case elevateUp:
|
||||||
|
EV_DoElevateUp(tag);
|
||||||
|
break;
|
||||||
|
case elevateHighest:
|
||||||
|
EV_DoElevateHighest(tag);
|
||||||
|
break;
|
||||||
|
case elevateContinuous:
|
||||||
|
EV_DoContinuousElevator(
|
||||||
|
tag,
|
||||||
|
line->args[1] << (FRACBITS - 2),
|
||||||
|
line->args[2],
|
||||||
|
line->args[3],
|
||||||
|
(line->args[4] == 0)
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
case bridgeFall:
|
||||||
|
EV_DoBridgeFall(tag);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static elevator_t *CreateElevatorThinker(sector_t *sec)
|
||||||
|
{
|
||||||
|
elevator_t *elevator = NULL;
|
||||||
|
|
||||||
|
if (sec->floordata || sec->ceilingdata)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
elevator = Z_Calloc(sizeof (*elevator), PU_LEVSPEC, NULL);
|
||||||
|
P_AddThinker(THINK_MAIN, &elevator->thinker);
|
||||||
|
|
||||||
|
// make sure other thinkers won't get started over this one
|
||||||
|
sec->floordata = elevator;
|
||||||
|
sec->ceilingdata = elevator;
|
||||||
|
|
||||||
|
// set up some generic aspects of the floormove_t
|
||||||
|
elevator->thinker.function.acp1 = (actionf_p1)T_MoveElevator;
|
||||||
|
elevator->distance = 1; // Always crush unless otherwise
|
||||||
|
elevator->sector = sec;
|
||||||
|
|
||||||
|
// interpolation
|
||||||
|
R_CreateInterpolator_SectorPlane(&elevator->thinker, sec, false);
|
||||||
|
R_CreateInterpolator_SectorPlane(&elevator->thinker, sec, true);
|
||||||
|
|
||||||
|
return elevator;
|
||||||
|
}
|
||||||
|
|
||||||
|
void EV_DoElevateDown(mtag_t tag)
|
||||||
{
|
{
|
||||||
INT32 secnum = -1;
|
INT32 secnum = -1;
|
||||||
sector_t *sec;
|
sector_t *sec;
|
||||||
elevator_t *elevator;
|
|
||||||
|
|
||||||
// act on all sectors with the given tag
|
|
||||||
TAG_ITER_SECTORS(tag, secnum)
|
TAG_ITER_SECTORS(tag, secnum)
|
||||||
{
|
{
|
||||||
|
elevator_t *elevator = NULL;
|
||||||
sec = §ors[secnum];
|
sec = §ors[secnum];
|
||||||
|
|
||||||
// If either floor or ceiling is already activated, skip it
|
elevator = CreateElevatorThinker(sec);
|
||||||
if (sec->floordata || sec->ceilingdata)
|
if (elevator == NULL)
|
||||||
continue;
|
|
||||||
|
|
||||||
// create and initialize new elevator thinker
|
|
||||||
elevator = Z_Calloc(sizeof (*elevator), PU_LEVSPEC, NULL);
|
|
||||||
P_AddThinker(THINK_MAIN, &elevator->thinker);
|
|
||||||
sec->floordata = elevator;
|
|
||||||
sec->ceilingdata = elevator;
|
|
||||||
elevator->thinker.function.acp1 = (actionf_p1)T_MoveElevator;
|
|
||||||
elevator->type = elevtype;
|
|
||||||
elevator->sourceline = line;
|
|
||||||
elevator->distance = 1; // Always crush unless otherwise
|
|
||||||
elevator->sector = sec;
|
|
||||||
|
|
||||||
// set up the fields according to the type of elevator action
|
|
||||||
switch (elevtype)
|
|
||||||
{
|
{
|
||||||
// elevator down to next floor
|
continue;
|
||||||
case elevateDown:
|
|
||||||
elevator->direction = -1;
|
|
||||||
elevator->speed = ELEVATORSPEED/2; // half speed
|
|
||||||
elevator->floordestheight = P_FindNextLowestFloor(sec, sec->floorheight);
|
|
||||||
break;
|
|
||||||
|
|
||||||
// elevator up to next floor
|
|
||||||
case elevateUp:
|
|
||||||
elevator->direction = 1;
|
|
||||||
elevator->speed = ELEVATORSPEED/4; // quarter speed
|
|
||||||
elevator->floordestheight = P_FindNextHighestFloor(sec, sec->floorheight);
|
|
||||||
break;
|
|
||||||
|
|
||||||
// elevator up to highest floor
|
|
||||||
case elevateHighest:
|
|
||||||
elevator->direction = 1;
|
|
||||||
elevator->speed = ELEVATORSPEED/4; // quarter speed
|
|
||||||
elevator->floordestheight = P_FindHighestFloorSurrounding(sec);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case elevateContinuous:
|
|
||||||
elevator->origspeed = line->args[1] << (FRACBITS - 2);
|
|
||||||
elevator->speed = elevator->origspeed;
|
|
||||||
|
|
||||||
elevator->low = !line->args[4]; // go down first unless args[4] is set
|
|
||||||
if (elevator->low)
|
|
||||||
{
|
|
||||||
elevator->direction = 1;
|
|
||||||
elevator->floordestheight = P_FindNextHighestFloor(sec, sec->floorheight);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
elevator->direction = -1;
|
|
||||||
elevator->floordestheight = P_FindNextLowestFloor(sec,sec->floorheight);
|
|
||||||
}
|
|
||||||
elevator->floorwasheight = elevator->sector->floorheight;
|
|
||||||
elevator->ceilingwasheight = elevator->sector->ceilingheight;
|
|
||||||
|
|
||||||
elevator->delay = line->args[3];
|
|
||||||
elevator->delaytimer = line->args[2]; // Initial delay
|
|
||||||
break;
|
|
||||||
|
|
||||||
case bridgeFall:
|
|
||||||
elevator->direction = -1;
|
|
||||||
elevator->speed = ELEVATORSPEED*4; // quadruple speed
|
|
||||||
elevator->floordestheight = P_FindNextLowestFloor(sec, sec->floorheight);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
elevator->ceilingdestheight = elevator->floordestheight + sec->ceilingheight - sec->floorheight;
|
elevator->type = elevateDown;
|
||||||
|
|
||||||
// interpolation
|
elevator->direction = -1;
|
||||||
R_CreateInterpolator_SectorPlane(&elevator->thinker, sec, false);
|
elevator->speed = ELEVATORSPEED/2; // half speed
|
||||||
R_CreateInterpolator_SectorPlane(&elevator->thinker, sec, true);
|
elevator->floordestheight = P_FindNextLowestFloor(sec, sec->floorheight);
|
||||||
|
|
||||||
|
elevator->ceilingdestheight = elevator->floordestheight + (sec->ceilingheight - sec->floorheight);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void EV_DoElevateUp(mtag_t tag)
|
||||||
|
{
|
||||||
|
INT32 secnum = -1;
|
||||||
|
sector_t *sec;
|
||||||
|
|
||||||
|
TAG_ITER_SECTORS(tag, secnum)
|
||||||
|
{
|
||||||
|
elevator_t *elevator = NULL;
|
||||||
|
sec = §ors[secnum];
|
||||||
|
|
||||||
|
elevator = CreateElevatorThinker(sec);
|
||||||
|
if (elevator == NULL)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
elevator->type = elevateDown;
|
||||||
|
|
||||||
|
elevator->direction = 1;
|
||||||
|
elevator->speed = ELEVATORSPEED/4; // quarter speed
|
||||||
|
elevator->floordestheight = P_FindNextHighestFloor(sec, sec->floorheight);
|
||||||
|
|
||||||
|
elevator->ceilingdestheight = elevator->floordestheight + (sec->ceilingheight - sec->floorheight);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void EV_DoElevateHighest(mtag_t tag)
|
||||||
|
{
|
||||||
|
INT32 secnum = -1;
|
||||||
|
sector_t *sec;
|
||||||
|
|
||||||
|
TAG_ITER_SECTORS(tag, secnum)
|
||||||
|
{
|
||||||
|
elevator_t *elevator = NULL;
|
||||||
|
sec = §ors[secnum];
|
||||||
|
|
||||||
|
elevator = CreateElevatorThinker(sec);
|
||||||
|
if (elevator == NULL)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
elevator->type = elevateHighest;
|
||||||
|
|
||||||
|
elevator->direction = 1;
|
||||||
|
elevator->speed = ELEVATORSPEED/4; // quarter speed
|
||||||
|
elevator->floordestheight = P_FindHighestFloorSurrounding(sec);
|
||||||
|
|
||||||
|
elevator->ceilingdestheight = elevator->floordestheight + (sec->ceilingheight - sec->floorheight);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void EV_DoContinuousElevator(mtag_t tag, fixed_t speed, INT32 delayInit, INT32 delay, boolean lowFirst)
|
||||||
|
{
|
||||||
|
INT32 secnum = -1;
|
||||||
|
sector_t *sec;
|
||||||
|
|
||||||
|
TAG_ITER_SECTORS(tag, secnum)
|
||||||
|
{
|
||||||
|
elevator_t *elevator = NULL;
|
||||||
|
sec = §ors[secnum];
|
||||||
|
|
||||||
|
elevator = CreateElevatorThinker(sec);
|
||||||
|
if (elevator == NULL)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
elevator->type = elevateContinuous;
|
||||||
|
|
||||||
|
elevator->origspeed = speed;
|
||||||
|
elevator->speed = elevator->origspeed;
|
||||||
|
|
||||||
|
elevator->low = lowFirst; // go down first unless args[4] is set
|
||||||
|
if (elevator->low)
|
||||||
|
{
|
||||||
|
elevator->direction = 1;
|
||||||
|
elevator->floordestheight = P_FindNextHighestFloor(sec, sec->floorheight);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
elevator->direction = -1;
|
||||||
|
elevator->floordestheight = P_FindNextLowestFloor(sec,sec->floorheight);
|
||||||
|
}
|
||||||
|
|
||||||
|
elevator->floorwasheight = elevator->sector->floorheight;
|
||||||
|
elevator->ceilingwasheight = elevator->sector->ceilingheight;
|
||||||
|
|
||||||
|
elevator->delay = delay;
|
||||||
|
elevator->delaytimer = delayInit; // Initial delay
|
||||||
|
|
||||||
|
elevator->ceilingdestheight = elevator->floordestheight + (sec->ceilingheight - sec->floorheight);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void EV_DoBridgeFall(mtag_t tag)
|
||||||
|
{
|
||||||
|
INT32 secnum = -1;
|
||||||
|
sector_t *sec;
|
||||||
|
|
||||||
|
TAG_ITER_SECTORS(tag, secnum)
|
||||||
|
{
|
||||||
|
elevator_t *elevator = NULL;
|
||||||
|
sec = §ors[secnum];
|
||||||
|
|
||||||
|
elevator = CreateElevatorThinker(sec);
|
||||||
|
if (elevator == NULL)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
elevator->type = bridgeFall;
|
||||||
|
|
||||||
|
elevator->direction = -1;
|
||||||
|
elevator->speed = ELEVATORSPEED*4; // quadruple speed
|
||||||
|
elevator->floordestheight = P_FindNextLowestFloor(sec, sec->floorheight);
|
||||||
|
|
||||||
|
elevator->ceilingdestheight = elevator->floordestheight + (sec->ceilingheight - sec->floorheight);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2523,7 +2523,6 @@ static void SaveElevatorThinker(savebuffer_t *save, const thinker_t *th, const U
|
||||||
WRITEFIXED(save->p, ht->delaytimer);
|
WRITEFIXED(save->p, ht->delaytimer);
|
||||||
WRITEFIXED(save->p, ht->floorwasheight);
|
WRITEFIXED(save->p, ht->floorwasheight);
|
||||||
WRITEFIXED(save->p, ht->ceilingwasheight);
|
WRITEFIXED(save->p, ht->ceilingwasheight);
|
||||||
WRITEUINT32(save->p, SaveLine(ht->sourceline));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void SaveCrumbleThinker(savebuffer_t *save, const thinker_t *th, const UINT8 type)
|
static void SaveCrumbleThinker(savebuffer_t *save, const thinker_t *th, const UINT8 type)
|
||||||
|
|
@ -3753,7 +3752,6 @@ static thinker_t* LoadElevatorThinker(savebuffer_t *save, actionf_p1 thinker, bo
|
||||||
ht->delaytimer = READFIXED(save->p);
|
ht->delaytimer = READFIXED(save->p);
|
||||||
ht->floorwasheight = READFIXED(save->p);
|
ht->floorwasheight = READFIXED(save->p);
|
||||||
ht->ceilingwasheight = READFIXED(save->p);
|
ht->ceilingwasheight = READFIXED(save->p);
|
||||||
ht->sourceline = LoadLine(READUINT32(save->p));
|
|
||||||
|
|
||||||
if (ht->sector && setplanedata)
|
if (ht->sector && setplanedata)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -839,7 +839,6 @@ struct elevator_t
|
||||||
fixed_t delaytimer;
|
fixed_t delaytimer;
|
||||||
fixed_t floorwasheight; // Height the floor WAS at
|
fixed_t floorwasheight; // Height the floor WAS at
|
||||||
fixed_t ceilingwasheight; // Height the ceiling WAS at
|
fixed_t ceilingwasheight; // Height the ceiling WAS at
|
||||||
line_t *sourceline;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
|
|
@ -987,6 +986,12 @@ void EV_DoBounceFloor(mtag_t tag, boolean crush, fixed_t crushHeight, fixed_t cr
|
||||||
void EV_DoCrushFloorOnce(mtag_t tag, fixed_t speed);
|
void EV_DoCrushFloorOnce(mtag_t tag, fixed_t speed);
|
||||||
|
|
||||||
void EV_DoElevator(mtag_t tag, line_t *line, elevator_e elevtype);
|
void EV_DoElevator(mtag_t tag, line_t *line, elevator_e elevtype);
|
||||||
|
void EV_DoElevateDown(mtag_t tag);
|
||||||
|
void EV_DoElevateUp(mtag_t tag);
|
||||||
|
void EV_DoElevateHighest(mtag_t tag);
|
||||||
|
void EV_DoContinuousElevator(mtag_t tag, fixed_t speed, INT32 delayInit, INT32 delay, boolean lowFirst);
|
||||||
|
void EV_DoBridgeFall(mtag_t tag);
|
||||||
|
|
||||||
void EV_CrumbleChain(sector_t *sec, ffloor_t *rover);
|
void EV_CrumbleChain(sector_t *sec, ffloor_t *rover);
|
||||||
void EV_BounceSector(sector_t *sector, fixed_t momz, line_t *sourceline);
|
void EV_BounceSector(sector_t *sector, fixed_t momz, line_t *sourceline);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue