Make T_BounceCheese use its own thinker struct

This commit is contained in:
MascaraSnake 2020-04-18 10:45:21 +02:00
parent 08f1e03e79
commit ab17267363
3 changed files with 57 additions and 25 deletions

View file

@ -625,13 +625,8 @@ static fixed_t P_SectorCheckWater(sector_t *analyzesector,
//////////////////////////////////////////////////
// Bounces a floating cheese
void T_BounceCheese(levelspecthink_t *bouncer)
void T_BounceCheese(bouncecheese_t *bouncer)
{
#define speed vars[0]
#define distance vars[1]
#define low vars[2]
#define ceilingwasheight vars[3]
#define floorwasheight vars[4]
fixed_t sectorheight;
fixed_t halfheight;
fixed_t waterheight;
@ -709,7 +704,7 @@ void T_BounceCheese(levelspecthink_t *bouncer)
bouncer->sector->floorspeed = -bouncer->speed/2;
bouncer->sector->ceilspeed = 42;
if ((bouncer->sector->ceilingheight < bouncer->ceilingwasheight && bouncer->low == 0) // Down
if ((bouncer->sector->ceilingheight < bouncer->ceilingwasheight && !bouncer->low) // Down
|| (bouncer->sector->ceilingheight > bouncer->ceilingwasheight && bouncer->low)) // Up
{
if (abs(bouncer->speed) < 6*FRACUNIT)
@ -717,7 +712,7 @@ void T_BounceCheese(levelspecthink_t *bouncer)
else
bouncer->speed -= bouncer->speed/2;
bouncer->low = bouncer->low ? 0 : 1;
bouncer->low = !bouncer->low;
if (abs(bouncer->speed) > 6*FRACUNIT)
{
mobj_t *mp = (void *)&actionsector->soundorg;
@ -756,11 +751,6 @@ void T_BounceCheese(levelspecthink_t *bouncer)
if (actionsector)
P_RecalcPrecipInSector(actionsector);
}
#undef speed
#undef distance
#undef low
#undef ceilingwasheight
#undef floorwasheight
}
//////////////////////////////////////////////////
@ -2283,10 +2273,7 @@ void EV_CrumbleChain(sector_t *sec, ffloor_t *rover)
// Used for bobbing platforms on the water
INT32 EV_BounceSector(sector_t *sec, fixed_t momz, line_t *sourceline)
{
#define speed vars[0]
#define distance vars[1]
#define low vars[2]
levelspecthink_t *bouncer;
bouncecheese_t *bouncer;
// create and initialize new thinker
if (sec->ceilingdata) // One at a time, ma'am.
@ -2298,16 +2285,13 @@ INT32 EV_BounceSector(sector_t *sec, fixed_t momz, line_t *sourceline)
bouncer->thinker.function.acp1 = (actionf_p1)T_BounceCheese;
// set up the fields according to the type of elevator action
bouncer->sourceline = sourceline;
bouncer->sector = sec;
bouncer->speed = momz/2;
bouncer->sourceline = sourceline;
bouncer->distance = FRACUNIT;
bouncer->low = 1;
bouncer->low = true;
return 1;
#undef speed
#undef distance
#undef low
}
// For T_ContinuousFalling special

View file

@ -1670,6 +1670,24 @@ static void SaveNoEnemiesThinker(const thinker_t *th, const UINT8 type)
WRITEUINT32(save_p, SaveLine(ht->sourceline));
}
//
// SaveBounceCheeseThinker
//
// Saves a bouncecheese_t thinker
//
static void SaveBounceCheeseThinker(const thinker_t *th, const UINT8 type)
{
const bouncecheese_t *ht = (const void *)th;
WRITEUINT8(save_p, type);
WRITEUINT32(save_p, SaveLine(ht->sourceline));
WRITEUINT32(save_p, SaveSector(ht->sector));
WRITEFIXED(save_p, ht->speed);
WRITEFIXED(save_p, ht->distance);
WRITEFIXED(save_p, ht->floorwasheight);
WRITEFIXED(save_p, ht->ceilingwasheight);
WRITECHAR(save_p, ht->low);
}
//
// SaveContinuousFallThinker
//
@ -2378,7 +2396,7 @@ static void P_NetArchiveThinkers(void)
}
else if (th->function.acp1 == (actionf_p1)T_BounceCheese)
{
SaveSpecialLevelThinker(th, tc_bouncecheese);
SaveBounceCheeseThinker(th, tc_bouncecheese);
continue;
}
else if (th->function.acp1 == (actionf_p1)T_StartCrumble)
@ -2893,6 +2911,24 @@ static thinker_t* LoadNoEnemiesThinker(actionf_p1 thinker)
return &ht->thinker;
}
// LoadBounceCheeseThinker
//
// Loads a bouncecheese_t from a save game
//
static thinker_t* LoadBounceCheeseThinker(actionf_p1 thinker)
{
bouncecheese_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL);
ht->thinker.function.acp1 = thinker;
ht->sourceline = LoadLine(READUINT32(save_p));
ht->sector = LoadSector(READUINT32(save_p));
ht->speed = READFIXED(save_p);
ht->distance = READFIXED(save_p);
ht->floorwasheight = READFIXED(save_p);
ht->ceilingwasheight = READFIXED(save_p);
ht->low = READCHAR(save_p);
return &ht->thinker;
}
// LoadContinuousFallThinker
//
// Loads a continuousfall_t from a save game
@ -3688,7 +3724,7 @@ static void P_NetUnArchiveThinkers(void)
break;
case tc_bouncecheese:
th = LoadSpecialLevelThinker((actionf_p1)T_BounceCheese, 2);
th = LoadBounceCheeseThinker((actionf_p1)T_BounceCheese);
break;
case tc_startcrumble:

View file

@ -337,6 +337,18 @@ typedef struct
fixed_t destheight;
} continuousfall_t;
typedef struct
{
thinker_t thinker;
line_t *sourceline;
sector_t *sector;
fixed_t speed;
fixed_t distance;
fixed_t floorwasheight;
fixed_t ceilingwasheight;
boolean low;
} bouncecheese_t;
typedef struct
{
thinker_t thinker;
@ -429,7 +441,7 @@ void T_MoveFloor(floormove_t *movefloor);
void T_MoveElevator(elevator_t *elevator);
void T_ContinuousFalling(continuousfall_t *faller);
void T_BounceCheese(levelspecthink_t *bouncer);
void T_BounceCheese(bouncecheese_t *bouncer);
void T_StartCrumble(elevator_t *elevator);
void T_MarioBlock(mariothink_t *block);
void T_FloatSector(floatthink_t *floater);