mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2025-01-19 16:01:35 +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.
|
// Useful for things like intermittent falling lava.
|
||||||
//
|
//
|
||||||
void T_ContinuousFalling(levelspecthink_t *faller)
|
void T_ContinuousFalling(continuousfall_t *faller)
|
||||||
{
|
{
|
||||||
#define speed vars[0]
|
faller->sector->ceilingheight += faller->speed*faller->direction;
|
||||||
#define direction vars[1]
|
faller->sector->floorheight += faller->speed*faller->direction;
|
||||||
#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;
|
|
||||||
}
|
|
||||||
|
|
||||||
P_CheckSector(faller->sector, false);
|
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->ceilingstartheight;
|
||||||
{
|
faller->sector->floorheight = faller->floorstartheight;
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
P_CheckSector(faller->sector, false); // you might think this is irrelevant. you would be wrong
|
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->floorspeed = faller->speed*faller->direction;
|
||||||
faller->sector->ceilspeed = 42;
|
faller->sector->ceilspeed = 42;
|
||||||
faller->sector->moved = true;
|
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
|
// 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]
|
continuousfall_t *faller;
|
||||||
#define direction vars[1]
|
|
||||||
#define floorwasheight vars[2]
|
|
||||||
#define ceilingwasheight vars[3]
|
|
||||||
#define floordestheight vars[4]
|
|
||||||
#define ceilingdestheight vars[5]
|
|
||||||
levelspecthink_t *faller;
|
|
||||||
|
|
||||||
// workaround for when there is no back sector
|
// workaround for when there is no back sector
|
||||||
if (backsector == NULL)
|
if (!backsector)
|
||||||
backsector = sec;
|
backsector = sec;
|
||||||
|
|
||||||
// create and initialize new thinker
|
// 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->sector = sec;
|
||||||
faller->speed = spd;
|
faller->speed = spd;
|
||||||
|
|
||||||
faller->floorwasheight = sec->floorheight;
|
faller->floorstartheight = sec->floorheight;
|
||||||
faller->ceilingwasheight = sec->ceilingheight;
|
faller->ceilingstartheight = sec->ceilingheight;
|
||||||
|
|
||||||
if (backwards)
|
faller->destheight = backwards ? backsector->ceilingheight : backsector->floorheight;
|
||||||
{
|
faller->direction = backwards ? 1 : -1;
|
||||||
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
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Some other 3dfloor special things Tails 03-11-2002 (Search p_mobj.c for description)
|
// 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));
|
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
|
// SaveFloatThinker
|
||||||
//
|
//
|
||||||
|
@ -2266,7 +2283,7 @@ static void P_NetArchiveThinkers(void)
|
||||||
}
|
}
|
||||||
else if (th->function.acp1 == (actionf_p1)T_ContinuousFalling)
|
else if (th->function.acp1 == (actionf_p1)T_ContinuousFalling)
|
||||||
{
|
{
|
||||||
SaveSpecialLevelThinker(th, tc_continuousfalling);
|
SaveContinuousFallThinker(th, tc_continuousfalling);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
else if (th->function.acp1 == (actionf_p1)T_ThwompSector)
|
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;
|
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
|
// LoadFloatThinker
|
||||||
//
|
//
|
||||||
// Loads a floatthink_t from a save game
|
// Loads a floatthink_t from a save game
|
||||||
|
@ -3528,7 +3562,7 @@ static void P_NetUnArchiveThinkers(void)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case tc_continuousfalling:
|
case tc_continuousfalling:
|
||||||
th = LoadSpecialLevelThinker((actionf_p1)T_ContinuousFalling, 3);
|
th = LoadContinuousFallThinker((actionf_p1)T_ContinuousFalling);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case tc_thwomp:
|
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
|
sector_t *sector; // Sector the thinker is from
|
||||||
} levelspecthink_t;
|
} 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
|
typedef struct
|
||||||
{
|
{
|
||||||
thinker_t thinker;
|
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,
|
INT32 EV_StartCrumble(sector_t *sector, ffloor_t *rover,
|
||||||
boolean floating, player_t *player, fixed_t origalpha, boolean crumblereturn);
|
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);
|
INT32 EV_MarioBlock(ffloor_t *rover, sector_t *sector, mobj_t *puncher);
|
||||||
|
|
||||||
void T_MoveFloor(floormove_t *movefloor);
|
void T_MoveFloor(floormove_t *movefloor);
|
||||||
|
|
||||||
void T_MoveElevator(elevator_t *elevator);
|
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_BounceCheese(levelspecthink_t *bouncer);
|
||||||
void T_StartCrumble(elevator_t *elevator);
|
void T_StartCrumble(elevator_t *elevator);
|
||||||
void T_MarioBlock(levelspecthink_t *block);
|
void T_MarioBlock(levelspecthink_t *block);
|
||||||
|
|
Loading…
Reference in a new issue