Refactor T_ContinuousFalling

This commit is contained in:
MascaraSnake 2020-04-18 01:42:13 +02:00
parent 70d262653e
commit 7e2f95c3f5
3 changed files with 63 additions and 73 deletions

View File

@ -561,43 +561,18 @@ void T_MoveElevator(elevator_t *elevator)
//
// Useful for things like intermittent falling lava.
//
void T_ContinuousFalling(levelspecthink_t *faller)
void T_ContinuousFalling(continuousfall_t *faller)
{
#define speed vars[0]
#define direction vars[1]
#define floorwasheight vars[2]
#define ceilingwasheight vars[3]
#define floordestheight vars[4]
#define ceilingdestheight vars[5]
if (faller->direction == -1)
{
faller->sector->ceilingheight -= faller->speed;
faller->sector->floorheight -= faller->speed;
}
else
{
faller->sector->ceilingheight += faller->speed;
faller->sector->floorheight += faller->speed;
}
faller->sector->ceilingheight += faller->speed*faller->direction;
faller->sector->floorheight += faller->speed*faller->direction;
P_CheckSector(faller->sector, false);
if (faller->direction == -1) // Down
if ((faller->direction == -1 && faller->sector->ceilingheight <= faller->destheight)
|| (faller->direction == 1 && faller->sector->floorheight >= faller->destheight))
{
if (faller->sector->ceilingheight <= faller->ceilingdestheight) // if destination height acheived
{
faller->sector->ceilingheight = faller->ceilingwasheight;
faller->sector->floorheight = faller->floorwasheight;
}
}
else // Up
{
if (faller->sector->floorheight >= faller->floordestheight) // if destination height acheived
{
faller->sector->ceilingheight = faller->ceilingwasheight;
faller->sector->floorheight = faller->floorwasheight;
}
faller->sector->ceilingheight = faller->ceilingstartheight;
faller->sector->floorheight = faller->floorstartheight;
}
P_CheckSector(faller->sector, false); // you might think this is irrelevant. you would be wrong
@ -605,12 +580,6 @@ void T_ContinuousFalling(levelspecthink_t *faller)
faller->sector->floorspeed = faller->speed*faller->direction;
faller->sector->ceilspeed = 42;
faller->sector->moved = true;
#undef speed
#undef direction
#undef floorwasheight
#undef ceilingwasheight
#undef floordestheight
#undef ceilingdestheight
}
//
@ -2398,18 +2367,12 @@ INT32 EV_BounceSector(sector_t *sec, fixed_t momz, line_t *sourceline)
}
// For T_ContinuousFalling special
INT32 EV_DoContinuousFall(sector_t *sec, sector_t *backsector, fixed_t spd, boolean backwards)
void EV_DoContinuousFall(sector_t *sec, sector_t *backsector, fixed_t spd, boolean backwards)
{
#define speed vars[0]
#define direction vars[1]
#define floorwasheight vars[2]
#define ceilingwasheight vars[3]
#define floordestheight vars[4]
#define ceilingdestheight vars[5]
levelspecthink_t *faller;
continuousfall_t *faller;
// workaround for when there is no back sector
if (backsector == NULL)
if (!backsector)
backsector = sec;
// create and initialize new thinker
@ -2421,29 +2384,11 @@ INT32 EV_DoContinuousFall(sector_t *sec, sector_t *backsector, fixed_t spd, bool
faller->sector = sec;
faller->speed = spd;
faller->floorwasheight = sec->floorheight;
faller->ceilingwasheight = sec->ceilingheight;
faller->floorstartheight = sec->floorheight;
faller->ceilingstartheight = sec->ceilingheight;
if (backwards)
{
faller->ceilingdestheight = backsector->ceilingheight;
faller->floordestheight = faller->ceilingdestheight;
faller->direction = 1; // Up!
}
else
{
faller->floordestheight = backsector->floorheight;
faller->ceilingdestheight = faller->floordestheight;
faller->direction = -1;
}
return 1;
#undef speed
#undef direction
#undef floorwasheight
#undef ceilingwasheight
#undef floordestheight
#undef ceilingdestheight
faller->destheight = backwards ? backsector->ceilingheight : backsector->floorheight;
faller->direction = backwards ? 1 : -1;
}
// Some other 3dfloor special things Tails 03-11-2002 (Search p_mobj.c for description)

View File

@ -1658,6 +1658,23 @@ static void SaveSpecialLevelThinker(const thinker_t *th, const UINT8 type)
WRITEUINT32(save_p, SaveSector(ht->sector));
}
//
// SaveContinuousFallThinker
//
// Saves a continuousfall_t thinker
//
static void SaveContinuousFallThinker(const thinker_t *th, const UINT8 type)
{
const continuousfall_t *ht = (const void *)th;
WRITEUINT8(save_p, type);
WRITEUINT32(save_p, SaveSector(ht->sector));
WRITEFIXED(save_p, ht->speed);
WRITEINT32(save_p, ht->direction);
WRITEFIXED(save_p, ht->floorstartheight);
WRITEFIXED(save_p, ht->ceilingstartheight);
WRITEFIXED(save_p, ht->destheight);
}
//
// SaveFloatThinker
//
@ -2266,7 +2283,7 @@ static void P_NetArchiveThinkers(void)
}
else if (th->function.acp1 == (actionf_p1)T_ContinuousFalling)
{
SaveSpecialLevelThinker(th, tc_continuousfalling);
SaveContinuousFallThinker(th, tc_continuousfalling);
continue;
}
else if (th->function.acp1 == (actionf_p1)T_ThwompSector)
@ -2814,6 +2831,23 @@ static thinker_t* LoadSpecialLevelThinker(actionf_p1 thinker, UINT8 floorOrCeili
return &ht->thinker;
}
// LoadContinuousFallThinker
//
// Loads a continuousfall_t from a save game
//
static thinker_t* LoadContinuousFallThinker(actionf_p1 thinker)
{
continuousfall_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL);
ht->thinker.function.acp1 = thinker;
ht->sector = LoadSector(READUINT32(save_p));
ht->speed = READFIXED(save_p);
ht->direction = READINT32(save_p);
ht->floorstartheight = READFIXED(save_p);
ht->ceilingstartheight = READFIXED(save_p);
ht->destheight = READFIXED(save_p);
return &ht->thinker;
}
// LoadFloatThinker
//
// Loads a floatthink_t from a save game
@ -3528,7 +3562,7 @@ static void P_NetUnArchiveThinkers(void)
break;
case tc_continuousfalling:
th = LoadSpecialLevelThinker((actionf_p1)T_ContinuousFalling, 3);
th = LoadContinuousFallThinker((actionf_p1)T_ContinuousFalling);
break;
case tc_thwomp:

View File

@ -320,6 +320,17 @@ typedef struct
sector_t *sector; // Sector the thinker is from
} levelspecthink_t;
typedef struct
{
thinker_t thinker;
sector_t *sector;
fixed_t speed;
INT32 direction;
fixed_t floorstartheight;
fixed_t ceilingstartheight;
fixed_t destheight;
} continuousfall_t;
typedef struct
{
thinker_t thinker;
@ -378,14 +389,14 @@ INT32 EV_BounceSector(sector_t *sector, fixed_t momz, line_t *sourceline);
INT32 EV_StartCrumble(sector_t *sector, ffloor_t *rover,
boolean floating, player_t *player, fixed_t origalpha, boolean crumblereturn);
INT32 EV_DoContinuousFall(sector_t *sec, sector_t *pbacksector, fixed_t spd, boolean backwards);
void EV_DoContinuousFall(sector_t *sec, sector_t *backsector, fixed_t spd, boolean backwards);
INT32 EV_MarioBlock(ffloor_t *rover, sector_t *sector, mobj_t *puncher);
void T_MoveFloor(floormove_t *movefloor);
void T_MoveElevator(elevator_t *elevator);
void T_ContinuousFalling(levelspecthink_t *faller);
void T_ContinuousFalling(continuousfall_t *faller);
void T_BounceCheese(levelspecthink_t *bouncer);
void T_StartCrumble(elevator_t *elevator);
void T_MarioBlock(levelspecthink_t *block);