# Conflicts:
#	src/r_bsp.cpp
#	src/r_plane.cpp
#	src/r_things.cpp
This commit is contained in:
Rachael Alexanderson 2017-01-09 09:51:06 -05:00
commit 05662e5c4d
136 changed files with 1273 additions and 1162 deletions

View file

@ -1168,7 +1168,6 @@ set (PCH_SOURCES
p_udmf.cpp p_udmf.cpp
p_usdf.cpp p_usdf.cpp
p_user.cpp p_user.cpp
p_writemap.cpp
p_xlat.cpp p_xlat.cpp
parsecontext.cpp parsecontext.cpp
po_man.cpp po_man.cpp

View file

@ -779,14 +779,7 @@ public:
// set translation // set translation
void SetTranslation(FName trname); void SetTranslation(FName trname);
double GetBobOffset(double ticfrac = 0) const double GetBobOffset(double ticfrac = 0) const;
{
if (!(flags2 & MF2_FLOATBOB))
{
return 0;
}
return BobSin(FloatBobPhase + level.maptime + ticfrac);
}
// Enter the crash state // Enter the crash state
void Crash(); void Crash();

View file

@ -70,6 +70,7 @@
#include "po_man.h" #include "po_man.h"
#include "a_keys.h" #include "a_keys.h"
#include "r_data/colormaps.h" #include "r_data/colormaps.h"
#include "g_levellocals.h"
//============================================================================= //=============================================================================
@ -601,23 +602,21 @@ CUSTOM_CVAR (Int, am_showalllines, -1, 0) // This is a cheat so don't save it.
{ {
int flagged = 0; int flagged = 0;
int total = 0; int total = 0;
if (self > 0 && numlines > 0) if (self > 0 && level.lines.Size() > 0)
{ {
for(int i=0;i<numlines;i++) for(auto &line : level.lines)
{ {
line_t *line = &lines[i];
// disregard intra-sector lines // disregard intra-sector lines
if (line->frontsector == line->backsector) continue; if (line.frontsector == line.backsector) continue;
// disregard control sectors for deep water // disregard control sectors for deep water
if (line->frontsector->e->FakeFloor.Sectors.Size() > 0) continue; if (line.frontsector->e->FakeFloor.Sectors.Size() > 0) continue;
// disregard control sectors for 3D-floors // disregard control sectors for 3D-floors
if (line->frontsector->e->XFloor.attached.Size() > 0) continue; if (line.frontsector->e->XFloor.attached.Size() > 0) continue;
total++; total++;
if (line->flags & ML_DONTDRAW) flagged++; if (line.flags & ML_DONTDRAW) flagged++;
} }
am_showallenabled = (flagged * 100 / total >= self); am_showallenabled = (flagged * 100 / total >= self);
} }
@ -1030,17 +1029,17 @@ static void AM_findMinMaxBoundaries ()
min_x = min_y = FLT_MAX; min_x = min_y = FLT_MAX;
max_x = max_y = FIXED_MIN; max_x = max_y = FIXED_MIN;
for (int i = 0; i < numvertexes; i++) for (auto &vert : level.vertexes)
{ {
if (vertexes[i].fX() < min_x) if (vert.fX() < min_x)
min_x = vertexes[i].fX(); min_x = vert.fX();
else if (vertexes[i].fX() > max_x) else if (vert.fX() > max_x)
max_x = vertexes[i].fX(); max_x = vert.fX();
if (vertexes[i].fY() < min_y) if (vert.fY() < min_y)
min_y = vertexes[i].fY(); min_y = vert.fY();
else if (vertexes[i].fY() > max_y) else if (vert.fY() > max_y)
max_y = vertexes[i].fY(); max_y = vert.fY();
} }
max_w = max_x - min_x; max_w = max_x - min_x;
@ -2382,7 +2381,6 @@ bool AM_isLockBoundary (line_t &line, int *lockptr = NULL)
void AM_drawWalls (bool allmap) void AM_drawWalls (bool allmap)
{ {
int i;
static mline_t l; static mline_t l;
int lock, color; int lock, color;
@ -2393,18 +2391,18 @@ void AM_drawWalls (bool allmap)
if (p == MapPortalGroup) continue; if (p == MapPortalGroup) continue;
for (i = 0; i < numlines; i++) for (auto &line : level.lines)
{ {
int pg; int pg;
if (lines[i].sidedef[0]->Flags & WALLF_POLYOBJ) if (line.sidedef[0]->Flags & WALLF_POLYOBJ)
{ {
// For polyobjects we must test the surrounding sector to get the proper group. // For polyobjects we must test the surrounding sector to get the proper group.
pg = P_PointInSector(lines[i].v1->fX() + lines[i].Delta().X / 2, lines[i].v1->fY() + lines[i].Delta().Y / 2)->PortalGroup; pg = P_PointInSector(line.v1->fX() + line.Delta().X / 2, line.v1->fY() + line.Delta().Y / 2)->PortalGroup;
} }
else else
{ {
pg = lines[i].frontsector->PortalGroup; pg = line.frontsector->PortalGroup;
} }
DVector2 offset; DVector2 offset;
bool portalmode = numportalgroups > 0 && pg != MapPortalGroup; bool portalmode = numportalgroups > 0 && pg != MapPortalGroup;
@ -2418,10 +2416,10 @@ void AM_drawWalls (bool allmap)
} }
else continue; else continue;
l.a.x = (lines[i].v1->fX() + offset.X); l.a.x = (line.v1->fX() + offset.X);
l.a.y = (lines[i].v1->fY() + offset.Y); l.a.y = (line.v1->fY() + offset.Y);
l.b.x = (lines[i].v2->fX() + offset.X); l.b.x = (line.v2->fX() + offset.X);
l.b.y = (lines[i].v2->fY() + offset.Y); l.b.y = (line.v2->fY() + offset.Y);
if (am_rotate == 1 || (am_rotate == 2 && viewactive)) if (am_rotate == 1 || (am_rotate == 2 && viewactive))
{ {
@ -2429,9 +2427,9 @@ void AM_drawWalls (bool allmap)
AM_rotatePoint(&l.b.x, &l.b.y); AM_rotatePoint(&l.b.x, &l.b.y);
} }
if (am_cheat != 0 || (lines[i].flags & ML_MAPPED)) if (am_cheat != 0 || (line.flags & ML_MAPPED))
{ {
if ((lines[i].flags & ML_DONTDRAW) && (am_cheat == 0 || am_cheat >= 4)) if ((line.flags & ML_DONTDRAW) && (am_cheat == 0 || am_cheat >= 4))
{ {
if (!am_showallenabled || CheckCheatmode(false)) if (!am_showallenabled || CheckCheatmode(false))
{ {
@ -2443,27 +2441,27 @@ void AM_drawWalls (bool allmap)
{ {
AM_drawMline(&l, AMColors.PortalColor); AM_drawMline(&l, AMColors.PortalColor);
} }
else if (AM_CheckSecret(&lines[i])) else if (AM_CheckSecret(&line))
{ {
// map secret sectors like Boom // map secret sectors like Boom
AM_drawMline(&l, AMColors.SecretSectorColor); AM_drawMline(&l, AMColors.SecretSectorColor);
} }
else if (lines[i].flags & ML_SECRET) else if (line.flags & ML_SECRET)
{ // secret door { // secret door
if (am_cheat != 0 && lines[i].backsector != NULL) if (am_cheat != 0 && line.backsector != NULL)
AM_drawMline(&l, AMColors.SecretWallColor); AM_drawMline(&l, AMColors.SecretWallColor);
else else
AM_drawMline(&l, AMColors.WallColor); AM_drawMline(&l, AMColors.WallColor);
} }
else if (AM_isTeleportBoundary(lines[i]) && AMColors.isValid(AMColors.IntraTeleportColor)) else if (AM_isTeleportBoundary(line) && AMColors.isValid(AMColors.IntraTeleportColor))
{ // intra-level teleporters { // intra-level teleporters
AM_drawMline(&l, AMColors.IntraTeleportColor); AM_drawMline(&l, AMColors.IntraTeleportColor);
} }
else if (AM_isExitBoundary(lines[i]) && AMColors.isValid(AMColors.InterTeleportColor)) else if (AM_isExitBoundary(line) && AMColors.isValid(AMColors.InterTeleportColor))
{ // inter-level/game-ending teleporters { // inter-level/game-ending teleporters
AM_drawMline(&l, AMColors.InterTeleportColor); AM_drawMline(&l, AMColors.InterTeleportColor);
} }
else if (AM_isLockBoundary(lines[i], &lock)) else if (AM_isLockBoundary(line, &lock))
{ {
if (AMColors.displayLocks) if (AMColors.displayLocks)
{ {
@ -2483,25 +2481,25 @@ void AM_drawWalls (bool allmap)
} }
else if (am_showtriggerlines else if (am_showtriggerlines
&& AMColors.isValid(AMColors.SpecialWallColor) && AMColors.isValid(AMColors.SpecialWallColor)
&& AM_isTriggerBoundary(lines[i])) && AM_isTriggerBoundary(line))
{ {
AM_drawMline(&l, AMColors.SpecialWallColor); // wall with special non-door action the player can do AM_drawMline(&l, AMColors.SpecialWallColor); // wall with special non-door action the player can do
} }
else if (lines[i].backsector == NULL) else if (line.backsector == NULL)
{ {
AM_drawMline(&l, AMColors.WallColor); // one-sided wall AM_drawMline(&l, AMColors.WallColor); // one-sided wall
} }
else if (lines[i].backsector->floorplane else if (line.backsector->floorplane
!= lines[i].frontsector->floorplane) != line.frontsector->floorplane)
{ {
AM_drawMline(&l, AMColors.FDWallColor); // floor level change AM_drawMline(&l, AMColors.FDWallColor); // floor level change
} }
else if (lines[i].backsector->ceilingplane else if (line.backsector->ceilingplane
!= lines[i].frontsector->ceilingplane) != line.frontsector->ceilingplane)
{ {
AM_drawMline(&l, AMColors.CDWallColor); // ceiling level change AM_drawMline(&l, AMColors.CDWallColor); // ceiling level change
} }
else if (AM_Check3DFloors(&lines[i])) else if (AM_Check3DFloors(&line))
{ {
AM_drawMline(&l, AMColors.EFWallColor); // Extra floor border AM_drawMline(&l, AMColors.EFWallColor); // Extra floor border
} }
@ -2512,7 +2510,7 @@ void AM_drawWalls (bool allmap)
} }
else if (allmap) else if (allmap)
{ {
if ((lines[i].flags & ML_DONTDRAW) && (am_cheat == 0 || am_cheat >= 4)) if ((line.flags & ML_DONTDRAW) && (am_cheat == 0 || am_cheat >= 4))
{ {
if (!am_showallenabled || CheckCheatmode(false)) if (!am_showallenabled || CheckCheatmode(false))
{ {

View file

@ -49,6 +49,7 @@
#include "d_player.h" #include "d_player.h"
#include "g_level.h" #include "g_level.h"
#include "doomstat.h" #include "doomstat.h"
#include "g_levellocals.h"
// MACROS ------------------------------------------------------------------ // MACROS ------------------------------------------------------------------

View file

@ -72,6 +72,7 @@
#include "r_utility.h" #include "r_utility.h"
#include "r_data/r_interpolate.h" #include "r_data/r_interpolate.h"
#include "c_functions.h" #include "c_functions.h"
#include "g_levellocals.h"
extern FILE *Logfile; extern FILE *Logfile;
extern bool insave; extern bool insave;

View file

@ -67,6 +67,7 @@
#include "d_player.h" #include "d_player.h"
#include "gstrings.h" #include "gstrings.h"
#include "c_consolebuffer.h" #include "c_consolebuffer.h"
#include "g_levellocals.h"
#include "gi.h" #include "gi.h"

View file

@ -52,6 +52,7 @@
#include "p_tags.h" #include "p_tags.h"
#include "r_state.h" #include "r_state.h"
#include "w_wad.h" #include "w_wad.h"
#include "g_levellocals.h"
// MACROS ------------------------------------------------------------------ // MACROS ------------------------------------------------------------------
@ -475,9 +476,9 @@ void SetCompatibilityParams()
{ {
case CP_CLEARFLAGS: case CP_CLEARFLAGS:
{ {
if (CompatParams[i+1] < numlines) if ((unsigned)CompatParams[i+1] < level.lines.Size())
{ {
line_t *line = &lines[CompatParams[i+1]]; line_t *line = &level.lines[CompatParams[i+1]];
line->flags &= ~CompatParams[i+2]; line->flags &= ~CompatParams[i+2];
} }
i+=3; i+=3;
@ -485,9 +486,9 @@ void SetCompatibilityParams()
} }
case CP_SETFLAGS: case CP_SETFLAGS:
{ {
if (CompatParams[i+1] < numlines) if ((unsigned)CompatParams[i+1] < level.lines.Size())
{ {
line_t *line = &lines[CompatParams[i+1]]; line_t *line = &level.lines[CompatParams[i+1]];
line->flags |= CompatParams[i+2]; line->flags |= CompatParams[i+2];
} }
i+=3; i+=3;
@ -495,9 +496,9 @@ void SetCompatibilityParams()
} }
case CP_SETSPECIAL: case CP_SETSPECIAL:
{ {
if (CompatParams[i+1] < numlines) if ((unsigned)CompatParams[i+1] < level.lines.Size())
{ {
line_t *line = &lines[CompatParams[i+1]]; line_t *line = &level.lines[CompatParams[i+1]];
line->special = CompatParams[i+2]; line->special = CompatParams[i+2];
for(int ii=0;ii<5;ii++) for(int ii=0;ii<5;ii++)
{ {
@ -509,9 +510,9 @@ void SetCompatibilityParams()
} }
case CP_CLEARSPECIAL: case CP_CLEARSPECIAL:
{ {
if (CompatParams[i+1] < numlines) if ((unsigned)CompatParams[i+1] < level.lines.Size())
{ {
line_t *line = &lines[CompatParams[i+1]]; line_t *line = &level.lines[CompatParams[i+1]];
line->special = 0; line->special = 0;
memset(line->args, 0, sizeof(line->args)); memset(line->args, 0, sizeof(line->args));
} }
@ -520,9 +521,9 @@ void SetCompatibilityParams()
} }
case CP_SETACTIVATION: case CP_SETACTIVATION:
{ {
if (CompatParams[i+1] < numlines) if ((unsigned)CompatParams[i+1] < level.lines.Size())
{ {
line_t *line = &lines[CompatParams[i+1]]; line_t *line = &level.lines[CompatParams[i+1]];
line->activation = CompatParams[i+2]; line->activation = CompatParams[i+2];
} }
i += 3; i += 3;
@ -552,9 +553,9 @@ void SetCompatibilityParams()
} }
case CP_SETWALLYSCALE: case CP_SETWALLYSCALE:
{ {
if (CompatParams[i+1] < numlines) if ((unsigned)CompatParams[i+1] < level.lines.Size())
{ {
side_t *side = lines[CompatParams[i+1]].sidedef[CompatParams[i+2]]; side_t *side = level.lines[CompatParams[i+1]].sidedef[CompatParams[i+2]];
if (side != NULL) if (side != NULL)
{ {
side->SetTextureYScale(CompatParams[i+3], CompatParams[i+4] / 65536.); side->SetTextureYScale(CompatParams[i+3], CompatParams[i+4] / 65536.);

View file

@ -109,6 +109,7 @@
#include "p_local.h" #include "p_local.h"
#include "autosegs.h" #include "autosegs.h"
#include "fragglescript/t_fs.h" #include "fragglescript/t_fs.h"
#include "g_levellocals.h"
EXTERN_CVAR(Bool, hud_althud) EXTERN_CVAR(Bool, hud_althud)
void DrawHUD(); void DrawHUD();

View file

@ -63,6 +63,7 @@
#include "r_utility.h" #include "r_utility.h"
#include "a_keys.h" #include "a_keys.h"
#include "intermission/intermission.h" #include "intermission/intermission.h"
#include "g_levellocals.h"
EXTERN_CVAR (Int, disableautosave) EXTERN_CVAR (Int, disableautosave)
EXTERN_CVAR (Int, autosavecount) EXTERN_CVAR (Int, autosavecount)

View file

@ -49,6 +49,7 @@
#include "colormatcher.h" #include "colormatcher.h"
#include "b_bot.h" #include "b_bot.h"
#include "serializer.h" #include "serializer.h"
#include "g_levellocals.h"
FDecalLib DecalLibrary; FDecalLib DecalLibrary;

View file

@ -49,6 +49,7 @@
#include "dsectoreffect.h" #include "dsectoreffect.h"
#include "serializer.h" #include "serializer.h"
#include "virtual.h" #include "virtual.h"
#include "g_levellocals.h"
//========================================================================== //==========================================================================
// //

View file

@ -77,6 +77,7 @@
#include "r_utility.h" #include "r_utility.h"
#include "menu/menu.h" #include "menu/menu.h"
#include "intermission/intermission.h" #include "intermission/intermission.h"
#include "g_levellocals.h"
// MACROS ------------------------------------------------------------------ // MACROS ------------------------------------------------------------------
@ -709,15 +710,15 @@ size_t DSectorMarker::PropagateMark()
moretodo = true; moretodo = true;
} }
} }
if (!moretodo && sides != NULL) if (!moretodo && level.sides.Size() > 0)
{ {
for (i = 0; i < SIDEDEFSTEPSIZE && SideNum + i < numsides; ++i) for (i = 0; i < SIDEDEFSTEPSIZE && SideNum + i < (int)level.sides.Size(); ++i)
{ {
side_t *side = &sides[SideNum + i]; side_t *side = &level.sides[SideNum + i];
for(int j=0;j<3;j++) GC::Mark(side->textures[j].interpolation); for(int j=0;j<3;j++) GC::Mark(side->textures[j].interpolation);
} }
marked += i * sizeof(side_t); marked += i * sizeof(side_t);
if (SideNum + i < numsides) if (SideNum + i < (int)level.sides.Size())
{ {
SideNum += i; SideNum += i;
moretodo = true; moretodo = true;

View file

@ -29,6 +29,7 @@
#include "i_system.h" #include "i_system.h"
#include "g_level.h" #include "g_level.h"
#include "p_local.h" #include "p_local.h"
#include "g_levellocals.h"
int SaveVersion; int SaveVersion;

View file

@ -49,6 +49,7 @@
#include "v_palette.h" #include "v_palette.h"
#include "p_acs.h" #include "p_acs.h"
#include "r_data/colormaps.h" #include "r_data/colormaps.h"
#include "g_levellocals.h"
struct FEDOptions : public FOptionalMapinfoData struct FEDOptions : public FOptionalMapinfoData
@ -705,7 +706,7 @@ void ProcessEDLinedef(line_t *ld, int recordnum)
ld->flags = (ld->flags&~fmask) | eld->flags; ld->flags = (ld->flags&~fmask) | eld->flags;
ld->setAlpha(eld->alpha); ld->setAlpha(eld->alpha);
memcpy(ld->args, eld->args, sizeof(ld->args)); memcpy(ld->args, eld->args, sizeof(ld->args));
tagManager.AddLineID(int(ld - lines), eld->tag); tagManager.AddLineID(ld->Index(), eld->tag);
} }
void ProcessEDSector(sector_t *sec, int recordnum) void ProcessEDSector(sector_t *sec, int recordnum)
@ -760,12 +761,12 @@ void ProcessEDSectors()
auto numsectors = level.sectors.Size(); auto numsectors = level.sectors.Size();
int *sectorrecord = new int[numsectors]; int *sectorrecord = new int[numsectors];
memset(sectorrecord, -1, numsectors * sizeof(int)); memset(sectorrecord, -1, numsectors * sizeof(int));
for (int i = 0; i < numlines; i++) for (auto &line : level.lines)
{ {
if (lines[i].special == Static_Init && lines[i].args[1] == Init_EDSector) if (line.special == Static_Init && line.args[1] == Init_EDSector)
{ {
sectorrecord[lines[i].frontsector->Index()] = lines[i].args[0]; sectorrecord[line.frontsector->Index()] = line.args[0];
lines[i].special = 0; line.special = 0;
} }
} }
for (unsigned i = 0; i < numsectors; i++) for (unsigned i = 0; i < numsectors; i++)

View file

@ -48,6 +48,7 @@
#include "g_level.h" #include "g_level.h"
#include "r_renderer.h" #include "r_renderer.h"
#include "d_player.h" #include "d_player.h"
#include "g_levellocals.h"
//========================================================================== //==========================================================================
// //

View file

@ -71,6 +71,7 @@
#include "r_utility.h" #include "r_utility.h"
#include "a_ammo.h" #include "a_ammo.h"
#include "math/cmath.h" #include "math/cmath.h"
#include "g_levellocals.h"
static FRandom pr_script("FScript"); static FRandom pr_script("FScript");
@ -2171,7 +2172,7 @@ void FParser::SF_SetLineBlocking(void)
int i; int i;
while ((i = itr.Next()) >= 0) while ((i = itr.Next()) >= 0)
{ {
lines[i].flags = (lines[i].flags & ~(ML_BLOCKING | ML_BLOCKEVERYTHING)) | blocking; level.lines[i].flags = (level.lines[i].flags & ~(ML_BLOCKING | ML_BLOCKEVERYTHING)) | blocking;
} }
} }
} }
@ -2194,7 +2195,7 @@ void FParser::SF_SetLineMonsterBlocking(void)
int i; int i;
while ((i = itr.Next()) >= 0) while ((i = itr.Next()) >= 0)
{ {
lines[i].flags = (lines[i].flags & ~ML_BLOCKMONSTERS) | blocking; level.lines[i].flags = (level.lines[i].flags & ~ML_BLOCKMONSTERS) | blocking;
} }
} }
} }
@ -2251,11 +2252,11 @@ void FParser::SF_SetLineTexture(void)
while ((i = itr.Next()) >= 0) while ((i = itr.Next()) >= 0)
{ {
// bad sidedef, Hexen just SEGV'd here! // bad sidedef, Hexen just SEGV'd here!
if (lines[i].sidedef[side] != NULL) if (level.lines[i].sidedef[side] != NULL)
{ {
if (position >= 0 && position <= 2) if (position >= 0 && position <= 2)
{ {
lines[i].sidedef[side]->SetTexture(position, texturenum); level.lines[i].sidedef[side]->SetTexture(position, texturenum);
} }
} }
} }
@ -2270,7 +2271,7 @@ void FParser::SF_SetLineTexture(void)
FLineIdIterator itr(tag); FLineIdIterator itr(tag);
while ((i = itr.Next()) >= 0) while ((i = itr.Next()) >= 0)
{ {
side_t *sided = lines[i].sidedef[side]; side_t *sided = level.lines[i].sidedef[side];
if(sided != NULL) if(sided != NULL)
{ {
if(sections & 1) sided->SetTexture(side_t::top, picnum); if(sections & 1) sided->SetTexture(side_t::top, picnum);
@ -3363,19 +3364,19 @@ void FParser::SF_ObjState()
void FParser::SF_LineFlag() void FParser::SF_LineFlag()
{ {
line_t* line; line_t* line;
int linenum; unsigned linenum;
int flagnum; int flagnum;
if (CheckArgs(2)) if (CheckArgs(2))
{ {
linenum = intvalue(t_argv[0]); linenum = intvalue(t_argv[0]);
if(linenum < 0 || linenum > numlines) if(linenum >= level.lines.Size())
{ {
script_error("LineFlag: Invalid line number.\n"); script_error("LineFlag: Invalid line number.\n");
return; return;
} }
line = lines + linenum; line = &level.lines[linenum];
flagnum = intvalue(t_argv[1]); flagnum = intvalue(t_argv[1]);
if(flagnum < 0 || (flagnum > 8 && flagnum!=15)) if(flagnum < 0 || (flagnum > 8 && flagnum!=15))
@ -3987,9 +3988,9 @@ void FParser::SF_SetLineTrigger()
mld.special = spec; mld.special = spec;
mld.tag = tag; mld.tag = tag;
mld.flags = 0; mld.flags = 0;
int f = lines[i].flags; int f = level.lines[i].flags;
P_TranslateLineDef(&lines[i], &mld); P_TranslateLineDef(&level.lines[i], &mld);
lines[i].flags = (lines[i].flags & (ML_MONSTERSCANACTIVATE | ML_REPEAT_SPECIAL | ML_SPAC_MASK | ML_FIRSTSIDEONLY)) | level.lines[i].flags = (level.lines[i].flags & (ML_MONSTERSCANACTIVATE | ML_REPEAT_SPECIAL | ML_SPAC_MASK | ML_FIRSTSIDEONLY)) |
(f & ~(ML_MONSTERSCANACTIVATE | ML_REPEAT_SPECIAL | ML_SPAC_MASK | ML_FIRSTSIDEONLY)); (f & ~(ML_MONSTERSCANACTIVATE | ML_REPEAT_SPECIAL | ML_SPAC_MASK | ML_FIRSTSIDEONLY));
} }

View file

@ -43,6 +43,7 @@
#include "cmdlib.h" #include "cmdlib.h"
#include "p_lnspec.h" #include "p_lnspec.h"
#include "gi.h" #include "gi.h"
#include "g_levellocals.h"
#include "xlat/xlat.h" #include "xlat/xlat.h"
void T_Init(); void T_Init();

View file

@ -55,6 +55,7 @@
#include "doomerrors.h" #include "doomerrors.h"
#include "doomstat.h" #include "doomstat.h"
#include "serializer.h" #include "serializer.h"
#include "g_levellocals.h"
//========================================================================== //==========================================================================
// //

View file

@ -91,6 +91,7 @@
#include <zlib.h> #include <zlib.h>
#include "g_hub.h" #include "g_hub.h"
#include "g_levellocals.h"
static FRandom pr_dmspawn ("DMSpawn"); static FRandom pr_dmspawn ("DMSpawn");
@ -2241,7 +2242,7 @@ void G_DoSaveGame (bool okForQuicksave, FString filename, const char *descriptio
// Do not even try, if we're not in a level. (Can happen after // Do not even try, if we're not in a level. (Can happen after
// a demo finishes playback.) // a demo finishes playback.)
if (lines == NULL || level.sectors.Size() == 0 || gamestate != GS_LEVEL) if (level.lines.Size() == 0 || level.sectors.Size() == 0 || gamestate != GS_LEVEL)
{ {
return; return;
} }

View file

@ -44,6 +44,7 @@
#include "gstrings.h" #include "gstrings.h"
#include "wi_stuff.h" #include "wi_stuff.h"
#include "serializer.h" #include "serializer.h"
#include "g_levellocals.h"
//========================================================================== //==========================================================================

View file

@ -22,6 +22,7 @@
#include "serializer.h" #include "serializer.h"
#include "r_utility.h" #include "r_utility.h"
#include "virtual.h" #include "virtual.h"
#include "g_levellocals.h"
#include "r_data/colormaps.h" #include "r_data/colormaps.h"

View file

@ -22,6 +22,7 @@
#include "virtual.h" #include "virtual.h"
#include "a_ammo.h" #include "a_ammo.h"
#include "c_functions.h" #include "c_functions.h"
#include "g_levellocals.h"
EXTERN_CVAR(Bool, sv_unlimited_pickup) EXTERN_CVAR(Bool, sv_unlimited_pickup)

View file

@ -88,6 +88,7 @@
#include "gi.h" #include "gi.h"
#include "g_hub.h" #include "g_hub.h"
#include "g_levellocals.h"
#include <string.h> #include <string.h>

View file

@ -376,77 +376,6 @@ struct level_info_t
} }
}; };
struct FLevelLocals
{
void Tick ();
void AddScroller (int secnum);
BYTE md5[16]; // for savegame validation. If the MD5 does not match the savegame won't be loaded.
int time; // time in the hub
int maptime; // time in the map
int totaltime; // time in the game
int starttime;
int partime;
int sucktime;
level_info_t *info;
int cluster;
int clusterflags;
int levelnum;
int lumpnum;
FString LevelName;
FString MapName; // the lump name (E1M1, MAP01, etc)
FString NextMap; // go here when using the regular exit
FString NextSecretMap; // map to go to when used secret exit
EMapType maptype;
TStaticArray<sector_t> sectors;
DWORD flags;
DWORD flags2;
DWORD flags3;
DWORD fadeto; // The color the palette fades to (usually black)
DWORD outsidefog; // The fog for sectors with sky ceilings
FString Music;
int musicorder;
int cdtrack;
unsigned int cdid;
FTextureID skytexture1;
FTextureID skytexture2;
float skyspeed1; // Scrolling speed of sky textures, in pixels per ms
float skyspeed2;
int total_secrets;
int found_secrets;
int total_items;
int found_items;
int total_monsters;
int killed_monsters;
double gravity;
double aircontrol;
double airfriction;
int airsupply;
int DefaultEnvironment; // Default sound environment.
TArray<DVector2> Scrolls; // NULL if no DScrollers in this level
SBYTE WallVertLight; // Light diffs for vert/horiz walls
SBYTE WallHorizLight;
bool FromSnapshot; // The current map was restored from a snapshot
double teamdamage;
bool IsJumpingAllowed() const;
bool IsCrouchingAllowed() const;
bool IsFreelookAllowed() const;
};
struct cluster_info_t struct cluster_info_t
{ {
@ -476,8 +405,6 @@ struct cluster_info_t
#define CLUSTER_LOOKUPCLUSTERNAME 0x00000080 // Cluster name is the name of a language string #define CLUSTER_LOOKUPCLUSTERNAME 0x00000080 // Cluster name is the name of a language string
#define CLUSTER_ALLOWINTERMISSION 0x00000100 // Allow intermissions between levels in a hub. #define CLUSTER_ALLOWINTERMISSION 0x00000100 // Allow intermissions between levels in a hub.
extern FLevelLocals level;
extern TArray<level_info_t> wadlevelinfos; extern TArray<level_info_t> wadlevelinfos;
extern TArray<cluster_info_t> wadclusterinfos; extern TArray<cluster_info_t> wadclusterinfos;

101
src/g_levellocals.h Normal file
View file

@ -0,0 +1,101 @@
#pragma once
#include "g_level.h"
#include "r_defs.h"
struct FLevelLocals
{
void Tick ();
void AddScroller (int secnum);
BYTE md5[16]; // for savegame validation. If the MD5 does not match the savegame won't be loaded.
int time; // time in the hub
int maptime; // time in the map
int totaltime; // time in the game
int starttime;
int partime;
int sucktime;
level_info_t *info;
int cluster;
int clusterflags;
int levelnum;
int lumpnum;
FString LevelName;
FString MapName; // the lump name (E1M1, MAP01, etc)
FString NextMap; // go here when using the regular exit
FString NextSecretMap; // map to go to when used secret exit
EMapType maptype;
TStaticArray<vertex_t> vertexes;
TStaticArray<sector_t> sectors;
TStaticArray<line_t> lines;
TStaticArray<side_t> sides;
DWORD flags;
DWORD flags2;
DWORD flags3;
DWORD fadeto; // The color the palette fades to (usually black)
DWORD outsidefog; // The fog for sectors with sky ceilings
FString Music;
int musicorder;
int cdtrack;
unsigned int cdid;
FTextureID skytexture1;
FTextureID skytexture2;
float skyspeed1; // Scrolling speed of sky textures, in pixels per ms
float skyspeed2;
int total_secrets;
int found_secrets;
int total_items;
int found_items;
int total_monsters;
int killed_monsters;
double gravity;
double aircontrol;
double airfriction;
int airsupply;
int DefaultEnvironment; // Default sound environment.
TArray<DVector2> Scrolls; // NULL if no DScrollers in this level
SBYTE WallVertLight; // Light diffs for vert/horiz walls
SBYTE WallHorizLight;
bool FromSnapshot; // The current map was restored from a snapshot
double teamdamage;
bool IsJumpingAllowed() const;
bool IsCrouchingAllowed() const;
bool IsFreelookAllowed() const;
};
extern FLevelLocals level;
inline int vertex_t::Index() const
{
return int(this - &level.vertexes[0]);
}
inline int side_t::Index() const
{
return int(this - &level.sides[0]);
}
inline int line_t::Index() const
{
return int(this - &level.lines[0]);
}
inline int sector_t::Index() const
{
return int(this - &level.sectors[0]);
}

View file

@ -51,6 +51,7 @@
#include "autosegs.h" #include "autosegs.h"
#include "version.h" #include "version.h"
#include "v_text.h" #include "v_text.h"
#include "g_levellocals.h"
TArray<cluster_info_t> wadclusterinfos; TArray<cluster_info_t> wadclusterinfos;
TArray<level_info_t> wadlevelinfos; TArray<level_info_t> wadlevelinfos;

View file

@ -47,6 +47,7 @@
#include "serializer.h" #include "serializer.h"
#include "doomdata.h" #include "doomdata.h"
#include "r_state.h" #include "r_state.h"
#include "g_levellocals.h"
static double DecalWidth, DecalLeft, DecalRight; static double DecalWidth, DecalLeft, DecalRight;
static double SpreadZ; static double SpreadZ;
@ -415,7 +416,7 @@ void DBaseDecal::SpreadLeft (double r, vertex_t *v1, side_t *feelwall, F3DFloor
double x = v1->fX(); double x = v1->fX();
double y = v1->fY(); double y = v1->fY();
feelwall = &sides[feelwall->LeftSide]; feelwall = &level.sides[feelwall->LeftSide];
GetWallStuff (feelwall, v1, ldx, ldy); GetWallStuff (feelwall, v1, ldx, ldy);
double wallsize = Length (ldx, ldy); double wallsize = Length (ldx, ldy);
r += DecalLeft; r += DecalLeft;
@ -455,7 +456,7 @@ void DBaseDecal::SpreadRight (double r, side_t *feelwall, double wallsize, F3DFl
while (r > wallsize && feelwall->RightSide != NO_SIDE) while (r > wallsize && feelwall->RightSide != NO_SIDE)
{ {
feelwall = &sides[feelwall->RightSide]; feelwall = &level.sides[feelwall->RightSide];
side_t *nextwall = NextWall (feelwall); side_t *nextwall = NextWall (feelwall);
if (nextwall != NULL && nextwall->LeftSide != NO_SIDE) if (nextwall != NULL && nextwall->LeftSide != NO_SIDE)

View file

@ -7,6 +7,7 @@
#include "b_bot.h" #include "b_bot.h"
#include "p_checkposition.h" #include "p_checkposition.h"
#include "virtual.h" #include "virtual.h"
#include "g_levellocals.h"
IMPLEMENT_CLASS(AFastProjectile, false, false) IMPLEMENT_CLASS(AFastProjectile, false, false)

View file

@ -2,6 +2,7 @@
#include "g_level.h" #include "g_level.h"
#include "d_player.h" #include "d_player.h"
#include "serializer.h" #include "serializer.h"
#include "g_levellocals.h"
IMPLEMENT_CLASS(DFlashFader, false, true) IMPLEMENT_CLASS(DFlashFader, false, true)

View file

@ -10,6 +10,7 @@
#include "g_level.h" #include "g_level.h"
#include "r_state.h" #include "r_state.h"
#include "serializer.h" #include "serializer.h"
#include "g_levellocals.h"
static FRandom pr_lightning ("Lightning"); static FRandom pr_lightning ("Lightning");

View file

@ -16,6 +16,7 @@
#include "d_player.h" #include "d_player.h"
#include "a_armor.h" #include "a_armor.h"
#include "r_data/sprites.h" #include "r_data/sprites.h"
#include "g_levellocals.h"
static FRandom pr_morphmonst ("MorphMonster"); static FRandom pr_morphmonst ("MorphMonster");

View file

@ -38,6 +38,7 @@
#include "p_lnspec.h" #include "p_lnspec.h"
#include "doomstat.h" #include "doomstat.h"
#include "serializer.h" #include "serializer.h"
#include "g_levellocals.h"
/* /*
== InterpolationPoint: node along a camera's path == InterpolationPoint: node along a camera's path

View file

@ -16,6 +16,7 @@
#include "v_text.h" #include "v_text.h"
#include "doomstat.h" #include "doomstat.h"
#include "doomdata.h" #include "doomdata.h"
#include "g_levellocals.h"
#define MAX_RANDOMSPAWNERS_RECURSION 32 // Should be largely more than enough, honestly. #define MAX_RANDOMSPAWNERS_RECURSION 32 // Should be largely more than enough, honestly.
static FRandom pr_randomspawn("RandomSpawn"); static FRandom pr_randomspawn("RandomSpawn");

View file

@ -60,6 +60,7 @@
#include "version.h" #include "version.h"
#include "cmdlib.h" #include "cmdlib.h"
#include "a_ammo.h" #include "a_ammo.h"
#include "g_levellocals.h"
#define ARTIFLASH_OFFSET (statusBar->invBarOffset+6) #define ARTIFLASH_OFFSET (statusBar->invBarOffset+6)
enum enum

View file

@ -55,6 +55,7 @@
#include "d_player.h" #include "d_player.h"
#include "r_utility.h" #include "r_utility.h"
#include "cmdlib.h" #include "cmdlib.h"
#include "g_levellocals.h"
#include <time.h> #include <time.h>

View file

@ -55,6 +55,7 @@
#include "gstrings.h" #include "gstrings.h"
#include "r_utility.h" #include "r_utility.h"
#include "cmdlib.h" #include "cmdlib.h"
#include "g_levellocals.h"
#include "../version.h" #include "../version.h"

View file

@ -43,6 +43,7 @@
#include "v_font.h" #include "v_font.h"
#include "m_fixed.h" #include "m_fixed.h"
#include "gstrings.h" #include "gstrings.h"
#include "g_levellocals.h"
TArray<FSkillInfo> AllSkills; TArray<FSkillInfo> AllSkills;
int DefaultSkill = -1; int DefaultSkill = -1;

View file

@ -19,6 +19,7 @@
#include "colormatcher.h" #include "colormatcher.h"
#include "v_palette.h" #include "v_palette.h"
#include "cmdlib.h" #include "cmdlib.h"
#include "g_levellocals.h"
// Number of tics to move the popscreen up and down. // Number of tics to move the popscreen up and down.
#define POP_TIME (TICRATE/8) #define POP_TIME (TICRATE/8)

View file

@ -38,6 +38,7 @@
#include "i_system.h" #include "i_system.h"
#include "v_text.h" #include "v_text.h"
#include "r_utility.h" #include "r_utility.h"
#include "g_levellocals.h"
#include "gl/dynlights/gl_dynlight.h" #include "gl/dynlights/gl_dynlight.h"
#include "gl/utility/gl_geometric.h" #include "gl/utility/gl_geometric.h"
#include "gl/renderer/gl_renderer.h" #include "gl/renderer/gl_renderer.h"

View file

@ -41,6 +41,7 @@
#include "g_level.h" #include "g_level.h"
#include "doomstat.h" #include "doomstat.h"
#include "d_player.h" #include "d_player.h"
#include "g_levellocals.h"
#include "gl/system/gl_interface.h" #include "gl/system/gl_interface.h"
#include "gl/renderer/gl_renderer.h" #include "gl/renderer/gl_renderer.h"
@ -547,7 +548,7 @@ CCMD(dumpgeometry)
{ {
Printf(PRINT_LOG, " (%4.4f, %4.4f), (%4.4f, %4.4f) - seg %d, linedef %d, side %d", Printf(PRINT_LOG, " (%4.4f, %4.4f), (%4.4f, %4.4f) - seg %d, linedef %d, side %d",
seg->v1->fX(), seg->v1->fY(), seg->v2->fX(), seg->v2->fY(), seg->v1->fX(), seg->v1->fY(), seg->v2->fX(), seg->v2->fY(),
int(seg-segs), int(seg->linedef-lines), seg->sidedef != seg->linedef->sidedef[0]); int(seg-segs), seg->linedef->Index(), seg->sidedef != seg->linedef->sidedef[0]);
} }
else else
{ {

View file

@ -38,6 +38,7 @@
#include "gi.h" #include "gi.h"
#include "g_level.h" #include "g_level.h"
#include "a_sharedglobal.h" #include "a_sharedglobal.h"
#include "g_levellocals.h"
#include "gl/renderer/gl_renderer.h" #include "gl/renderer/gl_renderer.h"
#include "gl/data/gl_data.h" #include "gl/data/gl_data.h"

View file

@ -40,6 +40,7 @@
#include "gi.h" #include "gi.h"
#include "p_setup.h" #include "p_setup.h"
#include "g_level.h" #include "g_level.h"
#include "g_levellocals.h"
#include "gl/renderer/gl_renderer.h" #include "gl/renderer/gl_renderer.h"
#include "gl/data/gl_data.h" #include "gl/data/gl_data.h"
@ -402,51 +403,50 @@ static void InitVertexData()
int i,j,k; int i,j,k;
vt_sectorlists = new TArray<int>[numvertexes]; vt_sectorlists = new TArray<int>[level.vertexes.Size()];
for(i=0;i<numlines;i++) for(auto &line : level.lines)
{ {
line_t * line = &lines[i];
for(j=0;j<2;j++) for(j=0;j<2;j++)
{ {
vertex_t * v = j==0? line->v1 : line->v2; vertex_t * v = j==0? line.v1 : line.v2;
for(k=0;k<2;k++) for(k=0;k<2;k++)
{ {
sector_t * sec = k==0? line->frontsector : line->backsector; sector_t * sec = k==0? line.frontsector : line.backsector;
if (sec) if (sec)
{ {
extsector_t::xfloor &x = sec->e->XFloor; extsector_t::xfloor &x = sec->e->XFloor;
AddToVertex(sec, vt_sectorlists[v-vertexes]); AddToVertex(sec, vt_sectorlists[v->Index()]);
if (sec->heightsec) AddToVertex(sec->heightsec, vt_sectorlists[v-vertexes]); if (sec->heightsec) AddToVertex(sec->heightsec, vt_sectorlists[v->Index()]);
} }
} }
} }
} }
for(i=0;i<numvertexes;i++) for(i=0;i<level.vertexes.Size();i++)
{ {
auto vert = level.vertexes[i];
int cnt = vt_sectorlists[i].Size(); int cnt = vt_sectorlists[i].Size();
vertexes[i].dirty = true; vert.dirty = true;
vertexes[i].numheights=0; vert.numheights=0;
if (cnt>1) if (cnt>1)
{ {
vertexes[i].numsectors= cnt; vert.numsectors= cnt;
vertexes[i].sectors=new sector_t*[cnt]; vert.sectors=new sector_t*[cnt];
vertexes[i].heightlist = new float[cnt*2]; vert.heightlist = new float[cnt*2];
for(int j=0;j<cnt;j++) for(int j=0;j<cnt;j++)
{ {
vertexes[i].sectors[j] = &level.sectors[vt_sectorlists[i][j]]; vert.sectors[j] = &level.sectors[vt_sectorlists[i][j]];
} }
} }
else else
{ {
vertexes[i].numsectors=0; vert.numsectors=0;
} }
} }
@ -461,8 +461,8 @@ static void InitVertexData()
static void GetSideVertices(int sdnum, DVector2 *v1, DVector2 *v2) static void GetSideVertices(int sdnum, DVector2 *v1, DVector2 *v2)
{ {
line_t *ln = sides[sdnum].linedef; line_t *ln = level.sides[sdnum].linedef;
if (ln->sidedef[0] == &sides[sdnum]) if (ln->sidedef[0] == &level.sides[sdnum])
{ {
*v1 = ln->v1->fPos(); *v1 = ln->v1->fPos();
*v2 = ln->v2->fPos(); *v2 = ln->v2->fPos();
@ -489,54 +489,25 @@ static int segcmp(const void *a, const void *b)
static void PrepareSegs() static void PrepareSegs()
{ {
auto numsides = level.sides.Size();
int *segcount = new int[numsides]; int *segcount = new int[numsides];
int realsegs = 0; int realsegs = 0;
// Get floatng point coordinates of vertices // Get floatng point coordinates of vertices
for(int i = 0; i < numvertexes; i++) for(auto &v : level.vertexes)
{ {
vertexes[i].dirty = true; v.dirty = true;
} }
// count the segs // count the segs
memset(segcount, 0, numsides * sizeof(int)); memset(segcount, 0, numsides * sizeof(int));
// set up the extra data in case the map was loaded with regular nodes that might pass as GL nodes.
if (glsegextras == NULL)
{
for(int i=0;i<numsegs;i++)
{
segs[i].PartnerSeg = NULL;
}
for (int i=0; i<numsubsectors; i++)
{
int seg = int(subsectors[i].firstline-segs);
for(DWORD j=0;j<subsectors[i].numlines;j++)
{
segs[j+seg].Subsector = &subsectors[i];
}
}
}
else
{
for(int i=0;i<numsegs;i++)
{
seg_t *seg = &segs[i];
// Account for ZDoom space optimizations that cannot be done for GL
unsigned int partner= glsegextras[i].PartnerSeg;
if (partner < unsigned(numsegs)) seg->PartnerSeg = &segs[partner];
else seg->PartnerSeg = NULL;
seg->Subsector = glsegextras[i].Subsector;
}
}
for(int i=0;i<numsegs;i++) for(int i=0;i<numsegs;i++)
{ {
seg_t *seg = &segs[i]; seg_t *seg = &segs[i];
if (seg->sidedef == NULL) continue; // miniseg if (seg->sidedef == NULL) continue; // miniseg
int sidenum = int(seg->sidedef - sides); int sidenum = seg->sidedef->Index();
realsegs++; realsegs++;
segcount[sidenum]++; segcount[sidenum]++;
@ -550,13 +521,13 @@ static void PrepareSegs()
} }
// allocate memory // allocate memory
sides[0].segs = new seg_t*[realsegs]; level.sides[0].segs = new seg_t*[realsegs];
sides[0].numsegs = 0; level.sides[0].numsegs = 0;
for(int i = 1; i < numsides; i++) for(int i = 1; i < numsides; i++)
{ {
sides[i].segs = sides[i-1].segs + segcount[i-1]; level.sides[i].segs = level.sides[i-1].segs + segcount[i-1];
sides[i].numsegs = 0; level.sides[i].numsegs = 0;
} }
delete [] segcount; delete [] segcount;
@ -570,7 +541,7 @@ static void PrepareSegs()
// sort the segs // sort the segs
for(int i = 0; i < numsides; i++) for(int i = 0; i < numsides; i++)
{ {
if (sides[i].numsegs > 1) qsort(sides[i].segs, sides[i].numsegs, sizeof(seg_t*), segcmp); if (level.sides[i].numsegs > 1) qsort(level.sides[i].segs, level.sides[i].numsegs, sizeof(seg_t*), segcmp);
} }
} }
@ -586,8 +557,8 @@ void gl_PreprocessLevel()
PrepareSegs(); PrepareSegs();
PrepareSectorData(); PrepareSectorData();
InitVertexData(); InitVertexData();
int *checkmap = new int[numvertexes]; int *checkmap = new int[level.vertexes.Size()];
memset(checkmap, -1, sizeof(int)*numvertexes); memset(checkmap, -1, sizeof(int)*level.vertexes.Size());
for(auto &sec : level.sectors) for(auto &sec : level.sectors)
{ {
int i = sec.sectornum; int i = sec.sectornum;
@ -598,21 +569,21 @@ void gl_PreprocessLevel()
{ {
if (l->sidedef[0]->Flags & WALLF_POLYOBJ) continue; // don't bother with polyobjects if (l->sidedef[0]->Flags & WALLF_POLYOBJ) continue; // don't bother with polyobjects
int vtnum1 = int(l->v1 - vertexes); int vtnum1 = l->v1->Index();
int vtnum2 = int(l->v2 - vertexes); int vtnum2 = l->v2->Index();
if (checkmap[vtnum1] < i) if (checkmap[vtnum1] < i)
{ {
checkmap[vtnum1] = i; checkmap[vtnum1] = i;
sec.e->vertices.Push(&vertexes[vtnum1]); sec.e->vertices.Push(&level.vertexes[vtnum1]);
vertexes[vtnum1].dirty = true; level.vertexes[vtnum1].dirty = true;
} }
if (checkmap[vtnum2] < i) if (checkmap[vtnum2] < i)
{ {
checkmap[vtnum2] = i; checkmap[vtnum2] = i;
sec.e->vertices.Push(&vertexes[vtnum2]); sec.e->vertices.Push(&level.vertexes[vtnum2]);
vertexes[vtnum2].dirty = true; level.vertexes[vtnum2].dirty = true;
} }
} }
} }
@ -652,27 +623,24 @@ void gl_CleanLevelData()
mo=next; mo=next;
} }
if (vertexes != NULL) for(auto &v : level.vertexes) if (v.numsectors > 0)
{ {
for(int i = 0; i < numvertexes; i++) if (vertexes[i].numsectors > 0) if (v.sectors != nullptr)
{ {
if (vertexes[i].sectors != NULL) delete [] v.sectors;
{ v.sectors = nullptr;
delete [] vertexes[i].sectors; }
vertexes[i].sectors = NULL; if (v.heightlist != nullptr)
} {
if (vertexes[i].heightlist != NULL) delete [] v.heightlist;
{ v.heightlist = nullptr;
delete [] vertexes[i].heightlist;
vertexes[i].heightlist = NULL;
}
} }
} }
if (sides && sides[0].segs) if (level.sides.Size() > 0 && level.sides[0].segs)
{ {
delete [] sides[0].segs; delete [] level.sides[0].segs;
sides[0].segs = NULL; level.sides[0].segs = NULL;
} }
if (level.sectors.Size() > 0 && level.sectors[0].subsectors) if (level.sectors.Size() > 0 && level.sectors[0].subsectors)
{ {
@ -712,7 +680,7 @@ CCMD(listmapsections)
{ {
if (subsectors[j].mapsection == i) if (subsectors[j].mapsection == i)
{ {
Printf("Mapsection %d, sector %d, line %d\n", i, subsectors[j].render_sector->sectornum, int(subsectors[j].firstline->linedef-lines)); Printf("Mapsection %d, sector %d, line %d\n", i, subsectors[j].render_sector->Index(), subsectors[j].firstline->linedef->Index());
break; break;
} }
} }

View file

@ -31,6 +31,7 @@
#include "r_state.h" #include "r_state.h"
#include "m_argv.h" #include "m_argv.h"
#include "c_cvars.h" #include "c_cvars.h"
#include "g_levellocals.h"
#include "gl/system/gl_interface.h" #include "gl/system/gl_interface.h"
#include "gl/renderer/gl_renderer.h" #include "gl/renderer/gl_renderer.h"
#include "gl/shaders/gl_shader.h" #include "gl/shaders/gl_shader.h"

View file

@ -71,6 +71,7 @@
#include "portal.h" #include "portal.h"
#include "doomstat.h" #include "doomstat.h"
#include "serializer.h" #include "serializer.h"
#include "g_levellocals.h"
#include "gl/renderer/gl_renderer.h" #include "gl/renderer/gl_renderer.h"

View file

@ -49,6 +49,7 @@
#include "zstring.h" #include "zstring.h"
#include "d_dehacked.h" #include "d_dehacked.h"
#include "v_text.h" #include "v_text.h"
#include "g_levellocals.h"
#include "gl/dynlights/gl_dynlight.h" #include "gl/dynlights/gl_dynlight.h"

View file

@ -37,6 +37,7 @@
#include "g_level.h" #include "g_level.h"
#include "r_state.h" #include "r_state.h"
#include "d_player.h" #include "d_player.h"
#include "g_levellocals.h"
//#include "resources/voxels.h" //#include "resources/voxels.h"
//#include "gl/gl_intern.h" //#include "gl/gl_intern.h"

View file

@ -38,6 +38,7 @@
#include "p_local.h" #include "p_local.h"
#include "g_level.h" #include "g_level.h"
#include "r_sky.h" #include "r_sky.h"
#include "g_levellocals.h"
// externally settable lighting properties // externally settable lighting properties
static float distfogtable[2][256]; // light to fog conversion table for black fog static float distfogtable[2][256]; // light to fog conversion table for black fog

View file

@ -87,7 +87,7 @@ static sector_t *currentsector;
static void AddLine (seg_t *seg, bool portalclip) static void AddLine (seg_t *seg, bool portalclip)
{ {
#ifdef _DEBUG #ifdef _DEBUG
if (seg->linedef - lines == 38) if (seg->linedef->Index() == 38)
{ {
int a = 0; int a = 0;
} }

View file

@ -32,6 +32,7 @@
#include "r_utility.h" #include "r_utility.h"
#include "r_state.h" #include "r_state.h"
#include "doomstat.h" #include "doomstat.h"
#include "g_levellocals.h"
#include "gl/system/gl_cvars.h" #include "gl/system/gl_cvars.h"
#include "gl/data/gl_data.h" #include "gl/data/gl_data.h"

View file

@ -35,6 +35,7 @@
#include "d_player.h" #include "d_player.h"
#include "portal.h" #include "portal.h"
#include "templates.h" #include "templates.h"
#include "g_levellocals.h"
#include "gl/system/gl_interface.h" #include "gl/system/gl_interface.h"
#include "gl/system/gl_cvars.h" #include "gl/system/gl_cvars.h"

View file

@ -30,7 +30,7 @@
#include "r_defs.h" #include "r_defs.h"
#include "r_sky.h" #include "r_sky.h"
#include "g_level.h" #include "g_level.h"
#include "g_levellocals.h"
#include "gl/renderer/gl_renderer.h" #include "gl/renderer/gl_renderer.h"
#include "gl/data/gl_data.h" #include "gl/data/gl_data.h"

View file

@ -43,6 +43,7 @@
#include "p_local.h" #include "p_local.h"
#include "gl/gl_functions.h" #include "gl/gl_functions.h"
#include "serializer.h" #include "serializer.h"
#include "g_levellocals.h"
#include "gl/dynlights/gl_lightbuffer.h" #include "gl/dynlights/gl_lightbuffer.h"
#include "gl/system/gl_interface.h" #include "gl/system/gl_interface.h"

View file

@ -28,6 +28,7 @@
#include "r_utility.h" #include "r_utility.h"
#include "doomdata.h" #include "doomdata.h"
#include "portal.h" #include "portal.h"
#include "g_levellocals.h"
#include "gl/gl_functions.h" #include "gl/gl_functions.h"
#include "gl/data/gl_data.h" #include "gl/data/gl_data.h"
@ -51,7 +52,7 @@ void GLSkyInfo::init(int sky1, PalEntry FadeColor)
memset(this, 0, sizeof(*this)); memset(this, 0, sizeof(*this));
if ((sky1 & PL_SKYFLAT) && (sky1 & (PL_SKYFLAT - 1))) if ((sky1 & PL_SKYFLAT) && (sky1 & (PL_SKYFLAT - 1)))
{ {
const line_t *l = &lines[(sky1&(PL_SKYFLAT - 1)) - 1]; const line_t *l = &level.lines[(sky1&(PL_SKYFLAT - 1)) - 1];
const side_t *s = l->sidedef[0]; const side_t *s = l->sidedef[0];
int pos; int pos;

View file

@ -36,6 +36,7 @@
#include "r_utility.h" #include "r_utility.h"
#include "a_pickups.h" #include "a_pickups.h"
#include "d_player.h" #include "d_player.h"
#include "g_levellocals.h"
#include "gl/system/gl_interface.h" #include "gl/system/gl_interface.h"
#include "gl/system/gl_framebuffer.h" #include "gl/system/gl_framebuffer.h"

View file

@ -33,6 +33,7 @@
#include "p_maputl.h" #include "p_maputl.h"
#include "doomdata.h" #include "doomdata.h"
#include "portal.h" #include "portal.h"
#include "g_levellocals.h"
#include "gl/system/gl_cvars.h" #include "gl/system/gl_cvars.h"
#include "gl/renderer/gl_lightdata.h" #include "gl/renderer/gl_lightdata.h"
@ -326,7 +327,7 @@ void GLWall::SplitWall(sector_t * frontsector, bool translucent)
//::SplitWall.Clock(); //::SplitWall.Clock();
#ifdef _DEBUG #ifdef _DEBUG
if (seg->linedef-lines==1) if (seg->linedef->Index() == 1)
{ {
int a = 0; int a = 0;
} }
@ -1414,7 +1415,7 @@ void GLWall::Process(seg_t *seg, sector_t * frontsector, sector_t * backsector)
sector_t * segback; sector_t * segback;
#ifdef _DEBUG #ifdef _DEBUG
if (seg->linedef - lines < 4) if (seg->linedef->Index() == 1)
{ {
int a = 0; int a = 0;
} }
@ -1547,7 +1548,7 @@ void GLWall::Process(seg_t *seg, sector_t * frontsector, sector_t * backsector)
zbottom[1] = zfloor[1]; zbottom[1] = zfloor[1];
PutPortal(PORTALTYPE_LINETOLINE); PutPortal(PORTALTYPE_LINETOLINE);
} }
else if (seg->linedef->portaltransferred > 0) else if (seg->linedef->GetTransferredPortal())
{ {
SkyLine(frontsector, seg->linedef); SkyLine(frontsector, seg->linedef);
} }

View file

@ -32,6 +32,7 @@
#include "doomstat.h" #include "doomstat.h"
#include "d_player.h" #include "d_player.h"
#include "g_level.h" #include "g_level.h"
#include "g_levellocals.h"
#include "gl/system/gl_interface.h" #include "gl/system/gl_interface.h"
#include "gl/system/gl_cvars.h" #include "gl/system/gl_cvars.h"

View file

@ -48,6 +48,7 @@
#include "c_dispatch.h" #include "c_dispatch.h"
#include "r_utility.h" #include "r_utility.h"
#include "v_video.h" #include "v_video.h"
#include "g_levellocals.h"
#include "gl/utility/gl_clock.h" #include "gl/utility/gl_clock.h"
#include "gl/utility/gl_convert.h" #include "gl/utility/gl_convert.h"

View file

@ -50,6 +50,7 @@
#include "gstrings.h" #include "gstrings.h"
#include "d_net.h" #include "d_net.h"
#include "c_dispatch.h" #include "c_dispatch.h"
#include "g_levellocals.h"
// MACROS ------------------------------------------------------------------ // MACROS ------------------------------------------------------------------

View file

@ -51,6 +51,7 @@
#include "p_conversation.h" #include "p_conversation.h"
#include "menu/menu.h" #include "menu/menu.h"
#include "d_net.h" #include "d_net.h"
#include "g_levellocals.h"
FIntermissionDescriptorList IntermissionDescriptors; FIntermissionDescriptorList IntermissionDescriptors;

View file

@ -49,6 +49,7 @@
#include "a_morph.h" #include "a_morph.h"
#include "a_armor.h" #include "a_armor.h"
#include "a_ammo.h" #include "a_ammo.h"
#include "g_levellocals.h"
// [RH] Actually handle the cheat. The cheat code in st_stuff.c now just // [RH] Actually handle the cheat. The cheat code in st_stuff.c now just
// writes some bytes to the network data stream, and the network code // writes some bytes to the network data stream, and the network code

View file

@ -37,6 +37,7 @@
#include "v_video.h" #include "v_video.h"
#include "g_level.h" #include "g_level.h"
#include "gi.h" #include "gi.h"
#include "g_levellocals.h"
#include "textures/textures.h" #include "textures/textures.h"
class DReadThisMenu : public DMenu class DReadThisMenu : public DMenu

View file

@ -209,10 +209,10 @@ public:
bool makeGLNodes); bool makeGLNodes);
~FNodeBuilder (); ~FNodeBuilder ();
void Extract (node_t *&nodes, int &nodeCount, void Extract(node_t *&nodes, int &nodeCount,
seg_t *&segs, glsegextra_t *&glsegextras, int &segCount, seg_t *&segs, int &segCount,
subsector_t *&ssecs, int &subCount, subsector_t *&ssecs, int &subCount,
vertex_t *&verts, int &vertCount); TStaticArray<vertex_t> &vertexes);
const int *GetOldVertexTable(); const int *GetOldVertexTable();
// These are used for building sub-BSP trees for polyobjects. // These are used for building sub-BSP trees for polyobjects.

View file

@ -53,14 +53,14 @@
#endif #endif
void FNodeBuilder::Extract (node_t *&outNodes, int &nodeCount, void FNodeBuilder::Extract (node_t *&outNodes, int &nodeCount,
seg_t *&outSegs, glsegextra_t *&outSegExtras, int &segCount, seg_t *&outSegs, int &segCount,
subsector_t *&outSubs, int &subCount, subsector_t *&outSubs, int &subCount,
vertex_t *&outVerts, int &vertCount) TStaticArray<vertex_t> &outVerts)
{ {
int i; int i;
vertCount = Vertices.Size (); int vertCount = Vertices.Size ();
outVerts = new vertex_t[vertCount]; outVerts.Alloc(vertCount);
for (i = 0; i < vertCount; ++i) for (i = 0; i < vertCount; ++i)
{ {
@ -109,14 +109,13 @@ void FNodeBuilder::Extract (node_t *&outNodes, int &nodeCount,
for (i = 0; i < subCount; ++i) for (i = 0; i < subCount; ++i)
{ {
DWORD numsegs = CloseSubsector (segs, i, outVerts); DWORD numsegs = CloseSubsector (segs, i, &outVerts[0]);
outSubs[i].numlines = numsegs; outSubs[i].numlines = numsegs;
outSubs[i].firstline = (seg_t *)(size_t)(segs.Size() - numsegs); outSubs[i].firstline = (seg_t *)(size_t)(segs.Size() - numsegs);
} }
segCount = segs.Size (); segCount = segs.Size ();
outSegs = new seg_t[segCount]; outSegs = new seg_t[segCount];
outSegExtras = new glsegextra_t[segCount];
for (i = 0; i < segCount; ++i) for (i = 0; i < segCount; ++i)
{ {
@ -124,11 +123,11 @@ void FNodeBuilder::Extract (node_t *&outNodes, int &nodeCount,
if (segs[i].Partner != DWORD_MAX) if (segs[i].Partner != DWORD_MAX)
{ {
outSegExtras[i].PartnerSeg = Segs[segs[i].Partner].storedseg; outSegs[i].PartnerSeg = &outSegs[Segs[segs[i].Partner].storedseg];
} }
else else
{ {
outSegExtras[i].PartnerSeg = DWORD_MAX; outSegs[i].PartnerSeg = nullptr;
} }
} }
} }
@ -137,7 +136,6 @@ void FNodeBuilder::Extract (node_t *&outNodes, int &nodeCount,
memcpy (outSubs, &Subsectors[0], subCount*sizeof(subsector_t)); memcpy (outSubs, &Subsectors[0], subCount*sizeof(subsector_t));
segCount = Segs.Size (); segCount = Segs.Size ();
outSegs = new seg_t[segCount]; outSegs = new seg_t[segCount];
outSegExtras = NULL;
for (i = 0; i < segCount; ++i) for (i = 0; i < segCount; ++i)
{ {
const FPrivSeg *org = &Segs[SegList[i].SegNum]; const FPrivSeg *org = &Segs[SegList[i].SegNum];
@ -145,12 +143,13 @@ void FNodeBuilder::Extract (node_t *&outNodes, int &nodeCount,
D(Printf(PRINT_LOG, "Seg %d: v1(%d) -> v2(%d)\n", i, org->v1, org->v2)); D(Printf(PRINT_LOG, "Seg %d: v1(%d) -> v2(%d)\n", i, org->v1, org->v2));
out->v1 = outVerts + org->v1; out->v1 = &outVerts[org->v1];
out->v2 = outVerts + org->v2; out->v2 = &outVerts[org->v2];
out->backsector = org->backsector; out->backsector = org->backsector;
out->frontsector = org->frontsector; out->frontsector = org->frontsector;
out->linedef = Level.Lines + org->linedef; out->linedef = Level.Lines + org->linedef;
out->sidedef = Level.Sides + org->sidedef; out->sidedef = Level.Sides + org->sidedef;
out->PartnerSeg = nullptr;
} }
} }
for (i = 0; i < subCount; ++i) for (i = 0; i < subCount; ++i)
@ -162,8 +161,8 @@ void FNodeBuilder::Extract (node_t *&outNodes, int &nodeCount,
for (i = 0; i < Level.NumLines; ++i) for (i = 0; i < Level.NumLines; ++i)
{ {
Level.Lines[i].v1 = outVerts + (size_t)Level.Lines[i].v1; Level.Lines[i].v1 = &outVerts[(size_t)Level.Lines[i].v1];
Level.Lines[i].v2 = outVerts + (size_t)Level.Lines[i].v2; Level.Lines[i].v2 = &outVerts[(size_t)Level.Lines[i].v2];
} }
} }

View file

@ -50,6 +50,7 @@
#include "i_system.h" #include "i_system.h"
#include "po_man.h" #include "po_man.h"
#include "r_state.h" #include "r_state.h"
#include "g_levellocals.h"
#include "math/cmath.h" #include "math/cmath.h"
static const int PO_LINE_START = 1; static const int PO_LINE_START = 1;
@ -186,7 +187,7 @@ int FNodeBuilder::CreateSeg (int linenum, int sidenum)
} }
seg.linedef = linenum; seg.linedef = linenum;
side_t *sd = Level.Lines[linenum].sidedef[sidenum]; side_t *sd = Level.Lines[linenum].sidedef[sidenum];
seg.sidedef = sd != NULL? int(sd - sides) : int(NO_SIDE); seg.sidedef = sd != NULL? sd->Index() : int(NO_SIDE);
seg.nextforvert = Vertices[seg.v1].segs; seg.nextforvert = Vertices[seg.v1].segs;
seg.nextforvert2 = Vertices[seg.v2].segs2; seg.nextforvert2 = Vertices[seg.v2].segs2;

View file

@ -47,6 +47,7 @@
#include "r_utility.h" #include "r_utility.h"
#include "p_spec.h" #include "p_spec.h"
#include "r_data/colormaps.h" #include "r_data/colormaps.h"
#include "g_levellocals.h"
EXTERN_CVAR(Int, vid_renderer) EXTERN_CVAR(Int, vid_renderer)
@ -850,16 +851,14 @@ void P_LineOpening_XFloors (FLineOpening &open, AActor * thing, const line_t *li
void P_Spawn3DFloors (void) void P_Spawn3DFloors (void)
{ {
static int flagvals[] = {512, 2+512, 512+1024}; static int flagvals[] = {512, 2+512, 512+1024};
int i;
line_t * line;
for (i=0,line=lines;i<numlines;i++,line++) for (auto &line : level.lines)
{ {
switch(line->special) switch(line.special)
{ {
case ExtraFloor_LightOnly: case ExtraFloor_LightOnly:
if (line->args[1] < 0 || line->args[1] > 2) line->args[1] = 0; if (line.args[1] < 0 || line.args[1] > 2) line.args[1] = 0;
P_Set3DFloor(line, 3, flagvals[line->args[1]], 0); P_Set3DFloor(&line, 3, flagvals[line.args[1]], 0);
break; break;
case Sector_Set3DFloor: case Sector_Set3DFloor:
@ -868,24 +867,24 @@ void P_Spawn3DFloors (void)
// In Doom format the translators can take full integers for the tag and the line ID always is the same as the tag. // In Doom format the translators can take full integers for the tag and the line ID always is the same as the tag.
if (level.maptype == MAPTYPE_HEXEN) if (level.maptype == MAPTYPE_HEXEN)
{ {
if (line->args[1]&8) if (line.args[1]&8)
{ {
tagManager.AddLineID(i, line->args[4]); tagManager.AddLineID(line.Index(), line.args[4]);
} }
else else
{ {
line->args[0]+=256*line->args[4]; line.args[0]+=256*line.args[4];
line->args[4]=0; line.args[4]=0;
} }
} }
P_Set3DFloor(line, line->args[1]&~8, line->args[2], line->args[3]); P_Set3DFloor(&line, line.args[1]&~8, line.args[2], line.args[3]);
break; break;
default: default:
continue; continue;
} }
line->special=0; line.special=0;
line->args[0] = line->args[1] = line->args[2] = line->args[3] = line->args[4] = 0; line.args[0] = line.args[1] = line.args[2] = line.args[3] = line.args[4] = 0;
} }
// kg3D - do it in software // kg3D - do it in software
for (auto &sec : level.sectors) for (auto &sec : level.sectors)

View file

@ -41,6 +41,7 @@
#include "p_terrain.h" #include "p_terrain.h"
#include "p_maputl.h" #include "p_maputl.h"
#include "p_spec.h" #include "p_spec.h"
#include "g_levellocals.h"
//============================================================================ //============================================================================
@ -121,10 +122,10 @@ void P_Attach3dMidtexLinesToSector(sector_t *sector, int lineid, int tag, bool c
extsector_t::midtex::plane &scrollplane = ceiling? sector->e->Midtex.Ceiling : sector->e->Midtex.Floor; extsector_t::midtex::plane &scrollplane = ceiling? sector->e->Midtex.Ceiling : sector->e->Midtex.Floor;
// Bit arrays that mark whether a line or sector is to be attached. // Bit arrays that mark whether a line or sector is to be attached.
BYTE *found_lines = new BYTE[(numlines+7)/8]; BYTE *found_lines = new BYTE[(level.lines.Size()+7)/8];
BYTE *found_sectors = new BYTE[(level.sectors.Size()+7)/8]; BYTE *found_sectors = new BYTE[(level.sectors.Size()+7)/8];
memset(found_lines, 0, sizeof (BYTE) * ((numlines+7)/8)); memset(found_lines, 0, sizeof (BYTE) * ((level.lines.Size()+7)/8));
memset(found_sectors, 0, sizeof (BYTE) * ((level.sectors.Size()+7)/8)); memset(found_sectors, 0, sizeof (BYTE) * ((level.sectors.Size()+7)/8));
// mark all lines and sectors that are already attached to this one // mark all lines and sectors that are already attached to this one
@ -132,13 +133,13 @@ void P_Attach3dMidtexLinesToSector(sector_t *sector, int lineid, int tag, bool c
// from the marker arrays. // from the marker arrays.
for (unsigned i=0; i < scrollplane.AttachedLines.Size(); i++) for (unsigned i=0; i < scrollplane.AttachedLines.Size(); i++)
{ {
int line = int(scrollplane.AttachedLines[i] - lines); int line = scrollplane.AttachedLines[i]->Index();
found_lines[line>>3] |= 1 << (line&7); found_lines[line>>3] |= 1 << (line&7);
} }
for (unsigned i=0; i < scrollplane.AttachedSectors.Size(); i++) for (unsigned i=0; i < scrollplane.AttachedSectors.Size(); i++)
{ {
int sec = scrollplane.AttachedSectors[i]->sectornum; int sec = scrollplane.AttachedSectors[i]->Index();
found_sectors[sec>>3] |= 1 << (sec&7); found_sectors[sec>>3] |= 1 << (sec&7);
} }
@ -151,7 +152,7 @@ void P_Attach3dMidtexLinesToSector(sector_t *sector, int lineid, int tag, bool c
int line; int line;
while ((line = itr.Next()) >= 0) while ((line = itr.Next()) >= 0)
{ {
line_t *ln = &lines[line]; line_t *ln = &level.lines[line];
if (ln->frontsector == NULL || ln->backsector == NULL || !(ln->flags & ML_3DMIDTEX)) if (ln->frontsector == NULL || ln->backsector == NULL || !(ln->flags & ML_3DMIDTEX))
{ {
@ -176,24 +177,25 @@ void P_Attach3dMidtexLinesToSector(sector_t *sector, int lineid, int tag, bool c
// Only consider two-sided lines with the 3DMIDTEX flag // Only consider two-sided lines with the 3DMIDTEX flag
continue; continue;
} }
int lineno = int(ln-lines); int lineno = ln->Index();
found_lines[lineno>>3] |= 1 << (lineno&7); found_lines[lineno >> 3] |= 1 << (lineno & 7);
} }
} }
} }
for(int i=0; i < numlines; i++) for(unsigned i=0; i < level.lines.Size(); i++)
{ {
if (found_lines[i>>3] & (1 << (i&7))) if (found_lines[i>>3] & (1 << (i&7)))
{ {
scrollplane.AttachedLines.Push(&lines[i]); auto &line = level.lines[i];
scrollplane.AttachedLines.Push(&line);
v = lines[i].frontsector->sectornum; v = line.frontsector->Index();
assert(v < (int)level.sectors.Size()); assert(v < (int)level.sectors.Size());
found_sectors[v>>3] |= 1 << (v&7); found_sectors[v>>3] |= 1 << (v&7);
v = lines[i].backsector->sectornum; v = line.backsector->Index();
assert(v < (int)level.sectors.Size()); assert(v < (int)level.sectors.Size());
found_sectors[v>>3] |= 1 << (v&7); found_sectors[v>>3] |= 1 << (v&7);
} }

View file

@ -86,6 +86,7 @@
#include "a_armor.h" #include "a_armor.h"
#include "a_ammo.h" #include "a_ammo.h"
#include "r_data/colormaps.h" #include "r_data/colormaps.h"
#include "g_levellocals.h"
extern FILE *Logfile; extern FILE *Logfile;
@ -3284,7 +3285,7 @@ void DLevelScript::SetLineTexture (int lineid, int side, int position, int name)
int linenum = -1; int linenum = -1;
const char *texname = FBehavior::StaticLookupString (name); const char *texname = FBehavior::StaticLookupString (name);
if (texname == NULL) if (texname == nullptr)
return; return;
side = !!side; side = !!side;
@ -3296,8 +3297,8 @@ void DLevelScript::SetLineTexture (int lineid, int side, int position, int name)
{ {
side_t *sidedef; side_t *sidedef;
sidedef = lines[linenum].sidedef[side]; sidedef = level.lines[linenum].sidedef[side];
if (sidedef == NULL) if (sidedef == nullptr)
continue; continue;
switch (position) switch (position)
@ -3332,16 +3333,14 @@ void DLevelScript::ReplaceTextures (int fromnamei, int tonamei, int flags)
picnum1 = TexMan.GetTexture (fromname, FTexture::TEX_Wall, FTextureManager::TEXMAN_Overridable); picnum1 = TexMan.GetTexture (fromname, FTexture::TEX_Wall, FTextureManager::TEXMAN_Overridable);
picnum2 = TexMan.GetTexture (toname, FTexture::TEX_Wall, FTextureManager::TEXMAN_Overridable); picnum2 = TexMan.GetTexture (toname, FTexture::TEX_Wall, FTextureManager::TEXMAN_Overridable);
for (int i = 0; i < numsides; ++i) for (auto &side : level.sides)
{ {
side_t *wal = &sides[i];
for(int j=0;j<3;j++) for(int j=0;j<3;j++)
{ {
static BYTE bits[]={NOT_TOP, NOT_MIDDLE, NOT_BOTTOM}; static BYTE bits[]={NOT_TOP, NOT_MIDDLE, NOT_BOTTOM};
if (!(flags & bits[j]) && wal->GetTexture(j) == picnum1) if (!(flags & bits[j]) && side.GetTexture(j) == picnum1)
{ {
wal->SetTexture(j, picnum2); side.SetTexture(j, picnum2);
} }
} }
} }
@ -4428,14 +4427,14 @@ int DLevelScript::SideFromID(int id, int side)
{ {
if (activationline == NULL) return -1; if (activationline == NULL) return -1;
if (activationline->sidedef[side] == NULL) return -1; if (activationline->sidedef[side] == NULL) return -1;
return activationline->sidedef[side]->Index; return activationline->sidedef[side]->UDMFIndex;
} }
else else
{ {
int line = P_FindFirstLineFromID(id); int line = P_FindFirstLineFromID(id);
if (line == -1) return -1; if (line == -1) return -1;
if (lines[line].sidedef[side] == NULL) return -1; if (level.lines[line].sidedef[side] == NULL) return -1;
return lines[line].sidedef[side]->Index; return level.lines[line].sidedef[side]->UDMFIndex;
} }
} }
@ -4444,7 +4443,7 @@ int DLevelScript::LineFromID(int id)
if (id == 0) if (id == 0)
{ {
if (activationline == NULL) return -1; if (activationline == NULL) return -1;
return int(activationline - lines); return activationline->Index();
} }
else else
{ {
@ -5695,7 +5694,7 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound)
FLineIdIterator itr(args[0]); FLineIdIterator itr(args[0]);
while ((line = itr.Next()) >= 0) while ((line = itr.Next()) >= 0)
{ {
lines[line].activation = args[1]; level.lines[line].activation = args[1];
} }
} }
break; break;
@ -5704,7 +5703,7 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound)
if (argCount > 0) if (argCount > 0)
{ {
int line = P_FindFirstLineFromID(args[0]); int line = P_FindFirstLineFromID(args[0]);
return line >= 0 ? lines[line].activation : 0; return line >= 0 ? level.lines[line].activation : 0;
} }
break; break;
@ -7742,7 +7741,7 @@ scriptwait:
if (activationline != NULL) if (activationline != NULL)
{ {
activationline->special = 0; activationline->special = 0;
DPrintf(DMSG_SPAMMY, "Cleared line special on line %d\n", (int)(activationline - lines)); DPrintf(DMSG_SPAMMY, "Cleared line special on line %d\n", activationline->Index());
} }
break; break;
@ -8307,32 +8306,33 @@ scriptwait:
case PCD_SETLINEBLOCKING: case PCD_SETLINEBLOCKING:
{ {
int line; int lineno;
FLineIdIterator itr(STACK(2)); FLineIdIterator itr(STACK(2));
while ((line = itr.Next()) >= 0) while ((lineno = itr.Next()) >= 0)
{ {
auto &line = level.lines[lineno];
switch (STACK(1)) switch (STACK(1))
{ {
case BLOCK_NOTHING: case BLOCK_NOTHING:
lines[line].flags &= ~(ML_BLOCKING|ML_BLOCKEVERYTHING|ML_RAILING|ML_BLOCK_PLAYERS); line.flags &= ~(ML_BLOCKING|ML_BLOCKEVERYTHING|ML_RAILING|ML_BLOCK_PLAYERS);
break; break;
case BLOCK_CREATURES: case BLOCK_CREATURES:
default: default:
lines[line].flags &= ~(ML_BLOCKEVERYTHING|ML_RAILING|ML_BLOCK_PLAYERS); line.flags &= ~(ML_BLOCKEVERYTHING|ML_RAILING|ML_BLOCK_PLAYERS);
lines[line].flags |= ML_BLOCKING; line.flags |= ML_BLOCKING;
break; break;
case BLOCK_EVERYTHING: case BLOCK_EVERYTHING:
lines[line].flags &= ~(ML_RAILING|ML_BLOCK_PLAYERS); line.flags &= ~(ML_RAILING|ML_BLOCK_PLAYERS);
lines[line].flags |= ML_BLOCKING|ML_BLOCKEVERYTHING; line.flags |= ML_BLOCKING|ML_BLOCKEVERYTHING;
break; break;
case BLOCK_RAILING: case BLOCK_RAILING:
lines[line].flags &= ~(ML_BLOCKEVERYTHING|ML_BLOCK_PLAYERS); line.flags &= ~(ML_BLOCKEVERYTHING|ML_BLOCK_PLAYERS);
lines[line].flags |= ML_RAILING|ML_BLOCKING; line.flags |= ML_RAILING|ML_BLOCKING;
break; break;
case BLOCK_PLAYERS: case BLOCK_PLAYERS:
lines[line].flags &= ~(ML_BLOCKEVERYTHING|ML_BLOCKING|ML_RAILING); line.flags &= ~(ML_BLOCKEVERYTHING|ML_BLOCKING|ML_RAILING);
lines[line].flags |= ML_BLOCK_PLAYERS; line.flags |= ML_BLOCK_PLAYERS;
break; break;
} }
} }
@ -8349,9 +8349,9 @@ scriptwait:
while ((line = itr.Next()) >= 0) while ((line = itr.Next()) >= 0)
{ {
if (STACK(1)) if (STACK(1))
lines[line].flags |= ML_BLOCKMONSTERS; level.lines[line].flags |= ML_BLOCKMONSTERS;
else else
lines[line].flags &= ~ML_BLOCKMONSTERS; level.lines[line].flags &= ~ML_BLOCKMONSTERS;
} }
sp -= 2; sp -= 2;
@ -8374,7 +8374,7 @@ scriptwait:
FLineIdIterator itr(STACK(7)); FLineIdIterator itr(STACK(7));
while ((linenum = itr.Next()) >= 0) while ((linenum = itr.Next()) >= 0)
{ {
line_t *line = &lines[linenum]; line_t *line = &level.lines[linenum];
line->special = specnum; line->special = specnum;
line->args[0] = arg0; line->args[0] = arg0;
line->args[1] = STACK(4); line->args[1] = STACK(4);

View file

@ -80,6 +80,7 @@
#include "math/cmath.h" #include "math/cmath.h"
#include "a_armor.h" #include "a_armor.h"
#include "a_health.h" #include "a_health.h"
#include "g_levellocals.h"
AActor *SingleActorFromTID(int tid, AActor *defactor); AActor *SingleActorFromTID(int tid, AActor *defactor);

View file

@ -19,6 +19,7 @@
#include "gi.h" #include "gi.h"
#include "p_spec.h" #include "p_spec.h"
#if 0
// MACROS ------------------------------------------------------------------ // MACROS ------------------------------------------------------------------
//#define SHADE2LIGHT(s) (160-2*(s)) //#define SHADE2LIGHT(s) (160-2*(s))
@ -487,7 +488,7 @@ static void LoadWalls (walltype *walls, int numwalls, sectortype *bsec)
// Setting numvertexes to the same as numwalls is overly conservative, // Setting numvertexes to the same as numwalls is overly conservative,
// but the extra vertices will be removed during the BSP building pass. // but the extra vertices will be removed during the BSP building pass.
numsides = numvertexes = numwalls; numsides = numvertexes = numwalls;
numlines = 0; int numlines = 0;
sides = new side_t[numsides]; sides = new side_t[numsides];
memset (sides, 0, numsides*sizeof(side_t)); memset (sides, 0, numsides*sizeof(side_t));
@ -562,8 +563,8 @@ static void LoadWalls (walltype *walls, int numwalls, sectortype *bsec)
} }
// Set line properties that Doom doesn't store per-sidedef // Set line properties that Doom doesn't store per-sidedef
lines = new line_t[numlines]; level.lines.Alloc(numlines);
memset (lines, 0, numlines*sizeof(line_t)); memset (&level.lines[0], 0, numlines*sizeof(line_t));
for (i = 0, j = -1; i < numwalls; ++i) for (i = 0, j = -1; i < numwalls; ++i)
{ {
@ -573,6 +574,7 @@ static void LoadWalls (walltype *walls, int numwalls, sectortype *bsec)
} }
j = int(intptr_t(sides[i].linedef)); j = int(intptr_t(sides[i].linedef));
auto &lines = level.lines;
lines[j].sidedef[0] = (side_t*)(intptr_t)i; lines[j].sidedef[0] = (side_t*)(intptr_t)i;
lines[j].sidedef[1] = (side_t*)(intptr_t)walls[i].nextwall; lines[j].sidedef[1] = (side_t*)(intptr_t)walls[i].nextwall;
lines[j].v1 = FindVertex (walls[i].x, walls[i].y); lines[j].v1 = FindVertex (walls[i].x, walls[i].y);
@ -654,8 +656,8 @@ static void LoadWalls (walltype *walls, int numwalls, sectortype *bsec)
slope.z[0] = slope.z[1] = slope.z[2] = -bsec->ceilingZ; slope.z[0] = slope.z[1] = slope.z[2] = -bsec->ceilingZ;
CalcPlane (slope, sec.ceilingplane); CalcPlane (slope, sec.ceilingplane);
} }
int linenum = int(intptr_t(sides[bsec->wallptr].linedef)); int linenum = sides[bsec->wallptr].linedef->Index();
int sidenum = int(intptr_t(lines[linenum].sidedef[1])); int sidenum = int(intptr_t(level.lines[linenum].sidedef[1] - sides));
if (bsec->floorstat & 64) if (bsec->floorstat & 64)
{ // floor is aligned to first wall { // floor is aligned to first wall
P_AlignFlat (linenum, sidenum == bsec->wallptr, 0); P_AlignFlat (linenum, sidenum == bsec->wallptr, 0);
@ -667,8 +669,8 @@ static void LoadWalls (walltype *walls, int numwalls, sectortype *bsec)
} }
for (i = 0; i < numlines; i++) for (i = 0; i < numlines; i++)
{ {
intptr_t front = intptr_t(lines[i].sidedef[0]); intptr_t front = intptr_t(level.lines[i].sidedef[0]-sides);
intptr_t back = intptr_t(lines[i].sidedef[1]); intptr_t back = intptr_t(level.lines[i].sidedef[1]-sides);
lines[i].sidedef[0] = front >= 0 ? &sides[front] : NULL; lines[i].sidedef[0] = front >= 0 ? &sides[front] : NULL;
lines[i].sidedef[1] = back >= 0 ? &sides[back] : NULL; lines[i].sidedef[1] = back >= 0 ? &sides[back] : NULL;
} }
@ -851,6 +853,7 @@ static void Decrypt (void *to_, const void *from_, int len, int key)
} }
} }
#endif
//========================================================================== //==========================================================================
// //
// Just an actor to make the Build sprites show up. It doesn't do anything // Just an actor to make the Build sprites show up. It doesn't do anything
@ -892,3 +895,4 @@ void ACustomSprite::BeginPlay ()
// set face/wall/floor flags // set face/wall/floor flags
renderflags |= ActorRenderFlags::FromInt (((cstat >> 4) & 3) << 12); renderflags |= ActorRenderFlags::FromInt (((cstat >> 4) & 3) << 12);
} }

View file

@ -31,6 +31,7 @@
#include "gi.h" #include "gi.h"
#include "serializer.h" #include "serializer.h"
#include "p_spec.h" #include "p_spec.h"
#include "g_levellocals.h"
//============================================================================ //============================================================================
// //

View file

@ -60,6 +60,7 @@
#include "r_utility.h" #include "r_utility.h"
#include "p_local.h" #include "p_local.h"
#include "menu/menu.h" #include "menu/menu.h"
#include "g_levellocals.h"
// The conversations as they exist inside a SCRIPTxx lump. // The conversations as they exist inside a SCRIPTxx lump.
struct Response struct Response

View file

@ -38,6 +38,7 @@
#include "serializer.h" #include "serializer.h"
#include "d_player.h" #include "d_player.h"
#include "p_spec.h" #include "p_spec.h"
#include "g_levellocals.h"
//============================================================================ //============================================================================
// //

View file

@ -53,6 +53,7 @@
#include "colormatcher.h" #include "colormatcher.h"
#include "d_player.h" #include "d_player.h"
#include "r_utility.h" #include "r_utility.h"
#include "g_levellocals.h"
CVAR (Int, cl_rockettrails, 1, CVAR_ARCHIVE); CVAR (Int, cl_rockettrails, 1, CVAR_ARCHIVE);
CVAR (Bool, r_rail_smartspiral, 0, CVAR_ARCHIVE); CVAR (Bool, r_rail_smartspiral, 0, CVAR_ARCHIVE);
@ -272,7 +273,7 @@ void P_ThinkParticles ()
auto oldtrans = particle->alpha; auto oldtrans = particle->alpha;
particle->alpha -= particle->fadestep; particle->alpha -= particle->fadestep;
particle->size += particle->sizestep; particle->size += particle->sizestep;
if (oldtrans < particle->alpha || --particle->ttl <= 0 || (particle->size <= 0)) if (particle->alpha <= 0 || oldtrans < particle->alpha || --particle->ttl <= 0 || (particle->size <= 0))
{ // The particle has expired, so free it { // The particle has expired, so free it
memset (particle, 0, sizeof(particle_t)); memset (particle, 0, sizeof(particle_t));
if (prev) if (prev)

View file

@ -52,6 +52,7 @@
#include "p_checkposition.h" #include "p_checkposition.h"
#include "math/cmath.h" #include "math/cmath.h"
#include "a_ammo.h" #include "a_ammo.h"
#include "g_levellocals.h"
#include "gi.h" #include "gi.h"

View file

@ -32,6 +32,7 @@
#include "p_3dmidtex.h" #include "p_3dmidtex.h"
#include "p_spec.h" #include "p_spec.h"
#include "r_data/r_interpolate.h" #include "r_data/r_interpolate.h"
#include "g_levellocals.h"
//========================================================================== //==========================================================================
// //

View file

@ -67,6 +67,7 @@
#include "m_misc.h" #include "m_misc.h"
#include "r_utility.h" #include "r_utility.h"
#include "cmdlib.h" #include "cmdlib.h"
#include "g_levellocals.h"
void P_GetPolySpots (MapData * lump, TArray<FNodeBuilder::FPolyStart> &spots, TArray<FNodeBuilder::FPolyStart> &anchors); void P_GetPolySpots (MapData * lump, TArray<FNodeBuilder::FPolyStart> &spots, TArray<FNodeBuilder::FPolyStart> &anchors);
@ -129,6 +130,7 @@ struct gl5_mapnode_t
static int CheckForMissingSegs() static int CheckForMissingSegs()
{ {
auto numsides = level.sides.Size();
double *added_seglen = new double[numsides]; double *added_seglen = new double[numsides];
int missing = 0; int missing = 0;
@ -141,13 +143,13 @@ static int CheckForMissingSegs()
{ {
// check all the segs and calculate the length they occupy on their sidedef // check all the segs and calculate the length they occupy on their sidedef
DVector2 vec1(seg->v2->fX() - seg->v1->fX(), seg->v2->fY() - seg->v1->fY()); DVector2 vec1(seg->v2->fX() - seg->v1->fX(), seg->v2->fY() - seg->v1->fY());
added_seglen[seg->sidedef - sides] += vec1.Length(); added_seglen[seg->sidedef->Index()] += vec1.Length();
} }
} }
for(int i=0;i<numsides;i++) for(unsigned i=0;i<numsides;i++)
{ {
double linelen = sides[i].linedef->Delta().Length(); double linelen = level.sides[i].linedef->Delta().Length();
missing += (added_seglen[i] < linelen - 1.); missing += (added_seglen[i] < linelen - 1.);
} }
@ -222,7 +224,7 @@ static bool LoadGLVertexes(FileReader * lump)
BYTE *gldata; BYTE *gldata;
int i; int i;
firstglvertex = numvertexes; firstglvertex = level.vertexes.Size();
int gllen=lump->GetLength(); int gllen=lump->GetLength();
@ -247,23 +249,23 @@ static bool LoadGLVertexes(FileReader * lump)
} }
else format5=false; else format5=false;
mapglvertex_t* mgl; mapglvertex_t* mgl = (mapglvertex_t *)(gldata + GL_VERT_OFFSET);
unsigned numvertexes = firstglvertex + (gllen - GL_VERT_OFFSET)/sizeof(mapglvertex_t);
vertex_t * oldvertexes = vertexes; TStaticArray<vertex_t> oldvertexes = std::move(level.vertexes);
numvertexes += (gllen - GL_VERT_OFFSET)/sizeof(mapglvertex_t); level.vertexes.Alloc(numvertexes);
vertexes = new vertex_t[numvertexes];
mgl = (mapglvertex_t *) (gldata + GL_VERT_OFFSET);
memcpy(vertexes, oldvertexes, firstglvertex * sizeof(vertex_t)); memcpy(&level.vertexes[0], &oldvertexes[0], firstglvertex * sizeof(vertex_t));
for(i=0;i<numlines;i++) for(auto &line : level.lines)
{ {
lines[i].v1 = vertexes + (lines[i].v1 - oldvertexes); // Remap vertex pointers in linedefs
lines[i].v2 = vertexes + (lines[i].v2 - oldvertexes); line.v1 = &level.vertexes[line.v1 - &oldvertexes[0]];
line.v2 = &level.vertexes[line.v2 - &oldvertexes[0]];
} }
for (i = firstglvertex; i < numvertexes; i++) for (i = firstglvertex; i < (int)numvertexes; i++)
{ {
vertexes[i].set(LittleLong(mgl->x)/65536., LittleLong(mgl->y)/65536.); level.vertexes[i].set(LittleLong(mgl->x)/65536., LittleLong(mgl->y)/65536.);
mgl++; mgl++;
} }
delete[] gldata; delete[] gldata;
@ -317,18 +319,16 @@ static bool LoadGLSegs(FileReader * lump)
numsegs/=sizeof(glseg_t); numsegs/=sizeof(glseg_t);
segs = new seg_t[numsegs]; segs = new seg_t[numsegs];
memset(segs,0,sizeof(seg_t)*numsegs); memset(segs,0,sizeof(seg_t)*numsegs);
glsegextras = new glsegextra_t[numsegs];
glseg_t * ml = (glseg_t*)data; glseg_t * ml = (glseg_t*)data;
for(i = 0; i < numsegs; i++) for(i = 0; i < numsegs; i++)
{ // check for gl-vertices { // check for gl-vertices
segs[i].v1 = &vertexes[checkGLVertex(LittleShort(ml->v1))]; segs[i].v1 = &level.vertexes[checkGLVertex(LittleShort(ml->v1))];
segs[i].v2 = &vertexes[checkGLVertex(LittleShort(ml->v2))]; segs[i].v2 = &level.vertexes[checkGLVertex(LittleShort(ml->v2))];
segs[i].PartnerSeg = ml->partner == 0xFFFF ? nullptr : &segs[LittleShort(ml->partner)];
glsegextras[i].PartnerSeg = ml->partner == 0xFFFF ? DWORD_MAX : LittleShort(ml->partner);
if(ml->linedef != 0xffff) if(ml->linedef != 0xffff)
{ {
ldef = &lines[LittleShort(ml->linedef)]; ldef = &level.lines[LittleShort(ml->linedef)];
segs[i].linedef = ldef; segs[i].linedef = ldef;
@ -370,19 +370,17 @@ static bool LoadGLSegs(FileReader * lump)
numsegs/=sizeof(glseg3_t); numsegs/=sizeof(glseg3_t);
segs = new seg_t[numsegs]; segs = new seg_t[numsegs];
memset(segs,0,sizeof(seg_t)*numsegs); memset(segs,0,sizeof(seg_t)*numsegs);
glsegextras = new glsegextra_t[numsegs];
glseg3_t * ml = (glseg3_t*)(data+ (format5? 0:4)); glseg3_t * ml = (glseg3_t*)(data+ (format5? 0:4));
for(i = 0; i < numsegs; i++) for(i = 0; i < numsegs; i++)
{ // check for gl-vertices { // check for gl-vertices
segs[i].v1 = &vertexes[checkGLVertex3(LittleLong(ml->v1))]; segs[i].v1 = &level.vertexes[checkGLVertex3(LittleLong(ml->v1))];
segs[i].v2 = &vertexes[checkGLVertex3(LittleLong(ml->v2))]; segs[i].v2 = &level.vertexes[checkGLVertex3(LittleLong(ml->v2))];
segs[i].PartnerSeg = LittleLong(ml->partner) == 0xffffffffu? nullptr : &segs[LittleLong(ml->partner)];
glsegextras[i].PartnerSeg = LittleLong(ml->partner);
if(ml->linedef != 0xffff) // skip minisegs if(ml->linedef != 0xffff) // skip minisegs
{ {
ldef = &lines[LittleLong(ml->linedef)]; ldef = &level.lines[LittleLong(ml->linedef)];
segs[i].linedef = ldef; segs[i].linedef = ldef;
@ -1000,18 +998,18 @@ bool P_CheckNodes(MapData * map, bool rebuilt, int buildtime)
P_GetPolySpots (map, polyspots, anchors); P_GetPolySpots (map, polyspots, anchors);
FNodeBuilder::FLevel leveldata = FNodeBuilder::FLevel leveldata =
{ {
vertexes, numvertexes, &level.vertexes[0], (int)level.vertexes.Size(),
sides, numsides, &level.sides[0], (int)level.sides.Size(),
lines, numlines, &level.lines[0], (int)level.lines.Size(),
0, 0, 0, 0 0, 0, 0, 0
}; };
leveldata.FindMapBounds (); leveldata.FindMapBounds ();
FNodeBuilder builder (leveldata, polyspots, anchors, true); FNodeBuilder builder (leveldata, polyspots, anchors, true);
delete[] vertexes;
builder.Extract (nodes, numnodes, builder.Extract (nodes, numnodes,
segs, glsegextras, numsegs, segs, numsegs,
subsectors, numsubsectors, subsectors, numsubsectors,
vertexes, numvertexes); level.vertexes);
endTime = I_FPSTime (); endTime = I_FPSTime ();
DPrintf (DMSG_NOTIFY, "BSP generation took %.3f sec (%d segs)\n", (endTime - startTime) * 0.001, numsegs); DPrintf (DMSG_NOTIFY, "BSP generation took %.3f sec (%d segs)\n", (endTime - startTime) * 0.001, numsegs);
buildtime = endTime - startTime; buildtime = endTime - startTime;
@ -1093,11 +1091,11 @@ static void CreateCachedNodes(MapData *map)
MemFile ZNodes; MemFile ZNodes;
WriteLong(ZNodes, 0); WriteLong(ZNodes, 0);
WriteLong(ZNodes, numvertexes); WriteLong(ZNodes, level.vertexes.Size());
for(int i=0;i<numvertexes;i++) for(auto &vert : level.vertexes)
{ {
WriteLong(ZNodes, vertexes[i].fixX()); WriteLong(ZNodes, vert.fixX());
WriteLong(ZNodes, vertexes[i].fixY()); WriteLong(ZNodes, vert.fixY());
} }
WriteLong(ZNodes, numsubsectors); WriteLong(ZNodes, numsubsectors);
@ -1109,12 +1107,11 @@ static void CreateCachedNodes(MapData *map)
WriteLong(ZNodes, numsegs); WriteLong(ZNodes, numsegs);
for(int i=0;i<numsegs;i++) for(int i=0;i<numsegs;i++)
{ {
WriteLong(ZNodes, DWORD(segs[i].v1 - vertexes)); WriteLong(ZNodes, segs[i].v1->Index());
if (glsegextras != NULL) WriteLong(ZNodes, DWORD(glsegextras[i].PartnerSeg)); WriteLong(ZNodes, segs[i].PartnerSeg == nullptr? 0xffffffffu : DWORD(segs[i].PartnerSeg - segs));
else WriteLong(ZNodes, 0);
if (segs[i].linedef) if (segs[i].linedef)
{ {
WriteLong(ZNodes, DWORD(segs[i].linedef - lines)); WriteLong(ZNodes, DWORD(segs[i].linedef->Index()));
WriteByte(ZNodes, segs[i].sidedef == segs[i].linedef->sidedef[0]? 0:1); WriteByte(ZNodes, segs[i].sidedef == segs[i].linedef->sidedef[0]? 0:1);
} }
else else
@ -1156,7 +1153,7 @@ static void CreateCachedNodes(MapData *map)
uLongf outlen = ZNodes.Size(); uLongf outlen = ZNodes.Size();
BYTE *compressed; BYTE *compressed;
int offset = numlines * 8 + 12 + 16; int offset = level.lines.Size() * 8 + 12 + 16;
int r; int r;
do do
{ {
@ -1171,13 +1168,13 @@ static void CreateCachedNodes(MapData *map)
while (r == Z_BUF_ERROR); while (r == Z_BUF_ERROR);
memcpy(compressed, "CACH", 4); memcpy(compressed, "CACH", 4);
DWORD len = LittleLong(numlines); DWORD len = LittleLong(level.lines.Size());
memcpy(compressed+4, &len, 4); memcpy(compressed+4, &len, 4);
map->GetChecksum(compressed+8); map->GetChecksum(compressed+8);
for(int i=0;i<numlines;i++) for (unsigned i = 0; i < level.lines.Size(); i++)
{ {
DWORD ndx[2] = {LittleLong(DWORD(lines[i].v1 - vertexes)), LittleLong(DWORD(lines[i].v2 - vertexes)) }; DWORD ndx[2] = { LittleLong(DWORD(level.lines[i].v1->Index())), LittleLong(DWORD(level.lines[i].v2->Index())) };
memcpy(compressed+8+16+8*i, ndx, 8); memcpy(compressed + 8 + 16 + 8 * i, ndx, 8);
} }
memcpy(compressed + offset - 4, "ZGL3", 4); memcpy(compressed + offset - 4, "ZGL3", 4);
@ -1219,7 +1216,7 @@ static bool CheckCachedNodes(MapData *map)
if (fread(&numlin, 4, 1, f) != 1) goto errorout; if (fread(&numlin, 4, 1, f) != 1) goto errorout;
numlin = LittleLong(numlin); numlin = LittleLong(numlin);
if ((int)numlin != numlines) goto errorout; if (numlin != level.lines.Size()) goto errorout;
if (fread(md5, 1, 16, f) != 16) goto errorout; if (fread(md5, 1, 16, f) != 16) goto errorout;
map->GetChecksum(md5map); map->GetChecksum(md5map);
@ -1261,10 +1258,11 @@ static bool CheckCachedNodes(MapData *map)
goto errorout; goto errorout;
} }
for(int i=0;i<numlines;i++) for(auto &line : level.lines)
{ {
lines[i].v1 = &vertexes[LittleLong(verts[i*2])]; int i = line.Index();
lines[i].v2 = &vertexes[LittleLong(verts[i*2+1])]; line.v1 = &level.vertexes[LittleLong(verts[i*2])];
line.v2 = &level.vertexes[LittleLong(verts[i*2+1])];
} }
delete [] verts; delete [] verts;
@ -1437,40 +1435,32 @@ void P_SetRenderSector()
#endif #endif
// Check for incorrect partner seg info so that the following code does not crash. // Check for incorrect partner seg info so that the following code does not crash.
if (glsegextras == NULL)
for (i = 0; i < numsegs; i++)
{ {
// This can be normal nodes, mistakenly identified as GL nodes so we must fill auto p = segs[i].PartnerSeg;
// in the missing pieces differently. if (p != nullptr)
for (i = 0; i < numsubsectors; i++)
{ {
ss = &subsectors[i]; int partner = (int)(p - segs);
ss->render_sector = ss->sector;
}
return;
}
for(i=0;i<numsegs;i++) if (partner < 0 || partner >= numsegs)
{ {
int partner = (int)glsegextras[i].PartnerSeg; segs[i].PartnerSeg = nullptr;
}
if (partner<0 || partner>=numsegs/*eh? || &segs[partner]!=glsegextras[i].PartnerSeg*/) // glbsp creates such incorrect references for Strife.
{ if (segs[i].linedef && segs[i].PartnerSeg != nullptr && !segs[i].PartnerSeg->linedef)
glsegextras[i].PartnerSeg=DWORD_MAX; {
segs[i].PartnerSeg = segs[i].PartnerSeg->PartnerSeg = nullptr;
}
} }
// glbsp creates such incorrect references for Strife. for (i = 0; i < numsegs; i++)
if (segs[i].linedef && glsegextras[i].PartnerSeg != DWORD_MAX && !segs[glsegextras[i].PartnerSeg].linedef)
{ {
glsegextras[i].PartnerSeg = glsegextras[glsegextras[i].PartnerSeg].PartnerSeg = DWORD_MAX; if (segs[i].PartnerSeg != nullptr && segs[i].PartnerSeg->PartnerSeg != &segs[i])
} {
} segs[i].PartnerSeg = nullptr;
}
for(i=0;i<numsegs;i++)
{
if (glsegextras[i].PartnerSeg != DWORD_MAX && glsegextras[glsegextras[i].PartnerSeg].PartnerSeg!=(DWORD)i)
{
glsegextras[i].PartnerSeg=DWORD_MAX;
} }
} }
@ -1498,7 +1488,7 @@ void P_SetRenderSector()
seg = ss->firstline; seg = ss->firstline;
for(j=0; j<ss->numlines; j++) for(j=0; j<ss->numlines; j++)
{ {
if(seg->sidedef && (glsegextras[seg - segs].PartnerSeg == DWORD_MAX || seg->sidedef->sector!=segs[glsegextras[seg - segs].PartnerSeg].sidedef->sector)) if(seg->sidedef && (seg->PartnerSeg == nullptr || seg->sidedef->sector!=seg->PartnerSeg->sidedef->sector))
{ {
ss->render_sector = seg->sidedef->sector; ss->render_sector = seg->sidedef->sector;
break; break;
@ -1522,15 +1512,14 @@ void P_SetRenderSector()
for(j=0; j<ss->numlines; j++) for(j=0; j<ss->numlines; j++)
{ {
DWORD partner = glsegextras[seg - segs].PartnerSeg; if (seg->PartnerSeg != nullptr && seg->PartnerSeg->Subsector)
if (partner != DWORD_MAX && glsegextras[partner].Subsector)
{ {
sector_t * backsec = glsegextras[partner].Subsector->render_sector; sector_t * backsec = seg->PartnerSeg->Subsector->render_sector;
if (backsec) if (backsec)
{ {
ss->render_sector=backsec; ss->render_sector = backsec;
undetermined.Delete(i); undetermined.Delete(i);
deleted=1; deleted = 1;
break; break;
} }
} }

View file

@ -60,6 +60,7 @@
#include "a_morph.h" #include "a_morph.h"
#include "virtual.h" #include "virtual.h"
#include "a_health.h" #include "a_health.h"
#include "g_levellocals.h"
static FRandom pr_obituary ("Obituary"); static FRandom pr_obituary ("Obituary");
static FRandom pr_botrespawn ("BotRespawn"); static FRandom pr_botrespawn ("BotRespawn");

View file

@ -32,6 +32,7 @@
#include "p_lnspec.h" #include "p_lnspec.h"
#include "doomstat.h" #include "doomstat.h"
#include "p_maputl.h" #include "p_maputl.h"
#include "g_levellocals.h"
// State. // State.
#include "r_state.h" #include "r_state.h"

View file

@ -37,6 +37,7 @@
#include "p_local.h" #include "p_local.h"
#include "p_lnspec.h" #include "p_lnspec.h"
#include "p_spec.h" #include "p_spec.h"
#include "g_levellocals.h"
enum enum
{ {
@ -360,7 +361,7 @@ void P_AddSectorLinksByID(sector_t *control, int id, INTBOOL ceiling)
int line; int line;
while ((line = itr.Next()) >= 0) while ((line = itr.Next()) >= 0)
{ {
line_t *ld = &lines[line]; line_t *ld = &level.lines[line];
if (ld->special == Static_Init && ld->args[1] == Init_SectorLink) if (ld->special == Static_Init && ld->args[1] == Init_SectorLink)
{ {

View file

@ -61,6 +61,7 @@
#include "r_data/colormaps.h" #include "r_data/colormaps.h"
#include "fragglescript/t_fs.h" #include "fragglescript/t_fs.h"
#include "p_spec.h" #include "p_spec.h"
#include "g_levellocals.h"
// Remaps EE sector change types to Generic_Floor values. According to the Eternity Wiki: // Remaps EE sector change types to Generic_Floor values. According to the Eternity Wiki:
/* /*
@ -2604,7 +2605,7 @@ FUNC(LS_Line_SetTextureOffset)
int line; int line;
while ((line = itr.Next()) >= 0) while ((line = itr.Next()) >= 0)
{ {
side_t *side = lines[line].sidedef[arg3]; side_t *side = level.lines[line].sidedef[arg3];
if (side != NULL) if (side != NULL)
{ {
@ -2659,7 +2660,7 @@ FUNC(LS_Line_SetTextureScale)
int line; int line;
while ((line = itr.Next()) >= 0) while ((line = itr.Next()) >= 0)
{ {
side_t *side = lines[line].sidedef[arg3]; side_t *side = level.lines[line].sidedef[arg3];
if (side != NULL) if (side != NULL)
{ {
if ((arg4&8)==0) if ((arg4&8)==0)
@ -2733,7 +2734,7 @@ FUNC(LS_Line_SetBlocking)
int line; int line;
while ((line = itr.Next()) >= 0) while ((line = itr.Next()) >= 0)
{ {
lines[line].flags = (lines[line].flags & ~clearflags) | setflags; level.lines[line].flags = (level.lines[line].flags & ~clearflags) | setflags;
} }
return true; return true;
} }
@ -3028,14 +3029,14 @@ FUNC(LS_TranslucentLine)
int linenum; int linenum;
while ((linenum = itr.Next()) >= 0) while ((linenum = itr.Next()) >= 0)
{ {
lines[linenum].alpha = clamp(arg1, 0, 255) / 255.; level.lines[linenum].alpha = clamp(arg1, 0, 255) / 255.;
if (arg2 == 0) if (arg2 == 0)
{ {
lines[linenum].flags &= ~ML_ADDTRANS; level.lines[linenum].flags &= ~ML_ADDTRANS;
} }
else if (arg2 == 1) else if (arg2 == 1)
{ {
lines[linenum].flags |= ML_ADDTRANS; level.lines[linenum].flags |= ML_ADDTRANS;
} }
else else
{ {

View file

@ -63,6 +63,7 @@
#include "r_data/r_translate.h" #include "r_data/r_translate.h"
#include "g_level.h" #include "g_level.h"
#include "r_sky.h" #include "r_sky.h"
#include "g_levellocals.h"
CVAR(Bool, cl_bloodsplats, true, CVAR_ARCHIVE) CVAR(Bool, cl_bloodsplats, true, CVAR_ARCHIVE)
CVAR(Int, sv_smartaim, 0, CVAR_ARCHIVE | CVAR_SERVERINFO) CVAR(Int, sv_smartaim, 0, CVAR_ARCHIVE | CVAR_SERVERINFO)
@ -183,7 +184,7 @@ static bool PIT_FindFloorCeiling(FMultiBlockLinesIterator &mit, FMultiBlockLines
if (ffcf_verbose) if (ffcf_verbose)
{ {
Printf("Hit line %d at position %f,%f, group %d\n", Printf("Hit line %d at position %f,%f, group %d\n",
int(ld - lines), cres.Position.X, cres.Position.Y, ld->frontsector->PortalGroup); ld->Index(), cres.Position.X, cres.Position.Y, ld->frontsector->PortalGroup);
} }
if (!ld->backsector) if (!ld->backsector)
@ -3296,7 +3297,6 @@ bool FSlide::BounceTraverse(const DVector2 &start, const DVector2 &end)
} }
li = in->d.line; li = in->d.line;
assert(((size_t)li - (size_t)lines) % sizeof(line_t) == 0);
if (li->flags & ML_BLOCKEVERYTHING) if (li->flags & ML_BLOCKEVERYTHING)
{ {
goto bounceblocking; goto bounceblocking;
@ -3907,7 +3907,7 @@ struct aim_t
int frontflag = P_PointOnLineSidePrecise(startpos, li); int frontflag = P_PointOnLineSidePrecise(startpos, li);
if (aimdebug) if (aimdebug)
Printf("Found line %d: ___toppitch = %f, ___bottompitch = %f\n", int(li - lines), toppitch.Degrees, bottompitch.Degrees); Printf("Found line %d: toppitch = %f, bottompitch = %f\n", li->Index(), toppitch.Degrees, bottompitch.Degrees);
if (li->isLinePortal() && frontflag == 0) if (li->isLinePortal() && frontflag == 0)
{ {
@ -3951,7 +3951,7 @@ struct aim_t
return; return;
if (aimdebug) if (aimdebug)
Printf("After line %d: toppitch = %f, bottompitch = %f, planestocheck = %d\n", int(li - lines), toppitch.Degrees, bottompitch.Degrees, planestocheck); Printf("After line %d: toppitch = %f, bottompitch = %f, planestocheck = %d\n", li->Index(), toppitch.Degrees, bottompitch.Degrees, planestocheck);
sector_t *entersec = frontflag ? li->frontsector : li->backsector; sector_t *entersec = frontflag ? li->frontsector : li->backsector;
sector_t *exitsec = frontflag ? li->backsector : li->frontsector; sector_t *exitsec = frontflag ? li->backsector : li->frontsector;

View file

@ -44,6 +44,7 @@
#include "r_state.h" #include "r_state.h"
#include "templates.h" #include "templates.h"
#include "po_man.h" #include "po_man.h"
#include "g_levellocals.h"
sector_t *P_PointInSectorBuggy(double x, double y); sector_t *P_PointInSectorBuggy(double x, double y);
int P_VanillaPointOnDivlineSide(double x, double y, const divline_t* line); int P_VanillaPointOnDivlineSide(double x, double y, const divline_t* line);
@ -330,7 +331,7 @@ bool AActor::FixMapthingPos()
for (list = blockmaplump + blockmap[blocky*bmapwidth + blockx] + 1; *list != -1; ++list) for (list = blockmaplump + blockmap[blocky*bmapwidth + blockx] + 1; *list != -1; ++list)
{ {
line_t *ldef = &lines[*list]; line_t *ldef = &level.lines[*list];
if (ldef->frontsector == ldef->backsector) if (ldef->frontsector == ldef->backsector)
{ // Skip two-sided lines inside a single sector { // Skip two-sided lines inside a single sector
@ -367,10 +368,10 @@ bool AActor::FixMapthingPos()
if (distance < radius) if (distance < radius)
{ {
DPrintf(DMSG_NOTIFY, "%s at (%f,%f) lies on %s line %td, distance = %f\n", DPrintf(DMSG_NOTIFY, "%s at (%f,%f) lies on %s line %d, distance = %f\n",
this->GetClass()->TypeName.GetChars(), X(), Y(), this->GetClass()->TypeName.GetChars(), X(), Y(),
ldef->Delta().X == 0 ? "vertical" : ldef->Delta().Y == 0 ? "horizontal" : "diagonal", ldef->Delta().X == 0 ? "vertical" : ldef->Delta().Y == 0 ? "horizontal" : "diagonal",
ldef - lines, distance); ldef->Index(), distance);
DAngle ang = ldef->Delta().Angle(); DAngle ang = ldef->Delta().Angle();
if (ldef->backsector != NULL && ldef->backsector == secstart) if (ldef->backsector != NULL && ldef->backsector == secstart)
{ {
@ -709,7 +710,7 @@ line_t *FBlockLinesIterator::Next()
{ {
while (*list != -1) while (*list != -1)
{ {
line_t *ld = &lines[*list]; line_t *ld = &level.lines[*list];
list++; list++;
if (ld->validcount != validcount) if (ld->validcount != validcount)

View file

@ -72,6 +72,7 @@
#include "a_armor.h" #include "a_armor.h"
#include "a_ammo.h" #include "a_ammo.h"
#include "a_health.h" #include "a_health.h"
#include "g_levellocals.h"
// MACROS ------------------------------------------------------------------ // MACROS ------------------------------------------------------------------
@ -7539,6 +7540,22 @@ DEFINE_ACTION_FUNCTION(AActor, A_RestoreSpecialPosition)
return 0; return 0;
} }
double AActor::GetBobOffset(double ticfrac) const
{
if (!(flags2 & MF2_FLOATBOB))
{
return 0;
}
return BobSin(FloatBobPhase + level.maptime + ticfrac);
}
DEFINE_ACTION_FUNCTION(AActor, GetBobOffset)
{
PARAM_SELF_PROLOGUE(AActor);
PARAM_FLOAT_DEF(frac);
ACTION_RETURN_FLOAT(self->GetBobOffset(frac));
}
@ -7639,13 +7656,6 @@ DEFINE_ACTION_FUNCTION(AActor, GetDefaultByType)
ACTION_RETURN_OBJECT(cls == nullptr? nullptr : GetDefaultByType(cls)); ACTION_RETURN_OBJECT(cls == nullptr? nullptr : GetDefaultByType(cls));
} }
DEFINE_ACTION_FUNCTION(AActor, GetBobOffset)
{
PARAM_SELF_PROLOGUE(AActor);
PARAM_FLOAT_DEF(frac);
ACTION_RETURN_FLOAT(self->GetBobOffset(frac));
}
// This combines all 3 variations of the internal function // This combines all 3 variations of the internal function
DEFINE_ACTION_FUNCTION(AActor, VelFromAngle) DEFINE_ACTION_FUNCTION(AActor, VelFromAngle)
{ {

View file

@ -39,6 +39,7 @@
#include "s_sndseq.h" #include "s_sndseq.h"
#include "serializer.h" #include "serializer.h"
#include "r_data/r_interpolate.h" #include "r_data/r_interpolate.h"
#include "g_levellocals.h"
IMPLEMENT_CLASS(DPillar, false, true) IMPLEMENT_CLASS(DPillar, false, true)

View file

@ -32,6 +32,7 @@
#include "gi.h" #include "gi.h"
#include "serializer.h" #include "serializer.h"
#include "p_spec.h" #include "p_spec.h"
#include "g_levellocals.h"
static FRandom pr_doplat ("DoPlat"); static FRandom pr_doplat ("DoPlat");

View file

@ -30,6 +30,7 @@
#include "serializer.h" #include "serializer.h"
#include "v_text.h" #include "v_text.h"
#include "cmdlib.h" #include "cmdlib.h"
#include "g_levellocals.h"
// MACROS ------------------------------------------------------------------ // MACROS ------------------------------------------------------------------

View file

@ -32,6 +32,7 @@
#include "p_maputl.h" #include "p_maputl.h"
#include "p_local.h" #include "p_local.h"
#include "d_player.h" #include "d_player.h"
#include "g_levellocals.h"
CVAR(Bool, var_pushers, true, CVAR_SERVERINFO); CVAR(Bool, var_pushers, true, CVAR_SERVERINFO);
@ -358,11 +359,10 @@ AActor *P_GetPushThing (int s)
void P_SpawnPushers () void P_SpawnPushers ()
{ {
int i; line_t *l = &level.lines[0];
line_t *l = lines;
int s; int s;
for (i = 0; i < numlines; i++, l++) for (unsigned i = 0; i < level.lines.Size(); i++, l++)
{ {
switch (l->special) switch (l->special)
{ {

View file

@ -62,6 +62,11 @@
#include "r_sky.h" #include "r_sky.h"
#include "r_renderer.h" #include "r_renderer.h"
#include "serializer.h" #include "serializer.h"
#include "g_levellocals.h"
static TStaticArray<sector_t> loadsectors;
static TStaticArray<line_t> loadlines;
static TStaticArray<side_t> loadsides;
//========================================================================== //==========================================================================
@ -353,6 +358,7 @@ FSerializer &Serialize(FSerializer &arc, const char *key, subsector_t *&ss, subs
str = &encoded[0]; str = &encoded[0];
if (arc.BeginArray(key)) if (arc.BeginArray(key))
{ {
auto numvertexes = level.vertexes.Size();
arc(nullptr, numvertexes) arc(nullptr, numvertexes)
(nullptr, numsubsectors) (nullptr, numsubsectors)
.StringPtr(nullptr, str) .StringPtr(nullptr, str)
@ -371,7 +377,7 @@ FSerializer &Serialize(FSerializer &arc, const char *key, subsector_t *&ss, subs
.StringPtr(nullptr, str) .StringPtr(nullptr, str)
.EndArray(); .EndArray();
if (num_verts == numvertexes && num_subs == numsubsectors && hasglnodes) if (num_verts == level.vertexes.Size() && num_subs == numsubsectors && hasglnodes)
{ {
success = true; success = true;
int sub = 0; int sub = 0;
@ -898,8 +904,8 @@ void G_SerializeLevel(FSerializer &arc, bool hubload)
// deep down in the deserializer or just a crash if the few insufficient safeguards were not triggered. // deep down in the deserializer or just a crash if the few insufficient safeguards were not triggered.
BYTE chk[16] = { 0 }; BYTE chk[16] = { 0 };
arc.Array("checksum", chk, 16); arc.Array("checksum", chk, 16);
if (arc.GetSize("linedefs") != (unsigned)numlines || if (arc.GetSize("linedefs") != level.lines.Size() ||
arc.GetSize("sidedefs") != (unsigned)numsides || arc.GetSize("sidedefs") != level.sides.Size() ||
arc.GetSize("sectors") != level.sectors.Size() || arc.GetSize("sectors") != level.sectors.Size() ||
arc.GetSize("polyobjs") != (unsigned)po_NumPolyobjs || arc.GetSize("polyobjs") != (unsigned)po_NumPolyobjs ||
memcmp(chk, level.md5, 16)) memcmp(chk, level.md5, 16))
@ -952,8 +958,8 @@ void G_SerializeLevel(FSerializer &arc, bool hubload)
FBehavior::StaticSerializeModuleStates(arc); FBehavior::StaticSerializeModuleStates(arc);
// The order here is important: First world state, then portal state, then thinkers, and last polyobjects. // The order here is important: First world state, then portal state, then thinkers, and last polyobjects.
arc.Array("linedefs", lines, &loadlines[0], numlines); arc.Array("linedefs", &level.lines[0], &loadlines[0], level.lines.Size());
arc.Array("sidedefs", sides, &loadsides[0], numsides); arc.Array("sidedefs", &level.sides[0], &loadsides[0], level.sides.Size());
arc.Array("sectors", &level.sectors[0], &loadsectors[0], level.sectors.Size()); arc.Array("sectors", &level.sectors[0], &loadsectors[0], level.sectors.Size());
arc("zones", Zones); arc("zones", Zones);
arc("lineportals", linePortals); arc("lineportals", linePortals);
@ -988,4 +994,18 @@ void G_SerializeLevel(FSerializer &arc, bool hubload)
} }
// Create a backup of the map data so the savegame code can toss out all fields that haven't changed in order to reduce processing time and file size.
void P_BackupMapData()
{
loadsectors = level.sectors;
loadlines = level.lines;
loadsides = level.sides;
}
void P_FreeMapDataBackup()
{
loadsectors.Clear();
loadlines.Clear();
loadsides.Clear();
}

View file

@ -46,4 +46,7 @@ void P_WriteACSDefereds (FSerializer &);
void G_SerializeLevel(FSerializer &arc, bool hubLoad); void G_SerializeLevel(FSerializer &arc, bool hubLoad);
void P_BackupMapData();
void P_FreeMapDataBackup();
#endif // __P_SAVEG_H__ #endif // __P_SAVEG_H__

View file

@ -29,6 +29,7 @@
#include "serializer.h" #include "serializer.h"
#include "p_lnspec.h" #include "p_lnspec.h"
#include "r_data/r_interpolate.h" #include "r_data/r_interpolate.h"
#include "g_levellocals.h"
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// //
@ -191,19 +192,19 @@ void DScroller::Tick ()
case EScroll::sc_side: // killough 3/7/98: Scroll wall texture case EScroll::sc_side: // killough 3/7/98: Scroll wall texture
if (m_Parts & EScrollPos::scw_top) if (m_Parts & EScrollPos::scw_top)
{ {
sides[m_Affectee].AddTextureXOffset(side_t::top, dx); level.sides[m_Affectee].AddTextureXOffset(side_t::top, dx);
sides[m_Affectee].AddTextureYOffset(side_t::top, dy); level.sides[m_Affectee].AddTextureYOffset(side_t::top, dy);
} }
if (m_Parts & EScrollPos::scw_mid && (sides[m_Affectee].linedef->backsector == NULL || if (m_Parts & EScrollPos::scw_mid && (level.sides[m_Affectee].linedef->backsector == NULL ||
!(sides[m_Affectee].linedef->flags&ML_3DMIDTEX))) !(level.sides[m_Affectee].linedef->flags&ML_3DMIDTEX)))
{ {
sides[m_Affectee].AddTextureXOffset(side_t::mid, dx); level.sides[m_Affectee].AddTextureXOffset(side_t::mid, dx);
sides[m_Affectee].AddTextureYOffset(side_t::mid, dy); level.sides[m_Affectee].AddTextureYOffset(side_t::mid, dy);
} }
if (m_Parts & EScrollPos::scw_bottom) if (m_Parts & EScrollPos::scw_bottom)
{ {
sides[m_Affectee].AddTextureXOffset(side_t::bottom, dx); level.sides[m_Affectee].AddTextureXOffset(side_t::bottom, dx);
sides[m_Affectee].AddTextureYOffset(side_t::bottom, dy); level.sides[m_Affectee].AddTextureYOffset(side_t::bottom, dy);
} }
break; break;
@ -276,19 +277,19 @@ DScroller::DScroller (EScroll type, double dx, double dy,
break; break;
case EScroll::sc_side: case EScroll::sc_side:
sides[affectee].Flags |= WALLF_NOAUTODECALS; level.sides[affectee].Flags |= WALLF_NOAUTODECALS;
if (m_Parts & EScrollPos::scw_top) if (m_Parts & EScrollPos::scw_top)
{ {
m_Interpolations[0] = sides[m_Affectee].SetInterpolation(side_t::top); m_Interpolations[0] = level.sides[m_Affectee].SetInterpolation(side_t::top);
} }
if (m_Parts & EScrollPos::scw_mid && (sides[m_Affectee].linedef->backsector == NULL || if (m_Parts & EScrollPos::scw_mid && (level.sides[m_Affectee].linedef->backsector == nullptr ||
!(sides[m_Affectee].linedef->flags&ML_3DMIDTEX))) !(level.sides[m_Affectee].linedef->flags&ML_3DMIDTEX)))
{ {
m_Interpolations[1] = sides[m_Affectee].SetInterpolation(side_t::mid); m_Interpolations[1] = level.sides[m_Affectee].SetInterpolation(side_t::mid);
} }
if (m_Parts & EScrollPos::scw_bottom) if (m_Parts & EScrollPos::scw_bottom)
{ {
m_Interpolations[2] = sides[m_Affectee].SetInterpolation(side_t::bottom); m_Interpolations[2] = level.sides[m_Affectee].SetInterpolation(side_t::bottom);
} }
break; break;
@ -349,22 +350,22 @@ DScroller::DScroller (double dx, double dy, const line_t *l,
m_LastHeight = 0; m_LastHeight = 0;
if ((m_Control = control) != -1) if ((m_Control = control) != -1)
m_LastHeight = level.sectors[control].CenterFloor() + level.sectors[control].CenterCeiling(); m_LastHeight = level.sectors[control].CenterFloor() + level.sectors[control].CenterCeiling();
m_Affectee = int(l->sidedef[0] - sides); m_Affectee = l->sidedef[0]->Index();
sides[m_Affectee].Flags |= WALLF_NOAUTODECALS; level.sides[m_Affectee].Flags |= WALLF_NOAUTODECALS;
m_Interpolations[0] = m_Interpolations[1] = m_Interpolations[2] = NULL; m_Interpolations[0] = m_Interpolations[1] = m_Interpolations[2] = NULL;
if (m_Parts & EScrollPos::scw_top) if (m_Parts & EScrollPos::scw_top)
{ {
m_Interpolations[0] = sides[m_Affectee].SetInterpolation(side_t::top); m_Interpolations[0] = level.sides[m_Affectee].SetInterpolation(side_t::top);
} }
if (m_Parts & EScrollPos::scw_mid && (sides[m_Affectee].linedef->backsector == NULL || if (m_Parts & EScrollPos::scw_mid && (level.sides[m_Affectee].linedef->backsector == NULL ||
!(sides[m_Affectee].linedef->flags&ML_3DMIDTEX))) !(level.sides[m_Affectee].linedef->flags&ML_3DMIDTEX)))
{ {
m_Interpolations[1] = sides[m_Affectee].SetInterpolation(side_t::mid); m_Interpolations[1] = level.sides[m_Affectee].SetInterpolation(side_t::mid);
} }
if (m_Parts & EScrollPos::scw_bottom) if (m_Parts & EScrollPos::scw_bottom)
{ {
m_Interpolations[2] = sides[m_Affectee].SetInterpolation(side_t::bottom); m_Interpolations[2] = level.sides[m_Affectee].SetInterpolation(side_t::bottom);
} }
} }
@ -380,24 +381,23 @@ DScroller::DScroller (double dx, double dy, const line_t *l,
void P_SpawnScrollers(void) void P_SpawnScrollers(void)
{ {
int i; line_t *l = &level.lines[0];
line_t *l = lines;
TArray<int> copyscrollers; TArray<int> copyscrollers;
for (i = 0; i < numlines; i++) for (auto &line : level.lines)
{ {
if (lines[i].special == Sector_CopyScroller) if (line.special == Sector_CopyScroller)
{ {
// don't allow copying the scroller if the sector has the same tag as it would just duplicate it. // don't allow copying the scroller if the sector has the same tag as it would just duplicate it.
if (!tagManager.SectorHasTag(lines[i].frontsector, lines[i].args[0])) if (!tagManager.SectorHasTag(line.frontsector, line.args[0]))
{ {
copyscrollers.Push(i); copyscrollers.Push(line.Index());
} }
lines[i].special = 0; line.special = 0;
} }
} }
for (i = 0; i < numlines; i++, l++) for (unsigned i = 0; i < level.lines.Size(); i++, l++)
{ {
double dx; // direction and speed of scrolling double dx; // direction and speed of scrolling
double dy; double dy;
@ -474,7 +474,7 @@ void P_SpawnScrollers(void)
} }
for (unsigned j = 0; j < copyscrollers.Size(); j++) for (unsigned j = 0; j < copyscrollers.Size(); j++)
{ {
line_t *line = &lines[copyscrollers[j]]; line_t *line = &level.lines[copyscrollers[j]];
if (line->args[0] == l->args[0] && (line->args[1] & 1)) if (line->args[0] == l->args[0] && (line->args[1] & 1))
{ {
@ -494,7 +494,7 @@ void P_SpawnScrollers(void)
} }
for(unsigned j = 0;j < copyscrollers.Size(); j++) for(unsigned j = 0;j < copyscrollers.Size(); j++)
{ {
line_t *line = &lines[copyscrollers[j]]; line_t *line = &level.lines[copyscrollers[j]];
if (line->args[0] == l->args[0] && (line->args[1] & 2)) if (line->args[0] == l->args[0] && (line->args[1] & 2))
{ {
@ -512,7 +512,7 @@ void P_SpawnScrollers(void)
} }
for(unsigned j = 0;j < copyscrollers.Size(); j++) for(unsigned j = 0;j < copyscrollers.Size(); j++)
{ {
line_t *line = &lines[copyscrollers[j]]; line_t *line = &level.lines[copyscrollers[j]];
if (line->args[0] == l->args[0] && (line->args[1] & 4)) if (line->args[0] == l->args[0] && (line->args[1] & 4))
{ {
@ -530,48 +530,48 @@ void P_SpawnScrollers(void)
while ((s = itr.Next()) >= 0) while ((s = itr.Next()) >= 0)
{ {
if (s != i) if (s != i)
new DScroller(dx, dy, lines + s, control, accel); new DScroller(dx, dy, &level.lines[s], control, accel);
} }
break; break;
} }
case Scroll_Texture_Offsets: case Scroll_Texture_Offsets:
// killough 3/2/98: scroll according to sidedef offsets // killough 3/2/98: scroll according to sidedef offsets
s = int(lines[i].sidedef[0] - sides); s = level.lines[i].sidedef[0]->Index();
new DScroller (EScroll::sc_side, -sides[s].GetTextureXOffset(side_t::mid), new DScroller (EScroll::sc_side, -level.sides[s].GetTextureXOffset(side_t::mid),
sides[s].GetTextureYOffset(side_t::mid), -1, s, accel, SCROLLTYPE(l->args[0])); level.sides[s].GetTextureYOffset(side_t::mid), -1, s, accel, SCROLLTYPE(l->args[0]));
break; break;
case Scroll_Texture_Left: case Scroll_Texture_Left:
l->special = special; // Restore the special, for compat_useblocking's benefit. l->special = special; // Restore the special, for compat_useblocking's benefit.
s = int(lines[i].sidedef[0] - sides); s = level.lines[i].sidedef[0]->Index();
new DScroller (EScroll::sc_side, l->args[0] / 64., 0, new DScroller (EScroll::sc_side, l->args[0] / 64., 0,
-1, s, accel, SCROLLTYPE(l->args[1])); -1, s, accel, SCROLLTYPE(l->args[1]));
break; break;
case Scroll_Texture_Right: case Scroll_Texture_Right:
l->special = special; l->special = special;
s = int(lines[i].sidedef[0] - sides); s = level.lines[i].sidedef[0]->Index();
new DScroller (EScroll::sc_side, -l->args[0] / 64., 0, new DScroller (EScroll::sc_side, -l->args[0] / 64., 0,
-1, s, accel, SCROLLTYPE(l->args[1])); -1, s, accel, SCROLLTYPE(l->args[1]));
break; break;
case Scroll_Texture_Up: case Scroll_Texture_Up:
l->special = special; l->special = special;
s = int(lines[i].sidedef[0] - sides); s = level.lines[i].sidedef[0]->Index();
new DScroller (EScroll::sc_side, 0, l->args[0] / 64., new DScroller (EScroll::sc_side, 0, l->args[0] / 64.,
-1, s, accel, SCROLLTYPE(l->args[1])); -1, s, accel, SCROLLTYPE(l->args[1]));
break; break;
case Scroll_Texture_Down: case Scroll_Texture_Down:
l->special = special; l->special = special;
s = int(lines[i].sidedef[0] - sides); s = level.lines[i].sidedef[0]->Index();
new DScroller (EScroll::sc_side, 0, -l->args[0] / 64., new DScroller (EScroll::sc_side, 0, -l->args[0] / 64.,
-1, s, accel, SCROLLTYPE(l->args[1])); -1, s, accel, SCROLLTYPE(l->args[1]));
break; break;
case Scroll_Texture_Both: case Scroll_Texture_Both:
s = int(lines[i].sidedef[0] - sides); s = level.lines[i].sidedef[0]->Index();
if (l->args[0] == 0) { if (l->args[0] == 0) {
dx = (l->args[1] - l->args[2]) / 64.; dx = (l->args[1] - l->args[2]) / 64.;
dy = (l->args[4] - l->args[3]) / 64.; dy = (l->args[4] - l->args[3]) / 64.;
@ -608,8 +608,8 @@ void SetWallScroller (int id, int sidechoice, double dx, double dy, EScrollPos W
{ {
int wallnum = scroller->GetWallNum (); int wallnum = scroller->GetWallNum ();
if (wallnum >= 0 && tagManager.LineHasID(sides[wallnum].linedef, id) && if (wallnum >= 0 && tagManager.LineHasID(level.sides[wallnum].linedef, id) &&
int(sides[wallnum].linedef->sidedef[sidechoice] - sides) == wallnum && level.sides[wallnum].linedef->sidedef[sidechoice]->Index() == wallnum &&
Where == scroller->GetScrollParts()) Where == scroller->GetScrollParts())
{ {
scroller->Destroy (); scroller->Destroy ();
@ -628,8 +628,8 @@ void SetWallScroller (int id, int sidechoice, double dx, double dy, EScrollPos W
while ( (collect.Obj = iterator.Next ()) ) while ( (collect.Obj = iterator.Next ()) )
{ {
if ((collect.RefNum = ((DScroller *)collect.Obj)->GetWallNum ()) != -1 && if ((collect.RefNum = ((DScroller *)collect.Obj)->GetWallNum ()) != -1 &&
tagManager.LineHasID(sides[collect.RefNum].linedef, id) && tagManager.LineHasID(level.sides[collect.RefNum].linedef, id) &&
int(sides[collect.RefNum].linedef->sidedef[sidechoice] - sides) == collect.RefNum && level.sides[collect.RefNum].linedef->sidedef[sidechoice]->Index() == collect.RefNum &&
Where == ((DScroller *)collect.Obj)->GetScrollParts()) Where == ((DScroller *)collect.Obj)->GetScrollParts())
{ {
((DScroller *)collect.Obj)->SetRate (dx, dy); ((DScroller *)collect.Obj)->SetRate (dx, dy);
@ -645,9 +645,9 @@ void SetWallScroller (int id, int sidechoice, double dx, double dy, EScrollPos W
FLineIdIterator itr(id); FLineIdIterator itr(id);
while ((linenum = itr.Next()) >= 0) while ((linenum = itr.Next()) >= 0)
{ {
if (lines[linenum].sidedef[sidechoice] != NULL) if (level.lines[linenum].sidedef[sidechoice] != NULL)
{ {
int sidenum = int(lines[linenum].sidedef[sidechoice] - sides); int sidenum = level.lines[linenum].sidedef[sidechoice]->Index();
unsigned int i; unsigned int i;
for (i = 0; i < numcollected; i++) for (i = 0; i < numcollected; i++)
{ {

View file

@ -35,6 +35,7 @@
#include "p_local.h" #include "p_local.h"
#include "r_sky.h" #include "r_sky.h"
#include "r_data/colormaps.h" #include "r_data/colormaps.h"
#include "g_levellocals.h"
// [RH] // [RH]
@ -710,7 +711,7 @@ double sector_t::FindHighestFloorPoint (vertex_t **v) const
{ {
if (v != NULL) if (v != NULL)
{ {
if (Lines.Size() == 0) *v = &vertexes[0]; if (Lines.Size() == 0) *v = &level.vertexes[0];
else *v = Lines[0]->v1; else *v = Lines[0]->v1;
} }
return -floorplane.fD(); return -floorplane.fD();
@ -759,7 +760,7 @@ double sector_t::FindLowestCeilingPoint (vertex_t **v) const
{ {
if (v != NULL) if (v != NULL)
{ {
if (Lines.Size() == 0) *v = &vertexes[0]; if (Lines.Size() == 0) *v = &level.vertexes[0];
else *v = Lines[0]->v1; else *v = Lines[0]->v1;
} }
return ceilingplane.fD(); return ceilingplane.fD();
@ -1772,6 +1773,205 @@ DEFINE_ACTION_FUNCTION(_Sector, NextLowestFloorAt)
ACTION_RETURN_FLOAT(self->CenterCeiling()); ACTION_RETURN_FLOAT(self->CenterCeiling());
} }
DEFINE_ACTION_FUNCTION(_Sector, Index)
{
PARAM_SELF_STRUCT_PROLOGUE(sector_t);
unsigned ndx = self->Index();
if (ndx >= level.sectors.Size())
{
// This qualifies as an array out of bounds exception. Normally it can only happen when a sector copy is concerned which scripts should not be able to create.
ThrowAbortException(X_ARRAY_OUT_OF_BOUNDS, "Accessed invalid sector");
}
ACTION_RETURN_INT(ndx);
}
//===========================================================================
//
// line_t exports
//
//===========================================================================
DEFINE_ACTION_FUNCTION(_Line, isLinePortal)
{
PARAM_SELF_STRUCT_PROLOGUE(line_t);
ACTION_RETURN_BOOL(self->isLinePortal());
}
DEFINE_ACTION_FUNCTION(_Line, isVisualPortal)
{
PARAM_SELF_STRUCT_PROLOGUE(line_t);
ACTION_RETURN_BOOL(self->isVisualPortal());
}
DEFINE_ACTION_FUNCTION(_Line, getPortalDestination)
{
PARAM_SELF_STRUCT_PROLOGUE(line_t);
ACTION_RETURN_POINTER(self->getPortalDestination());
}
DEFINE_ACTION_FUNCTION(_Line, getPortalAlignment)
{
PARAM_SELF_STRUCT_PROLOGUE(line_t);
ACTION_RETURN_INT(self->getPortalAlignment());
}
DEFINE_ACTION_FUNCTION(_Line, Index)
{
PARAM_SELF_STRUCT_PROLOGUE(line_t);
unsigned ndx = self->Index();
if (ndx >= level.lines.Size())
{
ThrowAbortException(X_ARRAY_OUT_OF_BOUNDS, "Accessed invalid line");
}
ACTION_RETURN_INT(ndx);
}
//===========================================================================
//
//
//
//===========================================================================
DEFINE_ACTION_FUNCTION(_Side, GetTexture)
{
PARAM_SELF_STRUCT_PROLOGUE(side_t);
PARAM_INT(which);
ACTION_RETURN_INT(self->GetTexture(which).GetIndex());
}
DEFINE_ACTION_FUNCTION(_Side, SetTexture)
{
PARAM_SELF_STRUCT_PROLOGUE(side_t);
PARAM_INT(which);
PARAM_INT(tex);
self->SetTexture(which, FSetTextureID(tex));
return 0;
}
DEFINE_ACTION_FUNCTION(_Side, SetTextureXOffset)
{
PARAM_SELF_STRUCT_PROLOGUE(side_t);
PARAM_INT(which);
PARAM_FLOAT(ofs);
self->SetTextureXOffset(which, ofs);
return 0;
}
DEFINE_ACTION_FUNCTION(_Side, AddTextureXOffset)
{
PARAM_SELF_STRUCT_PROLOGUE(side_t);
PARAM_INT(which);
PARAM_FLOAT(ofs);
self->AddTextureXOffset(which, ofs);
return 0;
}
DEFINE_ACTION_FUNCTION(_Side, GetTextureXOffset)
{
PARAM_SELF_STRUCT_PROLOGUE(side_t);
PARAM_INT(which);
ACTION_RETURN_FLOAT(self->GetTextureXOffset(which));
}
DEFINE_ACTION_FUNCTION(_Side, SetTextureYOffset)
{
PARAM_SELF_STRUCT_PROLOGUE(side_t);
PARAM_INT(which);
PARAM_FLOAT(ofs);
self->SetTextureYOffset(which, ofs);
return 0;
}
DEFINE_ACTION_FUNCTION(_Side, AddTextureYOffset)
{
PARAM_SELF_STRUCT_PROLOGUE(side_t);
PARAM_INT(which);
PARAM_FLOAT(ofs);
self->AddTextureYOffset(which, ofs);
return 0;
}
DEFINE_ACTION_FUNCTION(_Side, GetTextureYOffset)
{
PARAM_SELF_STRUCT_PROLOGUE(side_t);
PARAM_INT(which);
ACTION_RETURN_FLOAT(self->GetTextureYOffset(which));
}
DEFINE_ACTION_FUNCTION(_Side, SetTextureXScale)
{
PARAM_SELF_STRUCT_PROLOGUE(side_t);
PARAM_INT(which);
PARAM_FLOAT(ofs);
self->SetTextureXScale(which, ofs);
return 0;
}
DEFINE_ACTION_FUNCTION(_Side, MultiplyTextureXScale)
{
PARAM_SELF_STRUCT_PROLOGUE(side_t);
PARAM_INT(which);
PARAM_FLOAT(ofs);
self->MultiplyTextureXScale(which, ofs);
return 0;
}
DEFINE_ACTION_FUNCTION(_Side, GetTextureXScale)
{
PARAM_SELF_STRUCT_PROLOGUE(side_t);
PARAM_INT(which);
ACTION_RETURN_FLOAT(self->GetTextureXScale(which));
}
DEFINE_ACTION_FUNCTION(_Side, SetTextureYScale)
{
PARAM_SELF_STRUCT_PROLOGUE(side_t);
PARAM_INT(which);
PARAM_FLOAT(ofs);
self->SetTextureYScale(which, ofs);
return 0;
}
DEFINE_ACTION_FUNCTION(_Side, MultiplyTextureYScale)
{
PARAM_SELF_STRUCT_PROLOGUE(side_t);
PARAM_INT(which);
PARAM_FLOAT(ofs);
self->MultiplyTextureYScale(which, ofs);
return 0;
}
DEFINE_ACTION_FUNCTION(_Side, GetTextureYScale)
{
PARAM_SELF_STRUCT_PROLOGUE(side_t);
PARAM_INT(which);
ACTION_RETURN_FLOAT(self->GetTextureYScale(which));
}
DEFINE_ACTION_FUNCTION(_Side, V1)
{
PARAM_SELF_STRUCT_PROLOGUE(side_t);
ACTION_RETURN_POINTER(self->V1());
}
DEFINE_ACTION_FUNCTION(_Side, V2)
{
PARAM_SELF_STRUCT_PROLOGUE(side_t);
ACTION_RETURN_POINTER(self->V2());
}
DEFINE_ACTION_FUNCTION(_Side, Index)
{
PARAM_SELF_STRUCT_PROLOGUE(side_t);
ACTION_RETURN_INT(self->Index());
}
DEFINE_ACTION_FUNCTION(_Vertex, Index)
{
PARAM_SELF_STRUCT_PROLOGUE(vertex_t);
ACTION_RETURN_INT(self->Index());
}
//=========================================================================== //===========================================================================
// //
// //
@ -1838,7 +2038,7 @@ bool secplane_t::CopyPlaneIfValid (secplane_t *dest, const secplane_t *opp) cons
bool P_AlignFlat (int linenum, int side, int fc) bool P_AlignFlat (int linenum, int side, int fc)
{ {
line_t *line = lines + linenum; line_t *line = &level.lines[linenum];
sector_t *sec = side ? line->backsector : line->frontsector; sector_t *sec = side ? line->backsector : line->frontsector;
if (!sec) if (!sec)
@ -1871,10 +2071,10 @@ void subsector_t::BuildPolyBSP()
assert((BSP == NULL || BSP->bDirty) && "BSP computed more than once"); assert((BSP == NULL || BSP->bDirty) && "BSP computed more than once");
// Set up level information for the node builder. // Set up level information for the node builder.
PolyNodeLevel.Sides = sides; PolyNodeLevel.Sides = &level.sides[0];
PolyNodeLevel.NumSides = numsides; PolyNodeLevel.NumSides = level.sides.Size();
PolyNodeLevel.Lines = lines; PolyNodeLevel.Lines = &level.lines[0];
PolyNodeLevel.NumLines = numlines; PolyNodeLevel.NumLines = numlines; // is this correct???
// Feed segs to the nodebuilder and build the nodes. // Feed segs to the nodebuilder and build the nodes.
PolyNodeBuilder.Clear(); PolyNodeBuilder.Clear();
@ -2100,6 +2300,12 @@ DEFINE_FIELD_X(Line, line_t, backsector)
DEFINE_FIELD_X(Line, line_t, validcount) DEFINE_FIELD_X(Line, line_t, validcount)
DEFINE_FIELD_X(Line, line_t, locknumber) DEFINE_FIELD_X(Line, line_t, locknumber)
DEFINE_FIELD_X(Line, line_t, portalindex) DEFINE_FIELD_X(Line, line_t, portalindex)
DEFINE_FIELD_X(Line, line_t, portaltransferred)
DEFINE_FIELD_X(Side, side_t, sector)
DEFINE_FIELD_X(Side, side_t, linedef)
DEFINE_FIELD_X(Side, side_t, Light)
DEFINE_FIELD_X(Side, side_t, Flags)
DEFINE_FIELD_X(Secplane, secplane_t, normal) DEFINE_FIELD_X(Secplane, secplane_t, normal)
DEFINE_FIELD_X(Secplane, secplane_t, D) DEFINE_FIELD_X(Secplane, secplane_t, D)

View file

@ -73,6 +73,8 @@
#include "p_blockmap.h" #include "p_blockmap.h"
#include "r_utility.h" #include "r_utility.h"
#include "p_spec.h" #include "p_spec.h"
#include "p_saveg.h"
#include "g_levellocals.h"
#ifndef NO_EDATA #ifndef NO_EDATA
#include "edata.h" #include "edata.h"
#endif #endif
@ -88,7 +90,6 @@ void BloodCrypt (void *data, int key, int len);
void P_ClearUDMFKeys(); void P_ClearUDMFKeys();
extern AActor *P_SpawnMapThing (FMapThing *mthing, int position); extern AActor *P_SpawnMapThing (FMapThing *mthing, int position);
extern bool P_LoadBuildMap (BYTE *mapdata, size_t len, FMapThing **things, int *numthings);
extern void P_TranslateTeleportThings (void); extern void P_TranslateTeleportThings (void);
@ -106,25 +107,25 @@ CVAR (Bool, showloadtimes, false, 0);
static void P_Shutdown (); static void P_Shutdown ();
bool P_IsBuildMap(MapData *map); inline bool P_IsBuildMap(MapData *map)
{
return false;
}
inline bool P_LoadBuildMap(BYTE *mapdata, size_t len, FMapThing **things, int *numthings)
{
return false;
}
// //
// MAP related Lookup tables. // MAP related Lookup tables.
// Store VERTEXES, LINEDEFS, SIDEDEFS, etc. // Store VERTEXES, LINEDEFS, SIDEDEFS, etc.
// //
int numvertexes; TArray<vertexdata_t> vertexdatas;
vertex_t* vertexes;
int numvertexdatas;
vertexdata_t* vertexdatas;
int numsegs; int numsegs;
seg_t* segs; seg_t* segs;
glsegextra_t* glsegextras;
//int numsectors;
//sector_t* sectors;
TArray<sector_t> loadsectors;
int numsubsectors; int numsubsectors;
subsector_t* subsectors; subsector_t* subsectors;
@ -132,14 +133,6 @@ subsector_t* subsectors;
int numnodes; int numnodes;
node_t* nodes; node_t* nodes;
int numlines;
line_t* lines;
TArray<line_t> loadlines;
int numsides;
side_t* sides;
TArray<side_t> loadsides;
TArray<zone_t> Zones; TArray<zone_t> Zones;
node_t * gamenodes; node_t * gamenodes;
@ -195,7 +188,7 @@ TArray<FPlayerStart> deathmatchstarts (16);
FPlayerStart playerstarts[MAXPLAYERS]; FPlayerStart playerstarts[MAXPLAYERS];
TArray<FPlayerStart> AllPlayerStarts; TArray<FPlayerStart> AllPlayerStarts;
static void P_AllocateSideDefs (int count); static void P_AllocateSideDefs (MapData *map, int count);
//=========================================================================== //===========================================================================
@ -594,11 +587,11 @@ static void SetTexture (side_t *side, int position, const char *name, FMissingTe
{ {
// Print an error that lists all references to this sidedef. // Print an error that lists all references to this sidedef.
// We must scan the linedefs manually for all references to this sidedef. // We must scan the linedefs manually for all references to this sidedef.
for(int i = 0; i < numlines; i++) for(unsigned i = 0; i < level.lines.Size(); i++)
{ {
for(int j = 0; j < 2; j++) for(int j = 0; j < 2; j++)
{ {
if (lines[i].sidedef[j] == side) if (level.lines[i].sidedef[j] == side)
{ {
Printf(TEXTCOLOR_RED"Unknown %s texture '" Printf(TEXTCOLOR_RED"Unknown %s texture '"
TEXTCOLOR_ORANGE "%s" TEXTCOLOR_RED TEXTCOLOR_ORANGE "%s" TEXTCOLOR_RED
@ -836,12 +829,9 @@ void P_FloodZones ()
void P_LoadVertexes (MapData * map) void P_LoadVertexes (MapData * map)
{ {
int i;
// Determine number of vertices: // Determine number of vertices:
// total lump length / vertex record length. // total lump length / vertex record length.
numvertexes = map->Size(ML_VERTEXES) / sizeof(mapvertex_t); unsigned numvertexes = map->Size(ML_VERTEXES) / sizeof(mapvertex_t);
numvertexdatas = 0;
if (numvertexes == 0) if (numvertexes == 0)
{ {
@ -849,18 +839,18 @@ void P_LoadVertexes (MapData * map)
} }
// Allocate memory for buffer. // Allocate memory for buffer.
vertexes = new vertex_t[numvertexes]; level.vertexes.Alloc(numvertexes);
vertexdatas = NULL; vertexdatas.Clear();
map->Seek(ML_VERTEXES); map->Seek(ML_VERTEXES);
// Copy and convert vertex coordinates, internal representation as fixed. // Copy and convert vertex coordinates, internal representation as fixed.
for (i = 0; i < numvertexes; i++) for (auto &v : level.vertexes)
{ {
SWORD x, y; int16_t x, y;
(*map->file) >> x >> y; (*map->file) >> x >> y;
vertexes[i].set(double(x), double(y)); v.set(double(x), double(y));
} }
} }
@ -881,9 +871,9 @@ void P_LoadZSegs (FileReaderBase &data)
data >> v1 >> v2 >> line >> side; data >> v1 >> v2 >> line >> side;
segs[i].v1 = &vertexes[v1]; segs[i].v1 = &level.vertexes[v1];
segs[i].v2 = &vertexes[v2]; segs[i].v2 = &level.vertexes[v2];
segs[i].linedef = ldef = &lines[line]; segs[i].linedef = ldef = &level.lines[line];
segs[i].sidedef = ldef->sidedef[side]; segs[i].sidedef = ldef->sidedef[side];
segs[i].frontsector = ldef->sidedef[side]->sector; segs[i].frontsector = ldef->sidedef[side]->sector;
if (ldef->flags & ML_TWOSIDED && ldef->sidedef[side^1] != NULL) if (ldef->flags & ML_TWOSIDED && ldef->sidedef[side^1] != NULL)
@ -931,7 +921,7 @@ void P_LoadGLZSegs (FileReaderBase &data, int type)
data >> side; data >> side;
seg = subsectors[i].firstline + j; seg = subsectors[i].firstline + j;
seg->v1 = &vertexes[v1]; seg->v1 = &level.vertexes[v1];
if (j == 0) if (j == 0)
{ {
seg[subsectors[i].numlines - 1].v2 = seg->v1; seg[subsectors[i].numlines - 1].v2 = seg->v1;
@ -940,12 +930,12 @@ void P_LoadGLZSegs (FileReaderBase &data, int type)
{ {
seg[-1].v2 = seg->v1; seg[-1].v2 = seg->v1;
} }
glsegextras[seg - segs].PartnerSeg = partner; seg->PartnerSeg = &segs[partner];
if (line != 0xFFFFFFFF) if (line != 0xFFFFFFFF)
{ {
line_t *ldef; line_t *ldef;
seg->linedef = ldef = &lines[line]; seg->linedef = ldef = &level.lines[line];
seg->sidedef = ldef->sidedef[side]; seg->sidedef = ldef->sidedef[side];
seg->frontsector = ldef->sidedef[side]->sector; seg->frontsector = ldef->sidedef[side]->sector;
if (ldef->flags & ML_TWOSIDED && ldef->sidedef[side^1] != NULL) if (ldef->flags & ML_TWOSIDED && ldef->sidedef[side^1] != NULL)
@ -978,23 +968,26 @@ void LoadZNodes(FileReaderBase &data, int glnodes)
{ {
// Read extra vertices added during node building // Read extra vertices added during node building
DWORD orgVerts, newVerts; DWORD orgVerts, newVerts;
vertex_t *newvertarray; TStaticArray<vertex_t> newvertarray;
unsigned int i; unsigned int i;
data >> orgVerts >> newVerts; data >> orgVerts >> newVerts;
if (orgVerts > (DWORD)numvertexes) if (orgVerts > level.vertexes.Size())
{ // These nodes are based on a map with more vertex data than we have. { // These nodes are based on a map with more vertex data than we have.
// We can't use them. // We can't use them.
throw CRecoverableError("Incorrect number of vertexes in nodes.\n"); throw CRecoverableError("Incorrect number of vertexes in nodes.\n");
} }
if (orgVerts + newVerts == (DWORD)numvertexes) bool fix;
if (orgVerts + newVerts == level.vertexes.Size())
{ {
newvertarray = vertexes; newvertarray = std::move(level.vertexes);
fix = false;
} }
else else
{ {
newvertarray = new vertex_t[orgVerts + newVerts]; newvertarray.Alloc(orgVerts + newVerts);
memcpy (newvertarray, vertexes, orgVerts * sizeof(vertex_t)); memcpy (&newvertarray[0], &level.vertexes[0], orgVerts * sizeof(vertex_t));
fix = true;
} }
for (i = 0; i < newVerts; ++i) for (i = 0; i < newVerts; ++i)
{ {
@ -1002,16 +995,14 @@ void LoadZNodes(FileReaderBase &data, int glnodes)
data >> x >> y; data >> x >> y;
newvertarray[i + orgVerts].set(x, y); newvertarray[i + orgVerts].set(x, y);
} }
if (vertexes != newvertarray) if (fix)
{ {
for (i = 0; i < (DWORD)numlines; ++i) for (auto &line : level.lines)
{ {
lines[i].v1 = lines[i].v1 - vertexes + newvertarray; line.v1 = line.v1 - &level.vertexes[0] + &newvertarray[0];
lines[i].v2 = lines[i].v2 - vertexes + newvertarray; line.v2 = line.v2 - &level.vertexes[0] + &newvertarray[0];
} }
delete[] vertexes; level.vertexes = std::move(newvertarray);
vertexes = newvertarray;
numvertexes = orgVerts + newVerts;
} }
// Read the subsectors // Read the subsectors
@ -1047,7 +1038,6 @@ void LoadZNodes(FileReaderBase &data, int glnodes)
numsegs = numSegs; numsegs = numSegs;
segs = new seg_t[numsegs]; segs = new seg_t[numsegs];
memset (segs, 0, numsegs*sizeof(seg_t)); memset (segs, 0, numsegs*sizeof(seg_t));
glsegextras = NULL;
for (i = 0; i < numSubs; ++i) for (i = 0; i < numSubs; ++i)
{ {
@ -1060,7 +1050,6 @@ void LoadZNodes(FileReaderBase &data, int glnodes)
} }
else else
{ {
glsegextras = new glsegextra_t[numsegs];
P_LoadGLZSegs (data, glnodes); P_LoadGLZSegs (data, glnodes);
} }
@ -1215,9 +1204,9 @@ void P_LoadSegs (MapData * map)
{ {
int i; int i;
BYTE *data; BYTE *data;
int numvertexes = level.vertexes.Size();
BYTE *vertchanged = new BYTE[numvertexes]; // phares 10/4/98 BYTE *vertchanged = new BYTE[numvertexes]; // phares 10/4/98
DWORD segangle; DWORD segangle;
line_t* line; // phares 10/4/98
//int ptp_angle; // phares 10/4/98 //int ptp_angle; // phares 10/4/98
//int delta_angle; // phares 10/4/98 //int delta_angle; // phares 10/4/98
int vnum1,vnum2; // phares 10/4/98 int vnum1,vnum2; // phares 10/4/98
@ -1252,10 +1241,9 @@ void P_LoadSegs (MapData * map)
// Mark those used by linedefs. A marked vertex is one that is not a // Mark those used by linedefs. A marked vertex is one that is not a
// candidate for movement further down. // candidate for movement further down.
line = lines; for (auto &line : level.lines)
for (i = 0; i < numlines ; i++, line++)
{ {
vertchanged[line->v1 - vertexes] = vertchanged[line->v2 - vertexes] = 1; vertchanged[line.v1->Index()] = vertchanged[line.v2->Index()] = 1;
} }
try try
@ -1276,8 +1264,8 @@ void P_LoadSegs (MapData * map)
throw badseg(0, i, MAX(vnum1, vnum2)); throw badseg(0, i, MAX(vnum1, vnum2));
} }
li->v1 = &vertexes[vnum1]; li->v1 = &level.vertexes[vnum1];
li->v2 = &vertexes[vnum2]; li->v2 = &level.vertexes[vnum2];
segangle = (WORD)LittleShort(ml->angle); segangle = (WORD)LittleShort(ml->angle);
@ -1332,16 +1320,16 @@ void P_LoadSegs (MapData * map)
} }
linedef = LittleShort(ml->linedef); linedef = LittleShort(ml->linedef);
if ((unsigned)linedef >= (unsigned)numlines) if ((unsigned)linedef >= level.lines.Size())
{ {
throw badseg(1, i, linedef); throw badseg(1, i, linedef);
} }
ldef = &lines[linedef]; ldef = &level.lines[linedef];
li->linedef = ldef; li->linedef = ldef;
side = LittleShort(ml->side); side = LittleShort(ml->side);
if ((unsigned)(ldef->sidedef[side] - sides) >= (unsigned)numsides) if ((unsigned)(ldef->sidedef[side]->Index()) >= level.sides.Size())
{ {
throw badseg(2, i, int(ldef->sidedef[side] - sides)); throw badseg(2, i, ldef->sidedef[side]->Index());
} }
li->sidedef = ldef->sidedef[side]; li->sidedef = ldef->sidedef[side];
li->frontsector = ldef->sidedef[side]->sector; li->frontsector = ldef->sidedef[side]->sector;
@ -1367,11 +1355,11 @@ void P_LoadSegs (MapData * map)
break; break;
case 1: case 1:
Printf ("Seg %d references a nonexistant linedef %d (max %d).\n", bad.badsegnum, bad.baddata, numlines); Printf ("Seg %d references a nonexistant linedef %d (max %u).\n", bad.badsegnum, bad.baddata, level.lines.Size());
break; break;
case 2: case 2:
Printf ("The linedef for seg %d references a nonexistant sidedef %d (max %d).\n", bad.badsegnum, bad.baddata, numsides); Printf ("The linedef for seg %d references a nonexistant sidedef %d (max %d).\n", bad.badsegnum, bad.baddata, level.sides.Size());
break; break;
} }
Printf ("The BSP will be rebuilt.\n"); Printf ("The BSP will be rebuilt.\n");
@ -1981,7 +1969,7 @@ void P_SaveLineSpecial (line_t *ld)
if (ld->sidedef[0] == NULL) if (ld->sidedef[0] == NULL)
return; return;
DWORD sidenum = DWORD(ld->sidedef[0]-sides); DWORD sidenum = ld->sidedef[0]->Index();
// killough 4/4/98: support special sidedef interpretation below // killough 4/4/98: support special sidedef interpretation below
// [RH] Save Static_Init only if it's interested in the textures // [RH] Save Static_Init only if it's interested in the textures
if (ld->special != Static_Init || ld->args[1] == Init_Color) if (ld->special != Static_Init || ld->args[1] == Init_Color)
@ -2003,7 +1991,7 @@ void P_FinishLoadingLineDef(line_t *ld, int alpha)
ld->backsector = ld->sidedef[1] != NULL ? ld->sidedef[1]->sector : NULL; ld->backsector = ld->sidedef[1] != NULL ? ld->sidedef[1]->sector : NULL;
double dx = (ld->v2->fX() - ld->v1->fX()); double dx = (ld->v2->fX() - ld->v1->fX());
double dy = (ld->v2->fY() - ld->v1->fY()); double dy = (ld->v2->fY() - ld->v1->fY());
int linenum = int(ld-lines); int linenum = ld->Index();
if (ld->frontsector == NULL) if (ld->frontsector == NULL)
{ {
@ -2027,8 +2015,6 @@ void P_FinishLoadingLineDef(line_t *ld, int alpha)
switch (ld->special) switch (ld->special)
{ // killough 4/11/98: handle special types { // killough 4/11/98: handle special types
int j;
case TranslucentLine: // killough 4/11/98: translucent 2s textures case TranslucentLine: // killough 4/11/98: translucent 2s textures
// [RH] Second arg controls how opaque it is. // [RH] Second arg controls how opaque it is.
if (alpha == SHRT_MIN) if (alpha == SHRT_MIN)
@ -2053,14 +2039,14 @@ void P_FinishLoadingLineDef(line_t *ld, int alpha)
} }
else else
{ {
for (j = 0; j < numlines; j++) for (unsigned j = 0; j < level.lines.Size(); j++)
{ {
if (tagManager.LineHasID(j, ld->args[0])) if (tagManager.LineHasID(j, ld->args[0]))
{ {
lines[j].alpha = dalpha; level.lines[j].alpha = dalpha;
if (additive) if (additive)
{ {
lines[j].flags |= ML_ADDTRANS; level.lines[j].flags |= ML_ADDTRANS;
} }
} }
} }
@ -2072,9 +2058,9 @@ void P_FinishLoadingLineDef(line_t *ld, int alpha)
// killough 4/4/98: delay using sidedefs until they are loaded // killough 4/4/98: delay using sidedefs until they are loaded
void P_FinishLoadingLineDefs () void P_FinishLoadingLineDefs ()
{ {
for (int i = 0; i < numlines; i++) for (auto &line : level.lines)
{ {
P_FinishLoadingLineDef(&lines[i], sidetemp[lines[i].sidedef[0]-sides].a.alpha); P_FinishLoadingLineDef(&line, sidetemp[line.sidedef[0]->Index()].a.alpha);
} }
} }
@ -2084,10 +2070,10 @@ static void P_SetSideNum (side_t **sidenum_p, WORD sidenum)
{ {
*sidenum_p = NULL; *sidenum_p = NULL;
} }
else if (sidecount < numsides) else if (sidecount < (int)level.sides.Size())
{ {
sidetemp[sidecount].a.map = sidenum; sidetemp[sidecount].a.map = sidenum;
*sidenum_p = &sides[sidecount++]; *sidenum_p = &level.sides[sidecount++];
} }
else else
{ {
@ -2103,10 +2089,10 @@ void P_LoadLineDefs (MapData * map)
char * mldf; char * mldf;
maplinedef_t *mld; maplinedef_t *mld;
numlines = lumplen / sizeof(maplinedef_t); int numlines = lumplen / sizeof(maplinedef_t);
lines = new line_t[numlines]; level.lines.Alloc(numlines);
linemap.Resize(numlines); linemap.Resize(numlines);
memset (lines, 0, numlines*sizeof(line_t)); memset (&level.lines[0], 0, numlines*sizeof(line_t));
mldf = new char[lumplen]; mldf = new char[lumplen];
map->Read(ML_LINEDEFS, mldf); map->Read(ML_LINEDEFS, mldf);
@ -2118,17 +2104,16 @@ void P_LoadLineDefs (MapData * map)
for (skipped = sidecount = i = 0; i < numlines; ) for (skipped = sidecount = i = 0; i < numlines; )
{ {
mld = ((maplinedef_t*)mldf) + i; mld = ((maplinedef_t*)mldf) + i;
int v1 = LittleShort(mld->v1); unsigned v1 = LittleShort(mld->v1);
int v2 = LittleShort(mld->v2); unsigned v2 = LittleShort(mld->v2);
if (v1 >= numvertexes || v2 >= numvertexes) if (v1 >= level.vertexes.Size() || v2 >= level.vertexes.Size())
{ {
delete [] mldf; delete [] mldf;
I_Error ("Line %d has invalid vertices: %d and/or %d.\nThe map only contains %d vertices.", i+skipped, v1, v2, numvertexes); I_Error ("Line %d has invalid vertices: %d and/or %d.\nThe map only contains %u vertices.", i+skipped, v1, v2, level.vertexes.Size());
} }
else if (v1 == v2 || else if (v1 == v2 ||
(vertexes[LittleShort(mld->v1)].fX() == vertexes[LittleShort(mld->v2)].fX() && (level.vertexes[v1].fX() == level.vertexes[v2].fX() && level.vertexes[v1].fY() == level.vertexes[v2].fY()))
vertexes[LittleShort(mld->v1)].fY() == vertexes[LittleShort(mld->v2)].fY()))
{ {
Printf ("Removing 0-length line %d\n", i+skipped); Printf ("Removing 0-length line %d\n", i+skipped);
memmove (mld, mld+1, sizeof(*mld)*(numlines-i-1)); memmove (mld, mld+1, sizeof(*mld)*(numlines-i-1));
@ -2153,14 +2138,15 @@ void P_LoadLineDefs (MapData * map)
} }
} }
P_AllocateSideDefs (sidecount); P_AllocateSideDefs (map, sidecount);
mld = (maplinedef_t *)mldf; mld = (maplinedef_t *)mldf;
ld = lines; ld = &level.lines[0];
for (i = 0; i < numlines; i++, mld++, ld++) for (i = 0; i < numlines; i++, mld++, ld++)
{ {
ld->alpha = 1.; // [RH] Opaque by default ld->alpha = 1.; // [RH] Opaque by default
ld->portalindex = UINT_MAX; ld->portalindex = UINT_MAX;
ld->portaltransferred = UINT_MAX;
// [RH] Translate old linedef special and flags to be // [RH] Translate old linedef special and flags to be
// compatible with the new format. // compatible with the new format.
@ -2178,8 +2164,8 @@ void P_LoadLineDefs (MapData * map)
} }
#endif #endif
ld->v1 = &vertexes[LittleShort(mld->v1)]; ld->v1 = &level.vertexes[LittleShort(mld->v1)];
ld->v2 = &vertexes[LittleShort(mld->v2)]; ld->v2 = &level.vertexes[LittleShort(mld->v2)];
P_SetSideNum (&ld->sidedef[0], LittleShort(mld->sidenum[0])); P_SetSideNum (&ld->sidedef[0], LittleShort(mld->sidenum[0]));
P_SetSideNum (&ld->sidedef[1], LittleShort(mld->sidenum[1])); P_SetSideNum (&ld->sidedef[1], LittleShort(mld->sidenum[1]));
@ -2202,10 +2188,10 @@ void P_LoadLineDefs2 (MapData * map)
char * mldf; char * mldf;
maplinedef2_t *mld; maplinedef2_t *mld;
numlines = lumplen / sizeof(maplinedef2_t); int numlines = lumplen / sizeof(maplinedef2_t);
lines = new line_t[numlines]; level.lines.Alloc(numlines);
linemap.Resize(numlines); linemap.Resize(numlines);
memset (lines, 0, numlines*sizeof(line_t)); memset (&level.lines[0], 0, numlines*sizeof(line_t));
mldf = new char[lumplen]; mldf = new char[lumplen];
map->Read(ML_LINEDEFS, mldf); map->Read(ML_LINEDEFS, mldf);
@ -2216,8 +2202,8 @@ void P_LoadLineDefs2 (MapData * map)
mld = ((maplinedef2_t*)mldf) + i; mld = ((maplinedef2_t*)mldf) + i;
if (mld->v1 == mld->v2 || if (mld->v1 == mld->v2 ||
(vertexes[LittleShort(mld->v1)].fX() == vertexes[LittleShort(mld->v2)].fX() && (level.vertexes[LittleShort(mld->v1)].fX() == level.vertexes[LittleShort(mld->v2)].fX() &&
vertexes[LittleShort(mld->v1)].fY() == vertexes[LittleShort(mld->v2)].fY())) level.vertexes[LittleShort(mld->v1)].fY() == level.vertexes[LittleShort(mld->v2)].fY()))
{ {
Printf ("Removing 0-length line %d\n", i+skipped); Printf ("Removing 0-length line %d\n", i+skipped);
memmove (mld, mld+1, sizeof(*mld)*(numlines-i-1)); memmove (mld, mld+1, sizeof(*mld)*(numlines-i-1));
@ -2245,15 +2231,16 @@ void P_LoadLineDefs2 (MapData * map)
ForceNodeBuild = true; ForceNodeBuild = true;
} }
P_AllocateSideDefs (sidecount); P_AllocateSideDefs (map, sidecount);
mld = (maplinedef2_t *)mldf; mld = (maplinedef2_t *)mldf;
ld = lines; ld = &level.lines[0];
for (i = 0; i < numlines; i++, mld++, ld++) for (i = 0; i < numlines; i++, mld++, ld++)
{ {
int j; int j;
ld->portalindex = UINT_MAX; ld->portalindex = UINT_MAX;
ld->portaltransferred = UINT_MAX;
for (j = 0; j < 5; j++) for (j = 0; j < 5; j++)
ld->args[j] = mld->args[j]; ld->args[j] = mld->args[j];
@ -2261,8 +2248,8 @@ void P_LoadLineDefs2 (MapData * map)
ld->flags = LittleShort(mld->flags); ld->flags = LittleShort(mld->flags);
ld->special = mld->special; ld->special = mld->special;
ld->v1 = &vertexes[LittleShort(mld->v1)]; ld->v1 = &level.vertexes[LittleShort(mld->v1)];
ld->v2 = &vertexes[LittleShort(mld->v2)]; ld->v2 = &level.vertexes[LittleShort(mld->v2)];
ld->alpha = 1.; // [RH] Opaque by default ld->alpha = 1.; // [RH] Opaque by default
P_SetSideNum (&ld->sidedef[0], LittleShort(mld->sidenum[0])); P_SetSideNum (&ld->sidedef[0], LittleShort(mld->sidenum[0]));
@ -2294,26 +2281,22 @@ void P_LoadLineDefs2 (MapData * map)
// //
// P_LoadSideDefs // P_LoadSideDefs
// //
// killough 4/4/98: split into two functions
void P_LoadSideDefs (MapData * map)
{
numsides = map->Size(ML_SIDEDEFS) / sizeof(mapsidedef_t);
}
static void P_AllocateSideDefs (int count) static void P_AllocateSideDefs (MapData *map, int count)
{ {
int i; int i;
sides = new side_t[count]; level.sides.Alloc(count);
memset (sides, 0, count*sizeof(side_t)); memset(&level.sides[0], 0, count * sizeof(side_t));
sidetemp = new sidei_t[MAX(count,numvertexes)]; sidetemp = new sidei_t[MAX<int>(count, level.vertexes.Size())];
for (i = 0; i < count; i++) for (i = 0; i < count; i++)
{ {
sidetemp[i].a.special = sidetemp[i].a.tag = 0; sidetemp[i].a.special = sidetemp[i].a.tag = 0;
sidetemp[i].a.alpha = SHRT_MIN; sidetemp[i].a.alpha = SHRT_MIN;
sidetemp[i].a.map = NO_SIDE; sidetemp[i].a.map = NO_SIDE;
} }
auto numsides = map->Size(ML_SIDEDEFS) / sizeof(mapsidedef_t);
if (count < numsides) if (count < numsides)
{ {
Printf ("Map has %d unused sidedefs\n", numsides - count); Printf ("Map has %d unused sidedefs\n", numsides - count);
@ -2334,9 +2317,10 @@ static void P_LoopSidedefs (bool firstloop)
{ {
delete[] sidetemp; delete[] sidetemp;
} }
sidetemp = new sidei_t[MAX(numvertexes, numsides)]; int numsides = level.sides.Size();
sidetemp = new sidei_t[MAX<int>(level.vertexes.Size(), numsides)];
for (i = 0; i < numvertexes; ++i) for (i = 0; i < (int)level.vertexes.Size(); ++i)
{ {
sidetemp[i].b.first = NO_SIDE; sidetemp[i].b.first = NO_SIDE;
sidetemp[i].b.next = NO_SIDE; sidetemp[i].b.next = NO_SIDE;
@ -2350,17 +2334,17 @@ static void P_LoopSidedefs (bool firstloop)
{ {
// For each vertex, build a list of sidedefs that use that vertex // For each vertex, build a list of sidedefs that use that vertex
// as their left edge. // as their left edge.
line_t *line = sides[i].linedef; line_t *line = level.sides[i].linedef;
int lineside = (line->sidedef[0] != &sides[i]); int lineside = (line->sidedef[0] != &level.sides[i]);
int vert = int((lineside ? line->v2 : line->v1) - vertexes); int vert = lineside ? line->v2->Index() : line->v1->Index();
sidetemp[i].b.lineside = lineside; sidetemp[i].b.lineside = lineside;
sidetemp[i].b.next = sidetemp[vert].b.first; sidetemp[i].b.next = sidetemp[vert].b.first;
sidetemp[vert].b.first = i; sidetemp[vert].b.first = i;
// Set each side so that it is the only member of its loop // Set each side so that it is the only member of its loop
sides[i].LeftSide = NO_SIDE; level.sides[i].LeftSide = NO_SIDE;
sides[i].RightSide = NO_SIDE; level.sides[i].RightSide = NO_SIDE;
} }
// For each side, find the side that is to its right and set the // For each side, find the side that is to its right and set the
@ -2369,7 +2353,7 @@ static void P_LoopSidedefs (bool firstloop)
for (i = 0; i < numsides; ++i) for (i = 0; i < numsides; ++i)
{ {
DWORD right; DWORD right;
line_t *line = sides[i].linedef; line_t *line = level.sides[i].linedef;
// If the side's line only exists in a single sector, // If the side's line only exists in a single sector,
// then consider that line to be a self-contained loop // then consider that line to be a self-contained loop
@ -2381,21 +2365,21 @@ static void P_LoopSidedefs (bool firstloop)
if (NULL == rightside) if (NULL == rightside)
{ {
// There is no right side! // There is no right side!
if (firstloop) Printf ("Line %d's right edge is unconnected\n", linemap[unsigned(line-lines)]); if (firstloop) Printf ("Line %d's right edge is unconnected\n", linemap[line->Index()]);
continue; continue;
} }
right = DWORD(rightside - sides); right = rightside->Index();
} }
else else
{ {
if (sidetemp[i].b.lineside) if (sidetemp[i].b.lineside)
{ {
right = int(line->v1 - vertexes); right = line->v1->Index();
} }
else else
{ {
right = int(line->v2 - vertexes); right = line->v2->Index();
} }
right = sidetemp[right].b.first; right = sidetemp[right].b.first;
@ -2403,7 +2387,7 @@ static void P_LoopSidedefs (bool firstloop)
if (right == NO_SIDE) if (right == NO_SIDE)
{ {
// There is no right side! // There is no right side!
if (firstloop) Printf ("Line %d's right edge is unconnected\n", linemap[unsigned(line-lines)]); if (firstloop) Printf ("Line %d's right edge is unconnected\n", linemap[line->Index()]);
continue; continue;
} }
@ -2414,7 +2398,7 @@ static void P_LoopSidedefs (bool firstloop)
line_t *leftline, *rightline; line_t *leftline, *rightline;
DAngle ang1, ang2, ang; DAngle ang1, ang2, ang;
leftline = sides[i].linedef; leftline = level.sides[i].linedef;
ang1 = leftline->Delta().Angle(); ang1 = leftline->Delta().Angle();
if (!sidetemp[i].b.lineside) if (!sidetemp[i].b.lineside)
{ {
@ -2423,9 +2407,9 @@ static void P_LoopSidedefs (bool firstloop)
while (right != NO_SIDE) while (right != NO_SIDE)
{ {
if (sides[right].LeftSide == NO_SIDE) if (level.sides[right].LeftSide == NO_SIDE)
{ {
rightline = sides[right].linedef; rightline = level.sides[right].linedef;
if (rightline->frontsector != rightline->backsector) if (rightline->frontsector != rightline->backsector)
{ {
ang2 = rightline->Delta().Angle(); ang2 = rightline->Delta().Angle();
@ -2450,8 +2434,8 @@ static void P_LoopSidedefs (bool firstloop)
} }
assert((unsigned)i<(unsigned)numsides); assert((unsigned)i<(unsigned)numsides);
assert(right<(unsigned)numsides); assert(right<(unsigned)numsides);
sides[i].RightSide = right; level.sides[i].RightSide = right;
sides[right].LeftSide = i; level.sides[right].LeftSide = i;
} }
// We keep the sidedef init info around until after polyobjects are initialized, // We keep the sidedef init info around until after polyobjects are initialized,
@ -2607,14 +2591,13 @@ void P_ProcessSideTextures(bool checktranmap, side_t *sd, sector_t *sec, intmaps
void P_LoadSideDefs2 (MapData *map, FMissingTextureTracker &missingtex) void P_LoadSideDefs2 (MapData *map, FMissingTextureTracker &missingtex)
{ {
int i;
char * msdf = new char[map->Size(ML_SIDEDEFS)]; char * msdf = new char[map->Size(ML_SIDEDEFS)];
map->Read(ML_SIDEDEFS, msdf); map->Read(ML_SIDEDEFS, msdf);
for (i = 0; i < numsides; i++) for (unsigned i = 0; i < level.sides.Size(); i++)
{ {
mapsidedef_t *msd = ((mapsidedef_t*)msdf) + sidetemp[i].a.map; mapsidedef_t *msd = ((mapsidedef_t*)msdf) + sidetemp[i].a.map;
side_t *sd = sides + i; side_t *sd = &level.sides[i];
sector_t *sec; sector_t *sec;
// [RH] The Doom renderer ignored the patch y locations when // [RH] The Doom renderer ignored the patch y locations when
@ -2631,7 +2614,7 @@ void P_LoadSideDefs2 (MapData *map, FMissingTextureTracker &missingtex)
sd->SetTextureYScale(1.); sd->SetTextureYScale(1.);
sd->linedef = NULL; sd->linedef = NULL;
sd->Flags = 0; sd->Flags = 0;
sd->Index = i; sd->UDMFIndex = i;
// killough 4/4/98: allow sidedef texture names to be overloaded // killough 4/4/98: allow sidedef texture names to be overloaded
// killough 4/11/98: refined to allow colormaps to work as wall // killough 4/11/98: refined to allow colormaps to work as wall
@ -2773,22 +2756,21 @@ static void P_CreateBlockMap ()
int bmapwidth, bmapheight; int bmapwidth, bmapheight;
double dminx, dmaxx, dminy, dmaxy; double dminx, dmaxx, dminy, dmaxy;
int minx, maxx, miny, maxy; int minx, maxx, miny, maxy;
int i;
int line; int line;
if (numvertexes <= 0) if (level.vertexes.Size() == 0)
return; return;
// Find map extents for the blockmap // Find map extents for the blockmap
dminx = dmaxx = vertexes[0].fX(); dminx = dmaxx = level.vertexes[0].fX();
dminy = dmaxy = vertexes[0].fY(); dminy = dmaxy = level.vertexes[0].fY();
for (i = 1; i < numvertexes; ++i) for (auto &vert : level.vertexes)
{ {
if (vertexes[i].fX() < dminx) dminx = vertexes[i].fX(); if (vert.fX() < dminx) dminx = vert.fX();
else if (vertexes[i].fX() > dmaxx) dmaxx = vertexes[i].fX(); else if (vert.fX() > dmaxx) dmaxx = vert.fX();
if (vertexes[i].fY() < dminy) dminy = vertexes[i].fY(); if (vert.fY() < dminy) dminy = vert.fY();
else if (vertexes[i].fY() > dmaxy) dmaxy = vertexes[i].fY(); else if (vert.fY() > dmaxy) dmaxy = vert.fY();
} }
minx = int(dminx); minx = int(dminx);
@ -2808,12 +2790,12 @@ static void P_CreateBlockMap ()
BlockLists = new TArray<int>[bmapwidth * bmapheight]; BlockLists = new TArray<int>[bmapwidth * bmapheight];
for (line = 0; line < numlines; ++line) for (line = 0; line < (int)level.lines.Size(); ++line)
{ {
int x1 = int(lines[line].v1->fX()); int x1 = int(level.lines[line].v1->fX());
int y1 = int(lines[line].v1->fY()); int y1 = int(level.lines[line].v1->fY());
int x2 = int(lines[line].v2->fX()); int x2 = int(level.lines[line].v2->fX());
int y2 = int(lines[line].v2->fY()); int y2 = int(level.lines[line].v2->fY());
int dx = x2 - x1; int dx = x2 - x1;
int dy = y2 - y1; int dy = y2 - y1;
int bx = (x1 - minx) >> BLOCKBITS; int bx = (x1 - minx) >> BLOCKBITS;
@ -2996,7 +2978,7 @@ static bool P_VerifyBlockMap(int count)
// scan the list for out-of-range linedef indicies in list // scan the list for out-of-range linedef indicies in list
for(tmplist = list; *tmplist != -1; tmplist++) for(tmplist = list; *tmplist != -1; tmplist++)
{ {
if(*tmplist < 0 || *tmplist >= numlines) if((unsigned)*tmplist >= level.lines.Size())
{ {
Printf(PRINT_HIGH, "P_VerifyBlockMap: index >= numlines\n"); Printf(PRINT_HIGH, "P_VerifyBlockMap: index >= numlines\n");
return false; return false;
@ -3105,14 +3087,11 @@ static void P_GroupLines (bool buildmap)
{ {
subsectors[i].sector = subsectors[i].firstline->sidedef->sector; subsectors[i].sector = subsectors[i].firstline->sidedef->sector;
} }
if (glsegextras != NULL) for (int i = 0; i < numsubsectors; i++)
{ {
for (int i = 0; i < numsubsectors; i++) for (jj = 0; jj < subsectors[i].numlines; ++jj)
{ {
for (jj = 0; jj < subsectors[i].numlines; ++jj) subsectors[i].firstline[jj].Subsector = &subsectors[i];
{
glsegextras[subsectors[i].firstline - segs + jj].Subsector = &subsectors[i];
}
} }
} }
times[0].Unclock(); times[0].Unclock();
@ -3120,9 +3099,9 @@ static void P_GroupLines (bool buildmap)
// count number of lines in each sector // count number of lines in each sector
times[1].Clock(); times[1].Clock();
total = 0; total = 0;
for (int i = 0; i < numlines; i++) for (unsigned i = 0; i < level.lines.Size(); i++)
{ {
auto li = &lines[i]; auto li = &level.lines[i];
if (li->frontsector == NULL) if (li->frontsector == NULL)
{ {
if (!flaggedNoFronts) if (!flaggedNoFronts)
@ -3174,9 +3153,9 @@ static void P_GroupLines (bool buildmap)
} }
} }
for (int i = 0; i < numlines; i++) for (unsigned i = 0; i < level.lines.Size(); i++)
{ {
auto li = &lines[i]; auto li = &level.lines[i];
if (li->frontsector != NULL) if (li->frontsector != NULL)
{ {
li->frontsector->Lines[linesDoneInEachSector[li->frontsector->Index()]++] = li; li->frontsector->Lines[linesDoneInEachSector[li->frontsector->Index()]++] = li;
@ -3393,11 +3372,11 @@ static void P_PrecacheLevel()
hitlist[level.sectors[i].GetTexture(sector_t::ceiling).GetIndex()] |= FTextureManager::HIT_Flat; hitlist[level.sectors[i].GetTexture(sector_t::ceiling).GetIndex()] |= FTextureManager::HIT_Flat;
} }
for (i = numsides - 1; i >= 0; i--) for (i = level.sides.Size() - 1; i >= 0; i--)
{ {
hitlist[sides[i].GetTexture(side_t::top).GetIndex()] |= FTextureManager::HIT_Wall; hitlist[level.sides[i].GetTexture(side_t::top).GetIndex()] |= FTextureManager::HIT_Wall;
hitlist[sides[i].GetTexture(side_t::mid).GetIndex()] |= FTextureManager::HIT_Wall; hitlist[level.sides[i].GetTexture(side_t::mid).GetIndex()] |= FTextureManager::HIT_Wall;
hitlist[sides[i].GetTexture(side_t::bottom).GetIndex()] |= FTextureManager::HIT_Wall; hitlist[level.sides[i].GetTexture(side_t::bottom).GetIndex()] |= FTextureManager::HIT_Wall;
} }
// Sky texture is always present. // Sky texture is always present.
@ -3431,6 +3410,7 @@ extern polyblock_t **PolyBlockMap;
void P_FreeLevelData () void P_FreeLevelData ()
{ {
P_FreeMapDataBackup();
interpolator.ClearInterpolations(); // [RH] Nothing to interpolate on a fresh level. interpolator.ClearInterpolations(); // [RH] Nothing to interpolate on a fresh level.
Renderer->CleanLevelData(); Renderer->CleanLevelData();
FPolyObj::ClearAllSubsectorLinks(); // can't be done as part of the polyobj deletion process. FPolyObj::ClearAllSubsectorLinks(); // can't be done as part of the polyobj deletion process.
@ -3443,28 +3423,20 @@ void P_FreeLevelData ()
wminfo.maxfrags = 0; wminfo.maxfrags = 0;
FBehavior::StaticUnloadModules (); FBehavior::StaticUnloadModules ();
if (vertexes != NULL)
{
delete[] vertexes;
vertexes = NULL;
}
numvertexes = 0;
if (segs != NULL) if (segs != NULL)
{ {
delete[] segs; delete[] segs;
segs = NULL; segs = NULL;
} }
numsegs = 0; numsegs = 0;
if (glsegextras != NULL)
{
delete[] glsegextras;
glsegextras = NULL;
}
if (level.sectors.Size() > 0) if (level.sectors.Size() > 0)
{ {
delete[] level.sectors[0].e; delete[] level.sectors[0].e;
} }
level.sectors.Clear(); level.sectors.Clear();
level.lines.Clear();
level.sides.Clear();
level.vertexes.Clear();
if (gamenodes != NULL && gamenodes != nodes) if (gamenodes != NULL && gamenodes != nodes)
{ {
@ -3493,18 +3465,6 @@ void P_FreeLevelData ()
numsubsectors = numgamesubsectors = 0; numsubsectors = numgamesubsectors = 0;
nodes = gamenodes = NULL; nodes = gamenodes = NULL;
numnodes = numgamenodes = 0; numnodes = numgamenodes = 0;
if (lines != NULL)
{
delete[] lines;
lines = NULL;
}
numlines = 0;
if (sides != NULL)
{
delete[] sides;
sides = NULL;
}
numsides = 0;
if (blockmaplump != NULL) if (blockmaplump != NULL)
{ {
@ -3761,7 +3721,6 @@ void P_SetupLevel (const char *lumpname, int position)
times[1].Unclock(); times[1].Unclock();
times[2].Clock(); times[2].Clock();
P_LoadSideDefs (map);
times[2].Unclock(); times[2].Unclock();
times[3].Clock(); times[3].Clock();
@ -3925,9 +3884,9 @@ void P_SetupLevel (const char *lumpname, int position)
P_GetPolySpots (map, polyspots, anchors); P_GetPolySpots (map, polyspots, anchors);
FNodeBuilder::FLevel leveldata = FNodeBuilder::FLevel leveldata =
{ {
vertexes, numvertexes, &level.vertexes[0], (int)level.vertexes.Size(),
sides, numsides, &level.sides[0], (int)level.sides.Size(),
lines, numlines, &level.lines[0], (int)level.lines.Size(),
0, 0, 0, 0 0, 0, 0, 0
}; };
leveldata.FindMapBounds (); leveldata.FindMapBounds ();
@ -3935,11 +3894,10 @@ void P_SetupLevel (const char *lumpname, int position)
// In case a sync critical game mode is started, also build GL nodes to avoid problems // In case a sync critical game mode is started, also build GL nodes to avoid problems
// if the different machines' am_textured setting differs. // if the different machines' am_textured setting differs.
FNodeBuilder builder (leveldata, polyspots, anchors, BuildGLNodes); FNodeBuilder builder (leveldata, polyspots, anchors, BuildGLNodes);
delete[] vertexes;
builder.Extract (nodes, numnodes, builder.Extract (nodes, numnodes,
segs, glsegextras, numsegs, segs, numsegs,
subsectors, numsubsectors, subsectors, numsubsectors,
vertexes, numvertexes); level.vertexes);
endTime = I_FPSTime (); endTime = I_FPSTime ();
DPrintf (DMSG_NOTIFY, "BSP generation took %.3f sec (%d segs)\n", (endTime - startTime) * 0.001, numsegs); DPrintf (DMSG_NOTIFY, "BSP generation took %.3f sec (%d segs)\n", (endTime - startTime) * 0.001, numsegs);
oldvertextable = builder.GetOldVertexTable(); oldvertextable = builder.GetOldVertexTable();
@ -4193,18 +4151,7 @@ void P_SetupLevel (const char *lumpname, int position)
MapThingsUserDataIndex.Clear(); MapThingsUserDataIndex.Clear();
MapThingsUserData.Clear(); MapThingsUserData.Clear();
loadsectors.Resize(level.sectors.Size()); P_BackupMapData();
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);
memcpy(&loadsides[0], sides, numsides * sizeof(side_t));
if (glsegextras != NULL)
{
delete[] glsegextras;
glsegextras = NULL;
}
} }

View file

@ -150,7 +150,6 @@ struct sidei_t // [RH] Only keep BOOM sidedef init stuff around for init
}; };
extern sidei_t *sidetemp; extern sidei_t *sidetemp;
extern bool hasglnodes; extern bool hasglnodes;
extern struct glsegextra_t *glsegextras;
struct FMissingCount struct FMissingCount
{ {

View file

@ -29,6 +29,7 @@
#include "r_state.h" #include "r_state.h"
#include "stats.h" #include "stats.h"
#include "g_levellocals.h"
static FRandom pr_botchecksight ("BotCheckSight"); static FRandom pr_botchecksight ("BotCheckSight");
static FRandom pr_checksight ("CheckSight"); static FRandom pr_checksight ("CheckSight");
@ -116,6 +117,7 @@ public:
sightend = t2->PosRelative(task->portalgroup); sightend = t2->PosRelative(task->portalgroup);
sightstart.Z += t1->Height * 0.75; sightstart.Z += t1->Height * 0.75;
portalgroup = task->portalgroup;
Startfrac = task->Frac; Startfrac = task->Frac;
Trace = { sightstart.X, sightstart.Y, sightend.X - sightstart.X, sightend.Y - sightstart.Y }; Trace = { sightstart.X, sightstart.Y, sightend.X - sightstart.X, sightend.Y - sightstart.Y };
Lastztop = Lastzbottom = sightstart.Z; Lastztop = Lastzbottom = sightstart.Z;
@ -482,7 +484,7 @@ int SightCheck::P_SightBlockLinesIterator (int x, int y)
for (list = blockmaplump + offset + 1; *list != -1; list++) for (list = blockmaplump + offset + 1; *list != -1; list++)
{ {
if (!P_SightCheckLine (&lines[*list])) if (!P_SightCheckLine (&level.lines[*list]))
{ {
if (!portalfound) return 0; if (!portalfound) return 0;
else res = -1; else res = -1;
@ -790,6 +792,7 @@ sightcounts[2]++;
bool traverseres = P_SightTraverseIntercepts ( ); bool traverseres = P_SightTraverseIntercepts ( );
if (itres == -1) return false; // if the iterator had an early out there was no line of sight. The traverser was only called to collect more portals. if (itres == -1) return false; // if the iterator had an early out there was no line of sight. The traverser was only called to collect more portals.
if (seeingthing->Sector->PortalGroup != portalgroup) return false; // We are in a different group than the seeingthing, so this trace cannot determine visibility alone.
return traverseres; return traverseres;
} }

View file

@ -38,6 +38,7 @@
#include "p_lnspec.h" #include "p_lnspec.h"
#include "p_maputl.h" #include "p_maputl.h"
#include "p_spec.h" #include "p_spec.h"
#include "g_levellocals.h"
//=========================================================================== //===========================================================================
// //
@ -52,7 +53,7 @@ static void P_SlopeLineToPoint (int lineid, const DVector3 &pos, bool slopeCeil)
FLineIdIterator itr(lineid); FLineIdIterator itr(lineid);
while ((linenum = itr.Next()) >= 0) while ((linenum = itr.Next()) >= 0)
{ {
const line_t *line = &lines[linenum]; const line_t *line = &level.lines[linenum];
sector_t *sec; sector_t *sec;
secplane_t *plane; secplane_t *plane;
@ -257,9 +258,9 @@ static void P_SetSlopesFromVertexHeights(FMapThing *firstmt, FMapThing *lastmt,
{ {
if (mt->info->Special == SMT_VertexFloorZ || mt->info->Special == SMT_VertexCeilingZ) if (mt->info->Special == SMT_VertexFloorZ || mt->info->Special == SMT_VertexCeilingZ)
{ {
for (int i = 0; i < numvertexes; i++) for (unsigned i = 0; i < level.vertexes.Size(); i++)
{ {
if (vertexes[i].fX() == mt->pos.X && vertexes[i].fY() == mt->pos.Y) if (level.vertexes[i].fX() == mt->pos.X && level.vertexes[i].fY() == mt->pos.Y)
{ {
if (mt->info->Special == SMT_VertexFloorZ) if (mt->info->Special == SMT_VertexFloorZ)
{ {
@ -277,7 +278,7 @@ static void P_SetSlopesFromVertexHeights(FMapThing *firstmt, FMapThing *lastmt,
} }
} }
for(int i = 0; i < numvertexdatas; i++) for(unsigned i = 0; i < vertexdatas.Size(); i++)
{ {
int ii = oldvertextable == NULL ? i : oldvertextable[i]; int ii = oldvertextable == NULL ? i : oldvertextable[i];
@ -295,9 +296,8 @@ static void P_SetSlopesFromVertexHeights(FMapThing *firstmt, FMapThing *lastmt,
} }
// If vertexdata_t is ever extended for non-slope usage, this will obviously have to be deferred or removed. // If vertexdata_t is ever extended for non-slope usage, this will obviously have to be deferred or removed.
delete[] vertexdatas; vertexdatas.Clear();
vertexdatas = NULL; vertexdatas.ShrinkToFit();
numvertexdatas = 0;
if (vt_found) if (vt_found)
{ {
@ -309,14 +309,14 @@ static void P_SetSlopesFromVertexHeights(FMapThing *firstmt, FMapThing *lastmt,
DVector3 vec1, vec2; DVector3 vec1, vec2;
int vi1, vi2, vi3; int vi1, vi2, vi3;
vi1 = int(sec.Lines[0]->v1 - vertexes); vi1 = sec.Lines[0]->v1->Index();
vi2 = int(sec.Lines[0]->v2 - vertexes); vi2 = sec.Lines[0]->v2->Index();
vi3 = (sec.Lines[1]->v1 == sec.Lines[0]->v1 || sec.Lines[1]->v1 == sec.Lines[0]->v2)? vi3 = (sec.Lines[1]->v1 == sec.Lines[0]->v1 || sec.Lines[1]->v1 == sec.Lines[0]->v2)?
int(sec.Lines[1]->v2 - vertexes) : int(sec.Lines[1]->v1 - vertexes); sec.Lines[1]->v2->Index() : sec.Lines[1]->v1->Index();
vt1 = DVector3(vertexes[vi1].fPos(), 0); vt1 = DVector3(level.vertexes[vi1].fPos(), 0);
vt2 = DVector3(vertexes[vi2].fPos(), 0); vt2 = DVector3(level.vertexes[vi2].fPos(), 0);
vt3 = DVector3(vertexes[vi3].fPos(), 0); vt3 = DVector3(level.vertexes[vi3].fPos(), 0);
for(int j=0; j<2; j++) for(int j=0; j<2; j++)
{ {
@ -329,7 +329,7 @@ static void P_SetSlopesFromVertexHeights(FMapThing *firstmt, FMapThing *lastmt,
vt2.Z = h2? *h2 : j==0? sec.GetPlaneTexZ(sector_t::floor) : sec.GetPlaneTexZ(sector_t::ceiling); vt2.Z = h2? *h2 : j==0? sec.GetPlaneTexZ(sector_t::floor) : sec.GetPlaneTexZ(sector_t::ceiling);
vt3.Z = h3? *h3 : j==0? sec.GetPlaneTexZ(sector_t::floor) : sec.GetPlaneTexZ(sector_t::ceiling); vt3.Z = h3? *h3 : j==0? sec.GetPlaneTexZ(sector_t::floor) : sec.GetPlaneTexZ(sector_t::ceiling);
if (P_PointOnLineSidePrecise(vertexes[vi3].fX(), vertexes[vi3].fY(), sec.Lines[0]) == 0) if (P_PointOnLineSidePrecise(level.vertexes[vi3].fX(), level.vertexes[vi3].fY(), sec.Lines[0]) == 0)
{ {
vec1 = vt2 - vt3; vec1 = vt2 - vt3;
vec2 = vt1 - vt3; vec2 = vt1 - vt3;
@ -359,7 +359,7 @@ static void P_SetSlopesFromVertexHeights(FMapThing *firstmt, FMapThing *lastmt,
secplane_t *plane = j==0? &sec.floorplane : &sec.ceilingplane; secplane_t *plane = j==0? &sec.floorplane : &sec.ceilingplane;
double dist = -cross[0] * vertexes[vi3].fX() - cross[1] * vertexes[vi3].fY() - cross[2] * vt3.Z; double dist = -cross[0] * level.vertexes[vi3].fX() - cross[1] * level.vertexes[vi3].fY() - cross[2] * vt3.Z;
plane->set(cross[0], cross[1], cross[2], dist); plane->set(cross[0], cross[1], cross[2], dist);
} }
} }
@ -516,14 +516,14 @@ static void P_AlignPlane(sector_t *sec, line_t *line, int which)
void P_SetSlopes () void P_SetSlopes ()
{ {
int i, s; int s;
for (i = 0; i < numlines; i++) for (auto &line : level.lines)
{ {
if (lines[i].special == Plane_Align) if (line.special == Plane_Align)
{ {
lines[i].special = 0; line.special = 0;
if (lines[i].backsector != NULL) if (line.backsector != nullptr)
{ {
// args[0] is for floor, args[1] is for ceiling // args[0] is for floor, args[1] is for ceiling
// //
@ -531,15 +531,15 @@ void P_SetSlopes ()
// then args[0], bits 2-3 are for ceiling. // then args[0], bits 2-3 are for ceiling.
for (s = 0; s < 2; s++) for (s = 0; s < 2; s++)
{ {
int bits = lines[i].args[s] & 3; int bits = line.args[s] & 3;
if (s == 1 && bits == 0) if (s == 1 && bits == 0)
bits = (lines[i].args[0] >> 2) & 3; bits = (line.args[0] >> 2) & 3;
if (bits == 1) // align front side to back if (bits == 1) // align front side to back
P_AlignPlane (lines[i].frontsector, lines + i, s); P_AlignPlane (line.frontsector, &line, s);
else if (bits == 2) // align back side to front else if (bits == 2) // align back side to front
P_AlignPlane (lines[i].backsector, lines + i, s); P_AlignPlane (line.backsector, &line, s);
} }
} }
} }
@ -554,9 +554,9 @@ void P_SetSlopes ()
void P_CopySlopes() void P_CopySlopes()
{ {
for (int i = 0; i < numlines; i++) for (auto &line : level.lines)
{ {
if (lines[i].special == Plane_Copy) if (line.special == Plane_Copy)
{ {
// The args are used for the tags of sectors to copy: // The args are used for the tags of sectors to copy:
// args[0]: front floor // args[0]: front floor
@ -564,31 +564,31 @@ void P_CopySlopes()
// args[2]: back floor // args[2]: back floor
// args[3]: back ceiling // args[3]: back ceiling
// args[4]: copy slopes from one side of the line to the other. // args[4]: copy slopes from one side of the line to the other.
lines[i].special = 0; line.special = 0;
for (int s = 0; s < (lines[i].backsector ? 4 : 2); s++) for (int s = 0; s < (line.backsector ? 4 : 2); s++)
{ {
if (lines[i].args[s]) if (line.args[s])
P_CopyPlane(lines[i].args[s], P_CopyPlane(line.args[s],
(s & 2 ? lines[i].backsector : lines[i].frontsector), s & 1); (s & 2 ? line.backsector : line.frontsector), s & 1);
} }
if (lines[i].backsector != NULL) if (line.backsector != NULL)
{ {
if ((lines[i].args[4] & 3) == 1) if ((line.args[4] & 3) == 1)
{ {
lines[i].backsector->floorplane = lines[i].frontsector->floorplane; line.backsector->floorplane = line.frontsector->floorplane;
} }
else if ((lines[i].args[4] & 3) == 2) else if ((line.args[4] & 3) == 2)
{ {
lines[i].frontsector->floorplane = lines[i].backsector->floorplane; line.frontsector->floorplane = line.backsector->floorplane;
} }
if ((lines[i].args[4] & 12) == 4) if ((line.args[4] & 12) == 4)
{ {
lines[i].backsector->ceilingplane = lines[i].frontsector->ceilingplane; line.backsector->ceilingplane = line.frontsector->ceilingplane;
} }
else if ((lines[i].args[4] & 12) == 8) else if ((line.args[4] & 12) == 8)
{ {
lines[i].frontsector->ceilingplane = lines[i].backsector->ceilingplane; line.frontsector->ceilingplane = line.backsector->ceilingplane;
} }
} }
} }

View file

@ -70,6 +70,7 @@
#include "d_player.h" #include "d_player.h"
#include "p_maputl.h" #include "p_maputl.h"
#include "p_blockmap.h" #include "p_blockmap.h"
#include "g_levellocals.h"
#ifndef NO_EDATA #ifndef NO_EDATA
#include "edata.h" #include "edata.h"
#endif #endif
@ -189,7 +190,7 @@ bool P_ActivateLine (line_t *line, AActor *mo, int side, int activationType, DVe
// end of changed code // end of changed code
if (developer >= DMSG_SPAMMY && buttonSuccess) if (developer >= DMSG_SPAMMY && buttonSuccess)
{ {
Printf ("Line special %d activated on line %i\n", special, int(line - lines)); Printf ("Line special %d activated on line %i\n", special, line->Index());
} }
return true; return true;
} }
@ -361,7 +362,7 @@ bool P_PredictLine(line_t *line, AActor *mo, int side, int activationType)
// end of changed code // end of changed code
if (developer >= DMSG_SPAMMY && buttonSuccess) if (developer >= DMSG_SPAMMY && buttonSuccess)
{ {
Printf("Line special %d predicted on line %i\n", special, int(line - lines)); Printf("Line special %d predicted on line %i\n", special, line->Index());
} }
return true; return true;
} }
@ -790,14 +791,14 @@ DWallLightTransfer::DWallLightTransfer (sector_t *srcSec, int target, BYTE flags
FLineIdIterator itr(target); FLineIdIterator itr(target);
while ((linenum = itr.Next()) >= 0) while ((linenum = itr.Next()) >= 0)
{ {
if (flags & WLF_SIDE1 && lines[linenum].sidedef[0] != NULL) if (flags & WLF_SIDE1 && level.lines[linenum].sidedef[0] != NULL)
{ {
lines[linenum].sidedef[0]->Flags |= wallflags; level.lines[linenum].sidedef[0]->Flags |= wallflags;
} }
if (flags & WLF_SIDE2 && lines[linenum].sidedef[1] != NULL) if (flags & WLF_SIDE2 && level.lines[linenum].sidedef[1] != NULL)
{ {
lines[linenum].sidedef[1]->Flags |= wallflags; level.lines[linenum].sidedef[1]->Flags |= wallflags;
} }
} }
ChangeStatNum(STAT_LIGHTTRANSFER); ChangeStatNum(STAT_LIGHTTRANSFER);
@ -821,7 +822,7 @@ void DWallLightTransfer::DoTransfer (short lightlevel, int target, BYTE flags)
FLineIdIterator itr(target); FLineIdIterator itr(target);
while ((linenum = itr.Next()) >= 0) while ((linenum = itr.Next()) >= 0)
{ {
line_t *line = &lines[linenum]; line_t *line = &level.lines[linenum];
if (flags & WLF_SIDE1 && line->sidedef[0] != NULL) if (flags & WLF_SIDE1 && line->sidedef[0] != NULL)
{ {
@ -958,42 +959,42 @@ static void CopyPortal(int sectortag, int plane, unsigned pnum, double alpha, bo
SetPortal(&level.sectors[s], plane, pnum, alpha); SetPortal(&level.sectors[s], plane, pnum, alpha);
} }
for (int j=0;j<numlines;j++) for (auto &line : level.lines)
{ {
// Check if this portal needs to be copied to other sectors // Check if this portal needs to be copied to other sectors
// This must be done here to ensure that it gets done only after the portal is set up // This must be done here to ensure that it gets done only after the portal is set up
if (lines[j].special == Sector_SetPortal && if (line.special == Sector_SetPortal &&
lines[j].args[1] == 1 && line.args[1] == 1 &&
(lines[j].args[2] == plane || lines[j].args[2] == 3) && (line.args[2] == plane || line.args[2] == 3) &&
lines[j].args[3] == sectortag) line.args[3] == sectortag)
{ {
if (lines[j].args[0] == 0) if (line.args[0] == 0)
{ {
SetPortal(lines[j].frontsector, plane, pnum, alpha); SetPortal(line.frontsector, plane, pnum, alpha);
} }
else else
{ {
FSectorTagIterator itr(lines[j].args[0]); FSectorTagIterator itr(line.args[0]);
while ((s = itr.Next()) >= 0) while ((s = itr.Next()) >= 0)
{ {
SetPortal(&level.sectors[s], plane, pnum, alpha); SetPortal(&level.sectors[s], plane, pnum, alpha);
} }
} }
} }
if (tolines && lines[j].special == Sector_SetPortal && if (tolines && line.special == Sector_SetPortal &&
lines[j].args[1] == 5 && line.args[1] == 5 &&
lines[j].args[3] == sectortag) line.args[3] == sectortag)
{ {
if (lines[j].args[0] == 0) if (line.args[0] == 0)
{ {
lines[j].portaltransferred = pnum; line.portaltransferred = pnum;
} }
else else
{ {
FLineIdIterator itr(lines[j].args[0]); FLineIdIterator itr(line.args[0]);
while ((s = itr.Next()) >= 0) while ((s = itr.Next()) >= 0)
{ {
lines[s].portaltransferred = pnum; level.lines[s].portaltransferred = pnum;
} }
} }
} }
@ -1004,20 +1005,20 @@ static void CopyPortal(int sectortag, int plane, unsigned pnum, double alpha, bo
void P_SpawnPortal(line_t *line, int sectortag, int plane, int bytealpha, int linked) void P_SpawnPortal(line_t *line, int sectortag, int plane, int bytealpha, int linked)
{ {
if (plane < 0 || plane > 2 || (linked && plane == 2)) return; if (plane < 0 || plane > 2 || (linked && plane == 2)) return;
for (int i=0;i<numlines;i++) for (auto &oline : level.lines)
{ {
// We must look for the reference line with a linear search unless we want to waste the line ID for it // We must look for the reference line with a linear search unless we want to waste the line ID for it
// which is not a good idea. // which is not a good idea.
if (lines[i].special == Sector_SetPortal && if (oline.special == Sector_SetPortal &&
lines[i].args[0] == sectortag && oline.args[0] == sectortag &&
lines[i].args[1] == linked && oline.args[1] == linked &&
lines[i].args[2] == plane && oline.args[2] == plane &&
lines[i].args[3] == 1) oline.args[3] == 1)
{ {
// beware of overflows. // beware of overflows.
DVector2 pos1 = line->v1->fPos() + line->Delta() / 2; DVector2 pos1 = line->v1->fPos() + line->Delta() / 2;
DVector2 pos2 = lines[i].v1->fPos() + lines[i].Delta() / 2; DVector2 pos2 = oline.v1->fPos() + oline.Delta() / 2;
unsigned pnum = P_GetPortal(linked ? PORTS_LINKEDPORTAL : PORTS_PORTAL, plane, line->frontsector, lines[i].frontsector, pos2 - pos1); unsigned pnum = P_GetPortal(linked ? PORTS_LINKEDPORTAL : PORTS_PORTAL, plane, line->frontsector, oline.frontsector, pos2 - pos1);
CopyPortal(sectortag, plane, pnum, bytealpha / 255., false); CopyPortal(sectortag, plane, pnum, bytealpha / 255., false);
return; return;
} }
@ -1266,9 +1267,9 @@ void P_SpawnSpecials (void)
P_SpawnSkybox(pt2); P_SpawnSkybox(pt2);
} }
for (int i = 0; i < numlines; i++) for (auto &line : level.lines)
{ {
switch (lines[i].special) switch (line.special)
{ {
int s; int s;
sector_t *sec; sector_t *sec;
@ -1277,16 +1278,16 @@ void P_SpawnSpecials (void)
// support for drawn heights coming from different sector // support for drawn heights coming from different sector
case Transfer_Heights: case Transfer_Heights:
{ {
sec = lines[i].frontsector; sec = line.frontsector;
if (lines[i].args[1] & 2) if (line.args[1] & 2)
{ {
sec->MoreFlags |= SECF_FAKEFLOORONLY; sec->MoreFlags |= SECF_FAKEFLOORONLY;
} }
if (lines[i].args[1] & 4) if (line.args[1] & 4)
{ {
sec->MoreFlags |= SECF_CLIPFAKEPLANES; sec->MoreFlags |= SECF_CLIPFAKEPLANES;
} }
if (lines[i].args[1] & 8) if (line.args[1] & 8)
{ {
sec->MoreFlags |= SECF_UNDERWATER; sec->MoreFlags |= SECF_UNDERWATER;
} }
@ -1294,15 +1295,15 @@ void P_SpawnSpecials (void)
{ {
sec->MoreFlags |= SECF_FORCEDUNDERWATER; sec->MoreFlags |= SECF_FORCEDUNDERWATER;
} }
if (lines[i].args[1] & 16) if (line.args[1] & 16)
{ {
sec->MoreFlags |= SECF_IGNOREHEIGHTSEC; sec->MoreFlags |= SECF_IGNOREHEIGHTSEC;
} }
if (lines[i].args[1] & 32) if (line.args[1] & 32)
{ {
sec->MoreFlags |= SECF_NOFAKELIGHT; sec->MoreFlags |= SECF_NOFAKELIGHT;
} }
FSectorTagIterator itr(lines[i].args[0]); FSectorTagIterator itr(line.args[0]);
while ((s = itr.Next()) >= 0) while ((s = itr.Next()) >= 0)
{ {
level.sectors[s].heightsec = sec; level.sectors[s].heightsec = sec;
@ -1315,29 +1316,29 @@ void P_SpawnSpecials (void)
// killough 3/16/98: Add support for setting // killough 3/16/98: Add support for setting
// floor lighting independently (e.g. lava) // floor lighting independently (e.g. lava)
case Transfer_FloorLight: case Transfer_FloorLight:
new DLightTransfer (lines[i].frontsector, lines[i].args[0], true); new DLightTransfer (line.frontsector, line.args[0], true);
break; break;
// killough 4/11/98: Add support for setting // killough 4/11/98: Add support for setting
// ceiling lighting independently // ceiling lighting independently
case Transfer_CeilingLight: case Transfer_CeilingLight:
new DLightTransfer (lines[i].frontsector, lines[i].args[0], false); new DLightTransfer (line.frontsector, line.args[0], false);
break; break;
// [Graf Zahl] Add support for setting lighting // [Graf Zahl] Add support for setting lighting
// per wall independently // per wall independently
case Transfer_WallLight: case Transfer_WallLight:
new DWallLightTransfer (lines[i].frontsector, lines[i].args[0], lines[i].args[1]); new DWallLightTransfer (line.frontsector, line.args[0], line.args[1]);
break; break;
case Sector_Attach3dMidtex: case Sector_Attach3dMidtex:
P_Attach3dMidtexLinesToSector(lines[i].frontsector, lines[i].args[0], lines[i].args[1], !!lines[i].args[2]); P_Attach3dMidtexLinesToSector(line.frontsector, line.args[0], line.args[1], !!line.args[2]);
break; break;
case Sector_SetLink: case Sector_SetLink:
if (lines[i].args[0] == 0) if (line.args[0] == 0)
{ {
P_AddSectorLinks(lines[i].frontsector, lines[i].args[1], lines[i].args[2], lines[i].args[3]); P_AddSectorLinks(line.frontsector, line.args[1], line.args[2], line.args[3]);
} }
break; break;
@ -1355,30 +1356,29 @@ void P_SpawnSpecials (void)
// arg 2 = 0:floor, 1:ceiling, 2:both // arg 2 = 0:floor, 1:ceiling, 2:both
// arg 3 = 0: anchor, 1: reference line // arg 3 = 0: anchor, 1: reference line
// arg 4 = for the anchor only: alpha // arg 4 = for the anchor only: alpha
if ((lines[i].args[1] == 0 || lines[i].args[1] == 6) && lines[i].args[3] == 0) if ((line.args[1] == 0 || line.args[1] == 6) && line.args[3] == 0)
{ {
P_SpawnPortal(&lines[i], lines[i].args[0], lines[i].args[2], lines[i].args[4], lines[i].args[1]); P_SpawnPortal(&line, line.args[0], line.args[2], line.args[4], line.args[1]);
} }
else if (lines[i].args[1] == 3 || lines[i].args[1] == 4) else if (line.args[1] == 3 || line.args[1] == 4)
{ {
line_t *line = &lines[i]; unsigned pnum = P_GetPortal(line.args[1] == 3 ? PORTS_PLANE : PORTS_HORIZON, line.args[2], line.frontsector, NULL, { 0,0 });
unsigned pnum = P_GetPortal(line->args[1] == 3 ? PORTS_PLANE : PORTS_HORIZON, line->args[2], line->frontsector, NULL, { 0,0 }); CopyPortal(line.args[0], line.args[2], pnum, 0, true);
CopyPortal(line->args[0], line->args[2], pnum, 0, true);
} }
break; break;
case Line_SetPortal: case Line_SetPortal:
P_SpawnLinePortal(&lines[i]); P_SpawnLinePortal(&line);
break; break;
// [RH] ZDoom Static_Init settings // [RH] ZDoom Static_Init settings
case Static_Init: case Static_Init:
switch (lines[i].args[1]) switch (line.args[1])
{ {
case Init_Gravity: case Init_Gravity:
{ {
double grav = lines[i].Delta().Length() / 100.; double grav = line.Delta().Length() / 100.;
FSectorTagIterator itr(lines[i].args[0]); FSectorTagIterator itr(line.args[0]);
while ((s = itr.Next()) >= 0) while ((s = itr.Next()) >= 0)
level.sectors[s].gravity = grav; level.sectors[s].gravity = grav;
} }
@ -1389,8 +1389,8 @@ void P_SpawnSpecials (void)
case Init_Damage: case Init_Damage:
{ {
int damage = int(lines[i].Delta().Length()); int damage = int(line.Delta().Length());
FSectorTagIterator itr(lines[i].args[0]); FSectorTagIterator itr(line.args[0]);
while ((s = itr.Next()) >= 0) while ((s = itr.Next()) >= 0)
{ {
sector_t *sec = &level.sectors[s]; sector_t *sec = &level.sectors[s];
@ -1416,8 +1416,8 @@ void P_SpawnSpecials (void)
break; break;
case Init_SectorLink: case Init_SectorLink:
if (lines[i].args[3] == 0) if (line.args[3] == 0)
P_AddSectorLinksByID(lines[i].frontsector, lines[i].args[0], lines[i].args[2]); P_AddSectorLinksByID(line.frontsector, line.args[0], line.args[2]);
break; break;
// killough 10/98: // killough 10/98:
@ -1431,9 +1431,9 @@ void P_SpawnSpecials (void)
case Init_TransferSky: case Init_TransferSky:
{ {
FSectorTagIterator itr(lines[i].args[0]); FSectorTagIterator itr(line.args[0]);
while ((s = itr.Next()) >= 0) while ((s = itr.Next()) >= 0)
level.sectors[s].sky = (i + 1) | PL_SKYFLAT; level.sectors[s].sky = (line.Index() + 1) | PL_SKYFLAT;
break; break;
} }
} }
@ -1499,10 +1499,9 @@ void P_SpawnSpecials (void)
static void P_SpawnFriction(void) static void P_SpawnFriction(void)
{ {
int i; line_t *l = &level.lines[0];
line_t *l = lines;
for (i = 0 ; i < numlines ; i++,l++) for (unsigned i = 0 ; i < level.lines.Size() ; i++,l++)
{ {
if (l->special == Sector_SetFriction) if (l->special == Sector_SetFriction)
{ {

View file

@ -36,6 +36,7 @@
#include "p_tags.h" #include "p_tags.h"
#include "c_dispatch.h" #include "c_dispatch.h"
#include "g_levellocals.h"
FTagManager tagManager; FTagManager tagManager;
@ -45,17 +46,6 @@ FTagManager tagManager;
// //
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
static inline int lineindex(const line_t *line)
{
return (int)(intptr_t)(line - lines);
}
//-----------------------------------------------------------------------------
//
//
//
//-----------------------------------------------------------------------------
void FTagManager::AddSectorTag(int sector, int tag) void FTagManager::AddSectorTag(int sector, int tag)
{ {
if (tag == 0) return; if (tag == 0) return;
@ -244,7 +234,7 @@ bool FTagManager::SectorHasTag(const sector_t *sector, int tag) const
int FTagManager::GetFirstLineID(const line_t *line) const int FTagManager::GetFirstLineID(const line_t *line) const
{ {
int i = lineindex(line); int i = line->Index();
return LineHasIDs(i) ? allIDs[startForLine[i]].tag : 0; return LineHasIDs(i) ? allIDs[startForLine[i]].tag : 0;
} }
@ -276,7 +266,7 @@ bool FTagManager::LineHasID(int i, int tag) const
bool FTagManager::LineHasID(const line_t *line, int tag) const bool FTagManager::LineHasID(const line_t *line, int tag) const
{ {
return LineHasID(lineindex(line), tag); return LineHasID(line->Index(), tag);
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------

View file

@ -38,6 +38,7 @@
#include "p_maputl.h" #include "p_maputl.h"
#include "r_utility.h" #include "r_utility.h"
#include "p_spec.h" #include "p_spec.h"
#include "g_levellocals.h"
#define FUDGEFACTOR 10 #define FUDGEFACTOR 10
@ -447,10 +448,10 @@ bool EV_SilentLineTeleport (line_t *line, int side, AActor *thing, int id, INTBO
FLineIdIterator itr(id); FLineIdIterator itr(id);
while ((i = itr.Next()) >= 0) while ((i = itr.Next()) >= 0)
{ {
if (line-lines == i) if (line->Index() == i)
continue; continue;
if ((l=lines+i) != line && l->backsector) if ((l=&level.lines[i]) != line && l->backsector)
{ {
// Get the thing's position along the source linedef // Get the thing's position along the source linedef
double pos; double pos;

View file

@ -51,6 +51,7 @@
#include "p_spec.h" #include "p_spec.h"
#include "math/cmath.h" #include "math/cmath.h"
#include "actorptrselect.h" #include "actorptrselect.h"
#include "g_levellocals.h"
// Set of spawnable things for the Thing_Spawn and Thing_Projectile specials. // Set of spawnable things for the Thing_Spawn and Thing_Projectile specials.
FClassMap SpawnableThings; FClassMap SpawnableThings;

View file

@ -35,6 +35,7 @@
#include "g_level.h" #include "g_level.h"
#include "r_utility.h" #include "r_utility.h"
#include "p_spec.h" #include "p_spec.h"
#include "g_levellocals.h"
extern gamestate_t wipegamestate; extern gamestate_t wipegamestate;

Some files were not shown because too many files have changed in this diff Show more