Make T_BounceCheese use its own thinker struct

This commit is contained in:
MascaraSnake 2020-04-18 10:45:21 +02:00
parent 54de7584d1
commit 1d35442e16
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 // 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 sectorheight;
fixed_t halfheight; fixed_t halfheight;
fixed_t waterheight; fixed_t waterheight;
@ -709,7 +704,7 @@ void T_BounceCheese(levelspecthink_t *bouncer)
bouncer->sector->floorspeed = -bouncer->speed/2; bouncer->sector->floorspeed = -bouncer->speed/2;
bouncer->sector->ceilspeed = 42; 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 || (bouncer->sector->ceilingheight > bouncer->ceilingwasheight && bouncer->low)) // Up
{ {
if (abs(bouncer->speed) < 6*FRACUNIT) if (abs(bouncer->speed) < 6*FRACUNIT)
@ -717,7 +712,7 @@ void T_BounceCheese(levelspecthink_t *bouncer)
else else
bouncer->speed -= bouncer->speed/2; bouncer->speed -= bouncer->speed/2;
bouncer->low = bouncer->low ? 0 : 1; bouncer->low = !bouncer->low;
if (abs(bouncer->speed) > 6*FRACUNIT) if (abs(bouncer->speed) > 6*FRACUNIT)
{ {
mobj_t *mp = (void *)&actionsector->soundorg; mobj_t *mp = (void *)&actionsector->soundorg;
@ -756,11 +751,6 @@ void T_BounceCheese(levelspecthink_t *bouncer)
if (actionsector) if (actionsector)
P_RecalcPrecipInSector(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 // Used for bobbing platforms on the water
INT32 EV_BounceSector(sector_t *sec, fixed_t momz, line_t *sourceline) INT32 EV_BounceSector(sector_t *sec, fixed_t momz, line_t *sourceline)
{ {
#define speed vars[0] bouncecheese_t *bouncer;
#define distance vars[1]
#define low vars[2]
levelspecthink_t *bouncer;
// create and initialize new thinker // create and initialize new thinker
if (sec->ceilingdata) // One at a time, ma'am. 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; bouncer->thinker.function.acp1 = (actionf_p1)T_BounceCheese;
// set up the fields according to the type of elevator action // set up the fields according to the type of elevator action
bouncer->sourceline = sourceline;
bouncer->sector = sec; bouncer->sector = sec;
bouncer->speed = momz/2; bouncer->speed = momz/2;
bouncer->sourceline = sourceline;
bouncer->distance = FRACUNIT; bouncer->distance = FRACUNIT;
bouncer->low = 1; bouncer->low = true;
return 1; return 1;
#undef speed
#undef distance
#undef low
} }
// For T_ContinuousFalling special // 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)); 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 // SaveContinuousFallThinker
// //
@ -2378,7 +2396,7 @@ static void P_NetArchiveThinkers(void)
} }
else if (th->function.acp1 == (actionf_p1)T_BounceCheese) else if (th->function.acp1 == (actionf_p1)T_BounceCheese)
{ {
SaveSpecialLevelThinker(th, tc_bouncecheese); SaveBounceCheeseThinker(th, tc_bouncecheese);
continue; continue;
} }
else if (th->function.acp1 == (actionf_p1)T_StartCrumble) else if (th->function.acp1 == (actionf_p1)T_StartCrumble)
@ -2893,6 +2911,24 @@ static thinker_t* LoadNoEnemiesThinker(actionf_p1 thinker)
return &ht->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 // LoadContinuousFallThinker
// //
// Loads a continuousfall_t from a save game // Loads a continuousfall_t from a save game
@ -3688,7 +3724,7 @@ static void P_NetUnArchiveThinkers(void)
break; break;
case tc_bouncecheese: case tc_bouncecheese:
th = LoadSpecialLevelThinker((actionf_p1)T_BounceCheese, 2); th = LoadBounceCheeseThinker((actionf_p1)T_BounceCheese);
break; break;
case tc_startcrumble: case tc_startcrumble:

View file

@ -337,6 +337,18 @@ typedef struct
fixed_t destheight; fixed_t destheight;
} continuousfall_t; } 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 typedef struct
{ {
thinker_t thinker; thinker_t thinker;
@ -429,7 +441,7 @@ void T_MoveFloor(floormove_t *movefloor);
void T_MoveElevator(elevator_t *elevator); void T_MoveElevator(elevator_t *elevator);
void T_ContinuousFalling(continuousfall_t *faller); 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_StartCrumble(elevator_t *elevator);
void T_MarioBlock(mariothink_t *block); void T_MarioBlock(mariothink_t *block);
void T_FloatSector(floatthink_t *floater); void T_FloatSector(floatthink_t *floater);