mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2025-02-02 06:23:03 +00:00
Refactor T_MoveCeiling
This commit is contained in:
parent
d5490132b9
commit
de462f1213
1 changed files with 92 additions and 220 deletions
312
src/p_ceilng.c
312
src/p_ceilng.c
|
@ -34,7 +34,6 @@ INT32 ceilmovesound = sfx_None;
|
||||||
void T_MoveCeiling(ceiling_t *ceiling)
|
void T_MoveCeiling(ceiling_t *ceiling)
|
||||||
{
|
{
|
||||||
result_e res;
|
result_e res;
|
||||||
boolean dontupdate = false;
|
|
||||||
|
|
||||||
if (ceiling->delaytimer)
|
if (ceiling->delaytimer)
|
||||||
{
|
{
|
||||||
|
@ -42,227 +41,100 @@ void T_MoveCeiling(ceiling_t *ceiling)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (ceiling->direction)
|
res = T_MovePlane(ceiling->sector, ceiling->speed, (ceiling->direction == 1) ? ceiling->topheight : ceiling->bottomheight, false, true, ceiling->direction);
|
||||||
|
|
||||||
|
if (ceiling->type == bounceCeiling)
|
||||||
{
|
{
|
||||||
case 0: // IN STASIS
|
const fixed_t origspeed = FixedDiv(ceiling->origspeed, (ELEVATORSPEED/2));
|
||||||
break;
|
const fixed_t fs = abs(ceiling->sector->ceilingheight - lines[ceiling->texture].frontsector->ceilingheight);
|
||||||
case 1: // UP
|
const fixed_t bs = abs(ceiling->sector->ceilingheight - lines[ceiling->texture].backsector->ceilingheight);
|
||||||
res = T_MovePlane(ceiling->sector, ceiling->speed, ceiling->topheight, false, true, ceiling->direction);
|
if (fs < bs)
|
||||||
|
ceiling->speed = FixedDiv(fs, 25*FRACUNIT) + FRACUNIT/4;
|
||||||
if (ceiling->type == bounceCeiling)
|
else
|
||||||
{
|
ceiling->speed = FixedDiv(bs, 25*FRACUNIT) + FRACUNIT/4;
|
||||||
const fixed_t origspeed = FixedDiv(ceiling->origspeed,(ELEVATORSPEED/2));
|
ceiling->speed = FixedMul(ceiling->speed, origspeed);
|
||||||
const fixed_t fs = abs(ceiling->sector->ceilingheight - lines[ceiling->texture].frontsector->ceilingheight);
|
|
||||||
const fixed_t bs = abs(ceiling->sector->ceilingheight - lines[ceiling->texture].backsector->ceilingheight);
|
|
||||||
if (fs < bs)
|
|
||||||
ceiling->speed = FixedDiv(fs,25*FRACUNIT) + FRACUNIT/4;
|
|
||||||
else
|
|
||||||
ceiling->speed = FixedDiv(bs,25*FRACUNIT) + FRACUNIT/4;
|
|
||||||
|
|
||||||
ceiling->speed = FixedMul(ceiling->speed,origspeed);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (res == pastdest)
|
|
||||||
{
|
|
||||||
switch (ceiling->type)
|
|
||||||
{
|
|
||||||
case instantMoveCeilingByFrontSector:
|
|
||||||
if (ceiling->texture > -1) // flat changing
|
|
||||||
ceiling->sector->ceilingpic = ceiling->texture;
|
|
||||||
ceiling->sector->ceilingdata = NULL;
|
|
||||||
ceiling->sector->ceilspeed = 0;
|
|
||||||
P_RemoveThinker(&ceiling->thinker);
|
|
||||||
dontupdate = true;
|
|
||||||
break;
|
|
||||||
case moveCeilingByFrontSector:
|
|
||||||
if (ceiling->texture < -1) // chained linedef executing
|
|
||||||
P_LinedefExecute((INT16)(ceiling->texture + INT16_MAX + 2), NULL, NULL);
|
|
||||||
if (ceiling->texture > -1) // flat changing
|
|
||||||
ceiling->sector->ceilingpic = ceiling->texture;
|
|
||||||
/* FALLTHRU */
|
|
||||||
case raiseToHighest:
|
|
||||||
case moveCeilingByDistance:
|
|
||||||
ceiling->sector->ceilingdata = NULL;
|
|
||||||
ceiling->sector->ceilspeed = 0;
|
|
||||||
P_RemoveThinker(&ceiling->thinker);
|
|
||||||
dontupdate = true;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case bounceCeiling:
|
|
||||||
{
|
|
||||||
fixed_t dest = ceiling->topheight;
|
|
||||||
|
|
||||||
if (dest == lines[ceiling->texture].frontsector->ceilingheight)
|
|
||||||
dest = lines[ceiling->texture].backsector->ceilingheight;
|
|
||||||
else
|
|
||||||
dest = lines[ceiling->texture].frontsector->ceilingheight;
|
|
||||||
|
|
||||||
if (dest < ceiling->sector->ceilingheight) // must move down
|
|
||||||
{
|
|
||||||
ceiling->direction = -1;
|
|
||||||
ceiling->bottomheight = dest;
|
|
||||||
}
|
|
||||||
else // must move up
|
|
||||||
{
|
|
||||||
ceiling->direction = 1;
|
|
||||||
ceiling->topheight = dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
ceiling->delaytimer = ceiling->delay;
|
|
||||||
|
|
||||||
// That's it. Do not set dontupdate, do not remove the thinker.
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case bounceCeilingCrush:
|
|
||||||
{
|
|
||||||
fixed_t dest = ceiling->topheight;
|
|
||||||
|
|
||||||
if (dest == lines[ceiling->texture].frontsector->ceilingheight)
|
|
||||||
{
|
|
||||||
dest = lines[ceiling->texture].backsector->ceilingheight;
|
|
||||||
ceiling->speed = ceiling->origspeed = FixedDiv(abs(lines[ceiling->texture].dy),4*FRACUNIT); // return trip, use dy
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
dest = lines[ceiling->texture].frontsector->ceilingheight;
|
|
||||||
ceiling->speed = ceiling->origspeed = FixedDiv(abs(lines[ceiling->texture].dx),4*FRACUNIT); // going frontways, use dx
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dest < ceiling->sector->ceilingheight) // must move down
|
|
||||||
{
|
|
||||||
ceiling->direction = -1;
|
|
||||||
ceiling->bottomheight = dest;
|
|
||||||
}
|
|
||||||
else // must move up
|
|
||||||
{
|
|
||||||
ceiling->direction = 1;
|
|
||||||
ceiling->topheight = dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
ceiling->delaytimer = ceiling->delay;
|
|
||||||
|
|
||||||
// That's it. Do not set dontupdate, do not remove the thinker.
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case -1: // DOWN
|
|
||||||
res = T_MovePlane(ceiling->sector, ceiling->speed, ceiling->bottomheight, ceiling->crush, true, ceiling->direction);
|
|
||||||
|
|
||||||
if (ceiling->type == bounceCeiling)
|
|
||||||
{
|
|
||||||
const fixed_t origspeed = FixedDiv(ceiling->origspeed,(ELEVATORSPEED/2));
|
|
||||||
const fixed_t fs = abs(ceiling->sector->ceilingheight - lines[ceiling->texture].frontsector->ceilingheight);
|
|
||||||
const fixed_t bs = abs(ceiling->sector->ceilingheight - lines[ceiling->texture].backsector->ceilingheight);
|
|
||||||
if (fs < bs)
|
|
||||||
ceiling->speed = FixedDiv(fs,25*FRACUNIT) + FRACUNIT/4;
|
|
||||||
else
|
|
||||||
ceiling->speed = FixedDiv(bs,25*FRACUNIT) + FRACUNIT/4;
|
|
||||||
ceiling->speed = FixedMul(ceiling->speed,origspeed);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (res == pastdest)
|
|
||||||
{
|
|
||||||
switch (ceiling->type)
|
|
||||||
{
|
|
||||||
case instantMoveCeilingByFrontSector:
|
|
||||||
if (ceiling->texture > -1) // flat changing
|
|
||||||
ceiling->sector->ceilingpic = ceiling->texture;
|
|
||||||
ceiling->sector->ceilingdata = NULL;
|
|
||||||
ceiling->sector->ceilspeed = 0;
|
|
||||||
P_RemoveThinker(&ceiling->thinker);
|
|
||||||
dontupdate = true;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case moveCeilingByFrontSector:
|
|
||||||
if (ceiling->texture < -1) // chained linedef executing
|
|
||||||
P_LinedefExecute((INT16)(ceiling->texture + INT16_MAX + 2), NULL, NULL);
|
|
||||||
if (ceiling->texture > -1) // flat changing
|
|
||||||
ceiling->sector->ceilingpic = ceiling->texture;
|
|
||||||
// don't break
|
|
||||||
/* FALLTHRU */
|
|
||||||
|
|
||||||
// in all other cases, just remove the active ceiling
|
|
||||||
case moveCeilingByDistance:
|
|
||||||
ceiling->sector->ceilingdata = NULL;
|
|
||||||
ceiling->sector->ceilspeed = 0;
|
|
||||||
P_RemoveThinker(&ceiling->thinker);
|
|
||||||
dontupdate = true;
|
|
||||||
break;
|
|
||||||
case bounceCeiling:
|
|
||||||
{
|
|
||||||
fixed_t dest = ceiling->bottomheight;
|
|
||||||
|
|
||||||
if (dest == lines[ceiling->texture].frontsector->ceilingheight)
|
|
||||||
dest = lines[ceiling->texture].backsector->ceilingheight;
|
|
||||||
else
|
|
||||||
dest = lines[ceiling->texture].frontsector->ceilingheight;
|
|
||||||
|
|
||||||
if (dest < ceiling->sector->ceilingheight) // must move down
|
|
||||||
{
|
|
||||||
ceiling->direction = -1;
|
|
||||||
ceiling->bottomheight = dest;
|
|
||||||
}
|
|
||||||
else // must move up
|
|
||||||
{
|
|
||||||
ceiling->direction = 1;
|
|
||||||
ceiling->topheight = dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
ceiling->delaytimer = ceiling->delay;
|
|
||||||
|
|
||||||
// That's it. Do not set dontupdate, do not remove the thinker.
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case bounceCeilingCrush:
|
|
||||||
{
|
|
||||||
fixed_t dest = ceiling->bottomheight;
|
|
||||||
|
|
||||||
if (dest == lines[ceiling->texture].frontsector->ceilingheight)
|
|
||||||
{
|
|
||||||
dest = lines[ceiling->texture].backsector->ceilingheight;
|
|
||||||
ceiling->speed = ceiling->origspeed = FixedDiv(abs(lines[ceiling->texture].dy),4*FRACUNIT); // return trip, use dy
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
dest = lines[ceiling->texture].frontsector->ceilingheight;
|
|
||||||
ceiling->speed = ceiling->origspeed = FixedDiv(abs(lines[ceiling->texture].dx),4*FRACUNIT); // going frontways, use dx
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dest < ceiling->sector->ceilingheight) // must move down
|
|
||||||
{
|
|
||||||
ceiling->direction = -1;
|
|
||||||
ceiling->bottomheight = dest;
|
|
||||||
}
|
|
||||||
else // must move up
|
|
||||||
{
|
|
||||||
ceiling->direction = 1;
|
|
||||||
ceiling->topheight = dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
ceiling->delaytimer = ceiling->delay;
|
|
||||||
|
|
||||||
// That's it. Do not set dontupdate, do not remove the thinker.
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
if (!dontupdate)
|
|
||||||
ceiling->sector->ceilspeed = ceiling->speed*ceiling->direction;
|
if (res == pastdest)
|
||||||
else
|
{
|
||||||
ceiling->sector->ceilspeed = 0;
|
switch (ceiling->type)
|
||||||
|
{
|
||||||
|
case instantMoveCeilingByFrontSector:
|
||||||
|
if (ceiling->texture > -1) // flat changing
|
||||||
|
ceiling->sector->ceilingpic = ceiling->texture;
|
||||||
|
ceiling->sector->ceilingdata = NULL;
|
||||||
|
ceiling->sector->ceilspeed = 0;
|
||||||
|
P_RemoveThinker(&ceiling->thinker);
|
||||||
|
return;
|
||||||
|
case moveCeilingByFrontSector:
|
||||||
|
if (ceiling->texture < -1) // chained linedef executing
|
||||||
|
P_LinedefExecute((INT16)(ceiling->texture + INT16_MAX + 2), NULL, NULL);
|
||||||
|
if (ceiling->texture > -1) // flat changing
|
||||||
|
ceiling->sector->ceilingpic = ceiling->texture;
|
||||||
|
/* FALLTHRU */
|
||||||
|
case raiseToHighest:
|
||||||
|
case moveCeilingByDistance:
|
||||||
|
ceiling->sector->ceilingdata = NULL;
|
||||||
|
ceiling->sector->ceilspeed = 0;
|
||||||
|
P_RemoveThinker(&ceiling->thinker);
|
||||||
|
return;
|
||||||
|
case bounceCeiling:
|
||||||
|
{
|
||||||
|
fixed_t dest = (ceiling->direction == 1) ? ceiling->topheight : ceiling->bottomheight;
|
||||||
|
|
||||||
|
if (dest == lines[ceiling->texture].frontsector->ceilingheight)
|
||||||
|
dest = lines[ceiling->texture].backsector->ceilingheight;
|
||||||
|
else
|
||||||
|
dest = lines[ceiling->texture].frontsector->ceilingheight;
|
||||||
|
|
||||||
|
if (dest < ceiling->sector->ceilingheight) // must move down
|
||||||
|
{
|
||||||
|
ceiling->direction = -1;
|
||||||
|
ceiling->bottomheight = dest;
|
||||||
|
}
|
||||||
|
else // must move up
|
||||||
|
{
|
||||||
|
ceiling->direction = 1;
|
||||||
|
ceiling->topheight = dest;
|
||||||
|
}
|
||||||
|
|
||||||
|
ceiling->delaytimer = ceiling->delay;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case bounceCeilingCrush:
|
||||||
|
{
|
||||||
|
fixed_t dest = (ceiling->direction == 1) ? ceiling->topheight : ceiling->bottomheight;
|
||||||
|
|
||||||
|
if (dest == lines[ceiling->texture].frontsector->ceilingheight)
|
||||||
|
{
|
||||||
|
dest = lines[ceiling->texture].backsector->ceilingheight;
|
||||||
|
ceiling->speed = ceiling->origspeed = FixedDiv(abs(lines[ceiling->texture].dy), 4*FRACUNIT); // return trip, use dy
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dest = lines[ceiling->texture].frontsector->ceilingheight;
|
||||||
|
ceiling->speed = ceiling->origspeed = FixedDiv(abs(lines[ceiling->texture].dx), 4*FRACUNIT); // going frontways, use dx
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dest < ceiling->sector->ceilingheight) // must move down
|
||||||
|
{
|
||||||
|
ceiling->direction = -1;
|
||||||
|
ceiling->bottomheight = dest;
|
||||||
|
}
|
||||||
|
else // must move up
|
||||||
|
{
|
||||||
|
ceiling->direction = 1;
|
||||||
|
ceiling->topheight = dest;
|
||||||
|
}
|
||||||
|
|
||||||
|
ceiling->delaytimer = ceiling->delay;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ceiling->sector->ceilspeed = ceiling->speed*ceiling->direction;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Moves a ceiling crusher.
|
/** Moves a ceiling crusher.
|
||||||
|
|
Loading…
Reference in a new issue