Mario block improvements. (I JUST CAN'T STOP)

* Only change texture when stationary or moving down, for additional fidelity to source material. This has zero overhead, and actually might REDUCE lag in some circumstances... my nitpickiness wins again.
* Apply ML_EFFECT1 to it to make it invisible and intangible (removing (FF_SOLID|FF_RENDERALL|FF_CUTLEVEL) from it) from every side except the bottom. Becomes visible and tangible when it's hit once. Might fuck over players in mp, but really our Mario blocks are so high in the air (and we'd need to update Pipe Towers to take advantage anyways) that they're super unlikely to get a kill this way
* Checks for the Brick Block have been switched over to the presence of FF_SHATTERBOTTOM instead of checking for the source linedef's flags every time.
This commit is contained in:
toasterbabe 2016-06-06 18:30:58 +01:00
parent 316cb9c24f
commit 356dd03234
4 changed files with 63 additions and 55 deletions

View file

@ -1132,7 +1132,10 @@ void T_MarioBlock(levelspecthink_t *block)
); );
if (block->sector->ceilingheight >= block->ceilingwasheight + 32*FRACUNIT) // Go back down now.. if (block->sector->ceilingheight >= block->ceilingwasheight + 32*FRACUNIT) // Go back down now..
{
block->direction = -block->direction; block->direction = -block->direction;
block->sector->floorspeed = 0;
}
else if (block->sector->ceilingheight <= block->ceilingwasheight) else if (block->sector->ceilingheight <= block->ceilingwasheight)
{ {
block->sector->ceilingheight = block->ceilingwasheight; block->sector->ceilingheight = block->ceilingwasheight;
@ -1140,8 +1143,6 @@ void T_MarioBlock(levelspecthink_t *block)
P_RemoveThinker(&block->thinker); P_RemoveThinker(&block->thinker);
block->sector->floordata = NULL; block->sector->floordata = NULL;
block->sector->ceilingdata = NULL; block->sector->ceilingdata = NULL;
block->sector->floorspeed = 0;
block->sector->ceilspeed = 0;
} }
for (i = -1; (i = P_FindSectorFromTag((INT16)block->vars[0], i)) >= 0 ;) for (i = -1; (i = P_FindSectorFromTag((INT16)block->vars[0], i)) >= 0 ;)
@ -1797,6 +1798,8 @@ static mobj_t *SearchMarioNode(msecnode_t *node)
void T_MarioBlockChecker(levelspecthink_t *block) void T_MarioBlockChecker(levelspecthink_t *block)
{ {
if (block->sector->floorspeed) // Don't update the textures when the block's being bumped upwards.
return;
line_t *masterline = block->sourceline; line_t *masterline = block->sourceline;
if (SearchMarioNode(block->sector->touching_thinglist)) if (SearchMarioNode(block->sector->touching_thinglist))
sides[masterline->sidenum[0]].midtexture = sides[masterline->sidenum[0]].bottomtexture; sides[masterline->sidenum[0]].midtexture = sides[masterline->sidenum[0]].bottomtexture;
@ -3122,8 +3125,10 @@ INT32 EV_StartCrumble(sector_t *sec, ffloor_t *rover, boolean floating,
return 1; return 1;
} }
INT32 EV_MarioBlock(sector_t *sec, sector_t *roversector, fixed_t topheight, mobj_t *puncher) INT32 EV_MarioBlock(ffloor_t *rover, sector_t *sector, mobj_t *puncher)
{ {
sector_t *roversec = rover->master->frontsector;
fixed_t topheight = *rover->topheight;
levelspecthink_t *block; levelspecthink_t *block;
mobj_t *thing; mobj_t *thing;
fixed_t oldx = 0, oldy = 0, oldz = 0; fixed_t oldx = 0, oldy = 0, oldz = 0;
@ -3131,11 +3136,14 @@ INT32 EV_MarioBlock(sector_t *sec, sector_t *roversector, fixed_t topheight, mob
I_Assert(puncher != NULL); I_Assert(puncher != NULL);
I_Assert(puncher->player != NULL); I_Assert(puncher->player != NULL);
if (sec->floordata || sec->ceilingdata) if (roversec->floordata || roversec->ceilingdata)
return 0; return 0;
if (!(rover->flags & FF_SOLID))
rover->flags |= (FF_SOLID|FF_RENDERALL|FF_CUTLEVEL);
// Find an item to pop out! // Find an item to pop out!
thing = SearchMarioNode(sec->touching_thinglist); thing = SearchMarioNode(roversec->touching_thinglist);
// Found something! // Found something!
if (thing) if (thing)
@ -3145,13 +3153,14 @@ INT32 EV_MarioBlock(sector_t *sec, sector_t *roversector, fixed_t topheight, mob
block = Z_Calloc(sizeof (*block), PU_LEVSPEC, NULL); block = Z_Calloc(sizeof (*block), PU_LEVSPEC, NULL);
P_AddThinker(&block->thinker); P_AddThinker(&block->thinker);
sec->floordata = block; roversec->floordata = block;
sec->ceilingdata = block; roversec->ceilingdata = block;
block->thinker.function.acp1 = (actionf_p1)T_MarioBlock; block->thinker.function.acp1 = (actionf_p1)T_MarioBlock;
// Set up the fields // Set up the fields
block->sector = sec; roversec->floorspeed = 1; // Flag to prevent side changing.
block->vars[0] = roversector->tag; // actionsector block->sector = roversec;
block->vars[0] = sector->tag; // actionsector
block->vars[1] = 4*FRACUNIT; // speed block->vars[1] = 4*FRACUNIT; // speed
block->vars[2] = 1; // Up // direction block->vars[2] = 1; // Up // direction
block->vars[3] = block->sector->floorheight; // floorwasheight block->vars[3] = block->sector->floorheight; // floorwasheight
@ -3167,8 +3176,8 @@ INT32 EV_MarioBlock(sector_t *sec, sector_t *roversector, fixed_t topheight, mob
} }
P_UnsetThingPosition(thing); P_UnsetThingPosition(thing);
thing->x = roversector->soundorg.x; thing->x = sector->soundorg.x;
thing->y = roversector->soundorg.y; thing->y = sector->soundorg.y;
thing->z = topheight; thing->z = topheight;
thing->momz = FixedMul(6*FRACUNIT, thing->scale); thing->momz = FixedMul(6*FRACUNIT, thing->scale);
P_SetThingPosition(thing); P_SetThingPosition(thing);
@ -3185,7 +3194,7 @@ INT32 EV_MarioBlock(sector_t *sec, sector_t *roversector, fixed_t topheight, mob
{ {
if (thing->type == MT_EMMY && thing->spawnpoint && (thing->spawnpoint->options & MTF_OBJECTSPECIAL)) if (thing->type == MT_EMMY && thing->spawnpoint && (thing->spawnpoint->options & MTF_OBJECTSPECIAL))
{ {
mobj_t *tokenobj = P_SpawnMobj(roversector->soundorg.x, roversector->soundorg.y, topheight, MT_TOKEN); mobj_t *tokenobj = P_SpawnMobj(sector->soundorg.x, sector->soundorg.y, topheight, MT_TOKEN);
P_SetTarget(&thing->tracer, tokenobj); P_SetTarget(&thing->tracer, tokenobj);
P_SetTarget(&tokenobj->target, thing); P_SetTarget(&tokenobj->target, thing);
P_SetMobjState(tokenobj, mobjinfo[MT_TOKEN].seestate); P_SetMobjState(tokenobj, mobjinfo[MT_TOKEN].seestate);

View file

@ -2154,14 +2154,16 @@ static void P_AdjustMobjFloorZ_FFloors(mobj_t *mo, sector_t *sector, UINT8 motyp
topheight = P_GetFOFTopZ(mo, sector, rover, mo->x, mo->y, NULL); topheight = P_GetFOFTopZ(mo, sector, rover, mo->x, mo->y, NULL);
bottomheight = P_GetFOFBottomZ(mo, sector, rover, mo->x, mo->y, NULL); bottomheight = P_GetFOFBottomZ(mo, sector, rover, mo->x, mo->y, NULL);
if (mo->player && (P_CheckSolidLava(mo, rover) || P_CanRunOnWater(mo->player, rover))) // only the player should be affected if (mo->player && (P_CheckSolidLava(mo, rover) || P_CanRunOnWater(mo->player, rover))) // only the player should stand on lava or run on water
; ;
else if (motype != 0 && rover->flags & FF_SWIMMABLE) // "scenery" only else if (motype != 0 && rover->flags & FF_SWIMMABLE) // "scenery" only
continue; continue;
else if (rover->flags & FF_QUICKSAND) // quicksand else if (rover->flags & FF_QUICKSAND) // quicksand
; ;
else if (!((rover->flags & FF_BLOCKPLAYER && mo->player) // solid to players? else if (!( // if it's not either of the following...
|| (rover->flags & FF_BLOCKOTHERS && !mo->player))) // solid to others? (rover->flags & (FF_BLOCKPLAYER|FF_MARIO) && mo->player) // ...solid to players? (mario blocks are always solid from beneath to players)
|| (rover->flags & FF_BLOCKOTHERS && !mo->player) // ...solid to others?
)) // ...don't take it into account.
continue; continue;
if (rover->flags & FF_QUICKSAND) if (rover->flags & FF_QUICKSAND)
{ {
@ -2186,13 +2188,16 @@ static void P_AdjustMobjFloorZ_FFloors(mobj_t *mo, sector_t *sector, UINT8 motyp
delta1 = mo->z - (bottomheight + ((topheight - bottomheight)/2)); delta1 = mo->z - (bottomheight + ((topheight - bottomheight)/2));
delta2 = thingtop - (bottomheight + ((topheight - bottomheight)/2)); delta2 = thingtop - (bottomheight + ((topheight - bottomheight)/2));
if (topheight > mo->floorz && abs(delta1) < abs(delta2) if (topheight > mo->floorz && abs(delta1) < abs(delta2)
&& !(rover->flags & FF_REVERSEPLATFORM)) && !(rover->flags & FF_REVERSEPLATFORM)
&& (rover->flags & FF_SOLID)) // Non-FF_SOLID Mario blocks are only solid from bottom
{ {
mo->floorz = topheight; mo->floorz = topheight;
} }
if (bottomheight < mo->ceilingz && abs(delta1) >= abs(delta2) if (bottomheight < mo->ceilingz && abs(delta1) >= abs(delta2)
&& !(rover->flags & FF_PLATFORM)) && !(rover->flags & FF_PLATFORM)
&& ((mo->momz > 0) || ((rover->flags & FF_SOLID) && !(rover->flags & FF_REVERSEPLATFORM)))) // Only clip for FOFs that are intangible from the top if you're coming from below
{ {
mo->ceilingz = bottomheight; mo->ceilingz = bottomheight;
} }
@ -3070,10 +3075,10 @@ nightsdone:
&& *rover->bottomheight == mo->ceilingz) // The player's head hit the bottom! && *rover->bottomheight == mo->ceilingz) // The player's head hit the bottom!
{ {
// DO THE MARIO! // DO THE MARIO!
if (rover->master->flags & ML_NOCLIMB) // Brick block! if (rover->flags & FF_SHATTERBOTTOM) // Brick block!
EV_CrumbleChain(node->m_sector, rover); EV_CrumbleChain(node->m_sector, rover);
else // Question block! else // Question block!
EV_MarioBlock(rover->master->frontsector, node->m_sector, *rover->topheight, mo); EV_MarioBlock(rover, node->m_sector, mo);
} }
} }
} // Ugly ugly billions of braces! Argh! } // Ugly ugly billions of braces! Argh!

View file

@ -5793,11 +5793,8 @@ void P_SpawnSpecials(INT32 fromnetsave)
// Draw the 'insides' of the block too // Draw the 'insides' of the block too
if (lines[i].flags & ML_NOCLIMB) if (lines[i].flags & ML_NOCLIMB)
{ {
ffloorflags |= FF_CUTLEVEL; ffloorflags |= FF_CUTLEVEL|FF_BOTHPLANES|FF_ALLSIDES;
ffloorflags |= FF_BOTHPLANES; ffloorflags &= ~(FF_EXTRA|FF_CUTEXTRA);
ffloorflags |= FF_ALLSIDES;
ffloorflags &= ~FF_EXTRA;
ffloorflags &= ~FF_CUTEXTRA;
} }
P_AddFakeFloorsByLine(i, ffloorflags, secthinkers); P_AddFakeFloorsByLine(i, ffloorflags, secthinkers);
@ -5904,11 +5901,8 @@ void P_SpawnSpecials(INT32 fromnetsave)
// Draw the 'insides' of the block too // Draw the 'insides' of the block too
if (lines[i].flags & ML_EFFECT2) if (lines[i].flags & ML_EFFECT2)
{ {
ffloorflags |= FF_CUTLEVEL; ffloorflags |= FF_CUTLEVEL|FF_BOTHPLANES|FF_ALLSIDES;
ffloorflags |= FF_BOTHPLANES; ffloorflags &= ~(FF_EXTRA|FF_CUTEXTRA);
ffloorflags |= FF_ALLSIDES;
ffloorflags &= ~FF_EXTRA;
ffloorflags &= ~FF_CUTEXTRA;
} }
P_AddFakeFloorsByLine(i, ffloorflags, secthinkers); P_AddFakeFloorsByLine(i, ffloorflags, secthinkers);
@ -5922,11 +5916,8 @@ void P_SpawnSpecials(INT32 fromnetsave)
// Draw the 'insides' of the block too // Draw the 'insides' of the block too
if (lines[i].flags & ML_EFFECT2) if (lines[i].flags & ML_EFFECT2)
{ {
ffloorflags |= FF_CUTLEVEL; ffloorflags |= FF_CUTLEVEL|FF_BOTHPLANES|FF_ALLSIDES;
ffloorflags |= FF_BOTHPLANES; ffloorflags &= ~(FF_EXTRA|FF_CUTEXTRA);
ffloorflags |= FF_ALLSIDES;
ffloorflags &= ~FF_EXTRA;
ffloorflags &= ~FF_CUTEXTRA;
} }
P_AddFakeFloorsByLine(i, ffloorflags, secthinkers); P_AddFakeFloorsByLine(i, ffloorflags, secthinkers);
@ -5950,11 +5941,8 @@ void P_SpawnSpecials(INT32 fromnetsave)
// Draw the 'insides' of the block too // Draw the 'insides' of the block too
if (lines[i].flags & ML_EFFECT2) if (lines[i].flags & ML_EFFECT2)
{ {
ffloorflags |= FF_CUTLEVEL; ffloorflags |= FF_CUTLEVEL|FF_BOTHPLANES|FF_ALLSIDES;
ffloorflags |= FF_BOTHPLANES; ffloorflags &= ~(FF_EXTRA|FF_CUTEXTRA);
ffloorflags |= FF_ALLSIDES;
ffloorflags &= ~FF_EXTRA;
ffloorflags &= ~FF_CUTEXTRA;
} }
P_AddFakeFloorsByLine(i, ffloorflags, secthinkers); P_AddFakeFloorsByLine(i, ffloorflags, secthinkers);
@ -5968,11 +5956,8 @@ void P_SpawnSpecials(INT32 fromnetsave)
// Draw the 'insides' of the block too // Draw the 'insides' of the block too
if (lines[i].flags & ML_EFFECT2) if (lines[i].flags & ML_EFFECT2)
{ {
ffloorflags |= FF_CUTLEVEL; ffloorflags |= FF_CUTLEVEL|FF_BOTHPLANES|FF_ALLSIDES;
ffloorflags |= FF_BOTHPLANES; ffloorflags &= ~(FF_EXTRA|FF_CUTEXTRA);
ffloorflags |= FF_ALLSIDES;
ffloorflags &= ~FF_EXTRA;
ffloorflags &= ~FF_CUTEXTRA;
} }
P_AddFakeFloorsByLine(i, ffloorflags, secthinkers); P_AddFakeFloorsByLine(i, ffloorflags, secthinkers);
@ -6150,7 +6135,13 @@ void P_SpawnSpecials(INT32 fromnetsave)
break; break;
case 250: // Mario Block case 250: // Mario Block
P_AddFakeFloorsByLine(i, FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL|FF_MARIO, secthinkers); ffloorflags = FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_CUTLEVEL|FF_MARIO;
if (lines[i].flags & ML_NOCLIMB)
ffloorflags |= FF_SHATTERBOTTOM;
if (lines[i].flags & ML_EFFECT1)
ffloorflags &= ~(FF_SOLID|FF_RENDERALL|FF_CUTLEVEL);
P_AddFakeFloorsByLine(i, ffloorflags, secthinkers);
break; break;
case 251: // A THWOMP! case 251: // A THWOMP!
@ -6164,10 +6155,11 @@ void P_SpawnSpecials(INT32 fromnetsave)
break; break;
case 252: // Shatter block (breaks when touched) case 252: // Shatter block (breaks when touched)
ffloorflags = FF_EXISTS|FF_RENDERALL|FF_BUSTUP|FF_SHATTER;
if (lines[i].flags & ML_NOCLIMB) if (lines[i].flags & ML_NOCLIMB)
P_AddFakeFloorsByLine(i, FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_BUSTUP|FF_SHATTER|FF_SHATTERBOTTOM, secthinkers); ffloorflags |= FF_SOLID|FF_SHATTERBOTTOM;
else
P_AddFakeFloorsByLine(i, FF_EXISTS|FF_RENDERALL|FF_BUSTUP|FF_SHATTER, secthinkers); P_AddFakeFloorsByLine(i, ffloorflags, secthinkers);
break; break;
case 253: // Translucent shatter block (see 76) case 253: // Translucent shatter block (see 76)
@ -6175,10 +6167,11 @@ void P_SpawnSpecials(INT32 fromnetsave)
break; break;
case 254: // Bustable block case 254: // Bustable block
ffloorflags = FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_BUSTUP;
if (lines[i].flags & ML_NOCLIMB) if (lines[i].flags & ML_NOCLIMB)
P_AddFakeFloorsByLine(i, FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_BUSTUP|FF_ONLYKNUX, secthinkers); ffloorflags |= FF_ONLYKNUX;
else
P_AddFakeFloorsByLine(i, FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_BUSTUP, secthinkers); P_AddFakeFloorsByLine(i, ffloorflags, secthinkers);
break; break;
case 255: // Spin bust block (breaks when jumped or spun downwards onto) case 255: // Spin bust block (breaks when jumped or spun downwards onto)
@ -6190,10 +6183,11 @@ void P_SpawnSpecials(INT32 fromnetsave)
break; break;
case 257: // Quicksand case 257: // Quicksand
ffloorflags = FF_EXISTS|FF_QUICKSAND|FF_RENDERALL|FF_ALLSIDES|FF_CUTSPRITES;
if (lines[i].flags & ML_EFFECT5) if (lines[i].flags & ML_EFFECT5)
P_AddFakeFloorsByLine(i, FF_EXISTS|FF_QUICKSAND|FF_RENDERALL|FF_ALLSIDES|FF_CUTSPRITES|FF_RIPPLE, secthinkers); ffloorflags |= FF_RIPPLE;
else
P_AddFakeFloorsByLine(i, FF_EXISTS|FF_QUICKSAND|FF_RENDERALL|FF_ALLSIDES|FF_CUTSPRITES, secthinkers); P_AddFakeFloorsByLine(i, ffloorflags, secthinkers);
break; break;
case 258: // Laser block case 258: // Laser block

View file

@ -323,7 +323,7 @@ INT32 EV_StartCrumble(sector_t *sector, ffloor_t *rover,
INT32 EV_DoContinuousFall(sector_t *sec, sector_t *pbacksector, fixed_t spd, boolean backwards); INT32 EV_DoContinuousFall(sector_t *sec, sector_t *pbacksector, fixed_t spd, boolean backwards);
INT32 EV_MarioBlock(sector_t *sector, sector_t *roversector, fixed_t topheight, 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);