mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2024-11-15 09:11:48 +00:00
Split P_CheckSector further
This commit is contained in:
parent
411b79e456
commit
afa1a9ab6a
1 changed files with 88 additions and 74 deletions
104
src/p_map.c
104
src/p_map.c
|
@ -4330,9 +4330,8 @@ static boolean PIT_ChangeSector(mobj_t *thing, boolean realcrush, boolean crunch
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static boolean P_CheckSectorHelper(sector_t *sector, boolean realcrush, boolean crunch)
|
static boolean P_CheckSectorPolyObjects(sector_t *sector, boolean realcrush, boolean crunch)
|
||||||
{
|
{
|
||||||
msecnode_t *n;
|
|
||||||
size_t i;
|
size_t i;
|
||||||
|
|
||||||
// Sal: This stupid function chain is required to fix polyobjects not being able to crush.
|
// Sal: This stupid function chain is required to fix polyobjects not being able to crush.
|
||||||
|
@ -4341,16 +4340,18 @@ static boolean P_CheckSectorHelper(sector_t *sector, boolean realcrush, boolean
|
||||||
|
|
||||||
for (i = 0; i < sector->linecount; i++)
|
for (i = 0; i < sector->linecount; i++)
|
||||||
{
|
{
|
||||||
if (sector->lines[i]->polyobj)
|
INT32 x, y;
|
||||||
{
|
|
||||||
polyobj_t *po = sector->lines[i]->polyobj;
|
polyobj_t *po = sector->lines[i]->polyobj;
|
||||||
|
|
||||||
|
if (!po)
|
||||||
|
continue;
|
||||||
if (po->validcount == validcount)
|
if (po->validcount == validcount)
|
||||||
continue; // skip if already checked
|
continue; // skip if already checked
|
||||||
if (!(po->flags & POF_SOLID))
|
if (!(po->flags & POF_SOLID))
|
||||||
continue;
|
continue;
|
||||||
if (po->lines[0]->backsector == sector) // Make sure you're currently checking the control sector
|
if (po->lines[0]->backsector != sector) // Make sure you're currently checking the control sector
|
||||||
{
|
continue;
|
||||||
INT32 x, y;
|
|
||||||
po->validcount = validcount;
|
po->validcount = validcount;
|
||||||
|
|
||||||
for (y = po->blockbox[BOXBOTTOM]; y <= po->blockbox[BOXTOP]; ++y)
|
for (y = po->blockbox[BOXBOTTOM]; y <= po->blockbox[BOXTOP]; ++y)
|
||||||
|
@ -4377,17 +4378,50 @@ static boolean P_CheckSectorHelper(sector_t *sector, boolean realcrush, boolean
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sector->numattached)
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static boolean P_CheckTouchingThinglist(sector_t *sector, boolean realcrush, boolean crunch)
|
||||||
|
{
|
||||||
|
msecnode_t *n;
|
||||||
|
|
||||||
|
for (n = sector->touching_thinglist; n; n = n->m_thinglist_next)
|
||||||
|
n->visited = false;
|
||||||
|
|
||||||
|
do
|
||||||
{
|
{
|
||||||
|
for (n = sector->touching_thinglist; n; n = n->m_thinglist_next) // go through list
|
||||||
|
{
|
||||||
|
if (n->visited)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
n->visited = true; // mark thing as processed
|
||||||
|
|
||||||
|
if (n->m_thing->flags & MF_NOBLOCKMAP) //jff 4/7/98 don't do these
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (!PIT_ChangeSector(n->m_thing, realcrush, crunch) && !realcrush) // process it
|
||||||
|
return false;
|
||||||
|
|
||||||
|
break; // exit and start over
|
||||||
|
}
|
||||||
|
} while (n); // repeat from scratch until all things left are marked valid
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static boolean P_CheckSectorFFloors(sector_t *sector, boolean realcrush, boolean crunch)
|
||||||
|
{
|
||||||
sector_t *sec;
|
sector_t *sec;
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
if (!sector->numattached)
|
||||||
|
return true;
|
||||||
|
|
||||||
for (i = 0; i < sector->numattached; i++)
|
for (i = 0; i < sector->numattached; i++)
|
||||||
{
|
{
|
||||||
sec = §ors[sector->attached[i]];
|
sec = §ors[sector->attached[i]];
|
||||||
for (n = sec->touching_thinglist; n; n = n->m_thinglist_next)
|
|
||||||
n->visited = false;
|
|
||||||
|
|
||||||
sec->moved = true;
|
sec->moved = true;
|
||||||
|
|
||||||
|
@ -4396,45 +4430,25 @@ static boolean P_CheckSectorHelper(sector_t *sector, boolean realcrush, boolean
|
||||||
if (!sector->attachedsolid[i])
|
if (!sector->attachedsolid[i])
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
do
|
if (!P_CheckTouchingThinglist(sec, realcrush, crunch))
|
||||||
{
|
|
||||||
for (n = sec->touching_thinglist; n; n = n->m_thinglist_next)
|
|
||||||
if (!n->visited)
|
|
||||||
{
|
|
||||||
n->visited = true;
|
|
||||||
if (!(n->m_thing->flags & MF_NOBLOCKMAP))
|
|
||||||
{
|
|
||||||
if (!PIT_ChangeSector(n->m_thing, realcrush, crunch) && !realcrush)
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
}
|
return true;
|
||||||
} while (n);
|
}
|
||||||
}
|
|
||||||
}
|
static boolean P_CheckSectorHelper(sector_t *sector, boolean realcrush, boolean crunch)
|
||||||
|
{
|
||||||
|
if (!P_CheckSectorPolyObjects(sector, realcrush, crunch))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!P_CheckSectorFFloors(sector, realcrush, crunch))
|
||||||
|
return false;
|
||||||
|
|
||||||
// Mark all things invalid
|
// Mark all things invalid
|
||||||
sector->moved = true;
|
sector->moved = true;
|
||||||
|
|
||||||
for (n = sector->touching_thinglist; n; n = n->m_thinglist_next)
|
return P_CheckTouchingThinglist(sector, realcrush, crunch);
|
||||||
n->visited = false;
|
|
||||||
|
|
||||||
do
|
|
||||||
{
|
|
||||||
for (n = sector->touching_thinglist; n; n = n->m_thinglist_next) // go through list
|
|
||||||
if (!n->visited) // unprocessed thing found
|
|
||||||
{
|
|
||||||
n->visited = true; // mark thing as processed
|
|
||||||
if (!(n->m_thing->flags & MF_NOBLOCKMAP)) //jff 4/7/98 don't do these
|
|
||||||
{
|
|
||||||
if (!PIT_ChangeSector(n->m_thing, realcrush, crunch) && !realcrush) // process it
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
break; // exit and start over
|
|
||||||
}
|
|
||||||
} while (n); // repeat from scratch until all things left are marked valid
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
Loading…
Reference in a new issue