mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2025-01-19 07:51:43 +00:00
Refactor T_ContinuousFalling
This commit is contained in:
parent
70d262653e
commit
7e2f95c3f5
3 changed files with 63 additions and 73 deletions
|
@ -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)
|
||||
|
|
|
@ -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:
|
||||
|
|
15
src/p_spec.h
15
src/p_spec.h
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue