This commit is contained in:
Rachael Alexanderson 2017-01-07 16:04:46 -05:00
commit 6e06adb795
60 changed files with 559 additions and 474 deletions

View File

@ -2781,14 +2781,13 @@ void AM_drawKeys ()
void AM_drawThings () void AM_drawThings ()
{ {
AMColor color; AMColor color;
int i;
AActor* t; AActor* t;
mpoint_t p; mpoint_t p;
DAngle angle; DAngle angle;
for (i=0;i<numsectors;i++) for (auto &sec : level.sectors)
{ {
t = sectors[i].thinglist; t = sec.thinglist;
while (t) while (t)
{ {
if (am_cheat > 0 || !(t->flags6 & MF6_NOTONAUTOMAP)) if (am_cheat > 0 || !(t->flags6 & MF6_NOTONAUTOMAP))

View File

@ -1189,12 +1189,12 @@ static void PrintSecretString(const char *string, bool thislevel)
{ {
if (string[1] == 'S' || string[1] == 's') if (string[1] == 'S' || string[1] == 's')
{ {
long secnum = strtol(string+2, (char**)&string, 10); auto secnum = strtoul(string+2, (char**)&string, 10);
if (*string == ';') string++; if (*string == ';') string++;
if (thislevel && secnum >= 0 && secnum < numsectors) if (thislevel && secnum < level.sectors.Size())
{ {
if (sectors[secnum].isSecret()) colstr = TEXTCOLOR_RED; if (level.sectors[secnum].isSecret()) colstr = TEXTCOLOR_RED;
else if (sectors[secnum].wasSecret()) colstr = TEXTCOLOR_GREEN; else if (level.sectors[secnum].wasSecret()) colstr = TEXTCOLOR_GREEN;
else colstr = TEXTCOLOR_ORANGE; else colstr = TEXTCOLOR_ORANGE;
} }
} }

View File

@ -530,9 +530,9 @@ void SetCompatibilityParams()
} }
case CP_SECTORFLOOROFFSET: case CP_SECTORFLOOROFFSET:
{ {
if (CompatParams[i+1] < numsectors) if ((unsigned)CompatParams[i+1] < level.sectors.Size())
{ {
sector_t *sec = &sectors[CompatParams[i+1]]; sector_t *sec = &level.sectors[CompatParams[i+1]];
const double delta = CompatParams[i + 2] / 65536.0; const double delta = CompatParams[i + 2] / 65536.0;
sec->floorplane.ChangeHeight(delta); sec->floorplane.ChangeHeight(delta);
sec->ChangePlaneTexZ(sector_t::floor, delta); sec->ChangePlaneTexZ(sector_t::floor, delta);
@ -542,10 +542,10 @@ void SetCompatibilityParams()
} }
case CP_SETSECTORSPECIAL: case CP_SETSECTORSPECIAL:
{ {
const int index = CompatParams[i + 1]; const unsigned index = CompatParams[i + 1];
if (index < numsectors) if (index < level.sectors.Size())
{ {
sectors[index].special = CompatParams[i + 2]; level.sectors[index].special = CompatParams[i + 2];
} }
i += 3; i += 3;
break; break;
@ -575,7 +575,7 @@ void SetCompatibilityParams()
} }
case CP_SETTAG: case CP_SETTAG:
{ {
if ((unsigned)CompatParams[i + 1] < (unsigned)numsectors) if ((unsigned)CompatParams[i + 1] < level.sectors.Size())
{ {
// this assumes that the sector does not have any tags yet! // this assumes that the sector does not have any tags yet!
if (CompatParams[i + 2] == 0) if (CompatParams[i + 2] == 0)

View File

@ -479,19 +479,16 @@ size_t DObject::StaticPointerSubstitution (DObject *old, DObject *notOld, bool s
} }
// Go through sectors. // Go through sectors.
if (sectors != NULL) for (auto &sec : level.sectors)
{ {
for (i = 0; i < numsectors; ++i)
{
#define SECTOR_CHECK(f,t) \ #define SECTOR_CHECK(f,t) \
if (sectors[i].f.p == static_cast<t *>(old)) { sectors[i].f = static_cast<t *>(notOld); changed++; } if (sec.f.p == static_cast<t *>(old)) { sec.f = static_cast<t *>(notOld); changed++; }
SECTOR_CHECK( SoundTarget, AActor ); SECTOR_CHECK( SoundTarget, AActor );
SECTOR_CHECK( SecActTarget, ASectorAction ); SECTOR_CHECK( SecActTarget, ASectorAction );
SECTOR_CHECK( floordata, DSectorEffect ); SECTOR_CHECK( floordata, DSectorEffect );
SECTOR_CHECK( ceilingdata, DSectorEffect ); SECTOR_CHECK( ceilingdata, DSectorEffect );
SECTOR_CHECK( lightingdata, DSectorEffect ); SECTOR_CHECK( lightingdata, DSectorEffect );
#undef SECTOR_CHECK #undef SECTOR_CHECK
}
} }
// Go through bot stuff. // Go through bot stuff.

View File

@ -346,13 +346,13 @@ static void MarkRoot()
// Mark sound sequences. // Mark sound sequences.
DSeqNode::StaticMarkHead(); DSeqNode::StaticMarkHead();
// Mark sectors. // Mark sectors.
if (SectorMarker == NULL && sectors != NULL) if (SectorMarker == nullptr && level.sectors.Size() > 0)
{ {
SectorMarker = new DSectorMarker; SectorMarker = new DSectorMarker;
} }
else if (sectors == NULL) else if (level.sectors.Size() == 0)
{ {
SectorMarker = NULL; SectorMarker = nullptr;
} }
else else
{ {
@ -677,26 +677,25 @@ size_t DSectorMarker::PropagateMark()
int i; int i;
int marked = 0; int marked = 0;
bool moretodo = false; bool moretodo = false;
int numsectors = level.sectors.Size();
if (sectors != NULL) for (i = 0; i < SECTORSTEPSIZE && SecNum + i < numsectors; ++i)
{ {
for (i = 0; i < SECTORSTEPSIZE && SecNum + i < numsectors; ++i) sector_t *sec = &level.sectors[SecNum + i];
{ GC::Mark(sec->SoundTarget);
sector_t *sec = &sectors[SecNum + i]; GC::Mark(sec->SecActTarget);
GC::Mark(sec->SoundTarget); GC::Mark(sec->floordata);
GC::Mark(sec->SecActTarget); GC::Mark(sec->ceilingdata);
GC::Mark(sec->floordata); GC::Mark(sec->lightingdata);
GC::Mark(sec->ceilingdata); for(int j=0;j<4;j++) GC::Mark(sec->interpolations[j]);
GC::Mark(sec->lightingdata);
for(int j=0;j<4;j++) GC::Mark(sec->interpolations[j]);
}
marked += i * sizeof(sector_t);
if (SecNum + i < numsectors)
{
SecNum += i;
moretodo = true;
}
} }
marked += i * sizeof(sector_t);
if (SecNum + i < numsectors)
{
SecNum += i;
moretodo = true;
}
if (!moretodo && polyobjs != NULL) if (!moretodo && polyobjs != NULL)
{ {
for (i = 0; i < POLYSTEPSIZE && PolyNum + i < po_NumPolyobjs; ++i) for (i = 0; i < POLYSTEPSIZE && PolyNum + i < po_NumPolyobjs; ++i)

View File

@ -753,27 +753,26 @@ void ProcessEDSector(sector_t *sec, int recordnum)
void ProcessEDSectors() void ProcessEDSectors()
{ {
int i;
InitED(); InitED();
if (EDSectors.CountUsed() == 0) return; // don't waste time if there's no records. if (EDSectors.CountUsed() == 0) return; // don't waste time if there's no records.
// collect all Extradata sector records up front so we do not need to search the complete line array for each sector separately. // collect all Extradata sector records up front so we do not need to search the complete line array for each sector separately.
auto numsectors = level.sectors.Size();
int *sectorrecord = new int[numsectors]; int *sectorrecord = new int[numsectors];
memset(sectorrecord, -1, numsectors * sizeof(int)); memset(sectorrecord, -1, numsectors * sizeof(int));
for (i = 0; i < numlines; i++) for (int i = 0; i < numlines; i++)
{ {
if (lines[i].special == Static_Init && lines[i].args[1] == Init_EDSector) if (lines[i].special == Static_Init && lines[i].args[1] == Init_EDSector)
{ {
sectorrecord[lines[i].frontsector - sectors] = lines[i].args[0]; sectorrecord[lines[i].frontsector->Index()] = lines[i].args[0];
lines[i].special = 0; lines[i].special = 0;
} }
} }
for (i = 0; i < numsectors; i++) for (unsigned i = 0; i < numsectors; i++)
{ {
if (sectorrecord[i] >= 0) if (sectorrecord[i] >= 0)
{ {
ProcessEDSector(&sectors[i], sectorrecord[i]); ProcessEDSector(&level.sectors[i], sectorrecord[i]);
} }
} }
delete[] sectorrecord; delete[] sectorrecord;

View File

@ -321,7 +321,7 @@ public:
if (tag < 0) if (tag < 0)
{ {
searchtag = INT_MIN; searchtag = INT_MIN;
start = tag == -32768? 0 : -tag < numsectors? -tag : -1; start = tag == -32768? 0 : -tag < (int)level.sectors.Size()? -tag : -1;
} }
} }
}; };
@ -1531,7 +1531,7 @@ void FParser::SF_StartSectorSound(void)
FSSectorTagIterator itr(tagnum); FSSectorTagIterator itr(tagnum);
while ((i = itr.Next()) >= 0) while ((i = itr.Next()) >= 0)
{ {
sector = &sectors[i]; sector = &level.sectors[i];
S_Sound(sector, CHAN_BODY, T_FindSound(stringvalue(t_argv[1])), 1.0f, ATTN_NORM); S_Sound(sector, CHAN_BODY, T_FindSound(stringvalue(t_argv[1])), 1.0f, ATTN_NORM);
} }
} }
@ -1568,13 +1568,14 @@ void FParser::SF_FloorHeight(void)
FSSectorTagIterator itr(tagnum); FSSectorTagIterator itr(tagnum);
while ((i = itr.Next()) >= 0) while ((i = itr.Next()) >= 0)
{ {
if (sectors[i].floordata) continue; // don't move floors that are active! auto &sec = level.sectors[i];
if (sec.floordata) continue; // don't move floors that are active!
if (sectors[i].MoveFloor( if (sec.MoveFloor(
fabs(dest - sectors[i].CenterFloor()), fabs(dest - sec.CenterFloor()),
sectors[i].floorplane.PointToDist (sectors[i].centerspot, dest), sec.floorplane.PointToDist (sec.centerspot, dest),
crush? 10:-1, crush? 10:-1,
(dest > sectors[i].CenterFloor()) ? 1 : -1, (dest > sec.CenterFloor()) ? 1 : -1,
false) == EMoveResult::crushed) false) == EMoveResult::crushed)
{ {
returnval = 0; returnval = 0;
@ -1589,7 +1590,7 @@ void FParser::SF_FloorHeight(void)
script_error("sector not found with tagnum %i\n", tagnum); script_error("sector not found with tagnum %i\n", tagnum);
return; return;
} }
returnval = sectors[secnum].CenterFloor(); returnval = level.sectors[secnum].CenterFloor();
} }
// return floor height // return floor height
@ -1622,7 +1623,7 @@ void FParser::SF_MoveFloor(void)
FSSectorTagIterator itr(tagnum); FSSectorTagIterator itr(tagnum);
while ((secnum = itr.Next()) >= 0) while ((secnum = itr.Next()) >= 0)
{ {
P_CreateFloor(&sectors[secnum], DFloor::floorMoveToValue, NULL, platspeed, destheight, crush, 0, false, false); P_CreateFloor(&level.sectors[secnum], DFloor::floorMoveToValue, NULL, platspeed, destheight, crush, 0, false, false);
} }
} }
} }
@ -1657,13 +1658,14 @@ void FParser::SF_CeilingHeight(void)
FSSectorTagIterator itr(tagnum); FSSectorTagIterator itr(tagnum);
while ((i = itr.Next()) >= 0) while ((i = itr.Next()) >= 0)
{ {
if (sectors[i].ceilingdata) continue; // don't move ceilings that are active! auto &sec = level.sectors[i];
if (sec.ceilingdata) continue; // don't move ceilings that are active!
if (sectors[i].MoveCeiling( if (sec.MoveCeiling(
fabs(dest - sectors[i].CenterCeiling()), fabs(dest - sec.CenterCeiling()),
sectors[i].ceilingplane.PointToDist (sectors[i].centerspot, dest), sec.ceilingplane.PointToDist (sec.centerspot, dest),
crush? 10:-1, crush? 10:-1,
(dest > sectors[i].CenterCeiling()) ? 1 : -1, (dest > sec.CenterCeiling()) ? 1 : -1,
false) == EMoveResult::crushed) false) == EMoveResult::crushed)
{ {
returnval = 0; returnval = 0;
@ -1678,7 +1680,7 @@ void FParser::SF_CeilingHeight(void)
script_error("sector not found with tagnum %i\n", tagnum); script_error("sector not found with tagnum %i\n", tagnum);
return; return;
} }
returnval = sectors[secnum].CenterCeiling(); returnval = level.sectors[secnum].CenterCeiling();
} }
// return ceiling height // return ceiling height
@ -1713,7 +1715,7 @@ void FParser::SF_MoveCeiling(void)
FSSectorTagIterator itr(tagnum); FSSectorTagIterator itr(tagnum);
while ((secnum = itr.Next()) >= 0) while ((secnum = itr.Next()) >= 0)
{ {
P_CreateCeiling(&sectors[secnum], DCeiling::ceilMoveToValue, NULL, tagnum, platspeed, platspeed, destheight, crush, silent | 4, 0, DCeiling::ECrushMode::crushDoom); P_CreateCeiling(&level.sectors[secnum], DCeiling::ceilMoveToValue, NULL, tagnum, platspeed, platspeed, destheight, crush, silent | 4, 0, DCeiling::ECrushMode::crushDoom);
} }
} }
} }
@ -1742,7 +1744,7 @@ void FParser::SF_LightLevel(void)
return; return;
} }
sector = &sectors[secnum]; sector = &level.sectors[secnum];
if(t_argc > 1) // > 1: set light level if(t_argc > 1) // > 1: set light level
{ {
@ -1752,7 +1754,7 @@ void FParser::SF_LightLevel(void)
FSSectorTagIterator itr(tagnum); FSSectorTagIterator itr(tagnum);
while ((i = itr.Next()) >= 0) while ((i = itr.Next()) >= 0)
{ {
sectors[i].SetLightLevel(intvalue(t_argv[1])); level.sectors[i].SetLightLevel(intvalue(t_argv[1]));
} }
} }
@ -1870,7 +1872,7 @@ void FParser::SF_FadeLight(void)
FSectorTagIterator it(sectag); FSectorTagIterator it(sectag);
while ((i = it.Next()) >= 0) while ((i = it.Next()) >= 0)
{ {
if (!sectors[i].lightingdata) new DLightLevel(&sectors[i],destlevel,speed); if (!level.sectors[i].lightingdata) new DLightLevel(&level.sectors[i],destlevel,speed);
} }
} }
} }
@ -1895,7 +1897,7 @@ void FParser::SF_FloorTexture(void)
if(secnum < 0) if(secnum < 0)
{ script_error("sector not found with tagnum %i\n", tagnum); return;} { script_error("sector not found with tagnum %i\n", tagnum); return;}
sector = &sectors[secnum]; sector = &level.sectors[secnum];
if(t_argc > 1) if(t_argc > 1)
{ {
@ -1906,7 +1908,7 @@ void FParser::SF_FloorTexture(void)
FSSectorTagIterator itr(tagnum); FSSectorTagIterator itr(tagnum);
while ((i = itr.Next()) >= 0) while ((i = itr.Next()) >= 0)
{ {
sectors[i].SetTexture(sector_t::floor, picnum); level.sectors[i].SetTexture(sector_t::floor, picnum);
} }
} }
@ -1947,7 +1949,7 @@ void FParser::SF_SectorColormap(void)
if(secnum < 0) if(secnum < 0)
{ script_error("sector not found with tagnum %i\n", tagnum); return;} { script_error("sector not found with tagnum %i\n", tagnum); return;}
sector = &sectors[secnum]; sector = &level.sectors[secnum];
if (t_argv[1].type==svt_string) if (t_argv[1].type==svt_string)
{ {
@ -1957,7 +1959,7 @@ void FParser::SF_SectorColormap(void)
while ((i = itr.Next()) >= 0) while ((i = itr.Next()) >= 0)
{ {
sectors[i].midmap=cm; sectors[i].midmap=cm;
sectors[i].heightsec=&sectors[i]; sectors[i].heightsec=&level.sectors[i];
} }
} }
*/ */
@ -1985,7 +1987,7 @@ void FParser::SF_CeilingTexture(void)
if(secnum < 0) if(secnum < 0)
{ script_error("sector not found with tagnum %i\n", tagnum); return;} { script_error("sector not found with tagnum %i\n", tagnum); return;}
sector = &sectors[secnum]; sector = &level.sectors[secnum];
if(t_argc > 1) if(t_argc > 1)
{ {
@ -1996,7 +1998,7 @@ void FParser::SF_CeilingTexture(void)
FSSectorTagIterator itr(tagnum); FSSectorTagIterator itr(tagnum);
while ((i = itr.Next()) >= 0) while ((i = itr.Next()) >= 0)
{ {
sectors[i].SetTexture(sector_t::ceiling, picnum); level.sectors[i].SetTexture(sector_t::ceiling, picnum);
} }
} }
@ -3888,7 +3890,7 @@ void FParser::SF_SetColor(void)
FSSectorTagIterator itr(tagnum); FSSectorTagIterator itr(tagnum);
while ((i = itr.Next()) >= 0) while ((i = itr.Next()) >= 0)
{ {
sectors[i].ColorMap = GetSpecialLights (color, sectors[i].ColorMap->Fade, 0); level.sectors[i].ColorMap = GetSpecialLights (color, level.sectors[i].ColorMap->Fade, 0);
} }
} }
} }

View File

@ -489,7 +489,7 @@ bool DFraggleThinker::wait_finished(DRunningScript *script)
FSectorTagIterator itr(script->wait_data); FSectorTagIterator itr(script->wait_data);
while ((secnum = itr.Next()) >= 0) while ((secnum = itr.Next()) >= 0)
{ {
sector_t *sec = &sectors[secnum]; sector_t *sec = &level.sectors[secnum];
if(sec->floordata || sec->ceilingdata || sec->lightingdata) if(sec->floordata || sec->ceilingdata || sec->lightingdata)
return false; // not finished return false; // not finished
} }

View File

@ -2241,7 +2241,7 @@ void G_DoSaveGame (bool okForQuicksave, FString filename, const char *descriptio
// Do not even try, if we're not in a level. (Can happen after // Do not even try, if we're not in a level. (Can happen after
// a demo finishes playback.) // a demo finishes playback.)
if (lines == NULL || sectors == NULL || gamestate != GS_LEVEL) if (lines == NULL || level.sectors.Size() == 0 || gamestate != GS_LEVEL)
{ {
return; return;
} }
@ -2801,7 +2801,7 @@ void G_DoPlayDemo (void)
{ {
G_InitNew (mapname, false); G_InitNew (mapname, false);
} }
else if (numsectors == 0) else if (level.sectors.Size() == 0)
{ {
I_Error("Cannot play demo without its savegame\n"); I_Error("Cannot play demo without its savegame\n");
} }

View File

@ -1842,8 +1842,8 @@ void FLevelLocals::AddScroller (int secnum)
} }
if (Scrolls.Size() == 0) if (Scrolls.Size() == 0)
{ {
Scrolls.Resize(numsectors); Scrolls.Resize(sectors.Size());
memset (&Scrolls[0], 0, sizeof(Scrolls[0])*numsectors); memset(&Scrolls[0], 0, sizeof(Scrolls[0])*Scrolls.Size());
} }
} }

View File

@ -400,6 +400,8 @@ struct FLevelLocals
FString NextSecretMap; // map to go to when used secret exit FString NextSecretMap; // map to go to when used secret exit
EMapType maptype; EMapType maptype;
TStaticArray<sector_t> sectors;
DWORD flags; DWORD flags;
DWORD flags2; DWORD flags2;
DWORD flags3; DWORD flags3;
@ -446,7 +448,6 @@ struct FLevelLocals
bool IsFreelookAllowed() const; bool IsFreelookAllowed() const;
}; };
struct cluster_info_t struct cluster_info_t
{ {
int cluster; int cluster;

View File

@ -22,8 +22,8 @@ DLightningThinker::DLightningThinker ()
LightningFlashCount = 0; LightningFlashCount = 0;
NextLightningFlash = ((pr_lightning()&15)+5)*35; // don't flash at level start NextLightningFlash = ((pr_lightning()&15)+5)*35; // don't flash at level start
LightningLightLevels.Resize(numsectors); LightningLightLevels.Resize(level.sectors.Size());
fillshort(&LightningLightLevels[0], numsectors, SHRT_MAX); fillshort(&LightningLightLevels[0], LightningLightLevels.Size(), SHRT_MAX);
} }
DLightningThinker::~DLightningThinker () DLightningThinker::~DLightningThinker ()
@ -63,8 +63,8 @@ void DLightningThinker::LightningFlash ()
LightningFlashCount--; LightningFlashCount--;
if (LightningFlashCount) if (LightningFlashCount)
{ // reduce the brightness of the flash { // reduce the brightness of the flash
tempSec = sectors; tempSec = &level.sectors[0];
for (i = numsectors, j = 0; i > 0; ++j, --i, ++tempSec) for (i = level.sectors.Size(), j = 0; i > 0; ++j, --i, ++tempSec)
{ {
// [RH] Checking this sector's applicability to lightning now // [RH] Checking this sector's applicability to lightning now
// is not enough to know if we should lower its light level, // is not enough to know if we should lower its light level,
@ -79,15 +79,15 @@ void DLightningThinker::LightningFlash ()
} }
else else
{ // remove the alternate lightning flash special { // remove the alternate lightning flash special
tempSec = sectors; tempSec = &level.sectors[0];
for (i = numsectors, j = 0; i > 0; ++j, --i, ++tempSec) for (i = level.sectors.Size(), j = 0; i > 0; ++j, --i, ++tempSec)
{ {
if (LightningLightLevels[j] != SHRT_MAX) if (LightningLightLevels[j] != SHRT_MAX)
{ {
tempSec->SetLightLevel(LightningLightLevels[j]); tempSec->SetLightLevel(LightningLightLevels[j]);
} }
} }
fillshort(&LightningLightLevels[0], numsectors, SHRT_MAX); fillshort(&LightningLightLevels[0], level.sectors.Size(), SHRT_MAX);
level.flags &= ~LEVEL_SWAPSKIES; level.flags &= ~LEVEL_SWAPSKIES;
} }
return; return;
@ -95,8 +95,8 @@ void DLightningThinker::LightningFlash ()
LightningFlashCount = (pr_lightning()&7)+8; LightningFlashCount = (pr_lightning()&7)+8;
flashLight = 200+(pr_lightning()&31); flashLight = 200+(pr_lightning()&31);
tempSec = sectors; tempSec = &level.sectors[0];
for (i = numsectors, j = 0; i > 0; --i, ++j, ++tempSec) for (i = level.sectors.Size(), j = 0; i > 0; ++j, --i, ++tempSec)
{ {
// allow combination of the lightning sector specials with bit masks // allow combination of the lightning sector specials with bit masks
int special = tempSec->special; int special = tempSec->special;

View File

@ -117,7 +117,7 @@ void ASkyPicker::PostBeginPlay ()
if (box == NULL && args[0] != 0) if (box == NULL && args[0] != 0)
{ {
Printf ("Can't find SkyViewpoint %d for sector %td\n", args[0], Sector - sectors); Printf ("Can't find SkyViewpoint %d for sector %d\n", args[0], Sector->sectornum);
} }
else else
{ {

View File

@ -154,9 +154,9 @@ int LS_Sector_SetPlaneReflection (line_t *ln, AActor *it, bool backSide,
while ((secnum = itr.Next()) >= 0) while ((secnum = itr.Next()) >= 0)
{ {
sector_t * s = &sectors[secnum]; sector_t * s = &level.sectors[secnum];
if (!s->floorplane.isSlope()) s->reflect[sector_t::floor] = arg1/255.f; if (!s->floorplane.isSlope()) s->reflect[sector_t::floor] = arg1/255.f;
if (!s->ceilingplane.isSlope()) sectors[secnum].reflect[sector_t::ceiling] = arg2/255.f; if (!s->ceilingplane.isSlope()) level.sectors[secnum].reflect[sector_t::ceiling] = arg2/255.f;
} }
return true; return true;
@ -532,14 +532,12 @@ void gl_InitData()
CCMD(dumpgeometry) CCMD(dumpgeometry)
{ {
for(int i=0;i<numsectors;i++) for(auto &sector : level.sectors)
{ {
sector_t * sector = &sectors[i]; Printf(PRINT_LOG, "Sector %d\n", sector.sectornum);
for(int j=0;j<sector.subsectorcount;j++)
Printf(PRINT_LOG, "Sector %d\n",i);
for(int j=0;j<sector->subsectorcount;j++)
{ {
subsector_t * sub = sector->subsectors[j]; subsector_t * sub = sector.subsectors[j];
Printf(PRINT_LOG, " Subsector %d - real sector = %d - %s\n", int(sub-subsectors), sub->sector->sectornum, sub->hacked&1? "hacked":""); Printf(PRINT_LOG, " Subsector %d - real sector = %d - %s\n", int(sub-subsectors), sub->sector->sectornum, sub->hacked&1? "hacked":"");
for(DWORD k=0;k<sub->numlines;k++) for(DWORD k=0;k<sub->numlines;k++)
@ -563,7 +561,7 @@ CCMD(dumpgeometry)
Printf(PRINT_LOG, ", back sector = %d, real back sector = %d", sub2->render_sector->sectornum, seg->PartnerSeg->frontsector->sectornum); Printf(PRINT_LOG, ", back sector = %d, real back sector = %d", sub2->render_sector->sectornum, seg->PartnerSeg->frontsector->sectornum);
} }
else if (seg->backsector) else if (seg->backsector)
{ {
Printf(PRINT_LOG, ", back sector = %d (no partnerseg)", seg->backsector->sectornum); Printf(PRINT_LOG, ", back sector = %d (no partnerseg)", seg->backsector->sectornum);
} }

View File

@ -337,18 +337,17 @@ void gl_BuildPortalCoverage(FPortalCoverage *coverage, subsector_t *subsector, c
static void CollectPortalSectors(FPortalMap &collection) static void CollectPortalSectors(FPortalMap &collection)
{ {
for (int i=0;i<numsectors;i++) for (auto &sec : level.sectors)
{ {
sector_t *sec = &sectors[i];
for (int j = 0; j < 2; j++) for (int j = 0; j < 2; j++)
{ {
int ptype = sec->GetPortalType(j); int ptype = sec.GetPortalType(j);
if (ptype== PORTS_STACKEDSECTORTHING || ptype == PORTS_PORTAL || ptype == PORTS_LINKEDPORTAL) // only offset-displacing portal types if (ptype== PORTS_STACKEDSECTORTHING || ptype == PORTS_PORTAL || ptype == PORTS_LINKEDPORTAL) // only offset-displacing portal types
{ {
FPortalID id = { sec->GetPortalDisplacement(j) }; FPortalID id = { sec.GetPortalDisplacement(j) };
FPortalSectors &sss = collection[id]; FPortalSectors &sss = collection[id];
FPortalSector ss = { sec, j }; FPortalSector ss = { &sec, j };
sss.Push(ss); sss.Push(ss);
} }
} }

View File

@ -257,11 +257,11 @@ static void PrepareSectorData()
ss->render_sector->subsectorcount++; ss->render_sector->subsectorcount++;
} }
for (i=0; i<numsectors; i++) for (auto &sec : level.sectors)
{ {
sectors[i].subsectors = subsectorbuffer; sec.subsectors = subsectorbuffer;
subsectorbuffer += sectors[i].subsectorcount; subsectorbuffer += sec.subsectorcount;
sectors[i].subsectorcount = 0; sec.subsectorcount = 0;
} }
for(i=0, ss = subsectors; i<numsubsectors; i++, ss++) for(i=0, ss = subsectors; i<numsubsectors; i++, ss++)
@ -307,13 +307,6 @@ static void PrepareTransparentDoors(sector_t * sector)
unsigned int selfref=0; unsigned int selfref=0;
sector_t * nextsec=NULL; sector_t * nextsec=NULL;
#ifdef _DEBUG
if (sector-sectors==34)
{
int a = 0;
}
#endif
P_Recalculate3DFloors(sector); P_Recalculate3DFloors(sector);
if (sector->subsectorcount==0) return; if (sector->subsectorcount==0) return;
@ -388,7 +381,7 @@ static void PrepareTransparentDoors(sector_t * sector)
static void AddToVertex(const sector_t * sec, TArray<int> & list) static void AddToVertex(const sector_t * sec, TArray<int> & list)
{ {
int secno = int(sec-sectors); int secno = sec->Index();
for(unsigned i=0;i<list.Size();i++) for(unsigned i=0;i<list.Size();i++)
{ {
@ -448,7 +441,7 @@ static void InitVertexData()
vertexes[i].heightlist = new float[cnt*2]; vertexes[i].heightlist = new float[cnt*2];
for(int j=0;j<cnt;j++) for(int j=0;j<cnt;j++)
{ {
vertexes[i].sectors[j] = &sectors[vt_sectorlists[i][j]]; vertexes[i].sectors[j] = &level.sectors[vt_sectorlists[i][j]];
} }
} }
else else
@ -590,20 +583,18 @@ extern int restart;
void gl_PreprocessLevel() void gl_PreprocessLevel()
{ {
int i;
PrepareSegs(); PrepareSegs();
PrepareSectorData(); PrepareSectorData();
InitVertexData(); InitVertexData();
int *checkmap = new int[numvertexes]; int *checkmap = new int[numvertexes];
memset(checkmap, -1, sizeof(int)*numvertexes); memset(checkmap, -1, sizeof(int)*numvertexes);
for(i=0;i<numsectors;i++) for(auto &sec : level.sectors)
{ {
sectors[i].sectornum = i; int i = sec.sectornum;
PrepareTransparentDoors(&sectors[i]); PrepareTransparentDoors(&sec);
// This ignores vertices only used for seg splitting because those aren't needed here // This ignores vertices only used for seg splitting because those aren't needed here
for(auto l : sectors[i].Lines) for(auto l : sec.Lines)
{ {
if (l->sidedef[0]->Flags & WALLF_POLYOBJ) continue; // don't bother with polyobjects if (l->sidedef[0]->Flags & WALLF_POLYOBJ) continue; // don't bother with polyobjects
@ -613,14 +604,14 @@ void gl_PreprocessLevel()
if (checkmap[vtnum1] < i) if (checkmap[vtnum1] < i)
{ {
checkmap[vtnum1] = i; checkmap[vtnum1] = i;
sectors[i].e->vertices.Push(&vertexes[vtnum1]); sec.e->vertices.Push(&vertexes[vtnum1]);
vertexes[vtnum1].dirty = true; vertexes[vtnum1].dirty = true;
} }
if (checkmap[vtnum2] < i) if (checkmap[vtnum2] < i)
{ {
checkmap[vtnum2] = i; checkmap[vtnum2] = i;
sectors[i].e->vertices.Push(&vertexes[vtnum2]); sec.e->vertices.Push(&vertexes[vtnum2]);
vertexes[vtnum2].dirty = true; vertexes[vtnum2].dirty = true;
} }
} }
@ -683,10 +674,10 @@ void gl_CleanLevelData()
delete [] sides[0].segs; delete [] sides[0].segs;
sides[0].segs = NULL; sides[0].segs = NULL;
} }
if (sectors && sectors[0].subsectors) if (level.sectors.Size() > 0 && level.sectors[0].subsectors)
{ {
delete [] sectors[0].subsectors; delete [] level.sectors[0].subsectors;
sectors[0].subsectors = NULL; level.sectors[0].subsectors = nullptr;
} }
for (int i=0;i<numsubsectors;i++) for (int i=0;i<numsubsectors;i++)
{ {

View File

@ -394,27 +394,25 @@ void FFlatVertexBuffer::CreateFlatVBO()
{ {
for (int h = sector_t::floor; h <= sector_t::ceiling; h++) for (int h = sector_t::floor; h <= sector_t::ceiling; h++)
{ {
for(int i=0; i<numsectors;i++) for(auto &sec : level.sectors)
{ {
CreateVertices(h, &sectors[i], sectors[i].GetSecPlane(h), h == sector_t::floor); CreateVertices(h, &sec, sec.GetSecPlane(h), h == sector_t::floor);
} }
} }
// We need to do a final check for Vavoom water and FF_FIX sectors. // We need to do a final check for Vavoom water and FF_FIX sectors.
// No new vertices are needed here. The planes come from the actual sector // No new vertices are needed here. The planes come from the actual sector
for(int i=0; i<numsectors;i++) for (auto &sec : level.sectors)
{ {
for(unsigned j=0;j<sectors[i].e->XFloor.ffloors.Size(); j++) for(auto ff : sec.e->XFloor.ffloors)
{ {
F3DFloor *ff = sectors[i].e->XFloor.ffloors[j]; if (ff->top.model == &sec)
if (ff->top.model == &sectors[i])
{ {
ff->top.vindex = sectors[i].vboindex[ff->top.isceiling]; ff->top.vindex = sec.vboindex[ff->top.isceiling];
} }
if (ff->bottom.model == &sectors[i]) if (ff->bottom.model == &sec)
{ {
ff->bottom.vindex = sectors[i].vboindex[ff->top.isceiling]; ff->bottom.vindex = sec.vboindex[ff->top.isceiling];
} }
} }
} }

View File

@ -420,7 +420,7 @@ static void DoSubsector(subsector_t * sub)
sector_t fake; sector_t fake;
#ifdef _DEBUG #ifdef _DEBUG
if (sub->sector-sectors==931) if (sub->sector->sectornum==931)
{ {
int a = 0; int a = 0;
} }

View File

@ -1043,11 +1043,11 @@ void FDrawInfo::StartScene()
{ {
ClearBuffers(); ClearBuffers();
sectorrenderflags.Resize(numsectors); sectorrenderflags.Resize(level.sectors.Size());
ss_renderflags.Resize(numsubsectors); ss_renderflags.Resize(numsubsectors);
no_renderflags.Resize(numsubsectors); no_renderflags.Resize(numsubsectors);
memset(&sectorrenderflags[0], 0, numsectors * sizeof(sectorrenderflags[0])); memset(&sectorrenderflags[0], 0, level.sectors.Size() * sizeof(sectorrenderflags[0]));
memset(&ss_renderflags[0], 0, numsubsectors * sizeof(ss_renderflags[0])); memset(&ss_renderflags[0], 0, numsubsectors * sizeof(ss_renderflags[0]));
memset(&no_renderflags[0], 0, numnodes * sizeof(no_renderflags[0])); memset(&no_renderflags[0], 0, numnodes * sizeof(no_renderflags[0]));

View File

@ -210,7 +210,7 @@ sector_t * gl_FakeFlat(sector_t * sec, sector_t * dest, area_t in_area, bool bac
} }
#ifdef _DEBUG #ifdef _DEBUG
if (sec-sectors==560) if (sec->sectornum==560)
{ {
int a = 0; int a = 0;
} }

View File

@ -582,7 +582,7 @@ void GLFlat::ProcessSector(sector_t * frontsector)
#endif #endif
// Get the real sector for this one. // Get the real sector for this one.
sector = &sectors[frontsector->sectornum]; sector = &level.sectors[frontsector->sectornum];
extsector_t::xfloor &x = sector->e->XFloor; extsector_t::xfloor &x = sector->e->XFloor;
dynlightindex = -1; dynlightindex = -1;

View File

@ -895,7 +895,7 @@ void GLSprite::Process(AActor* thing, sector_t * sector, int thruportal)
Colormap=rendersector->ColorMap; Colormap=rendersector->ColorMap;
if (fullbright) if (fullbright)
{ {
if (rendersector == &sectors[rendersector->sectornum] || in_area != area_below) if (rendersector == &level.sectors[rendersector->sectornum] || in_area != area_below)
// under water areas keep their color for fullbright objects // under water areas keep their color for fullbright objects
{ {
// Only make the light white but keep everything else (fog, desaturation and Boom colormap.) // Only make the light white but keep everything else (fog, desaturation and Boom colormap.)

View File

@ -1435,8 +1435,8 @@ void GLWall::Process(seg_t *seg, sector_t * frontsector, sector_t * backsector)
else else
{ {
// Need these for aligning the textures // Need these for aligning the textures
realfront = &sectors[frontsector->sectornum]; realfront = &level.sectors[frontsector->sectornum];
realback = backsector ? &sectors[backsector->sectornum] : NULL; realback = backsector ? &level.sectors[backsector->sectornum] : NULL;
segfront = frontsector; segfront = frontsector;
segback = backsector; segback = backsector;
} }

View File

@ -1053,7 +1053,7 @@ void FNodeBuilder::PrintSet (int l, DWORD set)
Printf (PRINT_LOG, "set %d:\n", l); Printf (PRINT_LOG, "set %d:\n", l);
for (; set != DWORD_MAX; set = Segs[set].next) for (; set != DWORD_MAX; set = Segs[set].next)
{ {
Printf (PRINT_LOG, "\t%u(%td)%c%d(%d,%d)-%d(%d,%d)\n", set, Segs[set].frontsector-sectors, Printf (PRINT_LOG, "\t%u(%td)%c%d(%d,%d)-%d(%d,%d)\n", set, Segs[set].frontsector->sectornum,
Segs[set].linedef == -1 ? '+' : ':', Segs[set].linedef == -1 ? '+' : ':',
Segs[set].v1, Segs[set].v1,
Vertices[Segs[set].v1].x>>16, Vertices[Segs[set].v1].y>>16, Vertices[Segs[set].v1].x>>16, Vertices[Segs[set].v1].y>>16,

View File

@ -224,7 +224,7 @@ static int P_Set3DFloor(line_t * line, int param, int param2, int alpha)
FSectorTagIterator itr(tag); FSectorTagIterator itr(tag);
while ((s = itr.Next()) >= 0) while ((s = itr.Next()) >= 0)
{ {
ss = &sectors[s]; ss = &level.sectors[s];
if (param == 0) if (param == 0)
{ {
@ -888,9 +888,9 @@ void P_Spawn3DFloors (void)
line->args[0] = line->args[1] = line->args[2] = line->args[3] = line->args[4] = 0; line->args[0] = line->args[1] = line->args[2] = line->args[3] = line->args[4] = 0;
} }
// kg3D - do it in software // kg3D - do it in software
for (i = 0; i < numsectors; i++) for (auto &sec : level.sectors)
{ {
P_Recalculate3DFloors(&sectors[i]); P_Recalculate3DFloors(&sec);
} }
} }
@ -984,7 +984,7 @@ CCMD (dump3df)
if (argv.argc() > 1) if (argv.argc() > 1)
{ {
int sec = strtol(argv[1], NULL, 10); int sec = strtol(argv[1], NULL, 10);
sector_t *sector = &sectors[sec]; sector_t *sector = &level.sectors[sec];
TArray<F3DFloor*> & ffloors=sector->e->XFloor.ffloors; TArray<F3DFloor*> & ffloors=sector->e->XFloor.ffloors;
for (unsigned int i = 0; i < ffloors.Size(); i++) for (unsigned int i = 0; i < ffloors.Size(); i++)

View File

@ -122,10 +122,10 @@ void P_Attach3dMidtexLinesToSector(sector_t *sector, int lineid, int tag, bool c
// Bit arrays that mark whether a line or sector is to be attached. // Bit arrays that mark whether a line or sector is to be attached.
BYTE *found_lines = new BYTE[(numlines+7)/8]; BYTE *found_lines = new BYTE[(numlines+7)/8];
BYTE *found_sectors = new BYTE[(numsectors+7)/8]; BYTE *found_sectors = new BYTE[(level.sectors.Size()+7)/8];
memset(found_lines, 0, sizeof (BYTE) * ((numlines+7)/8)); memset(found_lines, 0, sizeof (BYTE) * ((numlines+7)/8));
memset(found_sectors, 0, sizeof (BYTE) * ((numsectors+7)/8)); memset(found_sectors, 0, sizeof (BYTE) * ((level.sectors.Size()+7)/8));
// mark all lines and sectors that are already attached to this one // mark all lines and sectors that are already attached to this one
// and clear the arrays. The old data will be re-added automatically // and clear the arrays. The old data will be re-added automatically
@ -138,7 +138,7 @@ void P_Attach3dMidtexLinesToSector(sector_t *sector, int lineid, int tag, bool c
for (unsigned i=0; i < scrollplane.AttachedSectors.Size(); i++) for (unsigned i=0; i < scrollplane.AttachedSectors.Size(); i++)
{ {
int sec = int(scrollplane.AttachedSectors[i] - sectors); int sec = scrollplane.AttachedSectors[i]->sectornum;
found_sectors[sec>>3] |= 1 << (sec&7); found_sectors[sec>>3] |= 1 << (sec&7);
} }
@ -167,7 +167,7 @@ void P_Attach3dMidtexLinesToSector(sector_t *sector, int lineid, int tag, bool c
int sec; int sec;
while ((sec = it.Next()) >= 0) while ((sec = it.Next()) >= 0)
{ {
for (auto ln : sectors[sec].Lines) for (auto ln : level.sectors[sec].Lines)
{ {
if (lineid != 0 && !tagManager.LineHasID(ln, lineid)) continue; if (lineid != 0 && !tagManager.LineHasID(ln, lineid)) continue;
@ -189,21 +189,21 @@ void P_Attach3dMidtexLinesToSector(sector_t *sector, int lineid, int tag, bool c
{ {
scrollplane.AttachedLines.Push(&lines[i]); scrollplane.AttachedLines.Push(&lines[i]);
v = int(lines[i].frontsector - sectors); v = lines[i].frontsector->sectornum;
assert(v < numsectors); assert(v < (int)level.sectors.Size());
found_sectors[v>>3] |= 1 << (v&7); found_sectors[v>>3] |= 1 << (v&7);
v = int(lines[i].backsector - sectors); v = lines[i].backsector->sectornum;
assert(v < numsectors); assert(v < (int)level.sectors.Size());
found_sectors[v>>3] |= 1 << (v&7); found_sectors[v>>3] |= 1 << (v&7);
} }
} }
for (int i=0; i < numsectors; i++) for (unsigned i=0; i < level.sectors.Size(); i++)
{ {
if (found_sectors[i>>3] & (1 << (i&7))) if (found_sectors[i>>3] & (1 << (i&7)))
{ {
scrollplane.AttachedSectors.Push(&sectors[i]); scrollplane.AttachedSectors.Push(&level.sectors[i]);
} }
} }

View File

@ -1423,7 +1423,7 @@ DPlaneWatcher::DPlaneWatcher (AActor *it, line_t *line, int lineSide, bool ceili
{ {
secplane_t plane; secplane_t plane;
Sector = &sectors[secnum]; Sector = &level.sectors[secnum];
if (bCeiling) if (bCeiling)
{ {
plane = Sector->ceilingplane; plane = Sector->ceilingplane;
@ -3263,7 +3263,7 @@ void DLevelScript::ChangeFlat (int tag, int name, bool floorOrCeiling)
while ((secnum = it.Next()) >= 0) while ((secnum = it.Next()) >= 0)
{ {
int pos = floorOrCeiling? sector_t::ceiling : sector_t::floor; int pos = floorOrCeiling? sector_t::ceiling : sector_t::floor;
sectors[secnum].SetTexture(pos, flat); level.sectors[secnum].SetTexture(pos, flat);
} }
} }
@ -3351,14 +3351,12 @@ void DLevelScript::ReplaceTextures (int fromnamei, int tonamei, int flags)
picnum1 = TexMan.GetTexture (fromname, FTexture::TEX_Flat, FTextureManager::TEXMAN_Overridable); picnum1 = TexMan.GetTexture (fromname, FTexture::TEX_Flat, FTextureManager::TEXMAN_Overridable);
picnum2 = TexMan.GetTexture (toname, FTexture::TEX_Flat, FTextureManager::TEXMAN_Overridable); picnum2 = TexMan.GetTexture (toname, FTexture::TEX_Flat, FTextureManager::TEXMAN_Overridable);
for (int i = 0; i < numsectors; ++i) for (auto &sec : level.sectors)
{ {
sector_t *sec = &sectors[i]; if (!(flags & NOT_FLOOR) && sec.GetTexture(sector_t::floor) == picnum1)
sec.SetTexture(sector_t::floor, picnum2);
if (!(flags & NOT_FLOOR) && sec->GetTexture(sector_t::floor) == picnum1) if (!(flags & NOT_CEILING) && sec.GetTexture(sector_t::ceiling) == picnum1)
sec->SetTexture(sector_t::floor, picnum2); sec.SetTexture(sector_t::ceiling, picnum2);
if (!(flags & NOT_CEILING) && sec->GetTexture(sector_t::ceiling) == picnum1)
sec->SetTexture(sector_t::ceiling, picnum2);
} }
} }
} }
@ -5150,7 +5148,7 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, SDWORD *args)
int s; int s;
while ((s = it.Next()) >= 0) while ((s = it.Next()) >= 0)
{ {
SN_StartSequence(&sectors[s], args[2], seqname, 0); SN_StartSequence(&level.sectors[s], args[2], seqname, 0);
} }
} }
} }
@ -5922,7 +5920,7 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound)
int s; int s;
while ((s = it.Next()) >= 0) while ((s = it.Next()) >= 0)
{ {
sector_t *sec = &sectors[s]; sector_t *sec = &level.sectors[s];
sec->damageamount = args[1]; sec->damageamount = args[1];
sec->damagetype = argCount >= 3 ? FName(FBehavior::StaticLookupString(args[2])) : FName(NAME_None); sec->damagetype = argCount >= 3 ? FName(FBehavior::StaticLookupString(args[2])) : FName(NAME_None);
@ -5942,7 +5940,7 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound)
int s; int s;
while ((s = it.Next()) >= 0) while ((s = it.Next()) >= 0)
{ {
sectors[s].terrainnum[args[1]] = terrain; level.sectors[s].terrainnum[args[1]] = terrain;
} }
} }
} }
@ -6083,8 +6081,8 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound)
int s; int s;
while ((s = it.Next()) >= 0) while ((s = it.Next()) >= 0)
{ {
sectors[s].planes[which].GlowColor = color; level.sectors[s].planes[which].GlowColor = color;
sectors[s].planes[which].GlowHeight = height; level.sectors[s].planes[which].GlowHeight = height;
} }
break; break;
} }
@ -6096,8 +6094,9 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound)
int d = clamp(args[1]/2, 0, 255); int d = clamp(args[1]/2, 0, 255);
while ((s = it.Next()) >= 0) while ((s = it.Next()) >= 0)
{ {
auto f = sectors[s].ColorMap->Fade; auto &sec = level.sectors[s];
sectors[s].ColorMap = GetSpecialLights(sectors[s].ColorMap->Color, PalEntry(d, f.r, f.g, f.b), sectors[s].ColorMap->Desaturate); auto f = sec.ColorMap->Fade;
sec.ColorMap = GetSpecialLights(sec.ColorMap->Color, PalEntry(d, f.r, f.g, f.b), sec.ColorMap->Desaturate);
} }
break; break;
} }
@ -6227,7 +6226,7 @@ int DLevelScript::RunScript ()
FSectorTagIterator it(statedata); FSectorTagIterator it(statedata);
while ((secnum = it.Next()) >= 0) while ((secnum = it.Next()) >= 0)
{ {
if (sectors[secnum].floordata || sectors[secnum].ceilingdata) if (level.sectors[secnum].floordata || level.sectors[secnum].ceilingdata)
return resultValue; return resultValue;
} }
@ -8838,17 +8837,17 @@ scriptwait:
if (tag != 0) if (tag != 0)
secnum = P_FindFirstSectorFromTag (tag); secnum = P_FindFirstSectorFromTag (tag);
else else
secnum = int(P_PointInSector (x, y) - sectors); secnum = P_PointInSector (x, y)->sectornum;
if (secnum >= 0) if (secnum >= 0)
{ {
if (pcd == PCD_GETSECTORFLOORZ) if (pcd == PCD_GETSECTORFLOORZ)
{ {
z = sectors[secnum].floorplane.ZatPoint (x, y); z = level.sectors[secnum].floorplane.ZatPoint (x, y);
} }
else else
{ {
z = sectors[secnum].ceilingplane.ZatPoint (x, y); z = level.sectors[secnum].ceilingplane.ZatPoint (x, y);
} }
} }
sp -= 2; sp -= 2;
@ -8863,7 +8862,7 @@ scriptwait:
if (secnum >= 0) if (secnum >= 0)
{ {
z = sectors[secnum].lightlevel; z = level.sectors[secnum].lightlevel;
} }
STACK(1) = z; STACK(1) = z;
} }

View File

@ -142,7 +142,7 @@ void P_AdjustLine (line_t *line);
// PRIVATE FUNCTION PROTOTYPES --------------------------------------------- // PRIVATE FUNCTION PROTOTYPES ---------------------------------------------
static bool P_LoadBloodMap (BYTE *data, size_t len, FMapThing **sprites, int *numsprites); static bool P_LoadBloodMap (BYTE *data, size_t len, FMapThing **sprites, int *numsprites);
static void LoadSectors (sectortype *bsectors); static void LoadSectors (sectortype *bsectors, int count);
static void LoadWalls (walltype *walls, int numwalls, sectortype *bsectors); static void LoadWalls (walltype *walls, int numwalls, sectortype *bsectors);
static int LoadSprites (spritetype *sprites, Xsprite *xsprites, int numsprites, sectortype *bsectors, FMapThing *mapthings); static int LoadSprites (spritetype *sprites, Xsprite *xsprites, int numsprites, sectortype *bsectors, FMapThing *mapthings);
static vertex_t *FindVertex (SDWORD x, SDWORD y); static vertex_t *FindVertex (SDWORD x, SDWORD y);
@ -225,15 +225,14 @@ bool P_LoadBuildMap (BYTE *data, size_t len, FMapThing **sprites, int *numspr)
return false; return false;
} }
numsectors = numsec; LoadSectors ((sectortype *)(data + 22), numsec);
LoadSectors ((sectortype *)(data + 22)); LoadWalls ((walltype *)(data + 24 + numsec*sizeof(sectortype)), numwalls,
LoadWalls ((walltype *)(data + 24 + numsectors*sizeof(sectortype)), numwalls,
(sectortype *)(data + 22)); (sectortype *)(data + 22));
numsprites = *(WORD *)(data + 24 + numsectors*sizeof(sectortype) + numwalls*sizeof(walltype)); numsprites = *(WORD *)(data + 24 + numsec*sizeof(sectortype) + numwalls*sizeof(walltype));
*sprites = new FMapThing[numsprites + 1]; *sprites = new FMapThing[numsprites + 1];
CreateStartSpot ((SDWORD *)(data + 4), *sprites); CreateStartSpot ((SDWORD *)(data + 4), *sprites);
*numspr = 1 + LoadSprites ((spritetype *)(data + 26 + numsectors*sizeof(sectortype) + numwalls*sizeof(walltype)), *numspr = 1 + LoadSprites ((spritetype *)(data + 26 + numsec*sizeof(sectortype) + numwalls*sizeof(walltype)),
NULL, numsprites, (sectortype *)(data + 22), *sprites + 1); NULL, numsprites, (sectortype *)(data + 22), *sprites + 1);
return true; return true;
@ -274,7 +273,7 @@ static bool P_LoadBloodMap (BYTE *data, size_t len, FMapThing **mapthings, int *
visibility = LittleLong(*(DWORD *)(infoBlock + 18)); visibility = LittleLong(*(DWORD *)(infoBlock + 18));
parallaxType = infoBlock[26]; parallaxType = infoBlock[26];
numRevisions = LittleLong(*(DWORD *)(infoBlock + 27)); numRevisions = LittleLong(*(DWORD *)(infoBlock + 27));
numsectors = LittleShort(*(WORD *)(infoBlock + 31)); int numsectors = LittleShort(*(WORD *)(infoBlock + 31));
numWalls = LittleShort(*(WORD *)(infoBlock + 33)); numWalls = LittleShort(*(WORD *)(infoBlock + 33));
numsprites = LittleShort(*(WORD *)(infoBlock + 35)); numsprites = LittleShort(*(WORD *)(infoBlock + 35));
Printf("Visibility: %d\n", visibility); Printf("Visibility: %d\n", visibility);
@ -364,7 +363,7 @@ static bool P_LoadBloodMap (BYTE *data, size_t len, FMapThing **mapthings, int *
// Now convert to Doom format, since we've extracted all the standard // Now convert to Doom format, since we've extracted all the standard
// BUILD info from the map we need. (Sprites are ignored.) // BUILD info from the map we need. (Sprites are ignored.)
LoadSectors (bsec); LoadSectors (bsec, numsectors);
LoadWalls (bwal, numWalls, bsec); LoadWalls (bwal, numWalls, bsec);
*mapthings = new FMapThing[numsprites]; *mapthings = new FMapThing[numsprites];
*numspr = LoadSprites (bspr, xspr, numsprites, bsec, *mapthings); *numspr = LoadSprites (bspr, xspr, numsprites, bsec, *mapthings);
@ -383,25 +382,26 @@ static bool P_LoadBloodMap (BYTE *data, size_t len, FMapThing **mapthings, int *
// //
//========================================================================== //==========================================================================
static void LoadSectors (sectortype *bsec) static void LoadSectors (sectortype *bsec, int count)
{ {
FDynamicColormap *map = GetSpecialLights (PalEntry (255,255,255), level.fadeto, 0); FDynamicColormap *map = GetSpecialLights (PalEntry (255,255,255), level.fadeto, 0);
sector_t *sec; sector_t *sec;
char tnam[9]; char tnam[9];
sec = sectors = new sector_t[numsectors]; level.sectors.Alloc(count);
memset (sectors, 0, sizeof(sector_t)*numsectors); sec = &level.sectors[0];
memset (sec, 0, sizeof(sector_t)*count);
sectors[0].e = new extsector_t[numsectors]; sec->e = new extsector_t[count];
for (int i = 0; i < numsectors; ++i, ++bsec, ++sec) for (int i = 0; i < count; ++i, ++bsec, ++sec)
{ {
bsec->wallptr = WORD(bsec->wallptr); bsec->wallptr = WORD(bsec->wallptr);
bsec->wallnum = WORD(bsec->wallnum); bsec->wallnum = WORD(bsec->wallnum);
bsec->ceilingstat = WORD(bsec->ceilingstat); bsec->ceilingstat = WORD(bsec->ceilingstat);
bsec->floorstat = WORD(bsec->floorstat); bsec->floorstat = WORD(bsec->floorstat);
sec->e = &sectors[0].e[i]; sec->e = &sec->e[i];
double floorheight = -LittleLong(bsec->floorZ) / 256.; double floorheight = -LittleLong(bsec->floorZ) / 256.;
sec->SetPlaneTexZ(sector_t::floor, floorheight); sec->SetPlaneTexZ(sector_t::floor, floorheight);
sec->floorplane.SetAtHeight(floorheight, sector_t::floor); sec->floorplane.SetAtHeight(floorheight, sector_t::floor);
@ -496,13 +496,13 @@ static void LoadWalls (walltype *walls, int numwalls, sectortype *bsec)
numvertexes = 0; numvertexes = 0;
// First mark each sidedef with the sector it belongs to // First mark each sidedef with the sector it belongs to
for (i = 0; i < numsectors; ++i) for (unsigned i = 0; i < level.sectors.Size(); i++)
{ {
if (bsec[i].wallptr >= 0) if (bsec[i].wallptr >= 0)
{ {
for (j = 0; j < bsec[i].wallnum; ++j) for (j = 0; j < bsec[i].wallnum; ++j)
{ {
sides[j + bsec[i].wallptr].sector = sectors + i; sides[j + bsec[i].wallptr].sector = &level.sectors[i];
} }
} }
} }
@ -581,7 +581,7 @@ static void LoadWalls (walltype *walls, int numwalls, sectortype *bsec)
lines[j].flags |= ML_WRAP_MIDTEX; lines[j].flags |= ML_WRAP_MIDTEX;
if (walls[i].nextsector >= 0) if (walls[i].nextsector >= 0)
{ {
lines[j].backsector = sectors + walls[i].nextsector; lines[j].backsector = &level.sectors[walls[i].nextsector];
lines[j].flags |= ML_TWOSIDED; lines[j].flags |= ML_TWOSIDED;
} }
else else
@ -629,7 +629,7 @@ static void LoadWalls (walltype *walls, int numwalls, sectortype *bsec)
} }
// Finish setting sector properties that depend on walls // Finish setting sector properties that depend on walls
for (i = 0; i < numsectors; ++i, ++bsec) for (auto &sec : level.sectors)
{ {
SlopeWork slope; SlopeWork slope;
@ -646,13 +646,13 @@ static void LoadWalls (walltype *walls, int numwalls, sectortype *bsec)
{ // floor is sloped { // floor is sloped
slope.heinum = -LittleShort(bsec->floorheinum); slope.heinum = -LittleShort(bsec->floorheinum);
slope.z[0] = slope.z[1] = slope.z[2] = -bsec->floorZ; slope.z[0] = slope.z[1] = slope.z[2] = -bsec->floorZ;
CalcPlane (slope, sectors[i].floorplane); CalcPlane (slope, sec.floorplane);
} }
if ((bsec->ceilingstat & 2) && (bsec->ceilingheinum != 0)) if ((bsec->ceilingstat & 2) && (bsec->ceilingheinum != 0))
{ // ceiling is sloped { // ceiling is sloped
slope.heinum = -LittleShort(bsec->ceilingheinum); slope.heinum = -LittleShort(bsec->ceilingheinum);
slope.z[0] = slope.z[1] = slope.z[2] = -bsec->ceilingZ; slope.z[0] = slope.z[1] = slope.z[2] = -bsec->ceilingZ;
CalcPlane (slope, sectors[i].ceilingplane); CalcPlane (slope, sec.ceilingplane);
} }
int linenum = int(intptr_t(sides[bsec->wallptr].linedef)); int linenum = int(intptr_t(sides[bsec->wallptr].linedef));
int sidenum = int(intptr_t(lines[linenum].sidedef[1])); int sidenum = int(intptr_t(lines[linenum].sidedef[1]));

View File

@ -498,7 +498,7 @@ bool EV_DoCeiling (DCeiling::ECeiling type, line_t *line,
{ {
if (!line || !(sec = line->backsector)) if (!line || !(sec = line->backsector))
return rtn; return rtn;
secnum = (int)(sec-sectors); secnum = sec->sectornum;
// [RH] Hack to let manual crushers be retriggerable, too // [RH] Hack to let manual crushers be retriggerable, too
tag ^= secnum | 0x1000000; tag ^= secnum | 0x1000000;
P_ActivateInStasisCeiling (tag); P_ActivateInStasisCeiling (tag);
@ -516,7 +516,7 @@ bool EV_DoCeiling (DCeiling::ECeiling type, line_t *line,
FSectorTagIterator it(tag); FSectorTagIterator it(tag);
while ((secnum = it.Next()) >= 0) while ((secnum = it.Next()) >= 0)
{ {
rtn |= P_CreateCeiling(&sectors[secnum], type, line, tag, speed, speed2, height, crush, silent, change, hexencrush); rtn |= P_CreateCeiling(&level.sectors[secnum], type, line, tag, speed, speed2, height, crush, silent, change, hexencrush);
} }
return rtn; return rtn;
} }

View File

@ -441,7 +441,7 @@ bool EV_DoDoor (DDoor::EVlDoor type, line_t *line, AActor *thing,
// get the sector on the second side of activating linedef // get the sector on the second side of activating linedef
sec = line->sidedef[1]->sector; sec = line->sidedef[1]->sector;
secnum = int(sec-sectors); secnum = sec->sectornum;
// if door already has a thinker, use it // if door already has a thinker, use it
if (sec->PlaneMoving(sector_t::ceiling)) if (sec->PlaneMoving(sector_t::ceiling))
@ -493,7 +493,7 @@ bool EV_DoDoor (DDoor::EVlDoor type, line_t *line, AActor *thing,
FSectorTagIterator it(tag); FSectorTagIterator it(tag);
while ((secnum = it.Next()) >= 0) while ((secnum = it.Next()) >= 0)
{ {
sec = &sectors[secnum]; sec = &level.sectors[secnum];
// if the ceiling is already moving, don't start the door action // if the ceiling is already moving, don't start the door action
if (sec->PlaneMoving(sector_t::ceiling)) if (sec->PlaneMoving(sector_t::ceiling))
continue; continue;
@ -782,7 +782,7 @@ bool EV_SlidingDoor (line_t *line, AActor *actor, int tag, int speed, int delay)
FSectorTagIterator it(tag); FSectorTagIterator it(tag);
while ((secnum = it.Next()) >= 0) while ((secnum = it.Next()) >= 0)
{ {
sec = &sectors[secnum]; sec = &level.sectors[secnum];
if (sec->ceilingdata != NULL) if (sec->ceilingdata != NULL)
{ {
continue; continue;

View File

@ -350,7 +350,7 @@ void P_RunEffects ()
{ {
if (players[consoleplayer].camera == NULL) return; if (players[consoleplayer].camera == NULL) return;
int pnum = int(players[consoleplayer].camera->Sector - sectors) * numsectors; int pnum = players[consoleplayer].camera->Sector->Index() * level.sectors.Size();
AActor *actor; AActor *actor;
TThinkerIterator<AActor> iterator; TThinkerIterator<AActor> iterator;
@ -360,7 +360,7 @@ void P_RunEffects ()
if (actor->effects) if (actor->effects)
{ {
// Only run the effect if the actor is potentially visible // Only run the effect if the actor is potentially visible
int rnum = pnum + int(actor->Sector - sectors); int rnum = pnum + actor->Sector->Index();
if (rejectmatrix == NULL || !(rejectmatrix[rnum>>3] & (1 << (rnum & 7)))) if (rejectmatrix == NULL || !(rejectmatrix[rnum>>3] & (1 << (rnum & 7))))
P_RunEffect (actor, actor->effects); P_RunEffect (actor, actor->effects);
} }

View File

@ -185,19 +185,19 @@ void DFloor::Tick ()
sector_t *sec = m_Sector; sector_t *sec = m_Sector;
sec->stairlock = -1; // thinker done, promote lock to -1 sec->stairlock = -1; // thinker done, promote lock to -1
while (sec->prevsec != -1 && sectors[sec->prevsec].stairlock != -2) while (sec->prevsec != -1 && level.sectors[sec->prevsec].stairlock != -2)
sec = &sectors[sec->prevsec]; // search for a non-done thinker sec = &level.sectors[sec->prevsec]; // search for a non-done thinker
if (sec->prevsec == -1) // if all thinkers previous are done if (sec->prevsec == -1) // if all thinkers previous are done
{ {
sec = m_Sector; // search forward sec = m_Sector; // search forward
while (sec->nextsec != -1 && sectors[sec->nextsec].stairlock != -2) while (sec->nextsec != -1 && level.sectors[sec->nextsec].stairlock != -2)
sec = &sectors[sec->nextsec]; sec = &level.sectors[sec->nextsec];
if (sec->nextsec == -1) // if all thinkers ahead are done too if (sec->nextsec == -1) // if all thinkers ahead are done too
{ {
while (sec->prevsec != -1) // clear all locks while (sec->prevsec != -1) // clear all locks
{ {
sec->stairlock = 0; sec->stairlock = 0;
sec = &sectors[sec->prevsec]; sec = &level.sectors[sec->prevsec];
} }
sec->stairlock = 0; sec->stairlock = 0;
} }
@ -528,7 +528,7 @@ bool EV_DoFloor (DFloor::EFloor floortype, line_t *line, int tag,
FSectorTagIterator it(tag, line); FSectorTagIterator it(tag, line);
while ((secnum = it.Next()) >= 0) while ((secnum = it.Next()) >= 0)
{ {
rtn |= P_CreateFloor(&sectors[secnum], floortype, line, speed, height, crush, change, hexencrush, hereticlower); rtn |= P_CreateFloor(&level.sectors[secnum], floortype, line, speed, height, crush, change, hexencrush, hereticlower);
} }
return rtn; return rtn;
} }
@ -547,7 +547,7 @@ bool EV_FloorCrushStop (int tag)
FSectorTagIterator it(tag); FSectorTagIterator it(tag);
while ((secnum = it.Next()) >= 0) while ((secnum = it.Next()) >= 0)
{ {
sector_t *sec = sectors + secnum; sector_t *sec = &level.sectors[secnum];
if (sec->floordata && sec->floordata->IsKindOf (RUNTIME_CLASS(DFloor)) && if (sec->floordata && sec->floordata->IsKindOf (RUNTIME_CLASS(DFloor)) &&
barrier_cast<DFloor *>(sec->floordata)->m_Type == DFloor::floorRaiseAndCrush) barrier_cast<DFloor *>(sec->floordata)->m_Type == DFloor::floorRaiseAndCrush)
@ -602,7 +602,7 @@ bool EV_BuildStairs (int tag, DFloor::EStair type, line_t *line,
bool compatible = tag != 0 && (i_compatflags & COMPATF_STAIRINDEX); bool compatible = tag != 0 && (i_compatflags & COMPATF_STAIRINDEX);
while ((secnum = itr.NextCompat(compatible, secnum)) >= 0) while ((secnum = itr.NextCompat(compatible, secnum)) >= 0)
{ {
sec = &sectors[secnum]; sec = &level.sectors[secnum];
// ALREADY MOVING? IF SO, KEEP GOING... // ALREADY MOVING? IF SO, KEEP GOING...
//jff 2/26/98 add special lockout condition to wait for entire //jff 2/26/98 add special lockout condition to wait for entire
@ -664,7 +664,7 @@ bool EV_BuildStairs (int tag, DFloor::EStair type, line_t *line,
} }
} }
newsecnum = (int)(tsec - sectors); newsecnum = tsec->sectornum;
} }
else else
{ {
@ -674,14 +674,14 @@ bool EV_BuildStairs (int tag, DFloor::EStair type, line_t *line,
continue; continue;
tsec = line->frontsector; tsec = line->frontsector;
newsecnum = (int)(tsec-sectors); newsecnum = tsec->sectornum;
if (secnum != newsecnum) if (secnum != newsecnum)
continue; continue;
tsec = line->backsector; tsec = line->backsector;
if (!tsec) continue; //jff 5/7/98 if no backside, continue if (!tsec) continue; //jff 5/7/98 if no backside, continue
newsecnum = (int)(tsec - sectors); newsecnum = tsec->sectornum;
if (!igntxt && tsec->GetTexture(sector_t::floor) != texture) if (!igntxt && tsec->GetTexture(sector_t::floor) != texture)
continue; continue;
@ -746,7 +746,7 @@ bool EV_BuildStairs (int tag, DFloor::EStair type, line_t *line,
} while (ok); } while (ok);
// [RH] make sure the first sector doesn't point to a previous one, otherwise // [RH] make sure the first sector doesn't point to a previous one, otherwise
// it can infinite loop when the first sector stops moving. // it can infinite loop when the first sector stops moving.
sectors[osecnum].prevsec = -1; level.sectors[osecnum].prevsec = -1;
} }
return rtn; return rtn;
} }
@ -773,7 +773,7 @@ bool EV_DoDonut (int tag, line_t *line, double pillarspeed, double slimespeed)
FSectorTagIterator itr(tag, line); FSectorTagIterator itr(tag, line);
while ((secnum = itr.Next()) >= 0) while ((secnum = itr.Next()) >= 0)
{ {
s1 = &sectors[secnum]; // s1 is pillar's sector s1 = &level.sectors[secnum]; // s1 is pillar's sector
// ALREADY MOVING? IF SO, KEEP GOING... // ALREADY MOVING? IF SO, KEEP GOING...
if (s1->PlaneMoving(sector_t::floor)) if (s1->PlaneMoving(sector_t::floor))
@ -990,7 +990,7 @@ bool EV_DoElevator (line_t *line, DElevator::EElevator elevtype,
// act on all sectors with the same tag as the triggering linedef // act on all sectors with the same tag as the triggering linedef
while ((secnum = itr.Next()) >= 0) while ((secnum = itr.Next()) >= 0)
{ {
sec = &sectors[secnum]; sec = &level.sectors[secnum];
// If either floor or ceiling is already activated, skip it // If either floor or ceiling is already activated, skip it
if (sec->PlaneMoving(sector_t::floor) || sec->ceilingdata) //jff 2/22/98 if (sec->PlaneMoving(sector_t::floor) || sec->ceilingdata) //jff 2/22/98
continue; // the loop used to break at the end if tag were 0, but would miss that step if "continue" occured [FDARI] continue; // the loop used to break at the end if tag were 0, but would miss that step if "continue" occured [FDARI]
@ -1083,7 +1083,7 @@ bool EV_DoChange (line_t *line, EChange changetype, int tag)
FSectorTagIterator it(tag); FSectorTagIterator it(tag);
while ((secnum = it.Next()) >= 0) while ((secnum = it.Next()) >= 0)
{ {
sec = &sectors[secnum]; sec = &level.sectors[secnum];
rtn = true; rtn = true;
@ -1298,7 +1298,7 @@ bool EV_StartWaggle (int tag, line_t *line, int height, int speed, int offset,
while ((sectorIndex = itr.Next()) >= 0) while ((sectorIndex = itr.Next()) >= 0)
{ {
sector = &sectors[sectorIndex]; sector = &level.sectors[sectorIndex];
if ((!ceiling && sector->PlaneMoving(sector_t::floor)) || if ((!ceiling && sector->PlaneMoving(sector_t::floor)) ||
(ceiling && sector->PlaneMoving(sector_t::ceiling))) (ceiling && sector->PlaneMoving(sector_t::ceiling)))
{ // Already busy with another thinker { // Already busy with another thinker

View File

@ -324,7 +324,7 @@ void EV_StartLightFlickering (int tag, int upper, int lower)
FSectorTagIterator it(tag); FSectorTagIterator it(tag);
while ((secnum = it.Next()) >= 0) while ((secnum = it.Next()) >= 0)
{ {
new DFlicker (&sectors[secnum], upper, lower); new DFlicker (&level.sectors[secnum], upper, lower);
} }
} }
@ -501,7 +501,7 @@ void EV_StartLightStrobing (int tag, int upper, int lower, int utics, int ltics)
FSectorTagIterator it(tag); FSectorTagIterator it(tag);
while ((secnum = it.Next()) >= 0) while ((secnum = it.Next()) >= 0)
{ {
sector_t *sec = &sectors[secnum]; sector_t *sec = &level.sectors[secnum];
if (sec->lightingdata) if (sec->lightingdata)
continue; continue;
@ -515,7 +515,7 @@ void EV_StartLightStrobing (int tag, int utics, int ltics)
FSectorTagIterator it(tag); FSectorTagIterator it(tag);
while ((secnum = it.Next()) >= 0) while ((secnum = it.Next()) >= 0)
{ {
sector_t *sec = &sectors[secnum]; sector_t *sec = &level.sectors[secnum];
if (sec->lightingdata) if (sec->lightingdata)
continue; continue;
@ -537,7 +537,7 @@ void EV_TurnTagLightsOff (int tag)
FSectorTagIterator it(tag); FSectorTagIterator it(tag);
while ((secnum = it.Next()) >= 0) while ((secnum = it.Next()) >= 0)
{ {
sector_t *sector = sectors + secnum; sector_t *sector = &level.sectors[secnum];
int min = sector->lightlevel; int min = sector->lightlevel;
for (auto ln : sector->Lines) for (auto ln : sector->Lines)
@ -566,7 +566,7 @@ void EV_LightTurnOn (int tag, int bright)
FSectorTagIterator it(tag); FSectorTagIterator it(tag);
while ((secnum = it.Next()) >= 0) while ((secnum = it.Next()) >= 0)
{ {
sector_t *sector = sectors + secnum; sector_t *sector = &level.sectors[secnum];
int tbright = bright; //jff 5/17/98 search for maximum PER sector int tbright = bright; //jff 5/17/98 search for maximum PER sector
// bright = -1 means to search ([RH] Not 0) // bright = -1 means to search ([RH] Not 0)
@ -619,7 +619,7 @@ void EV_LightTurnOnPartway (int tag, double frac)
FSectorTagIterator it(tag); FSectorTagIterator it(tag);
while ((secnum = it.Next()) >= 0) while ((secnum = it.Next()) >= 0)
{ {
sector_t *temp, *sector = &sectors[secnum]; sector_t *temp, *sector = &level.sectors[secnum];
int bright = 0, min = sector->lightlevel; int bright = 0, min = sector->lightlevel;
for (auto ln : sector->Lines) for (auto ln : sector->Lines)
@ -655,7 +655,7 @@ void EV_LightChange (int tag, int value)
FSectorTagIterator it(tag); FSectorTagIterator it(tag);
while ((secnum = it.Next()) >= 0) while ((secnum = it.Next()) >= 0)
{ {
sectors[secnum].SetLightLevel(sectors[secnum].lightlevel + value); level.sectors[secnum].SetLightLevel(level.sectors[secnum].lightlevel + value);
} }
} }
@ -821,7 +821,7 @@ void EV_StartLightGlowing (int tag, int upper, int lower, int tics)
FSectorTagIterator it(tag); FSectorTagIterator it(tag);
while ((secnum = it.Next()) >= 0) while ((secnum = it.Next()) >= 0)
{ {
sector_t *sec = &sectors[secnum]; sector_t *sec = &level.sectors[secnum];
if (sec->lightingdata) if (sec->lightingdata)
continue; continue;
@ -841,7 +841,7 @@ void EV_StartLightFading (int tag, int value, int tics)
FSectorTagIterator it(tag); FSectorTagIterator it(tag);
while ((secnum = it.Next()) >= 0) while ((secnum = it.Next()) >= 0)
{ {
sector_t *sec = &sectors[secnum]; sector_t *sec = &level.sectors[secnum];
if (sec->lightingdata) if (sec->lightingdata)
continue; continue;

View File

@ -322,9 +322,9 @@ bool P_AddSectorLinks(sector_t *control, int tag, INTBOOL ceiling, int movetype)
while ((sec = itr.Next()) >= 0) while ((sec = itr.Next()) >= 0)
{ {
// Don't attach to self! // Don't attach to self!
if (control != &sectors[sec]) if (control != &level.sectors[sec])
{ {
AddSingleSector(scrollplane, &sectors[sec], movetype); AddSingleSector(scrollplane, &level.sectors[sec], movetype);
} }
} }
} }

View File

@ -2163,7 +2163,7 @@ FUNC(LS_Sector_ChangeSound)
FSectorTagIterator itr(arg0); FSectorTagIterator itr(arg0);
while ((secNum = itr.Next()) >= 0) while ((secNum = itr.Next()) >= 0)
{ {
sectors[secNum].seqType = arg1; level.sectors[secNum].seqType = arg1;
rtn = true; rtn = true;
} }
return rtn; return rtn;
@ -2185,7 +2185,7 @@ FUNC(LS_Sector_ChangeFlags)
arg2 &= ~SECF_NOMODIFY; arg2 &= ~SECF_NOMODIFY;
while ((secNum = itr.Next()) >= 0) while ((secNum = itr.Next()) >= 0)
{ {
sectors[secNum].Flags = (sectors[secNum].Flags | arg1) & ~arg2; level.sectors[secNum].Flags = (level.sectors[secNum].Flags | arg1) & ~arg2;
rtn = true; rtn = true;
} }
return rtn; return rtn;
@ -2231,8 +2231,8 @@ FUNC(LS_Sector_SetTranslucent)
FSectorTagIterator itr(arg0); FSectorTagIterator itr(arg0);
while ((secnum = itr.Next()) >= 0) while ((secnum = itr.Next()) >= 0)
{ {
sectors[secnum].SetAlpha(arg1, clamp(arg2, 0, 255) / 255.); level.sectors[secnum].SetAlpha(arg1, clamp(arg2, 0, 255) / 255.);
sectors[secnum].ChangeFlags(arg1, ~PLANEF_ADDITIVE, arg3? PLANEF_ADDITIVE:0); level.sectors[secnum].ChangeFlags(arg1, ~PLANEF_ADDITIVE, arg3? PLANEF_ADDITIVE:0);
} }
return true; return true;
} }
@ -2247,7 +2247,7 @@ FUNC(LS_Sector_SetLink)
int control = P_FindFirstSectorFromTag(arg0); int control = P_FindFirstSectorFromTag(arg0);
if (control >= 0) if (control >= 0)
{ {
return P_AddSectorLinks(&sectors[control], arg1, arg2, arg3); return P_AddSectorLinks(&level.sectors[control], arg1, arg2, arg3);
} }
} }
return false; return false;
@ -2367,10 +2367,10 @@ FUNC(LS_Sector_SetDamage)
arg3 = 1; arg3 = 1;
} }
} }
sectors[secnum].damageamount = (short)arg1; level.sectors[secnum].damageamount = (short)arg1;
sectors[secnum].damagetype = MODtoDamageType(arg2); level.sectors[secnum].damagetype = MODtoDamageType(arg2);
sectors[secnum].damageinterval = (short)arg3; level.sectors[secnum].damageinterval = (short)arg3;
sectors[secnum].leakydamage = (short)arg4; level.sectors[secnum].leakydamage = (short)arg4;
} }
return true; return true;
} }
@ -2387,7 +2387,7 @@ FUNC(LS_Sector_SetGravity)
FSectorTagIterator itr(arg0); FSectorTagIterator itr(arg0);
int secnum; int secnum;
while ((secnum = itr.Next()) >= 0) while ((secnum = itr.Next()) >= 0)
sectors[secnum].gravity = gravity; level.sectors[secnum].gravity = gravity;
return true; return true;
} }
@ -2399,7 +2399,7 @@ FUNC(LS_Sector_SetColor)
int secnum; int secnum;
while ((secnum = itr.Next()) >= 0) while ((secnum = itr.Next()) >= 0)
{ {
sectors[secnum].SetColor(arg1, arg2, arg3, arg4); level.sectors[secnum].SetColor(arg1, arg2, arg3, arg4);
} }
return true; return true;
@ -2412,7 +2412,7 @@ FUNC(LS_Sector_SetFade)
int secnum; int secnum;
while ((secnum = itr.Next()) >= 0) while ((secnum = itr.Next()) >= 0)
{ {
sectors[secnum].SetFade(arg1, arg2, arg3); level.sectors[secnum].SetFade(arg1, arg2, arg3);
} }
return true; return true;
} }
@ -2427,8 +2427,8 @@ FUNC(LS_Sector_SetCeilingPanning)
int secnum; int secnum;
while ((secnum = itr.Next()) >= 0) while ((secnum = itr.Next()) >= 0)
{ {
sectors[secnum].SetXOffset(sector_t::ceiling, xofs); level.sectors[secnum].SetXOffset(sector_t::ceiling, xofs);
sectors[secnum].SetYOffset(sector_t::ceiling, yofs); level.sectors[secnum].SetYOffset(sector_t::ceiling, yofs);
} }
return true; return true;
} }
@ -2443,8 +2443,8 @@ FUNC(LS_Sector_SetFloorPanning)
int secnum; int secnum;
while ((secnum = itr.Next()) >= 0) while ((secnum = itr.Next()) >= 0)
{ {
sectors[secnum].SetXOffset(sector_t::floor, xofs); level.sectors[secnum].SetXOffset(sector_t::floor, xofs);
sectors[secnum].SetYOffset(sector_t::floor, yofs); level.sectors[secnum].SetYOffset(sector_t::floor, yofs);
} }
return true; return true;
} }
@ -2465,9 +2465,9 @@ FUNC(LS_Sector_SetFloorScale)
while ((secnum = itr.Next()) >= 0) while ((secnum = itr.Next()) >= 0)
{ {
if (xscale) if (xscale)
sectors[secnum].SetXScale(sector_t::floor, xscale); level.sectors[secnum].SetXScale(sector_t::floor, xscale);
if (yscale) if (yscale)
sectors[secnum].SetYScale(sector_t::floor, yscale); level.sectors[secnum].SetYScale(sector_t::floor, yscale);
} }
return true; return true;
} }
@ -2488,9 +2488,9 @@ FUNC(LS_Sector_SetCeilingScale)
while ((secnum = itr.Next()) >= 0) while ((secnum = itr.Next()) >= 0)
{ {
if (xscale) if (xscale)
sectors[secnum].SetXScale(sector_t::ceiling, xscale); level.sectors[secnum].SetXScale(sector_t::ceiling, xscale);
if (yscale) if (yscale)
sectors[secnum].SetYScale(sector_t::ceiling, yscale); level.sectors[secnum].SetYScale(sector_t::ceiling, yscale);
} }
return true; return true;
} }
@ -2510,9 +2510,9 @@ FUNC(LS_Sector_SetFloorScale2)
while ((secnum = itr.Next()) >= 0) while ((secnum = itr.Next()) >= 0)
{ {
if (arg1) if (arg1)
sectors[secnum].SetXScale(sector_t::floor, xscale); level.sectors[secnum].SetXScale(sector_t::floor, xscale);
if (arg2) if (arg2)
sectors[secnum].SetYScale(sector_t::floor, yscale); level.sectors[secnum].SetYScale(sector_t::floor, yscale);
} }
return true; return true;
} }
@ -2532,9 +2532,9 @@ FUNC(LS_Sector_SetCeilingScale2)
while ((secnum = itr.Next()) >= 0) while ((secnum = itr.Next()) >= 0)
{ {
if (arg1) if (arg1)
sectors[secnum].SetXScale(sector_t::ceiling, xscale); level.sectors[secnum].SetXScale(sector_t::ceiling, xscale);
if (arg2) if (arg2)
sectors[secnum].SetYScale(sector_t::ceiling, yscale); level.sectors[secnum].SetYScale(sector_t::ceiling, yscale);
} }
return true; return true;
} }
@ -2549,8 +2549,8 @@ FUNC(LS_Sector_SetRotation)
int secnum; int secnum;
while ((secnum = itr.Next()) >= 0) while ((secnum = itr.Next()) >= 0)
{ {
sectors[secnum].SetAngle(sector_t::floor, floor); level.sectors[secnum].SetAngle(sector_t::floor, floor);
sectors[secnum].SetAngle(sector_t::ceiling, ceiling); level.sectors[secnum].SetAngle(sector_t::ceiling, ceiling);
} }
return true; return true;
} }
@ -3151,7 +3151,7 @@ FUNC(LS_ClearForceField)
int secnum; int secnum;
while ((secnum = itr.Next()) >= 0) while ((secnum = itr.Next()) >= 0)
{ {
sector_t *sec = &sectors[secnum]; sector_t *sec = &level.sectors[secnum];
rtn = true; rtn = true;
sec->RemoveForceField(); sec->RemoveForceField();

View File

@ -3961,9 +3961,9 @@ void AActor::Tick ()
sector_t *sec = node->m_sector; sector_t *sec = node->m_sector;
DVector2 scrollv; DVector2 scrollv;
if (level.Scrolls.Size() > unsigned(sec-sectors)) if (level.Scrolls.Size() > unsigned(sec->Index()))
{ {
scrollv = level.Scrolls[sec - sectors]; scrollv = level.Scrolls[sec->Index()];
} }
else else
{ {
@ -5251,9 +5251,9 @@ APlayerPawn *P_SpawnPlayer (FPlayerStart *mthing, int playernum, int flags)
{ {
if (th->LastHeard == oldactor) th->LastHeard = NULL; if (th->LastHeard == oldactor) th->LastHeard = NULL;
} }
for(int i = 0; i < numsectors; i++) for(auto &sec : level.sectors)
{ {
if (sectors[i].SoundTarget == oldactor) sectors[i].SoundTarget = NULL; if (sec.SoundTarget == oldactor) sec.SoundTarget = nullptr;
} }
DObject::StaticPointerSubstitution (oldactor, p->mo); DObject::StaticPointerSubstitution (oldactor, p->mo);

View File

@ -220,7 +220,7 @@ bool EV_DoPillar (DPillar::EPillar type, line_t *line, int tag,
FSectorTagIterator itr(tag, line); FSectorTagIterator itr(tag, line);
while ((secnum = itr.Next()) >= 0) while ((secnum = itr.Next()) >= 0)
{ {
sec = &sectors[secnum]; sec = &level.sectors[secnum];
if (sec->PlaneMoving(sector_t::floor) || sec->PlaneMoving(sector_t::ceiling)) if (sec->PlaneMoving(sector_t::floor) || sec->PlaneMoving(sector_t::ceiling))
continue; continue;

View File

@ -243,7 +243,7 @@ bool EV_DoPlat (int tag, line_t *line, DPlat::EPlatType type, double height,
FSectorTagIterator itr(tag, line); FSectorTagIterator itr(tag, line);
while ((secnum = itr.Next()) >= 0) while ((secnum = itr.Next()) >= 0)
{ {
sec = &sectors[secnum]; sec = &level.sectors[secnum];
if (sec->PlaneMoving(sector_t::floor)) if (sec->PlaneMoving(sector_t::floor))
{ {

View File

@ -192,7 +192,7 @@ void DPusher::Tick ()
if (!var_pushers) if (!var_pushers)
return; return;
sec = sectors + m_Affectee; sec = &level.sectors[m_Affectee];
// Be sure the special sector type is still turned on. If so, proceed. // Be sure the special sector type is still turned on. If so, proceed.
// Else, bail out; the sector type has been changed on us. // Else, bail out; the sector type has been changed on us.
@ -339,7 +339,7 @@ AActor *P_GetPushThing (int s)
AActor* thing; AActor* thing;
sector_t* sec; sector_t* sec;
sec = sectors + s; sec = &level.sectors[s];
thing = sec->thinglist; thing = sec->thinglist;
while (thing && while (thing &&
@ -406,8 +406,7 @@ void P_SpawnPushers ()
if (thing->GetClass()->TypeName == NAME_PointPusher || if (thing->GetClass()->TypeName == NAME_PointPusher ||
thing->GetClass()->TypeName == NAME_PointPuller) thing->GetClass()->TypeName == NAME_PointPuller)
{ {
new DPusher (DPusher::p_push, l->args[3] ? l : NULL, l->args[2], new DPusher (DPusher::p_push, l->args[3] ? l : NULL, l->args[2], 0, thing, thing->Sector->Index());
0, thing, int(thing->Sector - sectors));
} }
} }
} }
@ -447,7 +446,7 @@ void AdjustPusher (int tag, int magnitude, int angle, bool wind)
unsigned int i; unsigned int i;
for (i = 0; i < numcollected; i++) for (i = 0; i < numcollected; i++)
{ {
if (Collection[i].RefNum == sectors[secnum].sectornum) if (Collection[i].RefNum == secnum)
break; break;
} }
if (i == numcollected) if (i == numcollected)

View File

@ -281,7 +281,7 @@ FSerializer &Serialize(FSerializer &arc, const char *key, sector_t &p, sector_t
{ {
if (level.Scrolls.Size() == 0) if (level.Scrolls.Size() == 0)
{ {
level.Scrolls.Resize(numsectors); level.Scrolls.Resize(level.sectors.Size());
memset(&level.Scrolls[0], 0, sizeof(level.Scrolls[0])*level.Scrolls.Size()); memset(&level.Scrolls[0], 0, sizeof(level.Scrolls[0])*level.Scrolls.Size());
level.Scrolls[p.sectornum] = scroll; level.Scrolls[p.sectornum] = scroll;
} }
@ -900,7 +900,7 @@ void G_SerializeLevel(FSerializer &arc, bool hubload)
arc.Array("checksum", chk, 16); arc.Array("checksum", chk, 16);
if (arc.GetSize("linedefs") != (unsigned)numlines || if (arc.GetSize("linedefs") != (unsigned)numlines ||
arc.GetSize("sidedefs") != (unsigned)numsides || arc.GetSize("sidedefs") != (unsigned)numsides ||
arc.GetSize("sectors") != (unsigned)numsectors || arc.GetSize("sectors") != level.sectors.Size() ||
arc.GetSize("polyobjs") != (unsigned)po_NumPolyobjs || arc.GetSize("polyobjs") != (unsigned)po_NumPolyobjs ||
memcmp(chk, level.md5, 16)) memcmp(chk, level.md5, 16))
{ {
@ -954,7 +954,7 @@ void G_SerializeLevel(FSerializer &arc, bool hubload)
// The order here is important: First world state, then portal state, then thinkers, and last polyobjects. // The order here is important: First world state, then portal state, then thinkers, and last polyobjects.
arc.Array("linedefs", lines, &loadlines[0], numlines); arc.Array("linedefs", lines, &loadlines[0], numlines);
arc.Array("sidedefs", sides, &loadsides[0], numsides); arc.Array("sidedefs", sides, &loadsides[0], numsides);
arc.Array("sectors", sectors, &loadsectors[0], numsectors); arc.Array("sectors", &level.sectors[0], &loadsectors[0], level.sectors.Size());
arc("zones", Zones); arc("zones", Zones);
arc("lineportals", linePortals); arc("lineportals", linePortals);
arc("sectorportals", sectorPortals); arc("sectorportals", sectorPortals);
@ -972,9 +972,9 @@ void G_SerializeLevel(FSerializer &arc, bool hubload)
if (arc.isReading()) if (arc.isReading())
{ {
for (int i = 0; i < numsectors; i++) for (auto &sec : level.sectors)
{ {
P_Recalculate3DFloors(&sectors[i]); P_Recalculate3DFloors(&sec);
} }
for (int i = 0; i < MAXPLAYERS; ++i) for (int i = 0; i < MAXPLAYERS; ++i)
{ {

View File

@ -168,8 +168,8 @@ void DScroller::Tick ()
if (m_Control != -1) if (m_Control != -1)
{ // compute scroll amounts based on a sector's height changes { // compute scroll amounts based on a sector's height changes
double height = sectors[m_Control].CenterFloor () + double height = level.sectors[m_Control].CenterFloor () +
sectors[m_Control].CenterCeiling (); level.sectors[m_Control].CenterCeiling ();
double delta = height - m_LastHeight; double delta = height - m_LastHeight;
m_LastHeight = height; m_LastHeight = height;
dx *= delta; dx *= delta;
@ -208,15 +208,15 @@ void DScroller::Tick ()
break; break;
case EScroll::sc_floor: // killough 3/7/98: Scroll floor texture case EScroll::sc_floor: // killough 3/7/98: Scroll floor texture
RotationComp(&sectors[m_Affectee], sector_t::floor, dx, dy, tdx, tdy); RotationComp(&level.sectors[m_Affectee], sector_t::floor, dx, dy, tdx, tdy);
sectors[m_Affectee].AddXOffset(sector_t::floor, tdx); level.sectors[m_Affectee].AddXOffset(sector_t::floor, tdx);
sectors[m_Affectee].AddYOffset(sector_t::floor, tdy); level.sectors[m_Affectee].AddYOffset(sector_t::floor, tdy);
break; break;
case EScroll::sc_ceiling: // killough 3/7/98: Scroll ceiling texture case EScroll::sc_ceiling: // killough 3/7/98: Scroll ceiling texture
RotationComp(&sectors[m_Affectee], sector_t::ceiling, dx, dy, tdx, tdy); RotationComp(&level.sectors[m_Affectee], sector_t::ceiling, dx, dy, tdx, tdy);
sectors[m_Affectee].AddXOffset(sector_t::ceiling, tdx); level.sectors[m_Affectee].AddXOffset(sector_t::ceiling, tdx);
sectors[m_Affectee].AddYOffset(sector_t::ceiling, tdy); level.sectors[m_Affectee].AddYOffset(sector_t::ceiling, tdy);
break; break;
// [RH] Don't actually carry anything here. That happens later. // [RH] Don't actually carry anything here. That happens later.
@ -262,8 +262,10 @@ DScroller::DScroller (EScroll type, double dx, double dy,
m_vdx = m_vdy = 0; m_vdx = m_vdy = 0;
m_LastHeight = 0; m_LastHeight = 0;
if ((m_Control = control) != -1) if ((m_Control = control) != -1)
{
m_LastHeight = m_LastHeight =
sectors[control].CenterFloor () + sectors[control].CenterCeiling (); level.sectors[control].CenterFloor() + level.sectors[control].CenterCeiling();
}
m_Affectee = affectee; m_Affectee = affectee;
m_Interpolations[0] = m_Interpolations[1] = m_Interpolations[2] = NULL; m_Interpolations[0] = m_Interpolations[1] = m_Interpolations[2] = NULL;
@ -291,11 +293,11 @@ DScroller::DScroller (EScroll type, double dx, double dy,
break; break;
case EScroll::sc_floor: case EScroll::sc_floor:
m_Interpolations[0] = sectors[affectee].SetInterpolation(sector_t::FloorScroll, false); m_Interpolations[0] = level.sectors[affectee].SetInterpolation(sector_t::FloorScroll, false);
break; break;
case EScroll::sc_ceiling: case EScroll::sc_ceiling:
m_Interpolations[0] = sectors[affectee].SetInterpolation(sector_t::CeilingScroll, false); m_Interpolations[0] = level.sectors[affectee].SetInterpolation(sector_t::CeilingScroll, false);
break; break;
default: default:
@ -346,7 +348,7 @@ DScroller::DScroller (double dx, double dy, const line_t *l,
m_Parts = scrollpos; m_Parts = scrollpos;
m_LastHeight = 0; m_LastHeight = 0;
if ((m_Control = control) != -1) if ((m_Control = control) != -1)
m_LastHeight = sectors[control].CenterFloor() + sectors[control].CenterCeiling(); m_LastHeight = level.sectors[control].CenterFloor() + level.sectors[control].CenterCeiling();
m_Affectee = int(l->sidedef[0] - sides); m_Affectee = int(l->sidedef[0] - sides);
sides[m_Affectee].Flags |= WALLF_NOAUTODECALS; sides[m_Affectee].Flags |= WALLF_NOAUTODECALS;
m_Interpolations[0] = m_Interpolations[1] = m_Interpolations[2] = NULL; m_Interpolations[0] = m_Interpolations[1] = m_Interpolations[2] = NULL;
@ -439,7 +441,7 @@ void P_SpawnScrollers(void)
{ {
// if 1, then displacement // if 1, then displacement
// if 2, then accelerative (also if 3) // if 2, then accelerative (also if 3)
control = int(l->sidedef[0]->sector - sectors); control = l->sidedef[0]->sector->Index();
if (l->args[1] & 2) if (l->args[1] & 2)
accel = 1; accel = 1;
} }
@ -476,7 +478,7 @@ void P_SpawnScrollers(void)
if (line->args[0] == l->args[0] && (line->args[1] & 1)) if (line->args[0] == l->args[0] && (line->args[1] & 1))
{ {
new DScroller(EScroll::sc_ceiling, -dx, dy, control, int(line->frontsector - sectors), accel); new DScroller(EScroll::sc_ceiling, -dx, dy, control, line->frontsector->Index(), accel);
} }
} }
break; break;
@ -496,7 +498,7 @@ void P_SpawnScrollers(void)
if (line->args[0] == l->args[0] && (line->args[1] & 2)) if (line->args[0] == l->args[0] && (line->args[1] & 2))
{ {
new DScroller (EScroll::sc_floor, -dx, dy, control, int(line->frontsector-sectors), accel); new DScroller(EScroll::sc_floor, -dx, dy, control, line->frontsector->Index(), accel);
} }
} }
} }
@ -514,7 +516,7 @@ void P_SpawnScrollers(void)
if (line->args[0] == l->args[0] && (line->args[1] & 4)) if (line->args[0] == l->args[0] && (line->args[1] & 4))
{ {
new DScroller (EScroll::sc_carry, dx, dy, control, int(line->frontsector-sectors), accel); new DScroller (EScroll::sc_carry, dx, dy, control, line->frontsector->Index(), accel);
} }
} }
} }

View File

@ -1307,6 +1307,84 @@ int side_t::GetLightLevel (bool foggy, int baselight, bool is3dlight, int *pfake
return baselight; return baselight;
} }
DEFINE_ACTION_FUNCTION(_Secplane, isSlope)
{
PARAM_SELF_STRUCT_PROLOGUE(secplane_t);
ACTION_RETURN_BOOL(!self->normal.XY().isZero());
}
DEFINE_ACTION_FUNCTION(_Secplane, PointOnSide)
{
PARAM_SELF_STRUCT_PROLOGUE(secplane_t);
PARAM_FLOAT(x);
PARAM_FLOAT(y);
PARAM_FLOAT(z);
ACTION_RETURN_INT(self->PointOnSide(DVector3(x, y, z)));
}
DEFINE_ACTION_FUNCTION(_Secplane, ZatPoint)
{
PARAM_SELF_STRUCT_PROLOGUE(secplane_t);
PARAM_FLOAT(x);
PARAM_FLOAT(y);
ACTION_RETURN_FLOAT(self->ZatPoint(x, y));
}
DEFINE_ACTION_FUNCTION(_Secplane, ZatPointDist)
{
PARAM_SELF_STRUCT_PROLOGUE(secplane_t);
PARAM_FLOAT(x);
PARAM_FLOAT(y);
PARAM_FLOAT(d);
ACTION_RETURN_FLOAT((d + self->normal.X*x + self->normal.Y*y) * self->negiC);
}
DEFINE_ACTION_FUNCTION(_Secplane, isEqual)
{
PARAM_SELF_STRUCT_PROLOGUE(secplane_t);
PARAM_POINTER(other, secplane_t);
ACTION_RETURN_BOOL(*self == *other);
}
DEFINE_ACTION_FUNCTION(_Secplane, ChangeHeight)
{
PARAM_SELF_STRUCT_PROLOGUE(secplane_t);
PARAM_FLOAT(hdiff);
self->ChangeHeight(hdiff);
return 0;
}
DEFINE_ACTION_FUNCTION(_Secplane, GetChangedHeight)
{
PARAM_SELF_STRUCT_PROLOGUE(secplane_t);
PARAM_FLOAT(hdiff);
ACTION_RETURN_FLOAT(self->GetChangedHeight(hdiff));
}
DEFINE_ACTION_FUNCTION(_Secplane, HeightDiff)
{
PARAM_SELF_STRUCT_PROLOGUE(secplane_t);
PARAM_FLOAT(oldd);
if (numparam == 2)
{
ACTION_RETURN_FLOAT(self->HeightDiff(oldd));
}
else
{
PARAM_FLOAT(newd);
ACTION_RETURN_FLOAT(self->HeightDiff(oldd, newd));
}
}
DEFINE_ACTION_FUNCTION(_Secplane, PointToDist)
{
PARAM_SELF_STRUCT_PROLOGUE(secplane_t);
PARAM_FLOAT(x);
PARAM_FLOAT(y);
PARAM_FLOAT(z);
ACTION_RETURN_FLOAT(self->PointToDist(DVector2(x, y), z));
}
DEFINE_FIELD_X(Sector, sector_t, floorplane) DEFINE_FIELD_X(Sector, sector_t, floorplane)
DEFINE_FIELD_X(Sector, sector_t, ceilingplane) DEFINE_FIELD_X(Sector, sector_t, ceilingplane)
@ -1366,3 +1444,7 @@ DEFINE_FIELD_X(Line, line_t, backsector)
DEFINE_FIELD_X(Line, line_t, validcount) DEFINE_FIELD_X(Line, line_t, validcount)
DEFINE_FIELD_X(Line, line_t, locknumber) DEFINE_FIELD_X(Line, line_t, locknumber)
DEFINE_FIELD_X(Line, line_t, portalindex) DEFINE_FIELD_X(Line, line_t, portalindex)
DEFINE_FIELD_X(Secplane, secplane_t, normal)
DEFINE_FIELD_X(Secplane, secplane_t, D)
DEFINE_FIELD_X(Secplane, secplane_t, negiC)

View File

@ -122,8 +122,8 @@ int numsegs;
seg_t* segs; seg_t* segs;
glsegextra_t* glsegextras; glsegextra_t* glsegextras;
int numsectors; //int numsectors;
sector_t* sectors; //sector_t* sectors;
TArray<sector_t> loadsectors; TArray<sector_t> loadsectors;
int numsubsectors; int numsubsectors;
@ -808,11 +808,11 @@ void P_FloodZones ()
int z = 0, i; int z = 0, i;
ReverbContainer *reverb; ReverbContainer *reverb;
for (i = 0; i < numsectors; ++i) for (auto &sec : level.sectors)
{ {
if (sectors[i].ZoneNumber == 0xFFFF) if (sec.ZoneNumber == 0xFFFF)
{ {
P_FloodZone (&sectors[i], z++); P_FloodZone (&sec, z++);
} }
} }
Zones.Resize(z); Zones.Resize(z);
@ -1463,7 +1463,6 @@ void P_LoadSubsectors (MapData * map)
void P_LoadSectors (MapData *map, FMissingTextureTracker &missingtex) void P_LoadSectors (MapData *map, FMissingTextureTracker &missingtex)
{ {
int i;
char *msp; char *msp;
mapsector_t *ms; mapsector_t *ms;
sector_t* ss; sector_t* ss;
@ -1471,8 +1470,9 @@ void P_LoadSectors (MapData *map, FMissingTextureTracker &missingtex)
FDynamicColormap *fogMap, *normMap; FDynamicColormap *fogMap, *normMap;
int lumplen = map->Size(ML_SECTORS); int lumplen = map->Size(ML_SECTORS);
numsectors = lumplen / sizeof(mapsector_t); unsigned numsectors = lumplen / sizeof(mapsector_t);
sectors = new sector_t[numsectors]; level.sectors.Alloc(numsectors);
auto sectors = &level.sectors[0];
memset (sectors, 0, numsectors*sizeof(sector_t)); memset (sectors, 0, numsectors*sizeof(sector_t));
if (level.flags & LEVEL_SNDSEQTOTALCTRL) if (level.flags & LEVEL_SNDSEQTOTALCTRL)
@ -1490,7 +1490,7 @@ void P_LoadSectors (MapData *map, FMissingTextureTracker &missingtex)
// Extended properties // Extended properties
sectors[0].e = new extsector_t[numsectors]; sectors[0].e = new extsector_t[numsectors];
for (i = 0; i < numsectors; i++, ss++, ms++) for (unsigned i = 0; i < numsectors; i++, ss++, ms++)
{ {
ss->e = &sectors[0].e[i]; ss->e = &sectors[0].e[i];
if (!map->HasBehavior) ss->Flags |= SECF_FLOORDROP; if (!map->HasBehavior) ss->Flags |= SECF_FLOORDROP;
@ -2529,22 +2529,21 @@ void P_ProcessSideTextures(bool checktranmap, side_t *sd, sector_t *sec, intmaps
if (colorgood | foggood) if (colorgood | foggood)
{ {
int s;
FDynamicColormap *colormap = NULL; FDynamicColormap *colormap = NULL;
for (s = 0; s < numsectors; s++) for (unsigned s = 0; s < level.sectors.Size(); s++)
{ {
if (tagManager.SectorHasTag(s, tag)) if (tagManager.SectorHasTag(s, tag))
{ {
if (!colorgood) color = sectors[s].ColorMap->Color; if (!colorgood) color = level.sectors[s].ColorMap->Color;
if (!foggood) fog = sectors[s].ColorMap->Fade; if (!foggood) fog = level.sectors[s].ColorMap->Fade;
if (colormap == NULL || if (colormap == NULL ||
colormap->Color != color || colormap->Color != color ||
colormap->Fade != fog) colormap->Fade != fog)
{ {
colormap = GetSpecialLights (color, fog, 0); colormap = GetSpecialLights (color, fog, 0);
} }
sectors[s].ColorMap = colormap; level.sectors[s].ColorMap = colormap;
} }
} }
} }
@ -2638,14 +2637,14 @@ void P_LoadSideDefs2 (MapData *map, FMissingTextureTracker &missingtex)
// killough 4/11/98: refined to allow colormaps to work as wall // killough 4/11/98: refined to allow colormaps to work as wall
// textures if invalid as colormaps but valid as textures. // textures if invalid as colormaps but valid as textures.
if ((unsigned)LittleShort(msd->sector)>=(unsigned)numsectors) if ((unsigned)LittleShort(msd->sector)>=level.sectors.Size())
{ {
Printf (PRINT_HIGH, "Sidedef %d has a bad sector\n", i); Printf (PRINT_HIGH, "Sidedef %d has a bad sector\n", i);
sd->sector = sec = NULL; sd->sector = sec = NULL;
} }
else else
{ {
sd->sector = sec = &sectors[LittleShort(msd->sector)]; sd->sector = sec = &level.sectors[LittleShort(msd->sector)];
} }
intmapsidedef_t imsd; intmapsidedef_t imsd;
@ -3089,28 +3088,26 @@ static void P_GroupLines (bool buildmap)
{ {
cycle_t times[16]; cycle_t times[16];
unsigned int* linesDoneInEachSector; unsigned int* linesDoneInEachSector;
int i;
int total; int total;
line_t* li;
sector_t* sector; sector_t* sector;
FBoundingBox bbox; FBoundingBox bbox;
bool flaggedNoFronts = false; bool flaggedNoFronts = false;
unsigned int jj; unsigned int jj;
for (i = 0; i < (int)countof(times); ++i) for (unsigned i = 0; i < countof(times); ++i)
{ {
times[i].Reset(); times[i].Reset();
} }
// look up sector number for each subsector // look up sector number for each subsector
times[0].Clock(); times[0].Clock();
for (i = 0; i < numsubsectors; i++) for (int i = 0; i < numsubsectors; i++)
{ {
subsectors[i].sector = subsectors[i].firstline->sidedef->sector; subsectors[i].sector = subsectors[i].firstline->sidedef->sector;
} }
if (glsegextras != NULL) if (glsegextras != NULL)
{ {
for (i = 0; i < numsubsectors; i++) for (int i = 0; i < numsubsectors; i++)
{ {
for (jj = 0; jj < subsectors[i].numlines; ++jj) for (jj = 0; jj < subsectors[i].numlines; ++jj)
{ {
@ -3123,8 +3120,9 @@ static void P_GroupLines (bool buildmap)
// count number of lines in each sector // count number of lines in each sector
times[1].Clock(); times[1].Clock();
total = 0; total = 0;
for (i = 0, li = lines; i < numlines; i++, li++) for (int i = 0; i < numlines; i++)
{ {
auto li = &lines[i];
if (li->frontsector == NULL) if (li->frontsector == NULL)
{ {
if (!flaggedNoFronts) if (!flaggedNoFronts)
@ -3156,10 +3154,12 @@ static void P_GroupLines (bool buildmap)
times[3].Clock(); times[3].Clock();
linebuffer = new line_t *[total]; linebuffer = new line_t *[total];
line_t **lineb_p = linebuffer; line_t **lineb_p = linebuffer;
auto numsectors = level.sectors.Size();
linesDoneInEachSector = new unsigned int[numsectors]; linesDoneInEachSector = new unsigned int[numsectors];
memset (linesDoneInEachSector, 0, sizeof(int)*numsectors); memset (linesDoneInEachSector, 0, sizeof(int)*numsectors);
for (sector = sectors, i = 0; i < numsectors; i++, sector++) sector = &level.sectors[0];
for (unsigned i = 0; i < numsectors; i++, sector++)
{ {
if (sector->Lines.Count == 0) if (sector->Lines.Count == 0)
{ {
@ -3174,19 +3174,21 @@ static void P_GroupLines (bool buildmap)
} }
} }
for (i = numlines, li = lines; i > 0; --i, ++li) for (int i = 0; i < numlines; i++)
{ {
auto li = &lines[i];
if (li->frontsector != NULL) if (li->frontsector != NULL)
{ {
li->frontsector->Lines[linesDoneInEachSector[li->frontsector - sectors]++] = li; li->frontsector->Lines[linesDoneInEachSector[li->frontsector->Index()]++] = li;
} }
if (li->backsector != NULL && li->backsector != li->frontsector) if (li->backsector != NULL && li->backsector != li->frontsector)
{ {
li->backsector->Lines[linesDoneInEachSector[li->backsector - sectors]++] = li; li->backsector->Lines[linesDoneInEachSector[li->backsector->Index()]++] = li;
} }
} }
for (i = 0, sector = sectors; i < numsectors; ++i, ++sector) sector = &level.sectors[0];
for (unsigned i = 0; i < numsectors; ++i, ++sector)
{ {
if (linesDoneInEachSector[i] != sector->Lines.Size()) if (linesDoneInEachSector[i] != sector->Lines.Size())
{ {
@ -3235,7 +3237,7 @@ static void P_GroupLines (bool buildmap)
if (showloadtimes) if (showloadtimes)
{ {
Printf ("---Group Lines Times---\n"); Printf ("---Group Lines Times---\n");
for (i = 0; i < 7; ++i) for (int i = 0; i < 7; ++i)
{ {
Printf (" time %d:%9.4f ms\n", i, times[i].TimeMS()); Printf (" time %d:%9.4f ms\n", i, times[i].TimeMS());
} }
@ -3247,7 +3249,7 @@ static void P_GroupLines (bool buildmap)
// //
void P_LoadReject (MapData * map, bool junk) void P_LoadReject (MapData * map, bool junk)
{ {
const int neededsize = (numsectors * numsectors + 7) >> 3; const int neededsize = (level.sectors.Size() * level.sectors.Size() + 7) >> 3;
int rejectsize; int rejectsize;
if (strnicmp (map->MapLumps[ML_REJECT].Name, "REJECT", 8) != 0) if (strnicmp (map->MapLumps[ML_REJECT].Name, "REJECT", 8) != 0)
@ -3385,10 +3387,10 @@ static void P_PrecacheLevel()
if (cls != NULL) actorhitlist[cls] = true; if (cls != NULL) actorhitlist[cls] = true;
} }
for (i = numsectors - 1; i >= 0; i--) for (i = level.sectors.Size() - 1; i >= 0; i--)
{ {
hitlist[sectors[i].GetTexture(sector_t::floor).GetIndex()] |= FTextureManager::HIT_Flat; hitlist[level.sectors[i].GetTexture(sector_t::floor).GetIndex()] |= FTextureManager::HIT_Flat;
hitlist[sectors[i].GetTexture(sector_t::ceiling).GetIndex()] |= FTextureManager::HIT_Flat; hitlist[level.sectors[i].GetTexture(sector_t::ceiling).GetIndex()] |= FTextureManager::HIT_Flat;
} }
for (i = numsides - 1; i >= 0; i--) for (i = numsides - 1; i >= 0; i--)
@ -3458,13 +3460,12 @@ void P_FreeLevelData ()
delete[] glsegextras; delete[] glsegextras;
glsegextras = NULL; glsegextras = NULL;
} }
if (sectors != NULL) if (level.sectors.Size() > 0)
{ {
delete[] sectors[0].e; delete[] level.sectors[0].e;
delete[] sectors;
sectors = NULL;
} }
numsectors = 0; level.sectors.Clear();
if (gamenodes != NULL && gamenodes != nodes) if (gamenodes != NULL && gamenodes != nodes)
{ {
delete[] gamenodes; delete[] gamenodes;
@ -4069,10 +4070,10 @@ void P_SetupLevel (const char *lumpname, int position)
P_SpawnSpecials (); P_SpawnSpecials ();
// disable reflective planes on sloped sectors. // disable reflective planes on sloped sectors.
for (auto i = 0; i < numsectors; i++) for (auto &sec : level.sectors)
{ {
if (sectors[i].floorplane.isSlope()) sectors[i].reflect[sector_t::floor] = 0; if (sec.floorplane.isSlope()) sec.reflect[sector_t::floor] = 0;
if (sectors[i].ceilingplane.isSlope()) sectors[i].reflect[sector_t::ceiling] = 0; if (sec.ceilingplane.isSlope()) sec.reflect[sector_t::ceiling] = 0;
} }
// This must be done BEFORE the PolyObj Spawn!!! // This must be done BEFORE the PolyObj Spawn!!!
@ -4192,8 +4193,8 @@ void P_SetupLevel (const char *lumpname, int position)
MapThingsUserDataIndex.Clear(); MapThingsUserDataIndex.Clear();
MapThingsUserData.Clear(); MapThingsUserData.Clear();
loadsectors.Resize(numsectors); loadsectors.Resize(level.sectors.Size());
memcpy(&loadsectors[0], sectors, numsectors * sizeof(sector_t)); memcpy(&loadsectors[0], &level.sectors[0], loadsectors.Size() * sizeof(sector_t));
loadlines.Resize(numlines); loadlines.Resize(numlines);
memcpy(&loadlines[0], lines, numlines * sizeof(line_t)); memcpy(&loadlines[0], lines, numlines * sizeof(line_t));
loadsides.Resize(numsides); loadsides.Resize(numsides);

View File

@ -821,7 +821,7 @@ bool P_CheckSight (AActor *t1, AActor *t2, int flags)
const sector_t *s1 = t1->Sector; const sector_t *s1 = t1->Sector;
const sector_t *s2 = t2->Sector; const sector_t *s2 = t2->Sector;
int pnum = int(s1 - sectors) * numsectors + int(s2 - sectors); int pnum = int(s1->Index()) * level.sectors.Size() + int(s2->Index());
// //
// check for trivial rejection // check for trivial rejection

View File

@ -125,7 +125,7 @@ static void P_CopyPlane (int tag, sector_t *dest, bool copyCeil)
return; return;
} }
source = &sectors[secnum]; source = &level.sectors[secnum];
if (copyCeil) if (copyCeil)
{ {
@ -301,19 +301,18 @@ static void P_SetSlopesFromVertexHeights(FMapThing *firstmt, FMapThing *lastmt,
if (vt_found) if (vt_found)
{ {
for (int i = 0; i < numsectors; i++) for (auto &sec : level.sectors)
{ {
sector_t *sec = &sectors[i]; if (sec.Lines.Size() != 3) continue; // only works with triangular sectors
if (sec->Lines.Size() != 3) continue; // only works with triangular sectors
DVector3 vt1, vt2, vt3, cross; DVector3 vt1, vt2, vt3, cross;
DVector3 vec1, vec2; DVector3 vec1, vec2;
int vi1, vi2, vi3; int vi1, vi2, vi3;
vi1 = int(sec->Lines[0]->v1 - vertexes); vi1 = int(sec.Lines[0]->v1 - vertexes);
vi2 = int(sec->Lines[0]->v2 - vertexes); vi2 = int(sec.Lines[0]->v2 - vertexes);
vi3 = (sec->Lines[1]->v1 == sec->Lines[0]->v1 || sec->Lines[1]->v1 == sec->Lines[0]->v2)? vi3 = (sec.Lines[1]->v1 == sec.Lines[0]->v1 || sec.Lines[1]->v1 == sec.Lines[0]->v2)?
int(sec->Lines[1]->v2 - vertexes) : int(sec->Lines[1]->v1 - vertexes); int(sec.Lines[1]->v2 - vertexes) : int(sec.Lines[1]->v1 - vertexes);
vt1 = DVector3(vertexes[vi1].fPos(), 0); vt1 = DVector3(vertexes[vi1].fPos(), 0);
vt2 = DVector3(vertexes[vi2].fPos(), 0); vt2 = DVector3(vertexes[vi2].fPos(), 0);
@ -326,11 +325,11 @@ static void P_SetSlopesFromVertexHeights(FMapThing *firstmt, FMapThing *lastmt,
double *h3 = vt_heights[j].CheckKey(vi3); double *h3 = vt_heights[j].CheckKey(vi3);
if (h1 == NULL && h2 == NULL && h3 == NULL) continue; if (h1 == NULL && h2 == NULL && h3 == NULL) continue;
vt1.Z = h1? *h1 : j==0? sec->GetPlaneTexZ(sector_t::floor) : sec->GetPlaneTexZ(sector_t::ceiling); vt1.Z = h1? *h1 : j==0? sec.GetPlaneTexZ(sector_t::floor) : sec.GetPlaneTexZ(sector_t::ceiling);
vt2.Z = h2? *h2 : j==0? sec->GetPlaneTexZ(sector_t::floor) : sec->GetPlaneTexZ(sector_t::ceiling); vt2.Z = h2? *h2 : j==0? sec.GetPlaneTexZ(sector_t::floor) : sec.GetPlaneTexZ(sector_t::ceiling);
vt3.Z = h3? *h3 : j==0? sec->GetPlaneTexZ(sector_t::floor) : sec->GetPlaneTexZ(sector_t::ceiling); vt3.Z = h3? *h3 : j==0? sec.GetPlaneTexZ(sector_t::floor) : sec.GetPlaneTexZ(sector_t::ceiling);
if (P_PointOnLineSidePrecise(vertexes[vi3].fX(), vertexes[vi3].fY(), sec->Lines[0]) == 0) if (P_PointOnLineSidePrecise(vertexes[vi3].fX(), vertexes[vi3].fY(), sec.Lines[0]) == 0)
{ {
vec1 = vt2 - vt3; vec1 = vt2 - vt3;
vec2 = vt1 - vt3; vec2 = vt1 - vt3;
@ -358,7 +357,7 @@ static void P_SetSlopesFromVertexHeights(FMapThing *firstmt, FMapThing *lastmt,
cross = -cross; cross = -cross;
} }
secplane_t *plane = j==0? &sec->floorplane : &sec->ceilingplane; secplane_t *plane = j==0? &sec.floorplane : &sec.ceilingplane;
double dist = -cross[0] * vertexes[vi3].fX() - cross[1] * vertexes[vi3].fY() - cross[2] * vt3.Z; double dist = -cross[0] * vertexes[vi3].fX() - cross[1] * vertexes[vi3].fY() - cross[2] * vt3.Z;
plane->set(cross[0], cross[1], cross[2], dist); plane->set(cross[0], cross[1], cross[2], dist);

View File

@ -37,6 +37,7 @@
#include "doomdef.h" #include "doomdef.h"
#include "doomstat.h" #include "doomstat.h"
#include "d_event.h" #include "d_event.h"
#include "g_level.h"
#include "gstrings.h" #include "gstrings.h"
#include "i_system.h" #include "i_system.h"
@ -432,7 +433,7 @@ void P_PlayerInSpecialSector (player_t *player, sector_t * sector)
if (sector->isSecret()) if (sector->isSecret())
{ {
sector->ClearSecret(); sector->ClearSecret();
P_GiveSecret(player->mo, true, true, int(sector - sectors)); P_GiveSecret(player->mo, true, true, sector->Index());
} }
} }
@ -472,7 +473,7 @@ void P_SectorDamage(int tag, int amount, FName type, PClassActor *protectClass,
while ((secnum = itr.Next()) >= 0) while ((secnum = itr.Next()) >= 0)
{ {
AActor *actor, *next; AActor *actor, *next;
sector_t *sec = &sectors[secnum]; sector_t *sec = &level.sectors[secnum];
// Do for actors in this sector. // Do for actors in this sector.
for (actor = sec->thinglist; actor != NULL; actor = next) for (actor = sec->thinglist; actor != NULL; actor = next)
@ -629,13 +630,10 @@ CUSTOM_CVAR (Bool, forcewater, false, CVAR_ARCHIVE|CVAR_SERVERINFO)
{ {
if (gamestate == GS_LEVEL) if (gamestate == GS_LEVEL)
{ {
int i; for (auto &sec : level.sectors)
for (i = 0; i < numsectors; i++)
{ {
sector_t *hsec = sectors[i].GetHeightSec(); sector_t *hsec = sec.GetHeightSec();
if (hsec && if (hsec && !(hsec->MoreFlags & SECF_UNDERWATER))
!(sectors[i].heightsec->MoreFlags & SECF_UNDERWATER))
{ {
if (self) if (self)
{ {
@ -693,13 +691,13 @@ DLightTransfer::DLightTransfer (sector_t *srcSec, int target, bool copyFloor)
{ {
FSectorTagIterator itr(target); FSectorTagIterator itr(target);
while ((secnum = itr.Next()) >= 0) while ((secnum = itr.Next()) >= 0)
sectors[secnum].ChangeFlags(sector_t::floor, 0, PLANEF_ABSLIGHTING); level.sectors[secnum].ChangeFlags(sector_t::floor, 0, PLANEF_ABSLIGHTING);
} }
else else
{ {
FSectorTagIterator itr(target); FSectorTagIterator itr(target);
while ((secnum = itr.Next()) >= 0) while ((secnum = itr.Next()) >= 0)
sectors[secnum].ChangeFlags(sector_t::ceiling, 0, PLANEF_ABSLIGHTING); level.sectors[secnum].ChangeFlags(sector_t::ceiling, 0, PLANEF_ABSLIGHTING);
} }
ChangeStatNum (STAT_LIGHTTRANSFER); ChangeStatNum (STAT_LIGHTTRANSFER);
} }
@ -715,7 +713,7 @@ void DLightTransfer::Tick ()
} }
} }
void DLightTransfer::DoTransfer (int level, int target, bool floor) void DLightTransfer::DoTransfer (int llevel, int target, bool floor)
{ {
int secnum; int secnum;
@ -723,13 +721,13 @@ void DLightTransfer::DoTransfer (int level, int target, bool floor)
{ {
FSectorTagIterator itr(target); FSectorTagIterator itr(target);
while ((secnum = itr.Next()) >= 0) while ((secnum = itr.Next()) >= 0)
sectors[secnum].SetPlaneLight(sector_t::floor, level); level.sectors[secnum].SetPlaneLight(sector_t::floor, llevel);
} }
else else
{ {
FSectorTagIterator itr(target); FSectorTagIterator itr(target);
while ((secnum = itr.Next()) >= 0) while ((secnum = itr.Next()) >= 0)
sectors[secnum].SetPlaneLight(sector_t::ceiling, level); level.sectors[secnum].SetPlaneLight(sector_t::ceiling, llevel);
} }
} }
@ -957,7 +955,7 @@ static void CopyPortal(int sectortag, int plane, unsigned pnum, double alpha, bo
FSectorTagIterator itr(sectortag); FSectorTagIterator itr(sectortag);
while ((s = itr.Next()) >= 0) while ((s = itr.Next()) >= 0)
{ {
SetPortal(&sectors[s], plane, pnum, alpha); SetPortal(&level.sectors[s], plane, pnum, alpha);
} }
for (int j=0;j<numlines;j++) for (int j=0;j<numlines;j++)
@ -978,7 +976,7 @@ static void CopyPortal(int sectortag, int plane, unsigned pnum, double alpha, bo
FSectorTagIterator itr(lines[j].args[0]); FSectorTagIterator itr(lines[j].args[0]);
while ((s = itr.Next()) >= 0) while ((s = itr.Next()) >= 0)
{ {
SetPortal(&sectors[s], plane, pnum, alpha); SetPortal(&level.sectors[s], plane, pnum, alpha);
} }
} }
} }
@ -1159,7 +1157,7 @@ void P_InitSectorSpecial(sector_t *sector, int special)
case dScroll_EastLavaDamage: case dScroll_EastLavaDamage:
P_SetupSectorDamage(sector, 5, 32, 256, NAME_Fire, SECF_DMGTERRAINFX); P_SetupSectorDamage(sector, 5, 32, 256, NAME_Fire, SECF_DMGTERRAINFX);
P_CreateScroller(EScroll::sc_floor, -4., 0, -1, int(sector - sectors), 0); P_CreateScroller(EScroll::sc_floor, -4., 0, -1, sector->Index(), 0);
keepspecial = true; keepspecial = true;
break; break;
@ -1217,14 +1215,14 @@ void P_InitSectorSpecial(sector_t *sector, int special)
int i = sector->special - Scroll_North_Slow; int i = sector->special - Scroll_North_Slow;
double dx = hexenScrollies[i][0] / 2.; double dx = hexenScrollies[i][0] / 2.;
double dy = hexenScrollies[i][1] / 2.; double dy = hexenScrollies[i][1] / 2.;
P_CreateScroller(EScroll::sc_floor, dx, dy, -1, int(sector-sectors), 0); P_CreateScroller(EScroll::sc_floor, dx, dy, -1, sector->Index(), 0);
} }
else if (sector->special >= Carry_East5 && else if (sector->special >= Carry_East5 &&
sector->special <= Carry_East35) sector->special <= Carry_East35)
{ // Heretic scroll special { // Heretic scroll special
// Only east scrollers also scroll the texture // Only east scrollers also scroll the texture
P_CreateScroller(EScroll::sc_floor, P_CreateScroller(EScroll::sc_floor,
-0.5 * (1 << ((sector->special & 0xff) - Carry_East5)), 0, -1, int(sector-sectors), 0); -0.5 * (1 << ((sector->special & 0xff) - Carry_East5)), 0, -1, sector->Index(), 0);
} }
keepspecial = true; keepspecial = true;
break; break;
@ -1240,20 +1238,14 @@ void P_InitSectorSpecial(sector_t *sector, int special)
void P_SpawnSpecials (void) void P_SpawnSpecials (void)
{ {
sector_t *sector;
int i;
P_SetupPortals(); P_SetupPortals();
// Init special SECTORs. for (auto &sec : level.sectors)
sector = sectors;
for (i = 0; i < numsectors; i++, sector++)
{ {
if (sector->special == 0) if (sec.special == 0)
continue; continue;
P_InitSectorSpecial(sector, sector->special); P_InitSectorSpecial(&sec, sec.special);
} }
#ifndef NO_EDATA #ifndef NO_EDATA
@ -1274,7 +1266,7 @@ void P_SpawnSpecials (void)
P_SpawnSkybox(pt2); P_SpawnSkybox(pt2);
} }
for (i = 0; i < numlines; i++) for (int i = 0; i < numlines; i++)
{ {
switch (lines[i].special) switch (lines[i].special)
{ {
@ -1313,9 +1305,9 @@ void P_SpawnSpecials (void)
FSectorTagIterator itr(lines[i].args[0]); FSectorTagIterator itr(lines[i].args[0]);
while ((s = itr.Next()) >= 0) while ((s = itr.Next()) >= 0)
{ {
sectors[s].heightsec = sec; level.sectors[s].heightsec = sec;
sec->e->FakeFloor.Sectors.Push(&sectors[s]); sec->e->FakeFloor.Sectors.Push(&level.sectors[s]);
sectors[s].AdjustFloorClip(); level.sectors[s].AdjustFloorClip();
} }
break; break;
} }
@ -1388,7 +1380,7 @@ void P_SpawnSpecials (void)
double grav = lines[i].Delta().Length() / 100.; double grav = lines[i].Delta().Length() / 100.;
FSectorTagIterator itr(lines[i].args[0]); FSectorTagIterator itr(lines[i].args[0]);
while ((s = itr.Next()) >= 0) while ((s = itr.Next()) >= 0)
sectors[s].gravity = grav; level.sectors[s].gravity = grav;
} }
break; break;
@ -1401,7 +1393,7 @@ void P_SpawnSpecials (void)
FSectorTagIterator itr(lines[i].args[0]); FSectorTagIterator itr(lines[i].args[0]);
while ((s = itr.Next()) >= 0) while ((s = itr.Next()) >= 0)
{ {
sector_t *sec = &sectors[s]; sector_t *sec = &level.sectors[s];
sec->damageamount = damage; sec->damageamount = damage;
sec->damagetype = NAME_None; sec->damagetype = NAME_None;
if (sec->damageamount < 20) if (sec->damageamount < 20)
@ -1441,7 +1433,7 @@ void P_SpawnSpecials (void)
{ {
FSectorTagIterator itr(lines[i].args[0]); FSectorTagIterator itr(lines[i].args[0]);
while ((s = itr.Next()) >= 0) while ((s = itr.Next()) >= 0)
sectors[s].sky = (i + 1) | PL_SKYFLAT; level.sectors[s].sky = (i + 1) | PL_SKYFLAT;
break; break;
} }
} }
@ -1561,19 +1553,19 @@ void P_SetSectorFriction (int tag, int amount, bool alterFlag)
// drag on CPU. New code adjusts friction of sector only once // drag on CPU. New code adjusts friction of sector only once
// at level startup, and then uses this friction value. // at level startup, and then uses this friction value.
sectors[s].friction = friction; level.sectors[s].friction = friction;
sectors[s].movefactor = movefactor; level.sectors[s].movefactor = movefactor;
if (alterFlag) if (alterFlag)
{ {
// When used inside a script, the sectors' friction flags // When used inside a script, the sectors' friction flags
// can be enabled and disabled at will. // can be enabled and disabled at will.
if (friction == ORIG_FRICTION) if (friction == ORIG_FRICTION)
{ {
sectors[s].Flags &= ~SECF_FRICTION; level.sectors[s].Flags &= ~SECF_FRICTION;
} }
else else
{ {
sectors[s].Flags |= SECF_FRICTION; level.sectors[s].Flags |= SECF_FRICTION;
} }
} }
} }

View File

@ -45,11 +45,6 @@ FTagManager tagManager;
// //
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
static inline int sectindex(const sector_t *sector)
{
return (int)(intptr_t)(sector - sectors);
}
static inline int lineindex(const line_t *line) static inline int lineindex(const line_t *line)
{ {
return (int)(intptr_t)(line - lines); return (int)(intptr_t)(line - lines);
@ -194,7 +189,7 @@ void FTagManager::HashTags()
bool FTagManager::SectorHasTags(const sector_t *sector) const bool FTagManager::SectorHasTags(const sector_t *sector) const
{ {
int i = sectindex(sector); int i = sector->Index();
return SectorHasTags(i); return SectorHasTags(i);
} }
@ -206,7 +201,7 @@ bool FTagManager::SectorHasTags(const sector_t *sector) const
int FTagManager::GetFirstSectorTag(const sector_t *sect) const int FTagManager::GetFirstSectorTag(const sector_t *sect) const
{ {
int i = sectindex(sect); int i = sect->Index();
return SectorHasTags(i) ? allTags[startForSector[i]].tag : 0; return SectorHasTags(i) ? allTags[startForSector[i]].tag : 0;
} }
@ -238,7 +233,7 @@ bool FTagManager::SectorHasTag(int i, int tag) const
bool FTagManager::SectorHasTag(const sector_t *sector, int tag) const bool FTagManager::SectorHasTag(const sector_t *sector, int tag) const
{ {
return SectorHasTag(sectindex(sector), tag); return SectorHasTag(sector->Index(), tag);
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@ -334,11 +329,11 @@ int FSectorTagIterator::Next()
else else
{ {
// with the tag manager, searching for tag 0 has to be different, because it won't create entries for untagged sectors. // with the tag manager, searching for tag 0 has to be different, because it won't create entries for untagged sectors.
while (start < numsectors && tagManager.SectorHasTags(start)) while (start < (int)level.sectors.Size() && tagManager.SectorHasTags(start))
{ {
start++; start++;
} }
if (start == numsectors) return -1; if (start == (int)level.sectors.Size()) return -1;
ret = start; ret = start;
start++; start++;
} }
@ -355,7 +350,7 @@ int FSectorTagIterator::NextCompat(bool compat, int start)
{ {
if (!compat) return Next(); if (!compat) return Next();
for (int i = start + 1; i < numsectors; i++) for (unsigned i = start + 1; i < level.sectors.Size(); i++)
{ {
if (tagManager.SectorHasTag(i, searchtag)) return i; if (tagManager.SectorHasTag(i, searchtag)) return i;
} }

View File

@ -90,7 +90,7 @@ public:
if (tag == 0) if (tag == 0)
{ {
searchtag = INT_MIN; searchtag = INT_MIN;
start = (line == NULL || line->backsector == NULL)? -1 : (int)(line->backsector - sectors); start = (line == NULL || line->backsector == NULL)? -1 : line->backsector->Index();
} }
else else
{ {

View File

@ -333,7 +333,7 @@ static AActor *SelectTeleDest (int tid, int tag, bool norandom)
TThinkerIterator<AActor> it2(NAME_TeleportDest); TThinkerIterator<AActor> it2(NAME_TeleportDest);
while ((searcher = it2.Next()) != NULL) while ((searcher = it2.Next()) != NULL)
{ {
if (searcher->Sector == sectors + secnum) if (searcher->Sector == &level.sectors[secnum])
{ {
return searcher; return searcher;
} }
@ -729,7 +729,7 @@ bool EV_TeleportSector (int tag, int source_tid, int dest_tid, bool fog, int gro
while ((secnum = itr.Next()) >= 0) while ((secnum = itr.Next()) >= 0)
{ {
msecnode_t *node; msecnode_t *node;
const sector_t * const sec = &sectors[secnum]; const sector_t * const sec = &level.sectors[secnum];
for (node = sec->touching_thinglist; node; ) for (node = sec->touching_thinglist; node; )
{ {

View File

@ -444,7 +444,7 @@ bool FTraceInfo::LineCheck(intercept_t *in, double dist, DVector3 hit)
// hit crossed a water plane // hit crossed a water plane
if (CheckSectorPlane(hsec, true)) if (CheckSectorPlane(hsec, true))
{ {
Results->CrossedWater = &sectors[CurSector->sectornum]; Results->CrossedWater = &level.sectors[CurSector->sectornum];
Results->CrossedWaterPos = Results->HitPos; Results->CrossedWaterPos = Results->HitPos;
Results->Distance = 0; Results->Distance = 0;
} }
@ -572,7 +572,7 @@ cont:
if (Results->HitType != TRACE_HitNone) if (Results->HitType != TRACE_HitNone)
{ {
// We hit something, so figure out where exactly // We hit something, so figure out where exactly
Results->Sector = &sectors[CurSector->sectornum]; Results->Sector = &level.sectors[CurSector->sectornum];
if (Results->HitType != TRACE_HitWall && if (Results->HitType != TRACE_HitWall &&
!CheckSectorPlane(CurSector, Results->HitType == TRACE_HitFloor)) !CheckSectorPlane(CurSector, Results->HitType == TRACE_HitFloor))
@ -698,7 +698,7 @@ bool FTraceInfo::ThingCheck(intercept_t *in, double dist, DVector3 hit)
// the trace hit a 3D floor before the thing. // the trace hit a 3D floor before the thing.
// Calculate an intersection and abort. // Calculate an intersection and abort.
Results->Sector = &sectors[CurSector->sectornum]; Results->Sector = &level.sectors[CurSector->sectornum];
if (!CheckSectorPlane(CurSector, Results->HitType == TRACE_HitFloor)) if (!CheckSectorPlane(CurSector, Results->HitType == TRACE_HitFloor))
{ {
Results->HitType = TRACE_HitNone; Results->HitType = TRACE_HitNone;
@ -850,7 +850,7 @@ bool FTraceInfo::TraceTraverse (int ptflags)
} }
// check for intersection with floor/ceiling // check for intersection with floor/ceiling
Results->Sector = &sectors[CurSector->sectornum]; Results->Sector = &level.sectors[CurSector->sectornum];
if (Results->CrossedWater == NULL && if (Results->CrossedWater == NULL &&
CurSector->heightsec != NULL && CurSector->heightsec != NULL &&
@ -864,7 +864,7 @@ bool FTraceInfo::TraceTraverse (int ptflags)
if (CheckSectorPlane(CurSector->heightsec, true)) if (CheckSectorPlane(CurSector->heightsec, true))
{ {
Results->CrossedWater = &sectors[CurSector->sectornum]; Results->CrossedWater = &level.sectors[CurSector->sectornum];
Results->CrossedWaterPos = Results->HitPos; Results->CrossedWaterPos = Results->HitPos;
Results->Distance = 0; Results->Distance = 0;
} }

View File

@ -1834,7 +1834,7 @@ public:
{ {
sides[side] = ParsedSides[mapside]; sides[side] = ParsedSides[mapside];
sides[side].linedef = &lines[line]; sides[side].linedef = &lines[line];
sides[side].sector = &sectors[intptr_t(sides[side].sector)]; sides[side].sector = &level.sectors[intptr_t(sides[side].sector)];
lines[line].sidedef[sd] = &sides[side]; lines[line].sidedef[sd] = &sides[side];
P_ProcessSideTextures(!isExtended, &sides[side], sides[side].sector, &ParsedSideTextures[mapside], P_ProcessSideTextures(!isExtended, &sides[side], sides[side].sector, &ParsedSideTextures[mapside],
@ -2019,13 +2019,12 @@ public:
memcpy(vertexdatas, &ParsedVertexDatas[0], numvertexdatas * sizeof(*vertexdatas)); memcpy(vertexdatas, &ParsedVertexDatas[0], numvertexdatas * sizeof(*vertexdatas));
// Create the real sectors // Create the real sectors
numsectors = ParsedSectors.Size(); level.sectors.Alloc(ParsedSectors.Size());
sectors = new sector_t[numsectors]; memcpy(&level.sectors[0], &ParsedSectors[0], level.sectors.Size() * sizeof(sector_t));
memcpy(sectors, &ParsedSectors[0], numsectors * sizeof(*sectors)); level.sectors[0].e = new extsector_t[level.sectors.Size()];
sectors[0].e = new extsector_t[numsectors]; for(unsigned i = 0; i < level.sectors.Size(); i++)
for(int i = 0; i < numsectors; i++)
{ {
sectors[i].e = &sectors[0].e[i]; level.sectors[i].e = &level.sectors[0].e[i];
} }
// Create the real linedefs and decompress the sidedefs // Create the real linedefs and decompress the sidedefs

View File

@ -2061,7 +2061,7 @@ void P_MovePlayer (player_t *player)
msecnode_t *n = player->mo->touching_sectorlist; msecnode_t *n = player->mo->touching_sectorlist;
while (n != NULL) while (n != NULL)
{ {
fprintf (debugfile, "%td ", n->m_sector-sectors); fprintf (debugfile, "%d ", n->m_sector->sectornum);
n = n->m_tnext; n = n->m_tnext;
} }
fprintf (debugfile, "]\n"); fprintf (debugfile, "]\n");

View File

@ -152,7 +152,7 @@ static int WriteSIDEDEFS (FILE *file)
{ {
msd.textureoffset = LittleShort(short(sides[i].GetTextureXOffset(side_t::mid))); msd.textureoffset = LittleShort(short(sides[i].GetTextureXOffset(side_t::mid)));
msd.rowoffset = LittleShort(short(sides[i].GetTextureYOffset(side_t::mid))); msd.rowoffset = LittleShort(short(sides[i].GetTextureYOffset(side_t::mid)));
msd.sector = LittleShort(short(sides[i].sector - sectors)); msd.sector = LittleShort(short(sides[i].sector - &level.sectors[0]));
uppercopy (msd.toptexture, GetTextureName (sides[i].GetTexture(side_t::top))); uppercopy (msd.toptexture, GetTextureName (sides[i].GetTexture(side_t::top)));
uppercopy (msd.bottomtexture, GetTextureName (sides[i].GetTexture(side_t::bottom))); uppercopy (msd.bottomtexture, GetTextureName (sides[i].GetTexture(side_t::bottom)));
uppercopy (msd.midtexture, GetTextureName (sides[i].GetTexture(side_t::mid))); uppercopy (msd.midtexture, GetTextureName (sides[i].GetTexture(side_t::mid)));
@ -194,18 +194,18 @@ static int WriteSECTORS (FILE *file)
{ {
mapsector_t ms; mapsector_t ms;
for (int i = 0; i < numsectors; ++i) for (unsigned i = 0; i < level.sectors.Size(); ++i)
{ {
ms.floorheight = LittleShort(short(sectors[i].GetPlaneTexZ(sector_t::floor))); ms.floorheight = LittleShort(short(level.sectors[i].GetPlaneTexZ(sector_t::floor)));
ms.ceilingheight = LittleShort(short(sectors[i].GetPlaneTexZ(sector_t::ceiling))); ms.ceilingheight = LittleShort(short(level.sectors[i].GetPlaneTexZ(sector_t::ceiling)));
uppercopy (ms.floorpic, GetTextureName (sectors[i].GetTexture(sector_t::floor))); uppercopy (ms.floorpic, GetTextureName (level.sectors[i].GetTexture(sector_t::floor)));
uppercopy (ms.ceilingpic, GetTextureName (sectors[i].GetTexture(sector_t::ceiling))); uppercopy (ms.ceilingpic, GetTextureName (level.sectors[i].GetTexture(sector_t::ceiling)));
ms.lightlevel = LittleShort((short)sectors[i].lightlevel); ms.lightlevel = LittleShort((short)level.sectors[i].lightlevel);
ms.special = LittleShort(sectors[i].special); ms.special = LittleShort(level.sectors[i].special);
ms.tag = LittleShort(tagManager.GetFirstSectorTag(&sectors[i])); ms.tag = LittleShort(tagManager.GetFirstSectorTag(&level.sectors[i]));
fwrite (&ms, sizeof(ms), 1, file); fwrite (&ms, sizeof(ms), 1, file);
} }
return numsectors * sizeof(ms); return level.sectors.Size() * sizeof(ms);
} }
static int WriteREJECT (FILE *file) static int WriteREJECT (FILE *file)

View File

@ -980,18 +980,18 @@ void P_CreateLinkedPortals()
id = 1; id = 1;
if (orgs.Size() != 0) if (orgs.Size() != 0)
{ {
for (int i = 0; i < numsectors; i++) for (auto &sec : level.sectors)
{ {
for (int j = 0; j < 2; j++) for (int j = 0; j < 2; j++)
{ {
if (sectors[i].GetPortalType(j) == PORTS_LINKEDPORTAL) if (sec.GetPortalType(j) == PORTS_LINKEDPORTAL)
{ {
secplane_t &plane = j == 0 ? sectors[i].floorplane : sectors[i].ceilingplane; secplane_t &plane = j == 0 ? sec.floorplane : sec.ceilingplane;
if (plane.isSlope()) if (plane.isSlope())
{ {
// The engine cannot deal with portals on a sloped plane. // The engine cannot deal with portals on a sloped plane.
sectors[i].ClearPortal(j); sec.ClearPortal(j);
Printf("Portal on %s of sector %d is sloped and will be disabled\n", j == 0 ? "floor" : "ceiling", i); Printf("Portal on %s of sector %d is sloped and will be disabled\n", j == 0 ? "floor" : "ceiling", sec.sectornum);
} }
} }
} }
@ -1015,14 +1015,14 @@ void P_CreateLinkedPortals()
Displacements.Create(id); Displacements.Create(id);
// Check for leftover sectors that connect to a portal // Check for leftover sectors that connect to a portal
for (int i = 0; i<numsectors; i++) for (auto &sec : level.sectors)
{ {
for (int j = 0; j < 2; j++) for (int j = 0; j < 2; j++)
{ {
if (sectors[i].GetPortalType(j) == PORTS_LINKEDPORTAL && sectors[i].PortalGroup == 0) if (sec.GetPortalType(j) == PORTS_LINKEDPORTAL && sec.PortalGroup == 0)
{ {
auto p = sectors[i].GetPortal(j); auto p = sec.GetPortal(j);
CollectSectors(p->mOrigin->PortalGroup, &sectors[i]); CollectSectors(p->mOrigin->PortalGroup, &sec);
} }
} }
} }
@ -1048,10 +1048,10 @@ void P_CreateLinkedPortals()
(dispxy.pos.X != -dispyx.pos.X || dispxy.pos.Y != -dispyx.pos.Y)) (dispxy.pos.X != -dispyx.pos.X || dispxy.pos.Y != -dispyx.pos.Y))
{ {
int sec1 = -1, sec2 = -1; int sec1 = -1, sec2 = -1;
for (int i = 0; i < numsectors && (sec1 == -1 || sec2 == -1); i++) for (unsigned i = 0; i < level.sectors.Size() && (sec1 == -1 || sec2 == -1); i++)
{ {
if (sec1 == -1 && sectors[i].PortalGroup == x) sec1 = i; if (sec1 == -1 && level.sectors[i].PortalGroup == x) sec1 = i;
if (sec2 == -1 && sectors[i].PortalGroup == y) sec2 = i; if (sec2 == -1 && level.sectors[i].PortalGroup == y) sec2 = i;
} }
Printf("Link offset mismatch between sectors %d and %d\n", sec1, sec2); Printf("Link offset mismatch between sectors %d and %d\n", sec1, sec2);
bogus = true; bogus = true;
@ -1065,13 +1065,13 @@ void P_CreateLinkedPortals()
} }
} }
// and now print a message for everything that still wasn't processed. // and now print a message for everything that still wasn't processed.
for (int i = 0; i < numsectors; i++) for (auto &sec : level.sectors)
{ {
if (sectors[i].PortalGroup == 0) if (sec.PortalGroup == 0)
{ {
Printf("Unable to assign sector %d to any group. Possibly self-referencing\n", i); Printf("Unable to assign sector %d to any group. Possibly self-referencing\n", sec.sectornum);
} }
else if (sectors[i].PortalGroup == -1) sectors[i].PortalGroup = 0; else if (sec.PortalGroup == -1) sec.PortalGroup = 0;
} }
} }
} }
@ -1088,41 +1088,41 @@ void P_CreateLinkedPortals()
rejectmatrix = NULL; rejectmatrix = NULL;
} }
// finally we must flag all planes which are obstructed by the sector's own ceiling or floor. // finally we must flag all planes which are obstructed by the sector's own ceiling or floor.
for (int i = 0; i < numsectors; i++) for (auto &sec : level.sectors)
{ {
sectors[i].CheckPortalPlane(sector_t::floor); sec.CheckPortalPlane(sector_t::floor);
sectors[i].CheckPortalPlane(sector_t::ceiling); sec.CheckPortalPlane(sector_t::ceiling);
// set a flag on each line connecting to a plane portal sector. This is used to reduce the amount of checks in P_CheckSight. // set a flag on each line connecting to a plane portal sector. This is used to reduce the amount of checks in P_CheckSight.
if (sectors[i].PortalIsLinked(sector_t::floor) || sectors[i].PortalIsLinked(sector_t::ceiling)) if (sec.PortalIsLinked(sector_t::floor) || sec.PortalIsLinked(sector_t::ceiling))
{ {
for(auto ln : sectors[i].Lines) for(auto ln : sec.Lines)
{ {
ln->flags |= ML_PORTALCONNECT; ln->flags |= ML_PORTALCONNECT;
} }
} }
if (sectors[i].PortalIsLinked(sector_t::ceiling) && sectors[i].PortalIsLinked(sector_t::floor)) if (sec.PortalIsLinked(sector_t::ceiling) && sec.PortalIsLinked(sector_t::floor))
{ {
double cz = sectors[i].GetPortalPlaneZ(sector_t::ceiling); double cz = sec.GetPortalPlaneZ(sector_t::ceiling);
double fz = sectors[i].GetPortalPlaneZ(sector_t::floor); double fz = sec.GetPortalPlaneZ(sector_t::floor);
if (cz < fz) if (cz < fz)
{ {
// This is a fatal condition. We have to remove one of the two portals. Choose the one that doesn't match the current plane // This is a fatal condition. We have to remove one of the two portals. Choose the one that doesn't match the current plane
Printf("Error in sector %d: Ceiling portal at z=%f is below floor portal at z=%f\n", i, cz, fz); Printf("Error in sector %d: Ceiling portal at z=%f is below floor portal at z=%f\n", sec.sectornum, cz, fz);
double cp = -sectors[i].ceilingplane.fD(); double cp = -sec.ceilingplane.fD();
double fp = sectors[i].floorplane.fD(); double fp = sec.floorplane.fD();
if (cp < fp || fz == fp) if (cp < fp || fz == fp)
{ {
sectors[i].ClearPortal(sector_t::ceiling); sec.ClearPortal(sector_t::ceiling);
} }
else else
{ {
sectors[i].ClearPortal(sector_t::floor); sec.ClearPortal(sector_t::floor);
} }
} }
} }
// mark all sector planes that check out ok for everything. // mark all sector planes that check out ok for everything.
if (sectors[i].PortalIsLinked(sector_t::floor)) sectors[i].planes[sector_t::floor].Flags |= PLANEF_LINKED; if (sec.PortalIsLinked(sector_t::floor)) sec.planes[sector_t::floor].Flags |= PLANEF_LINKED;
if (sectors[i].PortalIsLinked(sector_t::ceiling)) sectors[i].planes[sector_t::ceiling].Flags |= PLANEF_LINKED; if (sec.PortalIsLinked(sector_t::ceiling)) sec.planes[sector_t::ceiling].Flags |= PLANEF_LINKED;
} }
if (linkedPortals.Size() > 0) if (linkedPortals.Size() > 0)
{ {

View File

@ -23,7 +23,6 @@
#ifndef __R_DEFS_H__ #ifndef __R_DEFS_H__
#define __R_DEFS_H__ #define __R_DEFS_H__
#include <forward_list>
#include "doomdef.h" #include "doomdef.h"
#include "templates.h" #include "templates.h"
#include "memarena.h" #include "memarena.h"
@ -659,6 +658,7 @@ public:
double FindLowestCeilingPoint(vertex_t **v) const; double FindLowestCeilingPoint(vertex_t **v) const;
double FindHighestFloorPoint(vertex_t **v) const; double FindHighestFloorPoint(vertex_t **v) const;
void RemoveForceField(); void RemoveForceField();
int Index() const { return int(this - &level.sectors[0]); }
void AdjustFloorClip () const; void AdjustFloorClip () const;
void SetColor(int r, int g, int b, int desat); void SetColor(int r, int g, int b, int desat);

View File

@ -50,9 +50,6 @@ extern vertexdata_t* vertexdatas;
extern int numsegs; extern int numsegs;
extern seg_t* segs; extern seg_t* segs;
extern int numsectors;
extern sector_t* sectors;
extern int numsubsectors; extern int numsubsectors;
extern subsector_t* subsectors; extern subsector_t* subsectors;

View File

@ -711,6 +711,26 @@ static int fieldcmp(const void * a, const void * b)
void InitThingdef() void InitThingdef()
{ {
// Create all global variables here because this cannot be done on the script side and really isn't worth adding support for. // Create all global variables here because this cannot be done on the script side and really isn't worth adding support for.
// Also create all special fields here that cannot be declared by script syntax.
auto secplanestruct = NewNativeStruct("Secplane", nullptr);
secplanestruct->Size = sizeof(secplane_t);
secplanestruct->Align = alignof(secplane_t);
auto sectorstruct = NewNativeStruct("Sector", nullptr);
sectorstruct->Size = sizeof(sector_t);
sectorstruct->Align = alignof(sector_t);
// set up the lines array in the sector struct. This is a bit messy because the type system is not prepared to handle a pointer to an array of pointers to a native struct even remotely well...
// As a result, the size has to be set to something large and arbritrary because it can change between maps. This will need some serious improvement when things get cleaned up.
sectorstruct->AddNativeField("lines", NewPointer(NewResizableArray(NewPointer(NewNativeStruct("line", nullptr), false)), false), myoffsetof(sector_t, Lines), VARF_Native);
// add the sector planes. These are value items of native structs so they have to be done here.
sectorstruct->AddNativeField("ceilingplane", secplanestruct, myoffsetof(sector_t, ceilingplane), VARF_Native);
sectorstruct->AddNativeField("floorplane", secplanestruct, myoffsetof(sector_t, floorplane), VARF_Native);
// expose the global validcount variable. // expose the global validcount variable.
PField *vcf = new PField("validcount", TypeSInt32, VARF_Native | VARF_Static, (intptr_t)&validcount); PField *vcf = new PField("validcount", TypeSInt32, VARF_Native | VARF_Static, (intptr_t)&validcount);
@ -725,10 +745,12 @@ void InitThingdef()
PField *levelf = new PField("level", lstruct, VARF_Native | VARF_Static, (intptr_t)&level); PField *levelf = new PField("level", lstruct, VARF_Native | VARF_Static, (intptr_t)&level);
GlobalSymbols.AddSymbol(levelf); GlobalSymbols.AddSymbol(levelf);
// Add the sector array to LevelLocals.
lstruct->AddNativeField("sectors", NewPointer(NewResizableArray(sectorstruct), false), myoffsetof(FLevelLocals, sectors), VARF_Native);
// set up a variable for the DEH data // set up a variable for the DEH data
PStruct *dstruct = NewNativeStruct("DehInfo", nullptr); PStruct *dstruct = NewNativeStruct("DehInfo", nullptr);
PField *dehf = new PField("deh", dstruct, VARF_Native | VARF_Static, (intptr_t)&deh); PField *dehf = new PField("deh", dstruct, VARF_Native | VARF_Static, (intptr_t)&deh);
GlobalSymbols.AddSymbol(dehf); GlobalSymbols.AddSymbol(dehf);
// set up a variable for the global players array. // set up a variable for the global players array.
@ -739,11 +761,6 @@ void InitThingdef()
PField *playerf = new PField("players", parray, VARF_Native | VARF_Static, (intptr_t)&players); PField *playerf = new PField("players", parray, VARF_Native | VARF_Static, (intptr_t)&players);
GlobalSymbols.AddSymbol(playerf); GlobalSymbols.AddSymbol(playerf);
// set up the lines array in the sector struct. This is a bit messy because the type system is not prepared to handle a pointer to an array of pointers to a native struct even remotely well...
// As a result, the size has to be set to something large and arbritrary because it can change between maps. This will need some serious improvement when things get cleaned up.
pstruct = NewNativeStruct("Sector", nullptr);
pstruct->AddNativeField("lines", NewPointer(NewResizableArray(NewPointer(NewNativeStruct("line", nullptr), false)), false), myoffsetof(sector_t, Lines), VARF_Native);
parray = NewArray(TypeBool, MAXPLAYERS); parray = NewArray(TypeBool, MAXPLAYERS);
playerf = new PField("playeringame", parray, VARF_Native | VARF_Static | VARF_ReadOnly, (intptr_t)&playeringame); playerf = new PField("playeringame", parray, VARF_Native | VARF_Static | VARF_ReadOnly, (intptr_t)&playeringame);
GlobalSymbols.AddSymbol(playerf); GlobalSymbols.AddSymbol(playerf);

View File

@ -1463,12 +1463,12 @@ template<> FSerializer &Serialize(FSerializer &arc, const char *key, side_t *&va
template<> FSerializer &Serialize(FSerializer &arc, const char *key, sector_t *&value, sector_t **defval) template<> FSerializer &Serialize(FSerializer &arc, const char *key, sector_t *&value, sector_t **defval)
{ {
return SerializePointer(arc, key, value, defval, sectors); return SerializePointer(arc, key, value, defval, &level.sectors[0]);
} }
template<> FSerializer &Serialize(FSerializer &arc, const char *key, const sector_t *&value, const sector_t **defval) template<> FSerializer &Serialize(FSerializer &arc, const char *key, const sector_t *&value, const sector_t **defval)
{ {
return SerializePointer<const sector_t>(arc, key, value, defval, sectors); return SerializePointer<const sector_t>(arc, key, value, defval, &level.sectors[0]);
} }
template<> FSerializer &Serialize(FSerializer &arc, const char *key, player_t *&value, player_t **defval) template<> FSerializer &Serialize(FSerializer &arc, const char *key, player_t *&value, player_t **defval)

View File

@ -563,10 +563,13 @@ public:
void Clear() void Clear()
{ {
if (this->Array) delete[] this->Array; if (this->Array) delete[] this->Array;
this->Count = 0;
this->Array = NULL;
} }
void Alloc(unsigned int amount) void Alloc(unsigned int amount)
{ {
Clear(); // intentionally first deletes and then reallocates.
if (this->Array) delete[] this->Array;
this->Array = new T[amount]; this->Array = new T[amount];
this->Count = amount; this->Count = amount;
} }

View File

@ -236,10 +236,27 @@ struct Line native
native readonly uint portalindex; native readonly uint portalindex;
} }
struct SecPlane native
{
native Vector3 Normal;
native double D;
native double negiC;
native bool isSlope();
native int PointOnSide(Vector3 pos);
native double ZatPoint (Vector2 v);
native double ZatPointDist(Vector2 v, double dist);
native bool isEqual(Secplane other);
native void ChangeHeight(double hdiff);
native double GetChangedHeight(double hdiff);
native double HeightDiff(double oldd, double newd = 0.0);
native double PointToDist(const DVector2 &xy, double z);
}
struct Sector native struct Sector native
{ {
//secplane_t floorplane, ceilingplane; //secplane_t floorplane, ceilingplane; // defined internally
//FDynamicColormap *ColorMap; // [RH] Per-sector colormap //FDynamicColormap *ColorMap;
native Actor SoundTarget; native Actor SoundTarget;