diff --git a/src/am_map.cpp b/src/am_map.cpp index a30106d4e..9f68f944e 100644 --- a/src/am_map.cpp +++ b/src/am_map.cpp @@ -2781,14 +2781,13 @@ void AM_drawKeys () void AM_drawThings () { AMColor color; - int i; AActor* t; mpoint_t p; DAngle angle; - for (i=0;i 0 || !(t->flags6 & MF6_NOTONAUTOMAP)) diff --git a/src/c_cmds.cpp b/src/c_cmds.cpp index 343c442fe..2923a8ae8 100644 --- a/src/c_cmds.cpp +++ b/src/c_cmds.cpp @@ -1189,12 +1189,12 @@ static void PrintSecretString(const char *string, bool thislevel) { 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 (thislevel && secnum >= 0 && secnum < numsectors) + if (thislevel && secnum < level.sectors.Size()) { - if (sectors[secnum].isSecret()) colstr = TEXTCOLOR_RED; - else if (sectors[secnum].wasSecret()) colstr = TEXTCOLOR_GREEN; + if (level.sectors[secnum].isSecret()) colstr = TEXTCOLOR_RED; + else if (level.sectors[secnum].wasSecret()) colstr = TEXTCOLOR_GREEN; else colstr = TEXTCOLOR_ORANGE; } } diff --git a/src/compatibility.cpp b/src/compatibility.cpp index 742f43eee..8f4472c85 100644 --- a/src/compatibility.cpp +++ b/src/compatibility.cpp @@ -530,9 +530,9 @@ void SetCompatibilityParams() } case CP_SECTORFLOOROFFSET: { - if (CompatParams[i+1] < numsectors) + if ((unsigned)CompatParams[i+1] < level.sectors.Size()) { - sector_t *sec = §ors[CompatParams[i+1]]; + sector_t *sec = &level.sectors[CompatParams[i+1]]; const double delta = CompatParams[i + 2] / 65536.0; sec->floorplane.ChangeHeight(delta); sec->ChangePlaneTexZ(sector_t::floor, delta); @@ -542,10 +542,10 @@ void SetCompatibilityParams() } case CP_SETSECTORSPECIAL: { - const int index = CompatParams[i + 1]; - if (index < numsectors) + const unsigned index = CompatParams[i + 1]; + if (index < level.sectors.Size()) { - sectors[index].special = CompatParams[i + 2]; + level.sectors[index].special = CompatParams[i + 2]; } i += 3; break; @@ -575,7 +575,7 @@ void SetCompatibilityParams() } 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! if (CompatParams[i + 2] == 0) diff --git a/src/dobject.cpp b/src/dobject.cpp index fd84f1574..c6e20be5e 100644 --- a/src/dobject.cpp +++ b/src/dobject.cpp @@ -479,19 +479,16 @@ size_t DObject::StaticPointerSubstitution (DObject *old, DObject *notOld, bool s } // Go through sectors. - if (sectors != NULL) + for (auto &sec : level.sectors) { - for (i = 0; i < numsectors; ++i) - { #define SECTOR_CHECK(f,t) \ - if (sectors[i].f.p == static_cast(old)) { sectors[i].f = static_cast(notOld); changed++; } - SECTOR_CHECK( SoundTarget, AActor ); - SECTOR_CHECK( SecActTarget, ASectorAction ); - SECTOR_CHECK( floordata, DSectorEffect ); - SECTOR_CHECK( ceilingdata, DSectorEffect ); - SECTOR_CHECK( lightingdata, DSectorEffect ); +if (sec.f.p == static_cast(old)) { sec.f = static_cast(notOld); changed++; } + SECTOR_CHECK( SoundTarget, AActor ); + SECTOR_CHECK( SecActTarget, ASectorAction ); + SECTOR_CHECK( floordata, DSectorEffect ); + SECTOR_CHECK( ceilingdata, DSectorEffect ); + SECTOR_CHECK( lightingdata, DSectorEffect ); #undef SECTOR_CHECK - } } // Go through bot stuff. diff --git a/src/dobjgc.cpp b/src/dobjgc.cpp index 827516172..11cfdc8c2 100644 --- a/src/dobjgc.cpp +++ b/src/dobjgc.cpp @@ -346,13 +346,13 @@ static void MarkRoot() // Mark sound sequences. DSeqNode::StaticMarkHead(); // Mark sectors. - if (SectorMarker == NULL && sectors != NULL) + if (SectorMarker == nullptr && level.sectors.Size() > 0) { SectorMarker = new DSectorMarker; } - else if (sectors == NULL) + else if (level.sectors.Size() == 0) { - SectorMarker = NULL; + SectorMarker = nullptr; } else { @@ -677,26 +677,25 @@ size_t DSectorMarker::PropagateMark() int i; int marked = 0; 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 = §ors[SecNum + i]; - GC::Mark(sec->SoundTarget); - GC::Mark(sec->SecActTarget); - GC::Mark(sec->floordata); - GC::Mark(sec->ceilingdata); - 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; - } + sector_t *sec = &level.sectors[SecNum + i]; + GC::Mark(sec->SoundTarget); + GC::Mark(sec->SecActTarget); + GC::Mark(sec->floordata); + GC::Mark(sec->ceilingdata); + 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; + } + if (!moretodo && polyobjs != NULL) { for (i = 0; i < POLYSTEPSIZE && PolyNum + i < po_NumPolyobjs; ++i) diff --git a/src/edata.cpp b/src/edata.cpp index 034c45086..258c2a187 100644 --- a/src/edata.cpp +++ b/src/edata.cpp @@ -753,27 +753,26 @@ void ProcessEDSector(sector_t *sec, int recordnum) void ProcessEDSectors() { - int i; - InitED(); 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. + auto numsectors = level.sectors.Size(); int *sectorrecord = new int[numsectors]; 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) { - sectorrecord[lines[i].frontsector - sectors] = lines[i].args[0]; + sectorrecord[lines[i].frontsector->Index()] = lines[i].args[0]; lines[i].special = 0; } } - for (i = 0; i < numsectors; i++) + for (unsigned i = 0; i < numsectors; i++) { if (sectorrecord[i] >= 0) { - ProcessEDSector(§ors[i], sectorrecord[i]); + ProcessEDSector(&level.sectors[i], sectorrecord[i]); } } delete[] sectorrecord; diff --git a/src/fragglescript/t_func.cpp b/src/fragglescript/t_func.cpp index 4670807e7..080adbd46 100644 --- a/src/fragglescript/t_func.cpp +++ b/src/fragglescript/t_func.cpp @@ -321,7 +321,7 @@ public: if (tag < 0) { 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); while ((i = itr.Next()) >= 0) { - sector = §ors[i]; + sector = &level.sectors[i]; 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); 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( - fabs(dest - sectors[i].CenterFloor()), - sectors[i].floorplane.PointToDist (sectors[i].centerspot, dest), + if (sec.MoveFloor( + fabs(dest - sec.CenterFloor()), + sec.floorplane.PointToDist (sec.centerspot, dest), crush? 10:-1, - (dest > sectors[i].CenterFloor()) ? 1 : -1, + (dest > sec.CenterFloor()) ? 1 : -1, false) == EMoveResult::crushed) { returnval = 0; @@ -1589,7 +1590,7 @@ void FParser::SF_FloorHeight(void) script_error("sector not found with tagnum %i\n", tagnum); return; } - returnval = sectors[secnum].CenterFloor(); + returnval = level.sectors[secnum].CenterFloor(); } // return floor height @@ -1622,7 +1623,7 @@ void FParser::SF_MoveFloor(void) FSSectorTagIterator itr(tagnum); while ((secnum = itr.Next()) >= 0) { - P_CreateFloor(§ors[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); 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( - fabs(dest - sectors[i].CenterCeiling()), - sectors[i].ceilingplane.PointToDist (sectors[i].centerspot, dest), + if (sec.MoveCeiling( + fabs(dest - sec.CenterCeiling()), + sec.ceilingplane.PointToDist (sec.centerspot, dest), crush? 10:-1, - (dest > sectors[i].CenterCeiling()) ? 1 : -1, + (dest > sec.CenterCeiling()) ? 1 : -1, false) == EMoveResult::crushed) { returnval = 0; @@ -1678,7 +1680,7 @@ void FParser::SF_CeilingHeight(void) script_error("sector not found with tagnum %i\n", tagnum); return; } - returnval = sectors[secnum].CenterCeiling(); + returnval = level.sectors[secnum].CenterCeiling(); } // return ceiling height @@ -1713,7 +1715,7 @@ void FParser::SF_MoveCeiling(void) FSSectorTagIterator itr(tagnum); while ((secnum = itr.Next()) >= 0) { - P_CreateCeiling(§ors[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; } - sector = §ors[secnum]; + sector = &level.sectors[secnum]; if(t_argc > 1) // > 1: set light level { @@ -1752,7 +1754,7 @@ void FParser::SF_LightLevel(void) FSSectorTagIterator itr(tagnum); 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); while ((i = it.Next()) >= 0) { - if (!sectors[i].lightingdata) new DLightLevel(§ors[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) { script_error("sector not found with tagnum %i\n", tagnum); return;} - sector = §ors[secnum]; + sector = &level.sectors[secnum]; if(t_argc > 1) { @@ -1906,7 +1908,7 @@ void FParser::SF_FloorTexture(void) FSSectorTagIterator itr(tagnum); 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) { script_error("sector not found with tagnum %i\n", tagnum); return;} - sector = §ors[secnum]; + sector = &level.sectors[secnum]; if (t_argv[1].type==svt_string) { @@ -1957,7 +1959,7 @@ void FParser::SF_SectorColormap(void) while ((i = itr.Next()) >= 0) { sectors[i].midmap=cm; - sectors[i].heightsec=§ors[i]; + sectors[i].heightsec=&level.sectors[i]; } } */ @@ -1985,7 +1987,7 @@ void FParser::SF_CeilingTexture(void) if(secnum < 0) { script_error("sector not found with tagnum %i\n", tagnum); return;} - sector = §ors[secnum]; + sector = &level.sectors[secnum]; if(t_argc > 1) { @@ -1996,7 +1998,7 @@ void FParser::SF_CeilingTexture(void) FSSectorTagIterator itr(tagnum); 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); 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); } } } diff --git a/src/fragglescript/t_script.cpp b/src/fragglescript/t_script.cpp index 81b2ce21e..0469e5063 100644 --- a/src/fragglescript/t_script.cpp +++ b/src/fragglescript/t_script.cpp @@ -489,7 +489,7 @@ bool DFraggleThinker::wait_finished(DRunningScript *script) FSectorTagIterator itr(script->wait_data); while ((secnum = itr.Next()) >= 0) { - sector_t *sec = §ors[secnum]; + sector_t *sec = &level.sectors[secnum]; if(sec->floordata || sec->ceilingdata || sec->lightingdata) return false; // not finished } diff --git a/src/g_game.cpp b/src/g_game.cpp index b5729283e..d80360193 100644 --- a/src/g_game.cpp +++ b/src/g_game.cpp @@ -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 // a demo finishes playback.) - if (lines == NULL || sectors == NULL || gamestate != GS_LEVEL) + if (lines == NULL || level.sectors.Size() == 0 || gamestate != GS_LEVEL) { return; } @@ -2801,7 +2801,7 @@ void G_DoPlayDemo (void) { G_InitNew (mapname, false); } - else if (numsectors == 0) + else if (level.sectors.Size() == 0) { I_Error("Cannot play demo without its savegame\n"); } diff --git a/src/g_level.cpp b/src/g_level.cpp index 11c37533d..b0636d4d6 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -1842,8 +1842,8 @@ void FLevelLocals::AddScroller (int secnum) } if (Scrolls.Size() == 0) { - Scrolls.Resize(numsectors); - memset (&Scrolls[0], 0, sizeof(Scrolls[0])*numsectors); + Scrolls.Resize(sectors.Size()); + memset(&Scrolls[0], 0, sizeof(Scrolls[0])*Scrolls.Size()); } } diff --git a/src/g_level.h b/src/g_level.h index 47b2c3e42..5808df138 100644 --- a/src/g_level.h +++ b/src/g_level.h @@ -400,6 +400,8 @@ struct FLevelLocals FString NextSecretMap; // map to go to when used secret exit EMapType maptype; + TStaticArray sectors; + DWORD flags; DWORD flags2; DWORD flags3; @@ -446,7 +448,6 @@ struct FLevelLocals bool IsFreelookAllowed() const; }; - struct cluster_info_t { int cluster; diff --git a/src/g_shared/a_lightning.cpp b/src/g_shared/a_lightning.cpp index bbc663812..1598b87f0 100644 --- a/src/g_shared/a_lightning.cpp +++ b/src/g_shared/a_lightning.cpp @@ -22,8 +22,8 @@ DLightningThinker::DLightningThinker () LightningFlashCount = 0; NextLightningFlash = ((pr_lightning()&15)+5)*35; // don't flash at level start - LightningLightLevels.Resize(numsectors); - fillshort(&LightningLightLevels[0], numsectors, SHRT_MAX); + LightningLightLevels.Resize(level.sectors.Size()); + fillshort(&LightningLightLevels[0], LightningLightLevels.Size(), SHRT_MAX); } DLightningThinker::~DLightningThinker () @@ -63,8 +63,8 @@ void DLightningThinker::LightningFlash () LightningFlashCount--; if (LightningFlashCount) { // reduce the brightness of the flash - tempSec = sectors; - for (i = numsectors, j = 0; i > 0; ++j, --i, ++tempSec) + tempSec = &level.sectors[0]; + for (i = level.sectors.Size(), j = 0; i > 0; ++j, --i, ++tempSec) { // [RH] Checking this sector's applicability to lightning now // is not enough to know if we should lower its light level, @@ -79,15 +79,15 @@ void DLightningThinker::LightningFlash () } else { // remove the alternate lightning flash special - tempSec = sectors; - for (i = numsectors, j = 0; i > 0; ++j, --i, ++tempSec) + tempSec = &level.sectors[0]; + for (i = level.sectors.Size(), j = 0; i > 0; ++j, --i, ++tempSec) { if (LightningLightLevels[j] != SHRT_MAX) { tempSec->SetLightLevel(LightningLightLevels[j]); } } - fillshort(&LightningLightLevels[0], numsectors, SHRT_MAX); + fillshort(&LightningLightLevels[0], level.sectors.Size(), SHRT_MAX); level.flags &= ~LEVEL_SWAPSKIES; } return; @@ -95,8 +95,8 @@ void DLightningThinker::LightningFlash () LightningFlashCount = (pr_lightning()&7)+8; flashLight = 200+(pr_lightning()&31); - tempSec = sectors; - for (i = numsectors, j = 0; i > 0; --i, ++j, ++tempSec) + tempSec = &level.sectors[0]; + for (i = level.sectors.Size(), j = 0; i > 0; ++j, --i, ++tempSec) { // allow combination of the lightning sector specials with bit masks int special = tempSec->special; diff --git a/src/g_shared/a_skies.cpp b/src/g_shared/a_skies.cpp index 9e99d9368..b2098f206 100644 --- a/src/g_shared/a_skies.cpp +++ b/src/g_shared/a_skies.cpp @@ -117,7 +117,7 @@ void ASkyPicker::PostBeginPlay () 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 { diff --git a/src/gl/data/gl_data.cpp b/src/gl/data/gl_data.cpp index eb676de75..e8c5f22bb 100644 --- a/src/gl/data/gl_data.cpp +++ b/src/gl/data/gl_data.cpp @@ -154,9 +154,9 @@ int LS_Sector_SetPlaneReflection (line_t *ln, AActor *it, bool backSide, while ((secnum = itr.Next()) >= 0) { - sector_t * s = §ors[secnum]; + sector_t * s = &level.sectors[secnum]; 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; @@ -532,14 +532,12 @@ void gl_InitData() CCMD(dumpgeometry) { - for(int i=0;isubsectorcount;j++) + Printf(PRINT_LOG, "Sector %d\n", sector.sectornum); + for(int j=0;jsubsectors[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":""); for(DWORD k=0;knumlines;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); } else if (seg->backsector) - { + { Printf(PRINT_LOG, ", back sector = %d (no partnerseg)", seg->backsector->sectornum); } diff --git a/src/gl/data/gl_portaldata.cpp b/src/gl/data/gl_portaldata.cpp index a7e140449..71b10b4bb 100644 --- a/src/gl/data/gl_portaldata.cpp +++ b/src/gl/data/gl_portaldata.cpp @@ -337,18 +337,17 @@ void gl_BuildPortalCoverage(FPortalCoverage *coverage, subsector_t *subsector, c static void CollectPortalSectors(FPortalMap &collection) { - for (int i=0;iGetPortalType(j); + int ptype = sec.GetPortalType(j); 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]; - FPortalSector ss = { sec, j }; + FPortalSector ss = { &sec, j }; sss.Push(ss); } } diff --git a/src/gl/data/gl_setup.cpp b/src/gl/data/gl_setup.cpp index 3b72c9863..3fc022cf8 100644 --- a/src/gl/data/gl_setup.cpp +++ b/src/gl/data/gl_setup.cpp @@ -257,11 +257,11 @@ static void PrepareSectorData() ss->render_sector->subsectorcount++; } - for (i=0; isubsectorcount==0) return; @@ -388,7 +381,7 @@ static void PrepareTransparentDoors(sector_t * sector) static void AddToVertex(const sector_t * sec, TArray & list) { - int secno = int(sec-sectors); + int secno = sec->Index(); for(unsigned i=0;isidedef[0]->Flags & WALLF_POLYOBJ) continue; // don't bother with polyobjects @@ -613,14 +604,14 @@ void gl_PreprocessLevel() if (checkmap[vtnum1] < i) { checkmap[vtnum1] = i; - sectors[i].e->vertices.Push(&vertexes[vtnum1]); + sec.e->vertices.Push(&vertexes[vtnum1]); vertexes[vtnum1].dirty = true; } if (checkmap[vtnum2] < i) { checkmap[vtnum2] = i; - sectors[i].e->vertices.Push(&vertexes[vtnum2]); + sec.e->vertices.Push(&vertexes[vtnum2]); vertexes[vtnum2].dirty = true; } } @@ -683,10 +674,10 @@ void gl_CleanLevelData() delete [] sides[0].segs; sides[0].segs = NULL; } - if (sectors && sectors[0].subsectors) + if (level.sectors.Size() > 0 && level.sectors[0].subsectors) { - delete [] sectors[0].subsectors; - sectors[0].subsectors = NULL; + delete [] level.sectors[0].subsectors; + level.sectors[0].subsectors = nullptr; } for (int i=0;iXFloor.ffloors.Size(); j++) + for(auto ff : sec.e->XFloor.ffloors) { - F3DFloor *ff = sectors[i].e->XFloor.ffloors[j]; - - if (ff->top.model == §ors[i]) + if (ff->top.model == &sec) { - ff->top.vindex = sectors[i].vboindex[ff->top.isceiling]; + ff->top.vindex = sec.vboindex[ff->top.isceiling]; } - if (ff->bottom.model == §ors[i]) + if (ff->bottom.model == &sec) { - ff->bottom.vindex = sectors[i].vboindex[ff->top.isceiling]; + ff->bottom.vindex = sec.vboindex[ff->top.isceiling]; } } } diff --git a/src/gl/scene/gl_bsp.cpp b/src/gl/scene/gl_bsp.cpp index d646daa53..da6077049 100644 --- a/src/gl/scene/gl_bsp.cpp +++ b/src/gl/scene/gl_bsp.cpp @@ -420,7 +420,7 @@ static void DoSubsector(subsector_t * sub) sector_t fake; #ifdef _DEBUG - if (sub->sector-sectors==931) + if (sub->sector->sectornum==931) { int a = 0; } diff --git a/src/gl/scene/gl_drawinfo.cpp b/src/gl/scene/gl_drawinfo.cpp index e4722b3db..5fc775603 100644 --- a/src/gl/scene/gl_drawinfo.cpp +++ b/src/gl/scene/gl_drawinfo.cpp @@ -1043,11 +1043,11 @@ void FDrawInfo::StartScene() { ClearBuffers(); - sectorrenderflags.Resize(numsectors); + sectorrenderflags.Resize(level.sectors.Size()); ss_renderflags.Resize(numsubsectors); no_renderflags.Resize(numsubsectors); - memset(§orrenderflags[0], 0, numsectors * sizeof(sectorrenderflags[0])); + memset(§orrenderflags[0], 0, level.sectors.Size() * sizeof(sectorrenderflags[0])); memset(&ss_renderflags[0], 0, numsubsectors * sizeof(ss_renderflags[0])); memset(&no_renderflags[0], 0, numnodes * sizeof(no_renderflags[0])); diff --git a/src/gl/scene/gl_fakeflat.cpp b/src/gl/scene/gl_fakeflat.cpp index b35b36c0e..7fcc6d239 100644 --- a/src/gl/scene/gl_fakeflat.cpp +++ b/src/gl/scene/gl_fakeflat.cpp @@ -210,7 +210,7 @@ sector_t * gl_FakeFlat(sector_t * sec, sector_t * dest, area_t in_area, bool bac } #ifdef _DEBUG - if (sec-sectors==560) + if (sec->sectornum==560) { int a = 0; } diff --git a/src/gl/scene/gl_flats.cpp b/src/gl/scene/gl_flats.cpp index 62a96157a..efadbcebe 100644 --- a/src/gl/scene/gl_flats.cpp +++ b/src/gl/scene/gl_flats.cpp @@ -582,7 +582,7 @@ void GLFlat::ProcessSector(sector_t * frontsector) #endif // Get the real sector for this one. - sector = §ors[frontsector->sectornum]; + sector = &level.sectors[frontsector->sectornum]; extsector_t::xfloor &x = sector->e->XFloor; dynlightindex = -1; diff --git a/src/gl/scene/gl_sprite.cpp b/src/gl/scene/gl_sprite.cpp index 75d15543e..b0cfcebe3 100644 --- a/src/gl/scene/gl_sprite.cpp +++ b/src/gl/scene/gl_sprite.cpp @@ -895,7 +895,7 @@ void GLSprite::Process(AActor* thing, sector_t * sector, int thruportal) Colormap=rendersector->ColorMap; if (fullbright) { - if (rendersector == §ors[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 { // Only make the light white but keep everything else (fog, desaturation and Boom colormap.) diff --git a/src/gl/scene/gl_walls.cpp b/src/gl/scene/gl_walls.cpp index 5ac29dcad..9d471b72d 100644 --- a/src/gl/scene/gl_walls.cpp +++ b/src/gl/scene/gl_walls.cpp @@ -1435,8 +1435,8 @@ void GLWall::Process(seg_t *seg, sector_t * frontsector, sector_t * backsector) else { // Need these for aligning the textures - realfront = §ors[frontsector->sectornum]; - realback = backsector ? §ors[backsector->sectornum] : NULL; + realfront = &level.sectors[frontsector->sectornum]; + realback = backsector ? &level.sectors[backsector->sectornum] : NULL; segfront = frontsector; segback = backsector; } diff --git a/src/nodebuild.cpp b/src/nodebuild.cpp index 2d81d2ab2..735ee10f7 100644 --- a/src/nodebuild.cpp +++ b/src/nodebuild.cpp @@ -1053,7 +1053,7 @@ void FNodeBuilder::PrintSet (int l, DWORD set) Printf (PRINT_LOG, "set %d:\n", l); 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].v1, Vertices[Segs[set].v1].x>>16, Vertices[Segs[set].v1].y>>16, diff --git a/src/p_3dfloors.cpp b/src/p_3dfloors.cpp index 7c2527673..e4778e91d 100644 --- a/src/p_3dfloors.cpp +++ b/src/p_3dfloors.cpp @@ -224,7 +224,7 @@ static int P_Set3DFloor(line_t * line, int param, int param2, int alpha) FSectorTagIterator itr(tag); while ((s = itr.Next()) >= 0) { - ss = §ors[s]; + ss = &level.sectors[s]; 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; } // kg3D - do it in software - for (i = 0; i < numsectors; i++) + for (auto &sec : level.sectors) { - P_Recalculate3DFloors(§ors[i]); + P_Recalculate3DFloors(&sec); } } @@ -984,7 +984,7 @@ CCMD (dump3df) if (argv.argc() > 1) { int sec = strtol(argv[1], NULL, 10); - sector_t *sector = §ors[sec]; + sector_t *sector = &level.sectors[sec]; TArray & ffloors=sector->e->XFloor.ffloors; for (unsigned int i = 0; i < ffloors.Size(); i++) diff --git a/src/p_3dmidtex.cpp b/src/p_3dmidtex.cpp index 7e7e1591a..b775055d8 100644 --- a/src/p_3dmidtex.cpp +++ b/src/p_3dmidtex.cpp @@ -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. 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_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 // 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++) { - int sec = int(scrollplane.AttachedSectors[i] - sectors); + int sec = scrollplane.AttachedSectors[i]->sectornum; 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; 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; @@ -189,21 +189,21 @@ void P_Attach3dMidtexLinesToSector(sector_t *sector, int lineid, int tag, bool c { scrollplane.AttachedLines.Push(&lines[i]); - v = int(lines[i].frontsector - sectors); - assert(v < numsectors); + v = lines[i].frontsector->sectornum; + assert(v < (int)level.sectors.Size()); found_sectors[v>>3] |= 1 << (v&7); - v = int(lines[i].backsector - sectors); - assert(v < numsectors); + v = lines[i].backsector->sectornum; + assert(v < (int)level.sectors.Size()); 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))) { - scrollplane.AttachedSectors.Push(§ors[i]); + scrollplane.AttachedSectors.Push(&level.sectors[i]); } } diff --git a/src/p_acs.cpp b/src/p_acs.cpp index 20313785a..d35714ca5 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -1423,7 +1423,7 @@ DPlaneWatcher::DPlaneWatcher (AActor *it, line_t *line, int lineSide, bool ceili { secplane_t plane; - Sector = §ors[secnum]; + Sector = &level.sectors[secnum]; if (bCeiling) { plane = Sector->ceilingplane; @@ -3263,7 +3263,7 @@ void DLevelScript::ChangeFlat (int tag, int name, bool floorOrCeiling) while ((secnum = it.Next()) >= 0) { 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); 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 = §ors[i]; - - if (!(flags & NOT_FLOOR) && sec->GetTexture(sector_t::floor) == picnum1) - sec->SetTexture(sector_t::floor, picnum2); - if (!(flags & NOT_CEILING) && sec->GetTexture(sector_t::ceiling) == picnum1) - sec->SetTexture(sector_t::ceiling, picnum2); + if (!(flags & NOT_FLOOR) && sec.GetTexture(sector_t::floor) == picnum1) + sec.SetTexture(sector_t::floor, 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; while ((s = it.Next()) >= 0) { - SN_StartSequence(§ors[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; while ((s = it.Next()) >= 0) { - sector_t *sec = §ors[s]; + sector_t *sec = &level.sectors[s]; sec->damageamount = args[1]; sec->damagetype = argCount >= 3 ? FName(FBehavior::StaticLookupString(args[2])) : FName(NAME_None); @@ -5942,7 +5940,7 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) int s; 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; while ((s = it.Next()) >= 0) { - sectors[s].planes[which].GlowColor = color; - sectors[s].planes[which].GlowHeight = height; + level.sectors[s].planes[which].GlowColor = color; + level.sectors[s].planes[which].GlowHeight = height; } break; } @@ -6096,8 +6094,9 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) int d = clamp(args[1]/2, 0, 255); while ((s = it.Next()) >= 0) { - auto f = sectors[s].ColorMap->Fade; - sectors[s].ColorMap = GetSpecialLights(sectors[s].ColorMap->Color, PalEntry(d, f.r, f.g, f.b), sectors[s].ColorMap->Desaturate); + auto &sec = level.sectors[s]; + auto f = sec.ColorMap->Fade; + sec.ColorMap = GetSpecialLights(sec.ColorMap->Color, PalEntry(d, f.r, f.g, f.b), sec.ColorMap->Desaturate); } break; } @@ -6227,7 +6226,7 @@ int DLevelScript::RunScript () FSectorTagIterator it(statedata); while ((secnum = it.Next()) >= 0) { - if (sectors[secnum].floordata || sectors[secnum].ceilingdata) + if (level.sectors[secnum].floordata || level.sectors[secnum].ceilingdata) return resultValue; } @@ -8838,17 +8837,17 @@ scriptwait: if (tag != 0) secnum = P_FindFirstSectorFromTag (tag); else - secnum = int(P_PointInSector (x, y) - sectors); + secnum = P_PointInSector (x, y)->sectornum; if (secnum >= 0) { if (pcd == PCD_GETSECTORFLOORZ) { - z = sectors[secnum].floorplane.ZatPoint (x, y); + z = level.sectors[secnum].floorplane.ZatPoint (x, y); } else { - z = sectors[secnum].ceilingplane.ZatPoint (x, y); + z = level.sectors[secnum].ceilingplane.ZatPoint (x, y); } } sp -= 2; @@ -8863,7 +8862,7 @@ scriptwait: if (secnum >= 0) { - z = sectors[secnum].lightlevel; + z = level.sectors[secnum].lightlevel; } STACK(1) = z; } diff --git a/src/p_buildmap.cpp b/src/p_buildmap.cpp index 4d1909da5..99f3fb638 100644 --- a/src/p_buildmap.cpp +++ b/src/p_buildmap.cpp @@ -142,7 +142,7 @@ void P_AdjustLine (line_t *line); // PRIVATE FUNCTION PROTOTYPES --------------------------------------------- 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 int LoadSprites (spritetype *sprites, Xsprite *xsprites, int numsprites, sectortype *bsectors, FMapThing *mapthings); 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; } - numsectors = numsec; - LoadSectors ((sectortype *)(data + 22)); - LoadWalls ((walltype *)(data + 24 + numsectors*sizeof(sectortype)), numwalls, + LoadSectors ((sectortype *)(data + 22), numsec); + LoadWalls ((walltype *)(data + 24 + numsec*sizeof(sectortype)), numwalls, (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]; 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); return true; @@ -274,7 +273,7 @@ static bool P_LoadBloodMap (BYTE *data, size_t len, FMapThing **mapthings, int * visibility = LittleLong(*(DWORD *)(infoBlock + 18)); parallaxType = infoBlock[26]; numRevisions = LittleLong(*(DWORD *)(infoBlock + 27)); - numsectors = LittleShort(*(WORD *)(infoBlock + 31)); + int numsectors = LittleShort(*(WORD *)(infoBlock + 31)); numWalls = LittleShort(*(WORD *)(infoBlock + 33)); numsprites = LittleShort(*(WORD *)(infoBlock + 35)); 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 // BUILD info from the map we need. (Sprites are ignored.) - LoadSectors (bsec); + LoadSectors (bsec, numsectors); LoadWalls (bwal, numWalls, bsec); *mapthings = new FMapThing[numsprites]; *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); sector_t *sec; char tnam[9]; - sec = sectors = new sector_t[numsectors]; - memset (sectors, 0, sizeof(sector_t)*numsectors); + level.sectors.Alloc(count); + 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->wallnum = WORD(bsec->wallnum); bsec->ceilingstat = WORD(bsec->ceilingstat); bsec->floorstat = WORD(bsec->floorstat); - sec->e = §ors[0].e[i]; + sec->e = &sec->e[i]; double floorheight = -LittleLong(bsec->floorZ) / 256.; sec->SetPlaneTexZ(sector_t::floor, floorheight); sec->floorplane.SetAtHeight(floorheight, sector_t::floor); @@ -496,13 +496,13 @@ static void LoadWalls (walltype *walls, int numwalls, sectortype *bsec) numvertexes = 0; // 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) { 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; 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; } else @@ -629,7 +629,7 @@ static void LoadWalls (walltype *walls, int numwalls, sectortype *bsec) } // Finish setting sector properties that depend on walls - for (i = 0; i < numsectors; ++i, ++bsec) + for (auto &sec : level.sectors) { SlopeWork slope; @@ -646,13 +646,13 @@ static void LoadWalls (walltype *walls, int numwalls, sectortype *bsec) { // floor is sloped slope.heinum = -LittleShort(bsec->floorheinum); 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)) { // ceiling is sloped slope.heinum = -LittleShort(bsec->ceilingheinum); 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 sidenum = int(intptr_t(lines[linenum].sidedef[1])); diff --git a/src/p_ceiling.cpp b/src/p_ceiling.cpp index 4af418651..79fd29591 100644 --- a/src/p_ceiling.cpp +++ b/src/p_ceiling.cpp @@ -498,7 +498,7 @@ bool EV_DoCeiling (DCeiling::ECeiling type, line_t *line, { if (!line || !(sec = line->backsector)) return rtn; - secnum = (int)(sec-sectors); + secnum = sec->sectornum; // [RH] Hack to let manual crushers be retriggerable, too tag ^= secnum | 0x1000000; P_ActivateInStasisCeiling (tag); @@ -516,7 +516,7 @@ bool EV_DoCeiling (DCeiling::ECeiling type, line_t *line, FSectorTagIterator it(tag); while ((secnum = it.Next()) >= 0) { - rtn |= P_CreateCeiling(§ors[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; } diff --git a/src/p_doors.cpp b/src/p_doors.cpp index b85bdb107..1490647fc 100644 --- a/src/p_doors.cpp +++ b/src/p_doors.cpp @@ -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 sec = line->sidedef[1]->sector; - secnum = int(sec-sectors); + secnum = sec->sectornum; // if door already has a thinker, use it if (sec->PlaneMoving(sector_t::ceiling)) @@ -493,7 +493,7 @@ bool EV_DoDoor (DDoor::EVlDoor type, line_t *line, AActor *thing, FSectorTagIterator it(tag); while ((secnum = it.Next()) >= 0) { - sec = §ors[secnum]; + sec = &level.sectors[secnum]; // if the ceiling is already moving, don't start the door action if (sec->PlaneMoving(sector_t::ceiling)) continue; @@ -782,7 +782,7 @@ bool EV_SlidingDoor (line_t *line, AActor *actor, int tag, int speed, int delay) FSectorTagIterator it(tag); while ((secnum = it.Next()) >= 0) { - sec = §ors[secnum]; + sec = &level.sectors[secnum]; if (sec->ceilingdata != NULL) { continue; diff --git a/src/p_effect.cpp b/src/p_effect.cpp index eb872edc1..107759427 100644 --- a/src/p_effect.cpp +++ b/src/p_effect.cpp @@ -350,7 +350,7 @@ void P_RunEffects () { 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; TThinkerIterator iterator; @@ -360,7 +360,7 @@ void P_RunEffects () if (actor->effects) { // 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)))) P_RunEffect (actor, actor->effects); } diff --git a/src/p_floor.cpp b/src/p_floor.cpp index c16720c4f..34163987c 100644 --- a/src/p_floor.cpp +++ b/src/p_floor.cpp @@ -185,19 +185,19 @@ void DFloor::Tick () sector_t *sec = m_Sector; sec->stairlock = -1; // thinker done, promote lock to -1 - while (sec->prevsec != -1 && sectors[sec->prevsec].stairlock != -2) - sec = §ors[sec->prevsec]; // search for a non-done thinker + while (sec->prevsec != -1 && level.sectors[sec->prevsec].stairlock != -2) + sec = &level.sectors[sec->prevsec]; // search for a non-done thinker if (sec->prevsec == -1) // if all thinkers previous are done { sec = m_Sector; // search forward - while (sec->nextsec != -1 && sectors[sec->nextsec].stairlock != -2) - sec = §ors[sec->nextsec]; + while (sec->nextsec != -1 && level.sectors[sec->nextsec].stairlock != -2) + sec = &level.sectors[sec->nextsec]; if (sec->nextsec == -1) // if all thinkers ahead are done too { while (sec->prevsec != -1) // clear all locks { sec->stairlock = 0; - sec = §ors[sec->prevsec]; + sec = &level.sectors[sec->prevsec]; } sec->stairlock = 0; } @@ -528,7 +528,7 @@ bool EV_DoFloor (DFloor::EFloor floortype, line_t *line, int tag, FSectorTagIterator it(tag, line); while ((secnum = it.Next()) >= 0) { - rtn |= P_CreateFloor(§ors[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; } @@ -547,7 +547,7 @@ bool EV_FloorCrushStop (int tag) FSectorTagIterator it(tag); 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)) && barrier_cast(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); while ((secnum = itr.NextCompat(compatible, secnum)) >= 0) { - sec = §ors[secnum]; + sec = &level.sectors[secnum]; // ALREADY MOVING? IF SO, KEEP GOING... //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 { @@ -674,14 +674,14 @@ bool EV_BuildStairs (int tag, DFloor::EStair type, line_t *line, continue; tsec = line->frontsector; - newsecnum = (int)(tsec-sectors); + newsecnum = tsec->sectornum; if (secnum != newsecnum) continue; tsec = line->backsector; 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) continue; @@ -746,7 +746,7 @@ bool EV_BuildStairs (int tag, DFloor::EStair type, line_t *line, } while (ok); // [RH] make sure the first sector doesn't point to a previous one, otherwise // it can infinite loop when the first sector stops moving. - sectors[osecnum].prevsec = -1; + level.sectors[osecnum].prevsec = -1; } return rtn; } @@ -773,7 +773,7 @@ bool EV_DoDonut (int tag, line_t *line, double pillarspeed, double slimespeed) FSectorTagIterator itr(tag, line); while ((secnum = itr.Next()) >= 0) { - s1 = §ors[secnum]; // s1 is pillar's sector + s1 = &level.sectors[secnum]; // s1 is pillar's sector // ALREADY MOVING? IF SO, KEEP GOING... 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 while ((secnum = itr.Next()) >= 0) { - sec = §ors[secnum]; + sec = &level.sectors[secnum]; // If either floor or ceiling is already activated, skip it 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] @@ -1083,7 +1083,7 @@ bool EV_DoChange (line_t *line, EChange changetype, int tag) FSectorTagIterator it(tag); while ((secnum = it.Next()) >= 0) { - sec = §ors[secnum]; + sec = &level.sectors[secnum]; 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) { - sector = §ors[sectorIndex]; + sector = &level.sectors[sectorIndex]; if ((!ceiling && sector->PlaneMoving(sector_t::floor)) || (ceiling && sector->PlaneMoving(sector_t::ceiling))) { // Already busy with another thinker diff --git a/src/p_lights.cpp b/src/p_lights.cpp index 873368166..d9fc19c79 100644 --- a/src/p_lights.cpp +++ b/src/p_lights.cpp @@ -324,7 +324,7 @@ void EV_StartLightFlickering (int tag, int upper, int lower) FSectorTagIterator it(tag); while ((secnum = it.Next()) >= 0) { - new DFlicker (§ors[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); while ((secnum = it.Next()) >= 0) { - sector_t *sec = §ors[secnum]; + sector_t *sec = &level.sectors[secnum]; if (sec->lightingdata) continue; @@ -515,7 +515,7 @@ void EV_StartLightStrobing (int tag, int utics, int ltics) FSectorTagIterator it(tag); while ((secnum = it.Next()) >= 0) { - sector_t *sec = §ors[secnum]; + sector_t *sec = &level.sectors[secnum]; if (sec->lightingdata) continue; @@ -537,7 +537,7 @@ void EV_TurnTagLightsOff (int tag) FSectorTagIterator it(tag); while ((secnum = it.Next()) >= 0) { - sector_t *sector = sectors + secnum; + sector_t *sector = &level.sectors[secnum]; int min = sector->lightlevel; for (auto ln : sector->Lines) @@ -566,7 +566,7 @@ void EV_LightTurnOn (int tag, int bright) FSectorTagIterator it(tag); 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 // bright = -1 means to search ([RH] Not 0) @@ -619,7 +619,7 @@ void EV_LightTurnOnPartway (int tag, double frac) FSectorTagIterator it(tag); while ((secnum = it.Next()) >= 0) { - sector_t *temp, *sector = §ors[secnum]; + sector_t *temp, *sector = &level.sectors[secnum]; int bright = 0, min = sector->lightlevel; for (auto ln : sector->Lines) @@ -655,7 +655,7 @@ void EV_LightChange (int tag, int value) FSectorTagIterator it(tag); 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); while ((secnum = it.Next()) >= 0) { - sector_t *sec = §ors[secnum]; + sector_t *sec = &level.sectors[secnum]; if (sec->lightingdata) continue; @@ -841,7 +841,7 @@ void EV_StartLightFading (int tag, int value, int tics) FSectorTagIterator it(tag); while ((secnum = it.Next()) >= 0) { - sector_t *sec = §ors[secnum]; + sector_t *sec = &level.sectors[secnum]; if (sec->lightingdata) continue; diff --git a/src/p_linkedsectors.cpp b/src/p_linkedsectors.cpp index 0487ede18..14b7d0f79 100644 --- a/src/p_linkedsectors.cpp +++ b/src/p_linkedsectors.cpp @@ -322,9 +322,9 @@ bool P_AddSectorLinks(sector_t *control, int tag, INTBOOL ceiling, int movetype) while ((sec = itr.Next()) >= 0) { // Don't attach to self! - if (control != §ors[sec]) + if (control != &level.sectors[sec]) { - AddSingleSector(scrollplane, §ors[sec], movetype); + AddSingleSector(scrollplane, &level.sectors[sec], movetype); } } } diff --git a/src/p_lnspec.cpp b/src/p_lnspec.cpp index d368739e1..e9b9d53a4 100644 --- a/src/p_lnspec.cpp +++ b/src/p_lnspec.cpp @@ -2163,7 +2163,7 @@ FUNC(LS_Sector_ChangeSound) FSectorTagIterator itr(arg0); while ((secNum = itr.Next()) >= 0) { - sectors[secNum].seqType = arg1; + level.sectors[secNum].seqType = arg1; rtn = true; } return rtn; @@ -2185,7 +2185,7 @@ FUNC(LS_Sector_ChangeFlags) arg2 &= ~SECF_NOMODIFY; 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; } return rtn; @@ -2231,8 +2231,8 @@ FUNC(LS_Sector_SetTranslucent) FSectorTagIterator itr(arg0); while ((secnum = itr.Next()) >= 0) { - sectors[secnum].SetAlpha(arg1, clamp(arg2, 0, 255) / 255.); - sectors[secnum].ChangeFlags(arg1, ~PLANEF_ADDITIVE, arg3? PLANEF_ADDITIVE:0); + level.sectors[secnum].SetAlpha(arg1, clamp(arg2, 0, 255) / 255.); + level.sectors[secnum].ChangeFlags(arg1, ~PLANEF_ADDITIVE, arg3? PLANEF_ADDITIVE:0); } return true; } @@ -2247,7 +2247,7 @@ FUNC(LS_Sector_SetLink) int control = P_FindFirstSectorFromTag(arg0); if (control >= 0) { - return P_AddSectorLinks(§ors[control], arg1, arg2, arg3); + return P_AddSectorLinks(&level.sectors[control], arg1, arg2, arg3); } } return false; @@ -2367,10 +2367,10 @@ FUNC(LS_Sector_SetDamage) arg3 = 1; } } - sectors[secnum].damageamount = (short)arg1; - sectors[secnum].damagetype = MODtoDamageType(arg2); - sectors[secnum].damageinterval = (short)arg3; - sectors[secnum].leakydamage = (short)arg4; + level.sectors[secnum].damageamount = (short)arg1; + level.sectors[secnum].damagetype = MODtoDamageType(arg2); + level.sectors[secnum].damageinterval = (short)arg3; + level.sectors[secnum].leakydamage = (short)arg4; } return true; } @@ -2387,7 +2387,7 @@ FUNC(LS_Sector_SetGravity) FSectorTagIterator itr(arg0); int secnum; while ((secnum = itr.Next()) >= 0) - sectors[secnum].gravity = gravity; + level.sectors[secnum].gravity = gravity; return true; } @@ -2399,7 +2399,7 @@ FUNC(LS_Sector_SetColor) int secnum; while ((secnum = itr.Next()) >= 0) { - sectors[secnum].SetColor(arg1, arg2, arg3, arg4); + level.sectors[secnum].SetColor(arg1, arg2, arg3, arg4); } return true; @@ -2412,7 +2412,7 @@ FUNC(LS_Sector_SetFade) int secnum; while ((secnum = itr.Next()) >= 0) { - sectors[secnum].SetFade(arg1, arg2, arg3); + level.sectors[secnum].SetFade(arg1, arg2, arg3); } return true; } @@ -2427,8 +2427,8 @@ FUNC(LS_Sector_SetCeilingPanning) int secnum; while ((secnum = itr.Next()) >= 0) { - sectors[secnum].SetXOffset(sector_t::ceiling, xofs); - sectors[secnum].SetYOffset(sector_t::ceiling, yofs); + level.sectors[secnum].SetXOffset(sector_t::ceiling, xofs); + level.sectors[secnum].SetYOffset(sector_t::ceiling, yofs); } return true; } @@ -2443,8 +2443,8 @@ FUNC(LS_Sector_SetFloorPanning) int secnum; while ((secnum = itr.Next()) >= 0) { - sectors[secnum].SetXOffset(sector_t::floor, xofs); - sectors[secnum].SetYOffset(sector_t::floor, yofs); + level.sectors[secnum].SetXOffset(sector_t::floor, xofs); + level.sectors[secnum].SetYOffset(sector_t::floor, yofs); } return true; } @@ -2465,9 +2465,9 @@ FUNC(LS_Sector_SetFloorScale) while ((secnum = itr.Next()) >= 0) { if (xscale) - sectors[secnum].SetXScale(sector_t::floor, xscale); + level.sectors[secnum].SetXScale(sector_t::floor, xscale); if (yscale) - sectors[secnum].SetYScale(sector_t::floor, yscale); + level.sectors[secnum].SetYScale(sector_t::floor, yscale); } return true; } @@ -2488,9 +2488,9 @@ FUNC(LS_Sector_SetCeilingScale) while ((secnum = itr.Next()) >= 0) { if (xscale) - sectors[secnum].SetXScale(sector_t::ceiling, xscale); + level.sectors[secnum].SetXScale(sector_t::ceiling, xscale); if (yscale) - sectors[secnum].SetYScale(sector_t::ceiling, yscale); + level.sectors[secnum].SetYScale(sector_t::ceiling, yscale); } return true; } @@ -2510,9 +2510,9 @@ FUNC(LS_Sector_SetFloorScale2) while ((secnum = itr.Next()) >= 0) { if (arg1) - sectors[secnum].SetXScale(sector_t::floor, xscale); + level.sectors[secnum].SetXScale(sector_t::floor, xscale); if (arg2) - sectors[secnum].SetYScale(sector_t::floor, yscale); + level.sectors[secnum].SetYScale(sector_t::floor, yscale); } return true; } @@ -2532,9 +2532,9 @@ FUNC(LS_Sector_SetCeilingScale2) while ((secnum = itr.Next()) >= 0) { if (arg1) - sectors[secnum].SetXScale(sector_t::ceiling, xscale); + level.sectors[secnum].SetXScale(sector_t::ceiling, xscale); if (arg2) - sectors[secnum].SetYScale(sector_t::ceiling, yscale); + level.sectors[secnum].SetYScale(sector_t::ceiling, yscale); } return true; } @@ -2549,8 +2549,8 @@ FUNC(LS_Sector_SetRotation) int secnum; while ((secnum = itr.Next()) >= 0) { - sectors[secnum].SetAngle(sector_t::floor, floor); - sectors[secnum].SetAngle(sector_t::ceiling, ceiling); + level.sectors[secnum].SetAngle(sector_t::floor, floor); + level.sectors[secnum].SetAngle(sector_t::ceiling, ceiling); } return true; } @@ -3151,7 +3151,7 @@ FUNC(LS_ClearForceField) int secnum; while ((secnum = itr.Next()) >= 0) { - sector_t *sec = §ors[secnum]; + sector_t *sec = &level.sectors[secnum]; rtn = true; sec->RemoveForceField(); diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp index 0919cfa3b..3bdf3718d 100644 --- a/src/p_mobj.cpp +++ b/src/p_mobj.cpp @@ -3961,9 +3961,9 @@ void AActor::Tick () sector_t *sec = node->m_sector; 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 { @@ -5251,9 +5251,9 @@ APlayerPawn *P_SpawnPlayer (FPlayerStart *mthing, int playernum, int flags) { 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); diff --git a/src/p_pillar.cpp b/src/p_pillar.cpp index b0ea0e4a3..d4682e570 100644 --- a/src/p_pillar.cpp +++ b/src/p_pillar.cpp @@ -220,7 +220,7 @@ bool EV_DoPillar (DPillar::EPillar type, line_t *line, int tag, FSectorTagIterator itr(tag, line); while ((secnum = itr.Next()) >= 0) { - sec = §ors[secnum]; + sec = &level.sectors[secnum]; if (sec->PlaneMoving(sector_t::floor) || sec->PlaneMoving(sector_t::ceiling)) continue; diff --git a/src/p_plats.cpp b/src/p_plats.cpp index 43e8eefb4..7bbf33b27 100644 --- a/src/p_plats.cpp +++ b/src/p_plats.cpp @@ -243,7 +243,7 @@ bool EV_DoPlat (int tag, line_t *line, DPlat::EPlatType type, double height, FSectorTagIterator itr(tag, line); while ((secnum = itr.Next()) >= 0) { - sec = §ors[secnum]; + sec = &level.sectors[secnum]; if (sec->PlaneMoving(sector_t::floor)) { diff --git a/src/p_pusher.cpp b/src/p_pusher.cpp index 1cf004120..8a4032b40 100644 --- a/src/p_pusher.cpp +++ b/src/p_pusher.cpp @@ -192,7 +192,7 @@ void DPusher::Tick () if (!var_pushers) return; - sec = sectors + m_Affectee; + sec = &level.sectors[m_Affectee]; // Be sure the special sector type is still turned on. If so, proceed. // Else, bail out; the sector type has been changed on us. @@ -339,7 +339,7 @@ AActor *P_GetPushThing (int s) AActor* thing; sector_t* sec; - sec = sectors + s; + sec = &level.sectors[s]; thing = sec->thinglist; while (thing && @@ -406,8 +406,7 @@ void P_SpawnPushers () if (thing->GetClass()->TypeName == NAME_PointPusher || thing->GetClass()->TypeName == NAME_PointPuller) { - new DPusher (DPusher::p_push, l->args[3] ? l : NULL, l->args[2], - 0, thing, int(thing->Sector - sectors)); + new DPusher (DPusher::p_push, l->args[3] ? l : NULL, l->args[2], 0, thing, thing->Sector->Index()); } } } @@ -447,7 +446,7 @@ void AdjustPusher (int tag, int magnitude, int angle, bool wind) unsigned int i; for (i = 0; i < numcollected; i++) { - if (Collection[i].RefNum == sectors[secnum].sectornum) + if (Collection[i].RefNum == secnum) break; } if (i == numcollected) diff --git a/src/p_saveg.cpp b/src/p_saveg.cpp index 93ff5c72b..5f9aeec42 100644 --- a/src/p_saveg.cpp +++ b/src/p_saveg.cpp @@ -281,7 +281,7 @@ FSerializer &Serialize(FSerializer &arc, const char *key, sector_t &p, sector_t { 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()); level.Scrolls[p.sectornum] = scroll; } @@ -900,7 +900,7 @@ void G_SerializeLevel(FSerializer &arc, bool hubload) arc.Array("checksum", chk, 16); if (arc.GetSize("linedefs") != (unsigned)numlines || arc.GetSize("sidedefs") != (unsigned)numsides || - arc.GetSize("sectors") != (unsigned)numsectors || + arc.GetSize("sectors") != level.sectors.Size() || arc.GetSize("polyobjs") != (unsigned)po_NumPolyobjs || 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. arc.Array("linedefs", lines, &loadlines[0], numlines); 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("lineportals", linePortals); arc("sectorportals", sectorPortals); @@ -972,9 +972,9 @@ void G_SerializeLevel(FSerializer &arc, bool hubload) if (arc.isReading()) { - for (int i = 0; i < numsectors; i++) + for (auto &sec : level.sectors) { - P_Recalculate3DFloors(§ors[i]); + P_Recalculate3DFloors(&sec); } for (int i = 0; i < MAXPLAYERS; ++i) { diff --git a/src/p_scroll.cpp b/src/p_scroll.cpp index 25789d944..954b1ac36 100644 --- a/src/p_scroll.cpp +++ b/src/p_scroll.cpp @@ -168,8 +168,8 @@ void DScroller::Tick () if (m_Control != -1) { // compute scroll amounts based on a sector's height changes - double height = sectors[m_Control].CenterFloor () + - sectors[m_Control].CenterCeiling (); + double height = level.sectors[m_Control].CenterFloor () + + level.sectors[m_Control].CenterCeiling (); double delta = height - m_LastHeight; m_LastHeight = height; dx *= delta; @@ -208,15 +208,15 @@ void DScroller::Tick () break; case EScroll::sc_floor: // killough 3/7/98: Scroll floor texture - RotationComp(§ors[m_Affectee], sector_t::floor, dx, dy, tdx, tdy); - sectors[m_Affectee].AddXOffset(sector_t::floor, tdx); - sectors[m_Affectee].AddYOffset(sector_t::floor, tdy); + RotationComp(&level.sectors[m_Affectee], sector_t::floor, dx, dy, tdx, tdy); + level.sectors[m_Affectee].AddXOffset(sector_t::floor, tdx); + level.sectors[m_Affectee].AddYOffset(sector_t::floor, tdy); break; case EScroll::sc_ceiling: // killough 3/7/98: Scroll ceiling texture - RotationComp(§ors[m_Affectee], sector_t::ceiling, dx, dy, tdx, tdy); - sectors[m_Affectee].AddXOffset(sector_t::ceiling, tdx); - sectors[m_Affectee].AddYOffset(sector_t::ceiling, tdy); + RotationComp(&level.sectors[m_Affectee], sector_t::ceiling, dx, dy, tdx, tdy); + level.sectors[m_Affectee].AddXOffset(sector_t::ceiling, tdx); + level.sectors[m_Affectee].AddYOffset(sector_t::ceiling, tdy); break; // [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_LastHeight = 0; if ((m_Control = control) != -1) + { m_LastHeight = - sectors[control].CenterFloor () + sectors[control].CenterCeiling (); + level.sectors[control].CenterFloor() + level.sectors[control].CenterCeiling(); + } m_Affectee = affectee; m_Interpolations[0] = m_Interpolations[1] = m_Interpolations[2] = NULL; @@ -291,11 +293,11 @@ DScroller::DScroller (EScroll type, double dx, double dy, break; 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; 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; default: @@ -346,7 +348,7 @@ DScroller::DScroller (double dx, double dy, const line_t *l, m_Parts = scrollpos; m_LastHeight = 0; 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); sides[m_Affectee].Flags |= WALLF_NOAUTODECALS; m_Interpolations[0] = m_Interpolations[1] = m_Interpolations[2] = NULL; @@ -439,7 +441,7 @@ void P_SpawnScrollers(void) { // if 1, then displacement // 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) accel = 1; } @@ -476,7 +478,7 @@ void P_SpawnScrollers(void) 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; @@ -496,7 +498,7 @@ void P_SpawnScrollers(void) 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)) { - 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); } } } diff --git a/src/p_sectors.cpp b/src/p_sectors.cpp index c2488b998..c7a502354 100644 --- a/src/p_sectors.cpp +++ b/src/p_sectors.cpp @@ -1307,6 +1307,84 @@ int side_t::GetLightLevel (bool foggy, int baselight, bool is3dlight, int *pfake 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, 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, locknumber) 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) diff --git a/src/p_setup.cpp b/src/p_setup.cpp index 88694a8cf..e03b7ac23 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -122,8 +122,8 @@ int numsegs; seg_t* segs; glsegextra_t* glsegextras; -int numsectors; -sector_t* sectors; +//int numsectors; +//sector_t* sectors; TArray loadsectors; int numsubsectors; @@ -808,11 +808,11 @@ void P_FloodZones () int z = 0, i; ReverbContainer *reverb; - for (i = 0; i < numsectors; ++i) + for (auto &sec : level.sectors) { - if (sectors[i].ZoneNumber == 0xFFFF) + if (sec.ZoneNumber == 0xFFFF) { - P_FloodZone (§ors[i], z++); + P_FloodZone (&sec, z++); } } Zones.Resize(z); @@ -1463,7 +1463,6 @@ void P_LoadSubsectors (MapData * map) void P_LoadSectors (MapData *map, FMissingTextureTracker &missingtex) { - int i; char *msp; mapsector_t *ms; sector_t* ss; @@ -1471,8 +1470,9 @@ void P_LoadSectors (MapData *map, FMissingTextureTracker &missingtex) FDynamicColormap *fogMap, *normMap; int lumplen = map->Size(ML_SECTORS); - numsectors = lumplen / sizeof(mapsector_t); - sectors = new sector_t[numsectors]; + unsigned numsectors = lumplen / sizeof(mapsector_t); + level.sectors.Alloc(numsectors); + auto sectors = &level.sectors[0]; memset (sectors, 0, numsectors*sizeof(sector_t)); if (level.flags & LEVEL_SNDSEQTOTALCTRL) @@ -1490,7 +1490,7 @@ void P_LoadSectors (MapData *map, FMissingTextureTracker &missingtex) // Extended properties 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 = §ors[0].e[i]; 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) { - int s; FDynamicColormap *colormap = NULL; - for (s = 0; s < numsectors; s++) + for (unsigned s = 0; s < level.sectors.Size(); s++) { if (tagManager.SectorHasTag(s, tag)) { - if (!colorgood) color = sectors[s].ColorMap->Color; - if (!foggood) fog = sectors[s].ColorMap->Fade; + if (!colorgood) color = level.sectors[s].ColorMap->Color; + if (!foggood) fog = level.sectors[s].ColorMap->Fade; if (colormap == NULL || colormap->Color != color || colormap->Fade != fog) { 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 // 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); sd->sector = sec = NULL; } else { - sd->sector = sec = §ors[LittleShort(msd->sector)]; + sd->sector = sec = &level.sectors[LittleShort(msd->sector)]; } intmapsidedef_t imsd; @@ -3089,28 +3088,26 @@ static void P_GroupLines (bool buildmap) { cycle_t times[16]; unsigned int* linesDoneInEachSector; - int i; int total; - line_t* li; sector_t* sector; FBoundingBox bbox; bool flaggedNoFronts = false; unsigned int jj; - for (i = 0; i < (int)countof(times); ++i) + for (unsigned i = 0; i < countof(times); ++i) { times[i].Reset(); } // look up sector number for each subsector times[0].Clock(); - for (i = 0; i < numsubsectors; i++) + for (int i = 0; i < numsubsectors; i++) { subsectors[i].sector = subsectors[i].firstline->sidedef->sector; } if (glsegextras != NULL) { - for (i = 0; i < numsubsectors; i++) + for (int i = 0; i < numsubsectors; i++) { 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 times[1].Clock(); 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 (!flaggedNoFronts) @@ -3156,10 +3154,12 @@ static void P_GroupLines (bool buildmap) times[3].Clock(); linebuffer = new line_t *[total]; line_t **lineb_p = linebuffer; + auto numsectors = level.sectors.Size(); linesDoneInEachSector = new unsigned 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) { @@ -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) { - li->frontsector->Lines[linesDoneInEachSector[li->frontsector - sectors]++] = li; + li->frontsector->Lines[linesDoneInEachSector[li->frontsector->Index()]++] = li; } 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()) { @@ -3235,7 +3237,7 @@ static void P_GroupLines (bool buildmap) if (showloadtimes) { 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()); } @@ -3247,7 +3249,7 @@ static void P_GroupLines (bool buildmap) // 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; if (strnicmp (map->MapLumps[ML_REJECT].Name, "REJECT", 8) != 0) @@ -3385,10 +3387,10 @@ static void P_PrecacheLevel() 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[sectors[i].GetTexture(sector_t::ceiling).GetIndex()] |= FTextureManager::HIT_Flat; + hitlist[level.sectors[i].GetTexture(sector_t::floor).GetIndex()] |= FTextureManager::HIT_Flat; + hitlist[level.sectors[i].GetTexture(sector_t::ceiling).GetIndex()] |= FTextureManager::HIT_Flat; } for (i = numsides - 1; i >= 0; i--) @@ -3458,13 +3460,12 @@ void P_FreeLevelData () delete[] glsegextras; glsegextras = NULL; } - if (sectors != NULL) + if (level.sectors.Size() > 0) { - delete[] sectors[0].e; - delete[] sectors; - sectors = NULL; + delete[] level.sectors[0].e; } - numsectors = 0; + level.sectors.Clear(); + if (gamenodes != NULL && gamenodes != nodes) { delete[] gamenodes; @@ -4069,10 +4070,10 @@ void P_SetupLevel (const char *lumpname, int position) P_SpawnSpecials (); // 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 (sectors[i].ceilingplane.isSlope()) sectors[i].reflect[sector_t::ceiling] = 0; + if (sec.floorplane.isSlope()) sec.reflect[sector_t::floor] = 0; + if (sec.ceilingplane.isSlope()) sec.reflect[sector_t::ceiling] = 0; } // This must be done BEFORE the PolyObj Spawn!!! @@ -4192,8 +4193,8 @@ void P_SetupLevel (const char *lumpname, int position) MapThingsUserDataIndex.Clear(); MapThingsUserData.Clear(); - loadsectors.Resize(numsectors); - memcpy(&loadsectors[0], sectors, numsectors * sizeof(sector_t)); + loadsectors.Resize(level.sectors.Size()); + memcpy(&loadsectors[0], &level.sectors[0], loadsectors.Size() * sizeof(sector_t)); loadlines.Resize(numlines); memcpy(&loadlines[0], lines, numlines * sizeof(line_t)); loadsides.Resize(numsides); diff --git a/src/p_sight.cpp b/src/p_sight.cpp index df02e2ebb..eb62e505a 100644 --- a/src/p_sight.cpp +++ b/src/p_sight.cpp @@ -821,7 +821,7 @@ bool P_CheckSight (AActor *t1, AActor *t2, int flags) const sector_t *s1 = t1->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 diff --git a/src/p_slopes.cpp b/src/p_slopes.cpp index 2e6a44832..ff0159940 100644 --- a/src/p_slopes.cpp +++ b/src/p_slopes.cpp @@ -125,7 +125,7 @@ static void P_CopyPlane (int tag, sector_t *dest, bool copyCeil) return; } - source = §ors[secnum]; + source = &level.sectors[secnum]; if (copyCeil) { @@ -301,19 +301,18 @@ static void P_SetSlopesFromVertexHeights(FMapThing *firstmt, FMapThing *lastmt, if (vt_found) { - for (int i = 0; i < numsectors; i++) + for (auto &sec : level.sectors) { - sector_t *sec = §ors[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 vec1, vec2; int vi1, vi2, vi3; - vi1 = int(sec->Lines[0]->v1 - 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)? - int(sec->Lines[1]->v2 - vertexes) : int(sec->Lines[1]->v1 - vertexes); + vi1 = int(sec.Lines[0]->v1 - 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)? + int(sec.Lines[1]->v2 - vertexes) : int(sec.Lines[1]->v1 - vertexes); vt1 = DVector3(vertexes[vi1].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); if (h1 == NULL && h2 == NULL && h3 == NULL) continue; - 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); - vt3.Z = h3? *h3 : 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); + 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; vec2 = vt1 - vt3; @@ -358,7 +357,7 @@ static void P_SetSlopesFromVertexHeights(FMapThing *firstmt, FMapThing *lastmt, 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; plane->set(cross[0], cross[1], cross[2], dist); diff --git a/src/p_spec.cpp b/src/p_spec.cpp index 72211897d..b3cf9c597 100644 --- a/src/p_spec.cpp +++ b/src/p_spec.cpp @@ -37,6 +37,7 @@ #include "doomdef.h" #include "doomstat.h" #include "d_event.h" +#include "g_level.h" #include "gstrings.h" #include "i_system.h" @@ -432,7 +433,7 @@ void P_PlayerInSpecialSector (player_t *player, sector_t * sector) if (sector->isSecret()) { 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) { AActor *actor, *next; - sector_t *sec = §ors[secnum]; + sector_t *sec = &level.sectors[secnum]; // Do for actors in this sector. 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) { - int i; - - for (i = 0; i < numsectors; i++) + for (auto &sec : level.sectors) { - sector_t *hsec = sectors[i].GetHeightSec(); - if (hsec && - !(sectors[i].heightsec->MoreFlags & SECF_UNDERWATER)) + sector_t *hsec = sec.GetHeightSec(); + if (hsec && !(hsec->MoreFlags & SECF_UNDERWATER)) { if (self) { @@ -693,13 +691,13 @@ DLightTransfer::DLightTransfer (sector_t *srcSec, int target, bool copyFloor) { FSectorTagIterator itr(target); 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 { FSectorTagIterator itr(target); 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); } @@ -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; @@ -723,13 +721,13 @@ void DLightTransfer::DoTransfer (int level, int target, bool floor) { FSectorTagIterator itr(target); while ((secnum = itr.Next()) >= 0) - sectors[secnum].SetPlaneLight(sector_t::floor, level); + level.sectors[secnum].SetPlaneLight(sector_t::floor, llevel); } else { FSectorTagIterator itr(target); 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); while ((s = itr.Next()) >= 0) { - SetPortal(§ors[s], plane, pnum, alpha); + SetPortal(&level.sectors[s], plane, pnum, alpha); } for (int j=0;j= 0) { - SetPortal(§ors[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: 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; break; @@ -1217,14 +1215,14 @@ void P_InitSectorSpecial(sector_t *sector, int special) int i = sector->special - Scroll_North_Slow; double dx = hexenScrollies[i][0] / 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 && sector->special <= Carry_East35) { // Heretic scroll special // Only east scrollers also scroll the texture 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; break; @@ -1240,20 +1238,14 @@ void P_InitSectorSpecial(sector_t *sector, int special) void P_SpawnSpecials (void) { - sector_t *sector; - int i; - P_SetupPortals(); - // Init special SECTORs. - sector = sectors; - - for (i = 0; i < numsectors; i++, sector++) + for (auto &sec : level.sectors) { - if (sector->special == 0) + if (sec.special == 0) continue; - P_InitSectorSpecial(sector, sector->special); + P_InitSectorSpecial(&sec, sec.special); } #ifndef NO_EDATA @@ -1274,7 +1266,7 @@ void P_SpawnSpecials (void) P_SpawnSkybox(pt2); } - for (i = 0; i < numlines; i++) + for (int i = 0; i < numlines; i++) { switch (lines[i].special) { @@ -1313,9 +1305,9 @@ void P_SpawnSpecials (void) FSectorTagIterator itr(lines[i].args[0]); while ((s = itr.Next()) >= 0) { - sectors[s].heightsec = sec; - sec->e->FakeFloor.Sectors.Push(§ors[s]); - sectors[s].AdjustFloorClip(); + level.sectors[s].heightsec = sec; + sec->e->FakeFloor.Sectors.Push(&level.sectors[s]); + level.sectors[s].AdjustFloorClip(); } break; } @@ -1388,7 +1380,7 @@ void P_SpawnSpecials (void) double grav = lines[i].Delta().Length() / 100.; FSectorTagIterator itr(lines[i].args[0]); while ((s = itr.Next()) >= 0) - sectors[s].gravity = grav; + level.sectors[s].gravity = grav; } break; @@ -1401,7 +1393,7 @@ void P_SpawnSpecials (void) FSectorTagIterator itr(lines[i].args[0]); while ((s = itr.Next()) >= 0) { - sector_t *sec = §ors[s]; + sector_t *sec = &level.sectors[s]; sec->damageamount = damage; sec->damagetype = NAME_None; if (sec->damageamount < 20) @@ -1441,7 +1433,7 @@ void P_SpawnSpecials (void) { FSectorTagIterator itr(lines[i].args[0]); while ((s = itr.Next()) >= 0) - sectors[s].sky = (i + 1) | PL_SKYFLAT; + level.sectors[s].sky = (i + 1) | PL_SKYFLAT; 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 // at level startup, and then uses this friction value. - sectors[s].friction = friction; - sectors[s].movefactor = movefactor; + level.sectors[s].friction = friction; + level.sectors[s].movefactor = movefactor; if (alterFlag) { // When used inside a script, the sectors' friction flags // can be enabled and disabled at will. if (friction == ORIG_FRICTION) { - sectors[s].Flags &= ~SECF_FRICTION; + level.sectors[s].Flags &= ~SECF_FRICTION; } else { - sectors[s].Flags |= SECF_FRICTION; + level.sectors[s].Flags |= SECF_FRICTION; } } } diff --git a/src/p_tags.cpp b/src/p_tags.cpp index a85138955..dc71e2663 100644 --- a/src/p_tags.cpp +++ b/src/p_tags.cpp @@ -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) { return (int)(intptr_t)(line - lines); @@ -194,7 +189,7 @@ void FTagManager::HashTags() bool FTagManager::SectorHasTags(const sector_t *sector) const { - int i = sectindex(sector); + int i = sector->Index(); return SectorHasTags(i); } @@ -206,7 +201,7 @@ bool FTagManager::SectorHasTags(const sector_t *sector) 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; } @@ -238,7 +233,7 @@ bool FTagManager::SectorHasTag(int i, 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 { // 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++; } - if (start == numsectors) return -1; + if (start == (int)level.sectors.Size()) return -1; ret = start; start++; } @@ -355,7 +350,7 @@ int FSectorTagIterator::NextCompat(bool compat, int start) { 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; } diff --git a/src/p_tags.h b/src/p_tags.h index fa214acb6..17719de6f 100644 --- a/src/p_tags.h +++ b/src/p_tags.h @@ -90,7 +90,7 @@ public: if (tag == 0) { 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 { diff --git a/src/p_teleport.cpp b/src/p_teleport.cpp index e9752ee53..12f9ef4b8 100644 --- a/src/p_teleport.cpp +++ b/src/p_teleport.cpp @@ -333,7 +333,7 @@ static AActor *SelectTeleDest (int tid, int tag, bool norandom) TThinkerIterator it2(NAME_TeleportDest); while ((searcher = it2.Next()) != NULL) { - if (searcher->Sector == sectors + secnum) + if (searcher->Sector == &level.sectors[secnum]) { 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) { msecnode_t *node; - const sector_t * const sec = §ors[secnum]; + const sector_t * const sec = &level.sectors[secnum]; for (node = sec->touching_thinglist; node; ) { diff --git a/src/p_trace.cpp b/src/p_trace.cpp index b82ac0f5a..4b0a5f3bd 100644 --- a/src/p_trace.cpp +++ b/src/p_trace.cpp @@ -444,7 +444,7 @@ bool FTraceInfo::LineCheck(intercept_t *in, double dist, DVector3 hit) // hit crossed a water plane if (CheckSectorPlane(hsec, true)) { - Results->CrossedWater = §ors[CurSector->sectornum]; + Results->CrossedWater = &level.sectors[CurSector->sectornum]; Results->CrossedWaterPos = Results->HitPos; Results->Distance = 0; } @@ -572,7 +572,7 @@ cont: if (Results->HitType != TRACE_HitNone) { // We hit something, so figure out where exactly - Results->Sector = §ors[CurSector->sectornum]; + Results->Sector = &level.sectors[CurSector->sectornum]; if (Results->HitType != TRACE_HitWall && !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. // Calculate an intersection and abort. - Results->Sector = §ors[CurSector->sectornum]; + Results->Sector = &level.sectors[CurSector->sectornum]; if (!CheckSectorPlane(CurSector, Results->HitType == TRACE_HitFloor)) { Results->HitType = TRACE_HitNone; @@ -850,7 +850,7 @@ bool FTraceInfo::TraceTraverse (int ptflags) } // check for intersection with floor/ceiling - Results->Sector = §ors[CurSector->sectornum]; + Results->Sector = &level.sectors[CurSector->sectornum]; if (Results->CrossedWater == NULL && CurSector->heightsec != NULL && @@ -864,7 +864,7 @@ bool FTraceInfo::TraceTraverse (int ptflags) if (CheckSectorPlane(CurSector->heightsec, true)) { - Results->CrossedWater = §ors[CurSector->sectornum]; + Results->CrossedWater = &level.sectors[CurSector->sectornum]; Results->CrossedWaterPos = Results->HitPos; Results->Distance = 0; } diff --git a/src/p_udmf.cpp b/src/p_udmf.cpp index 256385c65..63621d2fa 100644 --- a/src/p_udmf.cpp +++ b/src/p_udmf.cpp @@ -1834,7 +1834,7 @@ public: { sides[side] = ParsedSides[mapside]; sides[side].linedef = &lines[line]; - sides[side].sector = §ors[intptr_t(sides[side].sector)]; + sides[side].sector = &level.sectors[intptr_t(sides[side].sector)]; lines[line].sidedef[sd] = &sides[side]; P_ProcessSideTextures(!isExtended, &sides[side], sides[side].sector, &ParsedSideTextures[mapside], @@ -2019,13 +2019,12 @@ public: memcpy(vertexdatas, &ParsedVertexDatas[0], numvertexdatas * sizeof(*vertexdatas)); // Create the real sectors - numsectors = ParsedSectors.Size(); - sectors = new sector_t[numsectors]; - memcpy(sectors, &ParsedSectors[0], numsectors * sizeof(*sectors)); - sectors[0].e = new extsector_t[numsectors]; - for(int i = 0; i < numsectors; i++) + level.sectors.Alloc(ParsedSectors.Size()); + memcpy(&level.sectors[0], &ParsedSectors[0], level.sectors.Size() * sizeof(sector_t)); + level.sectors[0].e = new extsector_t[level.sectors.Size()]; + for(unsigned i = 0; i < level.sectors.Size(); i++) { - sectors[i].e = §ors[0].e[i]; + level.sectors[i].e = &level.sectors[0].e[i]; } // Create the real linedefs and decompress the sidedefs diff --git a/src/p_user.cpp b/src/p_user.cpp index 8bd23830d..c4be5d526 100644 --- a/src/p_user.cpp +++ b/src/p_user.cpp @@ -2061,7 +2061,7 @@ void P_MovePlayer (player_t *player) msecnode_t *n = player->mo->touching_sectorlist; while (n != NULL) { - fprintf (debugfile, "%td ", n->m_sector-sectors); + fprintf (debugfile, "%d ", n->m_sector->sectornum); n = n->m_tnext; } fprintf (debugfile, "]\n"); diff --git a/src/p_writemap.cpp b/src/p_writemap.cpp index e26e3cf53..cdf5a19d1 100644 --- a/src/p_writemap.cpp +++ b/src/p_writemap.cpp @@ -152,7 +152,7 @@ static int WriteSIDEDEFS (FILE *file) { msd.textureoffset = LittleShort(short(sides[i].GetTextureXOffset(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.bottomtexture, GetTextureName (sides[i].GetTexture(side_t::bottom))); uppercopy (msd.midtexture, GetTextureName (sides[i].GetTexture(side_t::mid))); @@ -194,18 +194,18 @@ static int WriteSECTORS (FILE *file) { 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.ceilingheight = LittleShort(short(sectors[i].GetPlaneTexZ(sector_t::ceiling))); - uppercopy (ms.floorpic, GetTextureName (sectors[i].GetTexture(sector_t::floor))); - uppercopy (ms.ceilingpic, GetTextureName (sectors[i].GetTexture(sector_t::ceiling))); - ms.lightlevel = LittleShort((short)sectors[i].lightlevel); - ms.special = LittleShort(sectors[i].special); - ms.tag = LittleShort(tagManager.GetFirstSectorTag(§ors[i])); + ms.floorheight = LittleShort(short(level.sectors[i].GetPlaneTexZ(sector_t::floor))); + ms.ceilingheight = LittleShort(short(level.sectors[i].GetPlaneTexZ(sector_t::ceiling))); + uppercopy (ms.floorpic, GetTextureName (level.sectors[i].GetTexture(sector_t::floor))); + uppercopy (ms.ceilingpic, GetTextureName (level.sectors[i].GetTexture(sector_t::ceiling))); + ms.lightlevel = LittleShort((short)level.sectors[i].lightlevel); + ms.special = LittleShort(level.sectors[i].special); + ms.tag = LittleShort(tagManager.GetFirstSectorTag(&level.sectors[i])); fwrite (&ms, sizeof(ms), 1, file); } - return numsectors * sizeof(ms); + return level.sectors.Size() * sizeof(ms); } static int WriteREJECT (FILE *file) diff --git a/src/portal.cpp b/src/portal.cpp index 1d6e7acca..fa5c9fed7 100644 --- a/src/portal.cpp +++ b/src/portal.cpp @@ -980,18 +980,18 @@ void P_CreateLinkedPortals() id = 1; if (orgs.Size() != 0) { - for (int i = 0; i < numsectors; i++) + for (auto &sec : level.sectors) { 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()) { // The engine cannot deal with portals on a sloped plane. - sectors[i].ClearPortal(j); - Printf("Portal on %s of sector %d is sloped and will be disabled\n", j == 0 ? "floor" : "ceiling", i); + sec.ClearPortal(j); + 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); // Check for leftover sectors that connect to a portal - for (int i = 0; imOrigin->PortalGroup, §ors[i]); + auto p = sec.GetPortal(j); + CollectSectors(p->mOrigin->PortalGroup, &sec); } } } @@ -1048,10 +1048,10 @@ void P_CreateLinkedPortals() (dispxy.pos.X != -dispyx.pos.X || dispxy.pos.Y != -dispyx.pos.Y)) { 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 (sec2 == -1 && sectors[i].PortalGroup == y) sec2 = i; + if (sec1 == -1 && level.sectors[i].PortalGroup == x) sec1 = i; + if (sec2 == -1 && level.sectors[i].PortalGroup == y) sec2 = i; } Printf("Link offset mismatch between sectors %d and %d\n", sec1, sec2); bogus = true; @@ -1065,13 +1065,13 @@ void P_CreateLinkedPortals() } } // 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; } // 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); - sectors[i].CheckPortalPlane(sector_t::ceiling); + sec.CheckPortalPlane(sector_t::floor); + 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. - 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; } } - 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 fz = sectors[i].GetPortalPlaneZ(sector_t::floor); + double cz = sec.GetPortalPlaneZ(sector_t::ceiling); + double fz = sec.GetPortalPlaneZ(sector_t::floor); 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 - Printf("Error in sector %d: Ceiling portal at z=%f is below floor portal at z=%f\n", i, cz, fz); - double cp = -sectors[i].ceilingplane.fD(); - double fp = sectors[i].floorplane.fD(); + Printf("Error in sector %d: Ceiling portal at z=%f is below floor portal at z=%f\n", sec.sectornum, cz, fz); + double cp = -sec.ceilingplane.fD(); + double fp = sec.floorplane.fD(); if (cp < fp || fz == fp) { - sectors[i].ClearPortal(sector_t::ceiling); + sec.ClearPortal(sector_t::ceiling); } else { - sectors[i].ClearPortal(sector_t::floor); + sec.ClearPortal(sector_t::floor); } } } // 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 (sectors[i].PortalIsLinked(sector_t::ceiling)) sectors[i].planes[sector_t::ceiling].Flags |= PLANEF_LINKED; + if (sec.PortalIsLinked(sector_t::floor)) sec.planes[sector_t::floor].Flags |= PLANEF_LINKED; + if (sec.PortalIsLinked(sector_t::ceiling)) sec.planes[sector_t::ceiling].Flags |= PLANEF_LINKED; } if (linkedPortals.Size() > 0) { diff --git a/src/r_defs.h b/src/r_defs.h index 3a7d4c97f..912ce8d7b 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -23,7 +23,6 @@ #ifndef __R_DEFS_H__ #define __R_DEFS_H__ -#include #include "doomdef.h" #include "templates.h" #include "memarena.h" @@ -659,6 +658,7 @@ public: double FindLowestCeilingPoint(vertex_t **v) const; double FindHighestFloorPoint(vertex_t **v) const; void RemoveForceField(); + int Index() const { return int(this - &level.sectors[0]); } void AdjustFloorClip () const; void SetColor(int r, int g, int b, int desat); diff --git a/src/r_state.h b/src/r_state.h index cd4aee4be..c3fa03636 100644 --- a/src/r_state.h +++ b/src/r_state.h @@ -50,9 +50,6 @@ extern vertexdata_t* vertexdatas; extern int numsegs; extern seg_t* segs; -extern int numsectors; -extern sector_t* sectors; - extern int numsubsectors; extern subsector_t* subsectors; diff --git a/src/scripting/thingdef_data.cpp b/src/scripting/thingdef_data.cpp index 95dc3a668..2e9654607 100644 --- a/src/scripting/thingdef_data.cpp +++ b/src/scripting/thingdef_data.cpp @@ -711,6 +711,26 @@ static int fieldcmp(const void * a, const void * b) void InitThingdef() { // 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. 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); 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 PStruct *dstruct = NewNativeStruct("DehInfo", nullptr); PField *dehf = new PField("deh", dstruct, VARF_Native | VARF_Static, (intptr_t)&deh); - GlobalSymbols.AddSymbol(dehf); // 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); 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); playerf = new PField("playeringame", parray, VARF_Native | VARF_Static | VARF_ReadOnly, (intptr_t)&playeringame); GlobalSymbols.AddSymbol(playerf); diff --git a/src/serializer.cpp b/src/serializer.cpp index 5f0e6dfce..7c48f9b1e 100644 --- a/src/serializer.cpp +++ b/src/serializer.cpp @@ -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) { - 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) { - return SerializePointer(arc, key, value, defval, sectors); + return SerializePointer(arc, key, value, defval, &level.sectors[0]); } template<> FSerializer &Serialize(FSerializer &arc, const char *key, player_t *&value, player_t **defval) diff --git a/src/tarray.h b/src/tarray.h index e40b88a7b..7e6affb97 100644 --- a/src/tarray.h +++ b/src/tarray.h @@ -563,10 +563,13 @@ public: void Clear() { if (this->Array) delete[] this->Array; + this->Count = 0; + this->Array = NULL; } void Alloc(unsigned int amount) { - Clear(); + // intentionally first deletes and then reallocates. + if (this->Array) delete[] this->Array; this->Array = new T[amount]; this->Count = amount; } diff --git a/wadsrc/static/zscript/base.txt b/wadsrc/static/zscript/base.txt index 23a830537..be161483e 100644 --- a/wadsrc/static/zscript/base.txt +++ b/wadsrc/static/zscript/base.txt @@ -236,10 +236,27 @@ struct Line native 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 { - //secplane_t floorplane, ceilingplane; - //FDynamicColormap *ColorMap; // [RH] Per-sector colormap + //secplane_t floorplane, ceilingplane; // defined internally + //FDynamicColormap *ColorMap; native Actor SoundTarget;