mirror of
https://github.com/ZDoom/gzdoom.git
synced 2025-02-17 01:31:25 +00:00
- Added: Sector movement that causes deep water to change its height now
will trigger associated sector actions and adjust the actor's water level. SVN r836 (trunk)
This commit is contained in:
parent
9adf1d4ddc
commit
60ad26b231
11 changed files with 66 additions and 25 deletions
|
@ -1,4 +1,6 @@
|
||||||
March 22, 2008 (Changes by Graf Zahl)
|
March 22, 2008 (Changes by Graf Zahl)
|
||||||
|
- Added: Sector movement that causes deep water to change its height now
|
||||||
|
will trigger associated sector actions and adjust the actor's water level.
|
||||||
- Fixed: The serializer for side_t::part never read the texture information
|
- Fixed: The serializer for side_t::part never read the texture information
|
||||||
from a savegame.
|
from a savegame.
|
||||||
- Fixed: side_t::StopInterpolation called setinterpolation instead of
|
- Fixed: side_t::StopInterpolation called setinterpolation instead of
|
||||||
|
|
|
@ -152,11 +152,11 @@ DMover::EResult DMover::MovePlane (fixed_t speed, fixed_t dest, int crush,
|
||||||
if (!MoveAttached(crush, move, 0, true)) return crushed;
|
if (!MoveAttached(crush, move, 0, true)) return crushed;
|
||||||
|
|
||||||
m_Sector->floorplane.d = dest;
|
m_Sector->floorplane.d = dest;
|
||||||
flag = P_ChangeSector (m_Sector, crush, move, 0);
|
flag = P_ChangeSector (m_Sector, crush, move, 0, false);
|
||||||
if (flag)
|
if (flag)
|
||||||
{
|
{
|
||||||
m_Sector->floorplane.d = lastpos;
|
m_Sector->floorplane.d = lastpos;
|
||||||
P_ChangeSector (m_Sector, crush, -move, 0);
|
P_ChangeSector (m_Sector, crush, -move, 0, true);
|
||||||
MoveAttached(crush, -move, 0, false);
|
MoveAttached(crush, -move, 0, false);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -172,11 +172,11 @@ DMover::EResult DMover::MovePlane (fixed_t speed, fixed_t dest, int crush,
|
||||||
|
|
||||||
m_Sector->floorplane.d = movedest;
|
m_Sector->floorplane.d = movedest;
|
||||||
|
|
||||||
flag = P_ChangeSector (m_Sector, crush, -speed, 0);
|
flag = P_ChangeSector (m_Sector, crush, -speed, 0, false);
|
||||||
if (flag)
|
if (flag)
|
||||||
{
|
{
|
||||||
m_Sector->floorplane.d = lastpos;
|
m_Sector->floorplane.d = lastpos;
|
||||||
P_ChangeSector (m_Sector, crush, speed, 0);
|
P_ChangeSector (m_Sector, crush, speed, 0, true);
|
||||||
MoveAttached(crush, speed, 0, false);
|
MoveAttached(crush, speed, 0, false);
|
||||||
return crushed;
|
return crushed;
|
||||||
}
|
}
|
||||||
|
@ -210,11 +210,11 @@ DMover::EResult DMover::MovePlane (fixed_t speed, fixed_t dest, int crush,
|
||||||
|
|
||||||
m_Sector->floorplane.d = dest;
|
m_Sector->floorplane.d = dest;
|
||||||
|
|
||||||
flag = P_ChangeSector (m_Sector, crush, move, 0);
|
flag = P_ChangeSector (m_Sector, crush, move, 0, false);
|
||||||
if (flag)
|
if (flag)
|
||||||
{
|
{
|
||||||
m_Sector->floorplane.d = lastpos;
|
m_Sector->floorplane.d = lastpos;
|
||||||
P_ChangeSector (m_Sector, crush, -move, 0);
|
P_ChangeSector (m_Sector, crush, -move, 0, true);
|
||||||
MoveAttached(crush, -move, 0, false);
|
MoveAttached(crush, -move, 0, false);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -231,7 +231,7 @@ DMover::EResult DMover::MovePlane (fixed_t speed, fixed_t dest, int crush,
|
||||||
m_Sector->floorplane.d = movedest;
|
m_Sector->floorplane.d = movedest;
|
||||||
|
|
||||||
// COULD GET CRUSHED
|
// COULD GET CRUSHED
|
||||||
flag = P_ChangeSector (m_Sector, crush, speed, 0);
|
flag = P_ChangeSector (m_Sector, crush, speed, 0, false);
|
||||||
if (flag)
|
if (flag)
|
||||||
{
|
{
|
||||||
if (crush >= 0 && !hexencrush)
|
if (crush >= 0 && !hexencrush)
|
||||||
|
@ -241,7 +241,7 @@ DMover::EResult DMover::MovePlane (fixed_t speed, fixed_t dest, int crush,
|
||||||
return crushed;
|
return crushed;
|
||||||
}
|
}
|
||||||
m_Sector->floorplane.d = lastpos;
|
m_Sector->floorplane.d = lastpos;
|
||||||
P_ChangeSector (m_Sector, crush, -speed, 0);
|
P_ChangeSector (m_Sector, crush, -speed, 0, true);
|
||||||
MoveAttached(crush, -speed, 0, false);
|
MoveAttached(crush, -speed, 0, false);
|
||||||
return crushed;
|
return crushed;
|
||||||
}
|
}
|
||||||
|
@ -276,12 +276,12 @@ DMover::EResult DMover::MovePlane (fixed_t speed, fixed_t dest, int crush,
|
||||||
if (!MoveAttached(crush, move, 1, true)) return crushed;
|
if (!MoveAttached(crush, move, 1, true)) return crushed;
|
||||||
|
|
||||||
m_Sector->ceilingplane.d = dest;
|
m_Sector->ceilingplane.d = dest;
|
||||||
flag = P_ChangeSector (m_Sector, crush, move, 1);
|
flag = P_ChangeSector (m_Sector, crush, move, 1, false);
|
||||||
|
|
||||||
if (flag)
|
if (flag)
|
||||||
{
|
{
|
||||||
m_Sector->ceilingplane.d = lastpos;
|
m_Sector->ceilingplane.d = lastpos;
|
||||||
P_ChangeSector (m_Sector, crush, -move, 1);
|
P_ChangeSector (m_Sector, crush, -move, 1, true);
|
||||||
MoveAttached(crush, -move, 1, false);
|
MoveAttached(crush, -move, 1, false);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -297,7 +297,7 @@ DMover::EResult DMover::MovePlane (fixed_t speed, fixed_t dest, int crush,
|
||||||
m_Sector->ceilingplane.d = movedest;
|
m_Sector->ceilingplane.d = movedest;
|
||||||
|
|
||||||
// COULD GET CRUSHED
|
// COULD GET CRUSHED
|
||||||
flag = P_ChangeSector (m_Sector, crush, -speed, 1);
|
flag = P_ChangeSector (m_Sector, crush, -speed, 1, false);
|
||||||
if (flag)
|
if (flag)
|
||||||
{
|
{
|
||||||
if (crush >= 0 && !hexencrush)
|
if (crush >= 0 && !hexencrush)
|
||||||
|
@ -306,7 +306,7 @@ DMover::EResult DMover::MovePlane (fixed_t speed, fixed_t dest, int crush,
|
||||||
return crushed;
|
return crushed;
|
||||||
}
|
}
|
||||||
m_Sector->ceilingplane.d = lastpos;
|
m_Sector->ceilingplane.d = lastpos;
|
||||||
P_ChangeSector (m_Sector, crush, speed, 1);
|
P_ChangeSector (m_Sector, crush, speed, 1, true);
|
||||||
MoveAttached(crush, speed, 1, false);
|
MoveAttached(crush, speed, 1, false);
|
||||||
return crushed;
|
return crushed;
|
||||||
}
|
}
|
||||||
|
@ -325,11 +325,11 @@ DMover::EResult DMover::MovePlane (fixed_t speed, fixed_t dest, int crush,
|
||||||
|
|
||||||
m_Sector->ceilingplane.d = dest;
|
m_Sector->ceilingplane.d = dest;
|
||||||
|
|
||||||
flag = P_ChangeSector (m_Sector, crush, move, 1);
|
flag = P_ChangeSector (m_Sector, crush, move, 1, false);
|
||||||
if (flag)
|
if (flag)
|
||||||
{
|
{
|
||||||
m_Sector->ceilingplane.d = lastpos;
|
m_Sector->ceilingplane.d = lastpos;
|
||||||
P_ChangeSector (m_Sector, crush, move, 1);
|
P_ChangeSector (m_Sector, crush, move, 1, true);
|
||||||
MoveAttached(crush, move, 1, false);
|
MoveAttached(crush, move, 1, false);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -344,11 +344,11 @@ DMover::EResult DMover::MovePlane (fixed_t speed, fixed_t dest, int crush,
|
||||||
|
|
||||||
m_Sector->ceilingplane.d = movedest;
|
m_Sector->ceilingplane.d = movedest;
|
||||||
|
|
||||||
flag = P_ChangeSector (m_Sector, crush, speed, 1);
|
flag = P_ChangeSector (m_Sector, crush, speed, 1, false);
|
||||||
if (flag)
|
if (flag)
|
||||||
{
|
{
|
||||||
m_Sector->ceilingplane.d = lastpos;
|
m_Sector->ceilingplane.d = lastpos;
|
||||||
P_ChangeSector (m_Sector, crush, -speed, 1);
|
P_ChangeSector (m_Sector, crush, -speed, 1, true);
|
||||||
MoveAttached(crush, -speed, 1, false);
|
MoveAttached(crush, -speed, 1, false);
|
||||||
return crushed;
|
return crushed;
|
||||||
}
|
}
|
||||||
|
|
|
@ -66,7 +66,7 @@ bool P_Scroll3dMidtex(sector_t *sector, int crush, fixed_t move, bool ceiling)
|
||||||
|
|
||||||
for(unsigned i = 0; i < scrollplane.AttachedSectors.Size(); i++)
|
for(unsigned i = 0; i < scrollplane.AttachedSectors.Size(); i++)
|
||||||
{
|
{
|
||||||
res |= P_ChangeSector(scrollplane.AttachedSectors[i], crush, move, 2);
|
res |= P_ChangeSector(scrollplane.AttachedSectors[i], crush, move, 2, true);
|
||||||
}
|
}
|
||||||
return !res;
|
return !res;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1112,7 +1112,7 @@ void DWaggleBase::DoWaggle (bool ceiling)
|
||||||
dist = FixedMul (m_OriginalDist - plane->d, plane->ic);
|
dist = FixedMul (m_OriginalDist - plane->d, plane->ic);
|
||||||
*texz -= plane->HeightDiff (m_OriginalDist);
|
*texz -= plane->HeightDiff (m_OriginalDist);
|
||||||
plane->d = m_OriginalDist;
|
plane->d = m_OriginalDist;
|
||||||
P_ChangeSector (m_Sector, true, dist, ceiling);
|
P_ChangeSector (m_Sector, true, dist, ceiling, false);
|
||||||
if (ceiling)
|
if (ceiling)
|
||||||
{
|
{
|
||||||
m_Sector->ceilingdata = NULL;
|
m_Sector->ceilingdata = NULL;
|
||||||
|
@ -1144,7 +1144,7 @@ void DWaggleBase::DoWaggle (bool ceiling)
|
||||||
FixedMul (FloatBobOffsets[(m_Accumulator>>FRACBITS)&63], m_Scale));
|
FixedMul (FloatBobOffsets[(m_Accumulator>>FRACBITS)&63], m_Scale));
|
||||||
*texz += plane->HeightDiff (dist);
|
*texz += plane->HeightDiff (dist);
|
||||||
dist = plane->HeightDiff (dist);
|
dist = plane->HeightDiff (dist);
|
||||||
P_ChangeSector (m_Sector, true, dist, ceiling);
|
P_ChangeSector (m_Sector, true, dist, ceiling, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
|
|
@ -94,7 +94,7 @@ static bool MoveCeiling(sector_t *sector, int crush, fixed_t move)
|
||||||
sector->ceilingplane.ChangeHeight (move);
|
sector->ceilingplane.ChangeHeight (move);
|
||||||
sector->ceilingtexz += move;
|
sector->ceilingtexz += move;
|
||||||
|
|
||||||
if (P_ChangeSector(sector, crush, move, 1)) return false;
|
if (P_ChangeSector(sector, crush, move, 1, true)) return false;
|
||||||
|
|
||||||
// Don't let the ceiling go below the floor
|
// Don't let the ceiling go below the floor
|
||||||
if ((sector->ceilingplane.a | sector->ceilingplane.b |
|
if ((sector->ceilingplane.a | sector->ceilingplane.b |
|
||||||
|
@ -109,7 +109,7 @@ static bool MoveFloor(sector_t *sector, int crush, fixed_t move)
|
||||||
sector->floorplane.ChangeHeight (move);
|
sector->floorplane.ChangeHeight (move);
|
||||||
sector->floortexz += move;
|
sector->floortexz += move;
|
||||||
|
|
||||||
if (P_ChangeSector(sector, crush, move, 0)) return false;
|
if (P_ChangeSector(sector, crush, move, 0, true)) return false;
|
||||||
|
|
||||||
// Don't let the floor go above the ceiling
|
// Don't let the floor go above the ceiling
|
||||||
if ((sector->ceilingplane.a | sector->ceilingplane.b |
|
if ((sector->ceilingplane.a | sector->ceilingplane.b |
|
||||||
|
|
|
@ -302,7 +302,7 @@ bool P_UsePuzzleItem (AActor *actor, int itemType);
|
||||||
void PIT_ThrustSpike (AActor *actor);
|
void PIT_ThrustSpike (AActor *actor);
|
||||||
void P_FindFloorCeiling (AActor *actor);
|
void P_FindFloorCeiling (AActor *actor);
|
||||||
|
|
||||||
bool P_ChangeSector (sector_t* sector, int crunch, int amt, int floorOrCeil);
|
bool P_ChangeSector (sector_t* sector, int crunch, int amt, int floorOrCeil, bool isreset);
|
||||||
|
|
||||||
extern AActor* linetarget; // who got hit (or NULL)
|
extern AActor* linetarget; // who got hit (or NULL)
|
||||||
|
|
||||||
|
|
|
@ -4406,7 +4406,7 @@ void PIT_CeilingRaise (AActor *thing, FChangePosition *cpos)
|
||||||
//
|
//
|
||||||
//=============================================================================
|
//=============================================================================
|
||||||
|
|
||||||
bool P_ChangeSector (sector_t *sector, int crunch, int amt, int floorOrCeil)
|
bool P_ChangeSector (sector_t *sector, int crunch, int amt, int floorOrCeil, bool isreset)
|
||||||
{
|
{
|
||||||
FChangePosition cpos;
|
FChangePosition cpos;
|
||||||
void (*iterator)(AActor *, FChangePosition *);
|
void (*iterator)(AActor *, FChangePosition *);
|
||||||
|
@ -4478,6 +4478,37 @@ bool P_ChangeSector (sector_t *sector, int crunch, int amt, int floorOrCeil)
|
||||||
}
|
}
|
||||||
} while (n); // repeat from scratch until all things left are marked valid
|
} while (n); // repeat from scratch until all things left are marked valid
|
||||||
|
|
||||||
|
if (!cpos.nofit && !isreset /* && sector->MoreFlags & (SECF_UNDERWATERMASK)*/)
|
||||||
|
{
|
||||||
|
// If this is a control sector for a deep water transfer, all actors in affected
|
||||||
|
// sectors need to have their waterlevel information updated and if applicable,
|
||||||
|
// execute appropriate sector actions.
|
||||||
|
// Only check if the sector move was successful.
|
||||||
|
TArray<sector_t *> & secs = sector->e->FakeFloor.Sectors;
|
||||||
|
for(unsigned i = 0; i < secs.Size(); i++)
|
||||||
|
{
|
||||||
|
sector_t * s = secs[i];
|
||||||
|
|
||||||
|
for (n = s->touching_thinglist; n; n = n->m_snext)
|
||||||
|
n->visited = false;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
for (n = s->touching_thinglist; n; n = n->m_snext) // go through list
|
||||||
|
{
|
||||||
|
if (!n->visited && n->m_thing->Sector == s) // unprocessed thing found
|
||||||
|
{
|
||||||
|
n->visited = true; // mark thing as processed
|
||||||
|
|
||||||
|
n->m_thing->UpdateWaterLevel(n->m_thing->z, false);
|
||||||
|
P_CheckFakeFloorTriggers(n->m_thing, n->m_thing->z - amt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} while (n); // repeat from scratch until all things left are marked valid
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
return cpos.nofit;
|
return cpos.nofit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -398,7 +398,8 @@ void P_SerializeWorld (FArchive &arc)
|
||||||
|
|
||||||
void extsector_t::Serialize(FArchive &arc)
|
void extsector_t::Serialize(FArchive &arc)
|
||||||
{
|
{
|
||||||
arc << Midtex.Floor.AttachedLines
|
arc << FakeFloor.Sectors
|
||||||
|
<< Midtex.Floor.AttachedLines
|
||||||
<< Midtex.Floor.AttachedSectors
|
<< Midtex.Floor.AttachedSectors
|
||||||
<< Midtex.Ceiling.AttachedLines
|
<< Midtex.Ceiling.AttachedLines
|
||||||
<< Midtex.Ceiling.AttachedSectors
|
<< Midtex.Ceiling.AttachedSectors
|
||||||
|
|
|
@ -980,6 +980,7 @@ void P_SpawnSpecials (void)
|
||||||
for (s = -1; (s = P_FindSectorFromTag(lines[i].args[0],s)) >= 0;)
|
for (s = -1; (s = P_FindSectorFromTag(lines[i].args[0],s)) >= 0;)
|
||||||
{
|
{
|
||||||
sectors[s].heightsec = sec;
|
sectors[s].heightsec = sec;
|
||||||
|
sec->e->FakeFloor.Sectors.Push(§ors[s]);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -279,6 +279,12 @@ struct FLinkedSector
|
||||||
|
|
||||||
struct extsector_t
|
struct extsector_t
|
||||||
{
|
{
|
||||||
|
// Boom sector transfer information
|
||||||
|
struct fakefloor
|
||||||
|
{
|
||||||
|
TArray<sector_t *> Sectors;
|
||||||
|
} FakeFloor;
|
||||||
|
|
||||||
// 3DMIDTEX information
|
// 3DMIDTEX information
|
||||||
struct midtex
|
struct midtex
|
||||||
{
|
{
|
||||||
|
|
|
@ -75,7 +75,7 @@
|
||||||
// SAVESIG should match SAVEVER.
|
// SAVESIG should match SAVEVER.
|
||||||
|
|
||||||
// MINSAVEVER is the minimum level snapshot version that can be loaded.
|
// MINSAVEVER is the minimum level snapshot version that can be loaded.
|
||||||
#define MINSAVEVER 832
|
#define MINSAVEVER 836
|
||||||
|
|
||||||
#if SVN_REVISION_NUMBER < MINSAVEVER
|
#if SVN_REVISION_NUMBER < MINSAVEVER
|
||||||
// Never write a savegame with a version lower than what we need
|
// Never write a savegame with a version lower than what we need
|
||||||
|
|
Loading…
Reference in a new issue