mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2024-11-15 01:01:33 +00:00
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:
parent
316cb9c24f
commit
356dd03234
4 changed files with 63 additions and 55 deletions
|
@ -1132,7 +1132,10 @@ void T_MarioBlock(levelspecthink_t *block)
|
|||
);
|
||||
|
||||
if (block->sector->ceilingheight >= block->ceilingwasheight + 32*FRACUNIT) // Go back down now..
|
||||
{
|
||||
block->direction = -block->direction;
|
||||
block->sector->floorspeed = 0;
|
||||
}
|
||||
else if (block->sector->ceilingheight <= block->ceilingwasheight)
|
||||
{
|
||||
block->sector->ceilingheight = block->ceilingwasheight;
|
||||
|
@ -1140,8 +1143,6 @@ void T_MarioBlock(levelspecthink_t *block)
|
|||
P_RemoveThinker(&block->thinker);
|
||||
block->sector->floordata = 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 ;)
|
||||
|
@ -1797,6 +1798,8 @@ static mobj_t *SearchMarioNode(msecnode_t *node)
|
|||
|
||||
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;
|
||||
if (SearchMarioNode(block->sector->touching_thinglist))
|
||||
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;
|
||||
}
|
||||
|
||||
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;
|
||||
mobj_t *thing;
|
||||
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->player != NULL);
|
||||
|
||||
if (sec->floordata || sec->ceilingdata)
|
||||
if (roversec->floordata || roversec->ceilingdata)
|
||||
return 0;
|
||||
|
||||
if (!(rover->flags & FF_SOLID))
|
||||
rover->flags |= (FF_SOLID|FF_RENDERALL|FF_CUTLEVEL);
|
||||
|
||||
// Find an item to pop out!
|
||||
thing = SearchMarioNode(sec->touching_thinglist);
|
||||
thing = SearchMarioNode(roversec->touching_thinglist);
|
||||
|
||||
// Found something!
|
||||
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);
|
||||
P_AddThinker(&block->thinker);
|
||||
sec->floordata = block;
|
||||
sec->ceilingdata = block;
|
||||
roversec->floordata = block;
|
||||
roversec->ceilingdata = block;
|
||||
block->thinker.function.acp1 = (actionf_p1)T_MarioBlock;
|
||||
|
||||
// Set up the fields
|
||||
block->sector = sec;
|
||||
block->vars[0] = roversector->tag; // actionsector
|
||||
roversec->floorspeed = 1; // Flag to prevent side changing.
|
||||
block->sector = roversec;
|
||||
block->vars[0] = sector->tag; // actionsector
|
||||
block->vars[1] = 4*FRACUNIT; // speed
|
||||
block->vars[2] = 1; // Up // direction
|
||||
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);
|
||||
thing->x = roversector->soundorg.x;
|
||||
thing->y = roversector->soundorg.y;
|
||||
thing->x = sector->soundorg.x;
|
||||
thing->y = sector->soundorg.y;
|
||||
thing->z = topheight;
|
||||
thing->momz = FixedMul(6*FRACUNIT, thing->scale);
|
||||
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))
|
||||
{
|
||||
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(&tokenobj->target, thing);
|
||||
P_SetMobjState(tokenobj, mobjinfo[MT_TOKEN].seestate);
|
||||
|
|
19
src/p_mobj.c
19
src/p_mobj.c
|
@ -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);
|
||||
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
|
||||
continue;
|
||||
else if (rover->flags & FF_QUICKSAND) // quicksand
|
||||
;
|
||||
else if (!((rover->flags & FF_BLOCKPLAYER && mo->player) // solid to players?
|
||||
|| (rover->flags & FF_BLOCKOTHERS && !mo->player))) // solid to others?
|
||||
else if (!( // if it's not either of the following...
|
||||
(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;
|
||||
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));
|
||||
delta2 = thingtop - (bottomheight + ((topheight - bottomheight)/2));
|
||||
|
||||
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;
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
@ -3070,10 +3075,10 @@ nightsdone:
|
|||
&& *rover->bottomheight == mo->ceilingz) // The player's head hit the bottom!
|
||||
{
|
||||
// DO THE MARIO!
|
||||
if (rover->master->flags & ML_NOCLIMB) // Brick block!
|
||||
if (rover->flags & FF_SHATTERBOTTOM) // Brick block!
|
||||
EV_CrumbleChain(node->m_sector, rover);
|
||||
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!
|
||||
|
|
64
src/p_spec.c
64
src/p_spec.c
|
@ -5793,11 +5793,8 @@ void P_SpawnSpecials(INT32 fromnetsave)
|
|||
// Draw the 'insides' of the block too
|
||||
if (lines[i].flags & ML_NOCLIMB)
|
||||
{
|
||||
ffloorflags |= FF_CUTLEVEL;
|
||||
ffloorflags |= FF_BOTHPLANES;
|
||||
ffloorflags |= FF_ALLSIDES;
|
||||
ffloorflags &= ~FF_EXTRA;
|
||||
ffloorflags &= ~FF_CUTEXTRA;
|
||||
ffloorflags |= FF_CUTLEVEL|FF_BOTHPLANES|FF_ALLSIDES;
|
||||
ffloorflags &= ~(FF_EXTRA|FF_CUTEXTRA);
|
||||
}
|
||||
|
||||
P_AddFakeFloorsByLine(i, ffloorflags, secthinkers);
|
||||
|
@ -5904,11 +5901,8 @@ void P_SpawnSpecials(INT32 fromnetsave)
|
|||
// Draw the 'insides' of the block too
|
||||
if (lines[i].flags & ML_EFFECT2)
|
||||
{
|
||||
ffloorflags |= FF_CUTLEVEL;
|
||||
ffloorflags |= FF_BOTHPLANES;
|
||||
ffloorflags |= FF_ALLSIDES;
|
||||
ffloorflags &= ~FF_EXTRA;
|
||||
ffloorflags &= ~FF_CUTEXTRA;
|
||||
ffloorflags |= FF_CUTLEVEL|FF_BOTHPLANES|FF_ALLSIDES;
|
||||
ffloorflags &= ~(FF_EXTRA|FF_CUTEXTRA);
|
||||
}
|
||||
|
||||
P_AddFakeFloorsByLine(i, ffloorflags, secthinkers);
|
||||
|
@ -5922,11 +5916,8 @@ void P_SpawnSpecials(INT32 fromnetsave)
|
|||
// Draw the 'insides' of the block too
|
||||
if (lines[i].flags & ML_EFFECT2)
|
||||
{
|
||||
ffloorflags |= FF_CUTLEVEL;
|
||||
ffloorflags |= FF_BOTHPLANES;
|
||||
ffloorflags |= FF_ALLSIDES;
|
||||
ffloorflags &= ~FF_EXTRA;
|
||||
ffloorflags &= ~FF_CUTEXTRA;
|
||||
ffloorflags |= FF_CUTLEVEL|FF_BOTHPLANES|FF_ALLSIDES;
|
||||
ffloorflags &= ~(FF_EXTRA|FF_CUTEXTRA);
|
||||
}
|
||||
|
||||
P_AddFakeFloorsByLine(i, ffloorflags, secthinkers);
|
||||
|
@ -5950,11 +5941,8 @@ void P_SpawnSpecials(INT32 fromnetsave)
|
|||
// Draw the 'insides' of the block too
|
||||
if (lines[i].flags & ML_EFFECT2)
|
||||
{
|
||||
ffloorflags |= FF_CUTLEVEL;
|
||||
ffloorflags |= FF_BOTHPLANES;
|
||||
ffloorflags |= FF_ALLSIDES;
|
||||
ffloorflags &= ~FF_EXTRA;
|
||||
ffloorflags &= ~FF_CUTEXTRA;
|
||||
ffloorflags |= FF_CUTLEVEL|FF_BOTHPLANES|FF_ALLSIDES;
|
||||
ffloorflags &= ~(FF_EXTRA|FF_CUTEXTRA);
|
||||
}
|
||||
|
||||
P_AddFakeFloorsByLine(i, ffloorflags, secthinkers);
|
||||
|
@ -5968,11 +5956,8 @@ void P_SpawnSpecials(INT32 fromnetsave)
|
|||
// Draw the 'insides' of the block too
|
||||
if (lines[i].flags & ML_EFFECT2)
|
||||
{
|
||||
ffloorflags |= FF_CUTLEVEL;
|
||||
ffloorflags |= FF_BOTHPLANES;
|
||||
ffloorflags |= FF_ALLSIDES;
|
||||
ffloorflags &= ~FF_EXTRA;
|
||||
ffloorflags &= ~FF_CUTEXTRA;
|
||||
ffloorflags |= FF_CUTLEVEL|FF_BOTHPLANES|FF_ALLSIDES;
|
||||
ffloorflags &= ~(FF_EXTRA|FF_CUTEXTRA);
|
||||
}
|
||||
|
||||
P_AddFakeFloorsByLine(i, ffloorflags, secthinkers);
|
||||
|
@ -6150,7 +6135,13 @@ void P_SpawnSpecials(INT32 fromnetsave)
|
|||
break;
|
||||
|
||||
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;
|
||||
|
||||
case 251: // A THWOMP!
|
||||
|
@ -6164,10 +6155,11 @@ void P_SpawnSpecials(INT32 fromnetsave)
|
|||
break;
|
||||
|
||||
case 252: // Shatter block (breaks when touched)
|
||||
ffloorflags = FF_EXISTS|FF_RENDERALL|FF_BUSTUP|FF_SHATTER;
|
||||
if (lines[i].flags & ML_NOCLIMB)
|
||||
P_AddFakeFloorsByLine(i, FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_BUSTUP|FF_SHATTER|FF_SHATTERBOTTOM, secthinkers);
|
||||
else
|
||||
P_AddFakeFloorsByLine(i, FF_EXISTS|FF_RENDERALL|FF_BUSTUP|FF_SHATTER, secthinkers);
|
||||
ffloorflags |= FF_SOLID|FF_SHATTERBOTTOM;
|
||||
|
||||
P_AddFakeFloorsByLine(i, ffloorflags, secthinkers);
|
||||
break;
|
||||
|
||||
case 253: // Translucent shatter block (see 76)
|
||||
|
@ -6175,10 +6167,11 @@ void P_SpawnSpecials(INT32 fromnetsave)
|
|||
break;
|
||||
|
||||
case 254: // Bustable block
|
||||
ffloorflags = FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_BUSTUP;
|
||||
if (lines[i].flags & ML_NOCLIMB)
|
||||
P_AddFakeFloorsByLine(i, FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_BUSTUP|FF_ONLYKNUX, secthinkers);
|
||||
else
|
||||
P_AddFakeFloorsByLine(i, FF_EXISTS|FF_SOLID|FF_RENDERALL|FF_BUSTUP, secthinkers);
|
||||
ffloorflags |= FF_ONLYKNUX;
|
||||
|
||||
P_AddFakeFloorsByLine(i, ffloorflags, secthinkers);
|
||||
break;
|
||||
|
||||
case 255: // Spin bust block (breaks when jumped or spun downwards onto)
|
||||
|
@ -6190,10 +6183,11 @@ void P_SpawnSpecials(INT32 fromnetsave)
|
|||
break;
|
||||
|
||||
case 257: // Quicksand
|
||||
ffloorflags = FF_EXISTS|FF_QUICKSAND|FF_RENDERALL|FF_ALLSIDES|FF_CUTSPRITES;
|
||||
if (lines[i].flags & ML_EFFECT5)
|
||||
P_AddFakeFloorsByLine(i, FF_EXISTS|FF_QUICKSAND|FF_RENDERALL|FF_ALLSIDES|FF_CUTSPRITES|FF_RIPPLE, secthinkers);
|
||||
else
|
||||
P_AddFakeFloorsByLine(i, FF_EXISTS|FF_QUICKSAND|FF_RENDERALL|FF_ALLSIDES|FF_CUTSPRITES, secthinkers);
|
||||
ffloorflags |= FF_RIPPLE;
|
||||
|
||||
P_AddFakeFloorsByLine(i, ffloorflags, secthinkers);
|
||||
break;
|
||||
|
||||
case 258: // Laser block
|
||||
|
|
|
@ -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_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);
|
||||
|
||||
|
|
Loading…
Reference in a new issue